diff --git a/js/Windows/node_modules/printer/.npmignore b/js/Windows/node_modules/printer/.npmignore
deleted file mode 100644
index 36cc50528db09296a47b0808c2f8f661f75e3e06..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/.npmignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.gitignore
-*~
-.settings
-.c9*
diff --git a/js/Windows/node_modules/printer/.travis.yml b/js/Windows/node_modules/printer/.travis.yml
deleted file mode 100644
index e38a22e8f173363deb8a3ddfd015df4fd9520c9f..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/.travis.yml
+++ /dev/null
@@ -1,37 +0,0 @@
-env:
-  matrix:
-    - export NODE_VERSION="5.9"
-    - export NODE_VERSION="4.4"
-    - export NODE_VERSION="0.10"
-matrix:
-  fast_finish: true
-  allow_failures:
-    - env: NODE_VERSION="0.10"
-    - env: NODE_VERSION="iojs"
-before_install:
-  - git clone https://github.com/creationix/nvm.git ./.nvm
-  - source ./.nvm/nvm.sh
-  - nvm install $NODE_VERSION
-  - echo $NODE_VERSION
-  - nvm use $NODE_VERSION
-  - if [ $TRAVIS_OS_NAME == "linux" ]; then
-      sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test;
-      sudo apt-get -qq update;
-      sudo apt-get -qq install g++-4.8;
-      export CXX='g++-4.8';
-      sudo apt-get install -qq debhelper autotools-dev cups-ppdc libcups2-dev cups imagemagick ghostscript;
-    fi
-  - "export JOBS=4"
-  - BUILD_ONLY=true npm install
-before_script:
-  - git config --global user.name "Ion Lupascu"
-  - git config --global user.email ionlupascu@gmail.com
-git:
-  depth: 1
-branches:
-  only:
-    - master
-os:
-  - linux
-  - osx
-script: npm test
diff --git a/js/Windows/node_modules/printer/ChangeLog b/js/Windows/node_modules/printer/ChangeLog
deleted file mode 100644
index 61630298a87dc992017f829f280649da8b82b3f0..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/ChangeLog
+++ /dev/null
@@ -1,36 +0,0 @@
-2016.09.10, version 0.2.2
-* correct memory leak (thanks to @kjlaw89)
-
-2015.10.22, version 0.2.1
-* corrected printDirect with buffer data for node v4.X (#95)
-* corrected segmentation fault from get default printer for node v0.10.X
-
-2015.09, version 0.2.0
-* added possibility to compile with node v4.X
-* various bug/core dumps fix
-
-2015.04, version 0.1.2
-* posix: new method getPrinterDriverOptions(printerName) to retrieve PPD options
-* posix: new method getSelectedPaperSize(printerName) to retrieve the current paper size name
-* posix: new parameter `options` added to `printDirect` to set printer options (ex. `fit-to-page`, `media`, etc)
-* posix: new function printFile() to print a file
-
-2015.03.03, version 0.1.1
-* possibility to build for node-webkit with grunt
-
-2015.02.26, version 0.1.0
-* possibility to load native module for platform/arch: node_module_{platform}_{arch}.node
-
-2015.02.24, Version 0.0.5
-* added getDefaultPrinterName() method by returning the default printer name
-* make printer argument optional in getPrinter() and printDirect. If is missing, will try to print to default printer
-* resolve charest of getPrinter() #38
-* posix/win32: added more explicit errors
-* posix: do not throw error if job status code is not supported
-
-2015.01.30, Version 0.0.4
-* win: added RPC installed printers in getPrinters #40
-* posix: on some devices not all formats are supported, issue #23
-* posix: added link settings on build #28
-* corrected README.md
-* corrected examples
diff --git a/js/Windows/node_modules/printer/Gruntfile.js b/js/Windows/node_modules/printer/Gruntfile.js
deleted file mode 100644
index e54a00bbb5e99f4f4e9f4b81e55b13a3e9146c78..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/Gruntfile.js
+++ /dev/null
@@ -1,75 +0,0 @@
-module.exports = function(grunt) {
-    grunt.initConfig({
-        gyp: {
-            ia32: {
-                command: 'rebuild',
-                options: {
-                    arch: 'ia32'
-                }
-            },
-            x64: {
-                command: 'rebuild',
-                options: {
-                    arch: 'x64'
-                }
-            }
-        },
-        "nw-gyp": {
-            ia32: {
-                command: 'rebuild',
-                options: {
-                    arch: 'ia32'
-                }
-            },
-            x64: {
-                command: 'rebuild',
-                options: {
-                    arch: 'x64'
-                }
-            }
-        },
-        copy: {
-            ia32: {
-                files: [{src: 'build/Release/node_printer.node', dest: 'lib/node_printer_' + process.platform + '_ia32.node'}]
-            },
-            x64: {
-                files: [{src: 'build/Release/node_printer.node', dest: 'lib/node_printer_' + process.platform + '_x64.node'}]
-            }
-        }
-    });
-
-    grunt.loadNpmTasks('grunt-contrib-jshint');
-    grunt.loadNpmTasks('grunt-node-gyp');
-    grunt.loadNpmTasks('grunt-nw-gyp');
-    grunt.loadNpmTasks('grunt-contrib-copy');
-
-    grunt.registerTask('build-nw-ia32', [
-            'nw-gyp:ia32',
-            'copy:ia32'
-    ]);
-
-    grunt.registerTask('build-ia32', [
-            'gyp:ia32',
-            'copy:ia32'
-    ]);
-
-    grunt.registerTask('build-x64', [
-            'gyp:x64',
-            'copy:x64'
-    ]);
-
-    grunt.registerTask('build-nw-x64', [
-            'nw-gyp:x64',
-            'copy:x64'
-    ]);
-
-    grunt.registerTask('build', [
-            'build-ia32',
-            'build-x64'
-    ]);
-
-    grunt.registerTask('build-nw', [
-            'build-nw-ia32',
-            'build-nw-x64'
-    ]);
-}
diff --git a/js/Windows/node_modules/printer/README.md b/js/Windows/node_modules/printer/README.md
deleted file mode 100644
index 8987ff028d5817b321cacb2a9750ec4351ec91f2..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/README.md
+++ /dev/null
@@ -1,93 +0,0 @@
-node-printer
-============
-Native bind printers on POSIX and Windows OS from Node.js, iojs and node-webkit.
-<table>
-  <thead>
-    <tr>
-      <th>Linux</th>
-      <th>Windows</th>
-      <th>Dependencies</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td align="center">
-        <a href="https://travis-ci.org/tojocky/node-printer"><img src="https://travis-ci.org/tojocky/node-printer.svg?branch=master"></a>
-      </td>
-      <td align="center">
-        <a href="https://ci.appveyor.com/project/tojocky/node-printer"><img src="https://ci.appveyor.com/api/projects/status/9y800f36wla35ee7?svg=true"></a>
-      </td>
-      <td align="center">
-        <a href="https://david-dm.org/tojocky/node-printer"><img src="https://david-dm.org/tojocky/node-printer.svg"></a>
-      </td>
-    </tr>
-  </tbody>
-</table>
-
-If you have a problem, ask question to [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/tojocky/node-printer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) or find/create a new [Github issue](https://github.com/tojocky/node-printer/issues)
-
-### Reason:
-
-I was involved in a project where I need to print from Node.JS. This is the reason why I created this project and I want to share my code with others.
-
-
-### Features:
-
-* no dependecies;
-* native method wrappers from Windows  and POSIX (which uses [CUPS 1.4/MAC OS X 10.6](http://cups.org/)) APIs;
-* compatible with node v0.8.x, 0.9.x and v0.11.x (with 0.11.9 and 0.11.13);
-* compatible with node-webkit v0.8.x and 0.9.2;
-* `getPrinters()` to enumerate all installed printers with current jobs and statuses;
-* `getPrinter(printerName)` to get a specific/default printer info with current jobs and statuses;
-* `getPrinterDriverOptions(printerName)` ([POSIX](http://en.wikipedia.org/wiki/POSIX) only) to get a specific/default printer driver options such as supported paper size and other info
-* `getSelectedPaperSize(printerName)` ([POSIX](http://en.wikipedia.org/wiki/POSIX) only) to get a specific/default printer default paper size from its driver options
-* `getDefaultPrinterName()` return the default printer name;
-* `printDirect(options)` to send a job to a specific/default printer, now supports [CUPS options](http://www.cups.org/documentation.php/options.html) passed in the form of a JS object (see `cancelJob.js` example). To print a PDF from windows it is possible by using [node-pdfium module](https://github.com/tojocky/node-pdfium) to convert a PDF format into EMF and after to send to printer as EMF;
-* `printFile(options)`  ([POSIX](http://en.wikipedia.org/wiki/POSIX) only) to print a file;
-* `getSupportedPrintFormats()` to get all possible print formats for printDirect method which depends on OS. `RAW` and `TEXT` are supported from all OS-es;
-* `getJob(printerName, jobId)` to get a specific job info including job status;
-* `setJob(printerName, jobId, command)` to send a command to a job (e.g. `'CANCEL'` to cancel the job);
-* `getSupportedJobCommands()` to get supported job commands for setJob() depends on OS. `'CANCEL'` command is supported from all OS-es.
-
-
-### How to install:
-Make sure you have Python 2.x installed on your system. Windows users will also require Visual Studio (2013 Express is a good fit)
-
-from [npmjs.org](https://www.npmjs.org/package/printer)
-
-    npm install -g node-gyp
-    npm install printer --msvs_version=2013
-
-or [direct from git](https://www.npmjs.org/doc/cli/npm-install.html):
-
-    npm install git+https://github.com/tojocky/node-printer.git
-if you want to to run in [nwjs](http://nwjs.io/) then rebuild the module with [nw-gyp](https://github.com/nwjs/nw-gyp):
-```
-npm install -g nw-gyp
-cd node_modules/printer
-nw-gyp rebuild
-```
-For specific distribution `--dist-url` node-gyp parameter should be used. Example for electron:
-```
-node-gyp rebuild --target=0.37.4 --arch=x64 --dist-url=https://atom.io/download/atom-shell
-```
-
-Ubuntu User :
-You need to install libcups2-dev package
-`sudo apt-get install libcups2-dev`
-
-
-### How to use:
-
-See [examples](https://github.com/tojocky/node-printer/tree/master/examples)
-
-### Author(s):
-
-* Ion Lupascu, ionlupascu@gmail.com
-
-### Contibutors:
-
-Feel free to download, test and propose new futures
-
-### License:
- [The MIT License (MIT)](http://opensource.org/licenses/MIT)
diff --git a/js/Windows/node_modules/printer/appveyor.yml b/js/Windows/node_modules/printer/appveyor.yml
deleted file mode 100644
index aacec50666f782c9edf448627f704f0cced3d4cb..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/appveyor.yml
+++ /dev/null
@@ -1,52 +0,0 @@
-# appveyor file
-# http://www.appveyor.com/docs/appveyor-yml
-
-# Try out "interactive-mode"
-os: Windows Server 2012 R2
-
-# build version format
-version: "{build}"
-
-# Set a known clone folder
-clone_folder: c:\projects\node-printer
-
-# fix lineendings in Windows
-init:
-  - git config --global core.autocrlf input
-  - git config --global user.name "Ion Lupascu"
-  - git config --global user.email ionlupascu@gmail.com
-
-# what combinations to test
-environment:
-  matrix:
-    # Node.js
-    - nodejs_version: "0.10"
-    - nodejs_version: "0.12"
-    - nodejs_version: "4.4"
-    - nodejs_version: "5.9"
-
-matrix:
-  fast_finish: true
-  allow_failures:
-    - nodejs_version: "0.10"
-
-# Get the latest stable version of Node 0.STABLE.latest
-install:
-  - ps: Install-Product node $env:nodejs_version
-  - cmd: SET PATH=C:\Program Files (x86)\MSBuild\12.0\bin\;%PATH%
-  - cmd: SET PATH=c:\python27;%PATH%
-  - cmd: SET JOBS=4
-  - cmd: SET BUILD_ONLY=true
-  - cmd: npm install -g node-gyp
-  - npm install --msvs_version=2013
-
-test_script:
-  - node --version
-  - npm --version
-#  - cmd: npm test
-
-build: off
-
-branches:
-  only:
-    - master
diff --git a/js/Windows/node_modules/printer/binding.gyp b/js/Windows/node_modules/printer/binding.gyp
deleted file mode 100644
index 2df0e70739ce7509403b17f0da14245246a0be4d..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/binding.gyp
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  'targets': [
-    {
-      'target_name': 'node_printer',
-      'sources': [
-        # is like "ls -1 src/*.cc", but gyp does not support direct patterns on
-        # sources
-        '<!@(["python", "tools/getSourceFiles.py", "src", "cc"])'
-      ],
-      'conditions': [
-        # common exclusions
-        ['OS!="linux"', {'sources/': [['exclude', '_linux\\.cc$']]}],
-        ['OS!="mac"', {'sources/': [['exclude', '_mac\\.cc|mm?$']]}],
-        ['OS!="win"', {
-          'sources/': [['exclude', '_win\\.cc$']]}, {
-          # else if OS==win, exclude also posix files
-          'sources/': [['exclude', '_posix\\.cc$']]
-        }],
-        # specific settings
-        ['OS!="win"', {
-          'cflags':[
-            '<!(cups-config --cflags)'
-          ],
-          'ldflags':[
-            '<!(cups-config --libs)'
-            #'-lcups -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lz -lpthread -lm -lcrypt -lz'
-          ],
-          'libraries':[
-            '<!(cups-config --libs)'
-            #'-lcups -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lz -lpthread -lm -lcrypt -lz'
-          ],
-          'link_settings': {
-              'libraries': [
-                  '<!(cups-config --libs)'
-              ]
-           }
-        }]
-      ]
-    }
-  ]
-}
diff --git a/js/Windows/node_modules/printer/build/Release/node_printer.exp b/js/Windows/node_modules/printer/build/Release/node_printer.exp
deleted file mode 100644
index c86e45432d03422c14cf60a7afb6df6d72e1fc44..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/node_printer.exp and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/node_printer.lib b/js/Windows/node_modules/printer/build/Release/node_printer.lib
deleted file mode 100644
index 9b210174ca4bd4fc47520798b369c02426fce652..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/node_printer.lib and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/node_printer.map b/js/Windows/node_modules/printer/build/Release/node_printer.map
deleted file mode 100644
index df8d964f3cc46b9da2bf5f85e2b4b39c6538cdc0..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/build/Release/node_printer.map
+++ /dev/null
@@ -1,4404 +0,0 @@
- node_printer
-
- Timestamp is 591a17d4 (Mon May 15 17:04:20 2017)
-
- Preferred load address is 0000000180000000
-
- Start         Length     Name                   Class
- 0001:00000000 00000070H .text$di                CODE
- 0001:00000070 00026600H .text$mn                CODE
- 0001:00026670 00000020H .text$mn$00             CODE
- 0001:00026690 000003e0H .text$x                 CODE
- 0001:00026a70 000002bcH .text$yd                CODE
- 0002:00000000 00000328H .idata$5                DATA
- 0002:00000328 00000010H .00cfg                  DATA
- 0002:00000338 00000008H .CRT$XCA                DATA
- 0002:00000340 00000018H .CRT$XCC                DATA
- 0002:00000358 00000010H .CRT$XCL                DATA
- 0002:00000368 00000008H .CRT$XCU                DATA
- 0002:00000370 00000008H .CRT$XCZ                DATA
- 0002:00000378 00000008H .CRT$XIA                DATA
- 0002:00000380 00000030H .CRT$XIC                DATA
- 0002:000003b0 00000008H .CRT$XIZ                DATA
- 0002:000003b8 00000008H .CRT$XLA                DATA
- 0002:000003c0 00000008H .CRT$XLZ                DATA
- 0002:000003c8 00000008H .CRT$XPA                DATA
- 0002:000003d0 00000010H .CRT$XPX                DATA
- 0002:000003e0 00000008H .CRT$XPXA               DATA
- 0002:000003e8 00000008H .CRT$XPZ                DATA
- 0002:000003f0 00000008H .CRT$XTA                DATA
- 0002:000003f8 00000008H .CRT$XTZ                DATA
- 0002:00000400 000102c8H .rdata                  DATA
- 0002:000106c8 00000028H .rdata$T                DATA
- 0002:000106f0 00000884H .rdata$r                DATA
- 0002:00010f74 000004a4H .rdata$zzzdbg           DATA
- 0002:00011418 00000008H .rtc$IAA                DATA
- 0002:00011420 00000008H .rtc$IZZ                DATA
- 0002:00011428 00000008H .rtc$TAA                DATA
- 0002:00011430 00000010H .rtc$TZZ                DATA
- 0002:00011440 00001e30H .xdata                  DATA
- 0002:00013270 00000244H .xdata$x                DATA
- 0002:000134b4 00000020H .didat$2                DATA
- 0002:000134d4 00000024H .didat$3                DATA
- 0002:000134f8 000000e0H .didat$4                DATA
- 0002:000135d8 00000630H .didat$6                DATA
- 0002:00013c08 000000e8H .didat$7                DATA
- 0002:00013cf0 0000005cH .edata                  DATA
- 0002:00013d4c 00000028H .idata$2                DATA
- 0002:00013d74 00000014H .idata$3                DATA
- 0002:00013d88 00000328H .idata$4                DATA
- 0002:000140b0 0000071aH .idata$6                DATA
- 0003:00000000 00000a60H .data                   DATA
- 0003:00000a60 000002f0H .data$r                 DATA
- 0003:00000d50 000000e0H .didat$5                DATA
- 0003:00000e30 000018a4H .bss                    DATA
- 0004:00000000 00002130H .pdata                  DATA
- 0005:00000000 000000b4H .gfids$x                DATA
- 0005:000000b4 00000128H .gfids$y                DATA
- 0006:00000000 00000004H .tls                    DATA
- 0006:00000004 00000004H .tls$                   DATA
- 0006:00000008 00000001H .tls$ZZZ                DATA
- 0007:00000000 00000060H .rsrc$01                DATA
- 0007:00000060 00000180H .rsrc$02                DATA
-
-  Address         Publics by Value              Rva+Base               Lib:Object
-
- 0000:00000000       __guard_iat_count          0000000000000000     <absolute>
- 0000:00000000       __dynamic_value_reloc_table 0000000000000000     <absolute>
- 0000:00000000       __guard_iat_table          0000000000000000     <absolute>
- 0000:00000000       __guard_longjmp_table      0000000000000000     <absolute>
- 0000:00000000       __guard_longjmp_count      0000000000000000     <absolute>
- 0000:00000000       __guard_fids_count         0000000000000000     <absolute>
- 0000:00000000       ___safe_se_handler_table   0000000000000000     <absolute>
- 0000:00000000       ___safe_se_handler_count   0000000000000000     <absolute>
- 0000:00000000       __guard_fids_table         0000000000000000     <absolute>
- 0000:00000100       __guard_flags              0000000000000100     <absolute>
- 0000:00000000       __ImageBase                0000000180000000     <linker-defined>
- 0001:00000070       ?NODE_SET_METHOD@node@@YAXV?$Local@VObject@v8@@@v8@@PEBDP6AXAEBV?$FunctionCallbackInfo@VValue@v8@@@3@@Z@Z 0000000180001070 f i node_printer.obj
- 0001:00000140       ?initNode@@YAXV?$Local@VObject@v8@@@v8@@@Z 0000000180001140 f   node_printer.obj
- 0001:00000250       ?getStringOrBufferFromV8Value@@YA_NV?$Local@VValue@v8@@@v8@@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z 0000000180001250 f   node_printer.obj
- 0001:00000330       ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 0000000180001330 f i node_printer.obj
- 0001:00000460       ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 0000000180001460 f i node_printer.obj
- 0001:00000590       ?_Copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX_K0@Z 0000000180001590 f i node_printer.obj
- 0001:00000710       ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0@Z 0000000180001710 f i node_printer.obj
- 0001:000007e0       ?deallocate@?$allocator@D@std@@QEAAXPEAD_K@Z 00000001800017e0 f i node_printer.obj
- 0001:00000840       ?allocate@?$allocator@D@std@@QEAAPEAD_K@Z 0000000180001840 f i node_printer.obj
- 0001:000008a0       __local_stdio_printf_options 00000001800018a0 f i node_printer_win.obj
- 0001:000008b0       sprintf_s                  00000001800018b0 f i node_printer_win.obj
- 0001:00000910       ?what@exception@stdext@@UEBAPEBDXZ 0000000180001910 f i node_printer_win.obj
- 0001:00000930       ?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ 0000000180001930 f i node_printer_win.obj
- 0001:00000930       ?_Doraise@exception@stdext@@MEBAXXZ 0000000180001930 f i node_printer_win.obj
- 0001:00000930       __except_validate_context_record 0000000180001930 f i libvcruntime:jbcxrval.obj
- 0001:00000930       ??$destroy@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@std@@@?$_Wrap_alloc@V?$allocator@U?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@std@@@std@@@std@@QEAAXPEAPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@1@@Z 0000000180001930 f i node_printer_win.obj
- 0001:00000930       ?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAXXZ 0000000180001930 f i node_printer_win.obj
- 0001:00000930       _guard_check_icall_nop     0000000180001930 f i LIBCMT:guard_support.obj
- 0001:00000930       ?imbue@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAXAEBVlocale@2@@Z 0000000180001930 f i node_printer_win.obj
- 0001:00000940       ??_Eexception@stdext@@UEAAPEAXI@Z 0000000180001940 f i * CIL library *:* CIL module *
- 0001:00000940       ??_Eruntime_error@std@@UEAAPEAXI@Z 0000000180001940 f i * CIL library *:* CIL module *
- 0001:00000940       ??_Gexception@stdext@@UEAAPEAXI@Z 0000000180001940 f i node_printer_win.obj
- 0001:00000940       ??_Gruntime_error@std@@UEAAPEAXI@Z 0000000180001940 f i node_printer_win.obj
- 0001:00000970       ?_Doraise@failure@ios_base@std@@MEBAXXZ 0000000180001970 f i node_printer_win.obj
- 0001:00000970       ?_Doraise@runtime_error@std@@MEBAXXZ 0000000180001970 f i node_printer_win.obj
- 0001:00000990       ??0_Locinfo@std@@QEAA@PEBD@Z 0000000180001990 f i node_printer_win.obj
- 0001:00000a50       ??1_Locinfo@std@@QEAA@XZ   0000000180001a50 f i node_printer_win.obj
- 0001:00000af0       ??_G_Facet_base@std@@UEAAPEAXI@Z 0000000180001af0 f i node_printer_win.obj
- 0001:00000af0       ??_E_Facet_base@std@@UEAAPEAXI@Z 0000000180001af0 f i * CIL library *:* CIL module *
- 0001:00000b20       ?_Incref@facet@locale@std@@UEAAXXZ 0000000180001b20 f i node_printer_win.obj
- 0001:00000b30       ?_Decref@facet@locale@std@@UEAAPEAV_Facet_base@3@XZ 0000000180001b30 f i node_printer_win.obj
- 0001:00000b40       ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 0000000180001b40 f i node_printer_win.obj
- 0001:00000c00       ?do_tolower@?$ctype@D@std@@MEBADD@Z 0000000180001c00 f i node_printer_win.obj
- 0001:00000c10       ?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180001c10 f i node_printer_win.obj
- 0001:00000c70       ?do_toupper@?$ctype@D@std@@MEBADD@Z 0000000180001c70 f i node_printer_win.obj
- 0001:00000c80       ?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180001c80 f i node_printer_win.obj
- 0001:00000ce0       ?do_narrow@?$ctype@D@std@@MEBADDD@Z 0000000180001ce0 f i node_printer_win.obj
- 0001:00000ce0       ?do_widen@?$ctype@D@std@@MEBADD@Z 0000000180001ce0 f i node_printer_win.obj
- 0001:00000cf0       ?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z 0000000180001cf0 f i node_printer_win.obj
- 0001:00000d10       ?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z 0000000180001d10 f i node_printer_win.obj
- 0001:00000d30       ??_G?$ctype@D@std@@MEAAPEAXI@Z 0000000180001d30 f i node_printer_win.obj
- 0001:00000d30       ??_E?$ctype@D@std@@MEAAPEAXI@Z 0000000180001d30 f i * CIL library *:* CIL module *
- 0001:00000da0       ??_E_Iostream_error_category@std@@UEAAPEAXI@Z 0000000180001da0 f i * CIL library *:* CIL module *
- 0001:00000da0       ??_Gerror_category@std@@UEAAPEAXI@Z 0000000180001da0 f i node_printer_win.obj
- 0001:00000da0       ??_G_Iostream_error_category@std@@UEAAPEAXI@Z 0000000180001da0 f i node_printer_win.obj
- 0001:00000da0       ??_Eerror_category@std@@UEAAPEAXI@Z 0000000180001da0 f i * CIL library *:* CIL module *
- 0001:00000dd0       ?default_error_condition@error_category@std@@UEBA?AVerror_condition@2@H@Z 0000000180001dd0 f i node_printer_win.obj
- 0001:00000de0       ?equivalent@error_category@std@@UEBA_NHAEBVerror_condition@2@@Z 0000000180001de0 f i node_printer_win.obj
- 0001:00000e00       ?equivalent@error_category@std@@UEBA_NAEBVerror_code@2@H@Z 0000000180001e00 f i node_printer_win.obj
- 0001:00000e20       ??0_System_error@std@@IEAA@Verror_code@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z 0000000180001e20 f i node_printer_win.obj
- 0001:00001030       ??_G_System_error@std@@UEAAPEAXI@Z 0000000180002030 f i node_printer_win.obj
- 0001:00001030       ??_Efailure@ios_base@std@@UEAAPEAXI@Z 0000000180002030 f i * CIL library *:* CIL module *
- 0001:00001030       ??_E_System_error@std@@UEAAPEAXI@Z 0000000180002030 f i * CIL library *:* CIL module *
- 0001:00001030       ??_Gfailure@ios_base@std@@UEAAPEAXI@Z 0000000180002030 f i node_printer_win.obj
- 0001:00001060       ?name@_Iostream_error_category@std@@UEBAPEBDXZ 0000000180002060 f i node_printer_win.obj
- 0001:00001070       ?message@_Iostream_error_category@std@@UEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@H@Z 0000000180002070 f i node_printer_win.obj
- 0001:000010f0       ?clear@ios_base@std@@QEAAXH_N@Z 00000001800020f0 f i node_printer_win.obj
- 0001:00001460       ??_Eios_base@std@@UEAAPEAXI@Z 0000000180002460 f i * CIL library *:* CIL module *
- 0001:00001460       ??_Gios_base@std@@UEAAPEAXI@Z 0000000180002460 f i node_printer_win.obj
- 0001:00003f50       ?getPrinters@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180004f50 f   node_printer_win.obj
- 0001:000043f0       ?getDefaultPrinterName@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800053f0 f   node_printer_win.obj
- 0001:00004510       ?getPrinter@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180005510 f   node_printer_win.obj
- 0001:00004900       ?getPrinterDriverOptions@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180005900 f   node_printer_win.obj
- 0001:00004970       ?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180005970 f   node_printer_win.obj
- 0001:00004dc0       ?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180005dc0 f   node_printer_win.obj
- 0001:00005330       ?getSupportedJobCommands@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180006330 f   node_printer_win.obj
- 0001:00005460       ?getSupportedPrintFormats@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180006460 f   node_printer_win.obj
- 0001:00005960       ?PrintDirect@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180006960 f   node_printer_win.obj
- 0001:00005f40       ?PrintFile@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180006f40 f   node_printer_win.obj
- 0001:00005fb0       ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ 0000000180006fb0 f i node_printer_win.obj
- 0001:00006040       ??1?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ 0000000180007040 f i node_printer_win.obj
- 0001:00006120       ?seekpos@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAA?AV?$fpos@U_Mbstatet@@@2@V32@H@Z 0000000180007120 f i node_printer_win.obj
- 0001:00006230       ?seekoff@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAA?AV?$fpos@U_Mbstatet@@@2@_JHH@Z 0000000180007230 f i node_printer_win.obj
- 0001:000063c0       ?underflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHXZ 00000001800073c0 f i node_printer_win.obj
- 0001:00006420       ?pbackfail@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z 0000000180007420 f i node_printer_win.obj
- 0001:00006470       ?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z 0000000180007470 f i node_printer_win.obj
- 0001:000066e0       ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 00000001800076e0 f i node_printer_win.obj
- 0001:000068c0       ?sync@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ 00000001800078c0 f i node_printer_win.obj
- 0001:000068c0       ?showmanyc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JXZ 00000001800078c0 f i node_printer_win.obj
- 0001:000068d0       ?setbuf@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAPEAV12@PEAD_J@Z 00000001800078d0 f i node_printer_win.obj
- 0001:000068e0       ?seekoff@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@U_Mbstatet@@@2@_JHH@Z 00000001800078e0 f i node_printer_win.obj
- 0001:000068e0       ?seekpos@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA?AV?$fpos@U_Mbstatet@@@2@V32@H@Z 00000001800078e0 f i node_printer_win.obj
- 0001:00006900       ?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z 0000000180007900 f i node_printer_win.obj
- 0001:000069c0       ?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z 00000001800079c0 f i node_printer_win.obj
- 0001:00006ac0       ?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ 0000000180007ac0 f i node_printer_win.obj
- 0001:00006b00       ?underflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ 0000000180007b00 f i node_printer_win.obj
- 0001:00006b00       ?pbackfail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z 0000000180007b00 f i node_printer_win.obj
- 0001:00006b00       ?overflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z 0000000180007b00 f i node_printer_win.obj
- 0001:00006b10       ??_G?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAAPEAXI@Z 0000000180007b10 f i node_printer_win.obj
- 0001:00006b10       ??_E?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAAPEAXI@Z 0000000180007b10 f i * CIL library *:* CIL module *
- 0001:00006b60       ??_E?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAAPEAXI@Z 0000000180007b60 f i * CIL library *:* CIL module *
- 0001:00006b60       ??_G?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAAPEAXI@Z 0000000180007b60 f i node_printer_win.obj
- 0001:00006bf0       ??_E?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAAPEAXI@Z 0000000180007bf0 f i * CIL library *:* CIL module *
- 0001:00006bf0       ??_G?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAAPEAXI@Z 0000000180007bf0 f i node_printer_win.obj
- 0001:00006c60       ??_E?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAPEAXI@Z 0000000180007c60 f i * CIL library *:* CIL module *
- 0001:00006c60       ??_G?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAPEAXI@Z 0000000180007c60 f i node_printer_win.obj
- 0001:00006ce0       ??_Glocale@std@@QEAAPEAXI@Z 0000000180007ce0 f i node_printer_win.obj
- 0001:00006d40       ??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@AEAV12@@Z 0000000180007d40 f i node_printer_win.obj
- 0001:00006dc0       ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBX@Z 0000000180007dc0 f i node_printer_win.obj
- 0001:00006e60       ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DO@Z 0000000180007e60 f i node_printer_win.obj
- 0001:000070d0       ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z 00000001800080d0 f i node_printer_win.obj
- 0001:00007340       ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_K@Z 0000000180008340 f i node_printer_win.obj
- 0001:00007440       ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_J@Z 0000000180008440 f i node_printer_win.obj
- 0001:00007540       ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DK@Z 0000000180008540 f i node_printer_win.obj
- 0001:00007640       ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z 0000000180008640 f i node_printer_win.obj
- 0001:00007740       ?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 0000000180008740 f i node_printer_win.obj
- 0001:00007cf0       ??R?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@QEBA_NAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@0@Z 0000000180008cf0 f i node_printer_win.obj
- 0001:00007d70       ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 0000000180008d70 f i node_printer_win.obj
- 0001:00007e70       ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 0000000180008e70 f i node_printer_win.obj
- 0001:00007fc0       ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 0000000180008fc0 f i node_printer_win.obj
- 0001:000080f0       ?_Assign_rv@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX$$QEAV12@@Z 00000001800090f0 f i node_printer_win.obj
- 0001:00008170       ?_Tidy@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAXXZ 0000000180009170 f i node_printer_win.obj
- 0001:00008230       ?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 0000000180009230 f i node_printer_win.obj
- 0001:000083c0       ?_Pnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBA_JXZ 00000001800093c0 f i node_printer_win.obj
- 0001:000083e0       ?_Gnavail@?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEBA_JXZ 00000001800093e0 f i node_printer_win.obj
- 0001:00008400       ??_E?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAAPEAXI@Z 0000000180009400 f i * CIL library *:* CIL module *
- 0001:00008400       ??_G?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAAPEAXI@Z 0000000180009400 f i node_printer_win.obj
- 0001:00008430       ?do_truename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 0000000180009430 f i node_printer_win.obj
- 0001:00008480       ?do_falsename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 0000000180009480 f i node_printer_win.obj
- 0001:000084d0       ?do_grouping@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 00000001800094d0 f i node_printer_win.obj
- 0001:00008520       ?do_thousands_sep@?$numpunct@D@std@@MEBADXZ 0000000180009520 f i node_printer_win.obj
- 0001:00008530       ?do_decimal_point@?$numpunct@D@std@@MEBADXZ 0000000180009530 f i node_printer_win.obj
- 0001:00008540       ?_Iput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEAD_K@Z 0000000180009540 f i node_printer_win.obj
- 0001:00008d20       ?_Fput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBD_K@Z 0000000180009d20 f i node_printer_win.obj
- 0001:00009580       ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 000000018000a580 f i node_printer_win.obj
- 0001:00009690       ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ 000000018000a690 f i node_printer_win.obj
- 0001:000097b0       ??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@XZ 000000018000a7b0 f i node_printer_win.obj
- 0001:00009850       ?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IEAAXPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z 000000018000a850 f i node_printer_win.obj
- 0001:000098f0       ??_G?$numpunct@D@std@@MEAAPEAXI@Z 000000018000a8f0 f i node_printer_win.obj
- 0001:000098f0       ??_E?$numpunct@D@std@@MEAAPEAXI@Z 000000018000a8f0 f i * CIL library *:* CIL module *
- 0001:00009950       ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADD@Z 000000018000a950 f i node_printer_win.obj
- 0001:000099d0       ?_Erase@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAAXPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@Z 000000018000a9d0 f i node_printer_win.obj
- 0001:00009ab0       ??$use_facet@V?$ctype@D@std@@@std@@YAAEBV?$ctype@D@0@AEBVlocale@0@@Z 000000018000aab0 f i node_printer_win.obj
- 0001:00009be0       ??$_Immortalize@V_Iostream_error_category@std@@@std@@YAAEAV_Iostream_error_category@0@XZ 000000018000abe0 f i node_printer_win.obj
- 0001:00009c60       ??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 000000018000ac60 f i node_printer_win.obj
- 0001:00009ee0       ??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z 000000018000aee0 f i node_printer_win.obj
- 0001:0000a160       ??$use_facet@V?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@@std@@YAAEBV?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@0@AEBVlocale@0@@Z 000000018000b160 f i node_printer_win.obj
- 0001:0000a2e0       ??$use_facet@V?$numpunct@D@std@@@std@@YAAEBV?$numpunct@D@0@AEBVlocale@0@@Z 000000018000b2e0 f i node_printer_win.obj
- 0001:0000a410       ?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 000000018000b410 f i node_printer_win.obj
- 0001:0000a4d0       ?_Init@?$numpunct@D@std@@IEAAXAEBV_Locinfo@2@_N@Z 000000018000b4d0 f i node_printer_win.obj
- 0001:0000a650       ??$emplace@U?$pair@PEBDH@std@@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@QEAA?AU?$pair@V?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@std@@_N@1@$$QEAU?$pair@PEBDH@1@@Z 000000018000b650 f i node_printer_win.obj
- 0001:0000a720       ??$_Insert_nohint@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@V?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@std@@_N@1@_NAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@1@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@1@@Z 000000018000b720 f i node_printer_win.obj
- 0001:0000a8f0       ??$_Insert_at@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAA?AV?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@1@_NPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@1@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@1@1@Z 000000018000b8f0 f i node_printer_win.obj
- 0001:0000ab9c       ??_E?$basic_ostream@DU?$char_traits@D@std@@@std@@$4PPPPPPPM@A@EAAPEAXI@Z 000000018000bb9c f i node_printer_win.obj
- 0001:0000aba8       ??_E?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@$4PPPPPPPM@A@EAAPEAXI@Z 000000018000bba8 f i node_printer_win.obj
- 0001:0000ac0c       __imp_load_?GetCurrent@Isolate@v8@@SAPEAV12@XZ 000000018000bc0c f   node:node.exe
- 0001:0000ac18       __tailMerge_node_exe       000000018000bc18 f i node:node.exe
- 0001:0000ac91       __imp_load_??1HandleScope@v8@@QEAA@XZ 000000018000bc91 f   node:node.exe
- 0001:0000ac9d       __imp_load_??0HandleScope@v8@@QEAA@PEAVIsolate@1@@Z 000000018000bc9d f   node:node.exe
- 0001:0000aca9       __imp_load_?GetFunction@FunctionTemplate@v8@@QEAA?AV?$Local@VFunction@v8@@@2@XZ 000000018000bca9 f   node:node.exe
- 0001:0000acb5       __imp_load_?New@FunctionTemplate@v8@@SA?AV?$Local@VFunctionTemplate@v8@@@2@PEAVIsolate@2@P6AXAEBV?$FunctionCallbackInfo@VValue@v8@@@2@@ZV?$Local@VValue@v8@@@2@V?$Local@VSignature@v8@@@2@H@Z 000000018000bcb5 f   node:node.exe
- 0001:0000acc1       __imp_load_?IsObject@Value@v8@@QEBA_NXZ 000000018000bcc1 f   node:node.exe
- 0001:0000accd       __imp_load_??1Utf8Value@String@v8@@QEAA@XZ 000000018000bccd f   node:node.exe
- 0001:0000acd9       __imp_load_??0Utf8Value@String@v8@@QEAA@V?$Local@VValue@v8@@@2@@Z 000000018000bcd9 f   node:node.exe
- 0001:0000ace5       __imp_load_?NewFromUtf8@String@v8@@SA?AV?$Local@VString@v8@@@2@PEAVIsolate@2@PEBDW4NewStringType@12@H@Z 000000018000bce5 f   node:node.exe
- 0001:0000acf1       __imp_load_?Set@Object@v8@@QEAA_NV?$Local@VValue@v8@@@2@0@Z 000000018000bcf1 f   node:node.exe
- 0001:0000acfd       __imp_load_?SetName@Function@v8@@QEAAXV?$Local@VString@v8@@@2@@Z 000000018000bcfd f   node:node.exe
- 0001:0000ad09       __imp_load_node_module_register 000000018000bd09 f   node:node.exe
- 0001:0000ad15       __imp_load_?HasInstance@Buffer@node@@YA_NV?$Local@VValue@v8@@@v8@@@Z 000000018000bd15 f   node:node.exe
- 0001:0000ad21       __imp_load_?Data@Buffer@node@@YAPEADV?$Local@VValue@v8@@@v8@@@Z 000000018000bd21 f   node:node.exe
- 0001:0000ad2d       __imp_load_?Length@Buffer@node@@YA_KV?$Local@VValue@v8@@@v8@@@Z 000000018000bd2d f   node:node.exe
- 0001:0000ad39       __imp_load_?ToString@Value@v8@@QEBA?AV?$Local@VString@v8@@@2@XZ 000000018000bd39 f   node:node.exe
- 0001:0000ad45       __imp_load_?ThrowException@Isolate@v8@@QEAA?AV?$Local@VValue@v8@@@2@V32@@Z 000000018000bd45 f   node:node.exe
- 0001:0000ad51       __imp_load_?TypeError@Exception@v8@@SA?AV?$Local@VValue@v8@@@2@V?$Local@VString@v8@@@2@@Z 000000018000bd51 f   node:node.exe
- 0001:0000ad5d       __imp_load_?New@Array@v8@@SA?AV?$Local@VArray@v8@@@2@PEAVIsolate@2@H@Z 000000018000bd5d f   node:node.exe
- 0001:0000ad69       __imp_load_?Int32Value@Value@v8@@QEBAHXZ 000000018000bd69 f   node:node.exe
- 0001:0000ad75       __imp_load_?IsInt32@Value@v8@@QEBA_NXZ 000000018000bd75 f   node:node.exe
- 0001:0000ad81       __imp_load_??1Value@String@v8@@QEAA@XZ 000000018000bd81 f   node:node.exe
- 0001:0000ad8d       __imp_load_??0Value@String@v8@@QEAA@V?$Local@VValue@v8@@@2@@Z 000000018000bd8d f   node:node.exe
- 0001:0000ad99       __imp_load_?NewFromTwoByte@String@v8@@SA?AV?$Local@VString@v8@@@2@PEAVIsolate@2@PEBGW4NewStringType@12@H@Z 000000018000bd99 f   node:node.exe
- 0001:0000ada5       __imp_load_?New@Number@v8@@SA?AV?$Local@VNumber@v8@@@2@PEAVIsolate@2@N@Z 000000018000bda5 f   node:node.exe
- 0001:0000adb1       __imp_load_?New@Object@v8@@SA?AV?$Local@VObject@v8@@@2@PEAVIsolate@2@@Z 000000018000bdb1 f   node:node.exe
- 0001:0000adbd       __imp_load_?Set@Object@v8@@QEAA_NIV?$Local@VValue@v8@@@2@@Z 000000018000bdbd f   node:node.exe
- 0001:0000adcc       ??0bad_alloc@std@@QEAA@AEBV01@@Z 000000018000bdcc f i libcpmt:xthrow.obj
- 0001:0000ae0c       ??0bad_alloc@std@@QEAA@XZ  000000018000be0c f i libcpmt:xthrow.obj
- 0001:0000ae2c       ??0exception@std@@QEAA@AEBV01@@Z 000000018000be2c f i libcpmt:xthrow.obj
- 0001:0000ae64       ??0length_error@std@@QEAA@AEBV01@@Z 000000018000be64 f i libcpmt:xthrow.obj
- 0001:0000aea4       ??0length_error@std@@QEAA@PEBD@Z 000000018000bea4 f i libcpmt:xthrow.obj
- 0001:0000aef0       ??0logic_error@std@@QEAA@AEBV01@@Z 000000018000bef0 f i libcpmt:xthrow.obj
- 0001:0000af30       ??0out_of_range@std@@QEAA@AEBV01@@Z 000000018000bf30 f i libcpmt:xthrow.obj
- 0001:0000af70       ??0out_of_range@std@@QEAA@PEBD@Z 000000018000bf70 f i libcpmt:xthrow.obj
- 0001:0000afbc       ??_Gbad_exception@std@@UEAAPEAXI@Z 000000018000bfbc f i libvcruntime:frame.obj
- 0001:0000afbc       ??_Gbad_alloc@std@@UEAAPEAXI@Z 000000018000bfbc f i libcpmt:xthrow.obj
- 0001:0000afbc       ??_Ebad_alloc@std@@UEAAPEAXI@Z 000000018000bfbc f i libcpmt:xthrow.obj
- 0001:0000afbc       ??_Elogic_error@std@@UEAAPEAXI@Z 000000018000bfbc f i libcpmt:xthrow.obj
- 0001:0000afbc       ??_Glogic_error@std@@UEAAPEAXI@Z 000000018000bfbc f i libcpmt:xthrow.obj
- 0001:0000afbc       ??_Eexception@std@@UEAAPEAXI@Z 000000018000bfbc f i libcpmt:xthrow.obj
- 0001:0000afbc       ??_Gexception@std@@UEAAPEAXI@Z 000000018000bfbc f i libcpmt:xthrow.obj
- 0001:0000afbc       ??_Ebad_array_new_length@std@@UEAAPEAXI@Z 000000018000bfbc f i LIBCMT:throw_bad_alloc.obj
- 0001:0000afbc       ??_Eout_of_range@std@@UEAAPEAXI@Z 000000018000bfbc f i libcpmt:xthrow.obj
- 0001:0000afbc       ??_Elength_error@std@@UEAAPEAXI@Z 000000018000bfbc f i libcpmt:xthrow.obj
- 0001:0000afbc       ??_Ebad_exception@std@@UEAAPEAXI@Z 000000018000bfbc f i libvcruntime:frame.obj
- 0001:0000afbc       ??_Gbad_array_new_length@std@@UEAAPEAXI@Z 000000018000bfbc f i LIBCMT:throw_bad_alloc.obj
- 0001:0000afbc       ??_Gout_of_range@std@@UEAAPEAXI@Z 000000018000bfbc f i libcpmt:xthrow.obj
- 0001:0000afbc       ??_Glength_error@std@@UEAAPEAXI@Z 000000018000bfbc f i libcpmt:xthrow.obj
- 0001:0000b000       ?_Xbad_alloc@std@@YAXXZ    000000018000c000 f   libcpmt:xthrow.obj
- 0001:0000b000       ?__scrt_throw_std_bad_alloc@@YAXXZ 000000018000c000 f   LIBCMT:throw_bad_alloc.obj
- 0001:0000b020       ?_Xlength_error@std@@YAXPEBD@Z 000000018000c020 f   libcpmt:xthrow.obj
- 0001:0000b044       ?_Xout_of_range@std@@YAXPEBD@Z 000000018000c044 f   libcpmt:xthrow.obj
- 0001:0000b068       ?what@exception@std@@UEBAPEBDXZ 000000018000c068 f i libcpmt:xthrow.obj
- 0001:0000b07c       ??0_Init_locks@std@@QEAA@XZ 000000018000c07c f   libcpmt:xlock.obj
- 0001:0000b0c8       ??0_Lockit@std@@QEAA@H@Z   000000018000c0c8 f   libcpmt:xlock.obj
- 0001:0000b104       ??1_Init_locks@std@@QEAA@XZ 000000018000c104 f   libcpmt:xlock.obj
- 0001:0000b148       ??1_Lockit@std@@QEAA@XZ    000000018000c148 f   libcpmt:xlock.obj
- 0001:0000b17c       ??4?$_Yarn@D@std@@QEAAAEAV01@PEBD@Z 000000018000c17c f i libcpmt:locale0.obj
- 0001:0000b1f4       ??_G_Fac_node@std@@QEAAPEAXI@Z 000000018000c1f4 f i libcpmt:locale0.obj
- 0001:0000b280       ??_E_Locimp@locale@std@@MEAAPEAXI@Z 000000018000c280 f i libcpmt:locale0.obj
- 0001:0000b280       ??_G_Locimp@locale@std@@MEAAPEAXI@Z 000000018000c280 f i libcpmt:locale0.obj
- 0001:0000b2ec       ?_Facet_Register@std@@YAXPEAV_Facet_base@1@@Z 000000018000c2ec f   libcpmt:locale0.obj
- 0001:0000b324       ?_Getgloballocale@locale@std@@CAPEAV_Locimp@12@XZ 000000018000c324 f   libcpmt:locale0.obj
- 0001:0000b32c       ?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z 000000018000c32c f   libcpmt:locale0.obj
- 0001:0000b3e8       ?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z 000000018000c3e8 f   libcpmt:locale0.obj
- 0001:0000b490       ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z 000000018000c490 f   libcpmt:locale0.obj
- 0001:0000b4fc       ?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z 000000018000c4fc f   libcpmt:locale0.obj
- 0001:0000b520       ?_New_Locimp@_Locimp@locale@std@@CAPEAV123@_N@Z 000000018000c520 f   libcpmt:locale0.obj
- 0001:0000b590       ?_Setgloballocale@locale@std@@CAXPEAX@Z 000000018000c590 f   libcpmt:locale0.obj
- 0001:0000b5c4       _Deletegloballocale        000000018000c5c4 f   libcpmt:locale0.obj
- 0001:0000b64c       ?_Ios_base_dtor@ios_base@std@@CAXPEAV12@@Z 000000018000c64c f   libcpmt:ios.obj
- 0001:0000b690       ?_Tidy@ios_base@std@@AEAAXXZ 000000018000c690 f i libcpmt:ios.obj
- 0001:0000b720       ?_Syserror_map@std@@YAPEBDH@Z 000000018000c720 f   libcpmt:syserror.obj
- 0001:0000b748       _Getctype                  000000018000c748 f   libcpmt:_tolower.obj
- 0001:0000b808       _Tolower                   000000018000c808 f   libcpmt:_tolower.obj
- 0001:0000b930       _Getcvt                    000000018000c930 f   libcpmt:xwctomb.obj
- 0001:0000b9c0       _Toupper                   000000018000c9c0 f   libcpmt:_toupper.obj
- 0001:0000baf8       _Mtxdst                    000000018000caf8 f   libcpmt:xmtx.obj
- 0001:0000bb00       _Mtxinit                   000000018000cb00 f   libcpmt:xmtx.obj
- 0001:0000bb10       _Mtxlock                   000000018000cb10 f   libcpmt:xmtx.obj
- 0001:0000bb18       _Mtxunlock                 000000018000cb18 f   libcpmt:xmtx.obj
- 0001:0000bb20       ?_Atexit@@YAXP6AXXZ@Z      000000018000cb20 f   libcpmt:iosptrs.obj
- 0001:0000bb60       __crtLCMapStringA          000000018000cb60 f   libcpmt:StlLCMapStringA.obj
- 0001:0000c31c       __crtInitializeCriticalSectionEx 000000018000d31c f   libcpmt:winapisupp.obj
- 0001:0000c37c       GetTableIndexFromLocaleName 000000018000d37c f   libcpmt:winapinls.obj
- 0001:0000c408       __crtDownlevelLocaleNameToLCID 000000018000d408 f   libcpmt:winapinls.obj
- 0001:0000c43c       __crtLCMapStringEx         000000018000d43c f   libcpmt:winapinls.obj
- 0001:0000c4f8       __wcsnicmp_ascii           000000018000d4f8 f   libcpmt:winapinls.obj
- 0001:0000c560       __security_check_cookie    000000018000d560 f   LIBCMT:_amdsecgs_.obj
- 0001:0000c584       ??2@YAPEAX_K@Z             000000018000d584 f   LIBCMT:new_scalar.obj
- 0001:0000c5c0       ??3@YAXPEAX@Z              000000018000d5c0 f   LIBCMT:delete_scalar.obj
- 0001:0000c5c8       ??_V@YAXPEAX@Z             000000018000d5c8 f   LIBCMT:delete_array.obj
- 0001:0000c5c8       ??3@YAXPEAX_K@Z            000000018000d5c8 f   LIBCMT:delete_scalar_size.obj
- 0001:0000c718       _Init_thread_footer        000000018000d718 f   LIBCMT:thread_safe_statics.obj
- 0001:0000c778       _Init_thread_header        000000018000d778 f   LIBCMT:thread_safe_statics.obj
- 0001:0000c7e0       _Init_thread_notify        000000018000d7e0 f   LIBCMT:thread_safe_statics.obj
- 0001:0000c83c       _Init_thread_wait          000000018000d83c f   LIBCMT:thread_safe_statics.obj
- 0001:0000c8d4       __scrt_acquire_startup_lock 000000018000d8d4 f   LIBCMT:utility.obj
- 0001:0000c910       __scrt_dllmain_after_initialize_c 000000018000d910 f   LIBCMT:utility.obj
- 0001:0000c944       __scrt_dllmain_before_initialize_c 000000018000d944 f   LIBCMT:utility.obj
- 0001:0000c95c       __scrt_dllmain_crt_thread_attach 000000018000d95c f   LIBCMT:utility.obj
- 0001:0000c984       __scrt_dllmain_crt_thread_detach 000000018000d984 f   LIBCMT:utility.obj
- 0001:0000c99c       __scrt_dllmain_exception_filter 000000018000d99c f   LIBCMT:utility.obj
- 0001:0000ca00       __scrt_dllmain_uninitialize_c 000000018000da00 f   LIBCMT:utility.obj
- 0001:0000ca30       __scrt_dllmain_uninitialize_critical 000000018000da30 f   LIBCMT:utility.obj
- 0001:0000ca44       __scrt_initialize_crt      000000018000da44 f   LIBCMT:utility.obj
- 0001:0000ca90       __scrt_initialize_onexit_tables 000000018000da90 f   LIBCMT:utility.obj
- 0001:0000cb5c       __scrt_is_nonwritable_in_current_image 000000018000db5c f   LIBCMT:utility.obj
- 0001:0000cbf8       __scrt_release_startup_lock 000000018000dbf8 f   LIBCMT:utility.obj
- 0001:0000cc1c       __scrt_uninitialize_crt    000000018000dc1c f   LIBCMT:utility.obj
- 0001:0000cc48       _onexit                    000000018000dc48 f   LIBCMT:utility.obj
- 0001:0000cc98       atexit                     000000018000dc98 f   LIBCMT:utility.obj
- 0001:0000cffc       _DllMainCRTStartup         000000018000dffc f   LIBCMT:dll_dllmain.obj
- 0001:0000d03c       ??_Etype_info@@UEAAPEAXI@Z 000000018000e03c f i LIBCMT:std_type_info_static.obj
- 0001:0000d03c       ??_Gtype_info@@UEAAPEAXI@Z 000000018000e03c f i LIBCMT:std_type_info_static.obj
- 0001:0000d068       _guard_check_icall         000000018000e068 f i LIBCMT:checkcfg.obj
- 0001:0000d070       __GSHandlerCheck           000000018000e070 f   LIBCMT:_gshandler_.obj
- 0001:0000d090       __GSHandlerCheckCommon     000000018000e090 f   LIBCMT:_gshandler_.obj
- 0001:0000d100       _alloca_probe              000000018000e100 f   LIBCMT:_chkstk_.obj
- 0001:0000d100       __chkstk                   000000018000e100 f   LIBCMT:_chkstk_.obj
- 0001:0000d154       __raise_securityfailure    000000018000e154 f   LIBCMT:gs_report.obj
- 0001:0000d188       __report_gsfailure         000000018000e188 f   LIBCMT:gs_report.obj
- 0001:0000d25c       __report_rangecheckfailure 000000018000e25c f   LIBCMT:gs_report.obj
- 0001:0000d270       __report_securityfailure   000000018000e270 f   LIBCMT:gs_report.obj
- 0001:0000d3f0       ??0bad_array_new_length@std@@QEAA@AEBV01@@Z 000000018000e3f0 f i LIBCMT:throw_bad_alloc.obj
- 0001:0000d430       ??0bad_array_new_length@std@@QEAA@XZ 000000018000e430 f i LIBCMT:throw_bad_alloc.obj
- 0001:0000d450       ?__scrt_throw_std_bad_array_new_length@@YAXXZ 000000018000e450 f   LIBCMT:throw_bad_alloc.obj
- 0001:0000d470       __crt_debugger_hook        000000018000e470 f   LIBCMT:utility_desktop.obj
- 0001:0000d478       __scrt_fastfail            000000018000e478 f   LIBCMT:utility_desktop.obj
- 0001:0000d5c0       __isa_available_init       000000018000e5c0 f   LIBCMT:_cpu_disp_.obj
- 0001:0000d788       __scrt_is_ucrt_dll_in_use  000000018000e788 f   LIBCMT:ucrt_detection.obj
- 0001:0000d794       __security_init_cookie     000000018000e794 f   LIBCMT:gs_support.obj
- 0001:0000d840       DllMain                    000000018000e840 f   LIBCMT:dll_dllmain_stub.obj
- 0001:0000d840       _get_startup_argv_mode     000000018000e840 f   LIBCMT:argv_mode.obj
- 0001:0000d848       ?__scrt_initialize_type_info@@YAXXZ 000000018000e848 f   LIBCMT:tncleanup.obj
- 0001:0000d858       ?__scrt_uninitialize_type_info@@YAXXZ 000000018000e858 f   LIBCMT:tncleanup.obj
- 0001:0000d864       __local_stdio_scanf_options 000000018000e864 f i LIBCMT:default_local_stdio_options.obj
- 0001:0000d86c       __scrt_initialize_default_local_stdio_options 000000018000e86c f   LIBCMT:default_local_stdio_options.obj
- 0001:0000d888       __scrt_get_dyn_tls_init_callback 000000018000e888 f   LIBCMT:dyn_tls_init.obj
- 0001:0000d890       _RTC_Initialize            000000018000e890 f   LIBCMT:_initsect_.obj
- 0001:0000d8dc       _RTC_Terminate             000000018000e8dc f   LIBCMT:_initsect_.obj
- 0001:0000d940       memcpy                     000000018000e940 f   libvcruntime:memcpy.obj
- 0001:0000d940       memmove                    000000018000e940 f   libvcruntime:memcpy.obj
- 0001:0000dd78       _purecall                  000000018000ed78 f   libvcruntime:purevirt.obj
- 0001:0000ddb4       __std_exception_copy       000000018000edb4 f   libvcruntime:std_exception.obj
- 0001:0000de44       __std_exception_destroy    000000018000ee44 f   libvcruntime:std_exception.obj
- 0001:0000de6c       _CxxThrowException         000000018000ee6c f   libvcruntime:throw.obj
- 0001:0000df44       __DestructExceptionObject  000000018000ef44 f   libvcruntime:frame.obj
- 0001:0000dfcc       ??0bad_exception@std@@QEAA@AEBV01@@Z 000000018000efcc f i libvcruntime:frame.obj
- 0001:0000e00c       ??0bad_exception@std@@QEAA@XZ 000000018000f00c f i libvcruntime:frame.obj
- 0001:0000e02c       ??1bad_array_new_length@std@@UEAA@XZ 000000018000f02c f i LIBCMT:throw_bad_alloc.obj
- 0001:0000e02c       ??1length_error@std@@UEAA@XZ 000000018000f02c f i libcpmt:xthrow.obj
- 0001:0000e02c       ??1out_of_range@std@@UEAA@XZ 000000018000f02c f i libcpmt:xthrow.obj
- 0001:0000e02c       ??1bad_exception@std@@UEAA@XZ 000000018000f02c f i libvcruntime:frame.obj
- 0001:0000e02c       ??1bad_alloc@std@@UEAA@XZ  000000018000f02c f i libcpmt:xthrow.obj
- 0001:0000e99c       ?_CallMemberFunction0@@YAXPEAXP6AX0@Z@Z 000000018000f99c f i libvcruntime:frame.obj
- 0001:0000e9a0       ?_CallMemberFunction1@@YAXPEAXP6AX0@Z0@Z 000000018000f9a0 f i libvcruntime:frame.obj
- 0001:0000e9ac       ?_CallMemberFunction2@@YAXPEAXP6AX0@Z0H@Z 000000018000f9ac f i libvcruntime:frame.obj
- 0001:0000e9bc       __AdjustPointer            000000018000f9bc f   libvcruntime:frame.obj
- 0001:0000e9e0       __BuildCatchObject         000000018000f9e0 f   libvcruntime:frame.obj
- 0001:0000eaa4       __BuildCatchObjectHelper   000000018000faa4 f   libvcruntime:frame.obj
- 0001:0000ec84       __CxxCallCatchBlock        000000018000fc84 f   libvcruntime:frame.obj
- 0001:0000ee70       __FrameUnwindFilter        000000018000fe70 f   libvcruntime:frame.obj
- 0001:0000eebc       __FrameUnwindToState       000000018000febc f   libvcruntime:frame.obj
- 0001:0000f050       __InternalCxxFrameHandler  0000000180010050 f   libvcruntime:frame.obj
- 0001:0000f2a8       __TypeMatch                00000001800102a8 f   libvcruntime:frame.obj
- 0001:0000f3e8       __std_terminate            00000001800103e8 f   libvcruntime:frame.obj
- 0001:0000f3f4       ?_ExecutionInCatch@@YAHPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 00000001800103f4 f   libvcruntime:trnsctrl.obj
- 0001:0000f468       ?_GetEstablisherFrame@@YAPEA_KPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@0@Z 0000000180010468 f   libvcruntime:trnsctrl.obj
- 0001:0000f534       ?_GetRangeOfTrysToCheck@@YAPEBU_s_TryBlockMapEntry@@PEA_KPEBU_s_FuncInfo@@HHPEAI2PEAU_xDISPATCHER_CONTEXT@@@Z 0000000180010534 f   libvcruntime:trnsctrl.obj
- 0001:0000f660       ?__FrameUnwindToEmptyState@@YAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 0000000180010660 f   libvcruntime:trnsctrl.obj
- 0001:0000f6f4       ?__SehTransFilter@@YAHPEAU_EXCEPTION_POINTERS@@PEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@PEAH@Z 00000001800106f4 f   libvcruntime:trnsctrl.obj
- 0001:0000f78c       _CallSETranslator          000000018001078c f   libvcruntime:trnsctrl.obj
- 0001:0000f7e4       _CreateFrameInfo           00000001800107e4 f   libvcruntime:trnsctrl.obj
- 0001:0000f820       _FindAndUnlinkFrame        0000000180010820 f   libvcruntime:trnsctrl.obj
- 0001:0000f878       _GetImageBase              0000000180010878 f   libvcruntime:trnsctrl.obj
- 0001:0000f88c       _GetThrowImageBase         000000018001088c f   libvcruntime:trnsctrl.obj
- 0001:0000f8a0       _IsExceptionObjectToBeDestroyed 00000001800108a0 f   libvcruntime:trnsctrl.obj
- 0001:0000f8d0       _SetImageBase              00000001800108d0 f   libvcruntime:trnsctrl.obj
- 0001:0000f8e8       _SetThrowImageBase         00000001800108e8 f   libvcruntime:trnsctrl.obj
- 0001:0000f900       _UnwindNestedFrames        0000000180010900 f   libvcruntime:trnsctrl.obj
- 0001:0000fa24       __CxxFrameHandler3         0000000180010a24 f   libvcruntime:trnsctrl.obj
- 0001:0000fac0       memset                     0000000180010ac0 f   libvcruntime:memset.obj
- 0001:0000fc70       memcmp                     0000000180010c70 f   libvcruntime:memcmp.obj
- 0001:0000ff00       __vcrt_FlsAlloc            0000000180010f00 f   libvcruntime:winapi_downlevel.obj
- 0001:0000ff54       __vcrt_FlsFree             0000000180010f54 f   libvcruntime:winapi_downlevel.obj
- 0001:0000ffa8       __vcrt_FlsGetValue         0000000180010fa8 f   libvcruntime:winapi_downlevel.obj
- 0001:0000fffc       __vcrt_FlsSetValue         0000000180010ffc f   libvcruntime:winapi_downlevel.obj
- 0001:00010064       __vcrt_InitializeCriticalSectionEx 0000000180011064 f   libvcruntime:winapi_downlevel.obj
- 0001:000100dc       __vcrt_initialize_winapi_thunks 00000001800110dc f   libvcruntime:winapi_downlevel.obj
- 0001:00010128       __vcrt_uninitialize_winapi_thunks 0000000180011128 f   libvcruntime:winapi_downlevel.obj
- 0001:00010168       __vcrt_initialize          0000000180011168 f   libvcruntime:initialization.obj
- 0001:0001019c       __vcrt_thread_attach       000000018001119c f   libvcruntime:initialization.obj
- 0001:000101b0       __vcrt_thread_detach       00000001800111b0 f   libvcruntime:initialization.obj
- 0001:000101c4       __vcrt_uninitialize        00000001800111c4 f   libvcruntime:initialization.obj
- 0001:000101e4       __vcrt_uninitialize_critical 00000001800111e4 f   libvcruntime:initialization.obj
- 0001:000101f4       __C_specific_handler       00000001800111f4 f   libvcruntime:_chandler_.obj
- 0001:000103f0       __std_type_info_compare    00000001800113f0 f   libvcruntime:std_type_info.obj
- 0001:00010418       __std_type_info_destroy_list 0000000180011418 f   libvcruntime:std_type_info.obj
- 0001:00010444       __vcrt_initialize_pure_virtual_call_handler 0000000180011444 f   libvcruntime:purevirt_data.obj
- 0001:00010468       __vcrt_freefls             0000000180011468 f   libvcruntime:per_thread_data.obj
- 0001:00010488       __vcrt_freeptd             0000000180011488 f   libvcruntime:per_thread_data.obj
- 0001:000104d8       __vcrt_getptd              00000001800114d8 f   libvcruntime:per_thread_data.obj
- 0001:000104f4       __vcrt_getptd_noexit       00000001800114f4 f   libvcruntime:per_thread_data.obj
- 0001:000105ac       __vcrt_initialize_ptd      00000001800115ac f   libvcruntime:per_thread_data.obj
- 0001:000105ec       __vcrt_uninitialize_ptd    00000001800115ec f   libvcruntime:per_thread_data.obj
- 0001:00010610       ?__GetCurrentState@@YAHPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 0000000180011610 f   libvcruntime:ehstate.obj
- 0001:00010638       ?__GetUnwindTryBlock@@YAHPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 0000000180011638 f   libvcruntime:ehstate.obj
- 0001:00010664       ?__SetState@@YAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@H@Z 0000000180011664 f   libvcruntime:ehstate.obj
- 0001:00010670       ?__SetUnwindTryBlock@@YAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@H@Z 0000000180011670 f   libvcruntime:ehstate.obj
- 0001:000106ac       ?__StateFromControlPc@@YAHPEBU_s_FuncInfo@@PEAU_xDISPATCHER_CONTEXT@@@Z 00000001800116ac f   libvcruntime:ehstate.obj
- 0001:000106b4       ?__StateFromIp@@YAHPEBU_s_FuncInfo@@PEAU_xDISPATCHER_CONTEXT@@_J@Z 00000001800116b4 f   libvcruntime:ehstate.obj
- 0001:00010730       _CallSettingFrame          0000000180011730 f   libvcruntime:handlers.obj
- 0001:00010780       _local_unwind              0000000180011780 f   libvcruntime:_jmpuwind_.obj
- 0001:000107b0       _NLG_Notify                00000001800117b0 f   libvcruntime:_jmpuwind_.obj
- 0001:000107d0       __NLG_Dispatch2            00000001800117d0 f   libvcruntime:_jmpuwind_.obj
- 0001:000107e0       __NLG_Return2              00000001800117e0 f   libvcruntime:_jmpuwind_.obj
- 0001:000107e4       __vcrt_initialize_locks    00000001800117e4 f   libvcruntime:locks.obj
- 0001:0001082c       __vcrt_uninitialize_locks  000000018001182c f   libvcruntime:locks.obj
- 0001:00010864       __acrt_call_reportfault    0000000180011864 f   libucrt:invalid_parameter.obj
- 0001:000109c0       __acrt_initialize_invalid_parameter_handler 00000001800119c0 f   libucrt:invalid_parameter.obj
- 0001:000109c8       _invalid_parameter         00000001800119c8 f   libucrt:invalid_parameter.obj
- 0001:00010a70       _invalid_parameter_noinfo  0000000180011a70 f   libucrt:invalid_parameter.obj
- 0001:00010a90       _invalid_parameter_noinfo_noreturn 0000000180011a90 f   libucrt:invalid_parameter.obj
- 0001:00010ac0       _invoke_watson             0000000180011ac0 f   libucrt:invalid_parameter.obj
- 0001:00010b08       abort                      0000000180011b08 f   libucrt:abort.obj
- 0001:00010b60       calloc                     0000000180011b60 f   libucrt:calloc.obj
- 0001:00010b68       strcspn                    0000000180011b68 f   libucrt:strcspn.obj
- 0001:00010db0       ??$ensure_buffer_is_big_enough@D@formatting_buffer@__crt_stdio_output@@QEAA_N_K@Z 0000000180011db0 f i libucrt:output.obj
- 0001:00010e5c       ??$is_wide_character_specifier@D@__crt_stdio_output@@YA_N_KDW4length_modifier@0@@Z 0000000180011e5c f i libucrt:output.obj
- 0001:00010e8c       ??$type_case_integer_parse_into_buffer@I@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAXII_N@Z 0000000180011e8c f i libucrt:output.obj
- 0001:00010f28       ??$type_case_integer_parse_into_buffer@_K@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAX_KI_N@Z 0000000180011f28 f i libucrt:output.obj
- 0001:00010fc4       ??$write_multiple_characters@V?$string_output_adapter@D@__crt_stdio_output@@D@__crt_stdio_output@@YAXAEBV?$string_output_adapter@D@0@DHQEAH@Z 0000000180011fc4 f i libucrt:output.obj
- 0001:00011020       ??0?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAA@AEBV?$string_output_adapter@D@1@_KQEBDQEAU__crt_locale_pointers@@QEAD@Z 0000000180012020 f i libucrt:output.obj
- 0001:0001109c       ??0_LocaleUpdate@@QEAA@QEAU__crt_locale_pointers@@@Z 000000018001209c f i libucrt:output.obj
- 0001:0001112c       ?force_decimal_point@__crt_stdio_output@@YAXPEADQEAU__crt_locale_pointers@@@Z 000000018001212c f i libucrt:output.obj
- 0001:0001119c       ?parse_int_from_format_string@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NQEAH@Z 000000018001219c f i libucrt:output.obj
- 0001:00011220       ?process@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAAHXZ 0000000180012220 f i libucrt:output.obj
- 0001:00011434       ?state_case_normal@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180012434 f i libucrt:output.obj
- 0001:000114a8       ?state_case_normal_tchar@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 00000001800124a8 f i libucrt:output.obj
- 0001:00011540       ?state_case_size@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180012540 f i libucrt:output.obj
- 0001:000116bc       ?state_case_type@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800126bc f i libucrt:output.obj
- 0001:00011938       ?type_case_Z@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180012938 f i libucrt:output.obj
- 0001:000119b8       ?type_case_a@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800129b8 f i libucrt:output.obj
- 0001:00011bd4       ?type_case_c_tchar@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 0000000180012bd4 f i libucrt:output.obj
- 0001:00011c88       ?type_case_integer@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NI_N@Z 0000000180012c88 f i libucrt:output.obj
- 0001:00011e28       ?type_case_n@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180012e28 f i libucrt:output.obj
- 0001:00011f04       ?type_case_s@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180012f04 f i libucrt:output.obj
- 0001:00011f94       ?write_stored_string_tchar@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 0000000180012f94 f i libucrt:output.obj
- 0001:0001206c       ?write_string@?$string_output_adapter@D@__crt_stdio_output@@QEBAXQEBDHQEAH1@Z 000000018001306c f i libucrt:output.obj
- 0001:00012128       __stdio_common_vsprintf_s  0000000180013128 f   libucrt:output.obj
- 0001:0001218c       localeconv                 000000018001318c f   libucrt:localeconv.obj
- 0001:000121c0       free                       00000001800131c0 f   libucrt:free.obj
- 0001:000121c8       frexp                      00000001800131c8 f   libucrt:frexp.obj
- 0001:000122c0       malloc                     00000001800132c0 f   libucrt:malloc.obj
- 0001:000122c8       __ascii_stricmp            00000001800132c8 f   libucrt:stricmp.obj
- 0001:00012304       _stricmp                   0000000180013304 f   libucrt:stricmp.obj
- 0001:0001234c       _stricmp_l                 000000018001334c f   libucrt:stricmp.obj
- 0001:00012400       __acrt_initialize_locks    0000000180013400 f   libucrt:locks.obj
- 0001:00012448       __acrt_lock                0000000180013448 f   libucrt:locks.obj
- 0001:00012464       __acrt_uninitialize_locks  0000000180013464 f   libucrt:locks.obj
- 0001:0001249c       __acrt_unlock              000000018001349c f   libucrt:locks.obj
- 0001:000124b8       _lock_locales              00000001800134b8 f   libucrt:locks.obj
- 0001:000124c8       _unlock_locales            00000001800134c8 f   libucrt:locks.obj
- 0001:000125c0       setlocale                  00000001800135c0 f   libucrt:setlocale.obj
- 0001:0001278c       _calloc_base               000000018001378c f   libucrt:calloc_base.obj
- 0001:00012804       __pctype_func              0000000180013804 f   libucrt:ctype.obj
- 0001:00012834       isdigit                    0000000180013834 f i libucrt:_ctype.obj
- 0001:000128a8       islower                    00000001800138a8 f i libucrt:_ctype.obj
- 0001:0001291c       isupper                    000000018001391c f i libucrt:_ctype.obj
- 0001:00012990       _wcsdup                    0000000180013990 f   libucrt:wcsdup.obj
- 0001:00012a14       ___lc_codepage_func        0000000180013a14 f   libucrt:initctype.obj
- 0001:00012a44       ___lc_locale_name_func     0000000180013a44 f   libucrt:initctype.obj
- 0001:00012a78       ___mb_cur_max_func         0000000180013a78 f   libucrt:initctype.obj
- 0001:00012aa8       __acrt_locale_initialize_ctype 0000000180013aa8 f   libucrt:initctype.obj
- 0001:0001307c       __acrt_errno_from_os_error 000000018001407c f   libucrt:errno.obj
- 0001:000130c4       __acrt_errno_map_os_error  00000001800140c4 f   libucrt:errno.obj
- 0001:00013114       __doserrno                 0000000180014114 f   libucrt:errno.obj
- 0001:00013134       _errno                     0000000180014134 f   libucrt:errno.obj
- 0001:000131cc       _ismbblead                 00000001800141cc f   libucrt:ismbbyte.obj
- 0001:000131e0       _malloc_base               00000001800141e0 f   libucrt:malloc_base.obj
- 0001:00013240       _realloc_base              0000000180014240 f   libucrt:realloc_base.obj
- 0001:000132c4       ??$make_c_string_character_source@_W$$T@__crt_strtox@@YA?AV?$c_string_character_source@_W@0@QEB_W$$T@Z 00000001800142c4 f i libucrt:atox.obj
- 0001:000132c4       ??$make_c_string_character_source@DPEAPEAD@__crt_strtox@@YA?AV?$c_string_character_source@D@0@QEBDQEAPEAD@Z 00000001800142c4 f i libucrt:strtod.obj
- 0001:000132e0       ?divide@__crt_strtox@@YA_KAEAUbig_integer@1@AEBU21@@Z 00000001800142e0 f i libucrt:strtod.obj
- 0001:00013840       pow                        0000000180014840 f   libucrt:pow.obj
- 0001:00014ee0       powf                       0000000180015ee0 f   libucrt:powf.obj
- 0001:00015da8       __strncnt                  0000000180016da8 f   libucrt:strncnt.obj
- 0001:00015dc0       _free_base                 0000000180016dc0 f   libucrt:free_base.obj
- 0001:00015e50       _tolower_l                 0000000180016e50 f   libucrt:tolower_toupper.obj
- 0001:00015f90       tolower                    0000000180016f90 f   libucrt:tolower_toupper.obj
- 0001:00015fbc       wcscpy_s                   0000000180016fbc f   libucrt:wcscpy_s.obj
- 0001:00016024       strnlen                    0000000180017024 f   libucrt:strnlen.obj
- 0001:00016180       wcsnlen                    0000000180017180 f   libucrt:strnlen.obj
- 0001:00016370       __acrt_initialize_new_handler 0000000180017370 f   libucrt:new_handler.obj
- 0001:00016378       _callnewh                  0000000180017378 f   libucrt:new_handler.obj
- 0001:000163b8       _query_new_handler         00000001800173b8 f   libucrt:new_handler.obj
- 0001:000163ec       _seh_filter_dll            00000001800173ec f   libucrt:exception_filter.obj
- 0001:00016400       _seh_filter_exe            0000000180017400 f   libucrt:exception_filter.obj
- 0001:000167c0       __acrt_initialize_thread_local_exit_callback 00000001800177c0 f   libucrt:exit.obj
- 0001:000167c8       _cexit                     00000001800177c8 f   libucrt:exit.obj
- 0001:000167d8       _exit                      00000001800177d8 f   libucrt:exit.obj
- 0001:000167e4       _is_c_termination_complete 00000001800177e4 f   libucrt:exit.obj
- 0001:000169a8       __acrt_allocate_buffer_for_argv 00000001800179a8 f   libucrt:argv_parsing.obj
- 0001:00016a0c       _configure_narrow_argv     0000000180017a0c f   libucrt:argv_parsing.obj
- 0001:00016d68       __dcrt_uninitialize_environments_nolock 0000000180017d68 f   libucrt:environment_initialization.obj
- 0001:00016da0       _initialize_narrow_environment 0000000180017da0 f   libucrt:environment_initialization.obj
- 0001:00016da8       ??$?RV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@V<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@$$QEAV<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@Z 0000000180017da8 f i libucrt:onexit.obj
- 0001:00016de4       ??$?RV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@V<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@$$QEAV<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@Z 0000000180017de4 f i libucrt:onexit.obj
- 0001:00017160       _crt_atexit                0000000180018160 f   libucrt:onexit.obj
- 0001:00017170       _execute_onexit_table      0000000180018170 f   libucrt:onexit.obj
- 0001:000171ac       _initialize_onexit_table   00000001800181ac f   libucrt:onexit.obj
- 0001:000171ec       _register_onexit_function  00000001800181ec f   libucrt:onexit.obj
- 0001:0001727c       __acrt_uninitialize_command_line 000000018001827c f   libucrt:argv_data.obj
- 0001:0001736c       __acrt_initialize          000000018001836c f   libucrt:initialization.obj
- 0001:00017380       __acrt_thread_attach       0000000180018380 f   libucrt:initialization.obj
- 0001:00017394       __acrt_thread_detach       0000000180018394 f   libucrt:initialization.obj
- 0001:000173a4       __acrt_uninitialize        00000001800183a4 f   libucrt:initialization.obj
- 0001:000173b8       __acrt_uninitialize_critical 00000001800183b8 f   libucrt:initialization.obj
- 0001:000173c8       _initterm                  00000001800183c8 f   libucrt:initterm.obj
- 0001:00017440       _initterm_e                0000000180018440 f   libucrt:initterm.obj
- 0001:0001748c       terminate                  000000018001848c f   libucrt:terminate.obj
- 0001:000174b4       strcpy_s                   00000001800184b4 f   libucrt:strcpy_s.obj
- 0001:00017514       ??$is_overflow_condition@K@__crt_strtox@@YA_NIK@Z 0000000180018514 f i libucrt:atox.obj
- 0001:00017540       ??$parse_integer@KV?$c_string_character_source@D@__crt_strtox@@@__crt_strtox@@YAKQEAU__crt_locale_pointers@@V?$c_string_character_source@D@0@H_N@Z 0000000180018540 f i libucrt:atox.obj
- 0001:00017854       ??$parse_integer@KV?$c_string_character_source@_W@__crt_strtox@@@__crt_strtox@@YAKQEAU__crt_locale_pointers@@V?$c_string_character_source@_W@0@H_N@Z 0000000180018854 f i libucrt:atox.obj
- 0001:00017f28       _wtol                      0000000180018f28 f   libucrt:atox.obj
- 0001:00017f54       ??$?RV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@V<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@$$QEAV<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@Z 0000000180018f54 f i libucrt:per_thread_data.obj
- 0001:00017fb4       ??$?RV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@V<lambda_341c25c0346d94847f1f3c463c57e077>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@$$QEAV<lambda_341c25c0346d94847f1f3c463c57e077>@@@Z 0000000180018fb4 f i libucrt:per_thread_data.obj
- 0001:00017ffc       ??$?RV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@V<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@$$QEAV<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@Z 0000000180018ffc f i libucrt:per_thread_data.obj
- 0001:0001803c       ??$?RV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@V<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@$$QEAV<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@Z 000000018001903c f i libucrt:per_thread_data.obj
- 0001:000182cc       __acrt_freeptd             00000001800192cc f   libucrt:per_thread_data.obj
- 0001:00018310       __acrt_getptd              0000000180019310 f   libucrt:per_thread_data.obj
- 0001:000183a4       __acrt_getptd_noexit       00000001800193a4 f   libucrt:per_thread_data.obj
- 0001:00018444       __acrt_initialize_ptd      0000000180019444 f   libucrt:per_thread_data.obj
- 0001:00018480       __acrt_uninitialize_ptd    0000000180019480 f   libucrt:per_thread_data.obj
- 0001:000184a4       ??$?RV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@V<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@?$__crt_seh_guarded_call@P6AXH@Z@@QEAAP6AXH@Z$$QEAV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@$$QEAV<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@Z 00000001800194a4 f i libucrt:signal.obj
- 0001:000184ec       __acrt_get_sigabrt_handler 00000001800194ec f   libucrt:signal.obj
- 0001:0001851c       __acrt_initialize_signal_handlers 000000018001951c f   libucrt:signal.obj
- 0001:0001853c       raise                      000000018001953c f   libucrt:signal.obj
- 0001:000187d8       strtol                     00000001800197d8 f   libucrt:strtox.obj
- 0001:00018808       _mbtowc_l                  0000000180019808 f   libucrt:mbtowc.obj
- 0001:00018950       mbtowc                     0000000180019950 f   libucrt:mbtowc.obj
- 0001:00018958       _wctomb_s_l                0000000180019958 f   libucrt:wctomb.obj
- 0001:00018adc       wctomb_s                   0000000180019adc f   libucrt:wctomb.obj
- 0001:00018af0       __acrt_update_locale_info  0000000180019af0 f   libucrt:locale_update.obj
- 0001:00018b24       __acrt_update_multibyte_info 0000000180019b24 f   libucrt:locale_update.obj
- 0001:00018b58       ?__acrt_fp_classify@@YA?AW4__acrt_fp_class@@AEBN@Z 0000000180019b58 f i libucrt:cvt.obj
- 0001:00019590       __acrt_fp_format           000000018001a590 f   libucrt:cvt.obj
- 0001:000197d4       _fileno                    000000018001a7d4 f   libucrt:fileno.obj
- 0001:000197fc       __acrt_initialize_stdio    000000018001a7fc f   libucrt:_file.obj
- 0001:0001991c       __acrt_uninitialize_stdio  000000018001a91c f   libucrt:_file.obj
- 0001:00019978       _lock_file                 000000018001a978 f   libucrt:_file.obj
- 0001:00019984       _unlock_file               000000018001a984 f   libucrt:_file.obj
- 0001:00019990       _get_printf_count_output   000000018001a990 f   libucrt:printf_count_output.obj
- 0001:000199a8       ??$?RV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@Z 000000018001a9a8 f i libucrt:wsetlocale.obj
- 0001:000199d4       ??$?RV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@V<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@$$QEAV<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@Z 000000018001a9d4 f i libucrt:wsetlocale.obj
- 0001:00019ba0       __acrt_copy_locale_name    000000018001aba0 f   libucrt:wsetlocale.obj
- 0001:00019c24       __acrt_set_locale_changed  000000018001ac24 f   libucrt:wsetlocale.obj
- 0001:00019c30       __acrt_uninitialize_locale 000000018001ac30 f   libucrt:wsetlocale.obj
- 0001:00019c78       __lc_lctowcs               000000018001ac78 f   libucrt:wsetlocale.obj
- 0001:00019d1c       __lc_wcstolc               000000018001ad1c f   libucrt:wsetlocale.obj
- 0001:00019f94       _expandlocale              000000018001af94 f   libucrt:wsetlocale.obj
- 0001:0001a390       _wcscats                   000000018001b390 f   libucrt:wsetlocale.obj
- 0001:0001a3f8       _wsetlocale                000000018001b3f8 f   libucrt:wsetlocale.obj
- 0001:0001ae2c       __acrt_initialize_lowio    000000018001be2c f   libucrt:ioinit.obj
- 0001:0001ae68       __acrt_uninitialize_lowio  000000018001be68 f   libucrt:ioinit.obj
- 0001:0001aea8       _dsign                     000000018001bea8 f   libucrt:nan.obj
- 0001:0001aec0       _errcode                   000000018001bec0 f   libucrt:fpexcept.obj
- 0001:0001af04       _except1                   000000018001bf04 f   libucrt:fpexcept.obj
- 0001:0001aff8       _handle_exc                000000018001bff8 f   libucrt:fpexcept.obj
- 0001:0001b260       _raise_exc                 000000018001c260 f   libucrt:fpexcept.obj
- 0001:0001b288       _raise_exc_ex              000000018001c288 f   libucrt:fpexcept.obj
- 0001:0001b590       _raise_excf                000000018001c590 f   libucrt:fpexcept.obj
- 0001:0001b5bc       _set_errno_from_matherr    000000018001c5bc f   libucrt:fpexcept.obj
- 0001:0001b5ec       _umatherr                  000000018001c5ec f   libucrt:fpexcept.obj
- 0001:0001b6c0       _decomp                    000000018001c6c0 f   libucrt:util.obj
- 0001:0001b7f4       _sptype                    000000018001c7f4 f   libucrt:util.obj
- 0001:0001b868       _clrfp                     000000018001c868 f   libucrt:fpctrl.obj
- 0001:0001b888       _ctrlfp                    000000018001c888 f   libucrt:fpctrl.obj
- 0001:0001b904       _set_statfp                000000018001c904 f   libucrt:fpctrl.obj
- 0001:0001b924       _statfp                    000000018001c924 f   libucrt:fpctrl.obj
- 0001:0001b97c       ??$?RV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@V<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@$$QEAV<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@Z 000000018001c97c f i libucrt:winapi_thunks.obj
- 0001:0001bbb4       __acrt_EnumSystemLocalesEx 000000018001cbb4 f   libucrt:winapi_thunks.obj
- 0001:0001bc5c       __acrt_FlsAlloc            000000018001cc5c f   libucrt:winapi_thunks.obj
- 0001:0001bcb4       __acrt_FlsFree             000000018001ccb4 f   libucrt:winapi_thunks.obj
- 0001:0001bd0c       __acrt_FlsGetValue         000000018001cd0c f   libucrt:winapi_thunks.obj
- 0001:0001bd64       __acrt_FlsSetValue         000000018001cd64 f   libucrt:winapi_thunks.obj
- 0001:0001bdcc       __acrt_GetLocaleInfoEx     000000018001cdcc f   libucrt:winapi_thunks.obj
- 0001:0001be64       __acrt_GetUserDefaultLocaleName 000000018001ce64 f   libucrt:winapi_thunks.obj
- 0001:0001bed8       __acrt_InitializeCriticalSectionEx 000000018001ced8 f   libucrt:winapi_thunks.obj
- 0001:0001bf50       __acrt_IsValidLocaleName   000000018001cf50 f   libucrt:winapi_thunks.obj
- 0001:0001bfb8       __acrt_LCIDToLocaleName    000000018001cfb8 f   libucrt:winapi_thunks.obj
- 0001:0001c044       __acrt_LCMapStringEx       000000018001d044 f   libucrt:winapi_thunks.obj
- 0001:0001c134       __acrt_LocaleNameToLCID    000000018001d134 f   libucrt:winapi_thunks.obj
- 0001:0001c19c       __acrt_can_use_vista_locale_apis 000000018001d19c f   libucrt:winapi_thunks.obj
- 0001:0001c1cc       __acrt_initialize_winapi_thunks 000000018001d1cc f   libucrt:winapi_thunks.obj
- 0001:0001c204       __acrt_is_packaged_app     000000018001d204 f   libucrt:winapi_thunks.obj
- 0001:0001c28c       __acrt_uninitialize_winapi_thunks 000000018001d28c f   libucrt:winapi_thunks.obj
- 0001:0001c4ac       _mbstowcs_s_l              000000018001d4ac f   libucrt:mbstowcs.obj
- 0001:0001c5dc       mbstowcs_s                 000000018001d5dc f   libucrt:mbstowcs.obj
- 0001:0001c930       _wcstombs_s_l              000000018001d930 f   libucrt:wcstombs.obj
- 0001:0001ca1c       _query_new_mode            000000018001da1c f   libucrt:new_mode.obj
- 0001:0001ca24       __acrt_initialize_heap     000000018001da24 f   libucrt:heap_handle.obj
- 0001:0001ca40       __acrt_uninitialize_heap   000000018001da40 f   libucrt:heap_handle.obj
- 0001:0001ca4c       _isctype_l                 000000018001da4c f   libucrt:isctype.obj
- 0001:0001ccfc       __acrt_GetLocaleInfoA      000000018001dcfc f   libucrt:getlocaleinfoa.obj
- 0001:0001cec4       __acrt_GetStringTypeA      000000018001dec4 f   libucrt:getstringtypea.obj
- 0001:0001d3d4       __acrt_LCMapStringA        000000018001e3d4 f   libucrt:lcmapstringa.obj
- 0001:0001d46c       iswctype                   000000018001e46c f   libucrt:iswctype.obj
- 0001:0001d4e0       __acrt_initialize_fma3     000000018001e4e0 f   libucrt:fma3_available.obj
- 0001:0001d550       _pow_special               000000018001e550 f   libucrt:pow_special.obj
- 0001:0001d674       _powf_special              000000018001e674 f   libucrt:pow_special.obj
- 0001:0001d800       _wcsicmp                   000000018001e800 f   libucrt:wcsicmp.obj
- 0001:0001d888       _wcsicmp_l                 000000018001e888 f   libucrt:wcsicmp.obj
- 0001:0001d978       __acrt_initialize_timeset  000000018001e978 f   libucrt:timeset.obj
- 0001:0001d9a8       _isleadbyte_l              000000018001e9a8 f i libucrt:_wctype.obj
- 0001:0001dec4       ?expand_if_necessary@?$argument_list@D@?A0xca0879c4@@AEAAHXZ 000000018001eec4 f i libucrt:argv_wildcards.obj
- 0001:0001df8c       __acrt_expand_narrow_argv_wildcards 000000018001ef8c f   libucrt:argv_wildcards.obj
- 0001:0001df94       ??$?RV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@V<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@$$QEAV<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@Z 000000018001ef94 f i libucrt:mbctype.obj
- 0001:0001e690       __acrt_initialize_multibyte 000000018001f690 f   libucrt:mbctype.obj
- 0001:0001e6b8       __acrt_update_thread_multibyte_data 000000018001f6b8 f   libucrt:mbctype.obj
- 0001:0001e778       _setmbcp_nolock            000000018001f778 f   libucrt:mbctype.obj
- 0001:0001ea20       __acrt_initialize_command_line 000000018001fa20 f   libucrt:argv_data.obj
- 0001:0001ea48       __dcrt_get_narrow_environment_from_os 000000018001fa48 f   libucrt:get_environment_from_os.obj
- 0001:0001eb4c       _recalloc                  000000018001fb4c f   libucrt:recalloc.obj
- 0001:0001eb54       _recalloc_base             000000018001fb54 f   libucrt:recalloc.obj
- 0001:0001ebec       __acrt_execute_initializers 000000018001fbec f   libucrt:shared_initialization.obj
- 0001:0001ec80       __acrt_execute_uninitializers 000000018001fc80 f   libucrt:shared_initialization.obj
- 0001:0001ecd0       __acrt_has_user_matherr    000000018001fcd0 f   libucrt:matherr.obj
- 0001:0001ecf0       __acrt_initialize_user_matherr 000000018001fcf0 f   libucrt:matherr.obj
- 0001:0001ecf8       __acrt_invoke_user_matherr 000000018001fcf8 f   libucrt:matherr.obj
- 0001:0001ed40       __acrt_add_locale_ref      000000018001fd40 f   libucrt:locale_refcounting.obj
- 0001:0001edcc       __acrt_free_locale         000000018001fdcc f   libucrt:locale_refcounting.obj
- 0001:0001ef44       __acrt_locale_add_lc_time_reference 000000018001ff44 f   libucrt:locale_refcounting.obj
- 0001:0001ef6c       __acrt_locale_free_lc_time_if_unreferenced 000000018001ff6c f   libucrt:locale_refcounting.obj
- 0001:0001efa4       __acrt_locale_release_lc_time_reference 000000018001ffa4 f   libucrt:locale_refcounting.obj
- 0001:0001efcc       __acrt_release_locale_ref  000000018001ffcc f   libucrt:locale_refcounting.obj
- 0001:0001f074       __acrt_update_thread_locale_data 0000000180020074 f   libucrt:locale_refcounting.obj
- 0001:0001f0e4       _updatetlocinfoEx_nolock   00000001800200e4 f   libucrt:locale_refcounting.obj
- 0001:0001f14c       __acrt_fp_strflt_to_string 000000018002014c f   libucrt:_fptostr.obj
- 0001:0001f20c       __acrt_fltout              000000018002020c f   libucrt:cfout.obj
- 0001:00020578       _fcloseall                 0000000180021578 f   libucrt:closeall.obj
- 0001:0002062c       __acrt_stdio_flush_nolock  000000018002162c f   libucrt:fflush.obj
- 0001:000206a4       _fflush_nolock             00000001800216a4 f   libucrt:fflush.obj
- 0001:000206f0       _flushall                  00000001800216f0 f   libucrt:fflush.obj
- 0001:000207e0       __acrt_stdio_free_buffer_nolock 00000001800217e0 f   libucrt:_freebuf.obj
- 0001:00020820       _isatty                    0000000180021820 f   libucrt:isatty.obj
- 0001:00020880       __acrt_locale_free_monetary 0000000180021880 f   libucrt:initmon.obj
- 0001:0002098c       __acrt_locale_initialize_monetary 000000018002198c f   libucrt:initmon.obj
- 0001:00020ec4       __acrt_locale_free_numeric 0000000180021ec4 f   libucrt:initnum.obj
- 0001:00020f30       __acrt_locale_initialize_numeric 0000000180021f30 f   libucrt:initnum.obj
- 0001:000215b4       __acrt_locale_free_time    00000001800225b4 f   libucrt:inittime.obj
- 0001:000216bc       __acrt_locale_initialize_time 00000001800226bc f   libucrt:inittime.obj
- 0001:00021750       wcscat_s                   0000000180022750 f   libucrt:wcscat_s.obj
- 0001:000217d0       wcsncpy_s                  00000001800227d0 f   libucrt:wcsncpy_s.obj
- 0001:000218b4       wcscspn                    00000001800228b4 f   libucrt:wcscspn.obj
- 0001:000218f4       wcsncmp                    00000001800228f4 f   libucrt:wcsncmp.obj
- 0001:00021920       wcspbrk                    0000000180022920 f   libucrt:wcspbrk.obj
- 0001:000221c4       __acrt_get_qualified_locale 00000001800231c4 f   libucrt:get_qualified_locale.obj
- 0001:00022bb0       __acrt_get_qualified_locale_downlevel 0000000180023bb0 f   libucrt:getqloc_downlevel.obj
- 0001:00022e40       __acrt_lowio_create_handle_array 0000000180023e40 f   libucrt:osfinfo.obj
- 0001:00022ed8       __acrt_lowio_destroy_handle_array 0000000180023ed8 f   libucrt:osfinfo.obj
- 0001:00022f28       __acrt_lowio_ensure_fh_exists 0000000180023f28 f   libucrt:osfinfo.obj
- 0001:00022fe0       __acrt_lowio_lock_fh       0000000180023fe0 f   libucrt:osfinfo.obj
- 0001:00023004       __acrt_lowio_unlock_fh     0000000180024004 f   libucrt:osfinfo.obj
- 0001:00023028       _free_osfhnd               0000000180024028 f   libucrt:osfinfo.obj
- 0001:000230e4       _get_osfhandle             00000001800240e4 f   libucrt:osfinfo.obj
- 0001:00023170       _get_fpsr                  0000000180024170 f   libucrt:fpsr.obj
- 0001:00023180       _set_fpsr                  0000000180024180 f   libucrt:fpsr.obj
- 0001:0002318a       _fclrf                     000000018002418a f   libucrt:fpsr.obj
- 0001:0002319e       _frnd                      000000018002419e f   libucrt:fpsr.obj
- 0001:00023288       __acrt_DownlevelLCIDToLocaleName 0000000180024288 f   libucrt:lcidtoname_downlevel.obj
- 0001:0002336c       __acrt_DownlevelLocaleNameToLCID 000000018002436c f   libucrt:lcidtoname_downlevel.obj
- 0001:000233a0       strncpy_s                  00000001800243a0 f   libucrt:strncpy_s.obj
- 0001:00023474       _getfpcontrolword          0000000180024474 f   libucrt:_fenvutils.obj
- 0001:0002348c       _getfpstatusword           000000018002448c f   libucrt:_fenvutils.obj
- 0001:000234a0       _setfpcontrolword          00000001800244a0 f   libucrt:_fenvutils.obj
- 0001:000234ac       _setfpstatusword           00000001800244ac f   libucrt:_fenvutils.obj
- 0001:00023620       _handle_error              0000000180024620 f   libucrt:libm_error.obj
- 0001:00023748       _handle_errorf             0000000180024748 f   libucrt:libm_error.obj
- 0001:0002387c       _handle_nan                000000018002487c f   libucrt:libm_error.obj
- 0001:00023898       _handle_nanf               0000000180024898 f   libucrt:libm_error.obj
- 0001:000238a8       _towlower_l                00000001800248a8 f   libucrt:towlower.obj
- 0001:00023a40       qsort                      0000000180024a40 f   libucrt:qsort.obj
- 0001:00023d74       strpbrk                    0000000180024d74 f   libucrt:strpbrk.obj
- 0001:00023e14       _mbsdec                    0000000180024e14 f   libucrt:mbsdec.obj
- 0001:00023e1c       _mbsdec_l                  0000000180024e1c f   libucrt:mbsdec.obj
- 0001:00023ecc       _msize                     0000000180024ecc f   libucrt:msize.obj
- 0001:00023f08       fegetenv                   0000000180024f08 f   libucrt:fegetenv.obj
- 0001:00023f28       fesetenv                   0000000180024f28 f   libucrt:fesetenv.obj
- 0001:00023f74       feholdexcept               0000000180024f74 f   libucrt:feholdexcept.obj
- 0001:00023fc4       ceil                       0000000180024fc4 f   libucrt:ceil.obj
- 0001:00024090       log10                      0000000180025090 f   libucrt:log10.obj
- 0001:00024bdc       _write                     0000000180025bdc f   libucrt:write.obj
- 0001:00024cc8       _write_nolock              0000000180025cc8 f   libucrt:write.obj
- 0001:00025048       _lseeki64_nolock           0000000180026048 f   libucrt:lseek.obj
- 0001:00025050       _fclose_nolock             0000000180026050 f   libucrt:fclose.obj
- 0001:000250d4       fclose                     00000001800260d4 f   libucrt:fclose.obj
- 0001:00025140       ??$?RV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@V<lambda_314360699dd331753a4119843814e9a7>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@$$QEAV<lambda_314360699dd331753a4119843814e9a7>@@@Z 0000000180026140 f i libucrt:commit.obj
- 0001:000251cc       _commit                    00000001800261cc f   libucrt:commit.obj
- 0001:00025388       _itow_s                    0000000180026388 f   libucrt:xtoa.obj
- 0001:000253a8       _wcsnicmp                  00000001800263a8 f   libucrt:wcsnicmp.obj
- 0001:00025444       _wcsnicmp_l                0000000180026444 f   libucrt:wcsnicmp.obj
- 0001:0002555c       wcscmp                     000000018002655c f   libucrt:wcscmp.obj
- 0001:00025594       _query_app_type            0000000180026594 f   libucrt:report_runtime_error.obj
- 0001:0002559c       _clearfp                   000000018002659c f   libucrt:ieee.obj
- 0001:000255f0       _controlfp                 00000001800265f0 f   libucrt:ieee.obj
- 0001:000255fc       _statusfp                  00000001800265fc f   libucrt:ieee.obj
- 0001:000258dc       __acrt_LCMapStringW        00000001800268dc f   libucrt:lcmapstringw.obj
- 0001:00025970       _log10_special             0000000180026970 f   libucrt:log_special.obj
- 0001:00025a28       _putwch_nolock             0000000180026a28 f   libucrt:putwch.obj
- 0001:00025a84       ??$?RV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@V<lambda_237c231691f317818eb88cc1d5d642d6>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@$$QEAV<lambda_237c231691f317818eb88cc1d5d642d6>@@@Z 0000000180026a84 f i libucrt:close.obj
- 0001:00025af8       _close                     0000000180026af8 f   libucrt:close.obj
- 0001:00025b9c       _close_nolock              0000000180026b9c f   libucrt:close.obj
- 0001:00025c58       ?__acrt_stdio_free_stream@@YAXV__crt_stdio_stream@@@Z 0000000180026c58 f   libucrt:stream.obj
- 0001:00025c9c       __dcrt_lowio_initialize_console_output 0000000180026c9c f   libucrt:initcon.obj
- 0001:00025cd8       __dcrt_terminate_console_output 0000000180026cd8 f   libucrt:initcon.obj
- 0001:00025cf8       IsProcessorFeaturePresent  0000000180026cf8 f   kernel32:KERNEL32.dll
- 0001:00025cfe       RtlUnwindEx                0000000180026cfe f   kernel32:KERNEL32.dll
- 0001:00025d04       ?DloadAcquireSectionWriteAccess@@YAXXZ 0000000180026d04 f i DelayImp:delayhlp.obj
- 0001:00025dc0       ?DloadGetSRWLockFunctionPointers@@YAEXZ 0000000180026dc0 f i DelayImp:delayhlp.obj
- 0001:00025e5c       ?DloadMakePermanentImageCommit@@YAXPEAX_K@Z 0000000180026e5c f i DelayImp:delayhlp.obj
- 0001:00025ef4       ?DloadObtainSection@@YAPEAXPEAK0@Z 0000000180026ef4 f i DelayImp:delayhlp.obj
- 0001:00025f8c       ?DloadProtectSection@@YAXKPEAK@Z 0000000180026f8c f i DelayImp:delayhlp.obj
- 0001:0002601c       ?DloadReleaseSectionWriteAccess@@YAXXZ 000000018002701c f i DelayImp:delayhlp.obj
- 0001:000260c0       __delayLoadHelper2         00000001800270c0 f   DelayImp:delayhlp.obj
- 0001:000263c0       _FindPESection             00000001800273c0 f   LIBCMT:pesect.obj
- 0001:00026410       _IsNonwritableInCurrentImage 0000000180027410 f   LIBCMT:pesect.obj
- 0001:00026460       _ValidateImageBase         0000000180027460 f   LIBCMT:pesect.obj
- 0001:00026490       strrchr                    0000000180027490 f   libvcruntime:strrchr.obj
- 0001:000265d0       wcschr                     00000001800275d0 f   libvcruntime:wcschr.obj
- 0001:00026680       _guard_dispatch_icall_nop  0000000180027680 f   LIBCMT:_guard_dispatch_.obj
- 0001:00026c30       ??__F_Static@?1???$_Immortalize@V_Iostream_error_category@std@@@std@@YAAEAV_Iostream_error_category@0@XZ@YAXXZ 0000000180027c30 f i node_printer_win.obj
- 0002:00000000       __imp_GetLastError         0000000180028000     kernel32:KERNEL32.dll
- 0002:00000008       __imp_LocalFree            0000000180028008     kernel32:KERNEL32.dll
- 0002:00000010       __imp_FormatMessageA       0000000180028010     kernel32:KERNEL32.dll
- 0002:00000018       __imp_GetModuleHandleA     0000000180028018     kernel32:KERNEL32.dll
- 0002:00000020       __imp_VirtualQuery         0000000180028020     kernel32:KERNEL32.dll
- 0002:00000028       __imp_VirtualProtect       0000000180028028     kernel32:KERNEL32.dll
- 0002:00000030       __imp_GetSystemInfo        0000000180028030     kernel32:KERNEL32.dll
- 0002:00000038       __imp_CreateFileW          0000000180028038     kernel32:KERNEL32.dll
- 0002:00000040       __imp_WriteConsoleW        0000000180028040     kernel32:KERNEL32.dll
- 0002:00000048       __imp_FlushFileBuffers     0000000180028048     kernel32:KERNEL32.dll
- 0002:00000050       __imp_SetFilePointerEx     0000000180028050     kernel32:KERNEL32.dll
- 0002:00000058       __imp_GetConsoleMode       0000000180028058     kernel32:KERNEL32.dll
- 0002:00000060       __imp_GetConsoleCP         0000000180028060     kernel32:KERNEL32.dll
- 0002:00000068       __imp_WriteFile            0000000180028068     kernel32:KERNEL32.dll
- 0002:00000070       __imp_HeapSize             0000000180028070     kernel32:KERNEL32.dll
- 0002:00000078       __imp_SetStdHandle         0000000180028078     kernel32:KERNEL32.dll
- 0002:00000080       __imp_WideCharToMultiByte  0000000180028080     kernel32:KERNEL32.dll
- 0002:00000088       __imp_EnterCriticalSection 0000000180028088     kernel32:KERNEL32.dll
- 0002:00000090       __imp_LeaveCriticalSection 0000000180028090     kernel32:KERNEL32.dll
- 0002:00000098       __imp_DeleteCriticalSection 0000000180028098     kernel32:KERNEL32.dll
- 0002:000000a0       __imp_EncodePointer        00000001800280a0     kernel32:KERNEL32.dll
- 0002:000000a8       __imp_DecodePointer        00000001800280a8     kernel32:KERNEL32.dll
- 0002:000000b0       __imp_MultiByteToWideChar  00000001800280b0     kernel32:KERNEL32.dll
- 0002:000000b8       __imp_SetLastError         00000001800280b8     kernel32:KERNEL32.dll
- 0002:000000c0       __imp_InitializeCriticalSectionAndSpinCount 00000001800280c0     kernel32:KERNEL32.dll
- 0002:000000c8       __imp_CreateEventW         00000001800280c8     kernel32:KERNEL32.dll
- 0002:000000d0       __imp_TlsAlloc             00000001800280d0     kernel32:KERNEL32.dll
- 0002:000000d8       __imp_TlsGetValue          00000001800280d8     kernel32:KERNEL32.dll
- 0002:000000e0       __imp_TlsSetValue          00000001800280e0     kernel32:KERNEL32.dll
- 0002:000000e8       __imp_TlsFree              00000001800280e8     kernel32:KERNEL32.dll
- 0002:000000f0       __imp_GetSystemTimeAsFileTime 00000001800280f0     kernel32:KERNEL32.dll
- 0002:000000f8       __imp_GetModuleHandleW     00000001800280f8     kernel32:KERNEL32.dll
- 0002:00000100       __imp_GetProcAddress       0000000180028100     kernel32:KERNEL32.dll
- 0002:00000108       __imp_LCMapStringW         0000000180028108     kernel32:KERNEL32.dll
- 0002:00000110       __imp_GetLocaleInfoW       0000000180028110     kernel32:KERNEL32.dll
- 0002:00000118       __imp_GetStringTypeW       0000000180028118     kernel32:KERNEL32.dll
- 0002:00000120       __imp_GetCPInfo            0000000180028120     kernel32:KERNEL32.dll
- 0002:00000128       __imp_CloseHandle          0000000180028128     kernel32:KERNEL32.dll
- 0002:00000130       __imp_SetEvent             0000000180028130     kernel32:KERNEL32.dll
- 0002:00000138       __imp_ResetEvent           0000000180028138     kernel32:KERNEL32.dll
- 0002:00000140       __imp_WaitForSingleObjectEx 0000000180028140     kernel32:KERNEL32.dll
- 0002:00000148       __imp_RtlCaptureContext    0000000180028148     kernel32:KERNEL32.dll
- 0002:00000150       __imp_RtlLookupFunctionEntry 0000000180028150     kernel32:KERNEL32.dll
- 0002:00000158       __imp_RtlVirtualUnwind     0000000180028158     kernel32:KERNEL32.dll
- 0002:00000160       __imp_UnhandledExceptionFilter 0000000180028160     kernel32:KERNEL32.dll
- 0002:00000168       __imp_SetUnhandledExceptionFilter 0000000180028168     kernel32:KERNEL32.dll
- 0002:00000170       __imp_GetCurrentProcess    0000000180028170     kernel32:KERNEL32.dll
- 0002:00000178       __imp_TerminateProcess     0000000180028178     kernel32:KERNEL32.dll
- 0002:00000180       __imp_IsProcessorFeaturePresent 0000000180028180     kernel32:KERNEL32.dll
- 0002:00000188       __imp_IsDebuggerPresent    0000000180028188     kernel32:KERNEL32.dll
- 0002:00000190       __imp_GetStartupInfoW      0000000180028190     kernel32:KERNEL32.dll
- 0002:00000198       __imp_QueryPerformanceCounter 0000000180028198     kernel32:KERNEL32.dll
- 0002:000001a0       __imp_GetCurrentProcessId  00000001800281a0     kernel32:KERNEL32.dll
- 0002:000001a8       __imp_GetCurrentThreadId   00000001800281a8     kernel32:KERNEL32.dll
- 0002:000001b0       __imp_InitializeSListHead  00000001800281b0     kernel32:KERNEL32.dll
- 0002:000001b8       __imp_RtlPcToFileHeader    00000001800281b8     kernel32:KERNEL32.dll
- 0002:000001c0       __imp_RaiseException       00000001800281c0     kernel32:KERNEL32.dll
- 0002:000001c8       __imp_RtlUnwindEx          00000001800281c8     kernel32:KERNEL32.dll
- 0002:000001d0       __imp_FreeLibrary          00000001800281d0     kernel32:KERNEL32.dll
- 0002:000001d8       __imp_LoadLibraryExW       00000001800281d8     kernel32:KERNEL32.dll
- 0002:000001e0       __imp_InterlockedFlushSList 00000001800281e0     kernel32:KERNEL32.dll
- 0002:000001e8       __imp_HeapAlloc            00000001800281e8     kernel32:KERNEL32.dll
- 0002:000001f0       __imp_HeapReAlloc          00000001800281f0     kernel32:KERNEL32.dll
- 0002:000001f8       __imp_HeapFree             00000001800281f8     kernel32:KERNEL32.dll
- 0002:00000200       __imp_ExitProcess          0000000180028200     kernel32:KERNEL32.dll
- 0002:00000208       __imp_GetModuleHandleExW   0000000180028208     kernel32:KERNEL32.dll
- 0002:00000210       __imp_GetModuleFileNameA   0000000180028210     kernel32:KERNEL32.dll
- 0002:00000218       __imp_GetACP               0000000180028218     kernel32:KERNEL32.dll
- 0002:00000220       __imp_GetStdHandle         0000000180028220     kernel32:KERNEL32.dll
- 0002:00000228       __imp_GetFileType          0000000180028228     kernel32:KERNEL32.dll
- 0002:00000230       __imp_IsValidLocale        0000000180028230     kernel32:KERNEL32.dll
- 0002:00000238       __imp_GetUserDefaultLCID   0000000180028238     kernel32:KERNEL32.dll
- 0002:00000240       __imp_EnumSystemLocalesW   0000000180028240     kernel32:KERNEL32.dll
- 0002:00000248       __imp_GetProcessHeap       0000000180028248     kernel32:KERNEL32.dll
- 0002:00000250       __imp_FindClose            0000000180028250     kernel32:KERNEL32.dll
- 0002:00000258       __imp_FindFirstFileExA     0000000180028258     kernel32:KERNEL32.dll
- 0002:00000260       __imp_FindNextFileA        0000000180028260     kernel32:KERNEL32.dll
- 0002:00000268       __imp_IsValidCodePage      0000000180028268     kernel32:KERNEL32.dll
- 0002:00000270       __imp_GetOEMCP             0000000180028270     kernel32:KERNEL32.dll
- 0002:00000278       __imp_GetCommandLineA      0000000180028278     kernel32:KERNEL32.dll
- 0002:00000280       __imp_GetCommandLineW      0000000180028280     kernel32:KERNEL32.dll
- 0002:00000288       __imp_GetEnvironmentStringsW 0000000180028288     kernel32:KERNEL32.dll
- 0002:00000290       __imp_FreeEnvironmentStringsW 0000000180028290     kernel32:KERNEL32.dll
- 0002:00000298       __imp_LoadLibraryExA       0000000180028298     kernel32:KERNEL32.dll
- 0002:000002a0       \177KERNEL32_NULL_THUNK_DATA 00000001800282a0     kernel32:KERNEL32.dll
- 0002:000002a8       __imp_OpenPrinterW         00000001800282a8     winspool:WINSPOOL.DRV
- 0002:000002b0       __imp_GetPrinterW          00000001800282b0     winspool:WINSPOOL.DRV
- 0002:000002b8       __imp_StartDocPrinterW     00000001800282b8     winspool:WINSPOOL.DRV
- 0002:000002c0       __imp_GetJobW              00000001800282c0     winspool:WINSPOOL.DRV
- 0002:000002c8       __imp_EndPagePrinter       00000001800282c8     winspool:WINSPOOL.DRV
- 0002:000002d0       __imp_EnumPrintProcessorDatatypesW 00000001800282d0     winspool:WINSPOOL.DRV
- 0002:000002d8       __imp_EndDocPrinter        00000001800282d8     winspool:WINSPOOL.DRV
- 0002:000002e0       __imp_SetJobW              00000001800282e0     winspool:WINSPOOL.DRV
- 0002:000002e8       __imp_GetDefaultPrinterW   00000001800282e8     winspool:WINSPOOL.DRV
- 0002:000002f0       __imp_EnumJobsW            00000001800282f0     winspool:WINSPOOL.DRV
- 0002:000002f8       __imp_StartPagePrinter     00000001800282f8     winspool:WINSPOOL.DRV
- 0002:00000300       __imp_EnumPrintProcessorsW 0000000180028300     winspool:WINSPOOL.DRV
- 0002:00000308       __imp_ClosePrinter         0000000180028308     winspool:WINSPOOL.DRV
- 0002:00000310       __imp_WritePrinter         0000000180028310     winspool:WINSPOOL.DRV
- 0002:00000318       __imp_EnumPrintersW        0000000180028318     winspool:WINSPOOL.DRV
- 0002:00000320       \177WINSPOOL_NULL_THUNK_DATA 0000000180028320     winspool:WINSPOOL.DRV
- 0002:00000328       __guard_check_icall_fptr   0000000180028328     LIBCMT:guard_support.obj
- 0002:00000330       __guard_dispatch_icall_fptr 0000000180028330     LIBCMT:guard_support.obj
- 0002:00000338       __xc_a                     0000000180028338     LIBCMT:initializers.obj
- 0002:00000368       _register_node_printer_    0000000180028368     node_printer.obj
- 0002:00000370       __xc_z                     0000000180028370     LIBCMT:initializers.obj
- 0002:00000378       __xi_a                     0000000180028378     LIBCMT:initializers.obj
- 0002:00000390       __acrt_stdio_initializer   0000000180028390     libucrt:stdio_initializer.obj
- 0002:00000398       __acrt_tran_fma3_initializer 0000000180028398     libucrt:fma3_initializer.obj
- 0002:000003a0       __acrt_timeset_initializer 00000001800283a0     libucrt:timeset_initializer.obj
- 0002:000003a8       __acrt_multibyte_initializer 00000001800283a8     libucrt:multibyte_initializer.obj
- 0002:000003b0       __xi_z                     00000001800283b0     LIBCMT:initializers.obj
- 0002:000003b8       __xl_a                     00000001800283b8     LIBCMT:tlssup.obj
- 0002:000003c0       __xl_z                     00000001800283c0     LIBCMT:tlssup.obj
- 0002:000003c8       __xp_a                     00000001800283c8     LIBCMT:initializers.obj
- 0002:000003d0       __acrt_locale_terminator   00000001800283d0     libucrt:locale_initializer.obj
- 0002:000003d8       __dcrt_console_output_terminator 00000001800283d8     libucrt:console_output_initializer.obj
- 0002:000003e0       __acrt_stdio_terminator    00000001800283e0     libucrt:stdio_initializer.obj
- 0002:000003e8       __xp_z                     00000001800283e8     LIBCMT:initializers.obj
- 0002:000003f0       __xt_a                     00000001800283f0     LIBCMT:initializers.obj
- 0002:000003f8       __xt_z                     00000001800283f8     LIBCMT:initializers.obj
- 0002:00000400       __sz_node_exe              0000000180028400     node:node.exe
- 0002:00000418       ??_7exception@std@@6B@     0000000180028418     libcpmt:xthrow.obj
- 0002:00000428       ??_C@_0BC@EOODALEL@Unknown?5exception?$AA@ 0000000180028428     libcpmt:xthrow.obj
- 0002:00000448       ??_7bad_alloc@std@@6B@     0000000180028448     libcpmt:xthrow.obj
- 0002:00000458       ??_C@_0P@GHFPNOJB@bad?5allocation?$AA@ 0000000180028458     libcpmt:xthrow.obj
- 0002:00000470       ??_7logic_error@std@@6B@   0000000180028470     libcpmt:xthrow.obj
- 0002:00000488       ??_7length_error@std@@6B@  0000000180028488     libcpmt:xthrow.obj
- 0002:000004a0       ??_7out_of_range@std@@6B@  00000001800284a0     libcpmt:xthrow.obj
- 0002:000004b8       ??_7runtime_error@std@@6B@ 00000001800284b8     libcpmt:xthrow.obj
- 0002:00000598       ??_7_Facet_base@std@@6B@   0000000180028598     libcpmt:locale0.obj
- 0002:000005b8       ??_7_Locimp@locale@std@@6B@ 00000001800285b8     libcpmt:locale0.obj
- 0002:000005d0       ??_C@_01NBENCBCI@?$CK?$AA@ 00000001800285d0     libcpmt:locale0.obj
- 0002:000005d4       ??_C@_01GFHCPBMG@C?$AA@    00000001800285d4     libcpmt:locale0.obj
- 0002:000005d8       ?_BADOFF@std@@3_JB         00000001800285d8     libcpmt:ios.obj
- 0002:00000d10       ??_C@_0BN@LKKBCCDB@address?5family?5not?5supported?$AA@ 0000000180028d10     libcpmt:syserror.obj
- 0002:00000d30       ??_C@_0P@LDMLAFHI@address?5in?5use?$AA@ 0000000180028d30     libcpmt:syserror.obj
- 0002:00000d40       ??_C@_0BG@DHPCNBJB@address?5not?5available?$AA@ 0000000180028d40     libcpmt:syserror.obj
- 0002:00000d58       ??_C@_0BC@DFIBIBIL@already?5connected?$AA@ 0000000180028d58     libcpmt:syserror.obj
- 0002:00000d70       ??_C@_0BH@CAKOHOMI@argument?5list?5too?5long?$AA@ 0000000180028d70     libcpmt:syserror.obj
- 0002:00000d88       ??_C@_0BH@CGIMPKIM@argument?5out?5of?5domain?$AA@ 0000000180028d88     libcpmt:syserror.obj
- 0002:00000da0       ??_C@_0M@KGHGGJGL@bad?5address?$AA@ 0000000180028da0     libcpmt:syserror.obj
- 0002:00000db0       ??_C@_0BE@MPJPGCEO@bad?5file?5descriptor?$AA@ 0000000180028db0     libcpmt:syserror.obj
- 0002:00000dc8       ??_C@_0M@PMMIEFCP@bad?5message?$AA@ 0000000180028dc8     libcpmt:syserror.obj
- 0002:00000dd8       ??_C@_0M@KPHOFDBE@broken?5pipe?$AA@ 0000000180028dd8     libcpmt:syserror.obj
- 0002:00000de8       ??_C@_0BD@MGNDDEGM@connection?5aborted?$AA@ 0000000180028de8     libcpmt:syserror.obj
- 0002:00000e00       ??_C@_0BP@KAIHPOGN@connection?5already?5in?5progress?$AA@ 0000000180028e00     libcpmt:syserror.obj
- 0002:00000e20       ??_C@_0BD@PJLIIJEL@connection?5refused?$AA@ 0000000180028e20     libcpmt:syserror.obj
- 0002:00000e38       ??_C@_0BB@IECNJNOI@connection?5reset?$AA@ 0000000180028e38     libcpmt:syserror.obj
- 0002:00000e50       ??_C@_0BC@PPHBOELF@cross?5device?5link?$AA@ 0000000180028e50     libcpmt:syserror.obj
- 0002:00000e68       ??_C@_0BN@KDMIFEIP@destination?5address?5required?$AA@ 0000000180028e68     libcpmt:syserror.obj
- 0002:00000e88       ??_C@_0BI@NGCEHDD@device?5or?5resource?5busy?$AA@ 0000000180028e88     libcpmt:syserror.obj
- 0002:00000ea0       ??_C@_0BE@JIDOCPHM@directory?5not?5empty?$AA@ 0000000180028ea0     libcpmt:syserror.obj
- 0002:00000eb8       ??_C@_0BI@BNCLIGPB@executable?5format?5error?$AA@ 0000000180028eb8     libcpmt:syserror.obj
- 0002:00000ed0       ??_C@_0M@MIDIAGJP@file?5exists?$AA@ 0000000180028ed0     libcpmt:syserror.obj
- 0002:00000ee0       ??_C@_0P@DNAJLBJK@file?5too?5large?$AA@ 0000000180028ee0     libcpmt:syserror.obj
- 0002:00000ef0       ??_C@_0BC@EJHOMAAK@filename?5too?5long?$AA@ 0000000180028ef0     libcpmt:syserror.obj
- 0002:00000f08       ??_C@_0BH@KEFGLDAF@function?5not?5supported?$AA@ 0000000180028f08     libcpmt:syserror.obj
- 0002:00000f20       ??_C@_0BB@DHFDFGDM@host?5unreachable?$AA@ 0000000180028f20     libcpmt:syserror.obj
- 0002:00000f38       ??_C@_0BD@JPHBMONG@identifier?5removed?$AA@ 0000000180028f38     libcpmt:syserror.obj
- 0002:00000f50       ??_C@_0BG@CDNPAGJK@illegal?5byte?5sequence?$AA@ 0000000180028f50     libcpmt:syserror.obj
- 0002:00000f68       ??_C@_0CD@BNPLBMNA@inappropriate?5io?5control?5operati@ 0000000180028f68     libcpmt:syserror.obj
- 0002:00000f90       ??_C@_0M@EGEKIIMP@interrupted?$AA@ 0000000180028f90     libcpmt:syserror.obj
- 0002:00000fa0       ??_C@_0BB@FCMFBGOM@invalid?5argument?$AA@ 0000000180028fa0     libcpmt:syserror.obj
- 0002:00000fb8       ??_C@_0N@OHAFKDEK@invalid?5seek?$AA@ 0000000180028fb8     libcpmt:syserror.obj
- 0002:00000fc8       ??_C@_08GLNPIFBN@io?5error?$AA@ 0000000180028fc8     libcpmt:syserror.obj
- 0002:00000fd8       ??_C@_0P@FLLDBIDK@is?5a?5directory?$AA@ 0000000180028fd8     libcpmt:syserror.obj
- 0002:00000fe8       ??_C@_0N@IFLPBIOP@message?5size?$AA@ 0000000180028fe8     libcpmt:syserror.obj
- 0002:00000ff8       ??_C@_0N@KIIEAAIO@network?5down?$AA@ 0000000180028ff8     libcpmt:syserror.obj
- 0002:00001008       ??_C@_0O@FNPDBHEE@network?5reset?$AA@ 0000000180029008     libcpmt:syserror.obj
- 0002:00001018       ??_C@_0BE@IFNCKGE@network?5unreachable?$AA@ 0000000180029018     libcpmt:syserror.obj
- 0002:00001030       ??_C@_0BA@PFFCAOFK@no?5buffer?5space?$AA@ 0000000180029030     libcpmt:syserror.obj
- 0002:00001040       ??_C@_0BB@IEPBLJHK@no?5child?5process?$AA@ 0000000180029040     libcpmt:syserror.obj
- 0002:00001058       ??_C@_07PLECNNKG@no?5link?$AA@ 0000000180029058     libcpmt:syserror.obj
- 0002:00001060       ??_C@_0BC@NJECKMKE@no?5lock?5available?$AA@ 0000000180029060     libcpmt:syserror.obj
- 0002:00001078       ??_C@_0BF@PBGGPKKE@no?5message?5available?$AA@ 0000000180029078     libcpmt:syserror.obj
- 0002:00001090       ??_C@_0L@EDOLMPAK@no?5message?$AA@ 0000000180029090     libcpmt:syserror.obj
- 0002:000010a0       ??_C@_0BD@EAMBFIDF@no?5protocol?5option?$AA@ 00000001800290a0     libcpmt:syserror.obj
- 0002:000010b8       ??_C@_0BD@IJDJKDEA@no?5space?5on?5device?$AA@ 00000001800290b8     libcpmt:syserror.obj
- 0002:000010d0       ??_C@_0BE@MKFDAFMP@no?5stream?5resources?$AA@ 00000001800290d0     libcpmt:syserror.obj
- 0002:000010e8       ??_C@_0BK@IMCPHCBI@no?5such?5device?5or?5address?$AA@ 00000001800290e8     libcpmt:syserror.obj
- 0002:00001108       ??_C@_0P@FDINDDOK@no?5such?5device?$AA@ 0000000180029108     libcpmt:syserror.obj
- 0002:00001118       ??_C@_0BK@NDOCBPGE@no?5such?5file?5or?5directory?$AA@ 0000000180029118     libcpmt:syserror.obj
- 0002:00001138       ??_C@_0BA@ENLPPKBN@no?5such?5process?$AA@ 0000000180029138     libcpmt:syserror.obj
- 0002:00001148       ??_C@_0BA@DOCPFFJG@not?5a?5directory?$AA@ 0000000180029148     libcpmt:syserror.obj
- 0002:00001158       ??_C@_0N@POEIPGGF@not?5a?5socket?$AA@ 0000000180029158     libcpmt:syserror.obj
- 0002:00001168       ??_C@_0N@LGAPMMPI@not?5a?5stream?$AA@ 0000000180029168     libcpmt:syserror.obj
- 0002:00001178       ??_C@_0O@GLMIBBEG@not?5connected?$AA@ 0000000180029178     libcpmt:syserror.obj
- 0002:00001188       ??_C@_0BC@ENOOLCNF@not?5enough?5memory?$AA@ 0000000180029188     libcpmt:syserror.obj
- 0002:000011a0       ??_C@_0O@NHEDABJP@not?5supported?$AA@ 00000001800291a0     libcpmt:syserror.obj
- 0002:000011b0       ??_C@_0BD@MOLBPMEA@operation?5canceled?$AA@ 00000001800291b0     libcpmt:syserror.obj
- 0002:000011c8       ??_C@_0BG@KDKHOPCO@operation?5in?5progress?$AA@ 00000001800291c8     libcpmt:syserror.obj
- 0002:000011e0       ??_C@_0BI@OHIEJAAB@operation?5not?5permitted?$AA@ 00000001800291e0     libcpmt:syserror.obj
- 0002:000011f8       ??_C@_0BI@LNEGIFLN@operation?5not?5supported?$AA@ 00000001800291f8     libcpmt:syserror.obj
- 0002:00001210       ??_C@_0BG@OEMDKMEE@operation?5would?5block?$AA@ 0000000180029210     libcpmt:syserror.obj
- 0002:00001228       ??_C@_0L@BLPOFLNJ@owner?5dead?$AA@ 0000000180029228     libcpmt:syserror.obj
- 0002:00001238       ??_C@_0BC@CIJDGCDI@permission?5denied?$AA@ 0000000180029238     libcpmt:syserror.obj
- 0002:00001250       ??_C@_0P@FNPOCJBE@protocol?5error?$AA@ 0000000180029250     libcpmt:syserror.obj
- 0002:00001260       ??_C@_0BH@JPPPLHJB@protocol?5not?5supported?$AA@ 0000000180029260     libcpmt:syserror.obj
- 0002:00001278       ??_C@_0BG@EICBIHDP@read?5only?5file?5system?$AA@ 0000000180029278     libcpmt:syserror.obj
- 0002:00001290       ??_C@_0BO@BJBOMOEJ@resource?5deadlock?5would?5occur?$AA@ 0000000180029290     libcpmt:syserror.obj
- 0002:000012b0       ??_C@_0BP@LKNGHENJ@resource?5unavailable?5try?5again?$AA@ 00000001800292b0     libcpmt:syserror.obj
- 0002:000012d0       ??_C@_0BE@GOIPJJHG@result?5out?5of?5range?$AA@ 00000001800292d0     libcpmt:syserror.obj
- 0002:000012e8       ??_C@_0BG@MPLKFPAE@state?5not?5recoverable?$AA@ 00000001800292e8     libcpmt:syserror.obj
- 0002:00001300       ??_C@_0P@DIIFGFCG@stream?5timeout?$AA@ 0000000180029300     libcpmt:syserror.obj
- 0002:00001310       ??_C@_0P@IPFDMIFL@text?5file?5busy?$AA@ 0000000180029310     libcpmt:syserror.obj
- 0002:00001320       ??_C@_09KJPPMAOI@timed?5out?$AA@ 0000000180029320     libcpmt:syserror.obj
- 0002:00001330       ??_C@_0BO@HACHBEKI@too?5many?5files?5open?5in?5system?$AA@ 0000000180029330     libcpmt:syserror.obj
- 0002:00001350       ??_C@_0BE@GHAFMPAH@too?5many?5files?5open?$AA@ 0000000180029350     libcpmt:syserror.obj
- 0002:00001368       ??_C@_0P@HCOMKFCC@too?5many?5links?$AA@ 0000000180029368     libcpmt:syserror.obj
- 0002:00001378       ??_C@_0BO@EFGOJEF@too?5many?5symbolic?5link?5levels?$AA@ 0000000180029378     libcpmt:syserror.obj
- 0002:00001398       ??_C@_0BA@KGKGOOJA@value?5too?5large?$AA@ 0000000180029398     libcpmt:syserror.obj
- 0002:000013a8       ??_C@_0BE@MIEJDDNH@wrong?5protocol?5type?$AA@ 00000001800293a8     libcpmt:syserror.obj
- 0002:000013c0       ??_C@_0O@BFJCFAAK@unknown?5error?$AA@ 00000001800293c0     libcpmt:syserror.obj
- 0002:00001400       ??_7?$ctype@D@std@@6B@     0000000180029400     libcpmt:locale.obj
- 0002:00001460       ??_7?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ 0000000180029460     libcpmt:locale.obj
- 0002:000014c0       ??_7?$numpunct@D@std@@6B@  00000001800294c0     libcpmt:locale.obj
- 0002:00001500       ??_C@_1BK@MGMFAEKH@?$AAk?$AAe?$AAr?$AAn?$AAe?$AAl?$AA3?$AA2?$AA?4?$AAd?$AAl?$AAl?$AA?$AA@ 0000000180029500     libcpmt:winapisupp.obj
- 0002:00001520       ??_C@_08KNHFBNJ@FlsAlloc?$AA@ 0000000180029520     libcpmt:winapisupp.obj
- 0002:00001530       ??_C@_07PEJMOBNF@FlsFree?$AA@ 0000000180029530     libcpmt:winapisupp.obj
- 0002:00001538       ??_C@_0M@GDNOONDI@FlsGetValue?$AA@ 0000000180029538     libcpmt:winapisupp.obj
- 0002:00001548       ??_C@_0M@JCPCPOEF@FlsSetValue?$AA@ 0000000180029548     libcpmt:winapisupp.obj
- 0002:00001558       ??_C@_0BM@HCFOFFN@InitializeCriticalSectionEx?$AA@ 0000000180029558     libcpmt:winapisupp.obj
- 0002:00001578       ??_C@_0BE@GPLMMCMH@InitOnceExecuteOnce?$AA@ 0000000180029578     libcpmt:winapisupp.obj
- 0002:00001590       ??_C@_0P@DLHPPCNH@CreateEventExW?$AA@ 0000000180029590     libcpmt:winapisupp.obj
- 0002:000015a0       ??_C@_0BB@MEFPJLHN@CreateSemaphoreW?$AA@ 00000001800295a0     libcpmt:winapisupp.obj
- 0002:000015b8       ??_C@_0BD@KIEEOEEH@CreateSemaphoreExW?$AA@ 00000001800295b8     libcpmt:winapisupp.obj
- 0002:000015d0       ??_C@_0BG@OGFAJCKC@CreateThreadpoolTimer?$AA@ 00000001800295d0     libcpmt:winapisupp.obj
- 0002:000015e8       ??_C@_0BD@LPLEMMDI@SetThreadpoolTimer?$AA@ 00000001800295e8     libcpmt:winapisupp.obj
- 0002:00001600       ??_C@_0CA@FMNJENH@WaitForThreadpoolTimerCallbacks?$AA@ 0000000180029600     libcpmt:winapisupp.obj
- 0002:00001620       ??_C@_0BF@DCFCCNOC@CloseThreadpoolTimer?$AA@ 0000000180029620     libcpmt:winapisupp.obj
- 0002:00001638       ??_C@_0BF@FLABGKKM@CreateThreadpoolWait?$AA@ 0000000180029638     libcpmt:winapisupp.obj
- 0002:00001650       ??_C@_0BC@MGCOHNA@SetThreadpoolWait?$AA@ 0000000180029650     libcpmt:winapisupp.obj
- 0002:00001668       ??_C@_0BE@OCIOMIMP@CloseThreadpoolWait?$AA@ 0000000180029668     libcpmt:winapisupp.obj
- 0002:00001680       ??_C@_0BJ@LKGHFHBO@FlushProcessWriteBuffers?$AA@ 0000000180029680     libcpmt:winapisupp.obj
- 0002:000016a0       ??_C@_0BP@KALKKPMO@FreeLibraryWhenCallbackReturns?$AA@ 00000001800296a0     libcpmt:winapisupp.obj
- 0002:000016c0       ??_C@_0BK@DFNBACLA@GetCurrentProcessorNumber?$AA@ 00000001800296c0     libcpmt:winapisupp.obj
- 0002:000016e0       ??_C@_0BE@FKKLLFLM@CreateSymbolicLinkW?$AA@ 00000001800296e0     libcpmt:winapisupp.obj
- 0002:000016f8       ??_C@_0BE@JOGNEJCI@GetCurrentPackageId?$AA@ 00000001800296f8     libcpmt:winapisupp.obj
- 0002:00001710       ??_C@_0P@CDHHOHKP@GetTickCount64?$AA@ 0000000180029710     libcpmt:winapisupp.obj
- 0002:00001720       ??_C@_0BN@NEEHBBPO@GetFileInformationByHandleEx?$AA@ 0000000180029720     libcpmt:winapisupp.obj
- 0002:00001740       ??_C@_0BL@KBBHGKCM@SetFileInformationByHandle?$AA@ 0000000180029740     libcpmt:winapisupp.obj
- 0002:00001760       ??_C@_0BP@FPNJPEJC@GetSystemTimePreciseAsFileTime?$AA@ 0000000180029760     libcpmt:winapisupp.obj
- 0002:00001780       ??_C@_0BM@HLJJNPAH@InitializeConditionVariable?$AA@ 0000000180029780     libcpmt:winapisupp.obj
- 0002:000017a0       ??_C@_0BG@BFNILBLN@WakeConditionVariable?$AA@ 00000001800297a0     libcpmt:winapisupp.obj
- 0002:000017b8       ??_C@_0BJ@PGPPEPCC@WakeAllConditionVariable?$AA@ 00000001800297b8     libcpmt:winapisupp.obj
- 0002:000017d8       ??_C@_0BJ@JEBJOJFJ@SleepConditionVariableCS?$AA@ 00000001800297d8     libcpmt:winapisupp.obj
- 0002:000017f8       ??_C@_0BC@MMLHEBPB@InitializeSRWLock?$AA@ 00000001800297f8     libcpmt:winapisupp.obj
- 0002:00001810       ??_C@_0BI@OMNLIJDB@AcquireSRWLockExclusive?$AA@ 0000000180029810     libcpmt:winapisupp.obj
- 0002:00001828       ??_C@_0BL@OGHFEMNA@TryAcquireSRWLockExclusive?$AA@ 0000000180029828     libcpmt:winapisupp.obj
- 0002:00001848       ??_C@_0BI@HMIEPCNJ@ReleaseSRWLockExclusive?$AA@ 0000000180029848     libcpmt:winapisupp.obj
- 0002:00001860       ??_C@_0BK@LGACAGIC@SleepConditionVariableSRW?$AA@ 0000000180029860     libcpmt:winapisupp.obj
- 0002:00001880       ??_C@_0BF@GGPHFPJA@CreateThreadpoolWork?$AA@ 0000000180029880     libcpmt:winapisupp.obj
- 0002:00001898       ??_C@_0BF@NHDAIMMO@SubmitThreadpoolWork?$AA@ 0000000180029898     libcpmt:winapisupp.obj
- 0002:000018b0       ??_C@_0BE@NPHIPNPD@CloseThreadpoolWork?$AA@ 00000001800298b0     libcpmt:winapisupp.obj
- 0002:000018c8       ??_C@_0BA@IHGNDAEB@CompareStringEx?$AA@ 00000001800298c8     libcpmt:winapisupp.obj
- 0002:000018d8       ??_C@_0BA@ONOKGCMP@GetLocaleInfoEx?$AA@ 00000001800298d8     libcpmt:winapisupp.obj
- 0002:000018e8       ??_C@_0O@KKBNKAPF@LCMapStringEx?$AA@ 00000001800298e8     libcpmt:winapisupp.obj
- 0002:000018f8       ??_C@_11LOCGONAA@?$AA?$AA@ 00000001800298f8     libcpmt:wlocale.obj
- 0002:000018fc       ??_C@_01JOAMLHOP@?9?$AA@   00000001800298fc     libcpmt:wlocale.obj
- 0002:00001900       __xmm@80000000000000008000000000000000 0000000180029900     libcpmt:wlocale.obj
- 0002:000019b0       ??_C@_1M@JKFFICHJ@?$AAe?$AAs?$AA?9?$AAv?$AAe?$AA?$AA@ 00000001800299b0     libcpmt:winapinls.obj
- 0002:000019c0       ??_C@_1M@PNMLOJDF@?$AAe?$AAt?$AA?9?$AAe?$AAe?$AA?$AA@ 00000001800299c0     libcpmt:winapinls.obj
- 0002:000019d0       ??_C@_1M@GHHLIKEI@?$AAe?$AAu?$AA?9?$AAe?$AAs?$AA?$AA@ 00000001800299d0     libcpmt:winapinls.obj
- 0002:000019e0       ??_C@_1M@PBNONODE@?$AAf?$AAa?$AA?9?$AAi?$AAr?$AA?$AA@ 00000001800299e0     libcpmt:winapinls.obj
- 0002:000019f0       ??_C@_1M@JEEHPMIL@?$AAf?$AAi?$AA?9?$AAf?$AAi?$AA?$AA@ 00000001800299f0     libcpmt:winapinls.obj
- 0002:00001a00       ??_C@_1M@LMDCNDBA@?$AAf?$AAo?$AA?9?$AAf?$AAo?$AA?$AA@ 0000000180029a00     libcpmt:winapinls.obj
- 0002:00001a10       ??_C@_1M@JKEOHLDK@?$AAf?$AAr?$AA?9?$AAb?$AAe?$AA?$AA@ 0000000180029a10     libcpmt:winapinls.obj
- 0002:00001a20       ??_C@_1M@NOHADPMI@?$AAf?$AAr?$AA?9?$AAc?$AAa?$AA?$AA@ 0000000180029a20     libcpmt:winapinls.obj
- 0002:00001a30       ??_C@_1M@KDHIHAEC@?$AAf?$AAr?$AA?9?$AAc?$AAh?$AA?$AA@ 0000000180029a30     libcpmt:winapinls.obj
- 0002:00001a40       ??_C@_1M@MMBBFGAK@?$AAf?$AAr?$AA?9?$AAf?$AAr?$AA?$AA@ 0000000180029a40     libcpmt:winapinls.obj
- 0002:00001a50       ??_C@_1M@PAFNENNF@?$AAf?$AAr?$AA?9?$AAl?$AAu?$AA?$AA@ 0000000180029a50     libcpmt:winapinls.obj
- 0002:00001a60       ??_C@_1M@EOHDJGDD@?$AAf?$AAr?$AA?9?$AAm?$AAc?$AA?$AA@ 0000000180029a60     libcpmt:winapinls.obj
- 0002:00001a70       ??_C@_1M@FAPLLOPF@?$AAg?$AAl?$AA?9?$AAe?$AAs?$AA?$AA@ 0000000180029a70     libcpmt:winapinls.obj
- 0002:00001a80       ??_C@_1M@FOPBFLOO@?$AAg?$AAu?$AA?9?$AAi?$AAn?$AA?$AA@ 0000000180029a80     libcpmt:winapinls.obj
- 0002:00001a90       ??_C@_1M@KBMCINPM@?$AAh?$AAe?$AA?9?$AAi?$AAl?$AA?$AA@ 0000000180029a90     libcpmt:winapinls.obj
- 0002:00001aa0       ??_C@_1M@BBPHKFPJ@?$AAh?$AAi?$AA?9?$AAi?$AAn?$AA?$AA@ 0000000180029aa0     libcpmt:winapinls.obj
- 0002:00001ab0       ??_C@_1M@PMBNDPHD@?$AAh?$AAr?$AA?9?$AAb?$AAa?$AA?$AA@ 0000000180029ab0     libcpmt:winapinls.obj
- 0002:00001ac0       ??_C@_1M@BPCKOEGE@?$AAh?$AAr?$AA?9?$AAh?$AAr?$AA?$AA@ 0000000180029ac0     libcpmt:winapinls.obj
- 0002:00001ad0       ??_C@_1M@GACBMHKE@?$AAh?$AAu?$AA?9?$AAh?$AAu?$AA?$AA@ 0000000180029ad0     libcpmt:winapinls.obj
- 0002:00001ae0       ??_C@_1M@MILPAJJC@?$AAh?$AAy?$AA?9?$AAa?$AAm?$AA?$AA@ 0000000180029ae0     libcpmt:winapinls.obj
- 0002:00001af0       ??_C@_1M@BABBICEC@?$AAi?$AAd?$AA?9?$AAi?$AAd?$AA?$AA@ 0000000180029af0     libcpmt:winapinls.obj
- 0002:00001b00       ??_C@_1M@BIKNHHPF@?$AAi?$AAs?$AA?9?$AAi?$AAs?$AA?$AA@ 0000000180029b00     libcpmt:winapinls.obj
- 0002:00001b10       ??_C@_1M@NMPCJPHE@?$AAi?$AAt?$AA?9?$AAc?$AAh?$AA?$AA@ 0000000180029b10     libcpmt:winapinls.obj
- 0002:00001b20       ??_C@_1M@GHKGFEDF@?$AAi?$AAt?$AA?9?$AAi?$AAt?$AA?$AA@ 0000000180029b20     libcpmt:winapinls.obj
- 0002:00001b30       ??_C@_1M@NIEJCJJA@?$AAj?$AAa?$AA?9?$AAj?$AAp?$AA?$AA@ 0000000180029b30     libcpmt:winapinls.obj
- 0002:00001b40       ??_C@_1M@JILFNBIM@?$AAk?$AAa?$AA?9?$AAg?$AAe?$AA?$AA@ 0000000180029b40     libcpmt:winapinls.obj
- 0002:00001b50       ??_C@_1M@PACPMGPH@?$AAk?$AAk?$AA?9?$AAk?$AAz?$AA?$AA@ 0000000180029b50     libcpmt:winapinls.obj
- 0002:00001b60       ??_C@_1M@IELFGMHA@?$AAk?$AAn?$AA?9?$AAi?$AAn?$AA?$AA@ 0000000180029b60     libcpmt:winapinls.obj
- 0002:00001b70       ??_C@_1M@DMHAEOGC@?$AAk?$AAo?$AA?9?$AAk?$AAr?$AA?$AA@ 0000000180029b70     libcpmt:winapinls.obj
- 0002:00001b80       ??_C@_1O@IBBJHCH@?$AAk?$AAo?$AAk?$AA?9?$AAi?$AAn?$AA?$AA@ 0000000180029b80     libcpmt:winapinls.obj
- 0002:00001b90       ??_C@_1M@HBAHBIGA@?$AAk?$AAy?$AA?9?$AAk?$AAg?$AA?$AA@ 0000000180029b90     libcpmt:winapinls.obj
- 0002:00001ba0       ??_C@_1M@KPMILCJG@?$AAl?$AAt?$AA?9?$AAl?$AAt?$AA?$AA@ 0000000180029ba0     libcpmt:winapinls.obj
- 0002:00001bb0       ??_C@_1M@BDEKKCA@?$AAl?$AAv?$AA?9?$AAl?$AAv?$AA?$AA@ 0000000180029bb0     libcpmt:winapinls.obj
- 0002:00001bc0       ??_C@_1M@ELCKCCJJ@?$AAm?$AAi?$AA?9?$AAn?$AAz?$AA?$AA@ 0000000180029bc0     libcpmt:winapinls.obj
- 0002:00001bd0       ??_C@_1M@CBOOLAPA@?$AAm?$AAk?$AA?9?$AAm?$AAk?$AA?$AA@ 0000000180029bd0     libcpmt:winapinls.obj
- 0002:00001be0       ??_C@_1M@GPHNBJKN@?$AAm?$AAl?$AA?9?$AAi?$AAn?$AA?$AA@ 0000000180029be0     libcpmt:winapinls.obj
- 0002:00001bf0       ??_C@_1M@PABJILIG@?$AAm?$AAn?$AA?9?$AAm?$AAn?$AA?$AA@ 0000000180029bf0     libcpmt:winapinls.obj
- 0002:00001c00       ??_C@_1M@FGBKKIPG@?$AAm?$AAr?$AA?9?$AAi?$AAn?$AA?$AA@ 0000000180029c00     libcpmt:winapinls.obj
- 0002:00001c10       ??_C@_1M@NDBPDDAL@?$AAm?$AAs?$AA?9?$AAb?$AAn?$AA?$AA@ 0000000180029c10     libcpmt:winapinls.obj
- 0002:00001c20       ??_C@_1M@OPIHOOPI@?$AAm?$AAs?$AA?9?$AAm?$AAy?$AA?$AA@ 0000000180029c20     libcpmt:winapinls.obj
- 0002:00001c30       ??_C@_1M@PPDBCNFM@?$AAm?$AAt?$AA?9?$AAm?$AAt?$AA?$AA@ 0000000180029c30     libcpmt:winapinls.obj
- 0002:00001c40       ??_C@_1M@KDJDKMDD@?$AAn?$AAb?$AA?9?$AAn?$AAo?$AA?$AA@ 0000000180029c40     libcpmt:winapinls.obj
- 0002:00001c50       ??_C@_1M@KFCFLMJP@?$AAn?$AAl?$AA?9?$AAb?$AAe?$AA?$AA@ 0000000180029c50     libcpmt:winapinls.obj
- 0002:00001c60       ??_C@_1M@KPOPDDGO@?$AAn?$AAl?$AA?9?$AAn?$AAl?$AA?$AA@ 0000000180029c60     libcpmt:winapinls.obj
- 0002:00001c70       ??_C@_1M@LJKPEMLN@?$AAn?$AAn?$AA?9?$AAn?$AAo?$AA?$AA@ 0000000180029c70     libcpmt:winapinls.obj
- 0002:00001c80       ??_C@_1M@BDGHHBFL@?$AAn?$AAs?$AA?9?$AAz?$AAa?$AA?$AA@ 0000000180029c80     libcpmt:winapinls.obj
- 0002:00001c90       ??_C@_1M@IDEHOAP@?$AAp?$AAa?$AA?9?$AAi?$AAn?$AA?$AA@ 0000000180029c90     libcpmt:winapinls.obj
- 0002:00001ca0       ??_C@_1M@HDBKGOGH@?$AAp?$AAl?$AA?9?$AAp?$AAl?$AA?$AA@ 0000000180029ca0     libcpmt:winapinls.obj
- 0002:00001cb0       ??_C@_1M@LJLLCMEH@?$AAp?$AAt?$AA?9?$AAb?$AAr?$AA?$AA@ 0000000180029cb0     libcpmt:winapinls.obj
- 0002:00001cc0       ??_C@_1M@NCMONAAL@?$AAp?$AAt?$AA?9?$AAp?$AAt?$AA?$AA@ 0000000180029cc0     libcpmt:winapinls.obj
- 0002:00001cd0       ??_C@_1O@EAKMAJDN@?$AAq?$AAu?$AAz?$AA?9?$AAb?$AAo?$AA?$AA@ 0000000180029cd0     libcpmt:winapinls.obj
- 0002:00001ce0       ??_C@_1O@BHHPIGDN@?$AAq?$AAu?$AAz?$AA?9?$AAe?$AAc?$AA?$AA@ 0000000180029ce0     libcpmt:winapinls.obj
- 0002:00001cf0       ??_C@_1O@GBAPEKMJ@?$AAq?$AAu?$AAz?$AA?9?$AAp?$AAe?$AA?$AA@ 0000000180029cf0     libcpmt:winapinls.obj
- 0002:00001d00       ??_C@_1M@CLGLEFBO@?$AAr?$AAo?$AA?9?$AAr?$AAo?$AA?$AA@ 0000000180029d00     libcpmt:winapinls.obj
- 0002:00001d10       ??_C@_1M@CEEDODME@?$AAr?$AAu?$AA?9?$AAr?$AAu?$AA?$AA@ 0000000180029d10     libcpmt:winapinls.obj
- 0002:00001d20       ??_C@_1M@HPKKKMPP@?$AAs?$AAa?$AA?9?$AAi?$AAn?$AA?$AA@ 0000000180029d20     libcpmt:winapinls.obj
- 0002:00001d30       ??_C@_1M@BKMAIGOJ@?$AAs?$AAe?$AA?9?$AAf?$AAi?$AA?$AA@ 0000000180029d30     libcpmt:winapinls.obj
- 0002:00001d40       ??_C@_1M@NDPIFLFI@?$AAs?$AAe?$AA?9?$AAn?$AAo?$AA?$AA@ 0000000180029d40     libcpmt:winapinls.obj
- 0002:00001d50       ??_C@_1M@DANKKHJ@?$AAs?$AAe?$AA?9?$AAs?$AAe?$AA?$AA@ 0000000180029d50     libcpmt:winapinls.obj
- 0002:00001d60       ??_C@_1M@PNBLONPJ@?$AAs?$AAk?$AA?9?$AAs?$AAk?$AA?$AA@ 0000000180029d60     libcpmt:winapinls.obj
- 0002:00001d70       ??_C@_1M@LFMODOAL@?$AAs?$AAl?$AA?9?$AAs?$AAi?$AA?$AA@ 0000000180029d70     libcpmt:winapinls.obj
- 0002:00001d80       ??_C@_1O@DFKOMPG@?$AAs?$AAm?$AAa?$AA?9?$AAn?$AAo?$AA?$AA@ 0000000180029d80     libcpmt:winapinls.obj
- 0002:00001d90       ??_C@_1O@NDKPBNNH@?$AAs?$AAm?$AAa?$AA?9?$AAs?$AAe?$AA?$AA@ 0000000180029d90     libcpmt:winapinls.obj
- 0002:00001da0       ??_C@_1O@PLLKBHAB@?$AAs?$AAm?$AAj?$AA?9?$AAn?$AAo?$AA?$AA@ 0000000180029da0     libcpmt:winapinls.obj
- 0002:00001db0       ??_C@_1O@CLEPOGCA@?$AAs?$AAm?$AAj?$AA?9?$AAs?$AAe?$AA?$AA@ 0000000180029db0     libcpmt:winapinls.obj
- 0002:00001dc0       ??_C@_1O@DLGJGKMK@?$AAs?$AAm?$AAn?$AA?9?$AAf?$AAi?$AA?$AA@ 0000000180029dc0     libcpmt:winapinls.obj
- 0002:00001dd0       ??_C@_1O@OJDJGAJC@?$AAs?$AAm?$AAs?$AA?9?$AAf?$AAi?$AA?$AA@ 0000000180029dd0     libcpmt:winapinls.obj
- 0002:00001de0       ??_C@_1M@BOFOGHPB@?$AAs?$AAq?$AA?9?$AAa?$AAl?$AA?$AA@ 0000000180029de0     libcpmt:winapinls.obj
- 0002:00001df0       ??_C@_1BG@LJBBIPGB@?$AAs?$AAr?$AA?9?$AAb?$AAa?$AA?9?$AAc?$AAy?$AAr?$AAl?$AA?$AA@ 0000000180029df0     libcpmt:winapinls.obj
- 0002:00001e08       ??_C@_1BG@JLBENFOE@?$AAs?$AAr?$AA?9?$AAb?$AAa?$AA?9?$AAl?$AAa?$AAt?$AAn?$AA?$AA@ 0000000180029e08     libcpmt:winapinls.obj
- 0002:00001e20       ??_C@_1BG@KODPNHE@?$AAs?$AAr?$AA?9?$AAs?$AAp?$AA?9?$AAc?$AAy?$AAr?$AAl?$AA?$AA@ 0000000180029e20     libcpmt:winapinls.obj
- 0002:00001e38       ??_C@_1BG@CIOGKHPB@?$AAs?$AAr?$AA?9?$AAs?$AAp?$AA?9?$AAl?$AAa?$AAt?$AAn?$AA?$AA@ 0000000180029e38     libcpmt:winapinls.obj
- 0002:00001e50       ??_C@_1M@NGFJLMAC@?$AAs?$AAv?$AA?9?$AAf?$AAi?$AA?$AA@ 0000000180029e50     libcpmt:winapinls.obj
- 0002:00001e60       ??_C@_1M@MPJEJAJC@?$AAs?$AAv?$AA?9?$AAs?$AAe?$AA?$AA@ 0000000180029e60     libcpmt:winapinls.obj
- 0002:00001e70       ??_C@_1M@MPNDHLFK@?$AAs?$AAw?$AA?9?$AAk?$AAe?$AA?$AA@ 0000000180029e70     libcpmt:winapinls.obj
- 0002:00001e80       ??_C@_1O@KOHBJJI@?$AAs?$AAy?$AAr?$AA?9?$AAs?$AAy?$AA?$AA@ 0000000180029e80     libcpmt:winapinls.obj
- 0002:00001e90       ??_C@_1M@LDCEFHA@?$AAt?$AAa?$AA?9?$AAi?$AAn?$AA?$AA@ 0000000180029e90     libcpmt:winapinls.obj
- 0002:00001ea0       ??_C@_1M@CNJOFAK@?$AAt?$AAe?$AA?9?$AAi?$AAn?$AA?$AA@ 0000000180029ea0     libcpmt:winapinls.obj
- 0002:00001eb0       ??_C@_1M@GNAECACD@?$AAt?$AAh?$AA?9?$AAt?$AAh?$AA?$AA@ 0000000180029eb0     libcpmt:winapinls.obj
- 0002:00001ec0       ??_C@_1M@CHBIHOJO@?$AAt?$AAn?$AA?9?$AAz?$AAa?$AA?$AA@ 0000000180029ec0     libcpmt:winapinls.obj
- 0002:00001ed0       ??_C@_1M@GCCMIGPJ@?$AAt?$AAr?$AA?9?$AAt?$AAr?$AA?$AA@ 0000000180029ed0     libcpmt:winapinls.obj
- 0002:00001ee0       ??_C@_1M@CELMCNBK@?$AAt?$AAt?$AA?9?$AAr?$AAu?$AA?$AA@ 0000000180029ee0     libcpmt:winapinls.obj
- 0002:00001ef0       ??_C@_1M@KLMCELGA@?$AAu?$AAk?$AA?9?$AAu?$AAa?$AA?$AA@ 0000000180029ef0     libcpmt:winapinls.obj
- 0002:00001f00       ??_C@_1M@EPAJJAJF@?$AAu?$AAr?$AA?9?$AAp?$AAk?$AA?$AA@ 0000000180029f00     libcpmt:winapinls.obj
- 0002:00001f10       ??_C@_1BG@GEGPMCDJ@?$AAu?$AAz?$AA?9?$AAu?$AAz?$AA?9?$AAc?$AAy?$AAr?$AAl?$AA?$AA@ 0000000180029f10     libcpmt:winapinls.obj
- 0002:00001f28       ??_C@_1BG@EGGKJILM@?$AAu?$AAz?$AA?9?$AAu?$AAz?$AA?9?$AAl?$AAa?$AAt?$AAn?$AA?$AA@ 0000000180029f28     libcpmt:winapinls.obj
- 0002:00001f40       ??_C@_1M@GFOCLFF@?$AAv?$AAi?$AA?9?$AAv?$AAn?$AA?$AA@ 0000000180029f40     libcpmt:winapinls.obj
- 0002:00001f50       ??_C@_1M@CPAMEDFI@?$AAx?$AAh?$AA?9?$AAz?$AAa?$AA?$AA@ 0000000180029f50     libcpmt:winapinls.obj
- 0002:00001f60       ??_C@_1O@EBKIFIGN@?$AAz?$AAh?$AA?9?$AAc?$AAh?$AAs?$AA?$AA@ 0000000180029f60     libcpmt:winapinls.obj
- 0002:00001f70       ??_C@_1O@NMHPGANE@?$AAz?$AAh?$AA?9?$AAc?$AAh?$AAt?$AA?$AA@ 0000000180029f70     libcpmt:winapinls.obj
- 0002:00001f80       ??_C@_1M@LPINJOMC@?$AAz?$AAh?$AA?9?$AAc?$AAn?$AA?$AA@ 0000000180029f80     libcpmt:winapinls.obj
- 0002:00001f90       ??_C@_1M@OCJEJODD@?$AAz?$AAh?$AA?9?$AAh?$AAk?$AA?$AA@ 0000000180029f90     libcpmt:winapinls.obj
- 0002:00001fa0       ??_C@_1M@DNDLJINH@?$AAz?$AAh?$AA?9?$AAm?$AAo?$AA?$AA@ 0000000180029fa0     libcpmt:winapinls.obj
- 0002:00001fb0       ??_C@_1M@MBFDNDND@?$AAz?$AAh?$AA?9?$AAs?$AAg?$AA?$AA@ 0000000180029fb0     libcpmt:winapinls.obj
- 0002:00001fc0       ??_C@_1M@IMEPLEPE@?$AAz?$AAh?$AA?9?$AAt?$AAw?$AA?$AA@ 0000000180029fc0     libcpmt:winapinls.obj
- 0002:00001fd0       ??_C@_1M@BBGHNHJP@?$AAz?$AAu?$AA?9?$AAz?$AAa?$AA?$AA@ 0000000180029fd0     libcpmt:winapinls.obj
- 0002:00003c60       ??_C@_15EMKDOKLE@?$AAa?$AAr?$AA?$AA@ 000000018002bc60     libcpmt:winapinls.obj
- 0002:00003c68       ??_C@_15KNPADPLH@?$AAb?$AAg?$AA?$AA@ 000000018002bc68     libcpmt:winapinls.obj
- 0002:00003c70       ??_C@_15EDMHLDMO@?$AAc?$AAa?$AA?$AA@ 000000018002bc70     libcpmt:winapinls.obj
- 0002:00003c78       ??_C@_1O@BPEAJADD@?$AAz?$AAh?$AA?9?$AAC?$AAH?$AAS?$AA?$AA@ 000000018002bc78     libcpmt:winapinls.obj
- 0002:00003c88       ??_C@_15LJNHCMNK@?$AAc?$AAs?$AA?$AA@ 000000018002bc88     libcpmt:winapinls.obj
- 0002:00003c90       ??_C@_15FOMCIDHG@?$AAd?$AAa?$AA?$AA@ 000000018002bc90     libcpmt:winapinls.obj
- 0002:00003c98       ??_C@_15NBKABECB@?$AAd?$AAe?$AA?$AA@ 000000018002bc98     libcpmt:winapinls.obj
- 0002:00003ca0       ??_C@_15GHPEIIAO@?$AAe?$AAl?$AA?$AA@ 000000018002bca0     libcpmt:winapinls.obj
- 0002:00003ca8       ??_C@_15MNPNEAIF@?$AAe?$AAn?$AA?$AA@ 000000018002bca8     libcpmt:winapinls.obj
- 0002:00003cb0       ??_C@_15GPIOMPMH@?$AAe?$AAs?$AA?$AA@ 000000018002bcb0     libcpmt:winapinls.obj
- 0002:00003cb8       ??_C@_15NGLOAKJC@?$AAf?$AAi?$AA?$AA@ 000000018002bcb8     libcpmt:winapinls.obj
- 0002:00003cc0       ??_C@_15FBKGNKAM@?$AAf?$AAr?$AA?$AA@ 000000018002bcc0     libcpmt:winapinls.obj
- 0002:00003cc8       ??_C@_15KGGCNEFK@?$AAh?$AAe?$AA?$AA@ 000000018002bcc8     libcpmt:winapinls.obj
- 0002:00003cd0       ??_C@_15PGHLIDMF@?$AAh?$AAu?$AA?$AA@ 000000018002bcd0     libcpmt:winapinls.obj
- 0002:00003cd8       ??_C@_15BIEMAPLM@?$AAi?$AAs?$AA?$AA@ 000000018002bcd8     libcpmt:winapinls.obj
- 0002:00003ce0       ??_C@_15IFJLDHAF@?$AAi?$AAt?$AA?$AA@ 000000018002bce0     libcpmt:winapinls.obj
- 0002:00003ce8       ??_C@_15GEMIOCAG@?$AAj?$AAa?$AA?$AA@ 000000018002bce8     libcpmt:winapinls.obj
- 0002:00003cf0       ??_C@_15EPELEGJA@?$AAk?$AAo?$AA?$AA@ 000000018002bcf0     libcpmt:winapinls.obj
- 0002:00003cf8       ??_C@_15NDDHIMN@?$AAn?$AAl?$AA?$AA@ 000000018002bcf8     libcpmt:winapinls.obj
- 0002:00003d00       ??_C@_15BPIGNHCD@?$AAn?$AAo?$AA?$AA@ 000000018002bd00     libcpmt:winapinls.obj
- 0002:00003d08       ??_C@_15DEOPBLCG@?$AAp?$AAl?$AA?$AA@ 000000018002bd08     libcpmt:winapinls.obj
- 0002:00003d10       ??_C@_15KBECGEFG@?$AAp?$AAt?$AA?$AA@ 000000018002bd10     libcpmt:winapinls.obj
- 0002:00003d18       ??_C@_15GLJCBFMD@?$AAr?$AAo?$AA?$AA@ 000000018002bd18     libcpmt:winapinls.obj
- 0002:00003d20       ??_C@_15FEDGKCDI@?$AAr?$AAu?$AA?$AA@ 000000018002bd20     libcpmt:winapinls.obj
- 0002:00003d28       ??_C@_15GLKMLLHM@?$AAh?$AAr?$AA?$AA@ 000000018002bd28     libcpmt:winapinls.obj
- 0002:00003d30       ??_C@_15CPKMFBDB@?$AAs?$AAk?$AA?$AA@ 000000018002bd30     libcpmt:winapinls.obj
- 0002:00003d38       ??_C@_15BAAIOGMK@?$AAs?$AAq?$AA?$AA@ 000000018002bd38     libcpmt:winapinls.obj
- 0002:00003d40       ??_C@_15INNPNOHD@?$AAs?$AAv?$AA?$AA@ 000000018002bd40     libcpmt:winapinls.obj
- 0002:00003d48       ??_C@_15CABMMOGH@?$AAt?$AAh?$AA?$AA@ 000000018002bd48     libcpmt:winapinls.obj
- 0002:00003d50       ??_C@_15BPLIHJJM@?$AAt?$AAr?$AA?$AA@ 000000018002bd50     libcpmt:winapinls.obj
- 0002:00003d58       ??_C@_15NEOEKKDJ@?$AAu?$AAr?$AA?$AA@ 000000018002bd58     libcpmt:winapinls.obj
- 0002:00003d60       ??_C@_15NFICGAJK@?$AAi?$AAd?$AA?$AA@ 000000018002bd60     libcpmt:winapinls.obj
- 0002:00003d68       ??_C@_15PJPFLCCM@?$AAu?$AAk?$AA?$AA@ 000000018002bd68     libcpmt:winapinls.obj
- 0002:00003d70       ??_C@_15HPJPHDM@?$AAb?$AAe?$AA?$AA@ 000000018002bd70     libcpmt:winapinls.obj
- 0002:00003d78       ??_C@_15LCHLGJII@?$AAs?$AAl?$AA?$AA@ 000000018002bd78     libcpmt:winapinls.obj
- 0002:00003d80       ??_C@_15PCFJPHHO@?$AAe?$AAt?$AA?$AA@ 000000018002bd80     libcpmt:winapinls.obj
- 0002:00003d88       ??_C@_15HPFPGODN@?$AAl?$AAv?$AA?$AA@ 000000018002bd88     libcpmt:winapinls.obj
- 0002:00003d90       ??_C@_15NFFGKGLG@?$AAl?$AAt?$AA?$AA@ 000000018002bd90     libcpmt:winapinls.obj
- 0002:00003d98       ??_C@_15BDAKCCHN@?$AAf?$AAa?$AA?$AA@ 000000018002bd98     libcpmt:winapinls.obj
- 0002:00003da0       ??_C@_15NFGIAIAJ@?$AAv?$AAi?$AA?$AA@ 000000018002bda0     libcpmt:winapinls.obj
- 0002:00003da8       ??_C@_15LMKNDMHN@?$AAh?$AAy?$AA?$AA@ 000000018002bda8     libcpmt:winapinls.obj
- 0002:00003db0       ??_C@_15IJBHMCFL@?$AAa?$AAz?$AA?$AA@ 000000018002bdb0     libcpmt:winapinls.obj
- 0002:00003db8       ??_C@_15EKOFJABL@?$AAe?$AAu?$AA?$AA@ 000000018002bdb8     libcpmt:winapinls.obj
- 0002:00003dc0       ??_C@_15BGHADCNK@?$AAm?$AAk?$AA?$AA@ 000000018002bdc0     libcpmt:winapinls.obj
- 0002:00003dc8       ??_C@_15JDNICKHM@?$AAa?$AAf?$AA?$AA@ 000000018002bdc8     libcpmt:winapinls.obj
- 0002:00003dd0       ??_C@_15KPJEDBKD@?$AAk?$AAa?$AA?$AA@ 000000018002bdd0     libcpmt:winapinls.obj
- 0002:00003dd8       ??_C@_15PDNFFFEO@?$AAf?$AAo?$AA?$AA@ 000000018002bdd8     libcpmt:winapinls.obj
- 0002:00003de0       ??_C@_15OMLEGLOC@?$AAh?$AAi?$AA?$AA@ 000000018002bde0     libcpmt:winapinls.obj
- 0002:00003de8       ??_C@_15IDNNENKK@?$AAm?$AAs?$AA?$AA@ 000000018002bde8     libcpmt:winapinls.obj
- 0002:00003df0       ??_C@_15MACJNBMH@?$AAk?$AAk?$AA?$AA@ 000000018002bdf0     libcpmt:winapinls.obj
- 0002:00003df8       ??_C@_15DKDJEOND@?$AAk?$AAy?$AA?$AA@ 000000018002bdf8     libcpmt:winapinls.obj
- 0002:00003e00       ??_C@_15DFGDLJBG@?$AAs?$AAw?$AA?$AA@ 000000018002be00     libcpmt:winapinls.obj
- 0002:00003e08       ??_C@_15BBFAICNG@?$AAu?$AAz?$AA?$AA@ 000000018002be08     libcpmt:winapinls.obj
- 0002:00003e10       ??_C@_15DKNDCGEA@?$AAt?$AAt?$AA?$AA@ 000000018002be10     libcpmt:winapinls.obj
- 0002:00003e18       ??_C@_15MGIFMDPL@?$AAp?$AAa?$AA?$AA@ 000000018002be18     libcpmt:winapinls.obj
- 0002:00003e20       ??_C@_15HCNDBBA@?$AAg?$AAu?$AA?$AA@ 000000018002be20     libcpmt:winapinls.obj
- 0002:00003e28       ??_C@_15FNBEIBON@?$AAt?$AAa?$AA?$AA@ 000000018002be28     libcpmt:winapinls.obj
- 0002:00003e30       ??_C@_15NCHGBGLK@?$AAt?$AAe?$AA?$AA@ 000000018002be30     libcpmt:winapinls.obj
- 0002:00003e38       ??_C@_15PHPHCBPF@?$AAk?$AAn?$AA?$AA@ 000000018002be38     libcpmt:winapinls.obj
- 0002:00003e40       ??_C@_15DLGBCKMP@?$AAm?$AAr?$AA?$AA@ 000000018002be40     libcpmt:winapinls.obj
- 0002:00003e48       ??_C@_15EABBLBFF@?$AAs?$AAa?$AA?$AA@ 000000018002be48     libcpmt:winapinls.obj
- 0002:00003e50       ??_C@_15CBKOMCOI@?$AAm?$AAn?$AA?$AA@ 000000018002be50     libcpmt:winapinls.obj
- 0002:00003e58       ??_C@_15CKDMCJAF@?$AAg?$AAl?$AA?$AA@ 000000018002be58     libcpmt:winapinls.obj
- 0002:00003e60       ??_C@_17CNJFBPG@?$AAk?$AAo?$AAk?$AA?$AA@ 000000018002be60     libcpmt:winapinls.obj
- 0002:00003e68       ??_C@_17FFBJICPL@?$AAs?$AAy?$AAr?$AA?$AA@ 000000018002be68     libcpmt:winapinls.obj
- 0002:00003e70       ??_C@_17KPNDCPAF@?$AAd?$AAi?$AAv?$AA?$AA@ 000000018002be70     libcpmt:winapinls.obj
- 0002:00003e78       ??_C@_1M@OKAHONE@?$AAa?$AAr?$AA?9?$AAS?$AAA?$AA?$AA@ 000000018002be78     libcpmt:winapinls.obj
- 0002:00003e88       ??_C@_1M@FFFIGIGK@?$AAb?$AAg?$AA?9?$AAB?$AAG?$AA?$AA@ 000000018002be88     libcpmt:winapinls.obj
- 0002:00003e98       ??_C@_1M@BJNKEDC@?$AAc?$AAa?$AA?9?$AAE?$AAS?$AA?$AA@ 000000018002be98     libcpmt:winapinls.obj
- 0002:00003ea8       ??_C@_1M@CLNBBOPM@?$AAz?$AAh?$AA?9?$AAT?$AAW?$AA?$AA@ 000000018002bea8     libcpmt:winapinls.obj
- 0002:00003eb8       ??_C@_1M@IJJHFJHA@?$AAc?$AAs?$AA?9?$AAC?$AAZ?$AA?$AA@ 000000018002beb8     libcpmt:winapinls.obj
- 0002:00003ec8       ??_C@_1M@CLPEOBGI@?$AAd?$AAa?$AA?9?$AAD?$AAK?$AA?$AA@ 000000018002bec8     libcpmt:winapinls.obj
- 0002:00003ed8       ??_C@_1M@MCMADGCB@?$AAd?$AAe?$AA?9?$AAD?$AAE?$AA?$AA@ 000000018002bed8     libcpmt:winapinls.obj
- 0002:00003ee8       ??_C@_1M@OOCKEMAM@?$AAe?$AAl?$AA?9?$AAG?$AAR?$AA?$AA@ 000000018002bee8     libcpmt:winapinls.obj
- 0002:00003ef8       ??_C@_1M@BMHNFIME@?$AAe?$AAn?$AA?9?$AAU?$AAS?$AA?$AA@ 000000018002bef8     libcpmt:winapinls.obj
- 0002:00003f08       ??_C@_1M@DDNJFGID@?$AAf?$AAi?$AA?9?$AAF?$AAI?$AA?$AA@ 000000018002bf08     libcpmt:winapinls.obj
- 0002:00003f18       ??_C@_1M@GLIPPMAC@?$AAf?$AAr?$AA?9?$AAF?$AAR?$AA?$AA@ 000000018002bf18     libcpmt:winapinls.obj
- 0002:00003f28       ??_C@_1M@GFMCHPE@?$AAh?$AAe?$AA?9?$AAI?$AAL?$AA?$AA@ 000000018002bf28     libcpmt:winapinls.obj
- 0002:00003f38       ??_C@_1M@MHLPGNKM@?$AAh?$AAu?$AA?9?$AAH?$AAU?$AA?$AA@ 000000018002bf38     libcpmt:winapinls.obj
- 0002:00003f48       ??_C@_1M@LPDDNNPN@?$AAi?$AAs?$AA?9?$AAI?$AAS?$AA?$AA@ 000000018002bf48     libcpmt:winapinls.obj
- 0002:00003f58       ??_C@_1M@MADIPODN@?$AAi?$AAt?$AA?9?$AAI?$AAT?$AA?$AA@ 000000018002bf58     libcpmt:winapinls.obj
- 0002:00003f68       ??_C@_1M@HPNHIDJI@?$AAj?$AAa?$AA?9?$AAJ?$AAP?$AA?$AA@ 000000018002bf68     libcpmt:winapinls.obj
- 0002:00003f78       ??_C@_1M@JLOOOEGK@?$AAk?$AAo?$AA?9?$AAK?$AAR?$AA?$AA@ 000000018002bf78     libcpmt:winapinls.obj
- 0002:00003f88       ??_C@_1M@IHBJJGG@?$AAn?$AAl?$AA?9?$AAN?$AAL?$AA?$AA@ 000000018002bf88     libcpmt:winapinls.obj
- 0002:00003f98       ??_C@_1M@EANAGDL@?$AAn?$AAb?$AA?9?$AAN?$AAO?$AA?$AA@ 000000018002bf98     libcpmt:winapinls.obj
- 0002:00003fa8       ??_C@_1M@NEIEMEGP@?$AAp?$AAl?$AA?9?$AAP?$AAL?$AA?$AA@ 000000018002bfa8     libcpmt:winapinls.obj
- 0002:00003fb8       ??_C@_1M@BOCFIGEP@?$AAp?$AAt?$AA?9?$AAB?$AAR?$AA?$AA@ 000000018002bfb8     libcpmt:winapinls.obj
- 0002:00003fc8       ??_C@_1M@IMPFOPBG@?$AAr?$AAo?$AA?9?$AAR?$AAO?$AA?$AA@ 000000018002bfc8     libcpmt:winapinls.obj
- 0002:00003fd8       ??_C@_1M@IDNNEJMM@?$AAr?$AAu?$AA?9?$AAR?$AAU?$AA?$AA@ 000000018002bfd8     libcpmt:winapinls.obj
- 0002:00003fe8       ??_C@_1M@LILEEOGM@?$AAh?$AAr?$AA?9?$AAH?$AAR?$AA?$AA@ 000000018002bfe8     libcpmt:winapinls.obj
- 0002:00003ff8       ??_C@_1M@FKIFEHPB@?$AAs?$AAk?$AA?9?$AAS?$AAK?$AA?$AA@ 000000018002bff8     libcpmt:winapinls.obj
- 0002:00004008       ??_C@_1M@LJMAMNPJ@?$AAs?$AAq?$AA?9?$AAA?$AAL?$AA?$AA@ 000000018002c008     libcpmt:winapinls.obj
- 0002:00004018       ??_C@_1M@GIAKDKJK@?$AAs?$AAv?$AA?9?$AAS?$AAE?$AA?$AA@ 000000018002c018     libcpmt:winapinls.obj
- 0002:00004028       ??_C@_1M@MKJKIKCL@?$AAt?$AAh?$AA?9?$AAT?$AAH?$AA?$AA@ 000000018002c028     libcpmt:winapinls.obj
- 0002:00004038       ??_C@_1M@MFLCCMPB@?$AAt?$AAr?$AA?9?$AAT?$AAR?$AA?$AA@ 000000018002c038     libcpmt:winapinls.obj
- 0002:00004048       ??_C@_1M@OIJHDKJN@?$AAu?$AAr?$AA?9?$AAP?$AAK?$AA?$AA@ 000000018002c048     libcpmt:winapinls.obj
- 0002:00004058       ??_C@_1M@LHIPCIEK@?$AAi?$AAd?$AA?9?$AAI?$AAD?$AA?$AA@ 000000018002c058     libcpmt:winapinls.obj
- 0002:00004068       ??_C@_1M@MFMOBGI@?$AAu?$AAk?$AA?9?$AAU?$AAA?$AA?$AA@ 000000018002c068     libcpmt:winapinls.obj
- 0002:00004078       ??_C@_1M@OBGLJIPL@?$AAb?$AAe?$AA?9?$AAB?$AAY?$AA?$AA@ 000000018002c078     libcpmt:winapinls.obj
- 0002:00004088       ??_C@_1M@BCFAJEAD@?$AAs?$AAl?$AA?9?$AAS?$AAI?$AA?$AA@ 000000018002c088     libcpmt:winapinls.obj
- 0002:00004098       ??_C@_1M@FKFFEDDN@?$AAe?$AAt?$AA?9?$AAE?$AAE?$AA?$AA@ 000000018002c098     libcpmt:winapinls.obj
- 0002:000040a8       ??_C@_1M@KGKKAACI@?$AAl?$AAv?$AA?9?$AAL?$AAV?$AA?$AA@ 000000018002c0a8     libcpmt:winapinls.obj
- 0002:000040b8       ??_C@_1M@IFGBIJO@?$AAl?$AAt?$AA?9?$AAL?$AAT?$AA?$AA@ 000000018002c0b8     libcpmt:winapinls.obj
- 0002:000040c8       ??_C@_1M@FGEAHEDM@?$AAf?$AAa?$AA?9?$AAI?$AAR?$AA?$AA@ 000000018002c0c8     libcpmt:winapinls.obj
- 0002:000040d8       ??_C@_1M@KBMAIBFN@?$AAv?$AAi?$AA?9?$AAV?$AAN?$AA?$AA@ 000000018002c0d8     libcpmt:winapinls.obj
- 0002:000040e8       ??_C@_1M@GPCBKDJK@?$AAh?$AAy?$AA?9?$AAA?$AAM?$AA?$AA@ 000000018002c0e8     libcpmt:winapinls.obj
- 0002:000040f8       ??_C@_1BG@BECMDDJB@?$AAa?$AAz?$AA?9?$AAA?$AAZ?$AA?9?$AAL?$AAa?$AAt?$AAn?$AA?$AA@ 000000018002c0f8     libcpmt:winapinls.obj
- 0002:00004110       ??_C@_1M@MAOFCAEA@?$AAe?$AAu?$AA?9?$AAE?$AAS?$AA?$AA@ 000000018002c110     libcpmt:winapinls.obj
- 0002:00004120       ??_C@_1M@IGHABKPI@?$AAm?$AAk?$AA?9?$AAM?$AAK?$AA?$AA@ 000000018002c120     libcpmt:winapinls.obj
- 0002:00004130       ??_C@_1M@IAIGNEJG@?$AAt?$AAn?$AA?9?$AAZ?$AAA?$AA?$AA@ 000000018002c130     libcpmt:winapinls.obj
- 0002:00004140       ??_C@_1M@IIJCOJFA@?$AAx?$AAh?$AA?9?$AAZ?$AAA?$AA?$AA@ 000000018002c140     libcpmt:winapinls.obj
- 0002:00004150       ??_C@_1M@LGPJHNJH@?$AAz?$AAu?$AA?9?$AAZ?$AAA?$AA?$AA@ 000000018002c150     libcpmt:winapinls.obj
- 0002:00004160       ??_C@_1M@HOKAOIO@?$AAa?$AAf?$AA?9?$AAZ?$AAA?$AA?$AA@ 000000018002c160     libcpmt:winapinls.obj
- 0002:00004170       ??_C@_1M@DPCLHLIE@?$AAk?$AAa?$AA?9?$AAG?$AAE?$AA?$AA@ 000000018002c170     libcpmt:winapinls.obj
- 0002:00004180       ??_C@_1M@BLKMHJBI@?$AAf?$AAo?$AA?9?$AAF?$AAO?$AA?$AA@ 000000018002c180     libcpmt:winapinls.obj
- 0002:00004190       ??_C@_1M@LGGJAPPB@?$AAh?$AAi?$AA?9?$AAI?$AAN?$AA?$AA@ 000000018002c190     libcpmt:winapinls.obj
- 0002:000041a0       ??_C@_1M@FIKPIHFE@?$AAm?$AAt?$AA?9?$AAM?$AAT?$AA?$AA@ 000000018002c1a0     libcpmt:winapinls.obj
- 0002:000041b0       ??_C@_1M@HEGGPBFA@?$AAs?$AAe?$AA?9?$AAN?$AAO?$AA?$AA@ 000000018002c1b0     libcpmt:winapinls.obj
- 0002:000041c0       ??_C@_1M@EIBJEEPA@?$AAm?$AAs?$AA?9?$AAM?$AAY?$AA?$AA@ 000000018002c1c0     libcpmt:winapinls.obj
- 0002:000041d0       ??_C@_1M@FHLBGMPP@?$AAk?$AAk?$AA?9?$AAK?$AAZ?$AA?$AA@ 000000018002c1d0     libcpmt:winapinls.obj
- 0002:000041e0       ??_C@_1M@NGJJLCGI@?$AAk?$AAy?$AA?9?$AAK?$AAG?$AA?$AA@ 000000018002c1e0     libcpmt:winapinls.obj
- 0002:000041f0       ??_C@_1M@GIENNBFC@?$AAs?$AAw?$AA?9?$AAK?$AAE?$AA?$AA@ 000000018002c1f0     libcpmt:winapinls.obj
- 0002:00004200       ??_C@_1BG@NDGMJIMJ@?$AAu?$AAz?$AA?9?$AAU?$AAZ?$AA?9?$AAL?$AAa?$AAt?$AAn?$AA?$AA@ 000000018002c200     libcpmt:winapinls.obj
- 0002:00004218       ??_C@_1M@IDCCIHBC@?$AAt?$AAt?$AA?9?$AAR?$AAU?$AA?$AA@ 000000018002c218     libcpmt:winapinls.obj
- 0002:00004228       ??_C@_1M@LOICPMOJ@?$AAb?$AAn?$AA?9?$AAI?$AAN?$AA?$AA@ 000000018002c228     libcpmt:winapinls.obj
- 0002:00004238       ??_C@_1M@KPKKNEAH@?$AAp?$AAa?$AA?9?$AAI?$AAN?$AA?$AA@ 000000018002c238     libcpmt:winapinls.obj
- 0002:00004248       ??_C@_1M@PJGPPBOG@?$AAg?$AAu?$AA?9?$AAI?$AAN?$AA?$AA@ 000000018002c248     libcpmt:winapinls.obj
- 0002:00004258       ??_C@_1M@KMKMOPHI@?$AAt?$AAa?$AA?9?$AAI?$AAN?$AA?$AA@ 000000018002c258     libcpmt:winapinls.obj
- 0002:00004268       ??_C@_1M@KFEHEPAC@?$AAt?$AAe?$AA?9?$AAI?$AAN?$AA?$AA@ 000000018002c268     libcpmt:winapinls.obj
- 0002:00004278       ??_C@_1M@CDCLMGHI@?$AAk?$AAn?$AA?9?$AAI?$AAN?$AA?$AA@ 000000018002c278     libcpmt:winapinls.obj
- 0002:00004288       ??_C@_1M@MIODLDKF@?$AAm?$AAl?$AA?9?$AAI?$AAN?$AA?$AA@ 000000018002c288     libcpmt:winapinls.obj
- 0002:00004298       ??_C@_1M@PBIEACPO@?$AAm?$AAr?$AA?9?$AAI?$AAN?$AA?$AA@ 000000018002c298     libcpmt:winapinls.obj
- 0002:000042a8       ??_C@_1M@NIDEAGPH@?$AAs?$AAa?$AA?9?$AAI?$AAN?$AA?$AA@ 000000018002c2a8     libcpmt:winapinls.obj
- 0002:000042b8       ??_C@_1M@FHIHCBIO@?$AAm?$AAn?$AA?9?$AAM?$AAN?$AA?$AA@ 000000018002c2b8     libcpmt:winapinls.obj
- 0002:000042c8       ??_C@_1M@JAIJPENP@?$AAc?$AAy?$AA?9?$AAG?$AAB?$AA?$AA@ 000000018002c2c8     libcpmt:winapinls.obj
- 0002:000042d8       ??_C@_1M@PHGFBEPN@?$AAg?$AAl?$AA?9?$AAE?$AAS?$AA?$AA@ 000000018002c2d8     libcpmt:winapinls.obj
- 0002:000042e8       ??_C@_1O@KPIPDNCP@?$AAk?$AAo?$AAk?$AA?9?$AAI?$AAN?$AA?$AA@ 000000018002c2e8     libcpmt:winapinls.obj
- 0002:000042f8       ??_C@_1O@KNHJLDJA@?$AAs?$AAy?$AAr?$AA?9?$AAS?$AAY?$AA?$AA@ 000000018002c2f8     libcpmt:winapinls.obj
- 0002:00004308       ??_C@_1O@MKEKBLAH@?$AAd?$AAi?$AAv?$AA?9?$AAM?$AAV?$AA?$AA@ 000000018002c308     libcpmt:winapinls.obj
- 0002:00004318       ??_C@_1O@OHDCKDDF@?$AAq?$AAu?$AAz?$AA?9?$AAB?$AAO?$AA?$AA@ 000000018002c318     libcpmt:winapinls.obj
- 0002:00004328       ??_C@_1M@LEPJNLFD@?$AAn?$AAs?$AA?9?$AAZ?$AAA?$AA?$AA@ 000000018002c328     libcpmt:winapinls.obj
- 0002:00004338       ??_C@_1M@OMLEIIJB@?$AAm?$AAi?$AA?9?$AAN?$AAZ?$AA?$AA@ 000000018002c338     libcpmt:winapinls.obj
- 0002:00004348       ??_C@_1M@PMPEAILG@?$AAa?$AAr?$AA?9?$AAI?$AAQ?$AA?$AA@ 000000018002c348     libcpmt:winapinls.obj
- 0002:00004358       ??_C@_1M@BIBDDEMK@?$AAz?$AAh?$AA?9?$AAC?$AAN?$AA?$AA@ 000000018002c358     libcpmt:winapinls.obj
- 0002:00004368       ??_C@_1M@CNKPNOEE@?$AAd?$AAe?$AA?9?$AAC?$AAH?$AA?$AA@ 000000018002c368     libcpmt:winapinls.obj
- 0002:00004378       ??_C@_1M@LKMGMLKO@?$AAe?$AAn?$AA?9?$AAG?$AAB?$AA?$AA@ 000000018002c378     libcpmt:winapinls.obj
- 0002:00004388       ??_C@_1M@PGKJFFGL@?$AAe?$AAs?$AA?9?$AAM?$AAX?$AA?$AA@ 000000018002c388     libcpmt:winapinls.obj
- 0002:00004398       ??_C@_1M@DNNANBDC@?$AAf?$AAr?$AA?9?$AAB?$AAE?$AA?$AA@ 000000018002c398     libcpmt:winapinls.obj
- 0002:000043a8       ??_C@_1M@HLGMDFHM@?$AAi?$AAt?$AA?9?$AAC?$AAH?$AA?$AA@ 000000018002c3a8     libcpmt:winapinls.obj
- 0002:000043b8       ??_C@_1M@CLLBGJH@?$AAn?$AAl?$AA?9?$AAB?$AAE?$AA?$AA@ 000000018002c3b8     libcpmt:winapinls.obj
- 0002:000043c8       ??_C@_1M@BODBOGLF@?$AAn?$AAn?$AA?9?$AAN?$AAO?$AA?$AA@ 000000018002c3c8     libcpmt:winapinls.obj
- 0002:000043d8       ??_C@_1M@HFFAHKAD@?$AAp?$AAt?$AA?9?$AAP?$AAT?$AA?$AA@ 000000018002c3d8     libcpmt:winapinls.obj
- 0002:000043e8       ??_C@_1BG@LNOAKHIE@?$AAs?$AAr?$AA?9?$AAS?$AAP?$AA?9?$AAL?$AAa?$AAt?$AAn?$AA?$AA@ 000000018002c3e8     libcpmt:winapinls.obj
- 0002:00004400       ??_C@_1M@HBMHBGAK@?$AAs?$AAv?$AA?9?$AAF?$AAI?$AA?$AA@ 000000018002c400     libcpmt:winapinls.obj
- 0002:00004410       ??_C@_1BG@DGCJGJBE@?$AAa?$AAz?$AA?9?$AAA?$AAZ?$AA?9?$AAC?$AAy?$AAr?$AAl?$AA?$AA@ 000000018002c410     libcpmt:winapinls.obj
- 0002:00004428       ??_C@_1M@KEJDAAHB@?$AAs?$AAe?$AA?9?$AAS?$AAE?$AA?$AA@ 000000018002c428     libcpmt:winapinls.obj
- 0002:00004438       ??_C@_1M@HEIBJJAD@?$AAm?$AAs?$AA?9?$AAB?$AAN?$AA?$AA@ 000000018002c438     libcpmt:winapinls.obj
- 0002:00004448       ??_C@_1BG@PBGJMCEM@?$AAu?$AAz?$AA?9?$AAU?$AAZ?$AA?9?$AAC?$AAy?$AAr?$AAl?$AA?$AA@ 000000018002c448     libcpmt:winapinls.obj
- 0002:00004460       ??_C@_1O@LAOBCMDF@?$AAq?$AAu?$AAz?$AA?9?$AAE?$AAC?$AA?$AA@ 000000018002c460     libcpmt:winapinls.obj
- 0002:00004470       ??_C@_1M@POEEMAIO@?$AAa?$AAr?$AA?9?$AAE?$AAG?$AA?$AA@ 000000018002c470     libcpmt:winapinls.obj
- 0002:00004480       ??_C@_1M@EFAKDEDL@?$AAz?$AAh?$AA?9?$AAH?$AAK?$AA?$AA@ 000000018002c480     libcpmt:winapinls.obj
- 0002:00004490       ??_C@_1M@HKKIJHGI@?$AAd?$AAe?$AA?9?$AAA?$AAT?$AA?$AA@ 000000018002c490     libcpmt:winapinls.obj
- 0002:000044a0       ??_C@_1M@KBFBEHJF@?$AAe?$AAn?$AA?9?$AAA?$AAU?$AA?$AA@ 000000018002c4a0     libcpmt:winapinls.obj
- 0002:000044b0       ??_C@_1M@MNPLFAAH@?$AAe?$AAs?$AA?9?$AAE?$AAS?$AA?$AA@ 000000018002c4b0     libcpmt:winapinls.obj
- 0002:000044c0       ??_C@_1M@HJOOJFMA@?$AAf?$AAr?$AA?9?$AAC?$AAA?$AA?$AA@ 000000018002c4c0     libcpmt:winapinls.obj
- 0002:000044d0       ??_C@_1BG@JPOFPNAB@?$AAs?$AAr?$AA?9?$AAS?$AAP?$AA?9?$AAC?$AAy?$AAr?$AAl?$AA?$AA@ 000000018002c4d0     libcpmt:winapinls.obj
- 0002:000044e8       ??_C@_1M@LNFOCMOB@?$AAs?$AAe?$AA?9?$AAF?$AAI?$AA?$AA@ 000000018002c4e8     libcpmt:winapinls.obj
- 0002:000044f8       ??_C@_1O@MGJBOAMB@?$AAq?$AAu?$AAz?$AA?9?$AAP?$AAE?$AA?$AA@ 000000018002c4f8     libcpmt:winapinls.obj
- 0002:00004508       ??_C@_1M@GJINLBOK@?$AAa?$AAr?$AA?9?$AAL?$AAY?$AA?$AA@ 000000018002c508     libcpmt:winapinls.obj
- 0002:00004518       ??_C@_1M@GGMNHJNL@?$AAz?$AAh?$AA?9?$AAS?$AAG?$AA?$AA@ 000000018002c518     libcpmt:winapinls.obj
- 0002:00004528       ??_C@_1M@HOIKODND@?$AAd?$AAe?$AA?9?$AAL?$AAU?$AA?$AA@ 000000018002c528     libcpmt:winapinls.obj
- 0002:00004538       ??_C@_1M@DDOCCGFG@?$AAe?$AAn?$AA?9?$AAC?$AAA?$AA?$AA@ 000000018002c538     libcpmt:winapinls.obj
- 0002:00004548       ??_C@_1M@BNOEMJLF@?$AAe?$AAs?$AA?9?$AAG?$AAT?$AA?$AA@ 000000018002c548     libcpmt:winapinls.obj
- 0002:00004558       ??_C@_1M@EOGNKEK@?$AAf?$AAr?$AA?9?$AAC?$AAH?$AA?$AA@ 000000018002c558     libcpmt:winapinls.obj
- 0002:00004568       ??_C@_1M@FLIDJFHL@?$AAh?$AAr?$AA?9?$AAB?$AAA?$AA?$AA@ 000000018002c568     libcpmt:winapinls.obj
- 0002:00004578       ??_C@_1O@FMCELNAJ@?$AAs?$AAm?$AAj?$AA?9?$AAN?$AAO?$AA?$AA@ 000000018002c578     libcpmt:winapinls.obj
- 0002:00004588       ??_C@_1M@JHGLJMGJ@?$AAa?$AAr?$AA?9?$AAD?$AAZ?$AA?$AA@ 000000018002c588     libcpmt:winapinls.obj
- 0002:00004598       ??_C@_1M@JKKFDCNP@?$AAz?$AAh?$AA?9?$AAM?$AAO?$AA?$AA@ 000000018002c598     libcpmt:winapinls.obj
- 0002:000045a8       ??_C@_1M@GEEFALPE@?$AAd?$AAe?$AA?9?$AAL?$AAI?$AA?$AA@ 000000018002c5a8     libcpmt:winapinls.obj
- 0002:000045b8       ??_C@_1M@IGEOFBG@?$AAe?$AAn?$AA?9?$AAN?$AAZ?$AA?$AA@ 000000018002c5b8     libcpmt:winapinls.obj
- 0002:000045c8       ??_C@_1M@KDBONEHP@?$AAe?$AAs?$AA?9?$AAC?$AAR?$AA?$AA@ 000000018002c5c8     libcpmt:winapinls.obj
- 0002:000045d8       ??_C@_1M@FHMDOHNN@?$AAf?$AAr?$AA?9?$AAL?$AAU?$AA?$AA@ 000000018002c5d8     libcpmt:winapinls.obj
- 0002:000045e8       ??_C@_1BG@NFKKMAFG@?$AAb?$AAs?$AA?9?$AAB?$AAA?$AA?9?$AAL?$AAa?$AAt?$AAn?$AA?$AA@ 000000018002c5e8     libcpmt:winapinls.obj
- 0002:00004600       ??_C@_1O@IMNBEMCI@?$AAs?$AAm?$AAj?$AA?9?$AAS?$AAE?$AA?$AA@ 000000018002c600     libcpmt:winapinls.obj
- 0002:00004610       ??_C@_1M@DHHMBNDP@?$AAa?$AAr?$AA?9?$AAM?$AAA?$AA?$AA@ 000000018002c610     libcpmt:winapinls.obj
- 0002:00004620       ??_C@_1M@BNBLJCGH@?$AAe?$AAn?$AA?9?$AAI?$AAE?$AA?$AA@ 000000018002c620     libcpmt:winapinls.obj
- 0002:00004630       ??_C@_1M@GEPAFMDL@?$AAe?$AAs?$AA?9?$AAP?$AAA?$AA?$AA@ 000000018002c630     libcpmt:winapinls.obj
- 0002:00004640       ??_C@_1M@OJONDMDL@?$AAf?$AAr?$AA?9?$AAM?$AAC?$AA?$AA@ 000000018002c640     libcpmt:winapinls.obj
- 0002:00004650       ??_C@_1BG@OBCNFJB@?$AAs?$AAr?$AA?9?$AAB?$AAA?$AA?9?$AAL?$AAa?$AAt?$AAn?$AA?$AA@ 000000018002c650     libcpmt:winapinls.obj
- 0002:00004668       ??_C@_1O@KEMEEGPO@?$AAs?$AAm?$AAa?$AA?9?$AAN?$AAO?$AA?$AA@ 000000018002c668     libcpmt:winapinls.obj
- 0002:00004678       ??_C@_1M@ELMGFODK@?$AAa?$AAr?$AA?9?$AAT?$AAN?$AA?$AA@ 000000018002c678     libcpmt:winapinls.obj
- 0002:00004688       ??_C@_1M@BHDLHFAF@?$AAe?$AAn?$AA?9?$AAZ?$AAA?$AA?$AA@ 000000018002c688     libcpmt:winapinls.obj
- 0002:00004698       ??_C@_1M@BMGIGLIF@?$AAe?$AAs?$AA?9?$AAD?$AAO?$AA?$AA@ 000000018002c698     libcpmt:winapinls.obj
- 0002:000046a8       ??_C@_1BG@CMBHIPBE@?$AAs?$AAr?$AA?9?$AAB?$AAA?$AA?9?$AAC?$AAy?$AAr?$AAl?$AA?$AA@ 000000018002c6a8     libcpmt:winapinls.obj
- 0002:000046c0       ??_C@_1O@HEDBLHNP@?$AAs?$AAm?$AAa?$AA?9?$AAS?$AAE?$AA?$AA@ 000000018002c6c0     libcpmt:winapinls.obj
- 0002:000046d0       ??_C@_1M@DAGCADIM@?$AAa?$AAr?$AA?9?$AAO?$AAM?$AA?$AA@ 000000018002c6d0     libcpmt:winapinls.obj
- 0002:000046e0       ??_C@_1M@FODLMICG@?$AAe?$AAn?$AA?9?$AAJ?$AAM?$AA?$AA@ 000000018002c6e0     libcpmt:winapinls.obj
- 0002:000046f0       ??_C@_1M@DNMLCIHB@?$AAe?$AAs?$AA?9?$AAV?$AAE?$AA?$AA@ 000000018002c6f0     libcpmt:winapinls.obj
- 0002:00004700       ??_C@_1O@EOKHMKJK@?$AAs?$AAm?$AAs?$AA?9?$AAF?$AAI?$AA?$AA@ 000000018002c700     libcpmt:winapinls.obj
- 0002:00004710       ??_C@_1M@CAFJMKOF@?$AAa?$AAr?$AA?9?$AAY?$AAE?$AA?$AA@ 000000018002c710     libcpmt:winapinls.obj
- 0002:00004720       ??_C@_1M@CBFHIJLI@?$AAe?$AAn?$AA?9?$AAC?$AAB?$AA?$AA@ 000000018002c720     libcpmt:winapinls.obj
- 0002:00004730       ??_C@_1M@BGNFLDN@?$AAe?$AAs?$AA?9?$AAC?$AAO?$AA?$AA@ 000000018002c730     libcpmt:winapinls.obj
- 0002:00004740       ??_C@_1O@JMPHMAMC@?$AAs?$AAm?$AAn?$AA?9?$AAF?$AAI?$AA?$AA@ 000000018002c740     libcpmt:winapinls.obj
- 0002:00004750       ??_C@_1M@JLANABKE@?$AAa?$AAr?$AA?9?$AAS?$AAY?$AA?$AA@ 000000018002c750     libcpmt:winapinls.obj
- 0002:00004760       ??_C@_1M@HPKGCFGN@?$AAe?$AAn?$AA?9?$AAB?$AAZ?$AA?$AA@ 000000018002c760     libcpmt:winapinls.obj
- 0002:00004770       ??_C@_1M@OLJCMLGM@?$AAe?$AAs?$AA?9?$AAP?$AAE?$AA?$AA@ 000000018002c770     libcpmt:winapinls.obj
- 0002:00004780       ??_C@_1M@MKKGFKLE@?$AAa?$AAr?$AA?9?$AAJ?$AAO?$AA?$AA@ 000000018002c780     libcpmt:winapinls.obj
- 0002:00004790       ??_C@_1M@EKPGLDNI@?$AAe?$AAn?$AA?9?$AAT?$AAT?$AA?$AA@ 000000018002c790     libcpmt:winapinls.obj
- 0002:000047a0       ??_C@_1M@OONGHFHE@?$AAe?$AAs?$AA?9?$AAA?$AAR?$AA?$AA@ 000000018002c7a0     libcpmt:winapinls.obj
- 0002:000047b0       ??_C@_1M@OOJFGBHE@?$AAa?$AAr?$AA?9?$AAL?$AAB?$AA?$AA@ 000000018002c7b0     libcpmt:winapinls.obj
- 0002:000047c0       ??_C@_1M@GCEJHNEG@?$AAe?$AAn?$AA?9?$AAZ?$AAW?$AA?$AA@ 000000018002c7c0     libcpmt:winapinls.obj
- 0002:000047d0       ??_C@_1M@JNOCAHJI@?$AAe?$AAs?$AA?9?$AAE?$AAC?$AA?$AA@ 000000018002c7d0     libcpmt:winapinls.obj
- 0002:000047e0       ??_C@_1M@JEFHPGGB@?$AAa?$AAr?$AA?9?$AAK?$AAW?$AA?$AA@ 000000018002c7e0     libcpmt:winapinls.obj
- 0002:000047f0       ??_C@_1M@MLKIBJOJ@?$AAe?$AAn?$AA?9?$AAP?$AAH?$AA?$AA@ 000000018002c7f0     libcpmt:winapinls.obj
- 0002:00004800       ??_C@_1M@BDNIPEND@?$AAe?$AAs?$AA?9?$AAC?$AAL?$AA?$AA@ 000000018002c800     libcpmt:winapinls.obj
- 0002:00004810       ??_C@_1M@MPNMEKBD@?$AAa?$AAr?$AA?9?$AAA?$AAE?$AA?$AA@ 000000018002c810     libcpmt:winapinls.obj
- 0002:00004820       ??_C@_1M@KBJALCPI@?$AAe?$AAs?$AA?9?$AAU?$AAY?$AA?$AA@ 000000018002c820     libcpmt:winapinls.obj
- 0002:00004830       ??_C@_1M@LLCCOAGA@?$AAa?$AAr?$AA?9?$AAB?$AAH?$AA?$AA@ 000000018002c830     libcpmt:winapinls.obj
- 0002:00004840       ??_C@_1M@PBFNCDEL@?$AAe?$AAs?$AA?9?$AAP?$AAY?$AA?$AA@ 000000018002c840     libcpmt:winapinls.obj
- 0002:00004850       ??_C@_1M@EDGINPNP@?$AAa?$AAr?$AA?9?$AAQ?$AAA?$AA?$AA@ 000000018002c850     libcpmt:winapinls.obj
- 0002:00004860       ??_C@_1M@MKDBIIJI@?$AAe?$AAs?$AA?9?$AAB?$AAO?$AA?$AA@ 000000018002c860     libcpmt:winapinls.obj
- 0002:00004870       ??_C@_1M@CPKKEBLD@?$AAe?$AAs?$AA?9?$AAS?$AAV?$AA?$AA@ 000000018002c870     libcpmt:winapinls.obj
- 0002:00004880       ??_C@_1M@NDBGMMJL@?$AAe?$AAs?$AA?9?$AAH?$AAN?$AA?$AA@ 000000018002c880     libcpmt:winapinls.obj
- 0002:00004890       ??_C@_1M@JIJIBHDP@?$AAe?$AAs?$AA?9?$AAN?$AAI?$AA?$AA@ 000000018002c890     libcpmt:winapinls.obj
- 0002:000048a0       ??_C@_1M@CGFMKEEK@?$AAe?$AAs?$AA?9?$AAP?$AAR?$AA?$AA@ 000000018002c8a0     libcpmt:winapinls.obj
- 0002:000048b0       ??_C@_1O@ICJHKIIK@?$AAz?$AAh?$AA?9?$AAC?$AAH?$AAT?$AA?$AA@ 000000018002c8b0     libcpmt:winapinls.obj
- 0002:000048c0       ??_C@_15CLNEJCE@?$AAs?$AAr?$AA?$AA@ 000000018002c8c0     libcpmt:winapinls.obj
- 0002:000048c8       ??_C@_1M@KAHEKEIG@?$AAa?$AAf?$AA?9?$AAz?$AAa?$AA?$AA@ 000000018002c8c8     libcpmt:winapinls.obj
- 0002:000048d8       ??_C@_1M@GIECOABL@?$AAa?$AAr?$AA?9?$AAa?$AAe?$AA?$AA@ 000000018002c8d8     libcpmt:winapinls.obj
- 0002:000048e8       ??_C@_1M@BMLMEKGI@?$AAa?$AAr?$AA?9?$AAb?$AAh?$AA?$AA@ 000000018002c8e8     libcpmt:winapinls.obj
- 0002:000048f8       ??_C@_1M@DAPFDGGB@?$AAa?$AAr?$AA?9?$AAd?$AAz?$AA?$AA@ 000000018002c8f8     libcpmt:winapinls.obj
- 0002:00004908       ??_C@_1M@FJNKGKIG@?$AAa?$AAr?$AA?9?$AAe?$AAg?$AA?$AA@ 000000018002c908     libcpmt:winapinls.obj
- 0002:00004918       ??_C@_1M@FLGKKCLO@?$AAa?$AAr?$AA?9?$AAi?$AAq?$AA?$AA@ 000000018002c918     libcpmt:winapinls.obj
- 0002:00004928       ??_C@_1M@GNDIPALM@?$AAa?$AAr?$AA?9?$AAj?$AAo?$AA?$AA@ 000000018002c928     libcpmt:winapinls.obj
- 0002:00004938       ??_C@_1M@DDMJFMGJ@?$AAa?$AAr?$AA?9?$AAk?$AAw?$AA?$AA@ 000000018002c938     libcpmt:winapinls.obj
- 0002:00004948       ??_C@_1M@EJALMLHM@?$AAa?$AAr?$AA?9?$AAl?$AAb?$AA?$AA@ 000000018002c948     libcpmt:winapinls.obj
- 0002:00004958       ??_C@_1M@MOBDBLOC@?$AAa?$AAr?$AA?9?$AAl?$AAy?$AA?$AA@ 000000018002c958     libcpmt:winapinls.obj
- 0002:00004968       ??_C@_1M@JAOCLHDH@?$AAa?$AAr?$AA?9?$AAm?$AAa?$AA?$AA@ 000000018002c968     libcpmt:winapinls.obj
- 0002:00004978       ??_C@_1M@JHPMKJIE@?$AAa?$AAr?$AA?9?$AAo?$AAm?$AA?$AA@ 000000018002c978     libcpmt:winapinls.obj
- 0002:00004988       ??_C@_1M@OEPGHFNH@?$AAa?$AAr?$AA?9?$AAq?$AAa?$AA?$AA@ 000000018002c988     libcpmt:winapinls.obj
- 0002:00004998       ??_C@_1M@KJDONENM@?$AAa?$AAr?$AA?9?$AAs?$AAa?$AA?$AA@ 000000018002c998     libcpmt:winapinls.obj
- 0002:000049a8       ??_C@_1M@DMJDKLKM@?$AAa?$AAr?$AA?9?$AAs?$AAy?$AA?$AA@ 000000018002c9a8     libcpmt:winapinls.obj
- 0002:000049b8       ??_C@_1M@OMFIPEDC@?$AAa?$AAr?$AA?9?$AAt?$AAn?$AA?$AA@ 000000018002c9b8     libcpmt:winapinls.obj
- 0002:000049c8       ??_C@_1M@IHMHGAON@?$AAa?$AAr?$AA?9?$AAy?$AAe?$AA?$AA@ 000000018002c9c8     libcpmt:winapinls.obj
- 0002:000049d8       ??_C@_1BG@KDCPGJGB@?$AAa?$AAz?$AA?9?$AAa?$AAz?$AA?9?$AAc?$AAy?$AAr?$AAl?$AA?$AA@ 000000018002c9d8     libcpmt:winapinls.obj
- 0002:000049f0       ??_C@_1BG@IBCKDDOE@?$AAa?$AAz?$AA?9?$AAa?$AAz?$AA?9?$AAl?$AAa?$AAt?$AAn?$AA?$AA@ 000000018002c9f0     libcpmt:winapinls.obj
- 0002:00004a08       ??_C@_1M@EGPFDCPD@?$AAb?$AAe?$AA?9?$AAb?$AAy?$AA?$AA@ 000000018002ca08     libcpmt:winapinls.obj
- 0002:00004a18       ??_C@_1M@PCMGMCGC@?$AAb?$AAg?$AA?9?$AAb?$AAg?$AA?$AA@ 000000018002ca18     libcpmt:winapinls.obj
- 0002:00004a28       ??_C@_1M@BJBMFGOB@?$AAb?$AAn?$AA?9?$AAi?$AAn?$AA?$AA@ 000000018002ca28     libcpmt:winapinls.obj
- 0002:00004a38       ??_C@_1BG@EAKMMACD@?$AAb?$AAs?$AA?9?$AAb?$AAa?$AA?9?$AAl?$AAa?$AAt?$AAn?$AA?$AA@ 000000018002ca38     libcpmt:winapinls.obj
- 0002:00004a50       ??_C@_1M@KGADAODK@?$AAc?$AAa?$AA?9?$AAe?$AAs?$AA?$AA@ 000000018002ca50     libcpmt:winapinls.obj
- 0002:00004a60       ??_C@_1M@COAJPDHI@?$AAc?$AAs?$AA?9?$AAc?$AAz?$AA?$AA@ 000000018002ca60     libcpmt:winapinls.obj
- 0002:00004a70       ??_C@_1M@DHBHFONH@?$AAc?$AAy?$AA?9?$AAg?$AAb?$AA?$AA@ 000000018002ca70     libcpmt:winapinls.obj
- 0002:00004a80       ??_C@_1M@IMGKELGA@?$AAd?$AAa?$AA?9?$AAd?$AAk?$AA?$AA@ 000000018002ca80     libcpmt:winapinls.obj
- 0002:00004a90       ??_C@_1M@NNDGDNGA@?$AAd?$AAe?$AA?9?$AAa?$AAt?$AA?$AA@ 000000018002ca90     libcpmt:winapinls.obj
- 0002:00004aa0       ??_C@_1M@IKDBHEEM@?$AAd?$AAe?$AA?9?$AAc?$AAh?$AA?$AA@ 000000018002caa0     libcpmt:winapinls.obj
- 0002:00004ab0       ??_C@_1M@GFFOJMCJ@?$AAd?$AAe?$AA?9?$AAd?$AAe?$AA?$AA@ 000000018002cab0     libcpmt:winapinls.obj
- 0002:00004ac0       ??_C@_1M@MDNLKBPM@?$AAd?$AAe?$AA?9?$AAl?$AAi?$AA?$AA@ 000000018002cac0     libcpmt:winapinls.obj
- 0002:00004ad0       ??_C@_1M@NJBEEJNL@?$AAd?$AAe?$AA?9?$AAl?$AAu?$AA?$AA@ 000000018002cad0     libcpmt:winapinls.obj
- 0002:00004ae0       ??_C@_1O@GNNELBAP@?$AAd?$AAi?$AAv?$AA?9?$AAm?$AAv?$AA?$AA@ 000000018002cae0     libcpmt:winapinls.obj
- 0002:00004af0       ??_C@_1M@EJLEOGAE@?$AAe?$AAl?$AA?9?$AAg?$AAr?$AA?$AA@ 000000018002caf0     libcpmt:winapinls.obj
- 0002:00004b00       ??_C@_1M@GMPONJN@?$AAe?$AAn?$AA?9?$AAa?$AAu?$AA?$AA@ 000000018002cb00     libcpmt:winapinls.obj
- 0002:00004b10       ??_C@_1M@NIDIIPGF@?$AAe?$AAn?$AA?9?$AAb?$AAz?$AA?$AA@ 000000018002cb10     libcpmt:winapinls.obj
- 0002:00004b20       ??_C@_1M@JEHMIMFO@?$AAe?$AAn?$AA?9?$AAc?$AAa?$AA?$AA@ 000000018002cb20     libcpmt:winapinls.obj
- 0002:00004b30       ??_C@_1M@IGMJCDLA@?$AAe?$AAn?$AA?9?$AAc?$AAb?$AA?$AA@ 000000018002cb30     libcpmt:winapinls.obj
- 0002:00004b40       ??_C@_1M@BNFIGBKG@?$AAe?$AAn?$AA?9?$AAg?$AAb?$AA?$AA@ 000000018002cb40     libcpmt:winapinls.obj
- 0002:00004b50       ??_C@_1M@LKIFDIGP@?$AAe?$AAn?$AA?9?$AAi?$AAe?$AA?$AA@ 000000018002cb50     libcpmt:winapinls.obj
- 0002:00004b60       ??_C@_1M@PJKFGCCO@?$AAe?$AAn?$AA?9?$AAj?$AAm?$AA?$AA@ 000000018002cb60     libcpmt:winapinls.obj
- 0002:00004b70       ??_C@_1M@KPPKEPBO@?$AAe?$AAn?$AA?9?$AAn?$AAz?$AA?$AA@ 000000018002cb70     libcpmt:winapinls.obj
- 0002:00004b80       ??_C@_1M@GMDGLDOB@?$AAe?$AAn?$AA?9?$AAp?$AAh?$AA?$AA@ 000000018002cb80     libcpmt:winapinls.obj
- 0002:00004b90       ??_C@_1M@ONGIBJNA@?$AAe?$AAn?$AA?9?$AAt?$AAt?$AA?$AA@ 000000018002cb90     libcpmt:winapinls.obj
- 0002:00004ba0       ??_C@_1M@LLODPCMM@?$AAe?$AAn?$AA?9?$AAu?$AAs?$AA?$AA@ 000000018002cba0     libcpmt:winapinls.obj
- 0002:00004bb0       ??_C@_1M@LAKFNPAN@?$AAe?$AAn?$AA?9?$AAz?$AAa?$AA?$AA@ 000000018002cbb0     libcpmt:winapinls.obj
- 0002:00004bc0       ??_C@_1M@MFNHNHEO@?$AAe?$AAn?$AA?9?$AAz?$AAw?$AA?$AA@ 000000018002cbc0     libcpmt:winapinls.obj
- 0002:00004bd0       ??_C@_1M@EJEINPHM@?$AAe?$AAs?$AA?9?$AAa?$AAr?$AA?$AA@ 000000018002cbd0     libcpmt:winapinls.obj
- 0002:00004be0       ??_C@_1M@GNKPCCJA@?$AAe?$AAs?$AA?9?$AAb?$AAo?$AA?$AA@ 000000018002cbe0     libcpmt:winapinls.obj
- 0002:00004bf0       ??_C@_1M@LEEGFONL@?$AAe?$AAs?$AA?9?$AAc?$AAl?$AA?$AA@ 000000018002cbf0     libcpmt:winapinls.obj
- 0002:00004c00       ??_C@_1M@KGPDPBDF@?$AAe?$AAs?$AA?9?$AAc?$AAo?$AA?$AA@ 000000018002cc00     libcpmt:winapinls.obj
- 0002:00004c10       ??_C@_1M@EIAHOHH@?$AAe?$AAs?$AA?9?$AAc?$AAr?$AA?$AA@ 000000018002cc10     libcpmt:winapinls.obj
- 0002:00004c20       ??_C@_1M@LLPGMBIN@?$AAe?$AAs?$AA?9?$AAd?$AAo?$AA?$AA@ 000000018002cc20     libcpmt:winapinls.obj
- 0002:00004c30       ??_C@_1M@DKHMKNJA@?$AAe?$AAs?$AA?9?$AAe?$AAc?$AA?$AA@ 000000018002cc30     libcpmt:winapinls.obj
- 0002:00004c40       ??_C@_1M@GKGFPKAP@?$AAe?$AAs?$AA?9?$AAe?$AAs?$AA?$AA@ 000000018002cc40     libcpmt:winapinls.obj
- 0002:00004c50       ??_C@_1M@LKHKGDLN@?$AAe?$AAs?$AA?9?$AAg?$AAt?$AA?$AA@ 000000018002cc50     libcpmt:winapinls.obj
- 0002:00004c60       ??_C@_1M@HEIIGGJD@?$AAe?$AAs?$AA?9?$AAh?$AAn?$AA?$AA@ 000000018002cc60     libcpmt:winapinls.obj
- 0002:00004c70       ??_C@_1M@FBDHPPGD@?$AAe?$AAs?$AA?9?$AAm?$AAx?$AA?$AA@ 000000018002cc70     libcpmt:winapinls.obj
- 0002:00004c80       ??_C@_1M@DPAGLNDH@?$AAe?$AAs?$AA?9?$AAn?$AAi?$AA?$AA@ 000000018002cc80     libcpmt:winapinls.obj
- 0002:00004c90       ??_C@_1M@MDGOPGDD@?$AAe?$AAs?$AA?9?$AAp?$AAa?$AA?$AA@ 000000018002cc90     libcpmt:winapinls.obj
- 0002:00004ca0       ??_C@_1M@EMAMGBGE@?$AAe?$AAs?$AA?9?$AAp?$AAe?$AA?$AA@ 000000018002cca0     libcpmt:winapinls.obj
- 0002:00004cb0       ??_C@_1M@IBMCAOEC@?$AAe?$AAs?$AA?9?$AAp?$AAr?$AA?$AA@ 000000018002ccb0     libcpmt:winapinls.obj
- 0002:00004cc0       ??_C@_1M@FGMDIJED@?$AAe?$AAs?$AA?9?$AAp?$AAy?$AA?$AA@ 000000018002ccc0     libcpmt:winapinls.obj
- 0002:00004cd0       ??_C@_1M@IIDEOLLL@?$AAe?$AAs?$AA?9?$AAs?$AAv?$AA?$AA@ 000000018002ccd0     libcpmt:winapinls.obj
- 0002:00004ce0       ??_C@_1M@GAOBIPA@?$AAe?$AAs?$AA?9?$AAu?$AAy?$AA?$AA@ 000000018002cce0     libcpmt:winapinls.obj
- 0002:00004cf0       _pRawDllMain               000000018002ccf0     LIBCMT:dll_dllmain.obj
- 0002:00004cf0       _pDefaultRawDllMain        000000018002ccf0     LIBCMT:dll_dllmain.obj
- 0002:00004d00       ??_7type_info@@6B@         000000018002cd00     LIBCMT:std_type_info_static.obj
- 0002:00004d20       ??_7bad_array_new_length@std@@6B@ 000000018002cd20     LIBCMT:throw_bad_alloc.obj
- 0002:00004d30       ??_C@_0BF@KINCDENJ@bad?5array?5new?5length?$AA@ 000000018002cd30     LIBCMT:throw_bad_alloc.obj
- 0002:00004d90       _pDestructExceptionObject  000000018002cd90     libvcruntime:frame.obj
- 0002:00004da0       ??_7bad_exception@std@@6B@ 000000018002cda0     libvcruntime:frame.obj
- 0002:00004db0       ??_C@_0O@DPKOEFFH@bad?5exception?$AA@ 000000018002cdb0     libvcruntime:frame.obj
- 0002:00004e78       ??_C@_1BC@DNHGCMLG@?$AAa?$AAd?$AAv?$AAa?$AAp?$AAi?$AA3?$AA2?$AA?$AA@ 000000018002ce78     libvcruntime:winapi_downlevel.obj
- 0002:00004e90       ??_C@_1DM@KHCHBNEB@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAf?$AAi?$AAb?$AAe?$AAr?$AAs?$AA?9?$AAl?$AA1?$AA?9?$AA1?$AA?9?$AA1?$AA?$AA@ 000000018002ce90     libvcruntime:winapi_downlevel.obj
- 0002:00004ed0       ??_C@_1DK@LPPGFMPP@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAs?$AAy?$AAn?$AAc?$AAh?$AA?9?$AAl?$AA1?$AA?9?$AA2?$AA?9?$AA0?$AA?$AA@ 000000018002ced0     libvcruntime:winapi_downlevel.obj
- 0002:00004f10       ??_C@_1BC@GDMECMAK@?$AAk?$AAe?$AAr?$AAn?$AAe?$AAl?$AA3?$AA2?$AA?$AA@ 000000018002cf10     libvcruntime:winapi_downlevel.obj
- 0002:00005270       ??_C@_08EHJDFFNH@__based?$CI?$AA@ 000000018002d270     libvcruntime:undname.obj
- 0002:00005280       ??_C@_07KOLFKCDI@__cdecl?$AA@ 000000018002d280     libvcruntime:undname.obj
- 0002:00005288       ??_C@_08GHMPAG@__pascal?$AA@ 000000018002d288     libvcruntime:undname.obj
- 0002:00005298       ??_C@_09IFJBGAPI@__stdcall?$AA@ 000000018002d298     libvcruntime:undname.obj
- 0002:000052a8       ??_C@_0L@NPHFGOKO@__thiscall?$AA@ 000000018002d2a8     libvcruntime:undname.obj
- 0002:000052b8       ??_C@_0L@JMKHOMEK@__fastcall?$AA@ 000000018002d2b8     libvcruntime:undname.obj
- 0002:000052c8       ??_C@_0N@BCKKPABJ@__vectorcall?$AA@ 000000018002d2c8     libvcruntime:undname.obj
- 0002:000052d8       ??_C@_09HIJEGCPM@__clrcall?$AA@ 000000018002d2d8     libvcruntime:undname.obj
- 0002:000052e4       ??_C@_06GHPCKEAG@__eabi?$AA@ 000000018002d2e4     libvcruntime:undname.obj
- 0002:000052f0       ??_C@_07JOMMBBKO@__ptr64?$AA@ 000000018002d2f0     libvcruntime:undname.obj
- 0002:000052f8       ??_C@_0L@PILCLIHE@__restrict?$AA@ 000000018002d2f8     libvcruntime:undname.obj
- 0002:00005308       ??_C@_0M@GFIIJFMG@__unaligned?$AA@ 000000018002d308     libvcruntime:undname.obj
- 0002:00005318       ??_C@_09DHDLOLLB@restrict?$CI?$AA@ 000000018002d318     libvcruntime:undname.obj
- 0002:00005324       ??_C@_04NIHEBCM@?5new?$AA@ 000000018002d324     libvcruntime:undname.obj
- 0002:00005330       ??_C@_07FPCDHGMM@?5delete?$AA@ 000000018002d330     libvcruntime:undname.obj
- 0002:00005338       ??_C@_01NEMOKFLO@?$DN?$AA@ 000000018002d338     libvcruntime:undname.obj
- 0002:0000533c       ??_C@_02GPIOPFAK@?$DO?$DO?$AA@ 000000018002d33c     libvcruntime:undname.obj
- 0002:00005340       ??_C@_02FODMEDOG@?$DM?$DM?$AA@ 000000018002d340     libvcruntime:undname.obj
- 0002:00005344       ??_C@_01DCLJPIOD@?$CB?$AA@ 000000018002d344     libvcruntime:undname.obj
- 0002:00005348       ??_C@_02EGOFBIJA@?$DN?$DN?$AA@ 000000018002d348     libvcruntime:undname.obj
- 0002:0000534c       ??_C@_02FDNJECIE@?$CB?$DN?$AA@ 000000018002d34c     libvcruntime:undname.obj
- 0002:00005350       ??_C@_02GPECMEKF@?$FL?$FN?$AA@ 000000018002d350     libvcruntime:undname.obj
- 0002:00005358       ??_C@_08LHJFAFGD@operator?$AA@ 000000018002d358     libvcruntime:undname.obj
- 0002:00005364       ??_C@_02HBOOOICD@?9?$DO?$AA@ 000000018002d364     libvcruntime:undname.obj
- 0002:00005368       ??_C@_02ECNGHCIF@?$CL?$CL?$AA@ 000000018002d368     libvcruntime:undname.obj
- 0002:0000536c       ??_C@_02BAABKJLB@?9?9?$AA@ 000000018002d36c     libvcruntime:undname.obj
- 0002:00005370       ??_C@_01MIFGBAGJ@?$CL?$AA@ 000000018002d370     libvcruntime:undname.obj
- 0002:00005374       ??_C@_01HNPIGOCE@?$CG?$AA@ 000000018002d374     libvcruntime:undname.obj
- 0002:00005378       ??_C@_03MNHNFDLC@?9?$DO?$CK?$AA@ 000000018002d378     libvcruntime:undname.obj
- 0002:0000537c       ??_C@_01KMDKNFGN@?1?$AA@   000000018002d37c     libvcruntime:undname.obj
- 0002:00005380       ??_C@_01FGNFDNOH@?$CF?$AA@ 000000018002d380     libvcruntime:undname.obj
- 0002:00005384       ??_C@_01MNNFJEPP@?$DM?$AA@ 000000018002d384     libvcruntime:undname.obj
- 0002:00005388       ??_C@_02EHCHHCKH@?$DM?$DN?$AA@ 000000018002d388     libvcruntime:undname.obj
- 0002:0000538c       ??_C@_01PPODPGHN@?$DO?$AA@ 000000018002d38c     libvcruntime:undname.obj
- 0002:00005390       ??_C@_02EEKDKGMJ@?$DO?$DN?$AA@ 000000018002d390     libvcruntime:undname.obj
- 0002:00005394       ??_C@_01IHBHIGKO@?0?$AA@   000000018002d394     libvcruntime:undname.obj
- 0002:00005398       ??_C@_02HCKGKOFO@?$CI?$CJ?$AA@ 000000018002d398     libvcruntime:undname.obj
- 0002:0000539c       ??_C@_01PJKLJHI@?$HO?$AA@  000000018002d39c     libvcruntime:undname.obj
- 0002:000053a0       ??_C@_01JKBOJNNK@?$FO?$AA@ 000000018002d3a0     libvcruntime:undname.obj
- 0002:000053a4       ??_C@_01DNKMNLPK@?$HM?$AA@ 000000018002d3a4     libvcruntime:undname.obj
- 0002:000053a8       ??_C@_02PPKAJPJL@?$CG?$CG?$AA@ 000000018002d3a8     libvcruntime:undname.obj
- 0002:000053ac       ??_C@_02NONPIBCD@?$HM?$HM?$AA@ 000000018002d3ac     libvcruntime:undname.obj
- 0002:000053b0       ??_C@_02FPIMKNGF@?$CK?$DN?$AA@ 000000018002d3b0     libvcruntime:undname.obj
- 0002:000053b4       ??_C@_02FOEOMHFC@?$CL?$DN?$AA@ 000000018002d3b4     libvcruntime:undname.obj
- 0002:000053b8       ??_C@_02FKMDLLOA@?9?$DN?$AA@ 000000018002d3b8     libvcruntime:undname.obj
- 0002:000053bc       ??_C@_02FJEHGPIO@?1?$DN?$AA@ 000000018002d3bc     libvcruntime:undname.obj
- 0002:000053c0       ??_C@_02FENAOKFI@?$CF?$DN?$AA@ 000000018002d3c0     libvcruntime:undname.obj
- 0002:000053c4       ??_C@_03IKFCCPFF@?$DO?$DO?$DN?$AA@ 000000018002d3c4     libvcruntime:undname.obj
- 0002:000053c8       ??_C@_03CDNPDDLA@?$DM?$DM?$DN?$AA@ 000000018002d3c8     libvcruntime:undname.obj
- 0002:000053cc       ??_C@_02FGJGFEAB@?$CG?$DN?$AA@ 000000018002d3cc     libvcruntime:undname.obj
- 0002:000053d0       ??_C@_02DHLNPPGH@?$HM?$DN?$AA@ 000000018002d3d0     libvcruntime:undname.obj
- 0002:000053d4       ??_C@_02MHEGNOJ@?$FO?$DN?$AA@ 000000018002d3d4     libvcruntime:undname.obj
- 0002:000053d8       ??_C@_09IFPLHPGF@?$GAvftable?8?$AA@ 000000018002d3d8     libvcruntime:undname.obj
- 0002:000053e8       ??_C@_09BLBHBJP@?$GAvbtable?8?$AA@ 000000018002d3e8     libvcruntime:undname.obj
- 0002:000053f8       ??_C@_07FEEIOKP@?$GAvcall?8?$AA@ 000000018002d3f8     libvcruntime:undname.obj
- 0002:00005400       ??_C@_08LLFFHHDJ@?$GAtypeof?8?$AA@ 000000018002d400     libvcruntime:undname.obj
- 0002:00005410       ??_C@_0BF@KDPPACIK@?$GAlocal?5static?5guard?8?$AA@ 000000018002d410     libvcruntime:undname.obj
- 0002:00005428       ??_C@_08OBABFOLI@?$GAstring?8?$AA@ 000000018002d428     libvcruntime:undname.obj
- 0002:00005438       ??_C@_0BD@JDLKDPAB@?$GAvbase?5destructor?8?$AA@ 000000018002d438     libvcruntime:undname.obj
- 0002:00005450       ??_C@_0BN@DEGPLNFK@?$GAvector?5deleting?5destructor?8?$AA@ 000000018002d450     libvcruntime:undname.obj
- 0002:00005470       ??_C@_0BO@OBMKPJIG@?$GAdefault?5constructor?5closure?8?$AA@ 000000018002d470     libvcruntime:undname.obj
- 0002:00005490       ??_C@_0BN@IMDCHIKM@?$GAscalar?5deleting?5destructor?8?$AA@ 000000018002d490     libvcruntime:undname.obj
- 0002:000054b0       ??_C@_0BO@PFGOCPJJ@?$GAvector?5constructor?5iterator?8?$AA@ 000000018002d4b0     libvcruntime:undname.obj
- 0002:000054d0       ??_C@_0BN@LFPFMEDL@?$GAvector?5destructor?5iterator?8?$AA@ 000000018002d4d0     libvcruntime:undname.obj
- 0002:000054f0       ??_C@_0CE@IKBNEHA@?$GAvector?5vbase?5constructor?5iterat@ 000000018002d4f0     libvcruntime:undname.obj
- 0002:00005518       ??_C@_0BL@NILFHHPC@?$GAvirtual?5displacement?5map?8?$AA@ 000000018002d518     libvcruntime:undname.obj
- 0002:00005538       ??_C@_0CB@JONCMFFK@?$GAeh?5vector?5constructor?5iterator?8@ 000000018002d538     libvcruntime:undname.obj
- 0002:00005560       ??_C@_0CA@GCEOPDGL@?$GAeh?5vector?5destructor?5iterator?8?$AA@ 000000018002d560     libvcruntime:undname.obj
- 0002:00005580       ??_C@_0CH@OOJPLCPH@?$GAeh?5vector?5vbase?5constructor?5ite@ 000000018002d580     libvcruntime:undname.obj
- 0002:000055a8       ??_C@_0BL@LLKPOHJI@?$GAcopy?5constructor?5closure?8?$AA@ 000000018002d5a8     libvcruntime:undname.obj
- 0002:000055c8       ??_C@_0BA@KBCDOMBN@?$GAudt?5returning?8?$AA@ 000000018002d5c8     libvcruntime:undname.obj
- 0002:000055d8       ??_C@_03KLGMFNMG@?$GAEH?$AA@ 000000018002d5d8     libvcruntime:undname.obj
- 0002:000055dc       ??_C@_05KHLCHHI@?$GARTTI?$AA@ 000000018002d5dc     libvcruntime:undname.obj
- 0002:000055e8       ??_C@_0BA@KKLDJDLB@?$GAlocal?5vftable?8?$AA@ 000000018002d5e8     libvcruntime:undname.obj
- 0002:000055f8       ??_C@_0CE@IIHCMGGL@?$GAlocal?5vftable?5constructor?5closu@ 000000018002d5f8     libvcruntime:undname.obj
- 0002:0000561c       ??_C@_06FHBGPFGH@?5new?$FL?$FN?$AA@ 000000018002d61c     libvcruntime:undname.obj
- 0002:00005628       ??_C@_09LBNFPBCA@?5delete?$FL?$FN?$AA@ 000000018002d628     libvcruntime:undname.obj
- 0002:00005638       ??_C@_0P@HJKNJFNN@?$GAomni?5callsig?8?$AA@ 000000018002d638     libvcruntime:undname.obj
- 0002:00005648       ??_C@_0BL@CNOONJFP@?$GAplacement?5delete?5closure?8?$AA@ 000000018002d648     libvcruntime:undname.obj
- 0002:00005668       ??_C@_0BN@CKNJLHMB@?$GAplacement?5delete?$FL?$FN?5closure?8?$AA@ 000000018002d668     libvcruntime:undname.obj
- 0002:00005688       ??_C@_0CG@CFDHKGGD@?$GAmanaged?5vector?5constructor?5iter@ 000000018002d688     libvcruntime:undname.obj
- 0002:000056b0       ??_C@_0CF@IMGKMJNO@?$GAmanaged?5vector?5destructor?5itera@ 000000018002d6b0     libvcruntime:undname.obj
- 0002:000056d8       ??_C@_0CG@HLDDJMAG@?$GAeh?5vector?5copy?5constructor?5iter@ 000000018002d6d8     libvcruntime:undname.obj
- 0002:00005700       ??_C@_0CM@FCBBDIGB@?$GAeh?5vector?5vbase?5copy?5constructo@ 000000018002d700     libvcruntime:undname.obj
- 0002:00005730       ??_C@_0BL@CLIPGLGB@?$GAdynamic?5initializer?5for?5?8?$AA@ 000000018002d730     libvcruntime:undname.obj
- 0002:00005750       ??_C@_0CB@PDBIFEP@?$GAdynamic?5atexit?5destructor?5for?5?8@ 000000018002d750     libvcruntime:undname.obj
- 0002:00005778       ??_C@_0CD@CGAJBKEJ@?$GAvector?5copy?5constructor?5iterato@ 000000018002d778     libvcruntime:undname.obj
- 0002:000057a0       ??_C@_0CJ@GJELGAMM@?$GAvector?5vbase?5copy?5constructor?5i@ 000000018002d7a0     libvcruntime:undname.obj
- 0002:000057d0       ??_C@_0CL@FGIJHLCE@?$GAmanaged?5vector?5copy?5constructor@ 000000018002d7d0     libvcruntime:undname.obj
- 0002:00005800       ??_C@_0BM@PMGGMLDN@?$GAlocal?5static?5thread?5guard?8?$AA@ 000000018002d800     libvcruntime:undname.obj
- 0002:00005820       ??_C@_0N@BDNMDMOL@operator?5?$CC?$CC?5?$AA@ 000000018002d820     libvcruntime:undname.obj
- 0002:00005830       ??_C@_0BC@DAFEJGAK@?5Type?5Descriptor?8?$AA@ 000000018002d830     libvcruntime:undname.obj
- 0002:00005848       ??_C@_0BM@LDKODKLH@?5Base?5Class?5Descriptor?5at?5?$CI?$AA@ 000000018002d848     libvcruntime:undname.obj
- 0002:00005868       ??_C@_0BD@LGICGFMM@?5Base?5Class?5Array?8?$AA@ 000000018002d868     libvcruntime:undname.obj
- 0002:00005880       ??_C@_0BN@MECKDCOJ@?5Class?5Hierarchy?5Descriptor?8?$AA@ 000000018002d880     libvcruntime:undname.obj
- 0002:000058a0       ??_C@_0BK@CFCOFLF@?5Complete?5Object?5Locator?8?$AA@ 000000018002d8a0     libvcruntime:undname.obj
- 0002:000058c0       format_validation_lookup_table 000000018002d8c0     libucrt:output.obj
- 0002:0000591c       ??_C@_06OJHGLDPL@?$CInull?$CJ?$AA@ 000000018002d91c     libucrt:output.obj
- 0002:00005928       ??_C@_1O@CEDCILHN@?$AA?$CI?$AAn?$AAu?$AAl?$AAl?$AA?$CJ?$AA?$AA@ 000000018002d928     libucrt:output.obj
- 0002:00005938       __real@0000000000000000    000000018002d938     libucrt:frexp.obj
- 0002:00005940       __real@3ff0000000000000    000000018002d940     libucrt:frexp.obj
- 0002:00005948       __real@8000000000000000    000000018002d948     libucrt:frexp.obj
- 0002:00005950       __newctype                 000000018002d950     libucrt:ctype.obj
- 0002:00005c50       __newclmap                 000000018002dc50     libucrt:ctype.obj
- 0002:00005dd0       __newcumap                 000000018002ddd0     libucrt:ctype.obj
- 0002:00005f50       _wctype                    000000018002df50     libucrt:ctype.obj
- 0002:000062d0       ?large_power_data@?1??multiply_by_power_of_ten@__crt_strtox@@YA_NAEAUbig_integer@2@I@Z@4QBIB 000000018002e2d0     libucrt:strtod.obj
- 0002:00006be0       ?large_power_indices@?1??multiply_by_power_of_ten@__crt_strtox@@YA_NAEAUbig_integer@2@I@Z@4QBUunpack_index@?1??12@YA_N0I@Z@B 000000018002ebe0     libucrt:strtod.obj
- 0002:00006c78       ?small_powers_of_ten@?6??multiply_by_power_of_ten@__crt_strtox@@YA_NAEAUbig_integer@2@I@Z@4QBIB 000000018002ec78     libucrt:strtod.obj
- 0002:00008950       __acrt_exception_action_table 0000000180030950     libucrt:exception_filter.obj
- 0002:00008a10       __acrt_signal_action_table_count 0000000180030a10     libucrt:exception_filter.obj
- 0002:00008a18       __acrt_signal_action_first_fpe_index 0000000180030a18     libucrt:exception_filter.obj
- 0002:00008a20       __acrt_signal_action_fpe_count 0000000180030a20     libucrt:exception_filter.obj
- 0002:00008a28       ??_C@_1BI@BGOHAHKC@?$AAm?$AAs?$AAc?$AAo?$AAr?$AAe?$AAe?$AA?4?$AAd?$AAl?$AAl?$AA?$AA@ 0000000180030a28     libucrt:exit.obj
- 0002:00008a40       ??_C@_0P@MIGLKIOC@CorExitProcess?$AA@ 0000000180030a40     libucrt:exit.obj
- 0002:00008b40       ??_C@_03OEIAHPBN@INF?$AA@  0000000180030b40     libucrt:cvt.obj
- 0002:00008b44       ??_C@_03OJHLLCGB@inf?$AA@  0000000180030b44     libucrt:cvt.obj
- 0002:00008b48       ??_C@_03LKNCIKJB@NAN?$AA@  0000000180030b48     libucrt:cvt.obj
- 0002:00008b4c       ??_C@_03LHCJEHON@nan?$AA@  0000000180030b4c     libucrt:cvt.obj
- 0002:00008b50       ??_C@_09OFJJIMPC@NAN?$CISNAN?$CJ?$AA@ 0000000180030b50     libucrt:cvt.obj
- 0002:00008b60       ??_C@_09IPFBKMDL@nan?$CIsnan?$CJ?$AA@ 0000000180030b60     libucrt:cvt.obj
- 0002:00008b70       ??_C@_08IKHNHAJ@NAN?$CIIND?$CJ?$AA@ 0000000180030b70     libucrt:cvt.obj
- 0002:00008b80       ??_C@_08OFCDMILK@nan?$CIind?$CJ?$AA@ 0000000180030b80     libucrt:cvt.obj
- 0002:00008b8c       ??_C@_05KLBDPFGC@e?$CL000?$AA@ 0000000180030b8c     libucrt:cvt.obj
- 0002:00008ba0       __lc_category              0000000180030ba0     libucrt:wsetlocale.obj
- 0002:00008c30       ??_C@_1O@GIFLHMA@?$AAL?$AAC?$AA_?$AAA?$AAL?$AAL?$AA?$AA@ 0000000180030c30     libucrt:wsetlocale.obj
- 0002:00008c40       ??_C@_1BG@PPOMIBNJ@?$AAL?$AAC?$AA_?$AAC?$AAO?$AAL?$AAL?$AAA?$AAT?$AAE?$AA?$AA@ 0000000180030c40     libucrt:wsetlocale.obj
- 0002:00008c58       ??_C@_1BC@FFJGAPJM@?$AAL?$AAC?$AA_?$AAC?$AAT?$AAY?$AAP?$AAE?$AA?$AA@ 0000000180030c58     libucrt:wsetlocale.obj
- 0002:00008c70       ??_C@_1BI@PCKFNJFB@?$AAL?$AAC?$AA_?$AAM?$AAO?$AAN?$AAE?$AAT?$AAA?$AAR?$AAY?$AA?$AA@ 0000000180030c70     libucrt:wsetlocale.obj
- 0002:00008c88       ??_C@_1BG@ENIEDKID@?$AAL?$AAC?$AA_?$AAN?$AAU?$AAM?$AAE?$AAR?$AAI?$AAC?$AA?$AA@ 0000000180030c88     libucrt:wsetlocale.obj
- 0002:00008ca0       ??_C@_1BA@HAAOMIIG@?$AAL?$AAC?$AA_?$AAT?$AAI?$AAM?$AAE?$AA?$AA@ 0000000180030ca0     libucrt:wsetlocale.obj
- 0002:00008d30       ??_C@_15NBPDDFIP@?$AA?$DN?$AA?$DL?$AA?$AA@ 0000000180030d30     libucrt:wsetlocale.obj
- 0002:00008d38       ??_C@_13PJJBFPED@?$AA?$DL?$AA?$AA@ 0000000180030d38     libucrt:wsetlocale.obj
- 0002:00008d3c       ??_C@_13NMPKAAJP@?$AA?$DN?$AA?$AA@ 0000000180030d3c     libucrt:wsetlocale.obj
- 0002:00008d40       ??_C@_13FHBKNHDA@?$AAC?$AA?$AA@ 0000000180030d40     libucrt:wsetlocale.obj
- 0002:00008d48       ??_C@_17MBJJLFDM@?$AA_?$AA?4?$AA?0?$AA?$AA@ 0000000180030d48     libucrt:wsetlocale.obj
- 0002:00008d50       ??_C@_13ENNFDPBH@?$AA_?$AA?$AA@ 0000000180030d50     libucrt:wsetlocale.obj
- 0002:00008d54       ??_C@_13JOFGPIOO@?$AA?4?$AA?$AA@ 0000000180030d54     libucrt:wsetlocale.obj
- 0002:00008d60       __lc_time_c                0000000180030d60     libucrt:nlsdata.obj
- 0002:00009020       ??_C@_03KOEHGMDN@Sun?$AA@  0000000180031020     libucrt:nlsdata.obj
- 0002:00009024       ??_C@_03PDAGKDH@Mon?$AA@   0000000180031024     libucrt:nlsdata.obj
- 0002:00009028       ??_C@_03NAGEINEP@Tue?$AA@  0000000180031028     libucrt:nlsdata.obj
- 0002:0000902c       ??_C@_03MHOMLAJA@Wed?$AA@  000000018003102c     libucrt:nlsdata.obj
- 0002:00009030       ??_C@_03IOFIKPDN@Thu?$AA@  0000000180031030     libucrt:nlsdata.obj
- 0002:00009034       ??_C@_03IDIOELNC@Fri?$AA@  0000000180031034     libucrt:nlsdata.obj
- 0002:00009038       ??_C@_03FEFJNEK@Sat?$AA@   0000000180031038     libucrt:nlsdata.obj
- 0002:0000903c       ??_C@_06OOPIFAJ@Sunday?$AA@ 000000018003103c     libucrt:nlsdata.obj
- 0002:00009044       ??_C@_06JLEDEDGH@Monday?$AA@ 0000000180031044     libucrt:nlsdata.obj
- 0002:00009050       ??_C@_07BAAGCFCM@Tuesday?$AA@ 0000000180031050     libucrt:nlsdata.obj
- 0002:00009058       ??_C@_09DLIGFAKA@Wednesday?$AA@ 0000000180031058     libucrt:nlsdata.obj
- 0002:00009068       ??_C@_08HACCIKIA@Thursday?$AA@ 0000000180031068     libucrt:nlsdata.obj
- 0002:00009074       ??_C@_06JECMNKMI@Friday?$AA@ 0000000180031074     libucrt:nlsdata.obj
- 0002:00009080       ??_C@_08INBOOONO@Saturday?$AA@ 0000000180031080     libucrt:nlsdata.obj
- 0002:0000908c       ??_C@_03JIHJHPIE@Jan?$AA@  000000018003108c     libucrt:nlsdata.obj
- 0002:00009090       ??_C@_03HJBDCHOM@Feb?$AA@  0000000180031090     libucrt:nlsdata.obj
- 0002:00009094       ??_C@_03ODNJBKGA@Mar?$AA@  0000000180031094     libucrt:nlsdata.obj
- 0002:00009098       ??_C@_03LEOLGMJP@Apr?$AA@  0000000180031098     libucrt:nlsdata.obj
- 0002:0000909c       ??_C@_03CNMDKL@May?$AA@    000000018003109c     libucrt:nlsdata.obj
- 0002:000090a0       ??_C@_03IDFGHECI@Jun?$AA@  00000001800310a0     libucrt:nlsdata.obj
- 0002:000090a4       ??_C@_03LBGABGKK@Jul?$AA@  00000001800310a4     libucrt:nlsdata.obj
- 0002:000090a8       ??_C@_03IFJFEIGA@Aug?$AA@  00000001800310a8     libucrt:nlsdata.obj
- 0002:000090ac       ??_C@_03GGCAPAJC@Sep?$AA@  00000001800310ac     libucrt:nlsdata.obj
- 0002:000090b0       ??_C@_03BMAOKBAD@Oct?$AA@  00000001800310b0     libucrt:nlsdata.obj
- 0002:000090b4       ??_C@_03JPJOFNIA@Nov?$AA@  00000001800310b4     libucrt:nlsdata.obj
- 0002:000090b8       ??_C@_03MKABNOCG@Dec?$AA@  00000001800310b8     libucrt:nlsdata.obj
- 0002:000090c0       ??_C@_07CGJPFGJA@January?$AA@ 00000001800310c0     libucrt:nlsdata.obj
- 0002:000090c8       ??_C@_08GNJGEPFN@February?$AA@ 00000001800310c8     libucrt:nlsdata.obj
- 0002:000090d4       ??_C@_05HPCKOFNC@March?$AA@ 00000001800310d4     libucrt:nlsdata.obj
- 0002:000090dc       ??_C@_05DMJDNLEJ@April?$AA@ 00000001800310dc     libucrt:nlsdata.obj
- 0002:000090e4       ??_C@_04CNLMGBGM@June?$AA@ 00000001800310e4     libucrt:nlsdata.obj
- 0002:000090ec       ??_C@_04MIEPOIFP@July?$AA@ 00000001800310ec     libucrt:nlsdata.obj
- 0002:000090f4       ??_C@_06LBBHFDDG@August?$AA@ 00000001800310f4     libucrt:nlsdata.obj
- 0002:00009100       ??_C@_09BHHEALKD@September?$AA@ 0000000180031100     libucrt:nlsdata.obj
- 0002:00009110       ??_C@_07JJNFCEND@October?$AA@ 0000000180031110     libucrt:nlsdata.obj
- 0002:00009118       ??_C@_08HCHEGEOA@November?$AA@ 0000000180031118     libucrt:nlsdata.obj
- 0002:00009128       ??_C@_08EDHMEBNP@December?$AA@ 0000000180031128     libucrt:nlsdata.obj
- 0002:00009134       ??_C@_02DEDBPAFC@AM?$AA@   0000000180031134     libucrt:nlsdata.obj
- 0002:00009138       ??_C@_02CJNFDJBF@PM?$AA@   0000000180031138     libucrt:nlsdata.obj
- 0002:00009140       ??_C@_08BPBNCDIB@MM?1dd?1yy?$AA@ 0000000180031140     libucrt:nlsdata.obj
- 0002:00009150       ??_C@_0BE@CKGJFCPC@dddd?0?5MMMM?5dd?0?5yyyy?$AA@ 0000000180031150     libucrt:nlsdata.obj
- 0002:00009168       ??_C@_08JCCMCCIL@HH?3mm?3ss?$AA@ 0000000180031168     libucrt:nlsdata.obj
- 0002:00009178       ??_C@_17MBGCMIPB@?$AAS?$AAu?$AAn?$AA?$AA@ 0000000180031178     libucrt:nlsdata.obj
- 0002:00009180       ??_C@_17KBOMKBF@?$AAM?$AAo?$AAn?$AA?$AA@ 0000000180031180     libucrt:nlsdata.obj
- 0002:00009188       ??_C@_17BMKGEGOJ@?$AAT?$AAu?$AAe?$AA?$AA@ 0000000180031188     libucrt:nlsdata.obj
- 0002:00009190       ??_C@_17CJEDCEPE@?$AAW?$AAe?$AAd?$AA?$AA@ 0000000180031190     libucrt:nlsdata.obj
- 0002:00009198       ??_C@_17PDPHAADD@?$AAT?$AAh?$AAu?$AA?$AA@ 0000000180031198     libucrt:nlsdata.obj
- 0002:000091a0       ??_C@_17HFOLPPLP@?$AAF?$AAr?$AAi?$AA?$AA@ 00000001800311a0     libucrt:nlsdata.obj
- 0002:000091a8       ??_C@_17GGIBDPIH@?$AAS?$AAa?$AAt?$AA?$AA@ 00000001800311a8     libucrt:nlsdata.obj
- 0002:000091b0       ??_C@_1O@IHNHDHPB@?$AAS?$AAu?$AAn?$AAd?$AAa?$AAy?$AA?$AA@ 00000001800311b0     libucrt:nlsdata.obj
- 0002:000091c0       ??_C@_1O@MMNBFLIA@?$AAM?$AAo?$AAn?$AAd?$AAa?$AAy?$AA?$AA@ 00000001800311c0     libucrt:nlsdata.obj
- 0002:000091d0       ??_C@_1BA@ENFBFFEK@?$AAT?$AAu?$AAe?$AAs?$AAd?$AAa?$AAy?$AA?$AA@ 00000001800311d0     libucrt:nlsdata.obj
- 0002:000091e0       ??_C@_1BE@EBOGMDOH@?$AAW?$AAe?$AAd?$AAn?$AAe?$AAs?$AAd?$AAa?$AAy?$AA?$AA@ 00000001800311e0     libucrt:nlsdata.obj
- 0002:000091f8       ??_C@_1BC@HHMNLIHE@?$AAT?$AAh?$AAu?$AAr?$AAs?$AAd?$AAa?$AAy?$AA?$AA@ 00000001800311f8     libucrt:nlsdata.obj
- 0002:00009210       ??_C@_1O@PDICJHAG@?$AAF?$AAr?$AAi?$AAd?$AAa?$AAy?$AA?$AA@ 0000000180031210     libucrt:nlsdata.obj
- 0002:00009220       ??_C@_1BC@ENMNNPAJ@?$AAS?$AAa?$AAt?$AAu?$AAr?$AAd?$AAa?$AAy?$AA?$AA@ 0000000180031220     libucrt:nlsdata.obj
- 0002:00009238       ??_C@_17DKNBKCHM@?$AAJ?$AAa?$AAn?$AA?$AA@ 0000000180031238     libucrt:nlsdata.obj
- 0002:00009240       ??_C@_17LMDJEKJN@?$AAF?$AAe?$AAb?$AA?$AA@ 0000000180031240     libucrt:nlsdata.obj
- 0002:00009248       ??_C@_17CKNLEDEC@?$AAM?$AAa?$AAr?$AA?$AA@ 0000000180031248     libucrt:nlsdata.obj
- 0002:00009250       ??_C@_17LFPOIHDD@?$AAA?$AAp?$AAr?$AA?$AA@ 0000000180031250     libucrt:nlsdata.obj
- 0002:00009258       ??_C@_17PNNKMEED@?$AAM?$AAa?$AAy?$AA?$AA@ 0000000180031258     libucrt:nlsdata.obj
- 0002:00009260       ??_C@_17KCJGOCPB@?$AAJ?$AAu?$AAn?$AA?$AA@ 0000000180031260     libucrt:nlsdata.obj
- 0002:00009268       ??_C@_17IJPCKHK@?$AAJ?$AAu?$AAl?$AA?$AA@ 0000000180031268     libucrt:nlsdata.obj
- 0002:00009270       ??_C@_17ICPELBCN@?$AAA?$AAu?$AAg?$AA?$AA@ 0000000180031270     libucrt:nlsdata.obj
- 0002:00009278       ??_C@_17HCHCOKMG@?$AAS?$AAe?$AAp?$AA?$AA@ 0000000180031278     libucrt:nlsdata.obj
- 0002:00009280       ??_C@_17FNLKOI@?$AAO?$AAc?$AAt?$AA?$AA@ 0000000180031280     libucrt:nlsdata.obj
- 0002:00009288       ??_C@_17BBDMLCIG@?$AAN?$AAo?$AAv?$AA?$AA@ 0000000180031288     libucrt:nlsdata.obj
- 0002:00009290       ??_C@_17EGKACKIF@?$AAD?$AAe?$AAc?$AA?$AA@ 0000000180031290     libucrt:nlsdata.obj
- 0002:00009298       ??_C@_1BA@EFMEIEBA@?$AAJ?$AAa?$AAn?$AAu?$AAa?$AAr?$AAy?$AA?$AA@ 0000000180031298     libucrt:nlsdata.obj
- 0002:000092a8       ??_C@_1BC@JGDDFFAM@?$AAF?$AAe?$AAb?$AAr?$AAu?$AAa?$AAr?$AAy?$AA?$AA@ 00000001800312a8     libucrt:nlsdata.obj
- 0002:000092c0       ??_C@_1M@IKEENEDF@?$AAM?$AAa?$AAr?$AAc?$AAh?$AA?$AA@ 00000001800312c0     libucrt:nlsdata.obj
- 0002:000092d0       ??_C@_1M@GJNLMHFD@?$AAA?$AAp?$AAr?$AAi?$AAl?$AA?$AA@ 00000001800312d0     libucrt:nlsdata.obj
- 0002:000092e0       ??_C@_19EPFLPGAP@?$AAJ?$AAu?$AAn?$AAe?$AA?$AA@ 00000001800312e0     libucrt:nlsdata.obj
- 0002:000092f0       ??_C@_19BIFMLPCD@?$AAJ?$AAu?$AAl?$AAy?$AA?$AA@ 00000001800312f0     libucrt:nlsdata.obj
- 0002:00009300       ??_C@_1O@PAHLKOAC@?$AAA?$AAu?$AAg?$AAu?$AAs?$AAt?$AA?$AA@ 0000000180031300     libucrt:nlsdata.obj
- 0002:00009310       ??_C@_1BE@DKAAMBJL@?$AAS?$AAe?$AAp?$AAt?$AAe?$AAm?$AAb?$AAe?$AAr?$AA?$AA@ 0000000180031310     libucrt:nlsdata.obj
- 0002:00009328       ??_C@_1BA@EPANDLNG@?$AAO?$AAc?$AAt?$AAo?$AAb?$AAe?$AAr?$AA?$AA@ 0000000180031328     libucrt:nlsdata.obj
- 0002:00009338       ??_C@_1BC@BGLIFPF@?$AAN?$AAo?$AAv?$AAe?$AAm?$AAb?$AAe?$AAr?$AA?$AA@ 0000000180031338     libucrt:nlsdata.obj
- 0002:00009350       ??_C@_1BC@FEMKIFH@?$AAD?$AAe?$AAc?$AAe?$AAm?$AAb?$AAe?$AAr?$AA?$AA@ 0000000180031350     libucrt:nlsdata.obj
- 0002:00009364       ??_C@_15ODEHAHHF@?$AAA?$AAM?$AA?$AA@ 0000000180031364     libucrt:nlsdata.obj
- 0002:0000936c       ??_C@_15CLMNNGEL@?$AAP?$AAM?$AA?$AA@ 000000018003136c     libucrt:nlsdata.obj
- 0002:00009378       ??_C@_1BC@IEBCMHCM@?$AAM?$AAM?$AA?1?$AAd?$AAd?$AA?1?$AAy?$AAy?$AA?$AA@ 0000000180031378     libucrt:nlsdata.obj
- 0002:00009390       ??_C@_1CI@KNAKOEBC@?$AAd?$AAd?$AAd?$AAd?$AA?0?$AA?5?$AAM?$AAM?$AAM?$AAM?$AA?5?$AAd?$AAd?$AA?0?$AA?5?$AAy?$AAy?$AAy?$AAy?$AA?$AA@ 0000000180031390     libucrt:nlsdata.obj
- 0002:000093b8       ??_C@_1BC@GDGBMEMK@?$AAH?$AAH?$AA?3?$AAm?$AAm?$AA?3?$AAs?$AAs?$AA?$AA@ 00000001800313b8     libucrt:nlsdata.obj
- 0002:000095a0       ??_C@_03KHJOGHMM@exp?$AA@  00000001800315a0     libucrt:fpexcept.obj
- 0002:000095a4       ??_C@_03JGHBODFD@pow?$AA@  00000001800315a4     libucrt:fpexcept.obj
- 0002:000095a8       ??_C@_03MGHMBJCF@log?$AA@  00000001800315a8     libucrt:fpexcept.obj
- 0002:000095ac       ??_C@_05HGHHAHAP@log10?$AA@ 00000001800315ac     libucrt:fpexcept.obj
- 0002:000095b4       ??_C@_04COOMCNPB@sinh?$AA@ 00000001800315b4     libucrt:fpexcept.obj
- 0002:000095bc       ??_C@_04HPJJNFIM@cosh?$AA@ 00000001800315bc     libucrt:fpexcept.obj
- 0002:000095c4       ??_C@_04FJHINJAO@tanh?$AA@ 00000001800315c4     libucrt:fpexcept.obj
- 0002:000095cc       ??_C@_04FIHNOPOL@asin?$AA@ 00000001800315cc     libucrt:fpexcept.obj
- 0002:000095d4       ??_C@_04PDIFKINK@acos?$AA@ 00000001800315d4     libucrt:fpexcept.obj
- 0002:000095dc       ??_C@_04MLLJIGOK@atan?$AA@ 00000001800315dc     libucrt:fpexcept.obj
- 0002:000095e4       ??_C@_05KNGEOGJB@atan2?$AA@ 00000001800315e4     libucrt:fpexcept.obj
- 0002:000095ec       ??_C@_04EIAKFFMI@sqrt?$AA@ 00000001800315ec     libucrt:fpexcept.obj
- 0002:000095f4       ??_C@_03BLEJJJBH@sin?$AA@  00000001800315f4     libucrt:fpexcept.obj
- 0002:000095f8       ??_C@_03LALBNOCG@cos?$AA@  00000001800315f8     libucrt:fpexcept.obj
- 0002:000095fc       ??_C@_03IIINPABG@tan?$AA@  00000001800315fc     libucrt:fpexcept.obj
- 0002:00009600       ??_C@_04GFPJNGEK@ceil?$AA@ 0000000180031600     libucrt:fpexcept.obj
- 0002:00009608       ??_C@_05PBJFFIGL@floor?$AA@ 0000000180031608     libucrt:fpexcept.obj
- 0002:00009610       ??_C@_04ODHECPBC@fabs?$AA@ 0000000180031610     libucrt:fpexcept.obj
- 0002:00009618       ??_C@_04EHEDPDJG@modf?$AA@ 0000000180031618     libucrt:fpexcept.obj
- 0002:00009620       ??_C@_05CEJMAHNP@ldexp?$AA@ 0000000180031620     libucrt:fpexcept.obj
- 0002:00009628       ??_C@_05KBKMEMPO@_cabs?$AA@ 0000000180031628     libucrt:fpexcept.obj
- 0002:00009630       ??_C@_06MEIMCGCF@_hypot?$AA@ 0000000180031630     libucrt:fpexcept.obj
- 0002:00009638       ??_C@_04KEPJIHGP@fmod?$AA@ 0000000180031638     libucrt:fpexcept.obj
- 0002:00009640       ??_C@_05GKKHEGJL@frexp?$AA@ 0000000180031640     libucrt:fpexcept.obj
- 0002:00009648       ??_C@_03MJLDFKDL@_y0?$AA@  0000000180031648     libucrt:fpexcept.obj
- 0002:0000964c       ??_C@_03NAKIGLHK@_y1?$AA@  000000018003164c     libucrt:fpexcept.obj
- 0002:00009650       ??_C@_03ONILCKOB@_yn?$AA@  0000000180031650     libucrt:fpexcept.obj
- 0002:00009654       ??_C@_05JGDBENOH@_logb?$AA@ 0000000180031654     libucrt:fpexcept.obj
- 0002:00009660       ??_C@_0L@KDOEJCKC@_nextafter?$AA@ 0000000180031660     libucrt:fpexcept.obj
- 0002:00009670       _d_inf                     0000000180031670     libucrt:util.obj
- 0002:00009678       _d_max                     0000000180031678     libucrt:util.obj
- 0002:00009720       ??_C@_1EG@CNNIPFIM@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAa?$AAp?$AAp?$AAm?$AAo?$AAd?$AAe?$AAl?$AA?9?$AAr?$AAu?$AAn?$AAt?$AAi?$AAm?$AAe?$AA?9?$AAl?$AA1?$AA?9?$AA1@ 0000000180031720     libucrt:winapi_thunks.obj
- 0002:00009770       ??_C@_1EA@JGEFHKEI@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAd?$AAa?$AAt?$AAe?$AAt?$AAi?$AAm?$AAe?$AA?9?$AAl?$AA1?$AA?9?$AA1?$AA?9?$AA1?$AA?$AA@ 0000000180031770     libucrt:winapi_thunks.obj
- 0002:000097b0       ??_C@_1DI@GCIAAENM@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAf?$AAi?$AAl?$AAe?$AA?9?$AAl?$AA2?$AA?9?$AA1?$AA?9?$AA1?$AA?$AA@ 00000001800317b0     libucrt:winapi_thunks.obj
- 0002:000097f0       ??_C@_1EI@MPIAOHOC@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAl?$AAo?$AAc?$AAa?$AAl?$AAi?$AAz?$AAa?$AAt?$AAi?$AAo?$AAn?$AA?9?$AAl?$AA1?$AA?9@ 00000001800317f0     libucrt:winapi_thunks.obj
- 0002:00009840       ??_C@_1FK@FPHCKFIE@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAl?$AAo?$AAc?$AAa?$AAl?$AAi?$AAz?$AAa?$AAt?$AAi?$AAo?$AAn?$AA?9?$AAo?$AAb?$AAs@ 0000000180031840     libucrt:winapi_thunks.obj
- 0002:000098a0       ??_C@_1EM@DILCGIIO@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAp?$AAr?$AAo?$AAc?$AAe?$AAs?$AAs?$AAt?$AAh?$AAr?$AAe?$AAa?$AAd?$AAs?$AA?9?$AAl@ 00000001800318a0     libucrt:winapi_thunks.obj
- 0002:000098f0       ??_C@_1DM@LNCGDDPN@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAs?$AAt?$AAr?$AAi?$AAn?$AAg?$AA?9?$AAl?$AA1?$AA?9?$AA1?$AA?9?$AA0?$AA?$AA@ 00000001800318f0     libucrt:winapi_thunks.obj
- 0002:00009930       ??_C@_1DO@FPAPJEMD@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAs?$AAy?$AAs?$AAi?$AAn?$AAf?$AAo?$AA?9?$AAl?$AA1?$AA?9?$AA2?$AA?9?$AA1?$AA?$AA@ 0000000180031930     libucrt:winapi_thunks.obj
- 0002:00009970       ??_C@_1DK@NDHNAHIO@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAw?$AAi?$AAn?$AAr?$AAt?$AA?9?$AAl?$AA1?$AA?9?$AA1?$AA?9?$AA0?$AA?$AA@ 0000000180031970     libucrt:winapi_thunks.obj
- 0002:000099b0       ??_C@_1DM@KGHDGBCM@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAx?$AAs?$AAt?$AAa?$AAt?$AAe?$AA?9?$AAl?$AA2?$AA?9?$AA1?$AA?9?$AA0?$AA?$AA@ 00000001800319b0     libucrt:winapi_thunks.obj
- 0002:000099f0       ??_C@_1EO@IJIOEFOH@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAr?$AAt?$AAc?$AAo?$AAr?$AAe?$AA?9?$AAn?$AAt?$AAu?$AAs?$AAe?$AAr?$AA?9?$AAw?$AAi?$AAn?$AAd?$AAo?$AAw?$AA?9@ 00000001800319f0     libucrt:winapi_thunks.obj
- 0002:00009a40       ??_C@_1FG@HHGEKANL@?$AAa?$AAp?$AAi?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAs?$AAe?$AAc?$AAu?$AAr?$AAi?$AAt?$AAy?$AA?9?$AAs?$AAy?$AAs?$AAt?$AAe?$AAm?$AAf?$AAu?$AAn?$AAc?$AAt?$AAi@ 0000000180031a40     libucrt:winapi_thunks.obj
- 0002:00009aa0       ??_C@_1FG@NCKKOLKO@?$AAe?$AAx?$AAt?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAk?$AAe?$AAr?$AAn?$AAe?$AAl?$AA3?$AA2?$AA?9?$AAp?$AAa?$AAc?$AAk?$AAa?$AAg?$AAe?$AA?9?$AAc?$AAu?$AAr?$AAr@ 0000000180031aa0     libucrt:winapi_thunks.obj
- 0002:00009b00       ??_C@_1EG@DBIOJECG@?$AAe?$AAx?$AAt?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAn?$AAt?$AAu?$AAs?$AAe?$AAr?$AA?9?$AAd?$AAi?$AAa?$AAl?$AAo?$AAg?$AAb?$AAo?$AAx?$AA?9?$AAl?$AA1?$AA?9?$AA1@ 0000000180031b00     libucrt:winapi_thunks.obj
- 0002:00009b50       ??_C@_1EO@FIHMJCLF@?$AAe?$AAx?$AAt?$AA?9?$AAm?$AAs?$AA?9?$AAw?$AAi?$AAn?$AA?9?$AAn?$AAt?$AAu?$AAs?$AAe?$AAr?$AA?9?$AAw?$AAi?$AAn?$AAd?$AAo?$AAw?$AAs?$AAt?$AAa?$AAt?$AAi?$AAo?$AAn?$AA?9@ 0000000180031b50     libucrt:winapi_thunks.obj
- 0002:00009ba0       ??_C@_1O@BCCLBEOE@?$AAu?$AAs?$AAe?$AAr?$AA3?$AA2?$AA?$AA@ 0000000180031ba0     libucrt:winapi_thunks.obj
- 0002:00009bc0       ??_C@_0BE@LJANKFHF@EnumSystemLocalesEx?$AA@ 0000000180031bc0     libucrt:winapi_thunks.obj
- 0002:00009c10       ??_C@_0BJ@PBCCBIPI@GetUserDefaultLocaleName?$AA@ 0000000180031c10     libucrt:winapi_thunks.obj
- 0002:00009c40       ??_C@_0BC@CELBKLLA@IsValidLocaleName?$AA@ 0000000180031c40     libucrt:winapi_thunks.obj
- 0002:00009c68       ??_C@_0BB@CDHDDLLP@LCIDToLocaleName?$AA@ 0000000180031c68     libucrt:winapi_thunks.obj
- 0002:00009c88       ??_C@_0BB@HBDEELFH@LocaleNameToLCID?$AA@ 0000000180031c88     libucrt:winapi_thunks.obj
- 0002:00009ca0       __log_256_lead             0000000180031ca0     libucrt:log_256_lead_tail_table.obj
- 0002:0000a4b0       __log_256_tail             00000001800324b0     libucrt:log_256_lead_tail_table.obj
- 0002:0000acc0       __two_to_jby64_head_table  0000000180032cc0     libucrt:two_to_jby64_head_tail_table.obj
- 0002:0000aec0       __two_to_jby64_tail_table  0000000180032ec0     libucrt:two_to_jby64_head_tail_table.obj
- 0002:0000b0c0       ??_C@_04MBFDLNIM@powf?$AA@ 00000001800330c0     libucrt:pow_special.obj
- 0002:0000b0d0       __two_to_jby64_table       00000001800330d0     libucrt:two_to_jby64_table.obj
- 0002:0000b2d0       __log_F_inv_qword          00000001800332d0     libucrt:log_f_inv_qword_table.obj
- 0002:0000bb00       ??_C@_01GBGANLPD@0?$AA@    0000000180033b00     libucrt:cfout.obj
- 0002:0000bb04       ??_C@_05DNEBIAHO@1?$CDINF?$AA@ 0000000180033b04     libucrt:cfout.obj
- 0002:0000bb0c       ??_C@_06IMKFLFPG@1?$CDQNAN?$AA@ 0000000180033b0c     libucrt:cfout.obj
- 0002:0000bb14       ??_C@_06PGGFOGJG@1?$CDSNAN?$AA@ 0000000180033b14     libucrt:cfout.obj
- 0002:0000bb1c       ??_C@_05PHHOCPM@1?$CDIND?$AA@ 0000000180033b1c     libucrt:cfout.obj
- 0002:0000bb30       __acrt_rg_language         0000000180033b30     libucrt:get_qualified_locale.obj
- 0002:0000bf40       __acrt_rg_language_count   0000000180033f40     libucrt:get_qualified_locale.obj
- 0002:0000bf50       __acrt_rg_country          0000000180033f50     libucrt:get_qualified_locale.obj
- 0002:0000c0c0       __acrt_rg_country_count    00000001800340c0     libucrt:get_qualified_locale.obj
- 0002:0000c0c8       ??_C@_1BC@LLOKLNP@?$AAa?$AAm?$AAe?$AAr?$AAi?$AAc?$AAa?$AAn?$AA?$AA@ 00000001800340c8     libucrt:get_qualified_locale.obj
- 0002:0000c0e0       ??_C@_1CC@HEIGCDGG@?$AAa?$AAm?$AAe?$AAr?$AAi?$AAc?$AAa?$AAn?$AA?5?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?$AA@ 00000001800340e0     libucrt:get_qualified_locale.obj
- 0002:0000c108       ??_C@_1CC@IHCNOMIN@?$AAa?$AAm?$AAe?$AAr?$AAi?$AAc?$AAa?$AAn?$AA?9?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?$AA@ 0000000180034108     libucrt:get_qualified_locale.obj
- 0002:0000c130       ??_C@_1BG@GKAGPCGG@?$AAa?$AAu?$AAs?$AAt?$AAr?$AAa?$AAl?$AAi?$AAa?$AAn?$AA?$AA@ 0000000180034130     libucrt:get_qualified_locale.obj
- 0002:0000c148       ??_C@_1BA@GMENCENF@?$AAb?$AAe?$AAl?$AAg?$AAi?$AAa?$AAn?$AA?$AA@ 0000000180034148     libucrt:get_qualified_locale.obj
- 0002:0000c158       ??_C@_1BC@PJMIIAAN@?$AAc?$AAa?$AAn?$AAa?$AAd?$AAi?$AAa?$AAn?$AA?$AA@ 0000000180034158     libucrt:get_qualified_locale.obj
- 0002:0000c170       ??_C@_17NOIMNFBF@?$AAc?$AAh?$AAh?$AA?$AA@ 0000000180034170     libucrt:get_qualified_locale.obj
- 0002:0000c178       ??_C@_17GGDALCHA@?$AAc?$AAh?$AAi?$AA?$AA@ 0000000180034178     libucrt:get_qualified_locale.obj
- 0002:0000c180       ??_C@_1BA@NPNJKIBL@?$AAc?$AAh?$AAi?$AAn?$AAe?$AAs?$AAe?$AA?$AA@ 0000000180034180     libucrt:get_qualified_locale.obj
- 0002:0000c190       ??_C@_1CC@DINBAMMJ@?$AAc?$AAh?$AAi?$AAn?$AAe?$AAs?$AAe?$AA?9?$AAh?$AAo?$AAn?$AAg?$AAk?$AAo?$AAn?$AAg?$AA?$AA@ 0000000180034190     libucrt:get_qualified_locale.obj
- 0002:0000c1b8       ??_C@_1CG@IOBJPACO@?$AAc?$AAh?$AAi?$AAn?$AAe?$AAs?$AAe?$AA?9?$AAs?$AAi?$AAm?$AAp?$AAl?$AAi?$AAf?$AAi?$AAe?$AAd?$AA?$AA@ 00000001800341b8     libucrt:get_qualified_locale.obj
- 0002:0000c1e0       ??_C@_1CE@GAJNDCKG@?$AAc?$AAh?$AAi?$AAn?$AAe?$AAs?$AAe?$AA?9?$AAs?$AAi?$AAn?$AAg?$AAa?$AAp?$AAo?$AAr?$AAe?$AA?$AA@ 00000001800341e0     libucrt:get_qualified_locale.obj
- 0002:0000c208       ??_C@_1CI@PAJPIOOD@?$AAc?$AAh?$AAi?$AAn?$AAe?$AAs?$AAe?$AA?9?$AAt?$AAr?$AAa?$AAd?$AAi?$AAt?$AAi?$AAo?$AAn?$AAa?$AAl?$AA?$AA@ 0000000180034208     libucrt:get_qualified_locale.obj
- 0002:0000c230       ??_C@_1BM@NILJBMMD@?$AAd?$AAu?$AAt?$AAc?$AAh?$AA?9?$AAb?$AAe?$AAl?$AAg?$AAi?$AAa?$AAn?$AA?$AA@ 0000000180034230     libucrt:get_qualified_locale.obj
- 0002:0000c250       ??_C@_1CC@OOJPJNEJ@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAa?$AAm?$AAe?$AAr?$AAi?$AAc?$AAa?$AAn?$AA?$AA@ 0000000180034250     libucrt:get_qualified_locale.obj
- 0002:0000c278       ??_C@_1BI@IOLFEEM@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAa?$AAu?$AAs?$AA?$AA@ 0000000180034278     libucrt:get_qualified_locale.obj
- 0002:0000c290       ??_C@_1BO@HFFNLENJ@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAb?$AAe?$AAl?$AAi?$AAz?$AAe?$AA?$AA@ 0000000180034290     libucrt:get_qualified_locale.obj
- 0002:0000c2b0       ??_C@_1BI@HAPKJMPO@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAc?$AAa?$AAn?$AA?$AA@ 00000001800342b0     libucrt:get_qualified_locale.obj
- 0002:0000c2c8       ??_C@_1CE@HLNDMIOJ@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAc?$AAa?$AAr?$AAi?$AAb?$AAb?$AAe?$AAa?$AAn?$AA?$AA@ 00000001800342c8     libucrt:get_qualified_locale.obj
- 0002:0000c2f0       ??_C@_1BI@LDHJHHAC@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAi?$AAr?$AAe?$AA?$AA@ 00000001800342f0     libucrt:get_qualified_locale.obj
- 0002:0000c308       ??_C@_1CA@NJMMCFOC@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAj?$AAa?$AAm?$AAa?$AAi?$AAc?$AAa?$AA?$AA@ 0000000180034308     libucrt:get_qualified_locale.obj
- 0002:0000c328       ??_C@_1BG@BHJEBBGG@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAn?$AAz?$AA?$AA@ 0000000180034328     libucrt:get_qualified_locale.obj
- 0002:0000c340       ??_C@_1CK@FGOEJJCO@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAs?$AAo?$AAu?$AAt?$AAh?$AA?5?$AAa?$AAf?$AAr?$AAi?$AAc?$AAa?$AA?$AA@ 0000000180034340     libucrt:get_qualified_locale.obj
- 0002:0000c370       ??_C@_1DE@PDBJPCJ@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAt?$AAr?$AAi?$AAn?$AAi?$AAd?$AAa?$AAd?$AA?5?$AAy?$AA?5?$AAt?$AAo?$AAb?$AAa?$AAg?$AAo?$AA?$AA@ 0000000180034370     libucrt:get_qualified_locale.obj
- 0002:0000c3a8       ??_C@_1BG@JGCANDME@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAu?$AAk?$AA?$AA@ 00000001800343a8     libucrt:get_qualified_locale.obj
- 0002:0000c3c0       ??_C@_1BG@DINKMLE@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAu?$AAs?$AA?$AA@ 00000001800343c0     libucrt:get_qualified_locale.obj
- 0002:0000c3d8       ??_C@_1BI@NMFDBHJE@?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?9?$AAu?$AAs?$AAa?$AA?$AA@ 00000001800343d8     libucrt:get_qualified_locale.obj
- 0002:0000c3f0       ??_C@_1BO@OIHKJKII@?$AAf?$AAr?$AAe?$AAn?$AAc?$AAh?$AA?9?$AAb?$AAe?$AAl?$AAg?$AAi?$AAa?$AAn?$AA?$AA@ 00000001800343f0     libucrt:get_qualified_locale.obj
- 0002:0000c410       ??_C@_1CA@NKAELJKI@?$AAf?$AAr?$AAe?$AAn?$AAc?$AAh?$AA?9?$AAc?$AAa?$AAn?$AAa?$AAd?$AAi?$AAa?$AAn?$AA?$AA@ 0000000180034410     libucrt:get_qualified_locale.obj
- 0002:0000c430       ??_C@_1CE@MGKCNLGN@?$AAf?$AAr?$AAe?$AAn?$AAc?$AAh?$AA?9?$AAl?$AAu?$AAx?$AAe?$AAm?$AAb?$AAo?$AAu?$AAr?$AAg?$AA?$AA@ 0000000180034430     libucrt:get_qualified_locale.obj
- 0002:0000c458       ??_C@_1BK@CEGEAILM@?$AAf?$AAr?$AAe?$AAn?$AAc?$AAh?$AA?9?$AAs?$AAw?$AAi?$AAs?$AAs?$AA?$AA@ 0000000180034458     libucrt:get_qualified_locale.obj
- 0002:0000c478       ??_C@_1CA@PAFKEOCC@?$AAg?$AAe?$AAr?$AAm?$AAa?$AAn?$AA?9?$AAa?$AAu?$AAs?$AAt?$AAr?$AAi?$AAa?$AAn?$AA?$AA@ 0000000180034478     libucrt:get_qualified_locale.obj
- 0002:0000c498       ??_C@_1CI@HCFHGOFD@?$AAg?$AAe?$AAr?$AAm?$AAa?$AAn?$AA?9?$AAl?$AAi?$AAc?$AAh?$AAt?$AAe?$AAn?$AAs?$AAt?$AAe?$AAi?$AAn?$AA?$AA@ 0000000180034498     libucrt:get_qualified_locale.obj
- 0002:0000c4c0       ??_C@_1CE@FEDDNPDG@?$AAg?$AAe?$AAr?$AAm?$AAa?$AAn?$AA?9?$AAl?$AAu?$AAx?$AAe?$AAm?$AAb?$AAo?$AAu?$AAr?$AAg?$AA?$AA@ 00000001800344c0     libucrt:get_qualified_locale.obj
- 0002:0000c4e8       ??_C@_1BK@LIMINNMN@?$AAg?$AAe?$AAr?$AAm?$AAa?$AAn?$AA?9?$AAs?$AAw?$AAi?$AAs?$AAs?$AA?$AA@ 00000001800344e8     libucrt:get_qualified_locale.obj
- 0002:0000c508       ??_C@_1BM@LGMDBEPD@?$AAi?$AAr?$AAi?$AAs?$AAh?$AA?9?$AAe?$AAn?$AAg?$AAl?$AAi?$AAs?$AAh?$AA?$AA@ 0000000180034508     libucrt:get_qualified_locale.obj
- 0002:0000c528       ??_C@_1BM@NNCFBAEE@?$AAi?$AAt?$AAa?$AAl?$AAi?$AAa?$AAn?$AA?9?$AAs?$AAw?$AAi?$AAs?$AAs?$AA?$AA@ 0000000180034528     libucrt:get_qualified_locale.obj
- 0002:0000c548       ??_C@_1BE@FEDJNPIB@?$AAn?$AAo?$AAr?$AAw?$AAe?$AAg?$AAi?$AAa?$AAn?$AA?$AA@ 0000000180034548     libucrt:get_qualified_locale.obj
- 0002:0000c560       ??_C@_1CC@CILKDEIE@?$AAn?$AAo?$AAr?$AAw?$AAe?$AAg?$AAi?$AAa?$AAn?$AA?9?$AAb?$AAo?$AAk?$AAm?$AAa?$AAl?$AA?$AA@ 0000000180034560     libucrt:get_qualified_locale.obj
- 0002:0000c588       ??_C@_1CE@DHMMHEPL@?$AAn?$AAo?$AAr?$AAw?$AAe?$AAg?$AAi?$AAa?$AAn?$AA?9?$AAn?$AAy?$AAn?$AAo?$AAr?$AAs?$AAk?$AA?$AA@ 0000000180034588     libucrt:get_qualified_locale.obj
- 0002:0000c5b0       ??_C@_1CK@OPNMHECD@?$AAp?$AAo?$AAr?$AAt?$AAu?$AAg?$AAu?$AAe?$AAs?$AAe?$AA?9?$AAb?$AAr?$AAa?$AAz?$AAi?$AAl?$AAi?$AAa?$AAn?$AA?$AA@ 00000001800345b0     libucrt:get_qualified_locale.obj
- 0002:0000c5e0       ??_C@_1CE@KEEHCDB@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAa?$AAr?$AAg?$AAe?$AAn?$AAt?$AAi?$AAn?$AAa?$AA?$AA@ 00000001800345e0     libucrt:get_qualified_locale.obj
- 0002:0000c608       ??_C@_1CA@GIAOLHJD@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAb?$AAo?$AAl?$AAi?$AAv?$AAi?$AAa?$AA?$AA@ 0000000180034608     libucrt:get_qualified_locale.obj
- 0002:0000c628       ??_C@_1BM@OJNDFNPD@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAc?$AAh?$AAi?$AAl?$AAe?$AA?$AA@ 0000000180034628     libucrt:get_qualified_locale.obj
- 0002:0000c648       ??_C@_1CC@OCOLPALL@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAc?$AAo?$AAl?$AAo?$AAm?$AAb?$AAi?$AAa?$AA?$AA@ 0000000180034648     libucrt:get_qualified_locale.obj
- 0002:0000c670       ??_C@_1CG@BPOFMKBB@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAc?$AAo?$AAs?$AAt?$AAa?$AA?5?$AAr?$AAi?$AAc?$AAa?$AA?$AA@ 0000000180034670     libucrt:get_qualified_locale.obj
- 0002:0000c698       ??_C@_1DG@IGOBAPBB@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAd?$AAo?$AAm?$AAi?$AAn?$AAi?$AAc?$AAa?$AAn?$AA?5?$AAr?$AAe?$AAp?$AAu?$AAb?$AAl?$AAi?$AAc?$AA?$AA@ 0000000180034698     libucrt:get_qualified_locale.obj
- 0002:0000c6d0       ??_C@_1CA@JHAPGEGI@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAe?$AAc?$AAu?$AAa?$AAd?$AAo?$AAr?$AA?$AA@ 00000001800346d0     libucrt:get_qualified_locale.obj
- 0002:0000c6f0       ??_C@_1CI@LAPALJPP@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAe?$AAl?$AA?5?$AAs?$AAa?$AAl?$AAv?$AAa?$AAd?$AAo?$AAr?$AA?$AA@ 00000001800346f0     libucrt:get_qualified_locale.obj
- 0002:0000c718       ??_C@_1CE@PDGBOFOM@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAg?$AAu?$AAa?$AAt?$AAe?$AAm?$AAa?$AAl?$AAa?$AA?$AA@ 0000000180034718     libucrt:get_qualified_locale.obj
- 0002:0000c740       ??_C@_1CC@NBEBAODI@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAh?$AAo?$AAn?$AAd?$AAu?$AAr?$AAa?$AAs?$AA?$AA@ 0000000180034740     libucrt:get_qualified_locale.obj
- 0002:0000c768       ??_C@_1CA@LLKGHBMF@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAm?$AAe?$AAx?$AAi?$AAc?$AAa?$AAn?$AA?$AA@ 0000000180034768     libucrt:get_qualified_locale.obj
- 0002:0000c788       ??_C@_1BO@LKNDOIGD@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAm?$AAo?$AAd?$AAe?$AAr?$AAn?$AA?$AA@ 0000000180034788     libucrt:get_qualified_locale.obj
- 0002:0000c7a8       ??_C@_1CE@NMDMOEEB@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAn?$AAi?$AAc?$AAa?$AAr?$AAa?$AAg?$AAu?$AAa?$AA?$AA@ 00000001800347a8     libucrt:get_qualified_locale.obj
- 0002:0000c7d0       ??_C@_1BO@LLCBEJGB@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAp?$AAa?$AAn?$AAa?$AAm?$AAa?$AA?$AA@ 00000001800347d0     libucrt:get_qualified_locale.obj
- 0002:0000c7f0       ??_C@_1CC@FKPGGIHO@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAp?$AAa?$AAr?$AAa?$AAg?$AAu?$AAa?$AAy?$AA?$AA@ 00000001800347f0     libucrt:get_qualified_locale.obj
- 0002:0000c818       ??_C@_1BK@CDEIHOOP@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAp?$AAe?$AAr?$AAu?$AA?$AA@ 0000000180034818     libucrt:get_qualified_locale.obj
- 0002:0000c838       ??_C@_1CI@GAHAKKGP@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAp?$AAu?$AAe?$AAr?$AAt?$AAo?$AA?5?$AAr?$AAi?$AAc?$AAo?$AA?$AA@ 0000000180034838     libucrt:get_qualified_locale.obj
- 0002:0000c860       ??_C@_1CA@NKJBCAGP@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAu?$AAr?$AAu?$AAg?$AAu?$AAa?$AAy?$AA?$AA@ 0000000180034860     libucrt:get_qualified_locale.obj
- 0002:0000c880       ??_C@_1CE@ODILCONM@?$AAs?$AAp?$AAa?$AAn?$AAi?$AAs?$AAh?$AA?9?$AAv?$AAe?$AAn?$AAe?$AAz?$AAu?$AAe?$AAl?$AAa?$AA?$AA@ 0000000180034880     libucrt:get_qualified_locale.obj
- 0002:0000c8a8       ??_C@_1CA@OBNMCGFO@?$AAs?$AAw?$AAe?$AAd?$AAi?$AAs?$AAh?$AA?9?$AAf?$AAi?$AAn?$AAl?$AAa?$AAn?$AAd?$AA?$AA@ 00000001800348a8     libucrt:get_qualified_locale.obj
- 0002:0000c8c8       ??_C@_1M@PIPDDPPI@?$AAs?$AAw?$AAi?$AAs?$AAs?$AA?$AA@ 00000001800348c8     libucrt:get_qualified_locale.obj
- 0002:0000c8d4       ??_C@_15GMFIMNFM@?$AAu?$AAs?$AA?$AA@ 00000001800348d4     libucrt:get_qualified_locale.obj
- 0002:0000c8e0       ??_C@_17HAEBFAGL@?$AAu?$AAs?$AAa?$AA?$AA@ 00000001800348e0     libucrt:get_qualified_locale.obj
- 0002:0000c8e8       ??_C@_1BA@DPFJEPHB@?$AAa?$AAm?$AAe?$AAr?$AAi?$AAc?$AAa?$AA?$AA@ 00000001800348e8     libucrt:get_qualified_locale.obj
- 0002:0000c8f8       ??_C@_1BA@ELOGGFK@?$AAb?$AAr?$AAi?$AAt?$AAa?$AAi?$AAn?$AA?$AA@ 00000001800348f8     libucrt:get_qualified_locale.obj
- 0002:0000c908       ??_C@_1M@GHBGIGDA@?$AAc?$AAh?$AAi?$AAn?$AAa?$AA?$AA@ 0000000180034908     libucrt:get_qualified_locale.obj
- 0002:0000c918       ??_C@_1M@NCHEJOPO@?$AAc?$AAz?$AAe?$AAc?$AAh?$AA?$AA@ 0000000180034918     libucrt:get_qualified_locale.obj
- 0002:0000c928       ??_C@_1BA@BKPAPBLA@?$AAe?$AAn?$AAg?$AAl?$AAa?$AAn?$AAd?$AA?$AA@ 0000000180034928     libucrt:get_qualified_locale.obj
- 0002:0000c938       ??_C@_1BM@HKBCKIPC@?$AAg?$AAr?$AAe?$AAa?$AAt?$AA?5?$AAb?$AAr?$AAi?$AAt?$AAa?$AAi?$AAn?$AA?$AA@ 0000000180034938     libucrt:get_qualified_locale.obj
- 0002:0000c958       ??_C@_1BA@PPCHPGJB@?$AAh?$AAo?$AAl?$AAl?$AAa?$AAn?$AAd?$AA?$AA@ 0000000180034958     libucrt:get_qualified_locale.obj
- 0002:0000c968       ??_C@_1BE@JBMPEGDG@?$AAh?$AAo?$AAn?$AAg?$AA?9?$AAk?$AAo?$AAn?$AAg?$AA?$AA@ 0000000180034968     libucrt:get_qualified_locale.obj
- 0002:0000c980       ??_C@_1BI@KOELBBPJ@?$AAn?$AAe?$AAw?$AA?9?$AAz?$AAe?$AAa?$AAl?$AAa?$AAn?$AAd?$AA?$AA@ 0000000180034980     libucrt:get_qualified_locale.obj
- 0002:0000c998       ??_C@_15HIEBHAIO@?$AAn?$AAz?$AA?$AA@ 0000000180034998     libucrt:get_qualified_locale.obj
- 0002:0000c9a0       ??_C@_1BC@CHBCPFPI@?$AAp?$AAr?$AA?5?$AAc?$AAh?$AAi?$AAn?$AAa?$AA?$AA@ 00000001800349a0     libucrt:get_qualified_locale.obj
- 0002:0000c9b8       ??_C@_1BC@JAOIIFKD@?$AAp?$AAr?$AA?9?$AAc?$AAh?$AAi?$AAn?$AAa?$AA?$AA@ 00000001800349b8     libucrt:get_qualified_locale.obj
- 0002:0000c9d0       ??_C@_1BI@BEHPPHKC@?$AAp?$AAu?$AAe?$AAr?$AAt?$AAo?$AA?9?$AAr?$AAi?$AAc?$AAo?$AA?$AA@ 00000001800349d0     libucrt:get_qualified_locale.obj
- 0002:0000c9e8       ??_C@_1O@PAEOFKDI@?$AAs?$AAl?$AAo?$AAv?$AAa?$AAk?$AA?$AA@ 00000001800349e8     libucrt:get_qualified_locale.obj
- 0002:0000c9f8       ??_C@_1BK@FIHMCKAM@?$AAs?$AAo?$AAu?$AAt?$AAh?$AA?5?$AAa?$AAf?$AAr?$AAi?$AAc?$AAa?$AA?$AA@ 00000001800349f8     libucrt:get_qualified_locale.obj
- 0002:0000ca18       ??_C@_1BI@NAEOODKB@?$AAs?$AAo?$AAu?$AAt?$AAh?$AA?5?$AAk?$AAo?$AAr?$AAe?$AAa?$AA?$AA@ 0000000180034a18     libucrt:get_qualified_locale.obj
- 0002:0000ca30       ??_C@_1BK@FBDGGIFF@?$AAs?$AAo?$AAu?$AAt?$AAh?$AA?9?$AAa?$AAf?$AAr?$AAi?$AAc?$AAa?$AA?$AA@ 0000000180034a30     libucrt:get_qualified_locale.obj
- 0002:0000ca50       ??_C@_1BI@GHLEJDPK@?$AAs?$AAo?$AAu?$AAt?$AAh?$AA?9?$AAk?$AAo?$AAr?$AAe?$AAa?$AA?$AA@ 0000000180034a50     libucrt:get_qualified_locale.obj
- 0002:0000ca68       ??_C@_1CE@PLHLOMJF@?$AAt?$AAr?$AAi?$AAn?$AAi?$AAd?$AAa?$AAd?$AA?5?$AA?$CG?$AA?5?$AAt?$AAo?$AAb?$AAa?$AAg?$AAo?$AA?$AA@ 0000000180034a68     libucrt:get_qualified_locale.obj
- 0002:0000ca90       ??_C@_1BO@MODIMHHI@?$AAu?$AAn?$AAi?$AAt?$AAe?$AAd?$AA?9?$AAk?$AAi?$AAn?$AAg?$AAd?$AAo?$AAm?$AA?$AA@ 0000000180034a90     libucrt:get_qualified_locale.obj
- 0002:0000cab0       ??_C@_1BM@FFHJONBJ@?$AAu?$AAn?$AAi?$AAt?$AAe?$AAd?$AA?9?$AAs?$AAt?$AAa?$AAt?$AAe?$AAs?$AA?$AA@ 0000000180034ab0     libucrt:get_qualified_locale.obj
- 0002:0000cad0       ??_C@_17DNCLJFIF@?$AAA?$AAC?$AAP?$AA?$AA@ 0000000180034ad0     libucrt:get_qualified_locale.obj
- 0002:0000cad8       ??_C@_17CIKBIHLH@?$AAO?$AAC?$AAP?$AA?$AA@ 0000000180034ad8     libucrt:get_qualified_locale.obj
- 0002:0000cae0       __rglangidNotDefault       0000000180034ae0     libucrt:getqloc_downlevel.obj
- 0002:0000e9e0       __log10_256_lead           00000001800369e0     libucrt:log10_256_lead_tail_table.obj
- 0002:0000f1f0       __log10_256_tail           00000001800371f0     libucrt:log10_256_lead_tail_table.obj
- 0002:0000f9f8       ??_C@_1BA@BALFACEM@?$AAC?$AAO?$AAN?$AAO?$AAU?$AAT?$AA$?$AA?$AA@ 00000001800379f8     libucrt:initcon.obj
- 0002:0000fa08       ??_C@_1BK@DBDEIDLH@?$AAK?$AAE?$AAR?$AAN?$AAE?$AAL?$AA3?$AA2?$AA?4?$AAD?$AAL?$AAL?$AA?$AA@ 0000000180037a08     DelayImp:delayhlp.obj
- 0002:0000fa28       __pfnDliFailureHook2       0000000180037a28     DelayImp:delayhk1.obj
- 0002:0000fa30       _load_config_used          0000000180037a30     LIBCMT:loadcfg.obj
- 0002:0000fac8       ??_C@_0M@OFPLMEDN@getPrinters?$AA@ 0000000180037ac8     node_printer.obj
- 0002:0000fad8       ??_C@_0BG@LKCIGDOF@getDefaultPrinterName?$AA@ 0000000180037ad8     node_printer.obj
- 0002:0000faf0       ??_C@_0L@OHHGBAEL@getPrinter?$AA@ 0000000180037af0     node_printer.obj
- 0002:0000fb00       ??_C@_0BI@GAOFGHOM@getPrinterDriverOptions?$AA@ 0000000180037b00     node_printer.obj
- 0002:0000fb18       ??_C@_06JIAALHGN@getJob?$AA@ 0000000180037b18     node_printer.obj
- 0002:0000fb20       ??_C@_06LJBAPLA@setJob?$AA@ 0000000180037b20     node_printer.obj
- 0002:0000fb28       ??_C@_0M@IGPAMLFN@printDirect?$AA@ 0000000180037b28     node_printer.obj
- 0002:0000fb38       ??_C@_09HICNICHL@printFile?$AA@ 0000000180037b38     node_printer.obj
- 0002:0000fb48       ??_C@_0BJ@KPMFEGP@getSupportedPrintFormats?$AA@ 0000000180037b48     node_printer.obj
- 0002:0000fb68       ??_C@_0BI@OADJINNK@getSupportedJobCommands?$AA@ 0000000180037b68     node_printer.obj
- 0002:0000fb80       ??_C@_0BH@GOBBPFCN@?4?4?2src?2node_printer?4cc?$AA@ 0000000180037b80     node_printer.obj
- 0002:0000fb98       ??_C@_0N@ENGGNKJL@node_printer?$AA@ 0000000180037b98     node_printer.obj
- 0002:0000fba8       ??_C@_0BA@JFNIOLAK@string?5too?5long?$AA@ 0000000180037ba8     node_printer.obj
- 0002:0000fbb8       ??_C@_0BI@CFPLBAOH@invalid?5string?5position?$AA@ 0000000180037bb8     node_printer.obj
- 0002:0000fbd0       ??_C@_0BC@BDKFLDHL@unknown?5exception?$AA@ 0000000180037bd0     node_printer_win.obj
- 0002:0000fbe8       ??_C@_0BA@ELKIONDK@bad?5locale?5name?$AA@ 0000000180037be8     node_printer_win.obj
- 0002:0000fbf8       ??_C@_05LAPONLG@false?$AA@ 0000000180037bf8     node_printer_win.obj
- 0002:0000fc00       ??_C@_04LOAJBDKD@true?$AA@ 0000000180037c00     node_printer_win.obj
- 0002:0000fc05       ??_C@_00CNPNBAHC@?$AA@     0000000180037c05     node_printer_win.obj
- 0002:0000fc08       ??_C@_02LMMGGCAJ@?3?5?$AA@ 0000000180037c08     node_printer_win.obj
- 0002:0000fc10       ??_C@_08LLGCOLLL@iostream?$AA@ 0000000180037c10     node_printer_win.obj
- 0002:0000fc20       ??_C@_0BG@PADBLCHM@iostream?5stream?5error?$AA@ 0000000180037c20     node_printer_win.obj
- 0002:0000fc38       ??_C@_0BF@PHHKMMFD@ios_base?3?3badbit?5set?$AA@ 0000000180037c38     node_printer_win.obj
- 0002:0000fc50       ??_C@_0BG@FMKFHCIL@ios_base?3?3failbit?5set?$AA@ 0000000180037c50     node_printer_win.obj
- 0002:0000fc68       ??_C@_0BF@OOHOMBOF@ios_base?3?3eofbit?5set?$AA@ 0000000180037c68     node_printer_win.obj
- 0002:0000fc80       ??_C@_04OCLOIKKP@BUSY?$AA@ 0000000180037c80     node_printer_win.obj
- 0002:0000fc88       ??_C@_09HMMPCPCI@DOOR?9OPEN?$AA@ 0000000180037c88     node_printer_win.obj
- 0002:0000fc94       ??_C@_05MBDEGLCK@ERROR?$AA@ 0000000180037c94     node_printer_win.obj
- 0002:0000fca0       ??_C@_0N@GDECMNNL@INITIALIZING?$AA@ 0000000180037ca0     node_printer_win.obj
- 0002:0000fcb0       ??_C@_09LIICJBED@IO?9ACTIVE?$AA@ 0000000180037cb0     node_printer_win.obj
- 0002:0000fcc0       ??_C@_0M@MBAFHBNB@MANUAL?9FEED?$AA@ 0000000180037cc0     node_printer_win.obj
- 0002:0000fcd0       ??_C@_08JJNKGBFD@NO?9TONER?$AA@ 0000000180037cd0     node_printer_win.obj
- 0002:0000fce0       ??_C@_0O@NAOAIBHD@NOT?9AVAILABLE?$AA@ 0000000180037ce0     node_printer_win.obj
- 0002:0000fcf0       ??_C@_07BIKPOAJA@OFFLINE?$AA@ 0000000180037cf0     node_printer_win.obj
- 0002:0000fcf8       ??_C@_0O@OCOPPEOP@OUT?9OF?9MEMORY?$AA@ 0000000180037cf8     node_printer_win.obj
- 0002:0000fd08       ??_C@_0BA@IIGDMLKB@OUTPUT?9BIN?9FULL?$AA@ 0000000180037d08     node_printer_win.obj
- 0002:0000fd18       ??_C@_09ICMCIJIG@PAGE?9PUNT?$AA@ 0000000180037d18     node_printer_win.obj
- 0002:0000fd28       ??_C@_09JHKMIDDC@PAPER?9JAM?$AA@ 0000000180037d28     node_printer_win.obj
- 0002:0000fd38       ??_C@_09CAFNNBLE@PAPER?9OUT?$AA@ 0000000180037d38     node_printer_win.obj
- 0002:0000fd48       ??_C@_0O@ODHKPIIF@PAPER?9PROBLEM?$AA@ 0000000180037d48     node_printer_win.obj
- 0002:0000fd58       ??_C@_06EOENDFCC@PAUSED?$AA@ 0000000180037d58     node_printer_win.obj
- 0002:0000fd60       ??_C@_0BB@PBKJHFPO@PENDING?9DELETION?$AA@ 0000000180037d60     node_printer_win.obj
- 0002:0000fd78       ??_C@_0L@ECGFKCFL@POWER?9SAVE?$AA@ 0000000180037d78     node_printer_win.obj
- 0002:0000fd88       ??_C@_08HGNFACJO@PRINTING?$AA@ 0000000180037d88     node_printer_win.obj
- 0002:0000fd98       ??_C@_0L@DHKEDHLJ@PROCESSING?$AA@ 0000000180037d98     node_printer_win.obj
- 0002:0000fda8       ??_C@_0P@OONCONOB@SERVER?9UNKNOWN?$AA@ 0000000180037da8     node_printer_win.obj
- 0002:0000fdb8       ??_C@_09KAGMFDMO@TONER?9LOW?$AA@ 0000000180037db8     node_printer_win.obj
- 0002:0000fdc8       ??_C@_0BC@HIJKEFLK@USER?9INTERVENTION?$AA@ 0000000180037dc8     node_printer_win.obj
- 0002:0000fde0       ??_C@_07OBKGPIJE@WAITING?$AA@ 0000000180037de0     node_printer_win.obj
- 0002:0000fde8       ??_C@_0L@NGDPENOF@WARMING?9UP?$AA@ 0000000180037de8     node_printer_win.obj
- 0002:0000fdf8       ??_C@_07BCAOMLJN@PRINTED?$AA@ 0000000180037df8     node_printer_win.obj
- 0002:0000fe00       ??_C@_0N@NEOKEICG@BLOCKED?9DEVQ?$AA@ 0000000180037e00     node_printer_win.obj
- 0002:0000fe10       ??_C@_07GPJLPGKO@DELETED?$AA@ 0000000180037e10     node_printer_win.obj
- 0002:0000fe18       ??_C@_08MJHIPGLF@DELETING?$AA@ 0000000180037e18     node_printer_win.obj
- 0002:0000fe28       ??_C@_08MHNHLKPH@PAPEROUT?$AA@ 0000000180037e28     node_printer_win.obj
- 0002:0000fe38       ??_C@_07EOCDMAHH@RESTART?$AA@ 0000000180037e38     node_printer_win.obj
- 0002:0000fe40       ??_C@_08PFGBADPK@SPOOLING?$AA@ 0000000180037e40     node_printer_win.obj
- 0002:0000fe50       ??_C@_08PAHEDIPH@COMPLETE?$AA@ 0000000180037e50     node_printer_win.obj
- 0002:0000fe5c       ??_C@_06LIJCLFCC@DIRECT?$AA@ 0000000180037e5c     node_printer_win.obj
- 0002:0000fe68       ??_C@_0BC@LPKCNOLB@DO?9COMPLETE?9FIRST?$AA@ 0000000180037e68     node_printer_win.obj
- 0002:0000fe80       ??_C@_0M@DANDHPID@ENABLE?9DEVQ?$AA@ 0000000180037e80     node_printer_win.obj
- 0002:0000fe8c       ??_C@_06JMIOFMHI@HIDDEN?$AA@ 0000000180037e8c     node_printer_win.obj
- 0002:0000fe98       ??_C@_0BA@FKHBHIMC@KEEPPRINTEDJOBS?$AA@ 0000000180037e98     node_printer_win.obj
- 0002:0000fea8       ??_C@_05EIDBELPO@LOCAL?$AA@ 0000000180037ea8     node_printer_win.obj
- 0002:0000feb0       ??_C@_07BCBHNHNG@NETWORK?$AA@ 0000000180037eb0     node_printer_win.obj
- 0002:0000feb8       ??_C@_09JOLHJECC@PUBLISHED?$AA@ 0000000180037eb8     node_printer_win.obj
- 0002:0000fec4       ??_C@_06DFPGLGEF@QUEUED?$AA@ 0000000180037ec4     node_printer_win.obj
- 0002:0000fed0       ??_C@_08EOLEPDCM@RAW?9ONLY?$AA@ 0000000180037ed0     node_printer_win.obj
- 0002:0000fedc       ??_C@_06HFHGCIFA@SHARED?$AA@ 0000000180037edc     node_printer_win.obj
- 0002:0000fee4       ??_C@_03GDPOBHKJ@FAX?$AA@  0000000180037ee4     node_printer_win.obj
- 0002:0000fee8       ??_C@_06JHILMIHF@CANCEL?$AA@ 0000000180037ee8     node_printer_win.obj
- 0002:0000fef0       ??_C@_05DIAHPDGL@PAUSE?$AA@ 0000000180037ef0     node_printer_win.obj
- 0002:0000fef8       ??_C@_06PPGAKMJI@RESUME?$AA@ 0000000180037ef8     node_printer_win.obj
- 0002:0000ff00       ??_C@_06FKDAMKFP@DELETE?$AA@ 0000000180037f00     node_printer_win.obj
- 0002:0000ff08       ??_C@_0BA@IOAFOBOJ@SENT?9TO?9PRINTER?$AA@ 0000000180037f08     node_printer_win.obj
- 0002:0000ff18       ??_C@_0BC@EKGDAJJO@LAST?9PAGE?9EJECTED?$AA@ 0000000180037f18     node_printer_win.obj
- 0002:0000ff2c       ??_C@_02EGCJHIOB@id?$AA@   0000000180037f2c     node_printer_win.obj
- 0002:0000ff30       ??_C@_04MEMAJGDJ@name?$AA@ 0000000180037f30     node_printer_win.obj
- 0002:0000ff38       ??_C@_0M@DENPMHOH@printerName?$AA@ 0000000180037f38     node_printer_win.obj
- 0002:0000ff44       ??_C@_04CCHAHKJA@user?$AA@ 0000000180037f44     node_printer_win.obj
- 0002:0000ff4c       ??_C@_06DLEPGFEF@format?$AA@ 0000000180037f4c     node_printer_win.obj
- 0002:0000ff58       ??_C@_08IIJFADMF@priority?$AA@ 0000000180037f58     node_printer_win.obj
- 0002:0000ff64       ??_C@_04IAGNFIBA@size?$AA@ 0000000180037f64     node_printer_win.obj
- 0002:0000ff6c       ??_C@_06DJIHEMFI@status?$AA@ 0000000180037f6c     node_printer_win.obj
- 0002:0000ff78       ??_C@_0M@OCOCCFP@machineName?$AA@ 0000000180037f78     node_printer_win.obj
- 0002:0000ff88       ??_C@_08JEEDKNPB@document?$AA@ 0000000180037f88     node_printer_win.obj
- 0002:0000ff98       ??_C@_0L@CMEKBBJA@notifyName?$AA@ 0000000180037f98     node_printer_win.obj
- 0002:0000ffa8       ??_C@_0P@DGBIAKBE@printProcessor?$AA@ 0000000180037fa8     node_printer_win.obj
- 0002:0000ffb8       ??_C@_0L@HHPOFMCB@parameters?$AA@ 0000000180037fb8     node_printer_win.obj
- 0002:0000ffc8       ??_C@_0L@LPIOCPLD@driverName?$AA@ 0000000180037fc8     node_printer_win.obj
- 0002:0000ffd8       ??_C@_08OAGMDKAF@position?$AA@ 0000000180037fd8     node_printer_win.obj
- 0002:0000ffe8       ??_C@_09IIHJADCI@startTime?$AA@ 0000000180037fe8     node_printer_win.obj
- 0002:0000fff8       ??_C@_09CIOMMAN@untilTime?$AA@ 0000000180037ff8     node_printer_win.obj
- 0002:00010008       ??_C@_0L@EDFEJOLM@totalPages?$AA@ 0000000180038008     node_printer_win.obj
- 0002:00010014       ??_C@_04CLCEDBPF@time?$AA@ 0000000180038014     node_printer_win.obj
- 0002:00010020       ??_C@_0N@PCHPGDNI@pagesPrinted?$AA@ 0000000180038020     node_printer_win.obj
- 0002:00010030       ??_C@_06PNFNFJCO@code?3?5?$AA@ 0000000180038030     node_printer_win.obj
- 0002:00010038       ??_C@_0M@IKAFADKH@?0?5message?3?5?$AA@ 0000000180038038     node_printer_win.obj
- 0002:00010048       ??_C@_0CG@DBNFCFND@Error?5on?5allocating?5memory?5for?5j@ 0000000180038048     node_printer_win.obj
- 0002:00010070       ??_C@_0BF@FJKDNEGJ@Error?5on?5EnumJobsW?3?5?$AA@ 0000000180038070     node_printer_win.obj
- 0002:00010088       ??_C@_0L@NDKELIMG@serverName?$AA@ 0000000180038088     node_printer_win.obj
- 0002:00010098       ??_C@_09OFODMELP@shareName?$AA@ 0000000180038098     node_printer_win.obj
- 0002:000100a8       ??_C@_08DHAGKFJJ@portName?$AA@ 00000001800380a8     node_printer_win.obj
- 0002:000100b8       ??_C@_07GJGNEJFD@comment?$AA@ 00000001800380b8     node_printer_win.obj
- 0002:000100c0       ??_C@_08CBBFJFMD@location?$AA@ 00000001800380c0     node_printer_win.obj
- 0002:000100d0       ??_C@_07KCHEGAKA@sepFile?$AA@ 00000001800380d0     node_printer_win.obj
- 0002:000100d8       ??_C@_08IJKJONLA@datatype?$AA@ 00000001800380d8     node_printer_win.obj
- 0002:000100e8       ??_C@_0N@MKKJGDNC@statusNumber?$AA@ 00000001800380e8     node_printer_win.obj
- 0002:000100f8       ??_C@_0L@HNMJPKNA@attributes?$AA@ 00000001800380f8     node_printer_win.obj
- 0002:00010108       ??_C@_0BA@CCOAPEEI@defaultPriority?$AA@ 0000000180038108     node_printer_win.obj
- 0002:00010118       ??_C@_0L@INHADAOG@averagePPM?$AA@ 0000000180038118     node_printer_win.obj
- 0002:00010124       ??_C@_04MGFLLFCA@jobs?$AA@ 0000000180038124     node_printer_win.obj
- 0002:00010130       ??_C@_0CI@JKGAACMI@Error?5on?5allocating?5memory?5for?5p@ 0000000180038130     node_printer_win.obj
- 0002:00010158       ??_C@_0BI@JCMDGAJB@Error?5on?5EnumPrinters?3?5?$AA@ 0000000180038158     node_printer_win.obj
- 0002:00010170       ??_C@_0BF@HGPEJPKP@Expected?51?5arguments?$AA@ 0000000180038170     node_printer_win.obj
- 0002:00010188       ??_C@_0BM@MEFJKJPM@Argument?50?5must?5be?5a?5string?$AA@ 0000000180038188     node_printer_win.obj
- 0002:000101a8       ??_C@_0BJ@PPLHBNKL@error?5on?5PrinterHandle?3?5?$AA@ 00000001800381a8     node_printer_win.obj
- 0002:000101c8       ??_C@_0BG@PBCNBFJE@Error?5on?5GetPrinter?3?5?$AA@ 00000001800381c8     node_printer_win.obj
- 0002:000101e0       ??_C@_0BJ@IDGLMKA@not?5supported?5on?5windows?$AA@ 00000001800381e0     node_printer_win.obj
- 0002:00010200       ??_C@_0BF@BGKENFP@Expected?52?5arguments?$AA@ 0000000180038200     node_printer_win.obj
- 0002:00010218       ??_C@_0BO@JPDIFIDB@Argument?51?5must?5be?5an?5integer?$AA@ 0000000180038218     node_printer_win.obj
- 0002:00010238       ??_C@_0BB@EJICMOH@Wrong?5job?5number?$AA@ 0000000180038238     node_printer_win.obj
- 0002:00010250       ??_C@_0DC@KIMNJPPM@Error?5on?5GetJob?4?5Wrong?5job?5id?5or@ 0000000180038250     node_printer_win.obj
- 0002:00010288       ??_C@_0BF@JKMPABDA@Expected?53?5arguments?$AA@ 0000000180038288     node_printer_win.obj
- 0002:000102a0       ??_C@_0BM@LAONKPAN@Argument?52?5must?5be?5a?5string?$AA@ 00000001800382a0     node_printer_win.obj
- 0002:000102c0       ??_C@_0EM@JPOFEIGN@wrong?5job?5command?4?5use?5getSuppor@ 00000001800382c0     node_printer_win.obj
- 0002:00010310       ??_C@_0CA@LHKGIIJG@error?5on?5EnumPrintProcessorsW?3?5?$AA@ 0000000180038310     node_printer_win.obj
- 0002:00010330       ??_C@_0CI@LFDNKGLA@error?5on?5EnumPrintProcessorDatat@ 0000000180038330     node_printer_win.obj
- 0002:00010358       ??_C@_0BF@HFPCKENA@Expected?55?5arguments?$AA@ 0000000180038358     node_printer_win.obj
- 0002:00010370       ??_C@_0BD@MELPCPAM@Argument?50?5missing?$AA@ 0000000180038370     node_printer_win.obj
- 0002:00010388       ??_C@_0CG@GCEOJCFF@Argument?50?5must?5be?5a?5string?5or?5B@ 0000000180038388     node_printer_win.obj
- 0002:000103b0       ??_C@_0BM@BDLLCJKE@Argument?51?5must?5be?5a?5string?$AA@ 00000001800383b0     node_printer_win.obj
- 0002:000103d0       ??_C@_0BM@GHAPCPFF@Argument?53?5must?5be?5a?5string?$AA@ 00000001800383d0     node_printer_win.obj
- 0002:000103f0       ??_C@_0BJ@IAMFJIGO@StartPagePrinter?5error?3?5?$AA@ 00000001800383f0     node_printer_win.obj
- 0002:00010410       ??_C@_0BJ@CEPPOLFF@StartDocPrinterW?5error?3?5?$AA@ 0000000180038410     node_printer_win.obj
- 0002:00010430       ??_C@_0BD@FCINFPKM@not?5sent?5all?5bytes?$AA@ 0000000180038430     node_printer_win.obj
- 0002:00010448       ??_C@_0BP@BFBMJHKP@Not?5yet?5implemented?5on?5Windows?$AA@ 0000000180038448     node_printer_win.obj
- 0002:00010468       ??_C@_02BBAHNLBA@?$CFp?$AA@ 0000000180038468     node_printer_win.obj
- 0002:0001046c       ??_C@_02MDKMJEGG@eE?$AA@   000000018003846c     node_printer_win.obj
- 0002:00010470       ??_C@_02OOPEBDOJ@pP?$AA@   0000000180038470     node_printer_win.obj
- 0002:00010478       ??_C@_0BE@JONHPENG@map?1set?$DMT?$DO?5too?5long?$AA@ 0000000180038478     node_printer_win.obj
- 0002:00010490       ??_7?$basic_streambuf@DU?$char_traits@D@std@@@std@@6B@ 0000000180038490     node_printer_win.obj
- 0002:00010508       ??_7error_category@std@@6B@ 0000000180038508     node_printer_win.obj
- 0002:00010538       ??_7?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ 0000000180038538     node_printer_win.obj
- 0002:00010540       ??_7_Iostream_error_category@std@@6B@ 0000000180038540     node_printer_win.obj
- 0002:00010570       ??_7ios_base@std@@6B@      0000000180038570     node_printer_win.obj
- 0002:00010578       ??_7exception@stdext@@6B@  0000000180038578     node_printer_win.obj
- 0002:00010590       ??_7?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ 0000000180038590     node_printer_win.obj
- 0002:00010608       ??_8?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B@ 0000000180038608     node_printer_win.obj
- 0002:00010610       ??_7?$basic_ostream@DU?$char_traits@D@std@@@std@@6B@ 0000000180038610     node_printer_win.obj
- 0002:00010618       ??_7failure@ios_base@std@@6B@ 0000000180038618     node_printer_win.obj
- 0002:00010618       ??_7_System_error@std@@6B@ 0000000180038618     node_printer_win.obj
- 0002:00010630       ??_C@_08HCOMDCCD@iojs?4exe?$AA@ 0000000180038630     win_delay_load_hook.obj
- 0002:00010640       ??_C@_08JDDNMFDB@node?4exe?$AA@ 0000000180038640     win_delay_load_hook.obj
- 0002:00010650       __pfnDliNotifyHook2        0000000180038650     win_delay_load_hook.obj
- 0002:00010658       __real@4202a05f20000000    0000000180038658     node_printer_win.obj
- 0002:00010660       __xmm@7fffffffffffffff7fffffffffffffff 0000000180038660     node_printer_win.obj
- 0002:000106c8       _tls_used                  00000001800386c8     LIBCMT:tlssup.obj
- 0002:000106f0       ??_R4exception@std@@6B@    00000001800386f0     libcpmt:xthrow.obj
- 0002:00010718       ??_R3exception@std@@8      0000000180038718     libcpmt:xthrow.obj
- 0002:00010730       ??_R2exception@std@@8      0000000180038730     libcpmt:xthrow.obj
- 0002:00010740       ??_R1A@?0A@EA@exception@std@@8 0000000180038740     libcpmt:xthrow.obj
- 0002:00010768       ??_R4bad_alloc@std@@6B@    0000000180038768     libcpmt:xthrow.obj
- 0002:00010790       ??_R3bad_alloc@std@@8      0000000180038790     libcpmt:xthrow.obj
- 0002:000107a8       ??_R2bad_alloc@std@@8      00000001800387a8     libcpmt:xthrow.obj
- 0002:000107c0       ??_R1A@?0A@EA@bad_alloc@std@@8 00000001800387c0     libcpmt:xthrow.obj
- 0002:000107e8       ??_R4logic_error@std@@6B@  00000001800387e8     libcpmt:xthrow.obj
- 0002:00010810       ??_R3logic_error@std@@8    0000000180038810     libcpmt:xthrow.obj
- 0002:00010828       ??_R2logic_error@std@@8    0000000180038828     libcpmt:xthrow.obj
- 0002:00010840       ??_R1A@?0A@EA@logic_error@std@@8 0000000180038840     libcpmt:xthrow.obj
- 0002:00010868       ??_R4length_error@std@@6B@ 0000000180038868     libcpmt:xthrow.obj
- 0002:00010890       ??_R3length_error@std@@8   0000000180038890     libcpmt:xthrow.obj
- 0002:000108a8       ??_R2length_error@std@@8   00000001800388a8     libcpmt:xthrow.obj
- 0002:000108c8       ??_R1A@?0A@EA@length_error@std@@8 00000001800388c8     libcpmt:xthrow.obj
- 0002:000108f0       ??_R4out_of_range@std@@6B@ 00000001800388f0     libcpmt:xthrow.obj
- 0002:00010918       ??_R3out_of_range@std@@8   0000000180038918     libcpmt:xthrow.obj
- 0002:00010930       ??_R2out_of_range@std@@8   0000000180038930     libcpmt:xthrow.obj
- 0002:00010950       ??_R1A@?0A@EA@out_of_range@std@@8 0000000180038950     libcpmt:xthrow.obj
- 0002:00010978       ??_R4runtime_error@std@@6B@ 0000000180038978     libcpmt:xthrow.obj
- 0002:000109a0       ??_R3runtime_error@std@@8  00000001800389a0     libcpmt:xthrow.obj
- 0002:000109b8       ??_R2runtime_error@std@@8  00000001800389b8     libcpmt:xthrow.obj
- 0002:000109d0       ??_R1A@?0A@EA@runtime_error@std@@8 00000001800389d0     libcpmt:xthrow.obj
- 0002:000109f8       ??_R4_Facet_base@std@@6B@  00000001800389f8     libcpmt:locale0.obj
- 0002:00010a20       ??_R3_Facet_base@std@@8    0000000180038a20     libcpmt:locale0.obj
- 0002:00010a38       ??_R2_Facet_base@std@@8    0000000180038a38     libcpmt:locale0.obj
- 0002:00010a48       ??_R1A@?0A@EA@_Facet_base@std@@8 0000000180038a48     libcpmt:locale0.obj
- 0002:00010a70       ??_R4_Locimp@locale@std@@6B@ 0000000180038a70     libcpmt:locale0.obj
- 0002:00010a98       ??_R3_Locimp@locale@std@@8 0000000180038a98     libcpmt:locale0.obj
- 0002:00010ab0       ??_R2_Locimp@locale@std@@8 0000000180038ab0     libcpmt:locale0.obj
- 0002:00010ad8       ??_R1A@?0A@EA@_Locimp@locale@std@@8 0000000180038ad8     libcpmt:locale0.obj
- 0002:00010b00       ??_R1A@?0A@EA@facet@locale@std@@8 0000000180038b00     libcpmt:locale0.obj
- 0002:00010b28       ??_R3facet@locale@std@@8   0000000180038b28     libcpmt:locale0.obj
- 0002:00010b40       ??_R2facet@locale@std@@8   0000000180038b40     libcpmt:locale0.obj
- 0002:00010b60       ??_R17?0A@EA@_Crt_new_delete@std@@8 0000000180038b60     libcpmt:locale0.obj
- 0002:00010b88       ??_R3_Crt_new_delete@std@@8 0000000180038b88     libcpmt:locale0.obj
- 0002:00010ba0       ??_R2_Crt_new_delete@std@@8 0000000180038ba0     libcpmt:locale0.obj
- 0002:00010bb0       ??_R1A@?0A@EA@_Crt_new_delete@std@@8 0000000180038bb0     libcpmt:locale0.obj
- 0002:00010bd8       ??_R3ctype_base@std@@8     0000000180038bd8     libcpmt:locale.obj
- 0002:00010bf0       ??_R2ctype_base@std@@8     0000000180038bf0     libcpmt:locale.obj
- 0002:00010c18       ??_R1A@?0A@EA@ctype_base@std@@8 0000000180038c18     libcpmt:locale.obj
- 0002:00010c40       ??_R4?$ctype@D@std@@6B@    0000000180038c40     libcpmt:locale.obj
- 0002:00010c68       ??_R3?$ctype@D@std@@8      0000000180038c68     libcpmt:locale.obj
- 0002:00010c80       ??_R2?$ctype@D@std@@8      0000000180038c80     libcpmt:locale.obj
- 0002:00010cb0       ??_R1A@?0A@EA@?$ctype@D@std@@8 0000000180038cb0     libcpmt:locale.obj
- 0002:00010cd8       ??_R4?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@6B@ 0000000180038cd8     libcpmt:locale.obj
- 0002:00010d00       ??_R3?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@8 0000000180038d00     libcpmt:locale.obj
- 0002:00010d18       ??_R2?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@8 0000000180038d18     libcpmt:locale.obj
- 0002:00010d40       ??_R1A@?0A@EA@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@8 0000000180038d40     libcpmt:locale.obj
- 0002:00010d68       ??_R4?$numpunct@D@std@@6B@ 0000000180038d68     libcpmt:locale.obj
- 0002:00010d90       ??_R3?$numpunct@D@std@@8   0000000180038d90     libcpmt:locale.obj
- 0002:00010da8       ??_R2?$numpunct@D@std@@8   0000000180038da8     libcpmt:locale.obj
- 0002:00010dd0       ??_R1A@?0A@EA@?$numpunct@D@std@@8 0000000180038dd0     libcpmt:locale.obj
- 0002:00010df8       ??_R4type_info@@6B@        0000000180038df8     LIBCMT:std_type_info_static.obj
- 0002:00010e20       ??_R3type_info@@8          0000000180038e20     LIBCMT:std_type_info_static.obj
- 0002:00010e38       ??_R2type_info@@8          0000000180038e38     LIBCMT:std_type_info_static.obj
- 0002:00010e48       ??_R1A@?0A@EA@type_info@@8 0000000180038e48     LIBCMT:std_type_info_static.obj
- 0002:00010e70       ??_R4bad_array_new_length@std@@6B@ 0000000180038e70     LIBCMT:throw_bad_alloc.obj
- 0002:00010e98       ??_R3bad_array_new_length@std@@8 0000000180038e98     LIBCMT:throw_bad_alloc.obj
- 0002:00010eb0       ??_R2bad_array_new_length@std@@8 0000000180038eb0     LIBCMT:throw_bad_alloc.obj
- 0002:00010ed0       ??_R1A@?0A@EA@bad_array_new_length@std@@8 0000000180038ed0     LIBCMT:throw_bad_alloc.obj
- 0002:00010ef8       ??_R4bad_exception@std@@6B@ 0000000180038ef8     libvcruntime:frame.obj
- 0002:00010f20       ??_R3bad_exception@std@@8  0000000180038f20     libvcruntime:frame.obj
- 0002:00010f38       ??_R2bad_exception@std@@8  0000000180038f38     libvcruntime:frame.obj
- 0002:00010f50       ??_R1A@?0A@EA@bad_exception@std@@8 0000000180038f50     libvcruntime:frame.obj
- 0002:00011418       __rtc_iaa                  0000000180039418     LIBCMT:_initsect_.obj
- 0002:00011420       __rtc_izz                  0000000180039420     LIBCMT:_initsect_.obj
- 0002:00011428       __rtc_taa                  0000000180039428     LIBCMT:_initsect_.obj
- 0002:00011430       __rtc_tzz                  0000000180039430     LIBCMT:_initsect_.obj
- 0002:00013270       _TI2?AVbad_alloc@std@@     000000018003b270     libcpmt:xthrow.obj
- 0002:00013290       _CTA2?AVbad_alloc@std@@    000000018003b290     libcpmt:xthrow.obj
- 0002:000132a8       _CT??_R0?AVbad_alloc@std@@@8??0bad_alloc@std@@QEAA@AEBV01@@Z24 000000018003b2a8     libcpmt:xthrow.obj
- 0002:000132d0       _CT??_R0?AVexception@std@@@8??0exception@std@@QEAA@AEBV01@@Z24 000000018003b2d0     libcpmt:xthrow.obj
- 0002:000132f8       _CT??_R0?AVlogic_error@std@@@8??0logic_error@std@@QEAA@AEBV01@@Z24 000000018003b2f8     libcpmt:xthrow.obj
- 0002:00013320       _TI3?AVlength_error@std@@  000000018003b320     libcpmt:xthrow.obj
- 0002:00013340       _CTA3?AVlength_error@std@@ 000000018003b340     libcpmt:xthrow.obj
- 0002:00013360       _CT??_R0?AVlength_error@std@@@8??0length_error@std@@QEAA@AEBV01@@Z24 000000018003b360     libcpmt:xthrow.obj
- 0002:00013388       _TI3?AVout_of_range@std@@  000000018003b388     libcpmt:xthrow.obj
- 0002:000133a8       _CTA3?AVout_of_range@std@@ 000000018003b3a8     libcpmt:xthrow.obj
- 0002:000133c8       _CT??_R0?AVout_of_range@std@@@8??0out_of_range@std@@QEAA@AEBV01@@Z24 000000018003b3c8     libcpmt:xthrow.obj
- 0002:000133f0       _TI3?AVbad_array_new_length@std@@ 000000018003b3f0     LIBCMT:throw_bad_alloc.obj
- 0002:00013410       _CTA3?AVbad_array_new_length@std@@ 000000018003b410     LIBCMT:throw_bad_alloc.obj
- 0002:00013430       _CT??_R0?AVbad_array_new_length@std@@@8??0bad_array_new_length@std@@QEAA@AEBV01@@Z24 000000018003b430     LIBCMT:throw_bad_alloc.obj
- 0002:00013458       _TI2?AVbad_exception@std@@ 000000018003b458     libvcruntime:frame.obj
- 0002:00013478       _CTA2?AVbad_exception@std@@ 000000018003b478     libvcruntime:frame.obj
- 0002:00013490       _CT??_R0?AVbad_exception@std@@@8??0bad_exception@std@@QEAA@AEBV01@@Z24 000000018003b490     libvcruntime:frame.obj
- 0002:000134b4       __DELAY_IMPORT_DESCRIPTOR_node_exe 000000018003b4b4     node:node.exe
- 0002:000134d4       __NULL_DELAY_IMPORT_DESCRIPTOR 000000018003b4d4     node:node.exe
- 0002:000135d0       \177node_NULL_THUNK_DATA_DLN 000000018003b5d0     node:node.exe
- 0002:00013c10       \177node_NULL_THUNK_DATA_DLB 000000018003bc10     node:node.exe
- 0002:00013d4c       __IMPORT_DESCRIPTOR_KERNEL32 000000018003bd4c     kernel32:KERNEL32.dll
- 0002:00013d60       __IMPORT_DESCRIPTOR_WINSPOOL 000000018003bd60     winspool:WINSPOOL.DRV
- 0002:00013d74       __NULL_IMPORT_DESCRIPTOR   000000018003bd74     kernel32:KERNEL32.dll
- 0003:00000004       ?_Sync@ios_base@std@@0_NA  000000018003d004     libcpmt:ios.obj
- 0003:00000020       ?_PJP_CPP_Copyright@@3PADA 000000018003d020     libcpmt:iosptrs.obj
- 0003:00000080       _Init_global_epoch         000000018003d080     LIBCMT:thread_safe_statics.obj
- 0003:00000084       __scrt_native_dllmain_reason 000000018003d084     LIBCMT:utility.obj
- 0003:00000088       __security_cookie          000000018003d088     LIBCMT:gs_cookie.obj
- 0003:00000090       __security_cookie_complement 000000018003d090     LIBCMT:gs_cookie.obj
- 0003:00000098       _fltused                   000000018003d098     LIBCMT:fltused.obj
- 0003:000000a0       __isa_available            000000018003d0a0     LIBCMT:_cpu_disp_.obj
- 0003:000000a4       __isa_enabled              000000018003d0a4     LIBCMT:_cpu_disp_.obj
- 0003:000000a8       __memcpy_nt_iters          000000018003d0a8     LIBCMT:_cpu_disp_.obj
- 0003:000000c0       __abort_behavior           000000018003d0c0     libucrt:abort.obj
- 0003:000000d0       __acrt_lconv_c             000000018003d0d0     libucrt:localeconv.obj
- 0003:00000168       __acrt_lconv               000000018003d168     libucrt:localeconv.obj
- 0003:00000170       __acrt_lconv_static_decimal 000000018003d170     libucrt:localeconv.obj
- 0003:00000174       __acrt_lconv_static_W_decimal 000000018003d174     libucrt:localeconv.obj
- 0003:00000178       _pctype                    000000018003d178     libucrt:ctype.obj
- 0003:00000180       _pwctype                   000000018003d180     libucrt:ctype.obj
- 0003:000001a0       _iob                       000000018003d1a0     libucrt:_file.obj
- 0003:000002b0       __acrt_initial_locale_data 000000018003d2b0     libucrt:nlsdata.obj
- 0003:00000408       __acrt_initial_locale_pointers 000000018003d408     libucrt:nlsdata.obj
- 0003:00000418       __acrt_wide_c_locale_string 000000018003d418     libucrt:nlsdata.obj
- 0003:0000041c       __mb_cur_max               000000018003d41c     libucrt:nlsdata.obj
- 0003:00000424       __globallocalestatus       000000018003d424     libucrt:glstatus.obj
- 0003:000004c0       __acrt_initial_multibyte_data 000000018003d4c0     libucrt:mbctype.obj
- 0003:000006e8       __acrt_current_multibyte_data 000000018003d6e8     libucrt:mbctype.obj
- 0003:000007f0       _mbctype                   000000018003d7f0     libucrt:mbctype.obj
- 0003:00000900       _mbcasemap                 000000018003d900     libucrt:mbctype.obj
- 0003:00000a10       __dcrt_lowio_console_output_handle 000000018003da10     libucrt:initcon.obj
- 0003:00000a60       ??_R0?AVbad_alloc@std@@@8  000000018003da60     libcpmt:xthrow.obj
- 0003:00000a88       ??_R0?AVexception@std@@@8  000000018003da88     libcpmt:xthrow.obj
- 0003:00000ab0       ??_R0?AVlogic_error@std@@@8 000000018003dab0     libcpmt:xthrow.obj
- 0003:00000ad8       ??_R0?AVlength_error@std@@@8 000000018003dad8     libcpmt:xthrow.obj
- 0003:00000b00       ??_R0?AVout_of_range@std@@@8 000000018003db00     libcpmt:xthrow.obj
- 0003:00000b28       ??_R0?AVruntime_error@std@@@8 000000018003db28     libcpmt:xthrow.obj
- 0003:00000b50       ??_R0?AV_Facet_base@std@@@8 000000018003db50     libcpmt:locale0.obj
- 0003:00000b78       ??_R0?AV_Locimp@locale@std@@@8 000000018003db78     libcpmt:locale0.obj
- 0003:00000ba8       ??_R0?AVfacet@locale@std@@@8 000000018003dba8     libcpmt:locale0.obj
- 0003:00000bd0       ??_R0?AU_Crt_new_delete@std@@@8 000000018003dbd0     libcpmt:locale0.obj
- 0003:00000c00       ??_R0?AUctype_base@std@@@8 000000018003dc00     libcpmt:locale.obj
- 0003:00000c28       ??_R0?AV?$ctype@D@std@@@8  000000018003dc28     libcpmt:locale.obj
- 0003:00000c50       ??_R0?AV?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@@8 000000018003dc50     libcpmt:locale.obj
- 0003:00000cb0       ??_R0?AV?$numpunct@D@std@@@8 000000018003dcb0     libcpmt:locale.obj
- 0003:00000cd8       ??_R0?AVtype_info@@@8      000000018003dcd8     LIBCMT:std_type_info_static.obj
- 0003:00000cf8       ??_R0?AVbad_array_new_length@std@@@8 000000018003dcf8     LIBCMT:throw_bad_alloc.obj
- 0003:00000d28       ??_R0?AVbad_exception@std@@@8 000000018003dd28     libvcruntime:frame.obj
- 0003:00000d50       __imp_?GetCurrent@Isolate@v8@@SAPEAV12@XZ 000000018003dd50     node:node.exe
- 0003:00000d58       __imp_??1HandleScope@v8@@QEAA@XZ 000000018003dd58     node:node.exe
- 0003:00000d60       __imp_??0HandleScope@v8@@QEAA@PEAVIsolate@1@@Z 000000018003dd60     node:node.exe
- 0003:00000d68       __imp_?GetFunction@FunctionTemplate@v8@@QEAA?AV?$Local@VFunction@v8@@@2@XZ 000000018003dd68     node:node.exe
- 0003:00000d70       __imp_?New@FunctionTemplate@v8@@SA?AV?$Local@VFunctionTemplate@v8@@@2@PEAVIsolate@2@P6AXAEBV?$FunctionCallbackInfo@VValue@v8@@@2@@ZV?$Local@VValue@v8@@@2@V?$Local@VSignature@v8@@@2@H@Z 000000018003dd70     node:node.exe
- 0003:00000d78       __imp_?IsObject@Value@v8@@QEBA_NXZ 000000018003dd78     node:node.exe
- 0003:00000d80       __imp_??1Utf8Value@String@v8@@QEAA@XZ 000000018003dd80     node:node.exe
- 0003:00000d88       __imp_??0Utf8Value@String@v8@@QEAA@V?$Local@VValue@v8@@@2@@Z 000000018003dd88     node:node.exe
- 0003:00000d90       __imp_?NewFromUtf8@String@v8@@SA?AV?$Local@VString@v8@@@2@PEAVIsolate@2@PEBDW4NewStringType@12@H@Z 000000018003dd90     node:node.exe
- 0003:00000d98       __imp_?Set@Object@v8@@QEAA_NV?$Local@VValue@v8@@@2@0@Z 000000018003dd98     node:node.exe
- 0003:00000da0       __imp_?SetName@Function@v8@@QEAAXV?$Local@VString@v8@@@2@@Z 000000018003dda0     node:node.exe
- 0003:00000da8       __imp_node_module_register 000000018003dda8     node:node.exe
- 0003:00000db0       __imp_?HasInstance@Buffer@node@@YA_NV?$Local@VValue@v8@@@v8@@@Z 000000018003ddb0     node:node.exe
- 0003:00000db8       __imp_?Data@Buffer@node@@YAPEADV?$Local@VValue@v8@@@v8@@@Z 000000018003ddb8     node:node.exe
- 0003:00000dc0       __imp_?Length@Buffer@node@@YA_KV?$Local@VValue@v8@@@v8@@@Z 000000018003ddc0     node:node.exe
- 0003:00000dc8       __imp_?ToString@Value@v8@@QEBA?AV?$Local@VString@v8@@@2@XZ 000000018003ddc8     node:node.exe
- 0003:00000dd0       __imp_?ThrowException@Isolate@v8@@QEAA?AV?$Local@VValue@v8@@@2@V32@@Z 000000018003ddd0     node:node.exe
- 0003:00000dd8       __imp_?TypeError@Exception@v8@@SA?AV?$Local@VValue@v8@@@2@V?$Local@VString@v8@@@2@@Z 000000018003ddd8     node:node.exe
- 0003:00000de0       __imp_?New@Array@v8@@SA?AV?$Local@VArray@v8@@@2@PEAVIsolate@2@H@Z 000000018003dde0     node:node.exe
- 0003:00000de8       __imp_?Int32Value@Value@v8@@QEBAHXZ 000000018003dde8     node:node.exe
- 0003:00000df0       __imp_?IsInt32@Value@v8@@QEBA_NXZ 000000018003ddf0     node:node.exe
- 0003:00000df8       __imp_??1Value@String@v8@@QEAA@XZ 000000018003ddf8     node:node.exe
- 0003:00000e00       __imp_??0Value@String@v8@@QEAA@V?$Local@VValue@v8@@@2@@Z 000000018003de00     node:node.exe
- 0003:00000e08       __imp_?NewFromTwoByte@String@v8@@SA?AV?$Local@VString@v8@@@2@PEAVIsolate@2@PEBGW4NewStringType@12@H@Z 000000018003de08     node:node.exe
- 0003:00000e10       __imp_?New@Number@v8@@SA?AV?$Local@VNumber@v8@@@2@PEAVIsolate@2@N@Z 000000018003de10     node:node.exe
- 0003:00000e18       __imp_?New@Object@v8@@SA?AV?$Local@VObject@v8@@@2@PEAVIsolate@2@@Z 000000018003de18     node:node.exe
- 0003:00000e20       __imp_?Set@Object@v8@@QEAA_NIV?$Local@VValue@v8@@@2@@Z 000000018003de20     node:node.exe
- 0003:00000e28       \177node_NULL_THUNK_DATA_DLA 000000018003de28     node:node.exe
- 0003:00000e30       __hmod__node_exe           000000018003de30     node:node.exe
- 0003:00000f98       ?_Id_cnt@id@locale@std@@0HA 000000018003df98     libcpmt:locale0.obj
- 0003:00000fa0       ?_Clocptr@_Locimp@locale@std@@0PEAV123@EA 000000018003dfa0     libcpmt:locale0.obj
- 0003:00000fb0       ?id@?$ctype@_W@std@@2V0locale@2@A 000000018003dfb0     libcpmt:locale0.obj
- 0003:00000fb8       ?id@?$ctype@D@std@@2V0locale@2@A 000000018003dfb8     libcpmt:locale0.obj
- 0003:00000fc0       ?id@?$codecvt@GDU_Mbstatet@@@std@@2V0locale@2@A 000000018003dfc0     libcpmt:locale0.obj
- 0003:00000fc8       ?id@?$ctype@G@std@@2V0locale@2@A 000000018003dfc8     libcpmt:locale0.obj
- 0003:00000fe0       ?id@?$codecvt@_WDU_Mbstatet@@@std@@2V0locale@2@A 000000018003dfe0     libcpmt:locale0.obj
- 0003:0000104c       ?_Index@ios_base@std@@0HA  000000018003e04c     libcpmt:ios.obj
- 0003:00001050       ?_Raise_handler@std@@3P6AXAEBVexception@stdext@@@ZEA 000000018003e050     libcpmt:raisehan.obj
- 0003:00001060       ?_Ptr_cin@std@@3PEAV?$basic_istream@DU?$char_traits@D@std@@@1@EA 000000018003e060     libcpmt:iosptrs.obj
- 0003:00001068       ?_Ptr_cout@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA 000000018003e068     libcpmt:iosptrs.obj
- 0003:00001070       ?_Ptr_cerr@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA 000000018003e070     libcpmt:iosptrs.obj
- 0003:00001078       ?_Ptr_clog@std@@3PEAV?$basic_ostream@DU?$char_traits@D@std@@@1@EA 000000018003e078     libcpmt:iosptrs.obj
- 0003:00001080       ?_Ptr_wcin@std@@3PEAV?$basic_istream@_WU?$char_traits@_W@std@@@1@EA 000000018003e080     libcpmt:iosptrs.obj
- 0003:00001088       ?_Ptr_wcout@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA 000000018003e088     libcpmt:iosptrs.obj
- 0003:00001090       ?_Ptr_wcerr@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA 000000018003e090     libcpmt:iosptrs.obj
- 0003:00001098       ?_Ptr_wclog@std@@3PEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@EA 000000018003e098     libcpmt:iosptrs.obj
- 0003:000010f8       ?id@?$num_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A 000000018003e0f8     libcpmt:locale.obj
- 0003:00001100       ?id@?$codecvt@DDU_Mbstatet@@@std@@2V0locale@2@A 000000018003e100     libcpmt:locale.obj
- 0003:00001110       __encodedKERNEL32Functions 000000018003e110     libcpmt:winapisupp.obj
- 0003:00001250       ?id@?$time_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A 000000018003e250     libcpmt:wlocale.obj
- 0003:00001258       ?id@?$num_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A 000000018003e258     libcpmt:wlocale.obj
- 0003:00001260       ?id@?$num_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A 000000018003e260     libcpmt:wlocale.obj
- 0003:00001268       ?id@?$numpunct@_W@std@@2V0locale@2@A 000000018003e268     libcpmt:wlocale.obj
- 0003:00001270       ?id@?$collate@_W@std@@2V0locale@2@A 000000018003e270     libcpmt:wlocale.obj
- 0003:00001278       ?id@?$messages@_W@std@@2V0locale@2@A 000000018003e278     libcpmt:wlocale.obj
- 0003:00001280       ?id@?$money_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A 000000018003e280     libcpmt:wlocale.obj
- 0003:00001288       ?id@?$money_put@_WV?$ostreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A 000000018003e288     libcpmt:wlocale.obj
- 0003:00001290       ?id@?$moneypunct@_W$0A@@std@@2V0locale@2@A 000000018003e290     libcpmt:wlocale.obj
- 0003:00001298       ?id@?$moneypunct@_W$00@std@@2V0locale@2@A 000000018003e298     libcpmt:wlocale.obj
- 0003:000012a0       ?id@?$time_get@_WV?$istreambuf_iterator@_WU?$char_traits@_W@std@@@std@@@std@@2V0locale@2@A 000000018003e2a0     libcpmt:wlocale.obj
- 0003:000012a8       ?id@?$num_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A 000000018003e2a8     libcpmt:wlocale.obj
- 0003:000012b0       ?id@?$num_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A 000000018003e2b0     libcpmt:wlocale.obj
- 0003:000012b8       ?id@?$numpunct@G@std@@2V0locale@2@A 000000018003e2b8     libcpmt:wlocale.obj
- 0003:000012c0       ?id@?$collate@G@std@@2V0locale@2@A 000000018003e2c0     libcpmt:wlocale.obj
- 0003:000012c8       ?id@?$messages@G@std@@2V0locale@2@A 000000018003e2c8     libcpmt:wlocale.obj
- 0003:000012d0       ?id@?$money_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A 000000018003e2d0     libcpmt:wlocale.obj
- 0003:000012d8       ?id@?$money_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A 000000018003e2d8     libcpmt:wlocale.obj
- 0003:000012e0       ?id@?$moneypunct@G$0A@@std@@2V0locale@2@A 000000018003e2e0     libcpmt:wlocale.obj
- 0003:000012e8       ?id@?$moneypunct@G$00@std@@2V0locale@2@A 000000018003e2e8     libcpmt:wlocale.obj
- 0003:000012f0       ?id@?$time_get@GV?$istreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A 000000018003e2f0     libcpmt:wlocale.obj
- 0003:000012f8       ?id@?$time_put@GV?$ostreambuf_iterator@GU?$char_traits@G@std@@@std@@@std@@2V0locale@2@A 000000018003e2f8     libcpmt:wlocale.obj
- 0003:00001300       ?id@?$collate@D@std@@2V0locale@2@A 000000018003e300     libcpmt:xlocale.obj
- 0003:00001308       ?id@?$messages@D@std@@2V0locale@2@A 000000018003e308     libcpmt:xlocale.obj
- 0003:00001310       ?id@?$money_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A 000000018003e310     libcpmt:xlocale.obj
- 0003:00001318       ?id@?$money_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A 000000018003e318     libcpmt:xlocale.obj
- 0003:00001320       ?id@?$moneypunct@D$0A@@std@@2V0locale@2@A 000000018003e320     libcpmt:xlocale.obj
- 0003:00001328       ?id@?$moneypunct@D$00@std@@2V0locale@2@A 000000018003e328     libcpmt:xlocale.obj
- 0003:00001330       ?id@?$time_get@DV?$istreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A 000000018003e330     libcpmt:xlocale.obj
- 0003:00001338       ?id@?$time_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A 000000018003e338     libcpmt:xlocale.obj
- 0003:00001388       __scrt_current_native_startup_state 000000018003e388     LIBCMT:utility.obj
- 0003:00001390       __scrt_native_startup_lock 000000018003e390     LIBCMT:utility.obj
- 0003:00001940       __scrt_debugger_hook_flag  000000018003e940     LIBCMT:utility_desktop.obj
- 0003:00001944       _tls_index                 000000018003e944     LIBCMT:tlssup.obj
- 0003:00001948       __favor                    000000018003e948     LIBCMT:_cpu_disp_.obj
- 0003:00001950       ?__type_info_root_node@@3U__type_info_node@@A 000000018003e950     LIBCMT:tncleanup.obj
- 0003:00001960       ?_OptionsStorage@?1??__local_stdio_scanf_options@@9@4_KA 000000018003e960     LIBCMT:default_local_stdio_options.obj
- 0003:00001968       ?g_OutOfMemoryExceptionCallback@@3P6APEAXXZEA 000000018003e968     libvcruntime:frame.obj
- 0003:000019d8       __pPurecall                000000018003e9d8     libvcruntime:purevirt_data.obj
- 0003:00001a88       ?pArgList@UnDecorator@@0PEAVReplicator@@EA 000000018003ea88     libvcruntime:undname.obj
- 0003:00001a90       ?pZNameList@UnDecorator@@0PEAVReplicator@@EA 000000018003ea90     libvcruntime:undname.obj
- 0003:00001a98       ?pTemplateArgList@UnDecorator@@0PEAVReplicator@@EA 000000018003ea98     libvcruntime:undname.obj
- 0003:00001aa0       ?gName@UnDecorator@@0PEBDEB 000000018003eaa0     libvcruntime:undname.obj
- 0003:00001aa8       ?name@UnDecorator@@0PEBDEB 000000018003eaa8     libvcruntime:undname.obj
- 0003:00001ab0       ?outputString@UnDecorator@@0PEADEA 000000018003eab0     libvcruntime:undname.obj
- 0003:00001ab8       ?maxStringLength@UnDecorator@@0HA 000000018003eab8     libvcruntime:undname.obj
- 0003:00001abc       ?disableFlags@UnDecorator@@0KA 000000018003eabc     libvcruntime:undname.obj
- 0003:00001ac0       ?fExplicitTemplateParams@UnDecorator@@0_NA 000000018003eac0     libvcruntime:undname.obj
- 0003:00001ac1       ?fGetTemplateArgumentList@UnDecorator@@0_NA 000000018003eac1     libvcruntime:undname.obj
- 0003:00001ac8       ?m_pGetParameter@UnDecorator@@0P6APEADJ@ZEA 000000018003eac8     libvcruntime:undname.obj
- 0003:00001b00       __acrt_lconv_static_null   000000018003eb00     libucrt:localeconv.obj
- 0003:00001b04       __acrt_lconv_static_W_null 000000018003eb04     libucrt:localeconv.obj
- 0003:00001e48       _environ_table             000000018003ee48     libucrt:environment_initialization.obj
- 0003:00001e50       _wenviron_table            000000018003ee50     libucrt:environment_initialization.obj
- 0003:00001e58       __dcrt_initial_wide_environment 000000018003ee58     libucrt:environment_initialization.obj
- 0003:00001e60       __dcrt_initial_narrow_environment 000000018003ee60     libucrt:environment_initialization.obj
- 0003:00001e68       __acrt_atexit_table        000000018003ee68     libucrt:onexit.obj
- 0003:00001e80       __acrt_at_quick_exit_table 000000018003ee80     libucrt:onexit.obj
- 0003:00001eb8       _nstream                   000000018003eeb8     libucrt:_file.obj
- 0003:00001ec0       __piob                     000000018003eec0     libucrt:_file.obj
- 0003:00001ed0       __acrt_stdout_buffer       000000018003eed0     libucrt:_sftbuf.obj
- 0003:00001ed8       __acrt_stderr_buffer       000000018003eed8     libucrt:_sftbuf.obj
- 0003:00001ee0       __acrt_locale_changed_data 000000018003eee0     libucrt:wsetlocale.obj
- 0003:00001ee8       __acrt_current_locale_data 000000018003eee8     libucrt:nlsdata.obj
- 0003:00001ef0       __pioinfo                  000000018003eef0     libucrt:ioinit.obj
- 0003:000022f0       _nhandle                   000000018003f2f0     libucrt:ioinit.obj
- 0003:000024b0       __acrt_heap                000000018003f4b0     libucrt:heap_handle.obj
- 0003:000024b8       __fma3_is_available        000000018003f4b8     libucrt:fma3_available.obj
- 0003:000024bc       __use_fma3_lib             000000018003f4bc     libucrt:fma3_available.obj
- 0003:000024c0       ?_timezone@@3V?$dual_state_global@J@__crt_state_management@@A 000000018003f4c0     libucrt:timeset.obj
- 0003:000024c4       ?_daylight@@3V?$dual_state_global@H@__crt_state_management@@A 000000018003f4c4     libucrt:timeset.obj
- 0003:000024c8       ?_dstbias@@3V?$dual_state_global@J@__crt_state_management@@A 000000018003f4c8     libucrt:timeset.obj
- 0003:0000259c       __mbcodepage               000000018003f59c     libucrt:mbctype.obj
- 0003:000025a0       __ismbcodepage             000000018003f5a0     libucrt:mbctype.obj
- 0003:000025a8       __mbulinfo                 000000018003f5a8     libucrt:mbctype.obj
- 0003:000025b8       __mblocalename             000000018003f5b8     libucrt:mbctype.obj
- 0003:000025c4       __argc                     000000018003f5c4     libucrt:argv_data.obj
- 0003:000025c8       __argv                     000000018003f5c8     libucrt:argv_data.obj
- 0003:000025d0       __wargv                    000000018003f5d0     libucrt:argv_data.obj
- 0003:000025d8       _acmdln                    000000018003f5d8     libucrt:argv_data.obj
- 0003:000025e0       _wcmdln                    000000018003f5e0     libucrt:argv_data.obj
- 0003:000025e8       _pgmptr                    000000018003f5e8     libucrt:argv_data.obj
- 0003:00002600       ?DloadKernel32@@3PEAUHINSTANCE__@@EA 000000018003f600     DelayImp:delayhlp.obj
- 0003:00002608       ?DloadAcquireSRWLockExclusive@@3P6AXPEA_K@ZEA 000000018003f608     DelayImp:delayhlp.obj
- 0003:00002610       ?DloadReleaseSRWLockExclusive@@3P6AXPEA_K@ZEA 000000018003f610     DelayImp:delayhlp.obj
- 0003:00002618       ?DloadSrwLock@@3_KA        000000018003f618     DelayImp:delayhlp.obj
- 0003:00002620       ?DloadSectionLockCount@@3KA 000000018003f620     DelayImp:delayhlp.obj
- 0003:00002624       ?DloadSectionOldProtection@@3KA 000000018003f624     DelayImp:delayhlp.obj
- 0003:00002628       ?DloadSectionCommitPermanent@@3KA 000000018003f628     DelayImp:delayhlp.obj
- 0003:00002630       ?_Psave@?$_Facetptr@V?$numpunct@D@std@@@std@@2PEBVfacet@locale@2@EB 000000018003f630     node_printer_win.obj
- 0003:00002638       ?_Psave@?$_Facetptr@V?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@@std@@2PEBVfacet@locale@2@EB 000000018003f638     node_printer_win.obj
- 0003:00002640       ?_Psave@?$_Facetptr@V?$ctype@D@std@@@std@@2PEBVfacet@locale@2@EB 000000018003f640     node_printer_win.obj
- 0003:00002670       ?id@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@2V0locale@2@A 000000018003f670     node_printer_win.obj
- 0003:00002680       ?_OptionsStorage@?1??__local_stdio_printf_options@@9@4_KA 000000018003f680     node_printer_win.obj
- 0003:00002688       ?id@?$numpunct@D@std@@2V0locale@2@A 000000018003f688     node_printer_win.obj
- 0003:00002694       ?$TSS0@?1???$_Immortalize@V_Iostream_error_category@std@@@std@@YAAEAV_Iostream_error_category@1@XZ@4HA 000000018003f694     node_printer_win.obj
- 0003:000026a8       ?_Static@?1???$_Immortalize@V_Iostream_error_category@std@@@std@@YAAEAV_Iostream_error_category@1@XZ@4U?$_Immortalizer@V_Iostream_error_category@std@@@1@A 000000018003f6a8     node_printer_win.obj
- 0003:000026c8       __dyn_tls_init_callback    000000018003f6c8     <common>
- 0003:000026d0       __scrt_ucrt_dll_is_in_use  000000018003f6d0     <common>
- 0006:00000000       _tls_start                 0000000180044000     LIBCMT:tlssup.obj
- 0006:00000004       _Init_thread_epoch         0000000180044004     LIBCMT:thread_safe_statics.obj
- 0006:00000008       _tls_end                   0000000180044008     LIBCMT:tlssup.obj
-
- entry point at        0001:0000cffc
-
- Static symbols
-
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     node_printer.exp
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     node:node.exe
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     winspool:WINSPOOL.DRV
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0000:fffb9000       .debug$S                   0000000180000000     kernel32:KERNEL32.dll
- 0001:00000000       ??__Einitlocks@std@@YAXXZ  0000000180001000 f   libcpmt:xlock.obj
- 0001:00000020       ??__E_Fac_tidy_reg@std@@YAXXZ 0000000180001020 f   libcpmt:locale0.obj
- 0001:0000002c       ??__Eclassic_locale@std@@YAXXZ 000000018000102c f   libcpmt:locale0.obj
- 0001:00000038       ??__Einit_atexit@@YAXXZ    0000000180001038 f   libcpmt:iosptrs.obj
- 0001:00000044       ??__Einitlocks@std@@YAXXZ  0000000180001044 f   libcpmt:iosptrs.obj
- 0001:00000240       _register_node_printer     0000000180001240 f   node_printer.obj
- 0001:000014a0       ?getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 00000001800024a0 f   node_printer_win.obj
- 0001:00001b40       ?getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180002b40 f   node_printer_win.obj
- 0001:00002020       ?getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180003020 f   node_printer_win.obj
- 0001:00002500       ?getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180003500 f   node_printer_win.obj
- 0001:00002900       ?parseJobObject@?A0xcb87c0d3@@YAXPEAU_JOB_INFO_2W@@V?$Local@VObject@v8@@@v8@@@Z 0000000180003900 f   node_printer_win.obj
- 0001:00003080       ?getLastErrorCodeAndMessage@?A0xcb87c0d3@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ 0000000180004080 f   node_printer_win.obj
- 0001:00003290       ?retrieveAndParseJobs@?A0xcb87c0d3@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEA_WAEBKV?$Local@VObject@v8@@@v8@@AEAUPrinterHandle@1@@Z 0000000180004290 f   node_printer_win.obj
- 0001:00003600       ?parsePrinterInfo@?A0xcb87c0d3@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEBU_PRINTER_INFO_2W@@V?$Local@VObject@v8@@@v8@@AEAUPrinterHandle@1@@Z 0000000180004600 f   node_printer_win.obj
- 0001:000068c0       no_op_initialize           00000001800078c0 f i libucrt:wsetlocale.obj
- 0001:0000abc0       ?load_exe_hook@@YAP6A_JXZIPEAUDelayLoadInfo@@@Z 000000018000bbc0 f   win_delay_load_hook.obj
- 0001:0000b618       tidy_global                000000018000c618 f   libcpmt:locale0.obj
- 0001:0000be4c       ?initialize_pointers@@YAHXZ 000000018000ce4c f   libcpmt:winapisupp.obj
- 0001:0000c550       $$000000                   000000018000d550     LIBCMT:_amdsecgs_.obj
- 0001:0000c5d0       ?__scrt_initialize_thread_safe_statics@@YAHXZ 000000018000d5d0 f   LIBCMT:thread_safe_statics.obj
- 0001:0000c6f0       ?__scrt_uninitialize_thread_safe_statics@@YAXXZ 000000018000d6f0 f   LIBCMT:thread_safe_statics.obj
- 0001:0000ccb0       ?dllmain_crt_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 000000018000dcb0 f   LIBCMT:dll_dllmain.obj
- 0001:0000cd00       ?dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z 000000018000dd00 f   LIBCMT:dll_dllmain.obj
- 0001:0000ce2c       ?dllmain_crt_process_detach@@YAH_N@Z 000000018000de2c f   LIBCMT:dll_dllmain.obj
- 0001:0000ceb0       ?dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 000000018000deb0 f   LIBCMT:dll_dllmain.obj
- 0001:0000cfa8       ?dllmain_raw@@YAHQEAUHINSTANCE__@@KQEAX@Z 000000018000dfa8 f   LIBCMT:dll_dllmain.obj
- 0001:0000d0f0       $$000000                   000000018000e0f0     LIBCMT:_chkstk_.obj
- 0001:0000d30c       capture_current_context    000000018000e30c f   LIBCMT:gs_report.obj
- 0001:0000d37c       capture_previous_context   000000018000e37c f   LIBCMT:gs_report.obj
- 0001:0000d930       $$000000                   000000018000e930     libvcruntime:memcpy.obj
- 0001:0000d9d7       MoveSmall                  000000018000e9d7     libvcruntime:memcpy.obj
- 0001:0000e040       ?CatchIt@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@PEBU_s_HandlerType@@PEBU_s_CatchableType@@PEBU_s_TryBlockMapEntry@@H1EE@Z 000000018000f040 f   libvcruntime:frame.obj
- 0001:0000e104       ?ExFilterRethrow@@YAHPEAU_EXCEPTION_POINTERS@@PEAUEHExceptionRecord@@PEAH@Z 000000018000f104 f   libvcruntime:frame.obj
- 0001:0000e18c       ?FindHandler@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@EH1@Z 000000018000f18c f   libvcruntime:frame.obj
- 0001:0000e65c       ?FindHandlerForForeignException@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@HH1@Z 000000018000f65c f   libvcruntime:frame.obj
- 0001:0000e8c8       ?IsInExceptionSpec@@YAEPEAUEHExceptionRecord@@PEBU_s_ESTypeList@@@Z 000000018000f8c8 f   libvcruntime:frame.obj
- 0001:0000fab0       $$000000                   0000000180010ab0     libvcruntime:memset.obj
- 0001:0000fb9c       MsetTab                    0000000180010b9c     libvcruntime:memset.obj
- 0001:0000fc60       $$000000                   0000000180010c60     libvcruntime:memcmp.obj
- 0001:0000fd38       ?try_get_function@@YAPEAXW4function_id@?A0x679b24ab@@QEBDQEBW4module_id@2@2@Z 0000000180010d38 f   libvcruntime:winapi_downlevel.obj
- 0001:00010720       $$000000                   0000000180011720     libvcruntime:handlers.obj
- 0001:00010770       $$000000                   0000000180011770     libvcruntime:_jmpuwind_.obj
- 0001:00010c08       ??$common_vsprintf@Vformat_validation_base@__crt_stdio_output@@D@@YAH_KQEAD0QEBDQEAU__crt_locale_pointers@@1@Z 0000000180011c08 f   libucrt:output.obj
- 0001:000124d8       call_wsetlocale            00000001800134d8 f   libucrt:setlocale.obj
- 0001:00013154       ?x_ismbbtype_l@@YAHPEAU__crt_locale_pointers@@IHH@Z 0000000180014154 f   libucrt:ismbbyte.obj
- 0001:000137b0       memcpy_s                   00000001800147b0 f   libucrt:cfout.obj
- 0001:000137b0       memcpy_s                   00000001800147b0 f   libucrt:strtod.obj
- 0001:00013840       $$000000                   0000000180014840     libucrt:pow.obj
- 0001:00014ee0       $$000000                   0000000180015ee0     libucrt:powf.obj
- 0001:00015e00       ?internal_isupper_l@@YA_NHQEAU__crt_locale_pointers@@@Z 0000000180016e00 f   libucrt:tolower_toupper.obj
- 0001:00016590       ?atexit_exception_filter@@YAHK@Z 0000000180017590 f   libucrt:exit.obj
- 0001:0001659c       ?common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z 000000018001759c f   libucrt:exit.obj
- 0001:00016708       ?exit_or_terminate_process@@YAXI@Z 0000000180017708 f   libucrt:exit.obj
- 0001:00016754       ?try_cor_exit_process@@YAXI@Z 0000000180017754 f   libucrt:exit.obj
- 0001:000167ec       ??$parse_command_line@D@@YAXPEADPEAPEAD0PEA_K2@Z 00000001800177ec f   libucrt:argv_parsing.obj
- 0001:00016b84       ??$common_initialize_environment_nolock@D@@YAHXZ 0000000180017b84 f   libucrt:environment_initialization.obj
- 0001:00016bf0       ??$create_environment@D@@YAQEAPEADQEAD@Z 0000000180017bf0 f   libucrt:environment_initialization.obj
- 0001:00016cec       ??$free_environment@D@@YAXQEAPEAD@Z 0000000180017cec f   libucrt:environment_initialization.obj
- 0001:00016cec       ??$free_environment@_W@@YAXQEAPEA_W@Z 0000000180017cec f   libucrt:environment_initialization.obj
- 0001:00016d30       ??$uninitialize_environment_internal@D@@YAXAEAPEAPEAD@Z 0000000180017d30 f   libucrt:environment_initialization.obj
- 0001:00016d4c       ??$uninitialize_environment_internal@_W@@YAXAEAPEAPEA_W@Z 0000000180017d4c f   libucrt:environment_initialization.obj
- 0001:00016f84       ??R<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@QEBAHXZ 0000000180017f84 f   libucrt:onexit.obj
- 0001:00017234       initialize_global_variables 0000000180018234 f   libucrt:initialization.obj
- 0001:00017248       initialize_c               0000000180018248 f   libucrt:initialization.obj
- 0001:0001726c       uninitialize_environment   000000018001826c f   libucrt:initialization.obj
- 0001:0001727c       uninitialize_global_state_isolation 000000018001827c f   libucrt:initialization.obj
- 0001:0001727c       initialize_environment     000000018001827c f   libucrt:initialization.obj
- 0001:0001727c       initialize_global_state_isolation 000000018001827c f   libucrt:initialization.obj
- 0001:0001727c       uninitialize_c             000000018001827c f   libucrt:initialization.obj
- 0001:0001727c       report_memory_leaks        000000018001827c f   libucrt:initialization.obj
- 0001:00017280       initialize_pointers        0000000180018280 f   libucrt:initialization.obj
- 0001:000172d4       uninitialize_vcruntime     00000001800182d4 f   libucrt:initialization.obj
- 0001:000172dc       uninitialize_allocated_memory 00000001800182dc f   libucrt:initialization.obj
- 0001:0001807c       ?construct_ptd_array@@YAXQEAU__acrt_ptd@@@Z 000000018001907c f   libucrt:per_thread_data.obj
- 0001:0001814c       ?destroy_fls@@YAXPEAX@Z    000000018001914c f   libucrt:per_thread_data.obj
- 0001:0001816c       ?destroy_ptd_array@@YAXQEAU__acrt_ptd@@@Z 000000018001916c f   libucrt:per_thread_data.obj
- 0001:00018264       ?replace_current_thread_locale_nolock@@YAXQEAU__acrt_ptd@@QEAU__crt_locale_data@@@Z 0000000180019264 f   libucrt:per_thread_data.obj
- 0001:00018bc0       ?fp_format_a@@YAHQEBNPEAD_KQEAD2H_NIQEAU__crt_locale_pointers@@@Z 0000000180019bc0 f   libucrt:cvt.obj
- 0001:00018f20       ?fp_format_e@@YAHQEBNQEAD_K12H_NIQEAU__crt_locale_pointers@@@Z 0000000180019f20 f   libucrt:cvt.obj
- 0001:00018ff0       ?fp_format_e_internal@@YAHQEAD_KH_NIQEAU_strflt@@2QEAU__crt_locale_pointers@@@Z 0000000180019ff0 f   libucrt:cvt.obj
- 0001:000191cc       ?fp_format_f_internal@@YAHQEAD_KHQEAU_strflt@@_NQEAU__crt_locale_pointers@@@Z 000000018001a1cc f   libucrt:cvt.obj
- 0001:00019314       ?fp_format_g@@YAHQEBNQEAD_K12H_NIQEAU__crt_locale_pointers@@@Z 000000018001a314 f   libucrt:cvt.obj
- 0001:0001944c       ?fp_format_nan_or_infinity@@YAHW4__acrt_fp_class@@_NPEAD_K1@Z 000000018001a44c f   libucrt:cvt.obj
- 0001:00019b10       ??R<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@QEBAXXZ 000000018001ab10 f   libucrt:wsetlocale.obj
- 0001:00019ed4       _copytlocinfo_nolock       000000018001aed4 f   libucrt:wsetlocale.obj
- 0001:0001a494       _wsetlocale_get_all        000000018001b494 f   libucrt:wsetlocale.obj
- 0001:0001a67c       _wsetlocale_nolock         000000018001b67c f   libucrt:wsetlocale.obj
- 0001:0001a904       _wsetlocale_set_cat        000000018001b904 f   libucrt:wsetlocale.obj
- 0001:0001ac44       ?initialize_inherited_file_handles_nolock@@YAXXZ 000000018001bc44 f   libucrt:ioinit.obj
- 0001:0001ad30       ?initialize_stdio_handles_nolock@@YAXXZ 000000018001bd30 f   libucrt:ioinit.obj
- 0001:0001b938       ?<helper_func_cdecl>@<lambda_e2bb8337c48846e80c921ea5ddadc92d>@@CAHPEA_W@Z 000000018001c938 f   libucrt:winapi_thunks.obj
- 0001:0001ba14       ?try_get_function@@YAPEAXW4function_id@?A0x63058377@@QEBDQEBW4module_id@2@2@Z 000000018001ca14 f   libucrt:winapi_thunks.obj
- 0001:0001c2d0       ?_mbstowcs_l_helper@@YA_KPEA_WPEBD_KPEAU__crt_locale_pointers@@@Z 000000018001d2d0 f   libucrt:mbstowcs.obj
- 0001:0001c5fc       ?_wcstombs_l_helper@@YA_KPEADPEB_W_KPEAU__crt_locale_pointers@@@Z 000000018001d5fc f   libucrt:wcstombs.obj
- 0001:0001cb5c       ?InternalGetLocaleInfoA@@YAHQEAU__crt_locale_pointers@@QEB_WKQEADH@Z 000000018001db5c f   libucrt:getlocaleinfoa.obj
- 0001:0001d078       ?__acrt_LCMapStringA_stat@@YAHPEAU__crt_locale_pointers@@PEB_WKPEBDHPEADHHH@Z 000000018001e078 f   libucrt:lcmapstringa.obj
- 0001:0001d9e8       ?<helper_func_cdecl>@<lambda_2feae5270eb4d0d5532525f423405775>@@CAHPEBX0@Z 000000018001e9e8 f   libucrt:argv_wildcards.obj
- 0001:0001d9fc       ??$common_expand_argv_wildcards@D@@YAHQEAPEADQEAPEAPEAD@Z 000000018001e9fc f   libucrt:argv_wildcards.obj
- 0001:0001dc08       ??$copy_and_add_argument_to_buffer@D@@YAHQEBD0_KAEAV?$argument_list@D@?A0xca0879c4@@@Z 000000018001ec08 f   libucrt:argv_wildcards.obj
- 0001:0001dd18       ??$expand_argument_wildcards@D@@YAHQEAD0AEAV?$argument_list@D@?A0xca0879c4@@@Z 000000018001ed18 f   libucrt:argv_wildcards.obj
- 0001:0001dfcc       ??R<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@QEBAXXZ 000000018001efcc f   libucrt:mbctype.obj
- 0001:0001e1e4       ?getSystemCP@@YAHH@Z       000000018001f1e4 f   libucrt:mbctype.obj
- 0001:0001e264       ?setSBCS@@YAXPEAU__crt_multibyte_data@@@Z 000000018001f264 f   libucrt:mbctype.obj
- 0001:0001e2f4       ?setSBUpLow@@YAXPEAU__crt_multibyte_data@@@Z 000000018001f2f4 f   libucrt:mbctype.obj
- 0001:0001e4d8       ?setmbcp_internal@@YAHH_N@Z 000000018001f4d8 f   libucrt:mbctype.obj
- 0001:000206fc       common_flush_all           00000001800216fc f   libucrt:fflush.obj
- 0001:00021210       ?free_crt_array_internal@@YAXQEAPEBX_K@Z 0000000180022210 f   libucrt:inittime.obj
- 0001:00021268       ?initialize_lc_time@@YA_NQEAU__crt_lc_time_data@@QEAU__crt_locale_data@@@Z 0000000180022268 f   libucrt:inittime.obj
- 0001:00021958       GetLocaleNameFromDefault   0000000180022958 f   libucrt:get_qualified_locale.obj
- 0001:00021a00       GetLocaleNameFromLangCountry 0000000180022a00 f   libucrt:get_qualified_locale.obj
- 0001:00021ad0       GetLocaleNameFromLanguage  0000000180022ad0 f   libucrt:get_qualified_locale.obj
- 0001:00021b6c       LangCountryEnumProcEx      0000000180022b6c f   libucrt:get_qualified_locale.obj
- 0001:00021f20       LanguageEnumProcEx         0000000180022f20 f   libucrt:get_qualified_locale.obj
- 0001:0002200c       ProcessCodePage            000000018002300c f   libucrt:get_qualified_locale.obj
- 0001:000220c0       TestDefaultCountry         00000001800230c0 f   libucrt:get_qualified_locale.obj
- 0001:00022128       TranslateName              0000000180023128 f   libucrt:get_qualified_locale.obj
- 0001:000223e4       CountryEnumProc            00000001800233e4 f   libucrt:getqloc_downlevel.obj
- 0001:000224d0       GetLcidFromLangCountry     00000001800234d0 f   libucrt:getqloc_downlevel.obj
- 0001:000225a0       GetLcidFromLanguage        00000001800235a0 f   libucrt:getqloc_downlevel.obj
- 0001:00022638       LangCountryEnumProc        0000000180023638 f   libucrt:getqloc_downlevel.obj
- 0001:0002287c       LanguageEnumProc           000000018002387c f   libucrt:getqloc_downlevel.obj
- 0001:00022978       LcidFromHexString          0000000180023978 f   libucrt:getqloc_downlevel.obj
- 0001:000229c8       ProcessCodePage            00000001800239c8 f   libucrt:getqloc_downlevel.obj
- 0001:00022a78       TestDefaultLanguage        0000000180023a78 f   libucrt:getqloc_downlevel.obj
- 0001:00022b24       TranslateName              0000000180023b24 f   libucrt:getqloc_downlevel.obj
- 0001:00023160       $$000000                   0000000180024160     libucrt:fpsr.obj
- 0001:000231c0       ?GetTableIndexFromLocaleName@@YAHPEB_W@Z 00000001800241c0 f   libucrt:lcidtoname_downlevel.obj
- 0001:000234fc       _call_matherr              00000001800244fc f   libucrt:libm_error.obj
- 0001:00023564       _exception_enabled         0000000180024564 f   libucrt:libm_error.obj
- 0001:00023970       ?shortsort@@YAXPEAD0_KP6AHPEBX2@Z@Z 0000000180024970 f   libucrt:qsort.obj
- 0001:00023eb4       ?initialize_multibyte@@YAHXZ 0000000180024eb4 f   libucrt:multibyte_initializer.obj
- 0001:00024090       $$000000                   0000000180025090     libucrt:log10.obj
- 0001:0002463c       ?write_double_translated_ansi_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 000000018002563c f   libucrt:write.obj
- 0001:00024844       ?write_text_ansi_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 0000000180025844 f   libucrt:write.obj
- 0001:0002494c       ?write_text_utf16le_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 000000018002594c f   libucrt:write.obj
- 0001:00024a68       ?write_text_utf8_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 0000000180025a68 f   libucrt:write.obj
- 0001:00024fac       ??$common_lseek_nolock@_J@@YA_JH_JH@Z 0000000180025fac f   libucrt:lseek.obj
- 0001:00025260       ??$common_xtox@K_W@@YAHKQEA_W_KI_N@Z 0000000180026260 f   libucrt:xtoa.obj
- 0001:0002530c       ??$common_xtox_s@K_W@@YAHKQEA_W_KI_N@Z 000000018002630c f   libucrt:xtoa.obj
- 0001:00025644       common_control87           0000000180026644 f   libucrt:ieee.obj
- 0001:00025990       _log_special_common        0000000180026990 f   libucrt:log_special.obj
- 0001:00026670       $$000000                   0000000180027670     LIBCMT:_guard_dispatch_.obj
- 0001:00026690       ?dtor$0@?0??_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z@4HA 0000000180027690 f   libcpmt:locale0.obj
- 0001:00026690       ?dtor$0@?0??_Init@locale@std@@CAPEAV_Locimp@12@_N@Z@4HA 0000000180027690 f   libcpmt:locale0.obj
- 0001:0002669c       __scrt_is_nonwritable_in_current_image$filt$0 000000018002769c f   LIBCMT:utility.obj
- 0001:000266b4       ?fin$0@?0??dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z@4HA 00000001800276b4 f   LIBCMT:dll_dllmain.obj
- 0001:000266cb       ?fin$0@?0??dllmain_crt_process_detach@@YAH_N@Z@4HA 00000001800276cb f   LIBCMT:dll_dllmain.obj
- 0001:000266e7       ?filt$0@?0??dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z@4HA 00000001800276e7 f   LIBCMT:dll_dllmain.obj
- 0001:0002671d       __CxxCallCatchBlock$filt$0 000000018002771d f   libvcruntime:frame.obj
- 0001:00026742       __CxxCallCatchBlock$fin$1  0000000180027742 f   libvcruntime:frame.obj
- 0001:000267ba       __DestructExceptionObject$filt$0 00000001800277ba f   libvcruntime:frame.obj
- 0001:000267d2       __FrameUnwindToState$filt$0 00000001800277d2 f   libvcruntime:frame.obj
- 0001:000267e8       __FrameUnwindToState$fin$1 00000001800277e8 f   libvcruntime:frame.obj
- 0001:0002680b       _CallSETranslator$filt$0   000000018002780b f   libvcruntime:trnsctrl.obj
- 0001:00026857       setlocale$fin$0            0000000180027857 f   libucrt:setlocale.obj
- 0001:00026872       _query_new_handler$fin$0   0000000180027872 f   libucrt:new_handler.obj
- 0001:00026888       ?filt$0@?0??common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z@4HA 0000000180027888 f   libucrt:exit.obj
- 0001:000268a3       ?fin$1@?0??common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z@4HA 00000001800278a3 f   libucrt:exit.obj
- 0001:000268bc       ?fin$0@?0???$?RV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@V<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@$$QEAV<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@Z@4HA 00000001800278bc f   libucrt:onexit.obj
- 0001:000268d9       ?fin$0@?0???$?RV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@V<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@$$QEAV<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@Z@4HA 00000001800278d9 f   libucrt:mbctype.obj
- 0001:000268d9       ?fin$0@?0???$?RV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@V<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@$$QEAV<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@Z@4HA 00000001800278d9 f   libucrt:onexit.obj
- 0001:000268d9       ?fin$0@?0???$?RV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@V<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@$$QEAV<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@Z@4HA 00000001800278d9 f   libucrt:wsetlocale.obj
- 0001:000268d9       ?fin$0@?0???$?RV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@V<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@$$QEAV<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@Z@4HA 00000001800278d9 f   libucrt:per_thread_data.obj
- 0001:000268d9       ?fin$0@?0???$?RV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@V<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@$$QEAV<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@Z@4HA 00000001800278d9 f   libucrt:per_thread_data.obj
- 0001:000268d9       ?fin$0@?0???$?RV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@V<lambda_341c25c0346d94847f1f3c463c57e077>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@$$QEAV<lambda_341c25c0346d94847f1f3c463c57e077>@@@Z@4HA 00000001800278d9 f   libucrt:per_thread_data.obj
- 0001:000268d9       ?fin$0@?0???$?RV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@V<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@?$__crt_seh_guarded_call@P6AXH@Z@@QEAAP6AXH@Z$$QEAV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@$$QEAV<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@Z@4HA 00000001800278d9 f   libucrt:signal.obj
- 0001:000268d9       ?fin$0@?0???$?RV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@V<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@$$QEAV<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@Z@4HA 00000001800278d9 f   libucrt:winapi_thunks.obj
- 0001:000268d9       ?fin$0@?0???$?RV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@V<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@$$QEAV<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@Z@4HA 00000001800278d9 f   libucrt:per_thread_data.obj
- 0001:000268f3       raise$fin$0                00000001800278f3 f   libucrt:signal.obj
- 0001:00026917       ?fin$0@?0???$?RV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@Z@4HA 0000000180027917 f   libucrt:wsetlocale.obj
- 0001:00026938       __acrt_lowio_ensure_fh_exists$fin$0 0000000180027938 f   libucrt:osfinfo.obj
- 0001:00026938       __acrt_initialize_lowio$fin$0 0000000180027938 f   libucrt:ioinit.obj
- 0001:00026951       _ctrlfp$filt$0             0000000180027951 f   libucrt:fpctrl.obj
- 0001:00026951       common_control87$filt$0    0000000180027951 f   libucrt:ieee.obj
- 0001:0002697d       __acrt_update_thread_multibyte_data$fin$0 000000018002797d f   libucrt:mbctype.obj
- 0001:00026996       __acrt_update_thread_locale_data$fin$0 0000000180027996 f   libucrt:locale_refcounting.obj
- 0001:00026996       __acrt_uninitialize_locale$fin$0 0000000180027996 f   libucrt:wsetlocale.obj
- 0001:000269af       _fcloseall$fin$0           00000001800279af f   libucrt:closeall.obj
- 0001:000269c8       common_flush_all$fin$0     00000001800279c8 f   libucrt:fflush.obj
- 0001:000269e2       common_flush_all$fin$1     00000001800279e2 f   libucrt:fflush.obj
- 0001:000269fb       _write$fin$0               00000001800279fb f   libucrt:write.obj
- 0001:00026a12       fclose$fin$0               0000000180027a12 f   libucrt:fclose.obj
- 0001:00026a2a       ?fin$0@?0???$?RV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@V<lambda_237c231691f317818eb88cc1d5d642d6>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@$$QEAV<lambda_237c231691f317818eb88cc1d5d642d6>@@@Z@4HA 0000000180027a2a f   libucrt:close.obj
- 0001:00026a2a       ?fin$0@?0???$?RV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@V<lambda_314360699dd331753a4119843814e9a7>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@$$QEAV<lambda_314360699dd331753a4119843814e9a7>@@@Z@4HA 0000000180027a2a f   libucrt:commit.obj
- 0001:00026a50       _IsNonwritableInCurrentImage$filt$0 0000000180027a50 f   LIBCMT:pesect.obj
- 0001:00026a70       ??__Fresult@?1??getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 0000000180027a70 f   node_printer_win.obj
- 0001:00026ae0       ??__Fresult@?1??getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 0000000180027ae0 f   node_printer_win.obj
- 0001:00026b50       ??__Fresult@?1??getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 0000000180027b50 f   node_printer_win.obj
- 0001:00026bc0       ??__Fresult@?1??getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 0000000180027bc0 f   node_printer_win.obj
- 0001:00026c34       ??__Finitlocks@std@@YAXXZ  0000000180027c34 f   libcpmt:xlock.obj
- 0001:00026c40       ??__F_Fac_tidy_reg@std@@YAXXZ 0000000180027c40 f   libcpmt:locale0.obj
- 0001:00026c6c       ??__Fclassic_locale@std@@YAXXZ 0000000180027c6c f   libcpmt:locale0.obj
- 0001:00026ccc       ??__Finit_atexit@@YAXXZ    0000000180027ccc f   libcpmt:iosptrs.obj
- 0001:00026d20       ??__Finitlocks@std@@YAXXZ  0000000180027d20 f   libcpmt:iosptrs.obj
- 0002:00000340       ?initlocks$initializer$@std@@3P6AXXZEA 0000000180028340     libcpmt:xlock.obj
- 0002:00000348       ?initlocks$initializer$@std@@3P6AXXZEA 0000000180028348     libcpmt:iosptrs.obj
- 0002:00000350       ?init_atexit$initializer$@@3P6AXXZEA 0000000180028350     libcpmt:iosptrs.obj
- 0002:00000358       ?_Fac_tidy_reg$initializer$@std@@3P6AXXZEA 0000000180028358     libcpmt:locale0.obj
- 0002:00000360       ?classic_locale$initializer$@std@@3P6AXXZEA 0000000180028360     libcpmt:locale0.obj
- 0002:00000380       ?pinit@@3P6AHXZEA          0000000180028380     libcpmt:winapisupp.obj
- 0002:00000388       ?__scrt_initialize_tss_var@@3P6AHXZEA 0000000180028388     LIBCMT:thread_safe_statics.obj
- 0002:000004c8       $cppxdata$??_G_Fac_node@std@@QEAAPEAXI@Z 00000001800284c8     libcpmt:locale0.obj
- 0002:000004f0       $cppxdata$?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z 00000001800284f0     libcpmt:locale0.obj
- 0002:00000518       $cppxdata$??_G_Locimp@locale@std@@MEAAPEAXI@Z 0000000180028518     libcpmt:locale0.obj
- 0002:00000540       $cppxdata$?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z 0000000180028540     libcpmt:locale0.obj
- 0002:00000568       $cppxdata$??__Fclassic_locale@std@@YAXXZ 0000000180028568     libcpmt:locale0.obj
- 0002:000005e0       ?_Win_errtab@std@@3QBU_Win_errtab_t@1@B 00000001800285e0     libcpmt:syserror.obj
- 0002:00000830       ?_Sys_errtab@std@@3QBU_Sys_errtab_t@1@B 0000000180028830     libcpmt:syserror.obj
- 0002:000013d0       $cppxdata$??__Finit_atexit@@YAXXZ 00000001800293d0     libcpmt:iosptrs.obj
- 0002:00001910       digits                     0000000180029910     libcpmt:xstoul.obj
- 0002:00001938       ndigs                      0000000180029938     libcpmt:xstoul.obj
- 0002:00001960       digits                     0000000180029960     libcpmt:xstoull.obj
- 0002:00001988       ndigs                      0000000180029988     libcpmt:xstoull.obj
- 0002:00001fe0       ?LcidToLocaleNameTable@@3QBULcidToLocaleName@@B 0000000180029fe0     libcpmt:winapinls.obj
- 0002:00002e20       ?LocaleNameToIndexTable@@3QBULocaleNameIndex@@B 000000018002ae20     libcpmt:winapinls.obj
- 0002:00004d08       GS_ExceptionPointers       000000018002cd08     LIBCMT:gs_report.obj
- 0002:00004d50       ?ExceptionTemplate@?1??_CxxThrowException@@9@4UEHExceptionRecord@@B 000000018002cd50     libvcruntime:throw.obj
- 0002:00004dc0       ?ExceptionTemplate@?1??_UnwindNestedFrames@@9@4U_EXCEPTION_RECORD@@B 000000018002cdc0     libvcruntime:trnsctrl.obj
- 0002:00004e58       ?module_names@?A0x679b24ab@@3QBQEB_WB 000000018002ce58     libvcruntime:winapi_downlevel.obj
- 0002:00004f28       ?candidate_modules@?1??try_get_FlsAlloc@@YAP6AKP6AXPEAX@Z@ZXZ@4QBW4module_id@?A0x679b24ab@@B 000000018002cf28     libvcruntime:winapi_downlevel.obj
- 0002:00004f30       ?candidate_modules@?1??try_get_FlsFree@@YAP6AHK@ZXZ@4QBW4module_id@?A0x679b24ab@@B 000000018002cf30     libvcruntime:winapi_downlevel.obj
- 0002:00004f38       ?candidate_modules@?1??try_get_FlsGetValue@@YAP6APEAXK@ZXZ@4QBW4module_id@?A0x679b24ab@@B 000000018002cf38     libvcruntime:winapi_downlevel.obj
- 0002:00004f40       ?candidate_modules@?1??try_get_FlsSetValue@@YAP6AHKPEAX@ZXZ@4QBW4module_id@?A0x679b24ab@@B 000000018002cf40     libvcruntime:winapi_downlevel.obj
- 0002:00004f48       ?candidate_modules@?1??try_get_InitializeCriticalSectionEx@@YAP6AHPEAU_RTL_CRITICAL_SECTION@@KK@ZXZ@4QBW4module_id@?A0x679b24ab@@B 000000018002cf48     libvcruntime:winapi_downlevel.obj
- 0002:00004f50       ?tokenTable@@3QBQEBDB      000000018002cf50     libvcruntime:undname.obj
- 0002:00004fc0       ?nameTable@@3QBQEBDB       000000018002cfc0     libvcruntime:undname.obj
- 0002:00005248       ?rttiTable@@3QBQEBDB       000000018002d248     libvcruntime:undname.obj
- 0002:00006160       errtable                   000000018002e160     libucrt:errno.obj
- 0002:00006ca0       __flag_x_one_y_snan        000000018002eca0     libucrt:pow.obj
- 0002:00006ca4       __flag_x_zero_z_inf        000000018002eca4     libucrt:pow.obj
- 0002:00006ca8       __flag_x_nan               000000018002eca8     libucrt:pow.obj
- 0002:00006cac       __flag_y_nan               000000018002ecac     libucrt:pow.obj
- 0002:00006cb0       __flag_x_nan_y_nan         000000018002ecb0     libucrt:pow.obj
- 0002:00006cb4       __flag_x_neg_y_notint      000000018002ecb4     libucrt:pow.obj
- 0002:00006cb8       __flag_z_zero              000000018002ecb8     libucrt:pow.obj
- 0002:00006cbc       __flag_z_denormal          000000018002ecbc     libucrt:pow.obj
- 0002:00006cc0       __flag_z_inf               000000018002ecc0     libucrt:pow.obj
- 0002:00006cd0       __ay_max_bound             000000018002ecd0     libucrt:pow.obj
- 0002:00006cd8       __ay_min_bound             000000018002ecd8     libucrt:pow.obj
- 0002:00006ce0       __sign_mask                000000018002ece0     libucrt:pow.obj
- 0002:00006ce8       __sign_and_exp_mask        000000018002ece8     libucrt:pow.obj
- 0002:00006cf0       __exp_mask                 000000018002ecf0     libucrt:pow.obj
- 0002:00006cf8       __neg_inf                  000000018002ecf8     libucrt:pow.obj
- 0002:00006d00       __pos_inf                  000000018002ed00     libucrt:pow.obj
- 0002:00006d08       __pos_one                  000000018002ed08     libucrt:pow.obj
- 0002:00006d10       __pos_zero                 000000018002ed10     libucrt:pow.obj
- 0002:00006d18       __exp_mant_mask            000000018002ed18     libucrt:pow.obj
- 0002:00006d20       __mant_mask                000000018002ed20     libucrt:pow.obj
- 0002:00006d28       __ind_pattern              000000018002ed28     libucrt:pow.obj
- 0002:00006d30       __neg_qnan                 000000018002ed30     libucrt:pow.obj
- 0002:00006d38       __qnan                     000000018002ed38     libucrt:pow.obj
- 0002:00006d40       __qnan_set                 000000018002ed40     libucrt:pow.obj
- 0002:00006d48       __neg_one                  000000018002ed48     libucrt:pow.obj
- 0002:00006d50       __neg_zero                 000000018002ed50     libucrt:pow.obj
- 0002:00006d58       __exp_shift                000000018002ed58     libucrt:pow.obj
- 0002:00006d60       __exp_bias                 000000018002ed60     libucrt:pow.obj
- 0002:00006d68       __exp_bias_m1              000000018002ed68     libucrt:pow.obj
- 0002:00006d70       __yexp_53                  000000018002ed70     libucrt:pow.obj
- 0002:00006d78       __mant_full                000000018002ed78     libucrt:pow.obj
- 0002:00006d80       __1_before_mant            000000018002ed80     libucrt:pow.obj
- 0002:00006d88       __mask_mant_all8           000000018002ed88     libucrt:pow.obj
- 0002:00006d90       __mask_mant9               000000018002ed90     libucrt:pow.obj
- 0002:00006da0       __real_fffffffff8000000    000000018002eda0     libucrt:pow.obj
- 0002:00006db0       __mask_8000000000000000    000000018002edb0     libucrt:pow.obj
- 0002:00006dc0       __real_4090040000000000    000000018002edc0     libucrt:pow.obj
- 0002:00006dd0       __real_C090C80000000000    000000018002edd0     libucrt:pow.obj
- 0002:00006de0       __real_ninf                000000018002ede0     libucrt:pow.obj
- 0002:00006df0       __real_inf                 000000018002edf0     libucrt:pow.obj
- 0002:00006e00       __real_nan                 000000018002ee00     libucrt:pow.obj
- 0002:00006e10       __real_mant                000000018002ee10     libucrt:pow.obj
- 0002:00006e20       __mask_1023                000000018002ee20     libucrt:pow.obj
- 0002:00006e30       __mask_001                 000000018002ee30     libucrt:pow.obj
- 0002:00006e40       __real_log2_lead           000000018002ee40     libucrt:pow.obj
- 0002:00006e50       __real_log2_tail           000000018002ee50     libucrt:pow.obj
- 0002:00006e60       __real_two                 000000018002ee60     libucrt:pow.obj
- 0002:00006e70       __real_one                 000000018002ee70     libucrt:pow.obj
- 0002:00006e80       __real_half                000000018002ee80     libucrt:pow.obj
- 0002:00006e90       __mask_100                 000000018002ee90     libucrt:pow.obj
- 0002:00006ea0       __real_1_over_2            000000018002eea0     libucrt:pow.obj
- 0002:00006eb0       __real_1_over_3            000000018002eeb0     libucrt:pow.obj
- 0002:00006ec0       __real_1_over_4            000000018002eec0     libucrt:pow.obj
- 0002:00006ed0       __real_1_over_5            000000018002eed0     libucrt:pow.obj
- 0002:00006ee0       __real_1_over_6            000000018002eee0     libucrt:pow.obj
- 0002:00006ef0       __real_1_over_7            000000018002eef0     libucrt:pow.obj
- 0002:00006f00       __mask_1023_f              000000018002ef00     libucrt:pow.obj
- 0002:00006f10       __mask_2045                000000018002ef10     libucrt:pow.obj
- 0002:00006f20       __real_threshold           000000018002ef20     libucrt:pow.obj
- 0002:00006f30       __real_notsign             000000018002ef30     libucrt:pow.obj
- 0002:00006f40       __log_F_inv_head           000000018002ef40     libucrt:pow.obj
- 0002:00007750       __log_F_inv_tail           000000018002f750     libucrt:pow.obj
- 0002:00007f60       __denormal_threshold       000000018002ff60     libucrt:pow.obj
- 0002:00007f70       __enable_almost_inf        000000018002ff70     libucrt:pow.obj
- 0002:00007f80       __real_zero                000000018002ff80     libucrt:pow.obj
- 0002:00007f90       __real_smallest_denormal   000000018002ff90     libucrt:pow.obj
- 0002:00007fa0       __denormal_tiny_threshold  000000018002ffa0     libucrt:pow.obj
- 0002:00007fb0       __real_p65536              000000018002ffb0     libucrt:pow.obj
- 0002:00007fc0       __real_m68800              000000018002ffc0     libucrt:pow.obj
- 0002:00007fd0       __real_64_by_log2          000000018002ffd0     libucrt:pow.obj
- 0002:00007fe0       __real_log2_by_64_head     000000018002ffe0     libucrt:pow.obj
- 0002:00007ff0       __real_log2_by_64_tail     000000018002fff0     libucrt:pow.obj
- 0002:00008000       __real_1_by_720            0000000180030000     libucrt:pow.obj
- 0002:00008010       __real_1_by_120            0000000180030010     libucrt:pow.obj
- 0002:00008020       __real_1_by_24             0000000180030020     libucrt:pow.obj
- 0002:00008030       __real_1_by_6              0000000180030030     libucrt:pow.obj
- 0002:00008040       __real_1_by_2              0000000180030040     libucrt:pow.obj
- 0002:00008050       __flag_x_one_y_snan        0000000180030050     libucrt:powf.obj
- 0002:00008054       __flag_x_zero_z_inf        0000000180030054     libucrt:powf.obj
- 0002:00008058       __flag_x_nan               0000000180030058     libucrt:powf.obj
- 0002:0000805c       __flag_y_nan               000000018003005c     libucrt:powf.obj
- 0002:00008060       __flag_x_nan_y_nan         0000000180030060     libucrt:powf.obj
- 0002:00008064       __flag_x_neg_y_notint      0000000180030064     libucrt:powf.obj
- 0002:00008068       __flag_z_zero              0000000180030068     libucrt:powf.obj
- 0002:0000806c       __flag_z_denormal          000000018003006c     libucrt:powf.obj
- 0002:00008070       __flag_z_inf               0000000180030070     libucrt:powf.obj
- 0002:00008074       L__1_by_3                  0000000180030074     libucrt:powf.obj
- 0002:0000807c       L__log2                    000000018003007c     libucrt:powf.obj
- 0002:00008084       L__max_exp_arg             0000000180030084     libucrt:powf.obj
- 0002:0000808c       L__min_exp_arg             000000018003008c     libucrt:powf.obj
- 0002:00008094       L__real_log2_by_64         0000000180030094     libucrt:powf.obj
- 0002:0000809c       L__1_by_6                  000000018003009c     libucrt:powf.obj
- 0002:000080a4       L__real_threshold          00000001800300a4     libucrt:powf.obj
- 0002:000080ac       L__real_one                00000001800300ac     libucrt:powf.obj
- 0002:000080b4       L__real_two                00000001800300b4     libucrt:powf.obj
- 0002:000080bc       L__neg_zero                00000001800300bc     libucrt:powf.obj
- 0002:000080d0       L__real_ca42               00000001800300d0     libucrt:powf.obj
- 0002:000080d8       L__real_ca4                00000001800300d8     libucrt:powf.obj
- 0002:000080e0       L__real_ca31               00000001800300e0     libucrt:powf.obj
- 0002:000080e8       L__real_ca3                00000001800300e8     libucrt:powf.obj
- 0002:000080f0       L__clear_sign              00000001800300f0     libucrt:powf.obj
- 0002:00008100       L__real_64_by_log2         0000000180030100     libucrt:powf.obj
- 0002:00008110       L__1_by_2                  0000000180030110     libucrt:powf.obj
- 0002:00008120       L__1023                    0000000180030120     libucrt:powf.obj
- 0002:00008130       L__xexp_bits_xmantissa_bits 0000000180030130     libucrt:powf.obj
- 0002:00008a50       __acrt_initializers        0000000180030a50     libucrt:initialization.obj
- 0002:00008cb0       _first_127char             0000000180030cb0     libucrt:wsetlocale.obj
- 0002:000093d0       ?_names@?1??_get_fname@@9@9 00000001800313d0     libucrt:fpexcept.obj
- 0002:00009680       module_names               0000000180031680     libucrt:winapi_thunks.obj
- 0002:00009bb0       ?candidate_modules@?1??try_get_CompareStringEx@@YAP6AHPEB_WK0H0HPEAU_nlsversioninfo@@PEAX_J@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031bb0     libucrt:winapi_thunks.obj
- 0002:00009bb8       ?candidate_modules@?1??try_get_EnumSystemLocalesEx@@YAP6AHP6AHPEA_WK_J@ZK1PEAX@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031bb8     libucrt:winapi_thunks.obj
- 0002:00009bd8       ?candidate_modules@?1??try_get_FlsAlloc@@YAP6AKP6AXPEAX@Z@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031bd8     libucrt:winapi_thunks.obj
- 0002:00009be0       ?candidate_modules@?1??try_get_FlsFree@@YAP6AHK@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031be0     libucrt:winapi_thunks.obj
- 0002:00009be8       ?candidate_modules@?1??try_get_FlsGetValue@@YAP6APEAXK@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031be8     libucrt:winapi_thunks.obj
- 0002:00009bf0       ?candidate_modules@?1??try_get_FlsSetValue@@YAP6AHKPEAX@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031bf0     libucrt:winapi_thunks.obj
- 0002:00009bf8       ?candidate_modules@?1??try_get_GetCurrentPackageId@@YAP6AJPEAIPEAE@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031bf8     libucrt:winapi_thunks.obj
- 0002:00009c00       ?candidate_modules@?1??try_get_GetLocaleInfoEx@@YAP6AHPEB_WKPEA_WH@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031c00     libucrt:winapi_thunks.obj
- 0002:00009c08       ?candidate_modules@?1??try_get_GetUserDefaultLocaleName@@YAP6AHPEA_WH@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031c08     libucrt:winapi_thunks.obj
- 0002:00009c30       ?candidate_modules@?1??try_get_InitializeCriticalSectionEx@@YAP6AHPEAU_RTL_CRITICAL_SECTION@@KK@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031c30     libucrt:winapi_thunks.obj
- 0002:00009c38       ?candidate_modules@?1??try_get_IsValidLocaleName@@YAP6AHPEB_W@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031c38     libucrt:winapi_thunks.obj
- 0002:00009c58       ?candidate_modules@?1??try_get_LCMapStringEx@@YAP6AHPEB_WK0HPEA_WHPEAU_nlsversioninfo@@PEAX_J@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031c58     libucrt:winapi_thunks.obj
- 0002:00009c60       ?candidate_modules@?1??try_get_LCIDToLocaleName@@YAP6AHKPEA_WHK@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031c60     libucrt:winapi_thunks.obj
- 0002:00009c80       ?candidate_modules@?1??try_get_LocaleNameToLCID@@YAP6AKPEB_WK@ZXZ@4QBW4module_id@?A0x63058377@@B 0000000180031c80     libucrt:winapi_thunks.obj
- 0002:0000bae0       _mb_locale_names           0000000180033ae0     libucrt:mbctype.obj
- 0002:0000cb00       __real@433fffffffffffff    0000000180034b00     libucrt:fpsr.obj
- 0002:0000cb08       __real@c33fffffffffffff    0000000180034b08     libucrt:fpsr.obj
- 0002:0000cb10       LcidToLocaleNameTable      0000000180034b10     libucrt:lcidtoname_downlevel.obj
- 0002:0000d950       LocaleNameToIndexTable     0000000180035950     libucrt:lcidtoname_downlevel.obj
- 0002:0000e790       __real_ninf                0000000180036790     libucrt:log10.obj
- 0002:0000e7a0       __real_inf                 00000001800367a0     libucrt:log10.obj
- 0002:0000e7b0       __real_neg_qnan            00000001800367b0     libucrt:log10.obj
- 0002:0000e7c0       __real_qnanbit             00000001800367c0     libucrt:log10.obj
- 0002:0000e7d0       __int_1023                 00000001800367d0     libucrt:log10.obj
- 0002:0000e7e0       __mask_001                 00000001800367e0     libucrt:log10.obj
- 0002:0000e7f0       __mask_mant                00000001800367f0     libucrt:log10.obj
- 0002:0000e800       __mask_mant_top8           0000000180036800     libucrt:log10.obj
- 0002:0000e810       __mask_mant9               0000000180036810     libucrt:log10.obj
- 0002:0000e820       __real_log10_e             0000000180036820     libucrt:log10.obj
- 0002:0000e830       __real_log10_e_lead        0000000180036830     libucrt:log10.obj
- 0002:0000e840       __real_log10_e_tail        0000000180036840     libucrt:log10.obj
- 0002:0000e850       __real_log10_2_lead        0000000180036850     libucrt:log10.obj
- 0002:0000e860       __real_log10_2_tail        0000000180036860     libucrt:log10.obj
- 0002:0000e870       __real_two                 0000000180036870     libucrt:log10.obj
- 0002:0000e880       __real_one                 0000000180036880     libucrt:log10.obj
- 0002:0000e890       __real_half                0000000180036890     libucrt:log10.obj
- 0002:0000e8a0       __mask_100                 00000001800368a0     libucrt:log10.obj
- 0002:0000e8b0       __real_1_over_512          00000001800368b0     libucrt:log10.obj
- 0002:0000e8c0       __real_1_over_2            00000001800368c0     libucrt:log10.obj
- 0002:0000e8d0       __real_1_over_3            00000001800368d0     libucrt:log10.obj
- 0002:0000e8e0       __real_1_over_4            00000001800368e0     libucrt:log10.obj
- 0002:0000e8f0       __real_1_over_5            00000001800368f0     libucrt:log10.obj
- 0002:0000e900       __real_1_over_6            0000000180036900     libucrt:log10.obj
- 0002:0000e910       __real_neg_1023            0000000180036910     libucrt:log10.obj
- 0002:0000e920       __mask_2045                0000000180036920     libucrt:log10.obj
- 0002:0000e930       __real_threshold           0000000180036930     libucrt:log10.obj
- 0002:0000e940       __real_near_one_lt         0000000180036940     libucrt:log10.obj
- 0002:0000e950       __real_near_one_gt         0000000180036950     libucrt:log10.obj
- 0002:0000e960       __real_min_norm            0000000180036960     libucrt:log10.obj
- 0002:0000e970       __real_notsign             0000000180036970     libucrt:log10.obj
- 0002:0000e980       __real_ca1                 0000000180036980     libucrt:log10.obj
- 0002:0000e990       __real_ca2                 0000000180036990     libucrt:log10.obj
- 0002:0000e9a0       __real_ca3                 00000001800369a0     libucrt:log10.obj
- 0002:0000e9b0       __real_ca4                 00000001800369b0     libucrt:log10.obj
- 0002:0000e9c0       __mask_lower               00000001800369c0     libucrt:log10.obj
- 0002:0000e9d0       __flag_x_zero              00000001800369d0     libucrt:log10.obj
- 0002:0000e9d4       __flag_x_neg               00000001800369d4     libucrt:log10.obj
- 0002:0000e9d8       __flag_x_nan               00000001800369d8     libucrt:log10.obj
- 0002:00011440       $unwind$?NODE_SET_METHOD@node@@YAXV?$Local@VObject@v8@@@v8@@PEBDP6AXAEBV?$FunctionCallbackInfo@VValue@v8@@@3@@Z@Z 0000000180039440     node_printer.obj
- 0002:00011450       $unwind$?initNode@@YAXV?$Local@VObject@v8@@@v8@@@Z 0000000180039450     node_printer.obj
- 0002:00011458       $unwind$?getStringOrBufferFromV8Value@@YA_NV?$Local@VValue@v8@@@v8@@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z 0000000180039458     node_printer.obj
- 0002:00011460       $chain$0$?getStringOrBufferFromV8Value@@YA_NV?$Local@VValue@v8@@@v8@@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z 0000000180039460     node_printer.obj
- 0002:00011474       $chain$1$?getStringOrBufferFromV8Value@@YA_NV?$Local@VValue@v8@@@v8@@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z 0000000180039474     node_printer.obj
- 0002:00011484       $unwind$__acrt_FlsSetValue 0000000180039484     libucrt:winapi_thunks.obj
- 0002:00011484       $unwind$??_G?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAAPEAXI@Z 0000000180039484     node_printer_win.obj
- 0002:00011484       $unwind$__acrt_stdio_flush_nolock 0000000180039484     libucrt:fflush.obj
- 0002:00011484       $unwind$??$common_lseek_nolock@_J@@YA_JH_JH@Z 0000000180039484     libucrt:lseek.obj
- 0002:00011484       $unwind$memcpy_s           0000000180039484     libucrt:cfout.obj
- 0002:00011484       $unwind$?type_case_n@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180039484     libucrt:output.obj
- 0002:00011484       $unwind$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 0000000180039484     node_printer_win.obj
- 0002:00011484       $unwind$_DllMainCRTStartup 0000000180039484     LIBCMT:dll_dllmain.obj
- 0002:00011484       $unwind$__acrt_GetUserDefaultLocaleName 0000000180039484     libucrt:winapi_thunks.obj
- 0002:00011484       $unwind$__acrt_getptd_noexit 0000000180039484     libucrt:per_thread_data.obj
- 0002:00011484       $unwind$?__scrt_initialize_thread_safe_statics@@YAHXZ 0000000180039484     LIBCMT:thread_safe_statics.obj
- 0002:00011484       $unwind$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 0000000180039484     node_printer.obj
- 0002:00011484       $unwind$_initterm_e        0000000180039484     libucrt:initterm.obj
- 0002:00011484       $unwind$_RTC_Initialize    0000000180039484     LIBCMT:_initsect_.obj
- 0002:00011484       $unwind$??_G?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAPEAXI@Z 0000000180039484     node_printer_win.obj
- 0002:00011484       $unwind$?_Tidy@ios_base@std@@AEAAXXZ 0000000180039484     libcpmt:ios.obj
- 0002:00011484       $unwind$memcpy_s           0000000180039484     libucrt:strtod.obj
- 0002:00011484       $unwind$_exception_enabled 0000000180039484     libucrt:libm_error.obj
- 0002:00011484       $unwind$__acrt_execute_uninitializers 0000000180039484     libucrt:shared_initialization.obj
- 0002:00011484       $unwind$??0_Init_locks@std@@QEAA@XZ 0000000180039484     libcpmt:xlock.obj
- 0002:00011484       $unwind$_Init_thread_wait  0000000180039484     LIBCMT:thread_safe_statics.obj
- 0002:00011484       $unwind$__vcrt_getptd_noexit 0000000180039484     libvcruntime:per_thread_data.obj
- 0002:00011484       $unwind$_RTC_Terminate     0000000180039484     LIBCMT:_initsect_.obj
- 0002:00011484       $unwind$?type_case_s@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180039484     libucrt:output.obj
- 0002:00011484       $unwind$?free_crt_array_internal@@YAXQEAPEBX_K@Z 0000000180039484     libucrt:inittime.obj
- 0002:00011484       $unwind$??R<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@QEBAXXZ 0000000180039484     libucrt:mbctype.obj
- 0002:00011484       $unwind$?type_case_Z@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180039484     libucrt:output.obj
- 0002:00011484       $unwind$_Getcvt            0000000180039484     libcpmt:xwctomb.obj
- 0002:00011484       $unwind$??4?$_Yarn@D@std@@QEAAAEAV01@PEBD@Z 0000000180039484     libcpmt:locale0.obj
- 0002:00011484       $unwind$__vcrt_FlsSetValue 0000000180039484     libvcruntime:winapi_downlevel.obj
- 0002:00011484       $unwind$__acrt_LocaleNameToLCID 0000000180039484     libucrt:winapi_thunks.obj
- 0002:00011494       $unwind$_free_osfhnd       0000000180039494     libucrt:osfinfo.obj
- 0002:00011494       $unwind$_wcstombs_s_l      0000000180039494     libucrt:wcstombs.obj
- 0002:00011494       $unwind$__std_exception_copy 0000000180039494     libvcruntime:std_exception.obj
- 0002:00011494       $unwind$?initialize_stdio_handles_nolock@@YAXXZ 0000000180039494     libucrt:ioinit.obj
- 0002:00011494       $unwind$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 0000000180039494     node_printer.obj
- 0002:000114a8       $unwind$?_Copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX_K0@Z 00000001800394a8     node_printer.obj
- 0002:000114bc       $unwind$??0_LocaleUpdate@@QEAA@QEAU__crt_locale_pointers@@@Z 00000001800394bc     libucrt:output.obj
- 0002:000114bc       $unwind$?_Assign_rv@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX$$QEAV12@@Z 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$__acrt_IsValidLocaleName 00000001800394bc     libucrt:winapi_thunks.obj
- 0002:000114bc       $unwind$?type_case_c_tchar@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 00000001800394bc     libucrt:output.obj
- 0002:000114bc       $unwind$??_Gios_base@std@@UEAAPEAXI@Z 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$?<helper_func_cdecl>@<lambda_e2bb8337c48846e80c921ea5ddadc92d>@@CAHPEA_W@Z 00000001800394bc     libucrt:winapi_thunks.obj
- 0002:000114bc       $unwind$??_Gexception@std@@UEAAPEAXI@Z 00000001800394bc     libcpmt:xthrow.obj
- 0002:000114bc       $unwind$__vcrt_FlsFree     00000001800394bc     libvcruntime:winapi_downlevel.obj
- 0002:000114bc       $unwind$?__SetUnwindTryBlock@@YAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@H@Z 00000001800394bc     libvcruntime:ehstate.obj
- 0002:000114bc       $unwind$__acrt_errno_map_os_error 00000001800394bc     libucrt:errno.obj
- 0002:000114bc       $unwind$GetLocaleNameFromLangCountry 00000001800394bc     libucrt:get_qualified_locale.obj
- 0002:000114bc       $unwind$__acrt_invoke_user_matherr 00000001800394bc     libucrt:matherr.obj
- 0002:000114bc       $unwind$strncpy_s          00000001800394bc     libucrt:strncpy_s.obj
- 0002:000114bc       $unwind$wcsncpy_s          00000001800394bc     libucrt:wcsncpy_s.obj
- 0002:000114bc       $unwind$??1_Init_locks@std@@QEAA@XZ 00000001800394bc     libcpmt:xlock.obj
- 0002:000114bc       $unwind$_close_nolock      00000001800394bc     libucrt:close.obj
- 0002:000114bc       $unwind$_FindAndUnlinkFrame 00000001800394bc     libvcruntime:trnsctrl.obj
- 0002:000114bc       $unwind$_updatetlocinfoEx_nolock 00000001800394bc     libucrt:locale_refcounting.obj
- 0002:000114bc       $unwind$??1?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$__acrt_uninitialize_lowio 00000001800394bc     libucrt:ioinit.obj
- 0002:000114bc       $unwind$__acrt_getptd      00000001800394bc     libucrt:per_thread_data.obj
- 0002:000114bc       $unwind$GetLocaleNameFromLanguage 00000001800394bc     libucrt:get_qualified_locale.obj
- 0002:000114bc       $unwind$??$common_initialize_environment_nolock@D@@YAHXZ 00000001800394bc     libucrt:environment_initialization.obj
- 0002:000114bc       $unwind$?replace_current_thread_locale_nolock@@YAXQEAU__acrt_ptd@@QEAU__crt_locale_data@@@Z 00000001800394bc     libucrt:per_thread_data.obj
- 0002:000114bc       $unwind$??_G?$numpunct@D@std@@MEAAPEAXI@Z 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$??_Gbad_array_new_length@std@@UEAAPEAXI@Z 00000001800394bc     LIBCMT:throw_bad_alloc.obj
- 0002:000114bc       $unwind$??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@XZ 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$??_Gbad_alloc@std@@UEAAPEAXI@Z 00000001800394bc     libcpmt:xthrow.obj
- 0002:000114bc       $unwind$??_G?$ctype@D@std@@MEAAPEAXI@Z 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$??_G?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAAPEAXI@Z 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$??_G?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAAPEAXI@Z 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$??_Glogic_error@std@@UEAAPEAXI@Z 00000001800394bc     libcpmt:xthrow.obj
- 0002:000114bc       $unwind$??_Glength_error@std@@UEAAPEAXI@Z 00000001800394bc     libcpmt:xthrow.obj
- 0002:000114bc       $unwind$??_Glocale@std@@QEAAPEAXI@Z 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$?ExFilterRethrow@@YAHPEAU_EXCEPTION_POINTERS@@PEAUEHExceptionRecord@@PEAH@Z 00000001800394bc     libvcruntime:frame.obj
- 0002:000114bc       $unwind$?DloadAcquireSectionWriteAccess@@YAXXZ 00000001800394bc     DelayImp:delayhlp.obj
- 0002:000114bc       $unwind$__acrt_FlsGetValue 00000001800394bc     libucrt:winapi_thunks.obj
- 0002:000114bc       $unwind$_fclose_nolock     00000001800394bc     libucrt:fclose.obj
- 0002:000114bc       $unwind$??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@AEAV12@@Z 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$??_Gout_of_range@std@@UEAAPEAXI@Z 00000001800394bc     libcpmt:xthrow.obj
- 0002:000114bc       $unwind$__acrt_locale_initialize_time 00000001800394bc     libucrt:inittime.obj
- 0002:000114bc       $unwind$?force_decimal_point@__crt_stdio_output@@YAXPEADQEAU__crt_locale_pointers@@@Z 00000001800394bc     libucrt:output.obj
- 0002:000114bc       $unwind$??$common_xtox@K_W@@YAHKQEA_W_KI_N@Z 00000001800394bc     libucrt:xtoa.obj
- 0002:000114bc       $unwind$??R?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@QEBA_NAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@0@Z 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$?internal_isupper_l@@YA_NHQEAU__crt_locale_pointers@@@Z 00000001800394bc     libucrt:tolower_toupper.obj
- 0002:000114bc       $unwind$__acrt_FlsFree     00000001800394bc     libucrt:winapi_thunks.obj
- 0002:000114bc       $unwind$_Deletegloballocale 00000001800394bc     libcpmt:locale0.obj
- 0002:000114bc       $unwind$__acrt_FlsAlloc    00000001800394bc     libucrt:winapi_thunks.obj
- 0002:000114bc       $unwind$??_Gbad_exception@std@@UEAAPEAXI@Z 00000001800394bc     libvcruntime:frame.obj
- 0002:000114bc       $unwind$??1_Locinfo@std@@QEAA@XZ 00000001800394bc     node_printer_win.obj
- 0002:000114bc       $unwind$__vcrt_FlsGetValue 00000001800394bc     libvcruntime:winapi_downlevel.obj
- 0002:000114bc       $unwind$?DloadGetSRWLockFunctionPointers@@YAEXZ 00000001800394bc     DelayImp:delayhlp.obj
- 0002:000114bc       $unwind$?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0@Z 00000001800394bc     node_printer.obj
- 0002:000114bc       $unwind$GetLcidFromLanguage 00000001800394bc     libucrt:getqloc_downlevel.obj
- 0002:000114bc       $unwind$_realloc_base      00000001800394bc     libucrt:realloc_base.obj
- 0002:000114bc       $unwind$GetLcidFromLangCountry 00000001800394bc     libucrt:getqloc_downlevel.obj
- 0002:000114bc       $unwind$_callnewh          00000001800394bc     libucrt:new_handler.obj
- 0002:000114bc       $unwind$?_New_Locimp@_Locimp@locale@std@@CAPEAV123@_N@Z 00000001800394bc     libcpmt:locale0.obj
- 0002:000114bc       $unwind$__vcrt_FlsAlloc    00000001800394bc     libvcruntime:winapi_downlevel.obj
- 0002:000114bc       $unwind$?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z 00000001800394bc     libcpmt:locale0.obj
- 0002:000114bc       $unwind$?try_cor_exit_process@@YAXI@Z 00000001800394bc     libucrt:exit.obj
- 0002:000114c8       $unwind$_statfp            00000001800394c8     libucrt:fpctrl.obj
- 0002:000114c8       $unwind$_errno             00000001800394c8     libucrt:errno.obj
- 0002:000114c8       $unwind$??__Fresult@?1??getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 00000001800394c8     node_printer_win.obj
- 0002:000114c8       $unwind$?allocate@?$allocator@D@std@@QEAAPEAD_K@Z 00000001800394c8     node_printer.obj
- 0002:000114c8       $unwind$??__F_Fac_tidy_reg@std@@YAXXZ 00000001800394c8     libcpmt:locale0.obj
- 0002:000114c8       $unwind$_copytlocinfo_nolock 00000001800394c8     libucrt:wsetlocale.obj
- 0002:000114c8       $unwind$?__GetCurrentState@@YAHPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 00000001800394c8     libvcruntime:ehstate.obj
- 0002:000114c8       $unwind$?deallocate@?$allocator@D@std@@QEAAXPEAD_K@Z 00000001800394c8     node_printer.obj
- 0002:000114c8       $unwind$?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z 00000001800394c8     libcpmt:locale0.obj
- 0002:000114c8       $unwind$_GetImageBase      00000001800394c8     libvcruntime:trnsctrl.obj
- 0002:000114c8       $unwind$?__scrt_uninitialize_thread_safe_statics@@YAXXZ 00000001800394c8     LIBCMT:thread_safe_statics.obj
- 0002:000114c8       $unwind$??__Fresult@?1??getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 00000001800394c8     node_printer_win.obj
- 0002:000114c8       $unwind$___lc_codepage_func 00000001800394c8     libucrt:initctype.obj
- 0002:000114c8       $unwind$___lc_locale_name_func 00000001800394c8     libucrt:initctype.obj
- 0002:000114c8       $unwind$__scrt_initialize_default_local_stdio_options 00000001800394c8     LIBCMT:default_local_stdio_options.obj
- 0002:000114c8       $unwind$_GetThrowImageBase 00000001800394c8     libvcruntime:trnsctrl.obj
- 0002:000114c8       $unwind$__acrt_uninitialize_critical 00000001800394c8     libucrt:initialization.obj
- 0002:000114c8       $unwind$_invoke_watson     00000001800394c8     libucrt:invalid_parameter.obj
- 0002:000114c8       $unwind$__acrt_thread_attach 00000001800394c8     libucrt:initialization.obj
- 0002:000114c8       $unwind$_stricmp           00000001800394c8     libucrt:stricmp.obj
- 0002:000114c8       $unwind$__acrt_initialize_multibyte 00000001800394c8     libucrt:mbctype.obj
- 0002:000114c8       $unwind$?dllmain_crt_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 00000001800394c8     LIBCMT:dll_dllmain.obj
- 0002:000114c8       $unwind$__acrt_can_use_vista_locale_apis 00000001800394c8     libucrt:winapi_thunks.obj
- 0002:000114c8       $unwind$__acrt_thread_detach 00000001800394c8     libucrt:initialization.obj
- 0002:000114c8       $unwind$_getfpstatusword   00000001800394c8     libucrt:_fenvutils.obj
- 0002:000114c8       $unwind$_wcsicmp           00000001800394c8     libucrt:wcsicmp.obj
- 0002:000114c8       $unwind$abort              00000001800394c8     libucrt:abort.obj
- 0002:000114c8       $unwind$__vcrt_freefls     00000001800394c8     libvcruntime:per_thread_data.obj
- 0002:000114c8       $unwind$initialize_c       00000001800394c8     libucrt:initialization.obj
- 0002:000114c8       $unwind$__acrt_initialize_command_line 00000001800394c8     libucrt:argv_data.obj
- 0002:000114c8       $unwind$uninitialize_environment 00000001800394c8     libucrt:initialization.obj
- 0002:000114c8       $unwind$_getfpcontrolword  00000001800394c8     libucrt:_fenvutils.obj
- 0002:000114c8       $unwind$__vcrt_getptd      00000001800394c8     libvcruntime:per_thread_data.obj
- 0002:000114c8       $unwind$?state_case_normal_tchar@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 00000001800394c8     libucrt:output.obj
- 0002:000114c8       $unwind$tidy_global        00000001800394c8     libcpmt:locale0.obj
- 0002:000114c8       $unwind$__vcrt_uninitialize_ptd 00000001800394c8     libvcruntime:per_thread_data.obj
- 0002:000114c8       $unwind$__vcrt_initialize_ptd 00000001800394c8     libvcruntime:per_thread_data.obj
- 0002:000114c8       $unwind$?state_case_size@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800394c8     libucrt:output.obj
- 0002:000114c8       $unwind$___mb_cur_max_func 00000001800394c8     libucrt:initctype.obj
- 0002:000114c8       $unwind$__report_rangecheckfailure 00000001800394c8     LIBCMT:gs_report.obj
- 0002:000114c8       $unwind$?initialize_multibyte@@YAHXZ 00000001800394c8     libucrt:multibyte_initializer.obj
- 0002:000114c8       $unwind$atexit             00000001800394c8     LIBCMT:utility.obj
- 0002:000114c8       $unwind$__dcrt_terminate_console_output 00000001800394c8     libucrt:initcon.obj
- 0002:000114c8       $unwind$__GSHandlerCheck   00000001800394c8     LIBCMT:_gshandler_.obj
- 0002:000114c8       $unwind$__scrt_acquire_startup_lock 00000001800394c8     LIBCMT:utility.obj
- 0002:000114c8       $unwind$??__Einitlocks@std@@YAXXZ 00000001800394c8     libcpmt:iosptrs.obj
- 0002:000114c8       $unwind$__acrt_release_locale_ref 00000001800394c8     libucrt:locale_refcounting.obj
- 0002:000114c8       $unwind$_wcsnicmp          00000001800394c8     libucrt:wcsnicmp.obj
- 0002:000114c8       $unwind$__vcrt_thread_detach 00000001800394c8     libvcruntime:initialization.obj
- 0002:000114c8       $unwind$?_Atexit@@YAXP6AXXZ@Z 00000001800394c8     libcpmt:iosptrs.obj
- 0002:000114c8       $unwind$__scrt_dllmain_before_initialize_c 00000001800394c8     LIBCMT:utility.obj
- 0002:000114c8       $unwind$__vcrt_thread_attach 00000001800394c8     libvcruntime:initialization.obj
- 0002:000114c8       $unwind$__scrt_dllmain_after_initialize_c 00000001800394c8     LIBCMT:utility.obj
- 0002:000114c8       $unwind$__vcrt_uninitialize_critical 00000001800394c8     libvcruntime:initialization.obj
- 0002:000114c8       $unwind$_msize             00000001800394c8     libucrt:msize.obj
- 0002:000114c8       $unwind$??__Fresult@?1??getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 00000001800394c8     node_printer_win.obj
- 0002:000114c8       $unwind$__acrt_initialize_heap 00000001800394c8     libucrt:heap_handle.obj
- 0002:000114c8       $unwind$__vcrt_uninitialize 00000001800394c8     libvcruntime:initialization.obj
- 0002:000114c8       $unwind$??1_Lockit@std@@QEAA@XZ 00000001800394c8     libcpmt:xlock.obj
- 0002:000114c8       $unwind$__scrt_dllmain_uninitialize_c 00000001800394c8     LIBCMT:utility.obj
- 0002:000114c8       $unwind$localeconv         00000001800394c8     libucrt:localeconv.obj
- 0002:000114c8       $unwind$??$_Immortalize@V_Iostream_error_category@std@@@std@@YAAEAV_Iostream_error_category@0@XZ 00000001800394c8     node_printer_win.obj
- 0002:000114c8       $unwind$__crtDownlevelLocaleNameToLCID 00000001800394c8     libcpmt:winapinls.obj
- 0002:000114c8       $unwind$__vcrt_initialize  00000001800394c8     libvcruntime:initialization.obj
- 0002:000114c8       $unwind$__scrt_dllmain_uninitialize_critical 00000001800394c8     LIBCMT:utility.obj
- 0002:000114c8       $unwind$??__Einitlocks@std@@YAXXZ 00000001800394c8     libcpmt:xlock.obj
- 0002:000114c8       $unwind$_fileno            00000001800394c8     libucrt:fileno.obj
- 0002:000114c8       $unwind$__scrt_dllmain_crt_thread_attach 00000001800394c8     LIBCMT:utility.obj
- 0002:000114c8       $unwind$__scrt_dllmain_crt_thread_detach 00000001800394c8     LIBCMT:utility.obj
- 0002:000114c8       $unwind$??$uninitialize_environment_internal@_W@@YAXAEAPEAPEA_W@Z 00000001800394c8     libucrt:environment_initialization.obj
- 0002:000114c8       $unwind$??$uninitialize_environment_internal@D@@YAXAEAPEAPEAD@Z 00000001800394c8     libucrt:environment_initialization.obj
- 0002:000114c8       $unwind$__dcrt_uninitialize_environments_nolock 00000001800394c8     libucrt:environment_initialization.obj
- 0002:000114c8       $unwind$tolower            00000001800394c8     libucrt:tolower_toupper.obj
- 0002:000114c8       $unwind$_get_osfhandle     00000001800394c8     libucrt:osfinfo.obj
- 0002:000114c8       $unwind$__acrt_uninitialize_ptd 00000001800394c8     libucrt:per_thread_data.obj
- 0002:000114c8       $unwind$__acrt_initialize_ptd 00000001800394c8     libucrt:per_thread_data.obj
- 0002:000114c8       $unwind$??__Fresult@?1??getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 00000001800394c8     node_printer_win.obj
- 0002:000114c8       $unwind$__pctype_func      00000001800394c8     libucrt:ctype.obj
- 0002:000114c8       $unwind$__std_terminate    00000001800394c8     libvcruntime:frame.obj
- 0002:000114c8       $unwind$_isatty            00000001800394c8     libucrt:isatty.obj
- 0002:000114c8       $unwind$__FrameUnwindFilter 00000001800394c8     libvcruntime:frame.obj
- 0002:000114c8       $unwind$_set_errno_from_matherr 00000001800394c8     libucrt:fpexcept.obj
- 0002:000114c8       $unwind$__acrt_DownlevelLocaleNameToLCID 00000001800394c8     libucrt:lcidtoname_downlevel.obj
- 0002:000114c8       $unwind$__doserrno         00000001800394c8     libucrt:errno.obj
- 0002:000114d0       $unwind$sprintf_s          00000001800394d0     node_printer_win.obj
- 0002:000114e0       $unwind$??0logic_error@std@@QEAA@AEBV01@@Z 00000001800394e0     libcpmt:xthrow.obj
- 0002:000114e0       $unwind$_set_statfp        00000001800394e0     libucrt:fpctrl.obj
- 0002:000114e0       $unwind$??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$??0bad_exception@std@@QEAA@AEBV01@@Z 00000001800394e0     libvcruntime:frame.obj
- 0002:000114e0       $unwind$?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$??0length_error@std@@QEAA@AEBV01@@Z 00000001800394e0     libcpmt:xthrow.obj
- 0002:000114e0       $unwind$_clrfp             00000001800394e0     libucrt:fpctrl.obj
- 0002:000114e0       $unwind$?DloadReleaseSectionWriteAccess@@YAXXZ 00000001800394e0     DelayImp:delayhlp.obj
- 0002:000114e0       $unwind$??_G_Facet_base@std@@UEAAPEAXI@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$??0bad_alloc@std@@QEAA@AEBV01@@Z 00000001800394e0     libcpmt:xthrow.obj
- 0002:000114e0       $unwind$??_Gruntime_error@std@@UEAAPEAXI@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$??0out_of_range@std@@QEAA@AEBV01@@Z 00000001800394e0     libcpmt:xthrow.obj
- 0002:000114e0       $unwind$_clearfp           00000001800394e0     libucrt:ieee.obj
- 0002:000114e0       $unwind$??_Gexception@stdext@@UEAAPEAXI@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$_Getctype          00000001800394e0     libcpmt:_tolower.obj
- 0002:000114e0       $unwind$__acrt_freeptd     00000001800394e0     libucrt:per_thread_data.obj
- 0002:000114e0       $unwind$_fflush_nolock     00000001800394e0     libucrt:fflush.obj
- 0002:000114e0       $unwind$??0exception@std@@QEAA@AEBV01@@Z 00000001800394e0     libcpmt:xthrow.obj
- 0002:000114e0       $unwind$??_Gerror_category@std@@UEAAPEAXI@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$fesetenv           00000001800394e0     libucrt:fesetenv.obj
- 0002:000114e0       $unwind$__std_exception_destroy 00000001800394e0     libvcruntime:std_exception.obj
- 0002:000114e0       $unwind$?do_grouping@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$__acrt_fp_strflt_to_string 00000001800394e0     libucrt:_fptostr.obj
- 0002:000114e0       $unwind$?do_falsename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$__std_type_info_destroy_list 00000001800394e0     libvcruntime:std_type_info.obj
- 0002:000114e0       $unwind$?do_truename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$?initialize_pointers@@YAHXZ 00000001800394e0     libcpmt:winapisupp.obj
- 0002:000114e0       $unwind$feholdexcept       00000001800394e0     libucrt:feholdexcept.obj
- 0002:000114e0       $unwind$_calloc_base       00000001800394e0     libucrt:calloc_base.obj
- 0002:000114e0       $unwind$??_G?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAAPEAXI@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$fegetenv           00000001800394e0     libucrt:fegetenv.obj
- 0002:000114e0       $unwind$??0_Lockit@std@@QEAA@H@Z 00000001800394e0     libcpmt:xlock.obj
- 0002:000114e0       $unwind$?_Tidy@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAXXZ 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$_malloc_base       00000001800394e0     libucrt:malloc_base.obj
- 0002:000114e0       $unwind$?exit_or_terminate_process@@YAXI@Z 00000001800394e0     libucrt:exit.obj
- 0002:000114e0       $unwind$?_Ios_base_dtor@ios_base@std@@CAXPEAV12@@Z 00000001800394e0     libcpmt:ios.obj
- 0002:000114e0       $unwind$??_G_System_error@std@@UEAAPEAXI@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$?type_case_integer@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NI_N@Z 00000001800394e0     libucrt:output.obj
- 0002:000114e0       $unwind$__scrt_uninitialize_crt 00000001800394e0     LIBCMT:utility.obj
- 0002:000114e0       $unwind$__scrt_initialize_crt 00000001800394e0     LIBCMT:utility.obj
- 0002:000114e0       $unwind$__scrt_release_startup_lock 00000001800394e0     LIBCMT:utility.obj
- 0002:000114e0       $unwind$__acrt_update_multibyte_info 00000001800394e0     libucrt:locale_update.obj
- 0002:000114e0       $unwind$__vcrt_initialize_locks 00000001800394e0     libvcruntime:locks.obj
- 0002:000114e0       $unwind$__acrt_update_locale_info 00000001800394e0     libucrt:locale_update.obj
- 0002:000114e0       $unwind$?load_exe_hook@@YAP6A_JXZIPEAUDelayLoadInfo@@@Z 00000001800394e0     win_delay_load_hook.obj
- 0002:000114e0       $unwind$_onexit            00000001800394e0     LIBCMT:utility.obj
- 0002:000114e0       $unwind$?message@_Iostream_error_category@std@@UEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@H@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$_setfpstatusword   00000001800394e0     libucrt:_fenvutils.obj
- 0002:000114e0       $unwind$__vcrt_uninitialize_locks 00000001800394e0     libvcruntime:locks.obj
- 0002:000114e0       $unwind$__acrt_allocate_buffer_for_argv 00000001800394e0     libucrt:argv_parsing.obj
- 0002:000114e0       $unwind$uninitialize_allocated_memory 00000001800394e0     libucrt:initialization.obj
- 0002:000114e0       $unwind$??_G_Iostream_error_category@std@@UEAAPEAXI@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$_IsExceptionObjectToBeDestroyed 00000001800394e0     libvcruntime:trnsctrl.obj
- 0002:000114e0       $unwind$initialize_pointers 00000001800394e0     libucrt:initialization.obj
- 0002:000114e0       $unwind$?state_case_normal@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800394e0     libucrt:output.obj
- 0002:000114e0       $unwind$?_Setgloballocale@locale@std@@CAXPEAX@Z 00000001800394e0     libcpmt:locale0.obj
- 0002:000114e0       $unwind$__vcrt_freeptd     00000001800394e0     libvcruntime:per_thread_data.obj
- 0002:000114e0       $unwind$??0?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAA@AEBV?$string_output_adapter@D@1@_KQEBDQEAU__crt_locale_pointers@@QEAD@Z 00000001800394e0     libucrt:output.obj
- 0002:000114e0       $unwind$_CreateFrameInfo   00000001800394e0     libvcruntime:trnsctrl.obj
- 0002:000114e0       $unwind$__raise_securityfailure 00000001800394e0     LIBCMT:gs_report.obj
- 0002:000114e0       $unwind$wcscpy_s           00000001800394e0     libucrt:wcscpy_s.obj
- 0002:000114e0       $unwind$wcscat_s           00000001800394e0     libucrt:wcscat_s.obj
- 0002:000114e0       $unwind$_SetThrowImageBase 00000001800394e0     libvcruntime:trnsctrl.obj
- 0002:000114e0       $unwind$??_Gfailure@ios_base@std@@UEAAPEAXI@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$__acrt_uninitialize_stdio 00000001800394e0     libucrt:_file.obj
- 0002:000114e0       $unwind$?__StateFromIp@@YAHPEBU_s_FuncInfo@@PEAU_xDISPATCHER_CONTEXT@@_J@Z 00000001800394e0     libvcruntime:ehstate.obj
- 0002:000114e0       $unwind$_SetImageBase      00000001800394e0     libvcruntime:trnsctrl.obj
- 0002:000114e0       $unwind$?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$__acrt_stdio_free_buffer_nolock 00000001800394e0     libucrt:_freebuf.obj
- 0002:000114e0       $unwind$_purecall          00000001800394e0     libvcruntime:purevirt.obj
- 0002:000114e0       $unwind$strcpy_s           00000001800394e0     libucrt:strcpy_s.obj
- 0002:000114e0       $unwind$??_Gtype_info@@UEAAPEAXI@Z 00000001800394e0     LIBCMT:std_type_info_static.obj
- 0002:000114e0       $unwind$?_Facet_Register@std@@YAXPEAV_Facet_base@1@@Z 00000001800394e0     libcpmt:locale0.obj
- 0002:000114e0       $unwind$__acrt_initialize_locks 00000001800394e0     libucrt:locks.obj
- 0002:000114e0       $unwind$??2@YAPEAX_K@Z     00000001800394e0     LIBCMT:new_scalar.obj
- 0002:000114e0       $unwind$__acrt_uninitialize_locks 00000001800394e0     libucrt:locks.obj
- 0002:000114e0       $unwind$??0bad_array_new_length@std@@QEAA@AEBV01@@Z 00000001800394e0     LIBCMT:throw_bad_alloc.obj
- 0002:000114e0       $unwind$??$_Insert_at@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAA?AV?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@1@_NPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@1@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@1@1@Z 00000001800394e0     node_printer_win.obj
- 0002:000114e0       $unwind$_Init_thread_notify 00000001800394e0     LIBCMT:thread_safe_statics.obj
- 0002:000114e0       $unwind$?__GetUnwindTryBlock@@YAHPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 00000001800394e0     libvcruntime:ehstate.obj
- 0002:000114e0       $unwind$__acrt_uninitialize_winapi_thunks 00000001800394e0     libucrt:winapi_thunks.obj
- 0002:000114e0       $unwind$_Init_thread_footer 00000001800394e0     LIBCMT:thread_safe_statics.obj
- 0002:000114e0       $unwind$_Init_thread_header 00000001800394e0     LIBCMT:thread_safe_statics.obj
- 0002:000114e8       $unwind$_invalid_parameter_noinfo_noreturn 00000001800394e8     libucrt:invalid_parameter.obj
- 0002:000114e8       $unwind$wctomb_s           00000001800394e8     libucrt:wctomb.obj
- 0002:000114e8       $unwind$_itow_s            00000001800394e8     libucrt:xtoa.obj
- 0002:000114e8       $unwind$_wtol              00000001800394e8     libucrt:atox.obj
- 0002:000114e8       $unwind$?_Doraise@runtime_error@std@@MEBAXXZ 00000001800394e8     node_printer_win.obj
- 0002:000114e8       $unwind$_invalid_parameter_noinfo 00000001800394e8     libucrt:invalid_parameter.obj
- 0002:000114e8       $unwind$?_Doraise@failure@ios_base@std@@MEBAXXZ 00000001800394e8     node_printer_win.obj
- 0002:000114e8       $unwind$mbstowcs_s         00000001800394e8     libucrt:mbstowcs.obj
- 0002:000114e8       $unwind$_log10_special     00000001800394e8     libucrt:log_special.obj
- 0002:000114f0       $unwind$??0_Locinfo@std@@QEAA@PEBD@Z 00000001800394f0     node_printer_win.obj
- 0002:000114f0       $unwind$?x_ismbbtype_l@@YAHPEAU__crt_locale_pointers@@IHH@Z 00000001800394f0     libucrt:ismbbyte.obj
- 0002:000114f0       $unwind$_stricmp_l         00000001800394f0     libucrt:stricmp.obj
- 0002:00011500       $unwind$?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 0000000180039500     node_printer_win.obj
- 0002:00011510       $chain$0$?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 0000000180039510     node_printer_win.obj
- 0002:00011524       $chain$1$?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 0000000180039524     node_printer_win.obj
- 0002:00011534       $unwind$ProcessCodePage    0000000180039534     libucrt:getqloc_downlevel.obj
- 0002:00011534       $unwind$ProcessCodePage    0000000180039534     libucrt:get_qualified_locale.obj
- 0002:00011534       $unwind$TestDefaultLanguage 0000000180039534     libucrt:getqloc_downlevel.obj
- 0002:00011534       $unwind$?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180039534     node_printer_win.obj
- 0002:00011534       $unwind$?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180039534     node_printer_win.obj
- 0002:00011544       $chain$0$?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180039544     node_printer_win.obj
- 0002:00011558       $chain$1$?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180039558     node_printer_win.obj
- 0002:00011568       $chain$0$?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180039568     node_printer_win.obj
- 0002:0001157c       $chain$1$?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 000000018003957c     node_printer_win.obj
- 0002:0001158c       $unwind$??0_System_error@std@@IEAA@Verror_code@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z 000000018003958c     node_printer_win.obj
- 0002:000115a8       $unwind$?clear@ios_base@std@@QEAAXH_N@Z 00000001800395a8     node_printer_win.obj
- 0002:000115bc       $chain$0$?clear@ios_base@std@@QEAAXH_N@Z 00000001800395bc     node_printer_win.obj
- 0002:000115d0       $chain$1$?clear@ios_base@std@@QEAAXH_N@Z 00000001800395d0     node_printer_win.obj
- 0002:000115e0       $chain$2$?clear@ios_base@std@@QEAAXH_N@Z 00000001800395e0     node_printer_win.obj
- 0002:000115f4       $unwind$?getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 00000001800395f4     node_printer_win.obj
- 0002:000115f4       $unwind$?construct_ptd_array@@YAXQEAU__acrt_ptd@@@Z 00000001800395f4     libucrt:per_thread_data.obj
- 0002:000115f4       $unwind$?getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 00000001800395f4     node_printer_win.obj
- 0002:000115f4       $unwind$?getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 00000001800395f4     node_printer_win.obj
- 0002:000115fc       $chain$2$?getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 00000001800395fc     node_printer_win.obj
- 0002:00011618       $chain$3$?getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180039618     node_printer_win.obj
- 0002:00011628       $chain$2$?getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180039628     node_printer_win.obj
- 0002:00011644       $chain$3$?getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180039644     node_printer_win.obj
- 0002:00011654       $chain$2$?getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180039654     node_printer_win.obj
- 0002:00011670       $chain$3$?getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180039670     node_printer_win.obj
- 0002:00011680       $unwind$?getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180039680     node_printer_win.obj
- 0002:00011688       $chain$2$?getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180039688     node_printer_win.obj
- 0002:000116a4       $chain$3$?getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 00000001800396a4     node_printer_win.obj
- 0002:000116b4       $unwind$?parseJobObject@?A0xcb87c0d3@@YAXPEAU_JOB_INFO_2W@@V?$Local@VObject@v8@@@v8@@@Z 00000001800396b4     node_printer_win.obj
- 0002:000116c4       $unwind$?getLastErrorCodeAndMessage@?A0xcb87c0d3@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ 00000001800396c4     node_printer_win.obj
- 0002:000116e4       $unwind$?retrieveAndParseJobs@?A0xcb87c0d3@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEA_WAEBKV?$Local@VObject@v8@@@v8@@AEAUPrinterHandle@1@@Z 00000001800396e4     node_printer_win.obj
- 0002:00011704       $unwind$?parsePrinterInfo@?A0xcb87c0d3@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEBU_PRINTER_INFO_2W@@V?$Local@VObject@v8@@@v8@@AEAUPrinterHandle@1@@Z 0000000180039704     node_printer_win.obj
- 0002:00011720       $unwind$?getPrinters@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039720     node_printer_win.obj
- 0002:00011748       $unwind$?getDefaultPrinterName@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039748     node_printer_win.obj
- 0002:00011754       $chain$0$?getDefaultPrinterName@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039754     node_printer_win.obj
- 0002:00011768       $chain$1$?getDefaultPrinterName@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039768     node_printer_win.obj
- 0002:00011778       $unwind$?getPrinter@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039778     node_printer_win.obj
- 0002:00011794       $chain$0$?getPrinter@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039794     node_printer_win.obj
- 0002:000117a8       $chain$1$?getPrinter@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800397a8     node_printer_win.obj
- 0002:000117b8       $unwind$?PrintFile@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800397b8     node_printer_win.obj
- 0002:000117b8       $unwind$?getPrinterDriverOptions@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800397b8     node_printer_win.obj
- 0002:000117c0       $unwind$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800397c0     node_printer_win.obj
- 0002:000117d8       $chain$0$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800397d8     node_printer_win.obj
- 0002:000117ec       $chain$1$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800397ec     node_printer_win.obj
- 0002:00011800       $chain$2$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039800     node_printer_win.obj
- 0002:00011814       $chain$3$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039814     node_printer_win.obj
- 0002:00011824       $chain$4$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039824     node_printer_win.obj
- 0002:00011834       $chain$5$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039834     node_printer_win.obj
- 0002:00011844       $unwind$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039844     node_printer_win.obj
- 0002:0001185c       $chain$1$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 000000018003985c     node_printer_win.obj
- 0002:00011874       $chain$2$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039874     node_printer_win.obj
- 0002:00011888       $chain$4$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039888     node_printer_win.obj
- 0002:000118a0       $chain$5$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800398a0     node_printer_win.obj
- 0002:000118b4       $chain$6$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800398b4     node_printer_win.obj
- 0002:000118c4       $chain$7$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800398c4     node_printer_win.obj
- 0002:000118d4       $chain$8$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800398d4     node_printer_win.obj
- 0002:000118e4       $unwind$?getSupportedJobCommands@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800398e4     node_printer_win.obj
- 0002:000118f4       $unwind$?getSupportedPrintFormats@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800398f4     node_printer_win.obj
- 0002:0001191c       $unwind$?PrintDirect@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 000000018003991c     node_printer_win.obj
- 0002:00011938       $chain$1$?PrintDirect@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039938     node_printer_win.obj
- 0002:00011950       $chain$2$?PrintDirect@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180039950     node_printer_win.obj
- 0002:00011960       $unwind$?seekpos@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAA?AV?$fpos@U_Mbstatet@@@2@V32@H@Z 0000000180039960     node_printer_win.obj
- 0002:0001196c       $unwind$?seekoff@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAA?AV?$fpos@U_Mbstatet@@@2@_JHH@Z 000000018003996c     node_printer_win.obj
- 0002:0001197c       $unwind$?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z 000000018003997c     node_printer_win.obj
- 0002:0001197c       $unwind$__CxxCallCatchBlock$fin$1 000000018003997c     libvcruntime:frame.obj
- 0002:00011988       $chain$0$?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z 0000000180039988     node_printer_win.obj
- 0002:0001199c       $chain$6$?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z 000000018003999c     node_printer_win.obj
- 0002:000119c0       $chain$7$?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z 00000001800399c0     node_printer_win.obj
- 0002:000119dc       $unwind$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 00000001800399dc     node_printer_win.obj
- 0002:000119e4       $chain$1$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 00000001800399e4     node_printer_win.obj
- 0002:000119fc       $chain$3$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 00000001800399fc     node_printer_win.obj
- 0002:00011a14       $chain$4$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 0000000180039a14     node_printer_win.obj
- 0002:00011a28       $chain$5$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 0000000180039a28     node_printer_win.obj
- 0002:00011a38       $chain$6$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 0000000180039a38     node_printer_win.obj
- 0002:00011a4c       $chain$9$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 0000000180039a4c     node_printer_win.obj
- 0002:00011a4c       $chain$7$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 0000000180039a4c     node_printer_win.obj
- 0002:00011a5c       $chain$8$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 0000000180039a5c     node_printer_win.obj
- 0002:00011a74       $unwind$?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z 0000000180039a74     node_printer_win.obj
- 0002:00011a88       $chain$0$?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z 0000000180039a88     node_printer_win.obj
- 0002:00011a9c       $chain$1$?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z 0000000180039a9c     node_printer_win.obj
- 0002:00011aac       $unwind$?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z 0000000180039aac     node_printer_win.obj
- 0002:00011abc       $chain$1$?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z 0000000180039abc     node_printer_win.obj
- 0002:00011ad4       $chain$2$?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z 0000000180039ad4     node_printer_win.obj
- 0002:00011ae4       $chain$3$?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z 0000000180039ae4     node_printer_win.obj
- 0002:00011afc       $unwind$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBX@Z 0000000180039afc     node_printer_win.obj
- 0002:00011b14       $unwind$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DO@Z 0000000180039b14     node_printer_win.obj
- 0002:00011b14       $unwind$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z 0000000180039b14     node_printer_win.obj
- 0002:00011b38       $unwind$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DK@Z 0000000180039b38     node_printer_win.obj
- 0002:00011b38       $unwind$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z 0000000180039b38     node_printer_win.obj
- 0002:00011b38       $unwind$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_K@Z 0000000180039b38     node_printer_win.obj
- 0002:00011b38       $unwind$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_J@Z 0000000180039b38     node_printer_win.obj
- 0002:00011b50       $unwind$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 0000000180039b50     node_printer_win.obj
- 0002:00011b6c       $chain$1$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 0000000180039b6c     node_printer_win.obj
- 0002:00011b84       $chain$2$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 0000000180039b84     node_printer_win.obj
- 0002:00011b98       $chain$3$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 0000000180039b98     node_printer_win.obj
- 0002:00011ba8       $chain$4$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 0000000180039ba8     node_printer_win.obj
- 0002:00011bb8       $chain$5$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 0000000180039bb8     node_printer_win.obj
- 0002:00011bd0       $unwind$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 0000000180039bd0     node_printer_win.obj
- 0002:00011bd0       $unwind$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 0000000180039bd0     node_printer_win.obj
- 0002:00011be0       $chain$0$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 0000000180039be0     node_printer_win.obj
- 0002:00011bf4       $chain$1$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 0000000180039bf4     node_printer_win.obj
- 0002:00011c04       $chain$2$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 0000000180039c04     node_printer_win.obj
- 0002:00011c18       $unwind$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 0000000180039c18     node_printer_win.obj
- 0002:00011c2c       $chain$0$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 0000000180039c2c     node_printer_win.obj
- 0002:00011c40       $chain$1$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 0000000180039c40     node_printer_win.obj
- 0002:00011c50       $chain$2$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 0000000180039c50     node_printer_win.obj
- 0002:00011c64       $unwind$?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 0000000180039c64     node_printer_win.obj
- 0002:00011c7c       $unwind$?_Iput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEAD_K@Z 0000000180039c7c     node_printer_win.obj
- 0002:00011ca0       $unwind$?_Fput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBD_K@Z 0000000180039ca0     node_printer_win.obj
- 0002:00011cc4       $chain$0$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 0000000180039cc4     node_printer_win.obj
- 0002:00011cd8       $chain$1$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 0000000180039cd8     node_printer_win.obj
- 0002:00011ce8       $chain$2$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 0000000180039ce8     node_printer_win.obj
- 0002:00011cfc       $unwind$?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ 0000000180039cfc     node_printer_win.obj
- 0002:00011cfc       $unwind$??0length_error@std@@QEAA@PEBD@Z 0000000180039cfc     libcpmt:xthrow.obj
- 0002:00011cfc       $unwind$??0out_of_range@std@@QEAA@PEBD@Z 0000000180039cfc     libcpmt:xthrow.obj
- 0002:00011cfc       $unwind$strtol             0000000180039cfc     libucrt:strtox.obj
- 0002:00011cfc       $unwind$??$common_xtox_s@K_W@@YAHKQEA_W_KI_N@Z 0000000180039cfc     libucrt:xtoa.obj
- 0002:00011cfc       $unwind$__stdio_common_vsprintf_s 0000000180039cfc     libucrt:output.obj
- 0002:00011d04       $chain$1$?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ 0000000180039d04     node_printer_win.obj
- 0002:00011d1c       $chain$4$?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ 0000000180039d1c     node_printer_win.obj
- 0002:00011d1c       $chain$2$?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ 0000000180039d1c     node_printer_win.obj
- 0002:00011d2c       $chain$3$?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ 0000000180039d2c     node_printer_win.obj
- 0002:00011d44       $unwind$?expand_if_necessary@?$argument_list@D@?A0xca0879c4@@AEAAHXZ 0000000180039d44     libucrt:argv_wildcards.obj
- 0002:00011d44       $unwind$__acrt_lowio_create_handle_array 0000000180039d44     libucrt:osfinfo.obj
- 0002:00011d44       $unwind$?_ExecutionInCatch@@YAHPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 0000000180039d44     libvcruntime:trnsctrl.obj
- 0002:00011d44       $unwind$?process@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAAHXZ 0000000180039d44     libucrt:output.obj
- 0002:00011d44       $unwind$__acrt_execute_initializers 0000000180039d44     libucrt:shared_initialization.obj
- 0002:00011d44       $unwind$__crtInitializeCriticalSectionEx 0000000180039d44     libcpmt:winapisupp.obj
- 0002:00011d44       $unwind$_recalloc_base     0000000180039d44     libucrt:recalloc.obj
- 0002:00011d44       $unwind$?dllmain_raw@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180039d44     LIBCMT:dll_dllmain.obj
- 0002:00011d44       $unwind$??$ensure_buffer_is_big_enough@D@formatting_buffer@__crt_stdio_output@@QEAA_N_K@Z 0000000180039d44     libucrt:output.obj
- 0002:00011d44       $unwind$__acrt_InitializeCriticalSectionEx 0000000180039d44     libucrt:winapi_thunks.obj
- 0002:00011d44       $unwind$__vcrt_InitializeCriticalSectionEx 0000000180039d44     libvcruntime:winapi_downlevel.obj
- 0002:00011d44       $unwind$_seh_filter_exe    0000000180039d44     libucrt:exception_filter.obj
- 0002:00011d44       $unwind$?setSBCS@@YAXPEAU__crt_multibyte_data@@@Z 0000000180039d44     libucrt:mbctype.obj
- 0002:00011d44       $unwind$__acrt_free_locale 0000000180039d44     libucrt:locale_refcounting.obj
- 0002:00011d44       $unwind$?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IEAAXPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z 0000000180039d44     node_printer_win.obj
- 0002:00011d44       $unwind$__scrt_dllmain_exception_filter 0000000180039d44     LIBCMT:utility.obj
- 0002:00011d58       $unwind$?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADD@Z 0000000180039d58     node_printer_win.obj
- 0002:00011d64       $unwind$?_Erase@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAAXPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@Z 0000000180039d64     node_printer_win.obj
- 0002:00011d74       $chain$0$?_Erase@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAAXPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@Z 0000000180039d74     node_printer_win.obj
- 0002:00011d88       $chain$1$?_Erase@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAAXPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@Z 0000000180039d88     node_printer_win.obj
- 0002:00011d98       $chain$2$?_Erase@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAAXPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@Z 0000000180039d98     node_printer_win.obj
- 0002:00011dac       $unwind$??$use_facet@V?$numpunct@D@std@@@std@@YAAEBV?$numpunct@D@0@AEBVlocale@0@@Z 0000000180039dac     node_printer_win.obj
- 0002:00011dac       $unwind$??$use_facet@V?$ctype@D@std@@@std@@YAAEBV?$ctype@D@0@AEBVlocale@0@@Z 0000000180039dac     node_printer_win.obj
- 0002:00011dbc       $unwind$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 0000000180039dbc     node_printer_win.obj
- 0002:00011dc4       $chain$3$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 0000000180039dc4     node_printer_win.obj
- 0002:00011de4       $chain$4$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 0000000180039de4     node_printer_win.obj
- 0002:00011df8       $chain$5$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 0000000180039df8     node_printer_win.obj
- 0002:00011df8       $chain$7$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 0000000180039df8     node_printer_win.obj
- 0002:00011e08       $chain$6$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 0000000180039e08     node_printer_win.obj
- 0002:00011e28       $unwind$??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z 0000000180039e28     node_printer_win.obj
- 0002:00011e40       $unwind$??$use_facet@V?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@@std@@YAAEBV?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@0@AEBVlocale@0@@Z 0000000180039e40     node_printer_win.obj
- 0002:00011e54       $unwind$?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 0000000180039e54     node_printer_win.obj
- 0002:00011e64       $chain$0$?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 0000000180039e64     node_printer_win.obj
- 0002:00011e78       $chain$1$?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 0000000180039e78     node_printer_win.obj
- 0002:00011e88       $unwind$?_Init@?$numpunct@D@std@@IEAAXAEBV_Locinfo@2@_N@Z 0000000180039e88     node_printer_win.obj
- 0002:00011ea0       $unwind$??$emplace@U?$pair@PEBDH@std@@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@QEAA?AU?$pair@V?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@std@@_N@1@$$QEAU?$pair@PEBDH@1@@Z 0000000180039ea0     node_printer_win.obj
- 0002:00011eb8       $unwind$??$_Insert_nohint@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@V?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@std@@_N@1@_NAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@1@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@1@@Z 0000000180039eb8     node_printer_win.obj
- 0002:00011ecc       $chain$1$??$_Insert_nohint@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@V?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@std@@_N@1@_NAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@1@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@1@@Z 0000000180039ecc     node_printer_win.obj
- 0002:00011ee4       $chain$2$??$_Insert_nohint@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@V?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@std@@_N@1@_NAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@1@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@1@@Z 0000000180039ee4     node_printer_win.obj
- 0002:00011ef4       xdata                      0000000180039ef4     node:node.exe
- 0002:00011efc       $unwind$??_G_Fac_node@std@@QEAAPEAXI@Z 0000000180039efc     libcpmt:locale0.obj
- 0002:00011f18       $ip2state$??_G_Fac_node@std@@QEAAPEAXI@Z 0000000180039f18     libcpmt:locale0.obj
- 0002:00011f30       $unwind$?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z 0000000180039f30     libcpmt:locale0.obj
- 0002:00011f4c       $stateUnwindMap$?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z 0000000180039f4c     libcpmt:locale0.obj
- 0002:00011f4c       $stateUnwindMap$?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z 0000000180039f4c     libcpmt:locale0.obj
- 0002:00011f58       $ip2state$?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z 0000000180039f58     libcpmt:locale0.obj
- 0002:00011f70       $unwind$??_G_Locimp@locale@std@@MEAAPEAXI@Z 0000000180039f70     libcpmt:locale0.obj
- 0002:00011f88       $ip2state$??_G_Locimp@locale@std@@MEAAPEAXI@Z 0000000180039f88     libcpmt:locale0.obj
- 0002:00011fa0       $unwind$?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z 0000000180039fa0     libcpmt:locale0.obj
- 0002:00011fb8       $ip2state$?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z 0000000180039fb8     libcpmt:locale0.obj
- 0002:00011fd0       $unwind$??__Fclassic_locale@std@@YAXXZ 0000000180039fd0     libcpmt:locale0.obj
- 0002:00011fe8       $ip2state$??__Fclassic_locale@std@@YAXXZ 0000000180039fe8     libcpmt:locale0.obj
- 0002:00012000       $unwind$_Tolower           000000018003a000     libcpmt:_tolower.obj
- 0002:00012010       $unwind$_Toupper           000000018003a010     libcpmt:_toupper.obj
- 0002:00012024       $unwind$??__Finit_atexit@@YAXXZ 000000018003a024     libcpmt:iosptrs.obj
- 0002:00012034       $stateUnwindMap$??__Fclassic_locale@std@@YAXXZ 000000018003a034     libcpmt:locale0.obj
- 0002:00012034       $stateUnwindMap$??_G_Locimp@locale@std@@MEAAPEAXI@Z 000000018003a034     libcpmt:locale0.obj
- 0002:00012034       $stateUnwindMap$??__Finit_atexit@@YAXXZ 000000018003a034     libcpmt:iosptrs.obj
- 0002:00012034       $stateUnwindMap$??_G_Fac_node@std@@QEAAPEAXI@Z 000000018003a034     libcpmt:locale0.obj
- 0002:00012040       $ip2state$??__Finit_atexit@@YAXXZ 000000018003a040     libcpmt:iosptrs.obj
- 0002:00012058       $unwind$__crtLCMapStringA  000000018003a058     libcpmt:StlLCMapStringA.obj
- 0002:00012080       $xdatasym                  000000018003a080     LIBCMT:_amdsecgs_.obj
- 0002:00012084       $unwind$__scrt_is_nonwritable_in_current_image 000000018003a084     LIBCMT:utility.obj
- 0002:000120a4       $unwind$__scrt_is_nonwritable_in_current_image$filt$0 000000018003a0a4     LIBCMT:utility.obj
- 0002:000120ac       $unwind$__scrt_initialize_onexit_tables 000000018003a0ac     LIBCMT:utility.obj
- 0002:000120b8       $unwind$?dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z 000000018003a0b8     LIBCMT:dll_dllmain.obj
- 0002:000120e4       $unwind$_fcloseall$fin$0   000000018003a0e4     libucrt:closeall.obj
- 0002:000120e4       $unwind$_query_new_handler$fin$0 000000018003a0e4     libucrt:new_handler.obj
- 0002:000120e4       $unwind$__FrameUnwindToState$fin$1 000000018003a0e4     libvcruntime:frame.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@V<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@$$QEAV<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@Z@4HA 000000018003a0e4     libucrt:wsetlocale.obj
- 0002:000120e4       $unwind$?fin$1@?0??common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z@4HA 000000018003a0e4     libucrt:exit.obj
- 0002:000120e4       $unwind$_write$fin$0       000000018003a0e4     libucrt:write.obj
- 0002:000120e4       $unwind$__FrameUnwindToState$filt$0 000000018003a0e4     libvcruntime:frame.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@V<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@$$QEAV<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@Z@4HA 000000018003a0e4     libucrt:per_thread_data.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@V<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@$$QEAV<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@Z@4HA 000000018003a0e4     libucrt:per_thread_data.obj
- 0002:000120e4       $unwind$fclose$fin$0       000000018003a0e4     libucrt:fclose.obj
- 0002:000120e4       $unwind$raise$fin$0        000000018003a0e4     libucrt:signal.obj
- 0002:000120e4       $unwind$?fin$0@?0??dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z@4HA 000000018003a0e4     LIBCMT:dll_dllmain.obj
- 0002:000120e4       $unwind$__CxxCallCatchBlock$filt$0 000000018003a0e4     libvcruntime:frame.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@Z@4HA 000000018003a0e4     libucrt:wsetlocale.obj
- 0002:000120e4       $unwind$_ctrlfp$filt$0     000000018003a0e4     libucrt:fpctrl.obj
- 0002:000120e4       $unwind$__acrt_update_thread_locale_data$fin$0 000000018003a0e4     libucrt:locale_refcounting.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@V<lambda_237c231691f317818eb88cc1d5d642d6>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@$$QEAV<lambda_237c231691f317818eb88cc1d5d642d6>@@@Z@4HA 000000018003a0e4     libucrt:close.obj
- 0002:000120e4       $unwind$__acrt_initialize_lowio$fin$0 000000018003a0e4     libucrt:ioinit.obj
- 0002:000120e4       $unwind$common_flush_all$fin$1 000000018003a0e4     libucrt:fflush.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@V<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@$$QEAV<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@Z@4HA 000000018003a0e4     libucrt:onexit.obj
- 0002:000120e4       $unwind$_IsNonwritableInCurrentImage$filt$0 000000018003a0e4     LIBCMT:pesect.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@V<lambda_314360699dd331753a4119843814e9a7>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@$$QEAV<lambda_314360699dd331753a4119843814e9a7>@@@Z@4HA 000000018003a0e4     libucrt:commit.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@V<lambda_341c25c0346d94847f1f3c463c57e077>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@$$QEAV<lambda_341c25c0346d94847f1f3c463c57e077>@@@Z@4HA 000000018003a0e4     libucrt:per_thread_data.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@V<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@$$QEAV<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@Z@4HA 000000018003a0e4     libucrt:winapi_thunks.obj
- 0002:000120e4       $unwind$__DestructExceptionObject$filt$0 000000018003a0e4     libvcruntime:frame.obj
- 0002:000120e4       $unwind$__acrt_update_thread_multibyte_data$fin$0 000000018003a0e4     libucrt:mbctype.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@V<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@$$QEAV<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@Z@4HA 000000018003a0e4     libucrt:mbctype.obj
- 0002:000120e4       $unwind$common_flush_all$fin$0 000000018003a0e4     libucrt:fflush.obj
- 0002:000120e4       $unwind$?fin$0@?0??dllmain_crt_process_detach@@YAH_N@Z@4HA 000000018003a0e4     LIBCMT:dll_dllmain.obj
- 0002:000120e4       $unwind$__acrt_lowio_ensure_fh_exists$fin$0 000000018003a0e4     libucrt:osfinfo.obj
- 0002:000120e4       $unwind$common_control87$filt$0 000000018003a0e4     libucrt:ieee.obj
- 0002:000120e4       $unwind$__acrt_uninitialize_locale$fin$0 000000018003a0e4     libucrt:wsetlocale.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@V<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@$$QEAV<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@Z@4HA 000000018003a0e4     libucrt:onexit.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@V<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@$$QEAV<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@Z@4HA 000000018003a0e4     libucrt:per_thread_data.obj
- 0002:000120e4       $unwind$?fin$0@?0???$?RV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@V<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@?$__crt_seh_guarded_call@P6AXH@Z@@QEAAP6AXH@Z$$QEAV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@$$QEAV<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@Z@4HA 000000018003a0e4     libucrt:signal.obj
- 0002:000120e4       $unwind$?filt$0@?0??common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z@4HA 000000018003a0e4     libucrt:exit.obj
- 0002:000120ec       $unwind$?dllmain_crt_process_detach@@YAH_N@Z 000000018003a0ec     LIBCMT:dll_dllmain.obj
- 0002:00012114       $unwind$?dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 000000018003a114     LIBCMT:dll_dllmain.obj
- 0002:0001213c       $unwind$setlocale$fin$0    000000018003a13c     libucrt:setlocale.obj
- 0002:0001213c       $unwind$?filt$0@?0??dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z@4HA 000000018003a13c     LIBCMT:dll_dllmain.obj
- 0002:00012144       $unwind$__GSHandlerCheckCommon 000000018003a144     LIBCMT:_gshandler_.obj
- 0002:00012150       $xdatasym                  000000018003a150     LIBCMT:_chkstk_.obj
- 0002:00012158       $unwind$__report_securityfailure 000000018003a158     LIBCMT:gs_report.obj
- 0002:00012160       $unwind$__report_gsfailure 000000018003a160     LIBCMT:gs_report.obj
- 0002:00012160       $unwind$_putwch_nolock     000000018003a160     libucrt:putwch.obj
- 0002:00012168       $unwind$capture_current_context 000000018003a168     LIBCMT:gs_report.obj
- 0002:00012174       $unwind$capture_previous_context 000000018003a174     LIBCMT:gs_report.obj
- 0002:00012180       $unwind$__scrt_fastfail    000000018003a180     LIBCMT:utility_desktop.obj
- 0002:00012190       $unwind$__isa_available_init 000000018003a190     LIBCMT:_cpu_disp_.obj
- 0002:000121a0       $unwind$__security_init_cookie 000000018003a1a0     LIBCMT:gs_support.obj
- 0002:000121b0       $xdatasym                  000000018003a1b0     LIBCMT:_guard_dispatch_.obj
- 0002:000121b8       $xdatasym                  000000018003a1b8     libvcruntime:memcpy.obj
- 0002:000121bc       $unwind$_CxxThrowException 000000018003a1bc     libvcruntime:throw.obj
- 0002:000121d0       $unwind$__CxxCallCatchBlock 000000018003a1d0     libvcruntime:frame.obj
- 0002:0001220c       $unwind$__FrameUnwindToState 000000018003a20c     libvcruntime:frame.obj
- 0002:00012248       $unwind$?FindHandler@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@EH1@Z 000000018003a248     libvcruntime:frame.obj
- 0002:00012268       $unwind$?CatchIt@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@PEBU_s_HandlerType@@PEBU_s_CatchableType@@PEBU_s_TryBlockMapEntry@@H1EE@Z 000000018003a268     libvcruntime:frame.obj
- 0002:00012280       $unwind$__BuildCatchObject 000000018003a280     libvcruntime:frame.obj
- 0002:000122ac       $unwind$?FindHandlerForForeignException@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@HH1@Z 000000018003a2ac     libvcruntime:frame.obj
- 0002:000122c4       $unwind$__DestructExceptionObject 000000018003a2c4     libvcruntime:frame.obj
- 0002:000122e8       $unwind$__acrt_locale_initialize_numeric 000000018003a2e8     libucrt:initnum.obj
- 0002:000122e8       $unwind$__C_specific_handler 000000018003a2e8     libvcruntime:_chandler_.obj
- 0002:000122e8       $unwind$__InternalCxxFrameHandler 000000018003a2e8     libvcruntime:frame.obj
- 0002:00012304       $unwind$__BuildCatchObjectHelper 000000018003a304     libvcruntime:frame.obj
- 0002:00012344       $unwind$?_GetEstablisherFrame@@YAPEA_KPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@0@Z 000000018003a344     libvcruntime:trnsctrl.obj
- 0002:0001235c       $unwind$?__FrameUnwindToEmptyState@@YAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 000000018003a35c     libvcruntime:trnsctrl.obj
- 0002:00012370       $unwind$_CallSETranslator  000000018003a370     libvcruntime:trnsctrl.obj
- 0002:00012394       $unwind$_CallSETranslator$filt$0 000000018003a394     libvcruntime:trnsctrl.obj
- 0002:0001239c       $unwind$_UnwindNestedFrames 000000018003a39c     libvcruntime:trnsctrl.obj
- 0002:000123b0       $unwind$__CxxFrameHandler3 000000018003a3b0     libvcruntime:trnsctrl.obj
- 0002:000123c0       $xdatasym                  000000018003a3c0     libvcruntime:memset.obj
- 0002:000123c8       $xdatasym                  000000018003a3c8     libvcruntime:memcmp.obj
- 0002:000123cc       $unwind$__vcrt_uninitialize_winapi_thunks 000000018003a3cc     libvcruntime:winapi_downlevel.obj
- 0002:000123d8       $xdatasym                  000000018003a3d8     libvcruntime:handlers.obj
- 0002:000123e0       $xdatasym                  000000018003a3e0     libvcruntime:_jmpuwind_.obj
- 0002:000123f4       $unwind$__acrt_call_reportfault 000000018003a3f4     libucrt:invalid_parameter.obj
- 0002:00012414       $unwind$_invalid_parameter 000000018003a414     libucrt:invalid_parameter.obj
- 0002:0001242c       $unwind$??$common_vsprintf@Vformat_validation_base@__crt_stdio_output@@D@@YAH_KQEAD0QEBDQEAU__crt_locale_pointers@@1@Z 000000018003a42c     libucrt:output.obj
- 0002:0001244c       $unwind$??$type_case_integer_parse_into_buffer@I@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAXII_N@Z 000000018003a44c     libucrt:output.obj
- 0002:0001244c       $unwind$??$write_multiple_characters@V?$string_output_adapter@D@__crt_stdio_output@@D@__crt_stdio_output@@YAXAEBV?$string_output_adapter@D@0@DHQEAH@Z 000000018003a44c     libucrt:output.obj
- 0002:0001244c       $unwind$??$type_case_integer_parse_into_buffer@_K@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAX_KI_N@Z 000000018003a44c     libucrt:output.obj
- 0002:00012454       $unwind$?parse_int_from_format_string@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NQEAH@Z 000000018003a454     libucrt:output.obj
- 0002:00012468       $unwind$?state_case_type@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018003a468     libucrt:output.obj
- 0002:00012480       $unwind$?type_case_a@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 000000018003a480     libucrt:output.obj
- 0002:0001248c       $unwind$?write_stored_string_tchar@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 000000018003a48c     libucrt:output.obj
- 0002:000124a4       $unwind$frexp              000000018003a4a4     libucrt:frexp.obj
- 0002:000124b8       $unwind$setlocale          000000018003a4b8     libucrt:setlocale.obj
- 0002:000124e8       $unwind$call_wsetlocale    000000018003a4e8     libucrt:setlocale.obj
- 0002:000124fc       $unwind$__acrt_DownlevelLCIDToLocaleName 000000018003a4fc     libucrt:lcidtoname_downlevel.obj
- 0002:000124fc       $unwind$__lc_lctowcs       000000018003a4fc     libucrt:wsetlocale.obj
- 0002:000124fc       $unwind$_wcsdup            000000018003a4fc     libucrt:wcsdup.obj
- 0002:00012510       $unwind$__acrt_locale_initialize_ctype 000000018003a510     libucrt:initctype.obj
- 0002:00012538       $unwind$?divide@__crt_strtox@@YA_KAEAUbig_integer@1@AEBU21@@Z 000000018003a538     libucrt:strtod.obj
- 0002:00012558       $chain$5$?divide@__crt_strtox@@YA_KAEAUbig_integer@1@AEBU21@@Z 000000018003a558     libucrt:strtod.obj
- 0002:0001256c       $chain$6$?divide@__crt_strtox@@YA_KAEAUbig_integer@1@AEBU21@@Z 000000018003a56c     libucrt:strtod.obj
- 0002:00012580       $xdatasym                  000000018003a580     libucrt:pow.obj
- 0002:00012590       $xdatasym                  000000018003a590     libucrt:powf.obj
- 0002:000125a0       $unwind$__acrt_locale_free_numeric 000000018003a5a0     libucrt:initnum.obj
- 0002:000125a0       $unwind$__acrt_locale_free_lc_time_if_unreferenced 000000018003a5a0     libucrt:locale_refcounting.obj
- 0002:000125a0       $unwind$_free_base         000000018003a5a0     libucrt:free_base.obj
- 0002:000125a0       $unwind$?destroy_fls@@YAXPEAX@Z 000000018003a5a0     libucrt:per_thread_data.obj
- 0002:000125a8       $unwind$_tolower_l         000000018003a5a8     libucrt:tolower_toupper.obj
- 0002:000125b8       $unwind$wcsnlen            000000018003a5b8     libucrt:strnlen.obj
- 0002:000125b8       $unwind$strnlen            000000018003a5b8     libucrt:strnlen.obj
- 0002:000125c0       $unwind$_query_new_handler 000000018003a5c0     libucrt:new_handler.obj
- 0002:000125e0       $unwind$?common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z 000000018003a5e0     libucrt:exit.obj
- 0002:00012620       $unwind$_configure_narrow_argv 000000018003a620     libucrt:argv_parsing.obj
- 0002:00012634       $unwind$??$free_environment@_W@@YAXQEAPEA_W@Z 000000018003a634     libucrt:environment_initialization.obj
- 0002:00012634       $unwind$??$free_environment@D@@YAXQEAPEAD@Z 000000018003a634     libucrt:environment_initialization.obj
- 0002:00012640       $unwind$_register_onexit_function 000000018003a640     libucrt:onexit.obj
- 0002:00012648       $unwind$_execute_onexit_table 000000018003a648     libucrt:onexit.obj
- 0002:00012650       $unwind$??$?RV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@V<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@$$QEAV<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@Z 000000018003a650     libucrt:onexit.obj
- 0002:00012674       $unwind$??$?RV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@V<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@$$QEAV<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@Z 000000018003a674     libucrt:onexit.obj
- 0002:000126a4       $unwind$__acrt_GetLocaleInfoEx 000000018003a6a4     libucrt:winapi_thunks.obj
- 0002:000126a4       $unwind$__acrt_initialize_stdio 000000018003a6a4     libucrt:_file.obj
- 0002:000126a4       $unwind$__acrt_LCIDToLocaleName 000000018003a6a4     libucrt:winapi_thunks.obj
- 0002:000126a4       $unwind$GetTableIndexFromLocaleName 000000018003a6a4     libcpmt:winapinls.obj
- 0002:000126a4       $unwind$__TypeMatch        000000018003a6a4     libvcruntime:frame.obj
- 0002:000126a4       $unwind$_initterm          000000018003a6a4     libucrt:initterm.obj
- 0002:000126a4       $unwind$TranslateName      000000018003a6a4     libucrt:getqloc_downlevel.obj
- 0002:000126bc       $unwind$terminate          000000018003a6bc     libucrt:terminate.obj
- 0002:000126dc       $unwind$??$parse_integer@KV?$c_string_character_source@D@__crt_strtox@@@__crt_strtox@@YAKQEAU__crt_locale_pointers@@V?$c_string_character_source@D@0@H_N@Z 000000018003a6dc     libucrt:atox.obj
- 0002:000126f8       $unwind$??$parse_integer@KV?$c_string_character_source@_W@__crt_strtox@@@__crt_strtox@@YAKQEAU__crt_locale_pointers@@V?$c_string_character_source@_W@0@H_N@Z 000000018003a6f8     libucrt:atox.obj
- 0002:00012714       $unwind$?destroy_ptd_array@@YAXQEAU__acrt_ptd@@@Z 000000018003a714     libucrt:per_thread_data.obj
- 0002:0001271c       $unwind$??$?RV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@V<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@$$QEAV<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@Z 000000018003a71c     libucrt:per_thread_data.obj
- 0002:00012740       $unwind$??$?RV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@V<lambda_341c25c0346d94847f1f3c463c57e077>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@$$QEAV<lambda_341c25c0346d94847f1f3c463c57e077>@@@Z 000000018003a740     libucrt:per_thread_data.obj
- 0002:00012764       $unwind$??$?RV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@V<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@$$QEAV<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@Z 000000018003a764     libucrt:per_thread_data.obj
- 0002:00012788       $unwind$??$?RV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@V<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@$$QEAV<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@Z 000000018003a788     libucrt:per_thread_data.obj
- 0002:000127ac       $unwind$__acrt_get_sigabrt_handler 000000018003a7ac     libucrt:signal.obj
- 0002:000127b4       $unwind$raise              000000018003a7b4     libucrt:signal.obj
- 0002:000127e0       $unwind$??$?RV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@V<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@?$__crt_seh_guarded_call@P6AXH@Z@@QEAAP6AXH@Z$$QEAV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@$$QEAV<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@Z 000000018003a7e0     libucrt:signal.obj
- 0002:00012804       $unwind$__acrt_LCMapStringEx 000000018003a804     libucrt:winapi_thunks.obj
- 0002:00012804       $unwind$_mbtowc_l          000000018003a804     libucrt:mbtowc.obj
- 0002:00012804       $unwind$__crtLCMapStringEx 000000018003a804     libcpmt:winapinls.obj
- 0002:0001281c       $unwind$_wctomb_s_l        000000018003a81c     libucrt:wctomb.obj
- 0002:0001282c       $unwind$__acrt_fp_format   000000018003a82c     libucrt:cvt.obj
- 0002:00012848       $unwind$?fp_format_nan_or_infinity@@YAHW4__acrt_fp_class@@_NPEAD_K1@Z 000000018003a848     libucrt:cvt.obj
- 0002:0001285c       $unwind$?fp_format_e_internal@@YAHQEAD_KH_NIQEAU_strflt@@2QEAU__crt_locale_pointers@@@Z 000000018003a85c     libucrt:cvt.obj
- 0002:00012874       $unwind$?fp_format_e@@YAHQEBNQEAD_K12H_NIQEAU__crt_locale_pointers@@@Z 000000018003a874     libucrt:cvt.obj
- 0002:00012874       $unwind$__acrt_LCMapStringW 000000018003a874     libucrt:lcmapstringw.obj
- 0002:00012888       $unwind$?fp_format_a@@YAHQEBNPEAD_KQEAD2H_NIQEAU__crt_locale_pointers@@@Z 000000018003a888     libucrt:cvt.obj
- 0002:000128a4       $unwind$?fp_format_g@@YAHQEBNQEAD_K12H_NIQEAU__crt_locale_pointers@@@Z 000000018003a8a4     libucrt:cvt.obj
- 0002:000128b8       $unwind$__acrt_copy_locale_name 000000018003a8b8     libucrt:wsetlocale.obj
- 0002:000128c8       $unwind$_wsetlocale        000000018003a8c8     libucrt:wsetlocale.obj
- 0002:000128d0       $unwind$_expandlocale      000000018003a8d0     libucrt:wsetlocale.obj
- 0002:000128f0       $unwind$_wcscats           000000018003a8f0     libucrt:wsetlocale.obj
- 0002:00012900       $unwind$??$create_environment@D@@YAQEAPEADQEAD@Z 000000018003a900     libucrt:environment_initialization.obj
- 0002:00012900       $unwind$__lc_wcstolc       000000018003a900     libucrt:wsetlocale.obj
- 0002:00012918       $unwind$_wsetlocale_set_cat 000000018003a918     libucrt:wsetlocale.obj
- 0002:0001293c       $unwind$_wsetlocale_get_all 000000018003a93c     libucrt:wsetlocale.obj
- 0002:00012958       $unwind$_wsetlocale_nolock 000000018003a958     libucrt:wsetlocale.obj
- 0002:0001297c       $unwind$__acrt_uninitialize_locale 000000018003a97c     libucrt:wsetlocale.obj
- 0002:0001299c       $unwind$??R<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@QEBAXXZ 000000018003a99c     libucrt:wsetlocale.obj
- 0002:000129a8       $unwind$??$?RV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@Z 000000018003a9a8     libucrt:wsetlocale.obj
- 0002:000129c8       $unwind$??$?RV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@V<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@$$QEAV<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@Z 000000018003a9c8     libucrt:wsetlocale.obj
- 0002:000129ec       $unwind$__acrt_initialize_lowio 000000018003a9ec     libucrt:ioinit.obj
- 0002:00012a0c       $unwind$?initialize_inherited_file_handles_nolock@@YAXXZ 000000018003aa0c     libucrt:ioinit.obj
- 0002:00012a28       $unwind$_except1           000000018003aa28     libucrt:fpexcept.obj
- 0002:00012a48       $unwind$_handle_exc        000000018003aa48     libucrt:fpexcept.obj
- 0002:00012a64       $unwind$__dcrt_lowio_initialize_console_output 000000018003aa64     libucrt:initcon.obj
- 0002:00012a64       $unwind$?_Xbad_alloc@std@@YAXXZ 000000018003aa64     libcpmt:xthrow.obj
- 0002:00012a64       $unwind$?_Xlength_error@std@@YAXPEBD@Z 000000018003aa64     libcpmt:xthrow.obj
- 0002:00012a64       $unwind$_raise_excf        000000018003aa64     libucrt:fpexcept.obj
- 0002:00012a64       $unwind$?__scrt_throw_std_bad_array_new_length@@YAXXZ 000000018003aa64     LIBCMT:throw_bad_alloc.obj
- 0002:00012a64       $unwind$?__scrt_throw_std_bad_alloc@@YAXXZ 000000018003aa64     LIBCMT:throw_bad_alloc.obj
- 0002:00012a64       $unwind$_raise_exc         000000018003aa64     libucrt:fpexcept.obj
- 0002:00012a64       $unwind$?_Xout_of_range@std@@YAXPEBD@Z 000000018003aa64     libcpmt:xthrow.obj
- 0002:00012a6c       $unwind$_umatherr          000000018003aa6c     libucrt:fpexcept.obj
- 0002:00012a74       $unwind$_raise_exc_ex      000000018003aa74     libucrt:fpexcept.obj
- 0002:00012a88       $unwind$_ctrlfp            000000018003aa88     libucrt:fpctrl.obj
- 0002:00012ab0       $unwind$__acrt_initialize_winapi_thunks 000000018003aab0     libucrt:winapi_thunks.obj
- 0002:00012ab8       $unwind$__acrt_EnumSystemLocalesEx 000000018003aab8     libucrt:winapi_thunks.obj
- 0002:00012acc       $unwind$?try_get_function@@YAPEAXW4function_id@?A0x63058377@@QEBDQEBW4module_id@2@2@Z 000000018003aacc     libucrt:winapi_thunks.obj
- 0002:00012acc       $unwind$?IsInExceptionSpec@@YAEPEAUEHExceptionRecord@@PEBU_s_ESTypeList@@@Z 000000018003aacc     libvcruntime:frame.obj
- 0002:00012acc       $unwind$?try_get_function@@YAPEAXW4function_id@?A0x679b24ab@@QEBDQEBW4module_id@2@2@Z 000000018003aacc     libvcruntime:winapi_downlevel.obj
- 0002:00012ae8       $unwind$??$?RV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@V<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@$$QEAV<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@Z 000000018003aae8     libucrt:winapi_thunks.obj
- 0002:00012b10       $unwind$_mbstowcs_s_l      000000018003ab10     libucrt:mbstowcs.obj
- 0002:00012b28       $unwind$?_mbstowcs_l_helper@@YA_KPEA_WPEBD_KPEAU__crt_locale_pointers@@@Z 000000018003ab28     libucrt:mbstowcs.obj
- 0002:00012b44       $unwind$?_wcstombs_l_helper@@YA_KPEADPEB_W_KPEAU__crt_locale_pointers@@@Z 000000018003ab44     libucrt:wcstombs.obj
- 0002:00012b64       $unwind$_isctype_l         000000018003ab64     libucrt:isctype.obj
- 0002:00012b80       $unwind$__acrt_GetLocaleInfoA 000000018003ab80     libucrt:getlocaleinfoa.obj
- 0002:00012ba0       $unwind$?InternalGetLocaleInfoA@@YAHQEAU__crt_locale_pointers@@QEB_WKQEADH@Z 000000018003aba0     libucrt:getlocaleinfoa.obj
- 0002:00012bc8       $unwind$__acrt_GetStringTypeA 000000018003abc8     libucrt:getstringtypea.obj
- 0002:00012bf0       $unwind$__acrt_LCMapStringA 000000018003abf0     libucrt:lcmapstringa.obj
- 0002:00012c00       $unwind$?__acrt_LCMapStringA_stat@@YAHPEAU__crt_locale_pointers@@PEB_WKPEBDHPEADHHH@Z 000000018003ac00     libucrt:lcmapstringa.obj
- 0002:00012c28       $unwind$__acrt_is_packaged_app 000000018003ac28     libucrt:winapi_thunks.obj
- 0002:00012c28       $unwind$iswctype           000000018003ac28     libucrt:iswctype.obj
- 0002:00012c34       $unwind$__acrt_initialize_fma3 000000018003ac34     libucrt:fma3_available.obj
- 0002:00012c3c       $unwind$_powf_special      000000018003ac3c     libucrt:pow_special.obj
- 0002:00012c4c       $unwind$_pow_special       000000018003ac4c     libucrt:pow_special.obj
- 0002:00012c58       $unwind$?__SehTransFilter@@YAHPEAU_EXCEPTION_POINTERS@@PEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@PEAH@Z 000000018003ac58     libvcruntime:trnsctrl.obj
- 0002:00012c58       $unwind$_wcsicmp_l         000000018003ac58     libucrt:wcsicmp.obj
- 0002:00012c6c       $unwind$isupper            000000018003ac6c     libucrt:_ctype.obj
- 0002:00012c6c       $unwind$_isleadbyte_l      000000018003ac6c     libucrt:_wctype.obj
- 0002:00012c6c       $unwind$isdigit            000000018003ac6c     libucrt:_ctype.obj
- 0002:00012c6c       $unwind$islower            000000018003ac6c     libucrt:_ctype.obj
- 0002:00012c6c       $unwind$?getSystemCP@@YAHH@Z 000000018003ac6c     libucrt:mbctype.obj
- 0002:00012c74       $unwind$??$common_expand_argv_wildcards@D@@YAHQEAPEADQEAPEAPEAD@Z 000000018003ac74     libucrt:argv_wildcards.obj
- 0002:00012c8c       $unwind$??$expand_argument_wildcards@D@@YAHQEAD0AEAV?$argument_list@D@?A0xca0879c4@@@Z 000000018003ac8c     libucrt:argv_wildcards.obj
- 0002:00012cac       $unwind$__acrt_update_thread_multibyte_data 000000018003acac     libucrt:mbctype.obj
- 0002:00012cd0       $unwind$_setmbcp_nolock    000000018003acd0     libucrt:mbctype.obj
- 0002:00012cf0       $unwind$?setSBUpLow@@YAXPEAU__crt_multibyte_data@@@Z 000000018003acf0     libucrt:mbctype.obj
- 0002:00012d0c       $unwind$?setmbcp_internal@@YAHH_N@Z 000000018003ad0c     libucrt:mbctype.obj
- 0002:00012d1c       $unwind$??$?RV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@V<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@$$QEAV<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@Z 000000018003ad1c     libucrt:mbctype.obj
- 0002:00012d40       $unwind$__dcrt_get_narrow_environment_from_os 000000018003ad40     libucrt:get_environment_from_os.obj
- 0002:00012d40       $unwind$?fp_format_f_internal@@YAHQEAD_KHQEAU_strflt@@_NQEAU__crt_locale_pointers@@@Z 000000018003ad40     libucrt:cvt.obj
- 0002:00012d40       $unwind$_wcsnicmp_l        000000018003ad40     libucrt:wcsnicmp.obj
- 0002:00012d58       $unwind$__acrt_update_thread_locale_data 000000018003ad58     libucrt:locale_refcounting.obj
- 0002:00012d7c       $unwind$__acrt_fltout      000000018003ad7c     libucrt:cfout.obj
- 0002:00012d9c       $unwind$_fcloseall         000000018003ad9c     libucrt:closeall.obj
- 0002:00012dc0       $unwind$common_flush_all   000000018003adc0     libucrt:fflush.obj
- 0002:00012dfc       $unwind$__acrt_locale_initialize_monetary 000000018003adfc     libucrt:initmon.obj
- 0002:00012e18       $unwind$__acrt_locale_free_monetary 000000018003ae18     libucrt:initmon.obj
- 0002:00012e20       $unwind$__acrt_locale_free_time 000000018003ae20     libucrt:inittime.obj
- 0002:00012e30       $unwind$?initialize_lc_time@@YA_NQEAU__crt_lc_time_data@@QEAU__crt_locale_data@@@Z 000000018003ae30     libucrt:inittime.obj
- 0002:00012e4c       $unwind$__acrt_get_qualified_locale 000000018003ae4c     libucrt:get_qualified_locale.obj
- 0002:00012e4c       $unwind$??$copy_and_add_argument_to_buffer@D@@YAHQEBD0_KAEAV?$argument_list@D@?A0xca0879c4@@@Z 000000018003ae4c     libucrt:argv_wildcards.obj
- 0002:00012e68       $unwind$?write_string@?$string_output_adapter@D@__crt_stdio_output@@QEBAXQEBDHQEAH1@Z 000000018003ae68     libucrt:output.obj
- 0002:00012e68       $unwind$??$parse_command_line@D@@YAXPEADPEAPEAD0PEA_K2@Z 000000018003ae68     libucrt:argv_parsing.obj
- 0002:00012e68       $unwind$TranslateName      000000018003ae68     libucrt:get_qualified_locale.obj
- 0002:00012e68       $unwind$??R<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@QEBAHXZ 000000018003ae68     libucrt:onexit.obj
- 0002:00012e68       $unwind$?_GetRangeOfTrysToCheck@@YAPEBU_s_TryBlockMapEntry@@PEA_KPEBU_s_FuncInfo@@HHPEAI2PEAU_xDISPATCHER_CONTEXT@@@Z 000000018003ae68     libvcruntime:trnsctrl.obj
- 0002:00012e84       $unwind$LangCountryEnumProcEx 000000018003ae84     libucrt:get_qualified_locale.obj
- 0002:00012ea4       $unwind$LanguageEnumProcEx 000000018003aea4     libucrt:get_qualified_locale.obj
- 0002:00012ec0       $unwind$GetLocaleNameFromDefault 000000018003aec0     libucrt:get_qualified_locale.obj
- 0002:00012ed8       $unwind$TestDefaultCountry 000000018003aed8     libucrt:get_qualified_locale.obj
- 0002:00012eec       $unwind$__acrt_get_qualified_locale_downlevel 000000018003aeec     libucrt:getqloc_downlevel.obj
- 0002:00012f08       $unwind$LangCountryEnumProc 000000018003af08     libucrt:getqloc_downlevel.obj
- 0002:00012f28       $unwind$LanguageEnumProc   000000018003af28     libucrt:getqloc_downlevel.obj
- 0002:00012f44       $unwind$CountryEnumProc    000000018003af44     libucrt:getqloc_downlevel.obj
- 0002:00012f64       $unwind$__acrt_lowio_destroy_handle_array 000000018003af64     libucrt:osfinfo.obj
- 0002:00012f74       $unwind$__acrt_lowio_ensure_fh_exists 000000018003af74     libucrt:osfinfo.obj
- 0002:00012fa0       $xdatasym                  000000018003afa0     libucrt:fpsr.obj
- 0002:00012fa8       $unwind$?GetTableIndexFromLocaleName@@YAHPEB_W@Z 000000018003afa8     libucrt:lcidtoname_downlevel.obj
- 0002:00012fc0       $unwind$_call_matherr      000000018003afc0     libucrt:libm_error.obj
- 0002:00012fc8       $unwind$_handle_errorf     000000018003afc8     libucrt:libm_error.obj
- 0002:00012fc8       $unwind$_handle_error      000000018003afc8     libucrt:libm_error.obj
- 0002:00012fe8       $unwind$_towlower_l        000000018003afe8     libucrt:towlower.obj
- 0002:00012ff0       $unwind$qsort              000000018003aff0     libucrt:qsort.obj
- 0002:00013008       $chain$4$qsort             000000018003b008     libucrt:qsort.obj
- 0002:0001302c       $chain$5$qsort             000000018003b02c     libucrt:qsort.obj
- 0002:0001303c       $unwind$?shortsort@@YAXPEAD0_KP6AHPEBX2@Z@Z 000000018003b03c     libucrt:qsort.obj
- 0002:0001304c       $chain$2$?shortsort@@YAXPEAD0_KP6AHPEBX2@Z@Z 000000018003b04c     libucrt:qsort.obj
- 0002:00013068       $chain$3$?shortsort@@YAXPEAD0_KP6AHPEBX2@Z@Z 000000018003b068     libucrt:qsort.obj
- 0002:00013078       $unwind$strcspn            000000018003b078     libucrt:strcspn.obj
- 0002:00013078       $unwind$strpbrk            000000018003b078     libucrt:strpbrk.obj
- 0002:00013088       $unwind$_mbsdec_l          000000018003b088     libucrt:mbsdec.obj
- 0002:00013098       $xdatasym                  000000018003b098     libucrt:log10.obj
- 0002:000130a4       $unwind$_write             000000018003b0a4     libucrt:write.obj
- 0002:000130d4       $unwind$_write_nolock      000000018003b0d4     libucrt:write.obj
- 0002:000130ec       $unwind$?write_double_translated_ansi_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 000000018003b0ec     libucrt:write.obj
- 0002:0001310c       $unwind$?write_text_ansi_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 000000018003b10c     libucrt:write.obj
- 0002:0001310c       $unwind$?write_text_utf16le_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 000000018003b10c     libucrt:write.obj
- 0002:0001312c       $unwind$?write_text_utf8_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 000000018003b12c     libucrt:write.obj
- 0002:00013150       $unwind$fclose             000000018003b150     libucrt:fclose.obj
- 0002:00013174       $unwind$_commit            000000018003b174     libucrt:commit.obj
- 0002:00013174       $unwind$_close             000000018003b174     libucrt:close.obj
- 0002:0001317c       $unwind$??$?RV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@V<lambda_314360699dd331753a4119843814e9a7>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@$$QEAV<lambda_314360699dd331753a4119843814e9a7>@@@Z 000000018003b17c     libucrt:commit.obj
- 0002:000131a0       $unwind$common_control87   000000018003b1a0     libucrt:ieee.obj
- 0002:000131d0       $unwind$_log_special_common 000000018003b1d0     libucrt:log_special.obj
- 0002:000131dc       $unwind$??$?RV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@V<lambda_237c231691f317818eb88cc1d5d642d6>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@$$QEAV<lambda_237c231691f317818eb88cc1d5d642d6>@@@Z 000000018003b1dc     libucrt:close.obj
- 0002:00013200       $unwind$?DloadObtainSection@@YAPEAXPEAK0@Z 000000018003b200     DelayImp:delayhlp.obj
- 0002:00013210       $unwind$?DloadMakePermanentImageCommit@@YAXPEAX_K@Z 000000018003b210     DelayImp:delayhlp.obj
- 0002:0001321c       $unwind$?DloadProtectSection@@YAXKPEAK@Z 000000018003b21c     DelayImp:delayhlp.obj
- 0002:0001322c       $unwind$__delayLoadHelper2 000000018003b22c     DelayImp:delayhlp.obj
- 0002:00013244       $unwind$_IsNonwritableInCurrentImage 000000018003b244     LIBCMT:pesect.obj
- 0002:00013268       $unwind$wcschr             000000018003b268     libvcruntime:wcschr.obj
- 0002:00013268       $unwind$strrchr            000000018003b268     libvcruntime:strrchr.obj
- 0002:00013cf0       .edata                     000000018003bcf0     node_printer.exp
- 0002:00013d18       rgpv                       000000018003bd18     node_printer.exp
- 0002:00013d1c       rgszName                   000000018003bd1c     node_printer.exp
- 0002:00013d20       rgwOrd                     000000018003bd20     node_printer.exp
- 0002:00013d22       szName                     000000018003bd22     node_printer.exp
- 0002:00013d34       $N00001                    000000018003bd34     node_printer.exp
- 0002:000140f2       .idata$6                   000000018003c0f2     kernel32:KERNEL32.dll
- 0002:000141f0       .idata$6                   000000018003c1f0     winspool:WINSPOOL.DRV
- 0003:00000000       ?init@std@@3JA             000000018003d000     libcpmt:xlock.obj
- 0003:00000010       ?atcount_cdecl@@3_KA       000000018003d010     libcpmt:iosptrs.obj
- 0003:000000b0       ?__vcrt_flsindex@@3KA      000000018003d0b0     libvcruntime:per_thread_data.obj
- 0003:00000188       errno_no_memory            000000018003d188     libucrt:errno.obj
- 0003:0000018c       doserrno_no_memory         000000018003d18c     libucrt:errno.obj
- 0003:00000190       __acrt_flsindex            000000018003d190     libucrt:per_thread_data.obj
- 0003:000002a8       _ctype_loc_style           000000018003d2a8     libucrt:wsetlocale.obj
- 0003:00000420       ?dazSupported@?1??_ctrlfp@@9@9 000000018003d420     libucrt:fpctrl.obj
- 0003:00000430       tzstd_program              000000018003d430     libucrt:timeset.obj
- 0003:00000470       tzdst_program              000000018003d470     libucrt:timeset.obj
- 0003:000004b0       tzname_states              000000018003d4b0     libucrt:timeset.obj
- 0003:000006f0       __rgctypeflag              000000018003d6f0     libucrt:mbctype.obj
- 0003:00000700       __rgcode_page_info         000000018003d700     libucrt:mbctype.obj
- 0003:00000a00       ?dazSupported@?1??common_control87@@9@9 000000018003da00     libucrt:ieee.obj
- 0003:00000a20       _module                    000000018003da20     node_printer.obj
- 0003:00000e40       ?initlocks@std@@3V_Init_locks@1@A 000000018003de40     libcpmt:xlock.obj
- 0003:00000e50       ?mtx@std@@3PAU_RTL_CRITICAL_SECTION@@A 000000018003de50     libcpmt:xlock.obj
- 0003:00000f90       ?_Fac_head@std@@3PEAU_Fac_node@1@EA 000000018003df90     libcpmt:locale0.obj
- 0003:00000fa8       global_locale              000000018003dfa8     libcpmt:locale0.obj
- 0003:00000fd0       ?classic_locale@std@@3Vlocale@1@A 000000018003dfd0     libcpmt:locale0.obj
- 0003:00000fe8       ?_Fac_tidy_reg@std@@3U_Fac_tidy_reg_t@1@B 000000018003dfe8     libcpmt:locale0.obj
- 0003:00000fe9       ?registered@?1??_Setgloballocale@locale@std@@CAXPEAX@Z@4_NA 000000018003dfe9     libcpmt:locale0.obj
- 0003:00000ff0       ?stdstr@std@@3PAPEAVios_base@1@A 000000018003dff0     libcpmt:ios.obj
- 0003:00001040       ?stdopens@std@@3PADA       000000018003e040     libcpmt:ios.obj
- 0003:000010a0       ?atfuns_cdecl@@3PAP6AXXZA  000000018003e0a0     libcpmt:iosptrs.obj
- 0003:000010f0       ?initlocks@std@@3V_Init_locks@1@A 000000018003e0f0     libcpmt:iosptrs.obj
- 0003:000010f1       ?init_atexit@@3U_Init_atexit@@A 000000018003e0f1     libcpmt:iosptrs.obj
- 0003:00001340       ?_Tss_mutex@@3U_RTL_CRITICAL_SECTION@@A 000000018003e340     LIBCMT:thread_safe_statics.obj
- 0003:00001368       ?_Tss_cv@@3U_RTL_CONDITION_VARIABLE@@A 000000018003e368     LIBCMT:thread_safe_statics.obj
- 0003:00001370       ?_Tss_event@@3PEAXEA       000000018003e370     LIBCMT:thread_safe_statics.obj
- 0003:00001378       ?encoded_sleep_condition_variable_cs@@3P6AHPEAU_RTL_CONDITION_VARIABLE@@PEAU_RTL_CRITICAL_SECTION@@K@ZEA 000000018003e378     LIBCMT:thread_safe_statics.obj
- 0003:00001380       ?encoded_wake_all_condition_variable@@3P6AXPEAU_RTL_CONDITION_VARIABLE@@@ZEA 000000018003e380     LIBCMT:thread_safe_statics.obj
- 0003:00001398       ?module_local_atexit_table@@3U_onexit_table_t@@A 000000018003e398     LIBCMT:utility.obj
- 0003:000013b0       ?module_local_at_quick_exit_table@@3U_onexit_table_t@@A 000000018003e3b0     LIBCMT:utility.obj
- 0003:000013c8       ?is_initialized_as_dll@@3_NA 000000018003e3c8     LIBCMT:utility.obj
- 0003:000013cc       ?__proc_attached@@3HA      000000018003e3cc     LIBCMT:dll_dllmain.obj
- 0003:000013d0       GS_ExceptionRecord         000000018003e3d0     LIBCMT:gs_report.obj
- 0003:00001470       GS_ContextRecord           000000018003e470     LIBCMT:gs_report.obj
- 0003:00001970       ?module_handles@@3PAPEAUHINSTANCE__@@A 000000018003e970     libvcruntime:winapi_downlevel.obj
- 0003:00001990       ?encoded_function_pointers@@3PAPEAXA 000000018003e990     libvcruntime:winapi_downlevel.obj
- 0003:000019e0       ?__vcrt_startup_thread_ptd@@3U__vcrt_ptd@@A 000000018003e9e0     libvcruntime:per_thread_data.obj
- 0003:00001a58       __vcrt_lock_table          000000018003ea58     libvcruntime:locks.obj
- 0003:00001a80       __vcrt_locks_initialized   000000018003ea80     libvcruntime:locks.obj
- 0003:00001ad0       ?heap@@3V_HeapManager@@A   000000018003ead0     libvcruntime:undname.obj
- 0003:00001af8       __acrt_invalid_parameter_handler 000000018003eaf8     libucrt:invalid_parameter.obj
- 0003:00001b10       __acrt_lock_table          000000018003eb10     libucrt:locks.obj
- 0003:00001d18       __acrt_locks_initialized   000000018003ed18     libucrt:locks.obj
- 0003:00001d20       __acrt_new_handler         000000018003ed20     libucrt:new_handler.obj
- 0003:00001d28       c_termination_complete     000000018003ed28     libucrt:exit.obj
- 0003:00001d30       thread_local_exit_callback_func 000000018003ed30     libucrt:exit.obj
- 0003:00001d38       ?c_exit_complete@?5??common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z@4_NA 000000018003ed38     libucrt:exit.obj
- 0003:00001d40       ?program_name@?5???$common_configure_argv@D@@YAHW4_crt_argv_mode@@@Z@4PADA 000000018003ed40     libucrt:argv_parsing.obj
- 0003:00001e98       ctrlc_action               000000018003ee98     libucrt:signal.obj
- 0003:00001ea0       ctrlbreak_action           000000018003eea0     libucrt:signal.obj
- 0003:00001ea8       abort_action               000000018003eea8     libucrt:signal.obj
- 0003:00001eb0       term_action                000000018003eeb0     libucrt:signal.obj
- 0003:00001ec8       enable_percent_n           000000018003eec8     libucrt:printf_count_output.obj
- 0003:00002300       module_handles             000000018003f300     libucrt:winapi_thunks.obj
- 0003:000023a0       encoded_function_pointers  000000018003f3a0     libucrt:winapi_thunks.obj
- 0003:000024a0       ?static_enum_proc@?1??enum_system_locales_ex_nolock@@YAHQ6AHPEA_WK_J@Z@Z@4P6AH0K1@ZEA 000000018003f4a0     libucrt:winapi_thunks.obj
- 0003:000024a8       ?state_cache@?1??__acrt_is_packaged_app@@9@4JA 000000018003f4a8     libucrt:winapi_thunks.obj
- 0003:000024ac       __acrt_global_new_mode     000000018003f4ac     libucrt:new_mode.obj
- 0003:000024d0       _tzname                    000000018003f4d0     libucrt:timeset.obj
- 0003:000024e0       tz_api_used                000000018003f4e0     libucrt:tzset.obj
- 0003:000024f0       tz_info                    000000018003f4f0     libucrt:tzset.obj
- 0003:000025b4       fSystemSet                 000000018003f5b4     libucrt:mbctype.obj
- 0003:000025c0       ?initialized@?1??__acrt_initialize_multibyte@@9@4_NA 000000018003f5c0     libucrt:mbctype.obj
- 0003:000025f0       user_matherr               000000018003f5f0     libucrt:matherr.obj
- 0003:000025f8       __acrt_app_type            000000018003f5f8     libucrt:report_runtime_error.obj
- 0003:00002648       ?result@?1??getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@4V34@A 000000018003f648     node_printer_win.obj
- 0003:00002658       ?result@?1??getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@4V34@A 000000018003f658     node_printer_win.obj
- 0003:00002668       ?$TSS0@?1??getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@4HA 000000018003f668     node_printer_win.obj
- 0003:00002678       ?$TSS0@?1??getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@4HA 000000018003f678     node_printer_win.obj
- 0003:0000267c       ?$TSS0@?1??getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@4HA 000000018003f67c     node_printer_win.obj
- 0003:00002690       ?$TSS0@?1??getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@4HA 000000018003f690     node_printer_win.obj
- 0003:00002698       ?result@?1??getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@4V34@A 000000018003f698     node_printer_win.obj
- 0003:000026b8       ?result@?1??getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@4V34@A 000000018003f6b8     node_printer_win.obj
- 0004:00000000       $pdata$??__Einitlocks@std@@YAXXZ 0000000180040000     libcpmt:xlock.obj
- 0004:0000000c       $pdata$??__Einitlocks@std@@YAXXZ 000000018004000c     libcpmt:iosptrs.obj
- 0004:00000018       $pdata$?NODE_SET_METHOD@node@@YAXV?$Local@VObject@v8@@@v8@@PEBDP6AXAEBV?$FunctionCallbackInfo@VValue@v8@@@3@@Z@Z 0000000180040018     node_printer.obj
- 0004:00000024       $pdata$?initNode@@YAXV?$Local@VObject@v8@@@v8@@@Z 0000000180040024     node_printer.obj
- 0004:00000030       $pdata$?getStringOrBufferFromV8Value@@YA_NV?$Local@VValue@v8@@@v8@@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z 0000000180040030     node_printer.obj
- 0004:0000003c       $pdata$0$?getStringOrBufferFromV8Value@@YA_NV?$Local@VValue@v8@@@v8@@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z 000000018004003c     node_printer.obj
- 0004:00000048       $pdata$1$?getStringOrBufferFromV8Value@@YA_NV?$Local@VValue@v8@@@v8@@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z 0000000180040048     node_printer.obj
- 0004:00000054       $pdata$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 0000000180040054     node_printer.obj
- 0004:00000060       $pdata$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 0000000180040060     node_printer.obj
- 0004:0000006c       $pdata$?_Copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX_K0@Z 000000018004006c     node_printer.obj
- 0004:00000078       $pdata$?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0@Z 0000000180040078     node_printer.obj
- 0004:00000084       $pdata$?deallocate@?$allocator@D@std@@QEAAXPEAD_K@Z 0000000180040084     node_printer.obj
- 0004:00000090       $pdata$?allocate@?$allocator@D@std@@QEAAPEAD_K@Z 0000000180040090     node_printer.obj
- 0004:0000009c       $pdata$sprintf_s           000000018004009c     node_printer_win.obj
- 0004:000000a8       $pdata$??_Gexception@stdext@@UEAAPEAXI@Z 00000001800400a8     node_printer_win.obj
- 0004:000000a8       $pdata$??_Gruntime_error@std@@UEAAPEAXI@Z 00000001800400a8     node_printer_win.obj
- 0004:000000b4       $pdata$?_Doraise@runtime_error@std@@MEBAXXZ 00000001800400b4     node_printer_win.obj
- 0004:000000b4       $pdata$?_Doraise@failure@ios_base@std@@MEBAXXZ 00000001800400b4     node_printer_win.obj
- 0004:000000c0       $pdata$??0_Locinfo@std@@QEAA@PEBD@Z 00000001800400c0     node_printer_win.obj
- 0004:000000cc       $pdata$??1_Locinfo@std@@QEAA@XZ 00000001800400cc     node_printer_win.obj
- 0004:000000d8       $pdata$??_G_Facet_base@std@@UEAAPEAXI@Z 00000001800400d8     node_printer_win.obj
- 0004:000000e4       $pdata$?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 00000001800400e4     node_printer_win.obj
- 0004:000000f0       $pdata$0$?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 00000001800400f0     node_printer_win.obj
- 0004:000000fc       $pdata$1$?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 00000001800400fc     node_printer_win.obj
- 0004:00000108       $pdata$?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180040108     node_printer_win.obj
- 0004:00000114       $pdata$0$?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180040114     node_printer_win.obj
- 0004:00000120       $pdata$1$?do_tolower@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180040120     node_printer_win.obj
- 0004:0000012c       $pdata$?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 000000018004012c     node_printer_win.obj
- 0004:00000138       $pdata$0$?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180040138     node_printer_win.obj
- 0004:00000144       $pdata$1$?do_toupper@?$ctype@D@std@@MEBAPEBDPEADPEBD@Z 0000000180040144     node_printer_win.obj
- 0004:00000150       $pdata$?do_widen@?$ctype@D@std@@MEBAPEBDPEBD0PEAD@Z 0000000180040150     node_printer_win.obj
- 0004:0000015c       $pdata$?do_narrow@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD@Z 000000018004015c     node_printer_win.obj
- 0004:00000168       $pdata$??_G?$ctype@D@std@@MEAAPEAXI@Z 0000000180040168     node_printer_win.obj
- 0004:00000174       $pdata$??_Gerror_category@std@@UEAAPEAXI@Z 0000000180040174     node_printer_win.obj
- 0004:00000174       $pdata$??_G_Iostream_error_category@std@@UEAAPEAXI@Z 0000000180040174     node_printer_win.obj
- 0004:00000180       $pdata$??0_System_error@std@@IEAA@Verror_code@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z 0000000180040180     node_printer_win.obj
- 0004:0000018c       $pdata$??_G_System_error@std@@UEAAPEAXI@Z 000000018004018c     node_printer_win.obj
- 0004:0000018c       $pdata$??_Gfailure@ios_base@std@@UEAAPEAXI@Z 000000018004018c     node_printer_win.obj
- 0004:00000198       $pdata$?message@_Iostream_error_category@std@@UEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@H@Z 0000000180040198     node_printer_win.obj
- 0004:000001a4       $pdata$?clear@ios_base@std@@QEAAXH_N@Z 00000001800401a4     node_printer_win.obj
- 0004:000001b0       $pdata$0$?clear@ios_base@std@@QEAAXH_N@Z 00000001800401b0     node_printer_win.obj
- 0004:000001bc       $pdata$1$?clear@ios_base@std@@QEAAXH_N@Z 00000001800401bc     node_printer_win.obj
- 0004:000001c8       $pdata$2$?clear@ios_base@std@@QEAAXH_N@Z 00000001800401c8     node_printer_win.obj
- 0004:000001d4       $pdata$??_Gios_base@std@@UEAAPEAXI@Z 00000001800401d4     node_printer_win.obj
- 0004:000001e0       $pdata$?getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 00000001800401e0     node_printer_win.obj
- 0004:000001ec       $pdata$2$?getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 00000001800401ec     node_printer_win.obj
- 0004:000001f8       $pdata$3$?getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 00000001800401f8     node_printer_win.obj
- 0004:00000204       $pdata$?getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180040204     node_printer_win.obj
- 0004:00000210       $pdata$2$?getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180040210     node_printer_win.obj
- 0004:0000021c       $pdata$3$?getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 000000018004021c     node_printer_win.obj
- 0004:00000228       $pdata$?getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180040228     node_printer_win.obj
- 0004:00000234       $pdata$2$?getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180040234     node_printer_win.obj
- 0004:00000240       $pdata$3$?getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180040240     node_printer_win.obj
- 0004:0000024c       $pdata$?getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 000000018004024c     node_printer_win.obj
- 0004:00000258       $pdata$2$?getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180040258     node_printer_win.obj
- 0004:00000264       $pdata$3$?getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ 0000000180040264     node_printer_win.obj
- 0004:00000270       $pdata$?parseJobObject@?A0xcb87c0d3@@YAXPEAU_JOB_INFO_2W@@V?$Local@VObject@v8@@@v8@@@Z 0000000180040270     node_printer_win.obj
- 0004:0000027c       $pdata$?getLastErrorCodeAndMessage@?A0xcb87c0d3@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ 000000018004027c     node_printer_win.obj
- 0004:00000288       $pdata$?retrieveAndParseJobs@?A0xcb87c0d3@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEA_WAEBKV?$Local@VObject@v8@@@v8@@AEAUPrinterHandle@1@@Z 0000000180040288     node_printer_win.obj
- 0004:00000294       $pdata$?parsePrinterInfo@?A0xcb87c0d3@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEBU_PRINTER_INFO_2W@@V?$Local@VObject@v8@@@v8@@AEAUPrinterHandle@1@@Z 0000000180040294     node_printer_win.obj
- 0004:000002a0       $pdata$?getPrinters@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800402a0     node_printer_win.obj
- 0004:000002ac       $pdata$?getDefaultPrinterName@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800402ac     node_printer_win.obj
- 0004:000002b8       $pdata$0$?getDefaultPrinterName@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800402b8     node_printer_win.obj
- 0004:000002c4       $pdata$1$?getDefaultPrinterName@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800402c4     node_printer_win.obj
- 0004:000002d0       $pdata$?getPrinter@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800402d0     node_printer_win.obj
- 0004:000002dc       $pdata$0$?getPrinter@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800402dc     node_printer_win.obj
- 0004:000002e8       $pdata$1$?getPrinter@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800402e8     node_printer_win.obj
- 0004:000002f4       $pdata$?getPrinterDriverOptions@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800402f4     node_printer_win.obj
- 0004:00000300       $pdata$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180040300     node_printer_win.obj
- 0004:0000030c       $pdata$0$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 000000018004030c     node_printer_win.obj
- 0004:00000318       $pdata$1$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180040318     node_printer_win.obj
- 0004:00000324       $pdata$2$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180040324     node_printer_win.obj
- 0004:00000330       $pdata$3$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180040330     node_printer_win.obj
- 0004:0000033c       $pdata$4$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 000000018004033c     node_printer_win.obj
- 0004:00000348       $pdata$5$?getJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180040348     node_printer_win.obj
- 0004:00000354       $pdata$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180040354     node_printer_win.obj
- 0004:00000360       $pdata$1$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180040360     node_printer_win.obj
- 0004:0000036c       $pdata$2$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 000000018004036c     node_printer_win.obj
- 0004:00000378       $pdata$4$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180040378     node_printer_win.obj
- 0004:00000384       $pdata$5$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180040384     node_printer_win.obj
- 0004:00000390       $pdata$6$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 0000000180040390     node_printer_win.obj
- 0004:0000039c       $pdata$7$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 000000018004039c     node_printer_win.obj
- 0004:000003a8       $pdata$8$?setJob@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800403a8     node_printer_win.obj
- 0004:000003b4       $pdata$?getSupportedJobCommands@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800403b4     node_printer_win.obj
- 0004:000003c0       $pdata$?getSupportedPrintFormats@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800403c0     node_printer_win.obj
- 0004:000003cc       $pdata$?PrintDirect@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800403cc     node_printer_win.obj
- 0004:000003d8       $pdata$1$?PrintDirect@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800403d8     node_printer_win.obj
- 0004:000003e4       $pdata$2$?PrintDirect@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800403e4     node_printer_win.obj
- 0004:000003f0       $pdata$?PrintFile@@YAXAEBV?$FunctionCallbackInfo@VValue@v8@@@v8@@@Z 00000001800403f0     node_printer_win.obj
- 0004:000003fc       $pdata$??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ 00000001800403fc     node_printer_win.obj
- 0004:00000408       $pdata$??1?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ 0000000180040408     node_printer_win.obj
- 0004:00000414       $pdata$?seekpos@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAA?AV?$fpos@U_Mbstatet@@@2@V32@H@Z 0000000180040414     node_printer_win.obj
- 0004:00000420       $pdata$?seekoff@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAA?AV?$fpos@U_Mbstatet@@@2@_JHH@Z 0000000180040420     node_printer_win.obj
- 0004:0000042c       $pdata$?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z 000000018004042c     node_printer_win.obj
- 0004:00000438       $pdata$0$?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z 0000000180040438     node_printer_win.obj
- 0004:00000444       $pdata$6$?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z 0000000180040444     node_printer_win.obj
- 0004:00000450       $pdata$7$?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z 0000000180040450     node_printer_win.obj
- 0004:0000045c       $pdata$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 000000018004045c     node_printer_win.obj
- 0004:00000468       $pdata$1$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 0000000180040468     node_printer_win.obj
- 0004:00000474       $pdata$3$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 0000000180040474     node_printer_win.obj
- 0004:00000480       $pdata$4$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 0000000180040480     node_printer_win.obj
- 0004:0000048c       $pdata$5$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 000000018004048c     node_printer_win.obj
- 0004:00000498       $pdata$6$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 0000000180040498     node_printer_win.obj
- 0004:000004a4       $pdata$7$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 00000001800404a4     node_printer_win.obj
- 0004:000004b0       $pdata$8$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 00000001800404b0     node_printer_win.obj
- 0004:000004bc       $pdata$9$??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z 00000001800404bc     node_printer_win.obj
- 0004:000004c8       $pdata$?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z 00000001800404c8     node_printer_win.obj
- 0004:000004d4       $pdata$0$?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z 00000001800404d4     node_printer_win.obj
- 0004:000004e0       $pdata$1$?xsputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEBD_J@Z 00000001800404e0     node_printer_win.obj
- 0004:000004ec       $pdata$?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z 00000001800404ec     node_printer_win.obj
- 0004:000004f8       $pdata$1$?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z 00000001800404f8     node_printer_win.obj
- 0004:00000504       $pdata$2$?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z 0000000180040504     node_printer_win.obj
- 0004:00000510       $pdata$3$?xsgetn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_J@Z 0000000180040510     node_printer_win.obj
- 0004:0000051c       $pdata$?uflow@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAAHXZ 000000018004051c     node_printer_win.obj
- 0004:00000528       $pdata$??_G?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAAPEAXI@Z 0000000180040528     node_printer_win.obj
- 0004:00000534       $pdata$??_G?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAAPEAXI@Z 0000000180040534     node_printer_win.obj
- 0004:00000540       $pdata$??_G?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAAPEAXI@Z 0000000180040540     node_printer_win.obj
- 0004:0000054c       $pdata$??_G?$basic_streambuf@DU?$char_traits@D@std@@@std@@UEAAPEAXI@Z 000000018004054c     node_printer_win.obj
- 0004:00000558       $pdata$??_Glocale@std@@QEAAPEAXI@Z 0000000180040558     node_printer_win.obj
- 0004:00000564       $pdata$??0sentry@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@AEAV12@@Z 0000000180040564     node_printer_win.obj
- 0004:00000570       $pdata$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBX@Z 0000000180040570     node_printer_win.obj
- 0004:0000057c       $pdata$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DO@Z 000000018004057c     node_printer_win.obj
- 0004:00000588       $pdata$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DN@Z 0000000180040588     node_printer_win.obj
- 0004:00000594       $pdata$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_K@Z 0000000180040594     node_printer_win.obj
- 0004:000005a0       $pdata$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_J@Z 00000001800405a0     node_printer_win.obj
- 0004:000005ac       $pdata$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DK@Z 00000001800405ac     node_printer_win.obj
- 0004:000005b8       $pdata$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DJ@Z 00000001800405b8     node_printer_win.obj
- 0004:000005c4       $pdata$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 00000001800405c4     node_printer_win.obj
- 0004:000005d0       $pdata$1$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 00000001800405d0     node_printer_win.obj
- 0004:000005dc       $pdata$2$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 00000001800405dc     node_printer_win.obj
- 0004:000005e8       $pdata$3$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 00000001800405e8     node_printer_win.obj
- 0004:000005f4       $pdata$4$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 00000001800405f4     node_printer_win.obj
- 0004:00000600       $pdata$5$?do_put@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@D_N@Z 0000000180040600     node_printer_win.obj
- 0004:0000060c       $pdata$??R?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@QEBA_NAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@0@Z 000000018004060c     node_printer_win.obj
- 0004:00000618       $pdata$?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 0000000180040618     node_printer_win.obj
- 0004:00000624       $pdata$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 0000000180040624     node_printer_win.obj
- 0004:00000630       $pdata$0$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 0000000180040630     node_printer_win.obj
- 0004:0000063c       $pdata$1$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 000000018004063c     node_printer_win.obj
- 0004:00000648       $pdata$2$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z 0000000180040648     node_printer_win.obj
- 0004:00000654       $pdata$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 0000000180040654     node_printer_win.obj
- 0004:00000660       $pdata$0$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 0000000180040660     node_printer_win.obj
- 0004:0000066c       $pdata$1$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 000000018004066c     node_printer_win.obj
- 0004:00000678       $pdata$2$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z 0000000180040678     node_printer_win.obj
- 0004:00000684       $pdata$?_Assign_rv@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX$$QEAV12@@Z 0000000180040684     node_printer_win.obj
- 0004:00000690       $pdata$?_Tidy@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAXXZ 0000000180040690     node_printer_win.obj
- 0004:0000069c       $pdata$?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 000000018004069c     node_printer_win.obj
- 0004:000006a8       $pdata$??_G?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@MEAAPEAXI@Z 00000001800406a8     node_printer_win.obj
- 0004:000006b4       $pdata$?do_truename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 00000001800406b4     node_printer_win.obj
- 0004:000006c0       $pdata$?do_falsename@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 00000001800406c0     node_printer_win.obj
- 0004:000006cc       $pdata$?do_grouping@?$numpunct@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ 00000001800406cc     node_printer_win.obj
- 0004:000006d8       $pdata$?_Iput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEAD_K@Z 00000001800406d8     node_printer_win.obj
- 0004:000006e4       $pdata$?_Fput@?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@AEBA?AV?$ostreambuf_iterator@DU?$char_traits@D@std@@@2@V32@AEAVios_base@2@DPEBD_K@Z 00000001800406e4     node_printer_win.obj
- 0004:000006f0       $pdata$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 00000001800406f0     node_printer_win.obj
- 0004:000006fc       $pdata$0$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 00000001800406fc     node_printer_win.obj
- 0004:00000708       $pdata$1$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 0000000180040708     node_printer_win.obj
- 0004:00000714       $pdata$2$?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z 0000000180040714     node_printer_win.obj
- 0004:00000720       $pdata$?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ 0000000180040720     node_printer_win.obj
- 0004:0000072c       $pdata$1$?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ 000000018004072c     node_printer_win.obj
- 0004:00000738       $pdata$2$?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ 0000000180040738     node_printer_win.obj
- 0004:00000744       $pdata$3$?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ 0000000180040744     node_printer_win.obj
- 0004:00000750       $pdata$4$?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ 0000000180040750     node_printer_win.obj
- 0004:0000075c       $pdata$??0?$basic_streambuf@DU?$char_traits@D@std@@@std@@IEAA@XZ 000000018004075c     node_printer_win.obj
- 0004:00000768       $pdata$?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IEAAXPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z 0000000180040768     node_printer_win.obj
- 0004:00000774       $pdata$??_G?$numpunct@D@std@@MEAAPEAXI@Z 0000000180040774     node_printer_win.obj
- 0004:00000780       $pdata$?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADD@Z 0000000180040780     node_printer_win.obj
- 0004:0000078c       $pdata$?_Erase@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAAXPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@Z 000000018004078c     node_printer_win.obj
- 0004:00000798       $pdata$0$?_Erase@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAAXPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@Z 0000000180040798     node_printer_win.obj
- 0004:000007a4       $pdata$1$?_Erase@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAAXPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@Z 00000001800407a4     node_printer_win.obj
- 0004:000007b0       $pdata$2$?_Erase@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAAXPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@Z 00000001800407b0     node_printer_win.obj
- 0004:000007bc       $pdata$??$use_facet@V?$ctype@D@std@@@std@@YAAEBV?$ctype@D@0@AEBVlocale@0@@Z 00000001800407bc     node_printer_win.obj
- 0004:000007c8       $pdata$??$_Immortalize@V_Iostream_error_category@std@@@std@@YAAEAV_Iostream_error_category@0@XZ 00000001800407c8     node_printer_win.obj
- 0004:000007d4       $pdata$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 00000001800407d4     node_printer_win.obj
- 0004:000007e0       $pdata$3$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 00000001800407e0     node_printer_win.obj
- 0004:000007ec       $pdata$4$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 00000001800407ec     node_printer_win.obj
- 0004:000007f8       $pdata$5$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 00000001800407f8     node_printer_win.obj
- 0004:00000804       $pdata$6$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 0000000180040804     node_printer_win.obj
- 0004:00000810       $pdata$7$??$?6U?$char_traits@D@std@@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@PEBD@Z 0000000180040810     node_printer_win.obj
- 0004:0000081c       $pdata$??$?6DU?$char_traits@D@std@@V?$allocator@D@1@@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@0@AEAV10@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@0@@Z 000000018004081c     node_printer_win.obj
- 0004:00000828       $pdata$??$use_facet@V?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@std@@@std@@YAAEBV?$num_put@DV?$ostreambuf_iterator@DU?$char_traits@D@std@@@std@@@0@AEBVlocale@0@@Z 0000000180040828     node_printer_win.obj
- 0004:00000834       $pdata$??$use_facet@V?$numpunct@D@std@@@std@@YAAEBV?$numpunct@D@0@AEBVlocale@0@@Z 0000000180040834     node_printer_win.obj
- 0004:00000840       $pdata$?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 0000000180040840     node_printer_win.obj
- 0004:0000084c       $pdata$0$?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 000000018004084c     node_printer_win.obj
- 0004:00000858       $pdata$1$?_Getcat@?$numpunct@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z 0000000180040858     node_printer_win.obj
- 0004:00000864       $pdata$?_Init@?$numpunct@D@std@@IEAAXAEBV_Locinfo@2@_N@Z 0000000180040864     node_printer_win.obj
- 0004:00000870       $pdata$??$emplace@U?$pair@PEBDH@std@@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@QEAA?AU?$pair@V?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@std@@_N@1@$$QEAU?$pair@PEBDH@1@@Z 0000000180040870     node_printer_win.obj
- 0004:0000087c       $pdata$??$_Insert_nohint@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@V?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@std@@_N@1@_NAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@1@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@1@@Z 000000018004087c     node_printer_win.obj
- 0004:00000888       $pdata$1$??$_Insert_nohint@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@V?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@std@@_N@1@_NAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@1@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@1@@Z 0000000180040888     node_printer_win.obj
- 0004:00000894       $pdata$2$??$_Insert_nohint@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAA?AU?$pair@V?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@std@@_N@1@_NAEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@1@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@1@@Z 0000000180040894     node_printer_win.obj
- 0004:000008a0       $pdata$??$_Insert_at@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@2@@?$_Tree@V?$_Tmap_traits@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@$0A@@std@@@std@@IEAA?AV?$_Tree_iterator@V?$_Tree_val@U?$_Tree_simple_types@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@std@@@std@@@1@_NPEAU?$_Tree_node@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@PEAX@1@AEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@1@1@Z 00000001800408a0     node_printer_win.obj
- 0004:000008ac       $pdata$?load_exe_hook@@YAP6A_JXZIPEAUDelayLoadInfo@@@Z 00000001800408ac     win_delay_load_hook.obj
- 0004:000008c4       $pdata$??0bad_alloc@std@@QEAA@AEBV01@@Z 00000001800408c4     libcpmt:xthrow.obj
- 0004:000008d0       $pdata$??0exception@std@@QEAA@AEBV01@@Z 00000001800408d0     libcpmt:xthrow.obj
- 0004:000008dc       $pdata$??0length_error@std@@QEAA@AEBV01@@Z 00000001800408dc     libcpmt:xthrow.obj
- 0004:000008e8       $pdata$??0length_error@std@@QEAA@PEBD@Z 00000001800408e8     libcpmt:xthrow.obj
- 0004:000008f4       $pdata$??0logic_error@std@@QEAA@AEBV01@@Z 00000001800408f4     libcpmt:xthrow.obj
- 0004:00000900       $pdata$??0out_of_range@std@@QEAA@AEBV01@@Z 0000000180040900     libcpmt:xthrow.obj
- 0004:0000090c       $pdata$??0out_of_range@std@@QEAA@PEBD@Z 000000018004090c     libcpmt:xthrow.obj
- 0004:00000918       $pdata$??_Glogic_error@std@@UEAAPEAXI@Z 0000000180040918     libcpmt:xthrow.obj
- 0004:00000918       $pdata$??_Gout_of_range@std@@UEAAPEAXI@Z 0000000180040918     libcpmt:xthrow.obj
- 0004:00000918       $pdata$??_Gexception@std@@UEAAPEAXI@Z 0000000180040918     libcpmt:xthrow.obj
- 0004:00000918       $pdata$??_Gbad_array_new_length@std@@UEAAPEAXI@Z 0000000180040918     LIBCMT:throw_bad_alloc.obj
- 0004:00000918       $pdata$??_Gbad_alloc@std@@UEAAPEAXI@Z 0000000180040918     libcpmt:xthrow.obj
- 0004:00000918       $pdata$??_Glength_error@std@@UEAAPEAXI@Z 0000000180040918     libcpmt:xthrow.obj
- 0004:00000918       $pdata$??_Gbad_exception@std@@UEAAPEAXI@Z 0000000180040918     libvcruntime:frame.obj
- 0004:00000924       $pdata$?_Xbad_alloc@std@@YAXXZ 0000000180040924     libcpmt:xthrow.obj
- 0004:00000924       $pdata$?__scrt_throw_std_bad_alloc@@YAXXZ 0000000180040924     LIBCMT:throw_bad_alloc.obj
- 0004:00000930       $pdata$?_Xlength_error@std@@YAXPEBD@Z 0000000180040930     libcpmt:xthrow.obj
- 0004:0000093c       $pdata$?_Xout_of_range@std@@YAXPEBD@Z 000000018004093c     libcpmt:xthrow.obj
- 0004:00000948       $pdata$??0_Init_locks@std@@QEAA@XZ 0000000180040948     libcpmt:xlock.obj
- 0004:00000954       $pdata$??0_Lockit@std@@QEAA@H@Z 0000000180040954     libcpmt:xlock.obj
- 0004:00000960       $pdata$??1_Init_locks@std@@QEAA@XZ 0000000180040960     libcpmt:xlock.obj
- 0004:0000096c       $pdata$??1_Lockit@std@@QEAA@XZ 000000018004096c     libcpmt:xlock.obj
- 0004:00000978       $pdata$??4?$_Yarn@D@std@@QEAAAEAV01@PEBD@Z 0000000180040978     libcpmt:locale0.obj
- 0004:00000984       $pdata$??_G_Fac_node@std@@QEAAPEAXI@Z 0000000180040984     libcpmt:locale0.obj
- 0004:00000990       $pdata$??_G_Locimp@locale@std@@MEAAPEAXI@Z 0000000180040990     libcpmt:locale0.obj
- 0004:0000099c       $pdata$?_Facet_Register@std@@YAXPEAV_Facet_base@1@@Z 000000018004099c     libcpmt:locale0.obj
- 0004:000009a8       $pdata$?_Init@locale@std@@CAPEAV_Locimp@12@_N@Z 00000001800409a8     libcpmt:locale0.obj
- 0004:000009b4       $pdata$?_Locimp_dtor@_Locimp@locale@std@@CAXPEAV123@@Z 00000001800409b4     libcpmt:locale0.obj
- 0004:000009c0       $pdata$?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z 00000001800409c0     libcpmt:locale0.obj
- 0004:000009cc       $pdata$?_Locinfo_dtor@_Locinfo@std@@SAXPEAV12@@Z 00000001800409cc     libcpmt:locale0.obj
- 0004:000009d8       $pdata$?_New_Locimp@_Locimp@locale@std@@CAPEAV123@_N@Z 00000001800409d8     libcpmt:locale0.obj
- 0004:000009e4       $pdata$?_Setgloballocale@locale@std@@CAXPEAX@Z 00000001800409e4     libcpmt:locale0.obj
- 0004:000009f0       $pdata$_Deletegloballocale 00000001800409f0     libcpmt:locale0.obj
- 0004:000009fc       $pdata$tidy_global         00000001800409fc     libcpmt:locale0.obj
- 0004:00000a08       $pdata$?_Ios_base_dtor@ios_base@std@@CAXPEAV12@@Z 0000000180040a08     libcpmt:ios.obj
- 0004:00000a14       $pdata$?_Tidy@ios_base@std@@AEAAXXZ 0000000180040a14     libcpmt:ios.obj
- 0004:00000a20       $pdata$_Getctype           0000000180040a20     libcpmt:_tolower.obj
- 0004:00000a2c       $pdata$_Tolower            0000000180040a2c     libcpmt:_tolower.obj
- 0004:00000a38       $pdata$_Getcvt             0000000180040a38     libcpmt:xwctomb.obj
- 0004:00000a44       $pdata$_Toupper            0000000180040a44     libcpmt:_toupper.obj
- 0004:00000a50       $pdata$?_Atexit@@YAXP6AXXZ@Z 0000000180040a50     libcpmt:iosptrs.obj
- 0004:00000a5c       $pdata$__crtLCMapStringA   0000000180040a5c     libcpmt:StlLCMapStringA.obj
- 0004:00000a68       $pdata$?initialize_pointers@@YAHXZ 0000000180040a68     libcpmt:winapisupp.obj
- 0004:00000a74       $pdata$__crtInitializeCriticalSectionEx 0000000180040a74     libcpmt:winapisupp.obj
- 0004:00000a80       $pdata$GetTableIndexFromLocaleName 0000000180040a80     libcpmt:winapinls.obj
- 0004:00000a8c       $pdata$__crtDownlevelLocaleNameToLCID 0000000180040a8c     libcpmt:winapinls.obj
- 0004:00000a98       $pdata$__crtLCMapStringEx  0000000180040a98     libcpmt:winapinls.obj
- 0004:00000ab0       $pdata$??2@YAPEAX_K@Z      0000000180040ab0     LIBCMT:new_scalar.obj
- 0004:00000abc       $pdata$?__scrt_initialize_thread_safe_statics@@YAHXZ 0000000180040abc     LIBCMT:thread_safe_statics.obj
- 0004:00000ac8       $pdata$?__scrt_uninitialize_thread_safe_statics@@YAXXZ 0000000180040ac8     LIBCMT:thread_safe_statics.obj
- 0004:00000ad4       $pdata$_Init_thread_footer 0000000180040ad4     LIBCMT:thread_safe_statics.obj
- 0004:00000ae0       $pdata$_Init_thread_header 0000000180040ae0     LIBCMT:thread_safe_statics.obj
- 0004:00000aec       $pdata$_Init_thread_notify 0000000180040aec     LIBCMT:thread_safe_statics.obj
- 0004:00000af8       $pdata$_Init_thread_wait   0000000180040af8     LIBCMT:thread_safe_statics.obj
- 0004:00000b04       $pdata$__scrt_acquire_startup_lock 0000000180040b04     LIBCMT:utility.obj
- 0004:00000b10       $pdata$__scrt_dllmain_after_initialize_c 0000000180040b10     LIBCMT:utility.obj
- 0004:00000b1c       $pdata$__scrt_dllmain_before_initialize_c 0000000180040b1c     LIBCMT:utility.obj
- 0004:00000b28       $pdata$__scrt_dllmain_crt_thread_attach 0000000180040b28     LIBCMT:utility.obj
- 0004:00000b34       $pdata$__scrt_dllmain_crt_thread_detach 0000000180040b34     LIBCMT:utility.obj
- 0004:00000b40       $pdata$__scrt_dllmain_exception_filter 0000000180040b40     LIBCMT:utility.obj
- 0004:00000b4c       $pdata$__scrt_dllmain_uninitialize_c 0000000180040b4c     LIBCMT:utility.obj
- 0004:00000b58       $pdata$__scrt_dllmain_uninitialize_critical 0000000180040b58     LIBCMT:utility.obj
- 0004:00000b64       $pdata$__scrt_initialize_crt 0000000180040b64     LIBCMT:utility.obj
- 0004:00000b70       $pdata$__scrt_initialize_onexit_tables 0000000180040b70     LIBCMT:utility.obj
- 0004:00000b7c       $pdata$__scrt_is_nonwritable_in_current_image 0000000180040b7c     LIBCMT:utility.obj
- 0004:00000b88       $pdata$__scrt_release_startup_lock 0000000180040b88     LIBCMT:utility.obj
- 0004:00000b94       $pdata$__scrt_uninitialize_crt 0000000180040b94     LIBCMT:utility.obj
- 0004:00000ba0       $pdata$_onexit             0000000180040ba0     LIBCMT:utility.obj
- 0004:00000bac       $pdata$atexit              0000000180040bac     LIBCMT:utility.obj
- 0004:00000bb8       $pdata$?dllmain_crt_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180040bb8     LIBCMT:dll_dllmain.obj
- 0004:00000bc4       $pdata$?dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z 0000000180040bc4     LIBCMT:dll_dllmain.obj
- 0004:00000bd0       $pdata$?dllmain_crt_process_detach@@YAH_N@Z 0000000180040bd0     LIBCMT:dll_dllmain.obj
- 0004:00000bdc       $pdata$?dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180040bdc     LIBCMT:dll_dllmain.obj
- 0004:00000be8       $pdata$?dllmain_raw@@YAHQEAUHINSTANCE__@@KQEAX@Z 0000000180040be8     LIBCMT:dll_dllmain.obj
- 0004:00000bf4       $pdata$_DllMainCRTStartup  0000000180040bf4     LIBCMT:dll_dllmain.obj
- 0004:00000c00       $pdata$??_Gtype_info@@UEAAPEAXI@Z 0000000180040c00     LIBCMT:std_type_info_static.obj
- 0004:00000c0c       $pdata$__GSHandlerCheck    0000000180040c0c     LIBCMT:_gshandler_.obj
- 0004:00000c18       $pdata$__GSHandlerCheckCommon 0000000180040c18     LIBCMT:_gshandler_.obj
- 0004:00000c30       $pdata$__raise_securityfailure 0000000180040c30     LIBCMT:gs_report.obj
- 0004:00000c3c       $pdata$__report_gsfailure  0000000180040c3c     LIBCMT:gs_report.obj
- 0004:00000c48       $pdata$__report_rangecheckfailure 0000000180040c48     LIBCMT:gs_report.obj
- 0004:00000c54       $pdata$__report_securityfailure 0000000180040c54     LIBCMT:gs_report.obj
- 0004:00000c60       $pdata$capture_current_context 0000000180040c60     LIBCMT:gs_report.obj
- 0004:00000c6c       $pdata$capture_previous_context 0000000180040c6c     LIBCMT:gs_report.obj
- 0004:00000c78       $pdata$??0bad_array_new_length@std@@QEAA@AEBV01@@Z 0000000180040c78     LIBCMT:throw_bad_alloc.obj
- 0004:00000c84       $pdata$?__scrt_throw_std_bad_array_new_length@@YAXXZ 0000000180040c84     LIBCMT:throw_bad_alloc.obj
- 0004:00000c90       $pdata$__scrt_fastfail     0000000180040c90     LIBCMT:utility_desktop.obj
- 0004:00000c9c       $pdata$__isa_available_init 0000000180040c9c     LIBCMT:_cpu_disp_.obj
- 0004:00000ca8       $pdata$__security_init_cookie 0000000180040ca8     LIBCMT:gs_support.obj
- 0004:00000cb4       $pdata$__scrt_initialize_default_local_stdio_options 0000000180040cb4     LIBCMT:default_local_stdio_options.obj
- 0004:00000cc0       $pdata$_RTC_Initialize     0000000180040cc0     LIBCMT:_initsect_.obj
- 0004:00000ccc       $pdata$_RTC_Terminate      0000000180040ccc     LIBCMT:_initsect_.obj
- 0004:00000ce4       $pdata$_purecall           0000000180040ce4     libvcruntime:purevirt.obj
- 0004:00000cf0       $pdata$__std_exception_copy 0000000180040cf0     libvcruntime:std_exception.obj
- 0004:00000cfc       $pdata$__std_exception_destroy 0000000180040cfc     libvcruntime:std_exception.obj
- 0004:00000d08       $pdata$_CxxThrowException  0000000180040d08     libvcruntime:throw.obj
- 0004:00000d14       $pdata$__DestructExceptionObject 0000000180040d14     libvcruntime:frame.obj
- 0004:00000d20       $pdata$??0bad_exception@std@@QEAA@AEBV01@@Z 0000000180040d20     libvcruntime:frame.obj
- 0004:00000d2c       $pdata$?CatchIt@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@PEBU_s_HandlerType@@PEBU_s_CatchableType@@PEBU_s_TryBlockMapEntry@@H1EE@Z 0000000180040d2c     libvcruntime:frame.obj
- 0004:00000d38       $pdata$?ExFilterRethrow@@YAHPEAU_EXCEPTION_POINTERS@@PEAUEHExceptionRecord@@PEAH@Z 0000000180040d38     libvcruntime:frame.obj
- 0004:00000d44       $pdata$?FindHandler@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@EH1@Z 0000000180040d44     libvcruntime:frame.obj
- 0004:00000d50       $pdata$?FindHandlerForForeignException@@YAXPEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@HH1@Z 0000000180040d50     libvcruntime:frame.obj
- 0004:00000d5c       $pdata$?IsInExceptionSpec@@YAEPEAUEHExceptionRecord@@PEBU_s_ESTypeList@@@Z 0000000180040d5c     libvcruntime:frame.obj
- 0004:00000d68       $pdata$__BuildCatchObject  0000000180040d68     libvcruntime:frame.obj
- 0004:00000d74       $pdata$__BuildCatchObjectHelper 0000000180040d74     libvcruntime:frame.obj
- 0004:00000d80       $pdata$__CxxCallCatchBlock 0000000180040d80     libvcruntime:frame.obj
- 0004:00000d8c       $pdata$__FrameUnwindFilter 0000000180040d8c     libvcruntime:frame.obj
- 0004:00000d98       $pdata$__FrameUnwindToState 0000000180040d98     libvcruntime:frame.obj
- 0004:00000da4       $pdata$__InternalCxxFrameHandler 0000000180040da4     libvcruntime:frame.obj
- 0004:00000db0       $pdata$__TypeMatch         0000000180040db0     libvcruntime:frame.obj
- 0004:00000dbc       $pdata$__std_terminate     0000000180040dbc     libvcruntime:frame.obj
- 0004:00000dc8       $pdata$?_ExecutionInCatch@@YAHPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 0000000180040dc8     libvcruntime:trnsctrl.obj
- 0004:00000dd4       $pdata$?_GetEstablisherFrame@@YAPEA_KPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@0@Z 0000000180040dd4     libvcruntime:trnsctrl.obj
- 0004:00000de0       $pdata$?_GetRangeOfTrysToCheck@@YAPEBU_s_TryBlockMapEntry@@PEA_KPEBU_s_FuncInfo@@HHPEAI2PEAU_xDISPATCHER_CONTEXT@@@Z 0000000180040de0     libvcruntime:trnsctrl.obj
- 0004:00000dec       $pdata$?__FrameUnwindToEmptyState@@YAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 0000000180040dec     libvcruntime:trnsctrl.obj
- 0004:00000df8       $pdata$?__SehTransFilter@@YAHPEAU_EXCEPTION_POINTERS@@PEAUEHExceptionRecord@@PEA_KPEAU_CONTEXT@@PEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@PEAH@Z 0000000180040df8     libvcruntime:trnsctrl.obj
- 0004:00000e04       $pdata$_CallSETranslator   0000000180040e04     libvcruntime:trnsctrl.obj
- 0004:00000e10       $pdata$_CreateFrameInfo    0000000180040e10     libvcruntime:trnsctrl.obj
- 0004:00000e1c       $pdata$_FindAndUnlinkFrame 0000000180040e1c     libvcruntime:trnsctrl.obj
- 0004:00000e28       $pdata$_GetImageBase       0000000180040e28     libvcruntime:trnsctrl.obj
- 0004:00000e34       $pdata$_GetThrowImageBase  0000000180040e34     libvcruntime:trnsctrl.obj
- 0004:00000e40       $pdata$_IsExceptionObjectToBeDestroyed 0000000180040e40     libvcruntime:trnsctrl.obj
- 0004:00000e4c       $pdata$_SetImageBase       0000000180040e4c     libvcruntime:trnsctrl.obj
- 0004:00000e58       $pdata$_SetThrowImageBase  0000000180040e58     libvcruntime:trnsctrl.obj
- 0004:00000e64       $pdata$_UnwindNestedFrames 0000000180040e64     libvcruntime:trnsctrl.obj
- 0004:00000e70       $pdata$__CxxFrameHandler3  0000000180040e70     libvcruntime:trnsctrl.obj
- 0004:00000e94       $pdata$?try_get_function@@YAPEAXW4function_id@?A0x679b24ab@@QEBDQEBW4module_id@2@2@Z 0000000180040e94     libvcruntime:winapi_downlevel.obj
- 0004:00000ea0       $pdata$__vcrt_FlsAlloc     0000000180040ea0     libvcruntime:winapi_downlevel.obj
- 0004:00000eac       $pdata$__vcrt_FlsFree      0000000180040eac     libvcruntime:winapi_downlevel.obj
- 0004:00000eb8       $pdata$__vcrt_FlsGetValue  0000000180040eb8     libvcruntime:winapi_downlevel.obj
- 0004:00000ec4       $pdata$__vcrt_FlsSetValue  0000000180040ec4     libvcruntime:winapi_downlevel.obj
- 0004:00000ed0       $pdata$__vcrt_InitializeCriticalSectionEx 0000000180040ed0     libvcruntime:winapi_downlevel.obj
- 0004:00000edc       $pdata$__vcrt_uninitialize_winapi_thunks 0000000180040edc     libvcruntime:winapi_downlevel.obj
- 0004:00000ee8       $pdata$__vcrt_initialize   0000000180040ee8     libvcruntime:initialization.obj
- 0004:00000ef4       $pdata$__vcrt_thread_attach 0000000180040ef4     libvcruntime:initialization.obj
- 0004:00000f00       $pdata$__vcrt_thread_detach 0000000180040f00     libvcruntime:initialization.obj
- 0004:00000f0c       $pdata$__vcrt_uninitialize 0000000180040f0c     libvcruntime:initialization.obj
- 0004:00000f18       $pdata$__vcrt_uninitialize_critical 0000000180040f18     libvcruntime:initialization.obj
- 0004:00000f24       $pdata$__C_specific_handler 0000000180040f24     libvcruntime:_chandler_.obj
- 0004:00000f30       $pdata$__std_type_info_destroy_list 0000000180040f30     libvcruntime:std_type_info.obj
- 0004:00000f3c       $pdata$__vcrt_freefls      0000000180040f3c     libvcruntime:per_thread_data.obj
- 0004:00000f48       $pdata$__vcrt_freeptd      0000000180040f48     libvcruntime:per_thread_data.obj
- 0004:00000f54       $pdata$__vcrt_getptd       0000000180040f54     libvcruntime:per_thread_data.obj
- 0004:00000f60       $pdata$__vcrt_getptd_noexit 0000000180040f60     libvcruntime:per_thread_data.obj
- 0004:00000f6c       $pdata$__vcrt_initialize_ptd 0000000180040f6c     libvcruntime:per_thread_data.obj
- 0004:00000f78       $pdata$__vcrt_uninitialize_ptd 0000000180040f78     libvcruntime:per_thread_data.obj
- 0004:00000f84       $pdata$?__GetCurrentState@@YAHPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 0000000180040f84     libvcruntime:ehstate.obj
- 0004:00000f90       $pdata$?__GetUnwindTryBlock@@YAHPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@@Z 0000000180040f90     libvcruntime:ehstate.obj
- 0004:00000f9c       $pdata$?__SetUnwindTryBlock@@YAXPEA_KPEAU_xDISPATCHER_CONTEXT@@PEBU_s_FuncInfo@@H@Z 0000000180040f9c     libvcruntime:ehstate.obj
- 0004:00000fa8       $pdata$?__StateFromIp@@YAHPEBU_s_FuncInfo@@PEAU_xDISPATCHER_CONTEXT@@_J@Z 0000000180040fa8     libvcruntime:ehstate.obj
- 0004:00000ff0       $pdata$__vcrt_initialize_locks 0000000180040ff0     libvcruntime:locks.obj
- 0004:00000ffc       $pdata$__vcrt_uninitialize_locks 0000000180040ffc     libvcruntime:locks.obj
- 0004:00001008       $pdata$__acrt_call_reportfault 0000000180041008     libucrt:invalid_parameter.obj
- 0004:00001014       $pdata$_invalid_parameter  0000000180041014     libucrt:invalid_parameter.obj
- 0004:00001020       $pdata$_invalid_parameter_noinfo 0000000180041020     libucrt:invalid_parameter.obj
- 0004:0000102c       $pdata$_invalid_parameter_noinfo_noreturn 000000018004102c     libucrt:invalid_parameter.obj
- 0004:00001038       $pdata$_invoke_watson      0000000180041038     libucrt:invalid_parameter.obj
- 0004:00001044       $pdata$abort               0000000180041044     libucrt:abort.obj
- 0004:00001050       $pdata$strcspn             0000000180041050     libucrt:strcspn.obj
- 0004:0000105c       $pdata$??$common_vsprintf@Vformat_validation_base@__crt_stdio_output@@D@@YAH_KQEAD0QEBDQEAU__crt_locale_pointers@@1@Z 000000018004105c     libucrt:output.obj
- 0004:00001068       $pdata$??$ensure_buffer_is_big_enough@D@formatting_buffer@__crt_stdio_output@@QEAA_N_K@Z 0000000180041068     libucrt:output.obj
- 0004:00001074       $pdata$??$type_case_integer_parse_into_buffer@I@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAXII_N@Z 0000000180041074     libucrt:output.obj
- 0004:00001080       $pdata$??$type_case_integer_parse_into_buffer@_K@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAAX_KI_N@Z 0000000180041080     libucrt:output.obj
- 0004:0000108c       $pdata$??$write_multiple_characters@V?$string_output_adapter@D@__crt_stdio_output@@D@__crt_stdio_output@@YAXAEBV?$string_output_adapter@D@0@DHQEAH@Z 000000018004108c     libucrt:output.obj
- 0004:00001098       $pdata$??0?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAA@AEBV?$string_output_adapter@D@1@_KQEBDQEAU__crt_locale_pointers@@QEAD@Z 0000000180041098     libucrt:output.obj
- 0004:000010a4       $pdata$??0_LocaleUpdate@@QEAA@QEAU__crt_locale_pointers@@@Z 00000001800410a4     libucrt:output.obj
- 0004:000010b0       $pdata$?force_decimal_point@__crt_stdio_output@@YAXPEADQEAU__crt_locale_pointers@@@Z 00000001800410b0     libucrt:output.obj
- 0004:000010bc       $pdata$?parse_int_from_format_string@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NQEAH@Z 00000001800410bc     libucrt:output.obj
- 0004:000010c8       $pdata$?process@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@QEAAHXZ 00000001800410c8     libucrt:output.obj
- 0004:000010d4       $pdata$?state_case_normal@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800410d4     libucrt:output.obj
- 0004:000010e0       $pdata$?state_case_normal_tchar@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 00000001800410e0     libucrt:output.obj
- 0004:000010ec       $pdata$?state_case_size@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800410ec     libucrt:output.obj
- 0004:000010f8       $pdata$?state_case_type@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 00000001800410f8     libucrt:output.obj
- 0004:00001104       $pdata$?type_case_Z@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180041104     libucrt:output.obj
- 0004:00001110       $pdata$?type_case_a@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180041110     libucrt:output.obj
- 0004:0000111c       $pdata$?type_case_c_tchar@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 000000018004111c     libucrt:output.obj
- 0004:00001128       $pdata$?type_case_integer@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NI_N@Z 0000000180041128     libucrt:output.obj
- 0004:00001134       $pdata$?type_case_n@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180041134     libucrt:output.obj
- 0004:00001140       $pdata$?type_case_s@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_NXZ 0000000180041140     libucrt:output.obj
- 0004:0000114c       $pdata$?write_stored_string_tchar@?$output_processor@DV?$string_output_adapter@D@__crt_stdio_output@@V?$format_validation_base@DV?$string_output_adapter@D@__crt_stdio_output@@@2@@__crt_stdio_output@@AEAA_ND@Z 000000018004114c     libucrt:output.obj
- 0004:00001158       $pdata$?write_string@?$string_output_adapter@D@__crt_stdio_output@@QEBAXQEBDHQEAH1@Z 0000000180041158     libucrt:output.obj
- 0004:00001164       $pdata$__stdio_common_vsprintf_s 0000000180041164     libucrt:output.obj
- 0004:00001170       $pdata$localeconv          0000000180041170     libucrt:localeconv.obj
- 0004:0000117c       $pdata$frexp               000000018004117c     libucrt:frexp.obj
- 0004:00001188       $pdata$_stricmp            0000000180041188     libucrt:stricmp.obj
- 0004:00001194       $pdata$_stricmp_l          0000000180041194     libucrt:stricmp.obj
- 0004:000011a0       $pdata$__acrt_initialize_locks 00000001800411a0     libucrt:locks.obj
- 0004:000011ac       $pdata$__acrt_uninitialize_locks 00000001800411ac     libucrt:locks.obj
- 0004:000011b8       $pdata$call_wsetlocale     00000001800411b8     libucrt:setlocale.obj
- 0004:000011c4       $pdata$setlocale           00000001800411c4     libucrt:setlocale.obj
- 0004:000011d0       $pdata$_calloc_base        00000001800411d0     libucrt:calloc_base.obj
- 0004:000011dc       $pdata$__pctype_func       00000001800411dc     libucrt:ctype.obj
- 0004:000011e8       $pdata$isdigit             00000001800411e8     libucrt:_ctype.obj
- 0004:000011f4       $pdata$islower             00000001800411f4     libucrt:_ctype.obj
- 0004:00001200       $pdata$isupper             0000000180041200     libucrt:_ctype.obj
- 0004:0000120c       $pdata$_wcsdup             000000018004120c     libucrt:wcsdup.obj
- 0004:00001218       $pdata$___lc_codepage_func 0000000180041218     libucrt:initctype.obj
- 0004:00001224       $pdata$___lc_locale_name_func 0000000180041224     libucrt:initctype.obj
- 0004:00001230       $pdata$___mb_cur_max_func  0000000180041230     libucrt:initctype.obj
- 0004:0000123c       $pdata$__acrt_locale_initialize_ctype 000000018004123c     libucrt:initctype.obj
- 0004:00001248       $pdata$__acrt_errno_map_os_error 0000000180041248     libucrt:errno.obj
- 0004:00001254       $pdata$__doserrno          0000000180041254     libucrt:errno.obj
- 0004:00001260       $pdata$_errno              0000000180041260     libucrt:errno.obj
- 0004:0000126c       $pdata$?x_ismbbtype_l@@YAHPEAU__crt_locale_pointers@@IHH@Z 000000018004126c     libucrt:ismbbyte.obj
- 0004:00001278       $pdata$_malloc_base        0000000180041278     libucrt:malloc_base.obj
- 0004:00001284       $pdata$_realloc_base       0000000180041284     libucrt:realloc_base.obj
- 0004:00001290       $pdata$?divide@__crt_strtox@@YA_KAEAUbig_integer@1@AEBU21@@Z 0000000180041290     libucrt:strtod.obj
- 0004:0000129c       $pdata$5$?divide@__crt_strtox@@YA_KAEAUbig_integer@1@AEBU21@@Z 000000018004129c     libucrt:strtod.obj
- 0004:000012a8       $pdata$6$?divide@__crt_strtox@@YA_KAEAUbig_integer@1@AEBU21@@Z 00000001800412a8     libucrt:strtod.obj
- 0004:000012b4       $pdata$memcpy_s            00000001800412b4     libucrt:strtod.obj
- 0004:000012b4       $pdata$memcpy_s            00000001800412b4     libucrt:cfout.obj
- 0004:000012d8       $pdata$_free_base          00000001800412d8     libucrt:free_base.obj
- 0004:000012e4       $pdata$?internal_isupper_l@@YA_NHQEAU__crt_locale_pointers@@@Z 00000001800412e4     libucrt:tolower_toupper.obj
- 0004:000012f0       $pdata$_tolower_l          00000001800412f0     libucrt:tolower_toupper.obj
- 0004:000012fc       $pdata$tolower             00000001800412fc     libucrt:tolower_toupper.obj
- 0004:00001308       $pdata$wcscpy_s            0000000180041308     libucrt:wcscpy_s.obj
- 0004:00001314       $pdata$strnlen             0000000180041314     libucrt:strnlen.obj
- 0004:00001320       $pdata$wcsnlen             0000000180041320     libucrt:strnlen.obj
- 0004:0000132c       $pdata$_callnewh           000000018004132c     libucrt:new_handler.obj
- 0004:00001338       $pdata$_query_new_handler  0000000180041338     libucrt:new_handler.obj
- 0004:00001344       $pdata$_seh_filter_exe     0000000180041344     libucrt:exception_filter.obj
- 0004:00001350       $pdata$?common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z 0000000180041350     libucrt:exit.obj
- 0004:0000135c       $pdata$?exit_or_terminate_process@@YAXI@Z 000000018004135c     libucrt:exit.obj
- 0004:00001368       $pdata$?try_cor_exit_process@@YAXI@Z 0000000180041368     libucrt:exit.obj
- 0004:00001374       $pdata$??$parse_command_line@D@@YAXPEADPEAPEAD0PEA_K2@Z 0000000180041374     libucrt:argv_parsing.obj
- 0004:00001380       $pdata$__acrt_allocate_buffer_for_argv 0000000180041380     libucrt:argv_parsing.obj
- 0004:0000138c       $pdata$_configure_narrow_argv 000000018004138c     libucrt:argv_parsing.obj
- 0004:00001398       $pdata$??$common_initialize_environment_nolock@D@@YAHXZ 0000000180041398     libucrt:environment_initialization.obj
- 0004:000013a4       $pdata$??$create_environment@D@@YAQEAPEADQEAD@Z 00000001800413a4     libucrt:environment_initialization.obj
- 0004:000013b0       $pdata$??$free_environment@D@@YAXQEAPEAD@Z 00000001800413b0     libucrt:environment_initialization.obj
- 0004:000013b0       $pdata$??$free_environment@_W@@YAXQEAPEA_W@Z 00000001800413b0     libucrt:environment_initialization.obj
- 0004:000013bc       $pdata$??$uninitialize_environment_internal@D@@YAXAEAPEAPEAD@Z 00000001800413bc     libucrt:environment_initialization.obj
- 0004:000013c8       $pdata$??$uninitialize_environment_internal@_W@@YAXAEAPEAPEA_W@Z 00000001800413c8     libucrt:environment_initialization.obj
- 0004:000013d4       $pdata$__dcrt_uninitialize_environments_nolock 00000001800413d4     libucrt:environment_initialization.obj
- 0004:000013e0       $pdata$??$?RV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@V<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@$$QEAV<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@Z 00000001800413e0     libucrt:onexit.obj
- 0004:000013ec       $pdata$??$?RV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@V<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@$$QEAV<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@Z 00000001800413ec     libucrt:onexit.obj
- 0004:000013f8       $pdata$??R<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@QEBAHXZ 00000001800413f8     libucrt:onexit.obj
- 0004:00001404       $pdata$_execute_onexit_table 0000000180041404     libucrt:onexit.obj
- 0004:00001410       $pdata$_register_onexit_function 0000000180041410     libucrt:onexit.obj
- 0004:0000141c       $pdata$initialize_c        000000018004141c     libucrt:initialization.obj
- 0004:00001428       $pdata$uninitialize_environment 0000000180041428     libucrt:initialization.obj
- 0004:00001434       $pdata$initialize_pointers 0000000180041434     libucrt:initialization.obj
- 0004:00001440       $pdata$uninitialize_allocated_memory 0000000180041440     libucrt:initialization.obj
- 0004:0000144c       $pdata$__acrt_thread_attach 000000018004144c     libucrt:initialization.obj
- 0004:00001458       $pdata$__acrt_thread_detach 0000000180041458     libucrt:initialization.obj
- 0004:00001464       $pdata$__acrt_uninitialize_critical 0000000180041464     libucrt:initialization.obj
- 0004:00001470       $pdata$_initterm           0000000180041470     libucrt:initterm.obj
- 0004:0000147c       $pdata$_initterm_e         000000018004147c     libucrt:initterm.obj
- 0004:00001488       $pdata$terminate           0000000180041488     libucrt:terminate.obj
- 0004:00001494       $pdata$strcpy_s            0000000180041494     libucrt:strcpy_s.obj
- 0004:000014a0       $pdata$??$parse_integer@KV?$c_string_character_source@D@__crt_strtox@@@__crt_strtox@@YAKQEAU__crt_locale_pointers@@V?$c_string_character_source@D@0@H_N@Z 00000001800414a0     libucrt:atox.obj
- 0004:000014ac       $pdata$??$parse_integer@KV?$c_string_character_source@_W@__crt_strtox@@@__crt_strtox@@YAKQEAU__crt_locale_pointers@@V?$c_string_character_source@_W@0@H_N@Z 00000001800414ac     libucrt:atox.obj
- 0004:000014b8       $pdata$_wtol               00000001800414b8     libucrt:atox.obj
- 0004:000014c4       $pdata$??$?RV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@V<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@$$QEAV<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@Z 00000001800414c4     libucrt:per_thread_data.obj
- 0004:000014d0       $pdata$??$?RV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@V<lambda_341c25c0346d94847f1f3c463c57e077>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@$$QEAV<lambda_341c25c0346d94847f1f3c463c57e077>@@@Z 00000001800414d0     libucrt:per_thread_data.obj
- 0004:000014dc       $pdata$??$?RV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@V<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@$$QEAV<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@Z 00000001800414dc     libucrt:per_thread_data.obj
- 0004:000014e8       $pdata$??$?RV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@V<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@$$QEAV<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@Z 00000001800414e8     libucrt:per_thread_data.obj
- 0004:000014f4       $pdata$?construct_ptd_array@@YAXQEAU__acrt_ptd@@@Z 00000001800414f4     libucrt:per_thread_data.obj
- 0004:00001500       $pdata$?destroy_fls@@YAXPEAX@Z 0000000180041500     libucrt:per_thread_data.obj
- 0004:0000150c       $pdata$?destroy_ptd_array@@YAXQEAU__acrt_ptd@@@Z 000000018004150c     libucrt:per_thread_data.obj
- 0004:00001518       $pdata$?replace_current_thread_locale_nolock@@YAXQEAU__acrt_ptd@@QEAU__crt_locale_data@@@Z 0000000180041518     libucrt:per_thread_data.obj
- 0004:00001524       $pdata$__acrt_freeptd      0000000180041524     libucrt:per_thread_data.obj
- 0004:00001530       $pdata$__acrt_getptd       0000000180041530     libucrt:per_thread_data.obj
- 0004:0000153c       $pdata$__acrt_getptd_noexit 000000018004153c     libucrt:per_thread_data.obj
- 0004:00001548       $pdata$__acrt_initialize_ptd 0000000180041548     libucrt:per_thread_data.obj
- 0004:00001554       $pdata$__acrt_uninitialize_ptd 0000000180041554     libucrt:per_thread_data.obj
- 0004:00001560       $pdata$??$?RV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@V<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@?$__crt_seh_guarded_call@P6AXH@Z@@QEAAP6AXH@Z$$QEAV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@$$QEAV<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@Z 0000000180041560     libucrt:signal.obj
- 0004:0000156c       $pdata$__acrt_get_sigabrt_handler 000000018004156c     libucrt:signal.obj
- 0004:00001578       $pdata$raise               0000000180041578     libucrt:signal.obj
- 0004:00001584       $pdata$strtol              0000000180041584     libucrt:strtox.obj
- 0004:00001590       $pdata$_mbtowc_l           0000000180041590     libucrt:mbtowc.obj
- 0004:0000159c       $pdata$_wctomb_s_l         000000018004159c     libucrt:wctomb.obj
- 0004:000015a8       $pdata$wctomb_s            00000001800415a8     libucrt:wctomb.obj
- 0004:000015b4       $pdata$__acrt_update_locale_info 00000001800415b4     libucrt:locale_update.obj
- 0004:000015c0       $pdata$__acrt_update_multibyte_info 00000001800415c0     libucrt:locale_update.obj
- 0004:000015cc       $pdata$?fp_format_a@@YAHQEBNPEAD_KQEAD2H_NIQEAU__crt_locale_pointers@@@Z 00000001800415cc     libucrt:cvt.obj
- 0004:000015d8       $pdata$?fp_format_e@@YAHQEBNQEAD_K12H_NIQEAU__crt_locale_pointers@@@Z 00000001800415d8     libucrt:cvt.obj
- 0004:000015e4       $pdata$?fp_format_e_internal@@YAHQEAD_KH_NIQEAU_strflt@@2QEAU__crt_locale_pointers@@@Z 00000001800415e4     libucrt:cvt.obj
- 0004:000015f0       $pdata$?fp_format_f_internal@@YAHQEAD_KHQEAU_strflt@@_NQEAU__crt_locale_pointers@@@Z 00000001800415f0     libucrt:cvt.obj
- 0004:000015fc       $pdata$?fp_format_g@@YAHQEBNQEAD_K12H_NIQEAU__crt_locale_pointers@@@Z 00000001800415fc     libucrt:cvt.obj
- 0004:00001608       $pdata$?fp_format_nan_or_infinity@@YAHW4__acrt_fp_class@@_NPEAD_K1@Z 0000000180041608     libucrt:cvt.obj
- 0004:00001614       $pdata$__acrt_fp_format    0000000180041614     libucrt:cvt.obj
- 0004:00001620       $pdata$_fileno             0000000180041620     libucrt:fileno.obj
- 0004:0000162c       $pdata$__acrt_initialize_stdio 000000018004162c     libucrt:_file.obj
- 0004:00001638       $pdata$__acrt_uninitialize_stdio 0000000180041638     libucrt:_file.obj
- 0004:00001644       $pdata$??$?RV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@Z 0000000180041644     libucrt:wsetlocale.obj
- 0004:00001650       $pdata$??$?RV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@V<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@$$QEAV<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@Z 0000000180041650     libucrt:wsetlocale.obj
- 0004:0000165c       $pdata$??R<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@QEBAXXZ 000000018004165c     libucrt:wsetlocale.obj
- 0004:00001668       $pdata$__acrt_copy_locale_name 0000000180041668     libucrt:wsetlocale.obj
- 0004:00001674       $pdata$__acrt_uninitialize_locale 0000000180041674     libucrt:wsetlocale.obj
- 0004:00001680       $pdata$__lc_lctowcs        0000000180041680     libucrt:wsetlocale.obj
- 0004:0000168c       $pdata$__lc_wcstolc        000000018004168c     libucrt:wsetlocale.obj
- 0004:00001698       $pdata$_copytlocinfo_nolock 0000000180041698     libucrt:wsetlocale.obj
- 0004:000016a4       $pdata$_expandlocale       00000001800416a4     libucrt:wsetlocale.obj
- 0004:000016b0       $pdata$_wcscats            00000001800416b0     libucrt:wsetlocale.obj
- 0004:000016bc       $pdata$_wsetlocale         00000001800416bc     libucrt:wsetlocale.obj
- 0004:000016c8       $pdata$_wsetlocale_get_all 00000001800416c8     libucrt:wsetlocale.obj
- 0004:000016d4       $pdata$_wsetlocale_nolock  00000001800416d4     libucrt:wsetlocale.obj
- 0004:000016e0       $pdata$_wsetlocale_set_cat 00000001800416e0     libucrt:wsetlocale.obj
- 0004:000016ec       $pdata$?initialize_inherited_file_handles_nolock@@YAXXZ 00000001800416ec     libucrt:ioinit.obj
- 0004:000016f8       $pdata$?initialize_stdio_handles_nolock@@YAXXZ 00000001800416f8     libucrt:ioinit.obj
- 0004:00001704       $pdata$__acrt_initialize_lowio 0000000180041704     libucrt:ioinit.obj
- 0004:00001710       $pdata$__acrt_uninitialize_lowio 0000000180041710     libucrt:ioinit.obj
- 0004:0000171c       $pdata$_except1            000000018004171c     libucrt:fpexcept.obj
- 0004:00001728       $pdata$_handle_exc         0000000180041728     libucrt:fpexcept.obj
- 0004:00001734       $pdata$_raise_exc          0000000180041734     libucrt:fpexcept.obj
- 0004:00001740       $pdata$_raise_exc_ex       0000000180041740     libucrt:fpexcept.obj
- 0004:0000174c       $pdata$_raise_excf         000000018004174c     libucrt:fpexcept.obj
- 0004:00001758       $pdata$_set_errno_from_matherr 0000000180041758     libucrt:fpexcept.obj
- 0004:00001764       $pdata$_umatherr           0000000180041764     libucrt:fpexcept.obj
- 0004:00001770       $pdata$_clrfp              0000000180041770     libucrt:fpctrl.obj
- 0004:0000177c       $pdata$_ctrlfp             000000018004177c     libucrt:fpctrl.obj
- 0004:00001788       $pdata$_set_statfp         0000000180041788     libucrt:fpctrl.obj
- 0004:00001794       $pdata$_statfp             0000000180041794     libucrt:fpctrl.obj
- 0004:000017a0       $pdata$?<helper_func_cdecl>@<lambda_e2bb8337c48846e80c921ea5ddadc92d>@@CAHPEA_W@Z 00000001800417a0     libucrt:winapi_thunks.obj
- 0004:000017ac       $pdata$??$?RV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@V<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@$$QEAV<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@Z 00000001800417ac     libucrt:winapi_thunks.obj
- 0004:000017b8       $pdata$?try_get_function@@YAPEAXW4function_id@?A0x63058377@@QEBDQEBW4module_id@2@2@Z 00000001800417b8     libucrt:winapi_thunks.obj
- 0004:000017c4       $pdata$__acrt_EnumSystemLocalesEx 00000001800417c4     libucrt:winapi_thunks.obj
- 0004:000017d0       $pdata$__acrt_FlsAlloc     00000001800417d0     libucrt:winapi_thunks.obj
- 0004:000017dc       $pdata$__acrt_FlsFree      00000001800417dc     libucrt:winapi_thunks.obj
- 0004:000017e8       $pdata$__acrt_FlsGetValue  00000001800417e8     libucrt:winapi_thunks.obj
- 0004:000017f4       $pdata$__acrt_FlsSetValue  00000001800417f4     libucrt:winapi_thunks.obj
- 0004:00001800       $pdata$__acrt_GetLocaleInfoEx 0000000180041800     libucrt:winapi_thunks.obj
- 0004:0000180c       $pdata$__acrt_GetUserDefaultLocaleName 000000018004180c     libucrt:winapi_thunks.obj
- 0004:00001818       $pdata$__acrt_InitializeCriticalSectionEx 0000000180041818     libucrt:winapi_thunks.obj
- 0004:00001824       $pdata$__acrt_IsValidLocaleName 0000000180041824     libucrt:winapi_thunks.obj
- 0004:00001830       $pdata$__acrt_LCIDToLocaleName 0000000180041830     libucrt:winapi_thunks.obj
- 0004:0000183c       $pdata$__acrt_LCMapStringEx 000000018004183c     libucrt:winapi_thunks.obj
- 0004:00001848       $pdata$__acrt_LocaleNameToLCID 0000000180041848     libucrt:winapi_thunks.obj
- 0004:00001854       $pdata$__acrt_can_use_vista_locale_apis 0000000180041854     libucrt:winapi_thunks.obj
- 0004:00001860       $pdata$__acrt_initialize_winapi_thunks 0000000180041860     libucrt:winapi_thunks.obj
- 0004:0000186c       $pdata$__acrt_is_packaged_app 000000018004186c     libucrt:winapi_thunks.obj
- 0004:00001878       $pdata$__acrt_uninitialize_winapi_thunks 0000000180041878     libucrt:winapi_thunks.obj
- 0004:00001884       $pdata$?_mbstowcs_l_helper@@YA_KPEA_WPEBD_KPEAU__crt_locale_pointers@@@Z 0000000180041884     libucrt:mbstowcs.obj
- 0004:00001890       $pdata$_mbstowcs_s_l       0000000180041890     libucrt:mbstowcs.obj
- 0004:0000189c       $pdata$mbstowcs_s          000000018004189c     libucrt:mbstowcs.obj
- 0004:000018a8       $pdata$?_wcstombs_l_helper@@YA_KPEADPEB_W_KPEAU__crt_locale_pointers@@@Z 00000001800418a8     libucrt:wcstombs.obj
- 0004:000018b4       $pdata$_wcstombs_s_l       00000001800418b4     libucrt:wcstombs.obj
- 0004:000018c0       $pdata$__acrt_initialize_heap 00000001800418c0     libucrt:heap_handle.obj
- 0004:000018cc       $pdata$_isctype_l          00000001800418cc     libucrt:isctype.obj
- 0004:000018d8       $pdata$?InternalGetLocaleInfoA@@YAHQEAU__crt_locale_pointers@@QEB_WKQEADH@Z 00000001800418d8     libucrt:getlocaleinfoa.obj
- 0004:000018e4       $pdata$__acrt_GetLocaleInfoA 00000001800418e4     libucrt:getlocaleinfoa.obj
- 0004:000018f0       $pdata$__acrt_GetStringTypeA 00000001800418f0     libucrt:getstringtypea.obj
- 0004:000018fc       $pdata$?__acrt_LCMapStringA_stat@@YAHPEAU__crt_locale_pointers@@PEB_WKPEBDHPEADHHH@Z 00000001800418fc     libucrt:lcmapstringa.obj
- 0004:00001908       $pdata$__acrt_LCMapStringA 0000000180041908     libucrt:lcmapstringa.obj
- 0004:00001914       $pdata$iswctype            0000000180041914     libucrt:iswctype.obj
- 0004:00001920       $pdata$__acrt_initialize_fma3 0000000180041920     libucrt:fma3_available.obj
- 0004:0000192c       $pdata$_pow_special        000000018004192c     libucrt:pow_special.obj
- 0004:00001938       $pdata$_powf_special       0000000180041938     libucrt:pow_special.obj
- 0004:00001944       $pdata$_wcsicmp            0000000180041944     libucrt:wcsicmp.obj
- 0004:00001950       $pdata$_wcsicmp_l          0000000180041950     libucrt:wcsicmp.obj
- 0004:0000195c       $pdata$_isleadbyte_l       000000018004195c     libucrt:_wctype.obj
- 0004:00001968       $pdata$??$common_expand_argv_wildcards@D@@YAHQEAPEADQEAPEAPEAD@Z 0000000180041968     libucrt:argv_wildcards.obj
- 0004:00001974       $pdata$??$copy_and_add_argument_to_buffer@D@@YAHQEBD0_KAEAV?$argument_list@D@?A0xca0879c4@@@Z 0000000180041974     libucrt:argv_wildcards.obj
- 0004:00001980       $pdata$??$expand_argument_wildcards@D@@YAHQEAD0AEAV?$argument_list@D@?A0xca0879c4@@@Z 0000000180041980     libucrt:argv_wildcards.obj
- 0004:0000198c       $pdata$?expand_if_necessary@?$argument_list@D@?A0xca0879c4@@AEAAHXZ 000000018004198c     libucrt:argv_wildcards.obj
- 0004:00001998       $pdata$??$?RV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@V<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@$$QEAV<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@Z 0000000180041998     libucrt:mbctype.obj
- 0004:000019a4       $pdata$??R<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@QEBAXXZ 00000001800419a4     libucrt:mbctype.obj
- 0004:000019b0       $pdata$?getSystemCP@@YAHH@Z 00000001800419b0     libucrt:mbctype.obj
- 0004:000019bc       $pdata$?setSBCS@@YAXPEAU__crt_multibyte_data@@@Z 00000001800419bc     libucrt:mbctype.obj
- 0004:000019c8       $pdata$?setSBUpLow@@YAXPEAU__crt_multibyte_data@@@Z 00000001800419c8     libucrt:mbctype.obj
- 0004:000019d4       $pdata$?setmbcp_internal@@YAHH_N@Z 00000001800419d4     libucrt:mbctype.obj
- 0004:000019e0       $pdata$__acrt_initialize_multibyte 00000001800419e0     libucrt:mbctype.obj
- 0004:000019ec       $pdata$__acrt_update_thread_multibyte_data 00000001800419ec     libucrt:mbctype.obj
- 0004:000019f8       $pdata$_setmbcp_nolock     00000001800419f8     libucrt:mbctype.obj
- 0004:00001a04       $pdata$__acrt_initialize_command_line 0000000180041a04     libucrt:argv_data.obj
- 0004:00001a10       $pdata$__dcrt_get_narrow_environment_from_os 0000000180041a10     libucrt:get_environment_from_os.obj
- 0004:00001a1c       $pdata$_recalloc_base      0000000180041a1c     libucrt:recalloc.obj
- 0004:00001a28       $pdata$__acrt_execute_initializers 0000000180041a28     libucrt:shared_initialization.obj
- 0004:00001a34       $pdata$__acrt_execute_uninitializers 0000000180041a34     libucrt:shared_initialization.obj
- 0004:00001a40       $pdata$__acrt_invoke_user_matherr 0000000180041a40     libucrt:matherr.obj
- 0004:00001a4c       $pdata$__acrt_free_locale  0000000180041a4c     libucrt:locale_refcounting.obj
- 0004:00001a58       $pdata$__acrt_locale_free_lc_time_if_unreferenced 0000000180041a58     libucrt:locale_refcounting.obj
- 0004:00001a64       $pdata$__acrt_release_locale_ref 0000000180041a64     libucrt:locale_refcounting.obj
- 0004:00001a70       $pdata$__acrt_update_thread_locale_data 0000000180041a70     libucrt:locale_refcounting.obj
- 0004:00001a7c       $pdata$_updatetlocinfoEx_nolock 0000000180041a7c     libucrt:locale_refcounting.obj
- 0004:00001a88       $pdata$__acrt_fp_strflt_to_string 0000000180041a88     libucrt:_fptostr.obj
- 0004:00001a94       $pdata$__acrt_fltout       0000000180041a94     libucrt:cfout.obj
- 0004:00001aa0       $pdata$_fcloseall          0000000180041aa0     libucrt:closeall.obj
- 0004:00001aac       $pdata$__acrt_stdio_flush_nolock 0000000180041aac     libucrt:fflush.obj
- 0004:00001ab8       $pdata$_fflush_nolock      0000000180041ab8     libucrt:fflush.obj
- 0004:00001ac4       $pdata$common_flush_all    0000000180041ac4     libucrt:fflush.obj
- 0004:00001ad0       $pdata$__acrt_stdio_free_buffer_nolock 0000000180041ad0     libucrt:_freebuf.obj
- 0004:00001adc       $pdata$_isatty             0000000180041adc     libucrt:isatty.obj
- 0004:00001ae8       $pdata$__acrt_locale_free_monetary 0000000180041ae8     libucrt:initmon.obj
- 0004:00001af4       $pdata$__acrt_locale_initialize_monetary 0000000180041af4     libucrt:initmon.obj
- 0004:00001b00       $pdata$__acrt_locale_free_numeric 0000000180041b00     libucrt:initnum.obj
- 0004:00001b0c       $pdata$__acrt_locale_initialize_numeric 0000000180041b0c     libucrt:initnum.obj
- 0004:00001b18       $pdata$?free_crt_array_internal@@YAXQEAPEBX_K@Z 0000000180041b18     libucrt:inittime.obj
- 0004:00001b24       $pdata$?initialize_lc_time@@YA_NQEAU__crt_lc_time_data@@QEAU__crt_locale_data@@@Z 0000000180041b24     libucrt:inittime.obj
- 0004:00001b30       $pdata$__acrt_locale_free_time 0000000180041b30     libucrt:inittime.obj
- 0004:00001b3c       $pdata$__acrt_locale_initialize_time 0000000180041b3c     libucrt:inittime.obj
- 0004:00001b48       $pdata$wcscat_s            0000000180041b48     libucrt:wcscat_s.obj
- 0004:00001b54       $pdata$wcsncpy_s           0000000180041b54     libucrt:wcsncpy_s.obj
- 0004:00001b60       $pdata$GetLocaleNameFromDefault 0000000180041b60     libucrt:get_qualified_locale.obj
- 0004:00001b6c       $pdata$GetLocaleNameFromLangCountry 0000000180041b6c     libucrt:get_qualified_locale.obj
- 0004:00001b78       $pdata$GetLocaleNameFromLanguage 0000000180041b78     libucrt:get_qualified_locale.obj
- 0004:00001b84       $pdata$LangCountryEnumProcEx 0000000180041b84     libucrt:get_qualified_locale.obj
- 0004:00001b90       $pdata$LanguageEnumProcEx  0000000180041b90     libucrt:get_qualified_locale.obj
- 0004:00001b9c       $pdata$ProcessCodePage     0000000180041b9c     libucrt:get_qualified_locale.obj
- 0004:00001ba8       $pdata$TestDefaultCountry  0000000180041ba8     libucrt:get_qualified_locale.obj
- 0004:00001bb4       $pdata$TranslateName       0000000180041bb4     libucrt:get_qualified_locale.obj
- 0004:00001bc0       $pdata$__acrt_get_qualified_locale 0000000180041bc0     libucrt:get_qualified_locale.obj
- 0004:00001bcc       $pdata$CountryEnumProc     0000000180041bcc     libucrt:getqloc_downlevel.obj
- 0004:00001bd8       $pdata$GetLcidFromLangCountry 0000000180041bd8     libucrt:getqloc_downlevel.obj
- 0004:00001be4       $pdata$GetLcidFromLanguage 0000000180041be4     libucrt:getqloc_downlevel.obj
- 0004:00001bf0       $pdata$LangCountryEnumProc 0000000180041bf0     libucrt:getqloc_downlevel.obj
- 0004:00001bfc       $pdata$LanguageEnumProc    0000000180041bfc     libucrt:getqloc_downlevel.obj
- 0004:00001c08       $pdata$ProcessCodePage     0000000180041c08     libucrt:getqloc_downlevel.obj
- 0004:00001c14       $pdata$TestDefaultLanguage 0000000180041c14     libucrt:getqloc_downlevel.obj
- 0004:00001c20       $pdata$TranslateName       0000000180041c20     libucrt:getqloc_downlevel.obj
- 0004:00001c2c       $pdata$__acrt_get_qualified_locale_downlevel 0000000180041c2c     libucrt:getqloc_downlevel.obj
- 0004:00001c38       $pdata$__acrt_lowio_create_handle_array 0000000180041c38     libucrt:osfinfo.obj
- 0004:00001c44       $pdata$__acrt_lowio_destroy_handle_array 0000000180041c44     libucrt:osfinfo.obj
- 0004:00001c50       $pdata$__acrt_lowio_ensure_fh_exists 0000000180041c50     libucrt:osfinfo.obj
- 0004:00001c5c       $pdata$_free_osfhnd        0000000180041c5c     libucrt:osfinfo.obj
- 0004:00001c68       $pdata$_get_osfhandle      0000000180041c68     libucrt:osfinfo.obj
- 0004:00001c80       $pdata$?GetTableIndexFromLocaleName@@YAHPEB_W@Z 0000000180041c80     libucrt:lcidtoname_downlevel.obj
- 0004:00001c8c       $pdata$__acrt_DownlevelLCIDToLocaleName 0000000180041c8c     libucrt:lcidtoname_downlevel.obj
- 0004:00001c98       $pdata$__acrt_DownlevelLocaleNameToLCID 0000000180041c98     libucrt:lcidtoname_downlevel.obj
- 0004:00001ca4       $pdata$strncpy_s           0000000180041ca4     libucrt:strncpy_s.obj
- 0004:00001cb0       $pdata$_getfpcontrolword   0000000180041cb0     libucrt:_fenvutils.obj
- 0004:00001cbc       $pdata$_getfpstatusword    0000000180041cbc     libucrt:_fenvutils.obj
- 0004:00001cc8       $pdata$_setfpstatusword    0000000180041cc8     libucrt:_fenvutils.obj
- 0004:00001cd4       $pdata$_call_matherr       0000000180041cd4     libucrt:libm_error.obj
- 0004:00001ce0       $pdata$_exception_enabled  0000000180041ce0     libucrt:libm_error.obj
- 0004:00001cec       $pdata$_handle_error       0000000180041cec     libucrt:libm_error.obj
- 0004:00001cf8       $pdata$_handle_errorf      0000000180041cf8     libucrt:libm_error.obj
- 0004:00001d04       $pdata$_towlower_l         0000000180041d04     libucrt:towlower.obj
- 0004:00001d10       $pdata$?shortsort@@YAXPEAD0_KP6AHPEBX2@Z@Z 0000000180041d10     libucrt:qsort.obj
- 0004:00001d1c       $pdata$2$?shortsort@@YAXPEAD0_KP6AHPEBX2@Z@Z 0000000180041d1c     libucrt:qsort.obj
- 0004:00001d28       $pdata$3$?shortsort@@YAXPEAD0_KP6AHPEBX2@Z@Z 0000000180041d28     libucrt:qsort.obj
- 0004:00001d34       $pdata$qsort               0000000180041d34     libucrt:qsort.obj
- 0004:00001d40       $pdata$4$qsort             0000000180041d40     libucrt:qsort.obj
- 0004:00001d4c       $pdata$5$qsort             0000000180041d4c     libucrt:qsort.obj
- 0004:00001d58       $pdata$strpbrk             0000000180041d58     libucrt:strpbrk.obj
- 0004:00001d64       $pdata$_mbsdec_l           0000000180041d64     libucrt:mbsdec.obj
- 0004:00001d70       $pdata$?initialize_multibyte@@YAHXZ 0000000180041d70     libucrt:multibyte_initializer.obj
- 0004:00001d7c       $pdata$_msize              0000000180041d7c     libucrt:msize.obj
- 0004:00001d88       $pdata$fegetenv            0000000180041d88     libucrt:fegetenv.obj
- 0004:00001d94       $pdata$fesetenv            0000000180041d94     libucrt:fesetenv.obj
- 0004:00001da0       $pdata$feholdexcept        0000000180041da0     libucrt:feholdexcept.obj
- 0004:00001db8       $pdata$?write_double_translated_ansi_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 0000000180041db8     libucrt:write.obj
- 0004:00001dc4       $pdata$?write_text_ansi_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 0000000180041dc4     libucrt:write.obj
- 0004:00001dd0       $pdata$?write_text_utf16le_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 0000000180041dd0     libucrt:write.obj
- 0004:00001ddc       $pdata$?write_text_utf8_nolock@@YA?AUwrite_result@?A0x9c548279@@HQEBDI@Z 0000000180041ddc     libucrt:write.obj
- 0004:00001de8       $pdata$_write              0000000180041de8     libucrt:write.obj
- 0004:00001df4       $pdata$_write_nolock       0000000180041df4     libucrt:write.obj
- 0004:00001e00       $pdata$??$common_lseek_nolock@_J@@YA_JH_JH@Z 0000000180041e00     libucrt:lseek.obj
- 0004:00001e0c       $pdata$_fclose_nolock      0000000180041e0c     libucrt:fclose.obj
- 0004:00001e18       $pdata$fclose              0000000180041e18     libucrt:fclose.obj
- 0004:00001e24       $pdata$??$?RV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@V<lambda_314360699dd331753a4119843814e9a7>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@$$QEAV<lambda_314360699dd331753a4119843814e9a7>@@@Z 0000000180041e24     libucrt:commit.obj
- 0004:00001e30       $pdata$_commit             0000000180041e30     libucrt:commit.obj
- 0004:00001e3c       $pdata$??$common_xtox@K_W@@YAHKQEA_W_KI_N@Z 0000000180041e3c     libucrt:xtoa.obj
- 0004:00001e48       $pdata$??$common_xtox_s@K_W@@YAHKQEA_W_KI_N@Z 0000000180041e48     libucrt:xtoa.obj
- 0004:00001e54       $pdata$_itow_s             0000000180041e54     libucrt:xtoa.obj
- 0004:00001e60       $pdata$_wcsnicmp           0000000180041e60     libucrt:wcsnicmp.obj
- 0004:00001e6c       $pdata$_wcsnicmp_l         0000000180041e6c     libucrt:wcsnicmp.obj
- 0004:00001e78       $pdata$_clearfp            0000000180041e78     libucrt:ieee.obj
- 0004:00001e84       $pdata$common_control87    0000000180041e84     libucrt:ieee.obj
- 0004:00001e90       $pdata$__acrt_LCMapStringW 0000000180041e90     libucrt:lcmapstringw.obj
- 0004:00001e9c       $pdata$_log10_special      0000000180041e9c     libucrt:log_special.obj
- 0004:00001ea8       $pdata$_log_special_common 0000000180041ea8     libucrt:log_special.obj
- 0004:00001eb4       $pdata$_putwch_nolock      0000000180041eb4     libucrt:putwch.obj
- 0004:00001ec0       $pdata$??$?RV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@V<lambda_237c231691f317818eb88cc1d5d642d6>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@$$QEAV<lambda_237c231691f317818eb88cc1d5d642d6>@@@Z 0000000180041ec0     libucrt:close.obj
- 0004:00001ecc       $pdata$_close              0000000180041ecc     libucrt:close.obj
- 0004:00001ed8       $pdata$_close_nolock       0000000180041ed8     libucrt:close.obj
- 0004:00001ee4       $pdata$__dcrt_lowio_initialize_console_output 0000000180041ee4     libucrt:initcon.obj
- 0004:00001ef0       $pdata$__dcrt_terminate_console_output 0000000180041ef0     libucrt:initcon.obj
- 0004:00001efc       $pdata$?DloadAcquireSectionWriteAccess@@YAXXZ 0000000180041efc     DelayImp:delayhlp.obj
- 0004:00001f08       $pdata$?DloadGetSRWLockFunctionPointers@@YAEXZ 0000000180041f08     DelayImp:delayhlp.obj
- 0004:00001f14       $pdata$?DloadMakePermanentImageCommit@@YAXPEAX_K@Z 0000000180041f14     DelayImp:delayhlp.obj
- 0004:00001f20       $pdata$?DloadObtainSection@@YAPEAXPEAK0@Z 0000000180041f20     DelayImp:delayhlp.obj
- 0004:00001f2c       $pdata$?DloadProtectSection@@YAXKPEAK@Z 0000000180041f2c     DelayImp:delayhlp.obj
- 0004:00001f38       $pdata$?DloadReleaseSectionWriteAccess@@YAXXZ 0000000180041f38     DelayImp:delayhlp.obj
- 0004:00001f44       $pdata$__delayLoadHelper2  0000000180041f44     DelayImp:delayhlp.obj
- 0004:00001f50       $pdata$_IsNonwritableInCurrentImage 0000000180041f50     LIBCMT:pesect.obj
- 0004:00001f5c       $pdata$strrchr             0000000180041f5c     libvcruntime:strrchr.obj
- 0004:00001f68       $pdata$wcschr              0000000180041f68     libvcruntime:wcschr.obj
- 0004:00001f80       $pdata$__scrt_is_nonwritable_in_current_image$filt$0 0000000180041f80     LIBCMT:utility.obj
- 0004:00001f8c       $pdata$?fin$0@?0??dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z@4HA 0000000180041f8c     LIBCMT:dll_dllmain.obj
- 0004:00001f98       $pdata$?fin$0@?0??dllmain_crt_process_detach@@YAH_N@Z@4HA 0000000180041f98     LIBCMT:dll_dllmain.obj
- 0004:00001fa4       $pdata$?filt$0@?0??dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z@4HA 0000000180041fa4     LIBCMT:dll_dllmain.obj
- 0004:00001fb0       $pdata$__CxxCallCatchBlock$filt$0 0000000180041fb0     libvcruntime:frame.obj
- 0004:00001fbc       $pdata$__CxxCallCatchBlock$fin$1 0000000180041fbc     libvcruntime:frame.obj
- 0004:00001fc8       $pdata$__DestructExceptionObject$filt$0 0000000180041fc8     libvcruntime:frame.obj
- 0004:00001fd4       $pdata$__FrameUnwindToState$filt$0 0000000180041fd4     libvcruntime:frame.obj
- 0004:00001fe0       $pdata$__FrameUnwindToState$fin$1 0000000180041fe0     libvcruntime:frame.obj
- 0004:00001fec       $pdata$_CallSETranslator$filt$0 0000000180041fec     libvcruntime:trnsctrl.obj
- 0004:00001ff8       $pdata$setlocale$fin$0     0000000180041ff8     libucrt:setlocale.obj
- 0004:00002004       $pdata$_query_new_handler$fin$0 0000000180042004     libucrt:new_handler.obj
- 0004:00002010       $pdata$?filt$0@?0??common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z@4HA 0000000180042010     libucrt:exit.obj
- 0004:0000201c       $pdata$?fin$1@?0??common_exit@@YAXHW4_crt_exit_cleanup_mode@@W4_crt_exit_return_mode@@@Z@4HA 000000018004201c     libucrt:exit.obj
- 0004:00002028       $pdata$?fin$0@?0???$?RV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@V<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_e24bbb7b643b32fcea6fa61b31d4c984>@@AEAV<lambda_275893d493268fdec8709772e3fcec0e>@@$$QEAV<lambda_9d71df4d7cf3f480f8d633942495c3b0>@@@Z@4HA 0000000180042028     libucrt:onexit.obj
- 0004:00002034       $pdata$?fin$0@?0???$?RV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@V<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b8c45f8f788dd370798f47cfe8ac3a86>@@AEAV<lambda_4e60a939b0d047cfe11ddc22648dfba9>@@$$QEAV<lambda_332c3edc96d0294ec56c57d38c1cdfd5>@@@Z@4HA 0000000180042034     libucrt:onexit.obj
- 0004:00002034       $pdata$?fin$0@?0???$?RV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@V<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_46352004c1216016012b18bd6f87e700>@@AEAV<lambda_3bd07e1a1191394380780325891bf33f>@@$$QEAV<lambda_334532d3f185bcaa59b5be82d7d22bff>@@@Z@4HA 0000000180042034     libucrt:per_thread_data.obj
- 0004:00002034       $pdata$?fin$0@?0???$?RV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@V<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_72d1df2b273a38828b1ce30cbf4cdab5>@@AEAV<lambda_876a65b173b8412d3a47c70a915b0cf4>@@$$QEAV<lambda_41932305e351933ebe8f8be3ed8bb5dc>@@@Z@4HA 0000000180042034     libucrt:per_thread_data.obj
- 0004:00002034       $pdata$?fin$0@?0???$?RV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@V<lambda_341c25c0346d94847f1f3c463c57e077>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5e887d1dcbef67a5eb4283622ba103bf>@@AEAV<lambda_4466841279450cc726390878d4a41900>@@$$QEAV<lambda_341c25c0346d94847f1f3c463c57e077>@@@Z@4HA 0000000180042034     libucrt:per_thread_data.obj
- 0004:00002034       $pdata$?fin$0@?0???$?RV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@V<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_99476a1ad63dd22509b5d3e65b0ffc95>@@AEAV<lambda_ad1ced32f4ac17aa236e5ef05d6b3b7c>@@$$QEAV<lambda_f7424dd8d45958661754dc4f2697e9c3>@@@Z@4HA 0000000180042034     libucrt:mbctype.obj
- 0004:00002034       $pdata$?fin$0@?0???$?RV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@V<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@$$QEAV<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@Z@4HA 0000000180042034     libucrt:winapi_thunks.obj
- 0004:00002034       $pdata$?fin$0@?0???$?RV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@V<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@?$__crt_seh_guarded_call@P6AXH@Z@@QEAAP6AXH@Z$$QEAV<lambda_c36588078e9f5dfd39652860aa6b3aaf>@@AEAV<lambda_ec61778202f4f5fc7e7711acc23c3bca>@@$$QEAV<lambda_dc9d2797ccde5d239b4a0efae8ebd7db>@@@Z@4HA 0000000180042034     libucrt:signal.obj
- 0004:00002034       $pdata$?fin$0@?0???$?RV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@V<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_d67e8342c384adda8f857579ab50b2ae>@@AEAV<lambda_30712929f77e709619002f448b6a9510>@@$$QEAV<lambda_4525336fd7e478d965fb7ca7a337cad8>@@@Z@4HA 0000000180042034     libucrt:wsetlocale.obj
- 0004:00002034       $pdata$?fin$0@?0???$?RV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@V<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_fb3a7dec4e47f37f22dae91bb15c9095>@@AEAV<lambda_698284760c8add0bfb0756c19673e34b>@@$$QEAV<lambda_dfb8eca1e75fef3034a8fb18dd509707>@@@Z@4HA 0000000180042034     libucrt:per_thread_data.obj
- 0004:00002040       $pdata$raise$fin$0         0000000180042040     libucrt:signal.obj
- 0004:0000204c       $pdata$?fin$0@?0???$?RV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@?$__crt_seh_guarded_call@X@@QEAAX$$QEAV<lambda_5df02c53a8f32f81fd64e5bbb78039f1>@@AEAV<lambda_2af78c5f5901b1372d98f9ab3177dfa6>@@AEAV<lambda_f51fe5fd7c79a33db34fc9310f277369>@@@Z@4HA 000000018004204c     libucrt:wsetlocale.obj
- 0004:00002058       $pdata$__acrt_initialize_lowio$fin$0 0000000180042058     libucrt:ioinit.obj
- 0004:00002058       $pdata$__acrt_lowio_ensure_fh_exists$fin$0 0000000180042058     libucrt:osfinfo.obj
- 0004:00002064       $pdata$_ctrlfp$filt$0      0000000180042064     libucrt:fpctrl.obj
- 0004:00002064       $pdata$common_control87$filt$0 0000000180042064     libucrt:ieee.obj
- 0004:00002070       $pdata$__acrt_update_thread_multibyte_data$fin$0 0000000180042070     libucrt:mbctype.obj
- 0004:0000207c       $pdata$__acrt_update_thread_locale_data$fin$0 000000018004207c     libucrt:locale_refcounting.obj
- 0004:0000207c       $pdata$__acrt_uninitialize_locale$fin$0 000000018004207c     libucrt:wsetlocale.obj
- 0004:00002088       $pdata$_fcloseall$fin$0    0000000180042088     libucrt:closeall.obj
- 0004:00002094       $pdata$common_flush_all$fin$0 0000000180042094     libucrt:fflush.obj
- 0004:000020a0       $pdata$common_flush_all$fin$1 00000001800420a0     libucrt:fflush.obj
- 0004:000020ac       $pdata$_write$fin$0        00000001800420ac     libucrt:write.obj
- 0004:000020b8       $pdata$fclose$fin$0        00000001800420b8     libucrt:fclose.obj
- 0004:000020c4       $pdata$?fin$0@?0???$?RV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@V<lambda_237c231691f317818eb88cc1d5d642d6>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_bfedae4ebbf01fab1bb6dcc6a9e276e0>@@AEAV<lambda_2fe9b910cf3cbf4a0ab98a02ba45b3ec>@@$$QEAV<lambda_237c231691f317818eb88cc1d5d642d6>@@@Z@4HA 00000001800420c4     libucrt:close.obj
- 0004:000020c4       $pdata$?fin$0@?0???$?RV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@V<lambda_314360699dd331753a4119843814e9a7>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_b521505b218e5242e90febf6bfebc422>@@AEAV<lambda_6978c1fb23f02e42e1d9e99668cc68aa>@@$$QEAV<lambda_314360699dd331753a4119843814e9a7>@@@Z@4HA 00000001800420c4     libucrt:commit.obj
- 0004:000020d0       $pdata$_IsNonwritableInCurrentImage$filt$0 00000001800420d0     LIBCMT:pesect.obj
- 0004:000020dc       $pdata$??__Fresult@?1??getStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 00000001800420dc     node_printer_win.obj
- 0004:000020e8       $pdata$??__Fresult@?1??getJobStatusMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 00000001800420e8     node_printer_win.obj
- 0004:000020f4       $pdata$??__Fresult@?1??getAttributeMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 00000001800420f4     node_printer_win.obj
- 0004:00002100       $pdata$??__Fresult@?1??getJobCommandMap@?A0xcb87c0d3@@YAAEBV?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@K@std@@@2@@std@@XZ@YAXXZ 0000000180042100     node_printer_win.obj
- 0004:0000210c       $pdata$??__F_Fac_tidy_reg@std@@YAXXZ 000000018004210c     libcpmt:locale0.obj
- 0004:00002118       $pdata$??__Fclassic_locale@std@@YAXXZ 0000000180042118     libcpmt:locale0.obj
- 0004:00002124       $pdata$??__Finit_atexit@@YAXXZ 0000000180042124     libcpmt:iosptrs.obj
- 0005:00000000       __guard_fids__             0000000180043000     libucrt:initialization.obj
- 0005:00000060       __guard_fids___acrt_initialize_ptd 0000000180043060     libucrt:per_thread_data.obj
- 0005:00000064       __guard_fids__             0000000180043064     libucrt:wsetlocale.obj
- 0005:0000007c       __guard_fids_??$?RV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@V<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@?$__crt_seh_guarded_call@H@@QEAAH$$QEAV<lambda_630b2aca97f6d20d5b5ea6529ea6b6af>@@AEAV<lambda_af91936f1d075d609f72d9d8cba980af>@@$$QEAV<lambda_e82fa975f615b5c7c7b0e4d178fdae67>@@@Z 000000018004307c     libucrt:winapi_thunks.obj
- 0005:00000080       __guard_fids_??$expand_argument_wildcards@D@@YAHQEAD0AEAV?$argument_list@D@?A0xca0879c4@@@Z 0000000180043080     libucrt:argv_wildcards.obj
- 0005:00000084       __guard_fids__             0000000180043084     libucrt:stdio_initializer.obj
- 0005:00000088       __guard_fids__             0000000180043088     libucrt:stdio_initializer.obj
- 0005:0000008c       __guard_fids__             000000018004308c     libucrt:locale_initializer.obj
- 0005:00000090       __guard_fids_GetLocaleNameFromLangCountry 0000000180043090     libucrt:get_qualified_locale.obj
- 0005:00000094       __guard_fids_GetLocaleNameFromLanguage 0000000180043094     libucrt:get_qualified_locale.obj
- 0005:00000098       __guard_fids___acrt_get_qualified_locale_downlevel 0000000180043098     libucrt:getqloc_downlevel.obj
- 0005:0000009c       __guard_fids_GetLcidFromLangCountry 000000018004309c     libucrt:getqloc_downlevel.obj
- 0005:000000a0       __guard_fids_GetLcidFromLanguage 00000001800430a0     libucrt:getqloc_downlevel.obj
- 0005:000000a4       __guard_fids__             00000001800430a4     libucrt:fma3_initializer.obj
- 0005:000000a8       __guard_fids__             00000001800430a8     libucrt:timeset_initializer.obj
- 0005:000000ac       __guard_fids__             00000001800430ac     libucrt:multibyte_initializer.obj
- 0005:000000b0       __guard_fids__             00000001800430b0     libucrt:console_output_initializer.obj
- 0005:000000b4       __guard_fids__             00000001800430b4     libcpmt:xthrow.obj
- 0005:000000bc       __guard_fids__             00000001800430bc     libcpmt:xthrow.obj
- 0005:000000c4       __guard_fids__             00000001800430c4     libcpmt:xthrow.obj
- 0005:000000cc       __guard_fids__             00000001800430cc     libcpmt:xthrow.obj
- 0005:000000d4       __guard_fids__             00000001800430d4     libcpmt:xthrow.obj
- 0005:000000dc       __guard_fids__             00000001800430dc     libcpmt:xthrow.obj
- 0005:000000e4       __guard_fids_??__Einitlocks@std@@YAXXZ 00000001800430e4     libcpmt:xlock.obj
- 0005:000000e8       __guard_fids__             00000001800430e8     libcpmt:xlock.obj
- 0005:000000ec       __guard_fids_??__E_Fac_tidy_reg@std@@YAXXZ 00000001800430ec     libcpmt:locale0.obj
- 0005:000000f0       __guard_fids_?_Setgloballocale@locale@std@@CAXPEAX@Z 00000001800430f0     libcpmt:locale0.obj
- 0005:000000f4       __guard_fids_??__Eclassic_locale@std@@YAXXZ 00000001800430f4     libcpmt:locale0.obj
- 0005:000000f8       __guard_fids__             00000001800430f8     libcpmt:locale0.obj
- 0005:00000104       __guard_fids__             0000000180043104     libcpmt:locale0.obj
- 0005:00000110       __guard_fids__             0000000180043110     libcpmt:locale0.obj
- 0005:00000114       __guard_fids__             0000000180043114     libcpmt:locale0.obj
- 0005:00000118       __guard_fids_??__Einitlocks@std@@YAXXZ 0000000180043118     libcpmt:iosptrs.obj
- 0005:0000011c       __guard_fids_??__Einit_atexit@@YAXXZ 000000018004311c     libcpmt:iosptrs.obj
- 0005:00000120       __guard_fids__             0000000180043120     libcpmt:iosptrs.obj
- 0005:00000124       __guard_fids__             0000000180043124     libcpmt:iosptrs.obj
- 0005:00000128       __guard_fids__             0000000180043128     libcpmt:locale.obj
- 0005:00000154       __guard_fids__             0000000180043154     libcpmt:locale.obj
- 0005:00000180       __guard_fids__             0000000180043180     libcpmt:locale.obj
- 0005:000001a0       __guard_fids__             00000001800431a0     libcpmt:winapisupp.obj
- 0005:000001a4       __guard_fids__             00000001800431a4     LIBCMT:thread_safe_statics.obj
- 0005:000001a8       __guard_fids_?__scrt_initialize_thread_safe_statics@@YAHXZ 00000001800431a8     LIBCMT:thread_safe_statics.obj
- 0005:000001ac       __guard_fids_?dllmain_crt_process_attach@@YAHQEAUHINSTANCE__@@QEAX@Z 00000001800431ac     LIBCMT:dll_dllmain.obj
- 0005:000001b4       __guard_fids_?dllmain_dispatch@@YAHQEAUHINSTANCE__@@KQEAX@Z 00000001800431b4     LIBCMT:dll_dllmain.obj
- 0005:000001b8       __guard_fids__             00000001800431b8     LIBCMT:std_type_info_static.obj
- 0005:000001bc       __guard_fids__             00000001800431bc     LIBCMT:throw_bad_alloc.obj
- 0005:000001c4       __guard_fids__             00000001800431c4     LIBCMT:guard_support.obj
- 0005:000001c8       __guard_fids__             00000001800431c8     libvcruntime:frame.obj
- 0005:000001cc       __guard_fids__             00000001800431cc     libvcruntime:frame.obj
- 0005:000001d4       __guard_fids__UnwindNestedFrames 00000001800431d4     libvcruntime:trnsctrl.obj
- 0005:000001d8       __guard_fids___vcrt_initialize_ptd 00000001800431d8     libvcruntime:per_thread_data.obj
- 0007:00000060       $R000000                   0000000180045060     * linker generated manifest res *
-
- Exports
-
-  ordinal    name
-
-        1    _register_node_printer_
diff --git a/js/Windows/node_modules/printer/build/Release/node_printer.node b/js/Windows/node_modules/printer/build/Release/node_printer.node
deleted file mode 100644
index f413ca429a33f04ddc07bf9bf50b4e9c7769f4a0..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/node_printer.node and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/node_printer.pdb b/js/Windows/node_modules/printer/build/Release/node_printer.pdb
deleted file mode 100644
index b2e484c512779ec07727a422130aa22cf1d467b2..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/node_printer.pdb and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.obj b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.obj
deleted file mode 100644
index a2402b018c0bd237adaf01655abf47e63d7dd29d..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.obj and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/CL.command.1.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/CL.command.1.tlog
deleted file mode 100644
index b7d1fc11c0472d97070473049d9c0e4016fb8b40..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/CL.command.1.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/CL.read.1.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/CL.read.1.tlog
deleted file mode 100644
index b7032804aab2eefe77dcea20d6fd97bcec434ff6..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/CL.read.1.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/CL.write.1.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/CL.write.1.tlog
deleted file mode 100644
index 8f9cf9aee5298d847c4213f77d89e01c9390d27e..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/CL.write.1.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.1.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.1.tlog
deleted file mode 100644
index 5214df0fe6e074f95e9a5fef30b4b28a25c5640e..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.1.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.26.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.26.tlog
deleted file mode 100644
index 076dfc5027dc22933ef787dcc0260db970359ff4..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.26.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.32.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.32.tlog
deleted file mode 100644
index 2fba6b4e2945a511b2014739e5c33f4b1551a738..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.32.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.54.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.54.tlog
deleted file mode 100644
index e4dac989364c5c8fae5d2188f6f448c1ab20c9e9..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.54.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.63.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.63.tlog
deleted file mode 100644
index 47c4867b032564d952da5ff3c04f9e5f8d413faf..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.63.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.9.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.9.tlog
deleted file mode 100644
index b3ca9c082465062c0c4ff8a241b7efd89f0be818..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.delete.9.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.1.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.1.tlog
deleted file mode 100644
index e2afb2e754eb1f8a74c2f2b6d2b248705d6bc8c7..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.1.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.12.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.12.tlog
deleted file mode 100644
index 254a35ebbb5c00c01824bcb7cfefde19007f76fe..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.12.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.13.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.13.tlog
deleted file mode 100644
index cdab2cc96651b0203f34d59f479a68900aa1ef0a..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.13.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.23.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.23.tlog
deleted file mode 100644
index 2ab643673fc833924524386e0456e5d26e043fa6..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.23.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.26.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.26.tlog
deleted file mode 100644
index 17237783f866f9aa05f77e006f689c55a563c32a..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.26.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.32.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.32.tlog
deleted file mode 100644
index 216519bd6c73872a5896a998e1babe01e2337127..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.32.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.34.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.34.tlog
deleted file mode 100644
index 216519bd6c73872a5896a998e1babe01e2337127..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.34.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.42.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.42.tlog
deleted file mode 100644
index 216519bd6c73872a5896a998e1babe01e2337127..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.42.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.50.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.50.tlog
deleted file mode 100644
index 9abf0e7e98de3692c91f99d62e8c4e5c3f7a151e..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.50.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.54.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.54.tlog
deleted file mode 100644
index 17237783f866f9aa05f77e006f689c55a563c32a..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.54.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.59.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.59.tlog
deleted file mode 100644
index 216519bd6c73872a5896a998e1babe01e2337127..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.59.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.61.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.61.tlog
deleted file mode 100644
index be11c6038b6db6674e12dc957471ccf64a0adb71..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.61.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.63.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.63.tlog
deleted file mode 100644
index 17237783f866f9aa05f77e006f689c55a563c32a..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.63.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.7.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.7.tlog
deleted file mode 100644
index 216519bd6c73872a5896a998e1babe01e2337127..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.7.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.9.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.9.tlog
deleted file mode 100644
index bde41df17a3d04d8cb55409581fd6bb1e7ab8b67..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.read.9.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.1.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.1.tlog
deleted file mode 100644
index ccfab473ddaa61b5ae81fa76fc65b52308683e66..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.1.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.23.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.23.tlog
deleted file mode 100644
index 17237783f866f9aa05f77e006f689c55a563c32a..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.23.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.26.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.26.tlog
deleted file mode 100644
index e6f6f407832d84244005f5a6d806e056506cefd0..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.26.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.32.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.32.tlog
deleted file mode 100644
index 6629b7cea29250b6aaff990ff35620993d358b4d..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.32.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.50.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.50.tlog
deleted file mode 100644
index 17237783f866f9aa05f77e006f689c55a563c32a..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.50.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.54.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.54.tlog
deleted file mode 100644
index 17237783f866f9aa05f77e006f689c55a563c32a..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.54.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.63.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.63.tlog
deleted file mode 100644
index 17237783f866f9aa05f77e006f689c55a563c32a..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.63.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.9.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.9.tlog
deleted file mode 100644
index 5ee427a04c199bd366581523a78fc300052e2c5a..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link-VCTIP.write.9.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link.command.1.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link.command.1.tlog
deleted file mode 100644
index ae3d4bfb524a6ed72aaa0b4d1c8e805f442a0d15..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link.command.1.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link.read.1.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link.read.1.tlog
deleted file mode 100644
index f631af6d42b6abffad3a7c35f51db6f7fdff267b..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link.read.1.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link.write.1.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link.write.1.tlog
deleted file mode 100644
index 1f7f5eb88484f00b79112a76e3893dbabe65e2af..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/link.write.1.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/node_printer.lastbuildstate b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/node_printer.lastbuildstate
deleted file mode 100644
index 9be324a1c5eccfbe5ed58ab8155a26750054ac13..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/node_printer.lastbuildstate
+++ /dev/null
@@ -1,2 +0,0 @@
-#TargetFrameworkVersion=v4.0:PlatformToolSet=v140:EnableManagedIncrementalBuild=false:VCToolArchitecture=Native64Bit:WindowsTargetPlatformVersion=8.1
-Release|x64|C:\MIT\fablab\PrintServer\node_modules\printer\build\|
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/node_printer.write.1u.tlog b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/node_printer.write.1u.tlog
deleted file mode 100644
index 045cb44427dbf275f303985353a5a98da370bd30..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer.tlog/node_printer.write.1u.tlog and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer_win.obj b/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer_win.obj
deleted file mode 100644
index 69a2112a2a5f2e901a4a4979fb5d5dec4d0ca306..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/node_printer_win.obj and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/vc140.pdb b/js/Windows/node_modules/printer/build/Release/obj/node_printer/vc140.pdb
deleted file mode 100644
index 2fe0c3af78ad201dfa8b371023eeb0c87c753c53..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/vc140.pdb and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/Release/obj/node_printer/win_delay_load_hook.obj b/js/Windows/node_modules/printer/build/Release/obj/node_printer/win_delay_load_hook.obj
deleted file mode 100644
index fa1d6797f2ddc12e9daa6bfbf4dd050d78b5873a..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/build/Release/obj/node_printer/win_delay_load_hook.obj and /dev/null differ
diff --git a/js/Windows/node_modules/printer/build/binding.sln b/js/Windows/node_modules/printer/build/binding.sln
deleted file mode 100644
index 7bc372c77991471b16fa31b1ded3e872aa1f9b2d..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/build/binding.sln
+++ /dev/null
@@ -1,19 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 2015
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "node_printer", "node_printer.vcxproj", "{479619E1-3F18-84AF-58FB-0830178CAA6B}"
-EndProject
-Global
-	GlobalSection(SolutionConfigurationPlatforms) = preSolution
-		Debug|x64 = Debug|x64
-		Release|x64 = Release|x64
-	EndGlobalSection
-	GlobalSection(ProjectConfigurationPlatforms) = postSolution
-		{479619E1-3F18-84AF-58FB-0830178CAA6B}.Debug|x64.ActiveCfg = Debug|x64
-		{479619E1-3F18-84AF-58FB-0830178CAA6B}.Debug|x64.Build.0 = Debug|x64
-		{479619E1-3F18-84AF-58FB-0830178CAA6B}.Release|x64.ActiveCfg = Release|x64
-		{479619E1-3F18-84AF-58FB-0830178CAA6B}.Release|x64.Build.0 = Release|x64
-	EndGlobalSection
-	GlobalSection(SolutionProperties) = preSolution
-		HideSolutionNode = FALSE
-	EndGlobalSection
-EndGlobal
diff --git a/js/Windows/node_modules/printer/build/config.gypi b/js/Windows/node_modules/printer/build/config.gypi
deleted file mode 100644
index 21d6d83adedb84854558ff0d28693709fb7d86ca..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/build/config.gypi
+++ /dev/null
@@ -1,152 +0,0 @@
-# Do not edit. File was generated by node-gyp's "configure" step
-{
-  "target_defaults": {
-    "cflags": [],
-    "default_configuration": "Release",
-    "defines": [],
-    "include_dirs": [],
-    "libraries": []
-  },
-  "variables": {
-    "asan": 0,
-    "coverage": "false",
-    "debug_devtools": "node",
-    "force_dynamic_crt": 0,
-    "host_arch": "x64",
-    "icu_data_file": "icudt58l.dat",
-    "icu_data_in": "..\\..\\deps/icu-small\\source/data/in\\icudt58l.dat",
-    "icu_endianness": "l",
-    "icu_gyp_path": "tools/icu/icu-generic.gyp",
-    "icu_locales": "en,root",
-    "icu_path": "deps/icu-small",
-    "icu_small": "true",
-    "icu_ver_major": "58",
-    "node_byteorder": "little",
-    "node_enable_d8": "false",
-    "node_enable_v8_vtunejit": "false",
-    "node_install_npm": "true",
-    "node_module_version": 48,
-    "node_no_browser_globals": "false",
-    "node_prefix": "/usr/local",
-    "node_release_urlbase": "https://nodejs.org/download/release/",
-    "node_shared": "false",
-    "node_shared_cares": "false",
-    "node_shared_http_parser": "false",
-    "node_shared_libuv": "false",
-    "node_shared_openssl": "false",
-    "node_shared_zlib": "false",
-    "node_tag": "",
-    "node_use_bundled_v8": "true",
-    "node_use_dtrace": "false",
-    "node_use_etw": "true",
-    "node_use_lttng": "false",
-    "node_use_openssl": "true",
-    "node_use_perfctr": "true",
-    "node_use_v8_platform": "true",
-    "openssl_fips": "",
-    "openssl_no_asm": 0,
-    "shlib_suffix": "so.48",
-    "target_arch": "x64",
-    "v8_enable_gdbjit": 0,
-    "v8_enable_i18n_support": 1,
-    "v8_inspector": "true",
-    "v8_no_strict_aliasing": 1,
-    "v8_optimized_debug": 0,
-    "v8_random_seed": 0,
-    "v8_use_snapshot": "true",
-    "want_separate_host_toolset": 0,
-    "nodedir": "C:\\Users\\hll\\.node-gyp\\6.10.3",
-    "copy_dev_lib": "true",
-    "standalone_static_library": 1,
-    "access": "",
-    "also": "",
-    "always_auth": "",
-    "bin_links": "true",
-    "browser": "",
-    "ca": "",
-    "cache": "C:\\Users\\hll\\AppData\\Roaming\\npm-cache",
-    "cache_lock_retries": "10",
-    "cache_lock_stale": "60000",
-    "cache_lock_wait": "10000",
-    "cache_max": "Infinity",
-    "cache_min": "10",
-    "cert": "",
-    "color": "true",
-    "depth": "Infinity",
-    "description": "true",
-    "dev": "",
-    "dry_run": "",
-    "editor": "notepad.exe",
-    "engine_strict": "",
-    "fetch_retries": "2",
-    "fetch_retry_factor": "10",
-    "fetch_retry_maxtimeout": "60000",
-    "fetch_retry_mintimeout": "10000",
-    "force": "",
-    "git": "git",
-    "git_tag_version": "true",
-    "global": "",
-    "globalconfig": "C:\\Users\\hll\\AppData\\Roaming\\npm\\etc\\npmrc",
-    "globalignorefile": "C:\\Users\\hll\\AppData\\Roaming\\npm\\etc\\npmignore",
-    "global_style": "",
-    "group": "",
-    "heading": "npm",
-    "https_proxy": "",
-    "if_present": "",
-    "ignore_scripts": "",
-    "init_author_email": "",
-    "init_author_name": "",
-    "init_author_url": "",
-    "init_license": "ISC",
-    "init_module": "C:\\Users\\hll\\.npm-init.js",
-    "init_version": "1.0.0",
-    "json": "",
-    "key": "",
-    "legacy_bundling": "",
-    "link": "",
-    "local_address": "",
-    "long": "",
-    "maxsockets": "50",
-    "message": "%s",
-    "node_version": "6.10.3",
-    "npat": "",
-    "onload_script": "",
-    "only": "",
-    "optional": "true",
-    "parseable": "",
-    "prefix": "C:\\Users\\hll\\AppData\\Roaming\\npm",
-    "production": "",
-    "progress": "true",
-    "proprietary_attribs": "true",
-    "rebuild_bundle": "true",
-    "registry": "https://registry.npmjs.org/",
-    "rollback": "true",
-    "save": "true",
-    "save_bundle": "",
-    "save_dev": "",
-    "save_exact": "",
-    "save_optional": "",
-    "save_prefix": "^",
-    "scope": "",
-    "searchexclude": "",
-    "searchopts": "",
-    "searchsort": "name",
-    "shell": "C:\\windows\\system32\\cmd.exe",
-    "shrinkwrap": "true",
-    "sign_git_tag": "",
-    "strict_ssl": "true",
-    "tag": "latest",
-    "tag_version_prefix": "v",
-    "tmp": "C:\\Users\\hll\\AppData\\Local\\Temp",
-    "umask": "0000",
-    "unicode": "",
-    "unsafe_perm": "true",
-    "usage": "",
-    "user": "",
-    "userconfig": "C:\\Users\\hll\\.npmrc",
-    "user_agent": "npm/3.10.10 node/v6.10.3 win32 x64",
-    "version": "",
-    "versions": "",
-    "viewer": "browser"
-  }
-}
diff --git a/js/Windows/node_modules/printer/build/node_printer.vcxproj b/js/Windows/node_modules/printer/build/node_printer.vcxproj
deleted file mode 100644
index f1e594b32e6c1aab055f9aa66050d76b822a30df..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/build/node_printer.vcxproj
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{479619E1-3F18-84AF-58FB-0830178CAA6B}</ProjectGuid>
-    <Keyword>Win32Proj</Keyword>
-    <RootNamespace>node_printer</RootNamespace>
-    <IgnoreWarnCompileDuplicatedFilename>true</IgnoreWarnCompileDuplicatedFilename>
-    <PreferredToolArchitecture>x64</PreferredToolArchitecture>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props"/>
-  <PropertyGroup Label="Configuration">
-    <ConfigurationType>DynamicLibrary</ConfigurationType>
-  </PropertyGroup>
-  <PropertyGroup Label="Locals">
-    <PlatformToolset>v140</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props"/>
-  <Import Project="$(VCTargetsPath)\BuildCustomizations\masm.props"/>
-  <ImportGroup Label="ExtensionSettings"/>
-  <ImportGroup Label="PropertySheets">
-    <Import Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props"/>
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros"/>
-  <PropertyGroup>
-    <ExecutablePath>$(ExecutablePath);$(MSBuildProjectDirectory)\..\bin\;$(MSBuildProjectDirectory)\..\bin\</ExecutablePath>
-    <IgnoreImportLibrary>true</IgnoreImportLibrary>
-    <IntDir>$(Configuration)\obj\$(ProjectName)\</IntDir>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
-    <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
-    <OutDir>$(SolutionDir)$(Configuration)\</OutDir>
-    <TargetExt Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.node</TargetExt>
-    <TargetExt Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.node</TargetExt>
-    <TargetExt Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.node</TargetExt>
-    <TargetExt Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.node</TargetExt>
-    <TargetName>$(ProjectName)</TargetName>
-    <TargetPath>$(OutDir)\$(ProjectName).node</TargetPath>
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>C:\Users\hll\.node-gyp\6.10.3\include\node;C:\Users\hll\.node-gyp\6.10.3\src;C:\Users\hll\.node-gyp\6.10.3\deps\uv\include;C:\Users\hll\.node-gyp\6.10.3\deps\v8\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <CompileAsWinRT>false</CompileAsWinRT>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <DisableSpecificWarnings>4267;4351;4355;4800;4251;%(DisableSpecificWarnings)</DisableSpecificWarnings>
-      <ExceptionHandling>false</ExceptionHandling>
-      <MinimalRebuild>false</MinimalRebuild>
-      <OmitFramePointers>false</OmitFramePointers>
-      <Optimization>Disabled</Optimization>
-      <PrecompiledHeader>NotUsing</PrecompiledHeader>
-      <PreprocessorDefinitions>NODE_GYP_MODULE_NAME=node_printer;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;BUILDING_NODE_EXTENSION;DEBUG;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
-      <StringPooling>true</StringPooling>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TreatWarningAsError>false</TreatWarningAsError>
-      <WarningLevel>Level3</WarningLevel>
-    </ClCompile>
-    <Link>
-      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;&quot;C:\Users\hll\.node-gyp\6.10.3\$(Configuration)\node.lib&quot;</AdditionalDependencies>
-      <AdditionalOptions>/ignore:4199 %(AdditionalOptions)</AdditionalOptions>
-      <AllowIsolation>true</AllowIsolation>
-      <DataExecutionPrevention>true</DataExecutionPrevention>
-      <DelayLoadDLLs>iojs.exe;node.exe;%(DelayLoadDLLs)</DelayLoadDLLs>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <GenerateMapFile>true</GenerateMapFile>
-      <MapExports>true</MapExports>
-      <OutputFile>$(OutDir)$(ProjectName).node</OutputFile>
-      <RandomizedBaseAddress>true</RandomizedBaseAddress>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetExt>.node</TargetExt>
-      <TargetMachine>MachineX64</TargetMachine>
-    </Link>
-    <ResourceCompile>
-      <AdditionalIncludeDirectories>C:\Users\hll\.node-gyp\6.10.3\include\node;C:\Users\hll\.node-gyp\6.10.3\src;C:\Users\hll\.node-gyp\6.10.3\deps\uv\include;C:\Users\hll\.node-gyp\6.10.3\deps\v8\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>NODE_GYP_MODULE_NAME=node_printer;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;BUILDING_NODE_EXTENSION;DEBUG;_DEBUG;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ResourceCompile>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <ClCompile>
-      <AdditionalIncludeDirectories>C:\Users\hll\.node-gyp\6.10.3\include\node;C:\Users\hll\.node-gyp\6.10.3\src;C:\Users\hll\.node-gyp\6.10.3\deps\uv\include;C:\Users\hll\.node-gyp\6.10.3\deps\v8\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <AdditionalOptions>/MP %(AdditionalOptions)</AdditionalOptions>
-      <BufferSecurityCheck>true</BufferSecurityCheck>
-      <CompileAsWinRT>false</CompileAsWinRT>
-      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
-      <DisableSpecificWarnings>4267;4351;4355;4800;4251;%(DisableSpecificWarnings)</DisableSpecificWarnings>
-      <ExceptionHandling>false</ExceptionHandling>
-      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
-      <FunctionLevelLinking>true</FunctionLevelLinking>
-      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
-      <IntrinsicFunctions>true</IntrinsicFunctions>
-      <OmitFramePointers>true</OmitFramePointers>
-      <Optimization>Full</Optimization>
-      <PrecompiledHeader>NotUsing</PrecompiledHeader>
-      <PreprocessorDefinitions>NODE_GYP_MODULE_NAME=node_printer;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;BUILDING_NODE_EXTENSION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
-      <RuntimeTypeInfo>false</RuntimeTypeInfo>
-      <StringPooling>true</StringPooling>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TreatWarningAsError>false</TreatWarningAsError>
-      <WarningLevel>Level3</WarningLevel>
-      <WholeProgramOptimization>true</WholeProgramOptimization>
-    </ClCompile>
-    <Lib>
-      <AdditionalOptions>/LTCG %(AdditionalOptions)</AdditionalOptions>
-    </Lib>
-    <Link>
-      <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;DelayImp.lib;&quot;C:\Users\hll\.node-gyp\6.10.3\$(Configuration)\node.lib&quot;</AdditionalDependencies>
-      <AdditionalOptions>/ignore:4199 %(AdditionalOptions)</AdditionalOptions>
-      <AllowIsolation>true</AllowIsolation>
-      <DataExecutionPrevention>true</DataExecutionPrevention>
-      <DelayLoadDLLs>iojs.exe;node.exe;%(DelayLoadDLLs)</DelayLoadDLLs>
-      <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <GenerateMapFile>true</GenerateMapFile>
-      <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
-      <MapExports>true</MapExports>
-      <OptimizeReferences>true</OptimizeReferences>
-      <OutputFile>$(OutDir)$(ProjectName).node</OutputFile>
-      <RandomizedBaseAddress>true</RandomizedBaseAddress>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetExt>.node</TargetExt>
-      <TargetMachine>MachineX64</TargetMachine>
-    </Link>
-    <ResourceCompile>
-      <AdditionalIncludeDirectories>C:\Users\hll\.node-gyp\6.10.3\include\node;C:\Users\hll\.node-gyp\6.10.3\src;C:\Users\hll\.node-gyp\6.10.3\deps\uv\include;C:\Users\hll\.node-gyp\6.10.3\deps\v8\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <PreprocessorDefinitions>NODE_GYP_MODULE_NAME=node_printer;USING_UV_SHARED=1;USING_V8_SHARED=1;V8_DEPRECATION_WARNINGS=1;WIN32;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_HAS_EXCEPTIONS=0;BUILDING_NODE_EXTENSION;%(PreprocessorDefinitions);%(PreprocessorDefinitions)</PreprocessorDefinitions>
-    </ResourceCompile>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <None Include="..\binding.gyp"/>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\src\node_printer.cc"/>
-    <ClCompile Include="..\src\node_printer_win.cc"/>
-    <ClCompile Include="C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\src\win_delay_load_hook.cc"/>
-    <ClCompile Include="..\src\node_printer_posix.cc">
-      <ExcludedFromBuild>true</ExcludedFromBuild>
-    </ClCompile>
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets"/>
-  <Import Project="$(VCTargetsPath)\BuildCustomizations\masm.targets"/>
-  <ImportGroup Label="ExtensionTargets"/>
-</Project>
diff --git a/js/Windows/node_modules/printer/build/node_printer.vcxproj.filters b/js/Windows/node_modules/printer/build/node_printer.vcxproj.filters
deleted file mode 100644
index 05b21337e59b3920e549f6affb18b3f3d5361eea..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/build/node_printer.vcxproj.filters
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup>
-    <Filter Include="..">
-      <UniqueIdentifier>{739DB09A-CC57-A953-A6CF-F64FA08E4FA7}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="..\src">
-      <UniqueIdentifier>{8CDEE807-BC53-E450-C8B8-4DEBB66742D4}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="..">
-      <UniqueIdentifier>{739DB09A-CC57-A953-A6CF-F64FA08E4FA7}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="..\src">
-      <UniqueIdentifier>{8CDEE807-BC53-E450-C8B8-4DEBB66742D4}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="C:">
-      <UniqueIdentifier>{7B735499-E5DD-1C2B-6C26-70023832A1CF}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="C:\Program Files">
-      <UniqueIdentifier>{92EF4BA8-6BC2-65D1-451F-28EBD4AE726A}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="C:\Program Files\nodejs">
-      <UniqueIdentifier>{A3C8E949-BCF6-0C67-6656-340A2A097708}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="C:\Program Files\nodejs\node_modules">
-      <UniqueIdentifier>{56DF7A98-063D-FB9D-485C-089023B4C16A}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="C:\Program Files\nodejs\node_modules\npm">
-      <UniqueIdentifier>{741E0E76-39B2-B1AB-9FA1-F1A20B16F295}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="C:\Program Files\nodejs\node_modules\npm\node_modules">
-      <UniqueIdentifier>{56DF7A98-063D-FB9D-485C-089023B4C16A}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp">
-      <UniqueIdentifier>{77348C0E-2034-7791-74D5-63C077DF5A3B}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\src">
-      <UniqueIdentifier>{8CDEE807-BC53-E450-C8B8-4DEBB66742D4}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="..">
-      <UniqueIdentifier>{739DB09A-CC57-A953-A6CF-F64FA08E4FA7}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="..">
-      <UniqueIdentifier>{739DB09A-CC57-A953-A6CF-F64FA08E4FA7}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="..\src">
-      <UniqueIdentifier>{8CDEE807-BC53-E450-C8B8-4DEBB66742D4}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="..\src\_excluded_files">
-      <UniqueIdentifier>{158E591E-B6EA-0C85-8F5A-18EAFA09B4CE}</UniqueIdentifier>
-    </Filter>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\src\node_printer.cc">
-      <Filter>..\src</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\node_printer_win.cc">
-      <Filter>..\src</Filter>
-    </ClCompile>
-    <ClCompile Include="C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\src\win_delay_load_hook.cc">
-      <Filter>C:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\src</Filter>
-    </ClCompile>
-    <None Include="..\binding.gyp">
-      <Filter>..</Filter>
-    </None>
-    <ClCompile Include="..\src\node_printer_posix.cc">
-      <Filter>..\src\_excluded_files</Filter>
-    </ClCompile>
-  </ItemGroup>
-</Project>
diff --git a/js/Windows/node_modules/printer/examples/cancelJob.js b/js/Windows/node_modules/printer/examples/cancelJob.js
deleted file mode 100644
index ae1e80a0e6ace05a2f867f1b8ca07287c0e683f7..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/examples/cancelJob.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var printer = require("../lib"),
-    util = require('util'),
-    printerName = 'Foxit Reader PDF Printer',
-    printerFormat = 'TEXT';
-
-printer.printDirect({
-    data:"print from Node.JS buffer", // or simple String: "some text"
-	printer:printerName, // printer name
-	type: printerFormat, // type: RAW, TEXT, PDF, JPEG, .. depends on platform
-    options: // supported page sizes may be retrieved using getPrinterDriverOptions, supports CUPS printing options
-    {
-        media: 'Letter',
-        'fit-to-page': true
-    },
-	success:function(jobID){
-		console.log("sent to printer with ID: "+jobID);
-        var jobInfo = printer.getJob(printerName, jobID);
-        console.log("current job info:"+util.inspect(jobInfo, {depth: 10, colors:true}));
-        if(jobInfo.status.indexOf('PRINTED') !== -1)
-        {
-            console.log('too late, already printed');
-            return;
-        }
-        console.log('cancelling...');
-        var is_ok = printer.setJob(printerName, jobID, 'CANCEL');
-		console.log("cancelled: "+is_ok);
-		try{
-			console.log("current job info:"+util.inspect(printer.getJob(printerName, jobID), {depth: 10, colors:true}));
-		}catch(err){
-			console.log('job deleted. err:'+err);
-		}
-	},
-	error:function(err){console.log(err);}
-});
diff --git a/js/Windows/node_modules/printer/examples/example_zebra_printer.js b/js/Windows/node_modules/printer/examples/example_zebra_printer.js
deleted file mode 100644
index 6f0d3de730820cac854f603369c7ef8680b2482a..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/examples/example_zebra_printer.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var printer = require("../lib")
-	, template = "N\nS4\nD15\nq400\nR\nB20,10,0,1,2,30,173,B,\"barcode\"\nP0\n";
-
-function printZebra(barcode_text, printer_name){
-	printer.printDirect({data:template.replace(/barcode/, barcode_text)
-		, printer:printer_name
-		, type: "RAW"
-		, success:function(){
-			console.log("printed: "+barcode_text);
-		}
-		, error:function(err){console.log(err);}
-	});
-}
-
-printZebra("123", "ZEBRA");
diff --git a/js/Windows/node_modules/printer/examples/getDefaultPrinterName.js b/js/Windows/node_modules/printer/examples/getDefaultPrinterName.js
deleted file mode 100644
index ffae4b44bf5067a876c2ff0fde0b48fe4c569580..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/examples/getDefaultPrinterName.js
+++ /dev/null
@@ -1,4 +0,0 @@
-var printer = require("../lib");
-
-console.log('default printer name: ' + (printer.getDefaultPrinterName() || 'is not defined on your computer'));
-
diff --git a/js/Windows/node_modules/printer/examples/getPrinterDriverOptions.js b/js/Windows/node_modules/printer/examples/getPrinterDriverOptions.js
deleted file mode 100644
index b0eacd7d78f80b824c3d4f00dcd0f037c11ab236..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/examples/getPrinterDriverOptions.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var printer = require("../lib"),
-    util = require('util'),
-    printers = printer.getPrinters();
-
-printers.forEach(function(iPrinter, i){
-    console.log('' + i + 'ppd for printer "' + iPrinter.name + '":' + util.inspect(printer.getPrinterDriverOptions(iPrinter.name), {colors:true, depth:10} ));
-    console.log('\tselected page size:'+ printer.getSelectedPaperSize(iPrinter.name) + '\n');
-});
-
diff --git a/js/Windows/node_modules/printer/examples/getPrinters.js b/js/Windows/node_modules/printer/examples/getPrinters.js
deleted file mode 100644
index 4c43a2f5a4ad1c1a62712043b24412c573bfb84f..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/examples/getPrinters.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var printer = require("../lib"),
-    util = require('util');
-console.log("installed printers:\n"+util.inspect(printer.getPrinters(), {colors:true, depth:10}));
diff --git a/js/Windows/node_modules/printer/examples/getSupportedFormats.js b/js/Windows/node_modules/printer/examples/getSupportedFormats.js
deleted file mode 100644
index c307fb6bad327922dfc6c4ee67a9b936795f76b2..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/examples/getSupportedFormats.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var printer = require("../lib"),
-    util = require('util');
-console.log("supported formats are:\n"+util.inspect(printer.getSupportedPrintFormats(), {colors:true, depth:10}));
diff --git a/js/Windows/node_modules/printer/examples/getSupportedJobCommands.js b/js/Windows/node_modules/printer/examples/getSupportedJobCommands.js
deleted file mode 100644
index e34883b1a91661a2a3be1d1ee7d1b63ff2fdb240..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/examples/getSupportedJobCommands.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var printer = require("../lib"), //=require('pritner')
-    util = require('util');
-console.log("supported job commands:\n"+util.inspect(printer.getSupportedJobCommands(), {colors:true, depth:10}));
diff --git a/js/Windows/node_modules/printer/examples/printFile.js b/js/Windows/node_modules/printer/examples/printFile.js
deleted file mode 100644
index 6f292e5f0d37c0e9e645ca49336ec3acbe54b565..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/examples/printFile.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// use: node printFile.js [filePath printerName]
-var printer = require("../lib"),
-    filename = process.argv[2] || __filename;
-
-console.log('platform:', process.platform);
-console.log('try to print file: ' + filename);
-
-if( process.platform != 'win32') {
-  printer.printFile({filename:filename,
-    printer: process.env[3], // printer name, if missing then will print to default printer
-    success:function(jobID){
-      console.log("sent to printer with ID: "+jobID);
-    },
-    error:function(err){
-      console.log(err);
-    }
-  });
-} else {
-  // not yet implemented, use printDirect and text
-  var fs = require('fs');
-  printer.printDirect({data:fs.readFileSync(filename),
-    printer: process.env[3], // printer name, if missing then will print to default printer
-    success:function(jobID){
-      console.log("sent to printer with ID: "+jobID);
-    },
-    error:function(err){
-      console.log(err);
-    }
-  });
-}
diff --git a/js/Windows/node_modules/printer/examples/printPDFFileInBuffer.js b/js/Windows/node_modules/printer/examples/printPDFFileInBuffer.js
deleted file mode 100644
index 8dd3fe463026b7b08241a57bc6539af8b51ae69e..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/examples/printPDFFileInBuffer.js
+++ /dev/null
@@ -1,37 +0,0 @@
-// Windows does not support PDF formats, but you can use imagemagick-native to achieve conversion from PDF to EMF.
-
-var printer = require("../lib"),
-    fs = require('fs'),
-    path = require('path'),
-    filename = process.argv[2],
-    printername = process.argv[3];
-
-if(process.platform == 'win32') {
-    throw 'Not yet supported for win32'
-}
-
-if(!filename || filename == '-h') {
-    throw 'PDF file name is missing. Please use the following params: <filename> [printername]'
-}
-
-filename = path.resolve(process.cwd(), filename);
-console.log('printing file name ' + filename);
-
-fs.readFile(filename, function(err, data){
-  if(err) {
-    console.error('err:' + err);
-    return;
-  }
-  console.log('data type is: '+typeof(data) + ', is buffer: ' + Buffer.isBuffer(data));
-    printer.printDirect({
-        data: data,
-        type: 'PDF',
-        success: function(id) {
-            console.log('printed with id ' + id);
-        },
-        error: function(err) {
-            console.error('error on printing: ' + err);
-        }
-    })
-});
-
diff --git a/js/Windows/node_modules/printer/examples/printPDFInWindows.js b/js/Windows/node_modules/printer/examples/printPDFInWindows.js
deleted file mode 100644
index ea04276044e7bd0059b982177c80d1689f1d14e9..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/examples/printPDFInWindows.js
+++ /dev/null
@@ -1,52 +0,0 @@
-// Windows does not support PDF formats, but you can use imagemagick-native to achieve conversion from PDF to EMF.
-
-var printer = require("../lib"),
-    imagemagick, // will be loaded later with proper error.
-    fs = require('fs'),
-    filename = process.argv[2],
-    printername = process.argv[2];
-
-if(process.platform !== 'win32') {
-    throw 'This application can be run only on win32 as a demo of print PDF image'
-}
-
-if(!filename) {
-    throw 'PDF file name is missing. Please use the following params: <filename> [printername]'
-}
-
-try {
-    imagemagick = require('imagemagick-native');
-} catch(e) {
-    throw 'please install imagemagick-native: `npm install imagemagick-native`'
-}
-
-var data = fs.readFileSync(filename);
-
-console.log('data: ' + data.toString().substr(0, 20));
-
-//console.log(imagemagick.identify({srcData: data}));
-
-// First convert PDF into
-imagemagick.convert({
-    srcData: data,
-    srcFormat: 'PDF',
-    format: 'EMF',
-}, function(err, buffer) {
-    if (err) {
-        throw 'something went wrong on converting to EMF: ' + err;
-    }
-
-    // Now we have EMF file, send it to printer as EMF format
-    printer.printDirect({
-        data: buffer,
-        type: 'EMF',
-        success: function(id) {
-            console.log('printed with id ' + id);
-        },
-        error: function(err) {
-            console.error('error on printing: ' + err);
-        }
-    })
-})
-
-
diff --git a/js/Windows/node_modules/printer/examples/print_raw.js b/js/Windows/node_modules/printer/examples/print_raw.js
deleted file mode 100644
index 03358b4387225ed20581480120185d3b93d45a87..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/examples/print_raw.js
+++ /dev/null
@@ -1,10 +0,0 @@
-var printer = require("../lib");
-
-printer.printDirect({data:"print from Node.JS buffer" // or simple String: "some text"
-	//, printer:'Foxit Reader PDF Printer' // printer name, if missing then will print to default printer
-	, type: 'RAW' // type: RAW, TEXT, PDF, JPEG, .. depends on platform
-	, success:function(jobID){
-		console.log("sent to printer with ID: "+jobID);
-	}
-	, error:function(err){console.log(err);}
-});
diff --git a/js/Windows/node_modules/printer/examples/test.pdf b/js/Windows/node_modules/printer/examples/test.pdf
deleted file mode 100644
index d12fd1e57f5a315c4df3338786273118b3cd28b3..0000000000000000000000000000000000000000
Binary files a/js/Windows/node_modules/printer/examples/test.pdf and /dev/null differ
diff --git a/js/Windows/node_modules/printer/lib/index.js b/js/Windows/node_modules/printer/lib/index.js
deleted file mode 100644
index a75d0bc2d4af86d72fafe6016d9c2259730cbded..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/lib/index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./printer');
\ No newline at end of file
diff --git a/js/Windows/node_modules/printer/lib/printer.js b/js/Windows/node_modules/printer/lib/printer.js
deleted file mode 100644
index bcffd3541dd3d732c9c1b0171cb6bcca044894f1..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/lib/printer.js
+++ /dev/null
@@ -1,324 +0,0 @@
-var printer_helper = {},
-    fs = require("fs"),
-    child_process = require("child_process"),
-    os = require("os"),
-    path = require("path"),
-    native_lib_path = path.join(__dirname, '../build/Release/node_printer.node'),
-    printer_helper;
-
-if(fs.existsSync(native_lib_path)) {
-    printer_helper = require(native_lib_path);
-} else {
-    printer_helper = require('./node_printer_'+process.platform+'_'+process.arch+'.node');
-}
-
-/** Return all installed printers including active jobs
- */
-module.exports.getPrinters = getPrinters;
-
-/** send data to printer
- */
-module.exports.printDirect = printDirect;
-
-/// send file to printer
-module.exports.printFile = printFile;
-
-/** Get supported print format for printDirect
- */
-module.exports.getSupportedPrintFormats = printer_helper.getSupportedPrintFormats;
-
-/**
- * Get possible job command for setJob. It depends on os.
- * @return Array of string. e.g.: DELETE, PAUSE, RESUME
- */
-module.exports.getSupportedJobCommands = printer_helper.getSupportedJobCommands;
-
-/** get printer info object. It includes all active jobs
- */
-module.exports.getPrinter = getPrinter;
-module.exports.getSelectedPaperSize = getSelectedPaperSize;
-module.exports.getPrinterDriverOptions = getPrinterDriverOptions;
-
-/// Return default printer name
-module.exports.getDefaultPrinterName = getDefaultPrinterName;
-
-/** get printer job info object
- */
-module.exports.getJob = getJob;
-module.exports.setJob = setJob;
-
-/**
- * return user defined printer, according to https://www.cups.org/documentation.php/doc-2.0/api-cups.html#cupsGetDefault2 :
- * "Applications should use the cupsGetDests and cupsGetDest functions to get the user-defined default printer,
- * as this function does not support the lpoptions-defined default printer"
- */
-function getDefaultPrinterName() {
-  var printerName = printer_helper.getDefaultPrinterName();
-  if(printerName) {
-    return printerName;
-  }
-
-  // seems correct posix behaviour
-  var printers= getPrinters();
-  for(i in printers) {
-    var printer = printers[i];
-    if(printer.isDefault === true) {
-      return printer.name;
-    }
-  }
-
-  // printer not found, return nothing(undefined)
-}
-
-/** Get printer info with jobs
- * @param printerName printer name to extract the info
- * @return printer object info:
- *		TODO: to enum all possible attributes
- */
-function getPrinter(printerName)
-{
-    if(!printerName) {
-        printerName = getDefaultPrinterName();
-    }
-    var printer = printer_helper.getPrinter(printerName);
-    correctPrinterinfo(printer);
-    return printer;
-}
-
-/** Get printer driver options includes advanced options like supported paper size
- * @param printerName printer name to extract the info (default printer used if printer is not provided)
- * @return printer driver info:
- */
-function getPrinterDriverOptions(printerName)
-{
-    if(!printerName) {
-        printerName = getDefaultPrinterName();
-    }
-
-    return printer_helper.getPrinterDriverOptions(printerName);
-}
-
-/** Finds selected paper size pertaining to the specific printer out of all supported ones in driver_options
- * @param printerName printer name to extract the info (default printer used if printer is not provided)
- * @return selected paper size
- */
-function getSelectedPaperSize(printerName){
-    var driver_options = getPrinterDriverOptions(printerName);
-    var selectedSize = "";
-    if (driver_options && driver_options.PageSize) {
-        Object.keys(driver_options.PageSize).forEach(function(key){
-            if (driver_options.PageSize[key])
-                selectedSize = key;
-        });
-    }
-    return selectedSize;
-}
-
-function getJob(printerName, jobId)
-{
-    return printer_helper.getJob(printerName, jobId);
-}
-
-function setJob(printerName, jobId, command)
-{
-    return printer_helper.setJob(printerName, jobId, command);
-}
-
-function getPrinters(){
-    var printers = printer_helper.getPrinters();
-    for(i in printers){
-        correctPrinterinfo(printers[i]);
-    }
-    return printers;
-}
-
-function correctPrinterinfo(printer) {
-    if(printer.status || !printer.options || !printer.options['printer-state']){
-        return;
-    }
-
-    var status = printer.options['printer-state'];
-    // Add posix status
-    if(status == '3'){
-        status = 'IDLE'
-    }
-    else if(status == '4'){
-        status = 'PRINTING'
-    }
-    else if(status == '5'){
-        status = 'STOPPED'
-    }
-
-    // correct date type
-    var k;
-    for(k in printer.options) {
-        if(/time$/.test(k) && printer.options[k] && !(printer.options[k] instanceof Date)) {
-            printer.options[k] = new Date(printer.options[k] * 1000);
-        }
-    }
-
-    printer.status = status;
-}
-
-/*
- print raw data. This function is intend to be asynchronous
-
- parameters:
- parameters - Object, parameters objects with the following structure:
- data - String, mandatory, data to printer
- printer - String, optional, name of the printer, if missing, will try to print to default printer
- docname - String, optional, name of document showed in printer status
- type - String, optional, only for wind32, data type, one of the RAW, TEXT
- options - JS object with CUPS options, optional
- success - Function, optional, callback function
- error - Function, optional, callback function if exists any error
-
- or
-
- data - String, mandatory, data to printer
- printer - String, optional, name of the printer, if missing, will try to print to default printer
- docname - String, optional, name of document showed in printer status
- type - String, optional, data type, one of the RAW, TEXT
- options - JS object with CUPS options, optional
- success - Function, optional, callback function with first argument job_id
- error - Function, optional, callback function if exists any error
- */
-function printDirect(parameters){
-    var data = parameters
-        , printer
-        , docname
-        , type
-        , options
-        , success
-        , error;
-
-    if(arguments.length==1){
-        //TODO: check parameters type
-        //if (typeof parameters )
-        data = parameters.data;
-        printer = parameters.printer;
-        docname = parameters.docname;
-        type = parameters.type;
-        options = parameters.options||{};
-        success = parameters.success;
-        error = parameters.error;
-    }else{
-        printer = arguments[1];
-        type = arguments[2];
-        docname = arguments[3];
-        options = arguments[4];
-        success = arguments[5];
-        error = arguments[6];
-    }
-
-    if(!type){
-        type = "RAW";
-    }
-
-    // Set default printer name
-    if(!printer) {
-        printer = getDefaultPrinterName();
-    }
-
-    type = type.toUpperCase();
-
-    if(!docname){
-        docname = "node print job";
-    }
-
-    if (!options){
-        options = {};
-    }
-
-    //TODO: check parameters type
-    if(printer_helper.printDirect){// call C++ binding
-        try{
-            var res = printer_helper.printDirect(data, printer, docname, type, options);
-            if(res){
-                success(res);
-            }else{
-                error(Error("Something wrong in printDirect"));
-            }
-        }catch (e){
-            error(e);
-        }
-    }else{
-        error("Not supported");
-    }
-}
-
-/**
-parameters:
-   parameters - Object, parameters objects with the following structure:
-      filename - String, mandatory, data to printer
-      docname - String, optional, name of document showed in printer status
-      printer - String, optional, mane of the printer, if missed, will try to retrieve the default printer name
-      success - Function, optional, callback function
-      error - Function, optional, callback function if exists any error
-*/
-function printFile(parameters){
-    var filename,
-        docname,
-        printer,
-        options,
-        success,
-        error;
-
-    if((arguments.length !== 1) || (typeof(parameters) !== 'object')){
-        throw new Error('must provide arguments object');
-    }
-
-    filename = parameters.filename;
-    docname = parameters.docname;
-    printer = parameters.printer;
-    options = parameters.options || {};
-    success = parameters.success;
-    error = parameters.error;
-
-    if(!success){
-        success = function(){};
-    }
-
-    if(!error){
-        error = function(err){
-            throw err;
-        };
-    }
-
-    if(!filename){
-        var err = new Error('must provide at least a filename');
-        return error(err);
-    }
-
-    // try to define default printer name
-    if(!printer) {
-        printer = getDefaultPrinterName();
-    }
-
-    if(!printer) {
-        return error(new Error('Printer parameter of default printer is not defined'));
-    }
-
-    // set filename if docname is missing
-    if(!docname){
-        docname = filename;
-    }
-
-    //TODO: check parameters type
-    if(printer_helper.printFile){// call C++ binding
-        try{
-            // TODO: proper success/error callbacks from the extension
-            var res = printer_helper.printFile(filename, docname, printer, options);
-
-            if(!isNaN(parseInt(res))) {
-                success(res);
-            } else {
-                error(Error(res));
-            }
-        } catch (e) {
-            error(e);
-        }
-    } else {
-        error("Not supported");
-    }
-}
diff --git a/js/Windows/node_modules/printer/package.json b/js/Windows/node_modules/printer/package.json
deleted file mode 100644
index 62de88f4c42f66cfd63df177fa02c0edbd88494a..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/package.json
+++ /dev/null
@@ -1,107 +0,0 @@
-{
-  "_args": [
-    [
-      {
-        "raw": "printer",
-        "scope": null,
-        "escapedName": "printer",
-        "name": "printer",
-        "rawSpec": "",
-        "spec": "latest",
-        "type": "tag"
-      },
-      "C:\\MIT\\fablab\\PrintServer"
-    ]
-  ],
-  "_from": "printer@latest",
-  "_id": "printer@0.2.2",
-  "_inCache": true,
-  "_location": "/printer",
-  "_nodeVersion": "5.2.0",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/printer-0.2.2.tgz_1473484407703_0.04797186842188239"
-  },
-  "_npmUser": {
-    "name": "ionlupascu",
-    "email": "ionlupascu@gmail.com"
-  },
-  "_npmVersion": "3.10.5",
-  "_phantomChildren": {},
-  "_requested": {
-    "raw": "printer",
-    "scope": null,
-    "escapedName": "printer",
-    "name": "printer",
-    "rawSpec": "",
-    "spec": "latest",
-    "type": "tag"
-  },
-  "_requiredBy": [
-    "#USER",
-    "/"
-  ],
-  "_resolved": "https://registry.npmjs.org/printer/-/printer-0.2.2.tgz",
-  "_shasum": "830b8f5c97b97fd9b464d4f4e105d43337792296",
-  "_shrinkwrap": null,
-  "_spec": "printer",
-  "_where": "C:\\MIT\\fablab\\PrintServer",
-  "author": {
-    "name": "Ion Lupascu",
-    "email": "ionlupascu@gmail.com",
-    "url": "http://program-support.co.uk/"
-  },
-  "bugs": {
-    "url": "https://github.com/tojocky/node-printer/issues"
-  },
-  "contributors": [
-    {
-      "name": "Name Lastname",
-      "email": "email@server.com"
-    }
-  ],
-  "dependencies": {},
-  "description": "Node.js printer bindings",
-  "devDependencies": {
-    "grunt": "^0.4.5",
-    "grunt-contrib-copy": "^0.8.0",
-    "grunt-contrib-jshint": "^0.11.0",
-    "grunt-node-gyp": "git://github.com/tojocky/grunt-node-gyp.git",
-    "grunt-nw-gyp": "git://github.com/tojocky/grunt-nw-gyp.git",
-    "nodeunit": "*"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "830b8f5c97b97fd9b464d4f4e105d43337792296",
-    "tarball": "https://registry.npmjs.org/printer/-/printer-0.2.2.tgz"
-  },
-  "engines": {
-    "node": ">= 0.8.0"
-  },
-  "gitHead": "c0796566ec78773697a4ce78f04965ccc7864b4e",
-  "gypfile": true,
-  "homepage": "http://github.com/tojocky/node-printer",
-  "licenses": [
-    {
-      "type": "BSD"
-    }
-  ],
-  "main": "./lib/printer",
-  "maintainers": [
-    {
-      "name": "ionlupascu",
-      "email": "ionlupascu@gmail.com"
-    }
-  ],
-  "name": "printer",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/tojocky/node-printer.git"
-  },
-  "scripts": {
-    "install": "node-gyp rebuild"
-  },
-  "version": "0.2.2"
-}
diff --git a/js/Windows/node_modules/printer/printer.js b/js/Windows/node_modules/printer/printer.js
deleted file mode 100644
index ab0a52ab9b8738ca2ab250f031448a918cb6beff..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/printer.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib/printer');
\ No newline at end of file
diff --git a/js/Windows/node_modules/printer/src/macros.hh b/js/Windows/node_modules/printer/src/macros.hh
deleted file mode 100644
index aa968d7f717b9cc60c329dc57c4cd093aa286896..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/src/macros.hh
+++ /dev/null
@@ -1,143 +0,0 @@
-#ifndef NODE_PRINTER_SRC_MACROS_H
-#define NODE_PRINTER_SRC_MACROS_H
-
-#include <node_version.h>
-
-// NODE_MODULE_VERSION was incremented for v0.11
-
-
-#if NODE_VERSION_AT_LEAST(0, 11, 9)
-#  define MY_NODE_MODULE_ISOLATE_DECL v8::Isolate* isolate = v8::Isolate::GetCurrent();
-#  define MY_NODE_MODULE_ISOLATE      isolate
-#  define MY_NODE_MODULE_ISOLATE_PRE  isolate, 
-#  define MY_NODE_MODULE_ISOLATE_POST , isolate 
-#  define MY_NODE_MODULE_HANDLESCOPE MY_NODE_MODULE_ISOLATE_DECL v8::HandleScope scope(MY_NODE_MODULE_ISOLATE)
-#  define MY_NODE_MODULE_CALLBACK(name) void name(const v8::FunctionCallbackInfo<v8::Value>& iArgs)
-#  define V8_VALUE_NEW(type, value)   v8::type::New(MY_NODE_MODULE_ISOLATE_PRE value)
-#  define V8_VALUE_NEW_DEFAULT(type)   v8::type::New(MY_NODE_MODULE_ISOLATE)
-#  define V8_STRING_NEW_UTF8(value)   v8::String::NewFromUtf8(MY_NODE_MODULE_ISOLATE_PRE value)
-#  define V8_STRING_NEW_2BYTES(value)   v8::String::NewFromTwoByte(MY_NODE_MODULE_ISOLATE_PRE value)
-
-#  define RETURN_EXCEPTION(msg)  isolate->ThrowException(v8::Exception::TypeError(msg));    \
-    return
-
-#  define RETURN_EXCEPTION_STR(msg) RETURN_EXCEPTION(V8_STRING_NEW_UTF8(msg))
-#  define MY_NODE_MODULE_RETURN_VALUE(value)   iArgs.GetReturnValue().Set(value);   \
-    return
-#  define MY_NODE_MODULE_RETURN_UNDEFINED()   return
-#else
-#  define MY_NODE_MODULE_ISOLATE_DECL
-#  define MY_NODE_MODULE_ISOLATE
-#  define MY_NODE_MODULE_ISOLATE_PRE
-#  define MY_NODE_MODULE_ISOLATE_POST
-#  define MY_NODE_MODULE_HANDLESCOPE v8::HandleScope scope;
-#  define MY_NODE_MODULE_CALLBACK(name) v8::Handle<v8::Value> name(const v8::Arguments& iArgs)
-#  define V8_VALUE_NEW(type, value)   v8::type::New(value)
-#  define V8_VALUE_NEW_DEFAULT(type)   v8::type::New()
-#  define V8_STRING_NEW_UTF8(value)   v8::String::New(MY_NODE_MODULE_ISOLATE_PRE value)
-#  define V8_STRING_NEW_2BYTES(value)   v8::String::New(MY_NODE_MODULE_ISOLATE_PRE value)
-
-#  define RETURN_EXCEPTION(msg) return v8::ThrowException(v8::Exception::TypeError(msg)) 
-
-#  define RETURN_EXCEPTION_STR(msg) RETURN_EXCEPTION(V8_STRING_NEW_UTF8(msg))
-#  define MY_NODE_MODULE_RETURN_VALUE(value)   return scope.Close(value)
-#  define MY_NODE_MODULE_RETURN_UNDEFINED()   return scope.Close(v8::Undefined())
-#endif
-
-#if NODE_VERSION_AT_LEAST(0, 11, 10) // for node-webkit v.0.9.2 which uses node v0.11.9
-#  define V8_VALUE_NEW_V_0_11_10(type, value)          v8::type::New(MY_NODE_MODULE_ISOLATE_PRE value)
-#  define V8_VALUE_NEW_DEFAULT_V_0_11_10(type)         v8::type::New(MY_NODE_MODULE_ISOLATE)
-#else
-#  define V8_VALUE_NEW_V_0_11_10(type, value)          v8::type::New(value)
-#  define V8_VALUE_NEW_DEFAULT_V_0_11_10(type)         v8::type::New()
-#endif
-
-
-#define V8_STR_CONC(left, right)                              \
-	v8::String::Concat(V8_STRING_NEW_UTF8(left), V8_STRING_NEW_UTF8(right))
-		
-#define REQUIRE_ARGUMENTS(args, n)                                                   \
-    if (args.Length() < (n)) {                                                 \
-       RETURN_EXCEPTION_STR("Expected " #n " arguments");                       \
-    }
-
-
-#define REQUIRE_ARGUMENT_EXTERNAL(i, var)                                      \
-    if (args.Length() <= (i) || !args[i]->IsExternal()) {                      \
-        RETURN_EXCEPTION_STR("Argument " #i " invalid");       \
-    }                                                                          \
-    v8::Local<v8::External> var = v8::Local<v8::External>::Cast(args[i]);
-
-#define REQUIRE_ARGUMENT_OBJECT(args, i, var)                                      \
-    if (args.Length() <= (i) || !args[i]->IsObject()) {                      \
-        RETURN_EXCEPTION_STR("Argument " #i " is not an object");       \
-    }                                                                          \
-    v8::Local<v8::Object> var = v8::Local<v8::Object>::Cast(args[i]);
-
-
-#define REQUIRE_ARGUMENT_FUNCTION(i, var)                                      \
-    if (args.Length() <= (i) || !args[i]->IsFunction()) {                      \
-        RETURN_EXCEPTION_STR("Argument " #i " must be a function");                 \
-    }                                                                          \
-    v8::Local<v8::Function> var = v8::Local<v8::Function>::Cast(args[i]);
-
-
-#define ARG_CHECK_STRING(args, i)                                        \
-    if (args.Length() <= (i) || !args[i]->IsString()) {                        \
-        RETURN_EXCEPTION_STR("Argument " #i " must be a string");                   \
-    }                                                                          \
-
-#define REQUIRE_ARGUMENT_STRING(args, i, var)                                        \
-    ARG_CHECK_STRING(args, i);                                                       \
-    v8::String::Utf8Value var(args[i]->ToString());
-
-#define REQUIRE_ARGUMENT_STRINGW(args, i, var)                                        \
-    ARG_CHECK_STRING(args, i);                                                       \
-    v8::String::Value var(args[i]->ToString());
-
-
-#define OPTIONAL_ARGUMENT_FUNCTION(i, var)                                     \
-    v8::Local<v8::Function> var;                                                       \
-    if (args.Length() > i && !args[i]->IsUndefined()) {                        \
-        if (!args[i]->IsFunction()) {                                          \
-            RETURN_EXCEPTION_STR("Argument " #i " must be a function");             \
-        }                                                                      \
-        var = v8::Local<v8::Function>::Cast(args[i]);                                  \
-    }
-
-
-#define REQUIRE_ARGUMENT_INTEGER(args, i, var)                             \
-    int var;                                                                   \
-    if (args[i]->IsInt32()) {                                             \
-        var = args[i]->Int32Value();                                           \
-    }                                                                          \
-    else {                                                                     \
-        RETURN_EXCEPTION_STR("Argument " #i " must be an integer");                 \
-    }
-
-#define OPTIONAL_ARGUMENT_INTEGER(args, i, var, default)                             \
-    int var;                                                                   \
-    if (args.Length() <= (i)) {                                                \
-        var = (default);                                                       \
-    }                                                                          \
-    else if (args[i]->IsInt32()) {                                             \
-        var = args[i]->Int32Value();                                           \
-    }                                                                          \
-    else {                                                                     \
-        RETURN_EXCEPTION_STR("Argument " #i " must be an integer");                 \
-    }
-#define EMIT_EVENT(obj, argc, argv)                                            \
-    TRY_CATCH_CALL((obj),                                                      \
-        Local<Function>::Cast((obj)->Get(String::NewSymbol("emit"))),          \
-        argc, argv                                                             \
-    );
-
-#define TRY_CATCH_CALL(context, callback, argc, argv)                          \
-{   TryCatch try_catch;                                                        \
-    (callback)->Call((context), (argc), (argv));                               \
-    if (try_catch.HasCaught()) {                                               \
-        FatalException(try_catch);                                             \
-    }                                                                          \
-}
-
-#endif
diff --git a/js/Windows/node_modules/printer/src/node_printer.cc b/js/Windows/node_modules/printer/src/node_printer.cc
deleted file mode 100644
index bcd9b5a3e37ad68a3178404271d176516d55a75a..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/src/node_printer.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-#include "node_printer.hpp"
-
-#include <node_buffer.h>
-
-void initNode(v8::Handle<v8::Object> exports) {
-// only for node
-  NODE_SET_METHOD(exports, "getPrinters", getPrinters);
-  NODE_SET_METHOD(exports, "getDefaultPrinterName", getDefaultPrinterName);
-  NODE_SET_METHOD(exports, "getPrinter", getPrinter);
-  NODE_SET_METHOD(exports, "getPrinterDriverOptions", getPrinterDriverOptions);
-  NODE_SET_METHOD(exports, "getJob", getJob);
-  NODE_SET_METHOD(exports, "setJob", setJob);
-  NODE_SET_METHOD(exports, "printDirect", PrintDirect);
-  NODE_SET_METHOD(exports, "printFile", PrintFile);
-  NODE_SET_METHOD(exports, "getSupportedPrintFormats", getSupportedPrintFormats);
-  NODE_SET_METHOD(exports, "getSupportedJobCommands", getSupportedJobCommands);
-}
-
-NODE_MODULE(node_printer, initNode);
-
-// Helpers
-
-bool getStringOrBufferFromV8Value(v8::Handle<v8::Value> iV8Value, std::string &oData)
-{
-    if(iV8Value->IsString())
-    {
-        v8::String::Utf8Value data_str_v8(iV8Value->ToString());
-        oData.assign(*data_str_v8, data_str_v8.length());
-        return true;
-    }
-    if(iV8Value->IsObject() && node::Buffer::HasInstance(iV8Value))
-    {
-        oData.assign(node::Buffer::Data(iV8Value), node::Buffer::Length(iV8Value));
-        return true;
-    }
-    return false;
-}
diff --git a/js/Windows/node_modules/printer/src/node_printer.hpp b/js/Windows/node_modules/printer/src/node_printer.hpp
deleted file mode 100644
index b4d8fd491f0b28c4069497eba3c01628abdee9bd..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/src/node_printer.hpp
+++ /dev/null
@@ -1,123 +0,0 @@
-#ifndef NODE_PRINTER_HPP
-#define NODE_PRINTER_HPP
-
-#include "macros.hh"
-
-#include <node.h>
-#include <v8.h>
-
-#include <string>
-
-/**
- * Send data to printer
- *
- * @param data String/NativeBuffer, mandatory, raw data bytes
- * @param printername String, mandatory, specifying printer name
- * @param docname String, mandatory, specifying document name
- * @param type String, mandatory, specifying data type. E.G.: RAW, TEXT, ...
- *
- * @returns true for success, false for failure.
- */
-MY_NODE_MODULE_CALLBACK(PrintDirect);
-
-/**
- * Send file to printer
- *
- * @param filename String, mandatory, specifying filename to print
- * @param docname String, mandatory, specifying document name
- * @param printer String, mandatory, specifying printer name
- *
- * @returns jobId for success, or error message for failure.
- */
-MY_NODE_MODULE_CALLBACK(PrintFile);
-
-/** Retrieve all printers and jobs
- * posix: minimum version: CUPS 1.1.21/OS X 10.4
- */
-MY_NODE_MODULE_CALLBACK(getPrinters);
-
-/**
- * Return default printer name, if null then default printer is not set
- */
-MY_NODE_MODULE_CALLBACK(getDefaultPrinterName);
-
-/** Retrieve printer info and jobs
- * @param printer name String
- */
-MY_NODE_MODULE_CALLBACK(getPrinter);
-
-/** Retrieve printer driver info
- * @param printer name String
- */
-MY_NODE_MODULE_CALLBACK(getPrinterDriverOptions);
-
-/** Retrieve job info
- *  @param printer name String
- *  @param job id Number
- */
-MY_NODE_MODULE_CALLBACK(getJob);
-
-//TODO
-/** Set job command. 
- * arguments:
- * @param printer name String
- * @param job id Number
- * @param job command String
- * Possible commands:
- *      "CANCEL"
- *      "PAUSE"
- *      "RESTART"
- *      "RESUME"
- *      "DELETE"
- *      "SENT-TO-PRINTER"
- *      "LAST-PAGE-EJECTED"
- *      "RETAIN"
- *      "RELEASE"
- */
-MY_NODE_MODULE_CALLBACK(setJob);
-
-/** Get supported print formats for printDirect. It depends on platform
- */
-MY_NODE_MODULE_CALLBACK(getSupportedPrintFormats);
-
-/** Get supported job commands for setJob method
- */
-MY_NODE_MODULE_CALLBACK(getSupportedJobCommands);
-
-//TODO:
-// optional ability to get printer spool
-
-
-// util class
-
-/** Memory value class management to avoid memory leak
- * TODO: move to std::unique_ptr on switching to C++11
-*/
-template<typename Type>
-class MemValueBase
-{
-public:
-    MemValueBase(): _value(NULL) {}
-
-    /** Destructor. The allocated memory will be deallocated
-    */
-    ~MemValueBase() {}
-
-    Type * get() {return _value; }
-    Type * operator ->() { return &_value; }
-    operator bool() const { return (_value != NULL); }
-protected:
-    Type *_value;
-
-    virtual void free() {};
-};
-
-/**
- * try to extract String or buffer from v8 value
- * @param iV8Value - source v8 value
- * @param oData - destination data
- * @return TRUE if value is String or Buffer, FALSE otherwise
- */
-bool getStringOrBufferFromV8Value(v8::Handle<v8::Value> iV8Value, std::string &oData);
-
-#endif
diff --git a/js/Windows/node_modules/printer/src/node_printer_posix.cc b/js/Windows/node_modules/printer/src/node_printer_posix.cc
deleted file mode 100644
index 438443c208bb8549f83744d9a9300ed792b184ff..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/src/node_printer_posix.cc
+++ /dev/null
@@ -1,523 +0,0 @@
-#include "node_printer.hpp"
-
-#include <string>
-#include <map>
-#include <utility>
-#include <sstream>
-#include <node_version.h>
-
-#include <cups/cups.h>
-#include <cups/ppd.h>
-
-namespace
-{
-    typedef std::map<std::string, int> StatusMapType;
-    typedef std::map<std::string, std::string> FormatMapType;
-
-    const StatusMapType& getJobStatusMap()
-    {
-        static StatusMapType result;
-        if(!result.empty())
-        {
-            return result;
-        }
-        // add only first time
-#define STATUS_PRINTER_ADD(value, type) result.insert(std::make_pair(value, type))
-        // Common statuses
-        STATUS_PRINTER_ADD("PRINTING", IPP_JOB_PROCESSING);
-        STATUS_PRINTER_ADD("PRINTED", IPP_JOB_COMPLETED);
-        STATUS_PRINTER_ADD("PAUSED", IPP_JOB_HELD);
-        // Specific statuses
-        STATUS_PRINTER_ADD("PENDING", IPP_JOB_PENDING);
-        STATUS_PRINTER_ADD("PAUSED", IPP_JOB_STOPPED);
-        STATUS_PRINTER_ADD("CANCELLED", IPP_JOB_CANCELLED);
-        STATUS_PRINTER_ADD("ABORTED", IPP_JOB_ABORTED);
-
-#undef STATUS_PRINTER_ADD
-        return result;
-    }
-
-    const FormatMapType& getPrinterFormatMap()
-    {
-        static FormatMapType result;
-        if(!result.empty())
-        {
-            return result;
-        }
-        result.insert(std::make_pair("RAW", CUPS_FORMAT_RAW));
-        result.insert(std::make_pair("TEXT", CUPS_FORMAT_TEXT));
-#ifdef CUPS_FORMAT_PDF
-        result.insert(std::make_pair("PDF", CUPS_FORMAT_PDF));
-#endif
-#ifdef CUPS_FORMAT_JPEG
-        result.insert(std::make_pair("JPEG", CUPS_FORMAT_JPEG));
-#endif
-#ifdef CUPS_FORMAT_POSTSCRIPT
-        result.insert(std::make_pair("POSTSCRIPT", CUPS_FORMAT_POSTSCRIPT));
-#endif
-#ifdef CUPS_FORMAT_COMMAND
-        result.insert(std::make_pair("COMMAND", CUPS_FORMAT_COMMAND));
-#endif
-#ifdef CUPS_FORMAT_AUTO
-        result.insert(std::make_pair("AUTO", CUPS_FORMAT_AUTO));
-#endif
-        return result;
-    }
-
-    /** Parse job info object.
-     * @return error string. if empty, then no error
-     */
-    std::string parseJobObject(const cups_job_t *job, v8::Handle<v8::Object> result_printer_job)
-    {
-        MY_NODE_MODULE_ISOLATE_DECL
-        //Common fields
-        result_printer_job->Set(V8_STRING_NEW_UTF8("id"), V8_VALUE_NEW(Number, job->id));
-        result_printer_job->Set(V8_STRING_NEW_UTF8("name"), V8_STRING_NEW_UTF8(job->title));
-        result_printer_job->Set(V8_STRING_NEW_UTF8("printerName"), V8_STRING_NEW_UTF8(job->dest));
-        result_printer_job->Set(V8_STRING_NEW_UTF8("user"), V8_STRING_NEW_UTF8(job->user));
-        std::string job_format(job->format);
-
-        // Try to parse the data format, otherwise will write the unformatted one
-        for(FormatMapType::const_iterator itFormat = getPrinterFormatMap().begin(); itFormat != getPrinterFormatMap().end(); ++itFormat)
-        {
-            if(itFormat->second == job_format)
-            {
-                job_format = itFormat->first;
-                break;
-            }
-        }
-
-        result_printer_job->Set(V8_STRING_NEW_UTF8("format"), V8_STRING_NEW_UTF8(job_format.c_str()));
-        result_printer_job->Set(V8_STRING_NEW_UTF8("priority"), V8_VALUE_NEW(Number, job->priority));
-        result_printer_job->Set(V8_STRING_NEW_UTF8("size"), V8_VALUE_NEW(Number, job->size));
-        v8::Local<v8::Array> result_printer_job_status = V8_VALUE_NEW_DEFAULT_V_0_11_10(Array);
-        int i_status = 0;
-        for(StatusMapType::const_iterator itStatus = getJobStatusMap().begin(); itStatus != getJobStatusMap().end(); ++itStatus)
-        {
-            if(job->state == itStatus->second)
-            {
-                result_printer_job_status->Set(i_status++, V8_STRING_NEW_UTF8(itStatus->first.c_str()));
-                // only one status could be on posix
-                break;
-            }
-        }
-        if(i_status == 0)
-        {
-            // A new status? report as unsupported
-            std::ostringstream s;
-            s << "unsupported job status: " << job->state;
-            result_printer_job_status->Set(i_status++, V8_STRING_NEW_UTF8(s.str().c_str()));
-        }
-
-        result_printer_job->Set(V8_STRING_NEW_UTF8("status"), result_printer_job_status);
-
-        //Specific fields
-        // Ecmascript store time in milliseconds, but time_t in seconds
-        result_printer_job->Set(V8_STRING_NEW_UTF8("completedTime"), V8_VALUE_NEW(Date, job->completed_time*1000));
-        result_printer_job->Set(V8_STRING_NEW_UTF8("creationTime"), V8_VALUE_NEW(Date, job->creation_time*1000));
-        result_printer_job->Set(V8_STRING_NEW_UTF8("processingTime"), V8_VALUE_NEW(Date, job->processing_time*1000));
-
-        // No error. return an empty string
-        return "";
-    }
-
-    /** Parses printer driver PPD options
-     */
-    void populatePpdOptions(v8::Handle<v8::Object> ppd_options, ppd_file_t  *ppd, ppd_group_t *group)
-    {
-        int i, j;
-        ppd_option_t *option;
-        ppd_choice_t *choice;
-        ppd_group_t *subgroup;
-
-        for (i = group->num_options, option = group->options; i > 0; --i, ++option)
-        {
-            MY_NODE_MODULE_ISOLATE_DECL
-            v8::Local<v8::Object> ppd_suboptions = V8_VALUE_NEW_DEFAULT_V_0_11_10(Object);
-            for (j = option->num_choices, choice = option->choices;
-                 j > 0;
-                 --j, ++choice)
-            {
-                ppd_suboptions->Set(V8_STRING_NEW_UTF8(choice->choice), V8_VALUE_NEW_V_0_11_10(Boolean, static_cast<bool>(choice->marked)));
-            }
-
-            ppd_options->Set(V8_STRING_NEW_UTF8(option->keyword), ppd_suboptions);
-        }
-
-        for (i = group->num_subgroups, subgroup = group->subgroups; i > 0; --i, ++subgroup) {
-            populatePpdOptions(ppd_options, ppd, subgroup);
-        }
-    }
-
-    /** Parse printer driver options
-     * @return error string.
-     */
-    std::string parseDriverOptions(const cups_dest_t * printer, v8::Handle<v8::Object> ppd_options)
-    {
-        const char *filename;
-        ppd_file_t *ppd;
-        ppd_group_t *group;
-        int i;
-
-        std::ostringstream error_str; // error string
-
-        if ((filename = cupsGetPPD(printer->name)) != NULL)
-        {
-            if ((ppd = ppdOpenFile(filename)) != NULL)
-            {
-                 ppdMarkDefaults(ppd);
-                 cupsMarkOptions(ppd, printer->num_options, printer->options);
-
-                 for (i = ppd->num_groups, group = ppd->groups; i > 0; --i, ++group)
-                 {
-                    populatePpdOptions(ppd_options, ppd, group);
-                 }
-                 ppdClose(ppd);
-            }
-            else
-            {
-                error_str << "Unable to open PPD filename " << filename << " ";
-            }
-            unlink(filename);
-        }
-        else
-        {
-            error_str << "Unable to get CUPS PPD driver file. ";
-        }
-
-        return error_str.str();
-    }
-
-
-    /** Parse printer info object
-     * @return error string.
-     */
-    std::string parsePrinterInfo(const cups_dest_t * printer, v8::Handle<v8::Object> result_printer)
-    {
-        MY_NODE_MODULE_ISOLATE_DECL
-        result_printer->Set(V8_STRING_NEW_UTF8("name"), V8_STRING_NEW_UTF8(printer->name));
-        result_printer->Set(V8_STRING_NEW_UTF8("isDefault"), V8_VALUE_NEW_V_0_11_10(Boolean, static_cast<bool>(printer->is_default)));
-
-        if(printer->instance)
-        {
-            result_printer->Set(V8_STRING_NEW_UTF8("instance"), V8_STRING_NEW_UTF8(printer->instance));
-        }
-
-        v8::Local<v8::Object> result_printer_options = V8_VALUE_NEW_DEFAULT_V_0_11_10(Object);
-        cups_option_t *dest_option = printer->options;
-        for(int j = 0; j < printer->num_options; ++j, ++dest_option)
-        {
-            result_printer_options->Set(V8_STRING_NEW_UTF8(dest_option->name), V8_STRING_NEW_UTF8(dest_option->value));
-        }
-        result_printer->Set(V8_STRING_NEW_UTF8("options"), result_printer_options);
-        // Get printer jobs
-        cups_job_t * jobs;
-        int totalJobs = cupsGetJobs(&jobs, printer->name, 0 /*0 means all users*/, CUPS_WHICHJOBS_ACTIVE);
-        std::string error_str;
-        if(totalJobs > 0)
-        {
-            v8::Local<v8::Array> result_priner_jobs = V8_VALUE_NEW_V_0_11_10(Array, totalJobs);
-            int jobi =0;
-            cups_job_t * job = jobs;
-            for(; jobi < totalJobs; ++jobi, ++job)
-            {
-                v8::Local<v8::Object> result_printer_job = V8_VALUE_NEW_DEFAULT_V_0_11_10(Object);
-                error_str = parseJobObject(job, result_printer_job);
-                if(!error_str.empty())
-                {
-                    // got an error? break then.
-                    break;
-                }
-                result_priner_jobs->Set(jobi, result_printer_job);
-            }
-            result_printer->Set(V8_STRING_NEW_UTF8("jobs"), result_priner_jobs);
-        }
-        cupsFreeJobs(totalJobs, jobs);
-        return error_str;
-    }
-
-    /// cups option class to automatically free memory.
-    class CupsOptions: public MemValueBase<cups_option_t> {
-    protected:
-        int num_options;
-        virtual void free() {
-            if(_value != NULL)
-            {
-                cupsFreeOptions(num_options, get());
-                _value = NULL;
-                num_options = 0;
-            }
-        }
-    public:
-        CupsOptions(): num_options(0) {}
-        ~CupsOptions () { free(); }
-
-        /// Add options from v8 object
-        CupsOptions(v8::Local<v8::Object> iV8Options): num_options(0) {
-            v8::Local<v8::Array> props = iV8Options->GetPropertyNames();
-
-            for(unsigned int i = 0; i < props->Length(); ++i) {
-                v8::Handle<v8::Value> key(props->Get(i));
-                v8::String::Utf8Value keyStr(key->ToString());
-                v8::String::Utf8Value valStr(iV8Options->Get(key)->ToString());
-
-                num_options = cupsAddOption(*keyStr, *valStr, num_options, &_value);
-            }
-        }
-
-        const int& getNumOptions() { return num_options; }
-    };
-}
-
-MY_NODE_MODULE_CALLBACK(getPrinters)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-
-    cups_dest_t *printers = NULL;
-    int printers_size = cupsGetDests(&printers);
-    v8::Local<v8::Array> result = V8_VALUE_NEW_V_0_11_10(Array, printers_size);
-    cups_dest_t *printer = printers;
-    std::string error_str;
-    for(int i = 0; i < printers_size; ++i, ++printer)
-    {
-        v8::Local<v8::Object> result_printer = V8_VALUE_NEW_DEFAULT_V_0_11_10(Object);
-        error_str = parsePrinterInfo(printer, result_printer);
-        if(!error_str.empty())
-        {
-            // got an error? break then
-            break;
-        }
-        result->Set(i, result_printer);
-    }
-    cupsFreeDests(printers_size, printers);
-    if(!error_str.empty())
-    {
-        // got an error? return the error then
-        RETURN_EXCEPTION_STR(error_str.c_str());
-    }
-    MY_NODE_MODULE_RETURN_VALUE(result);
-}
-
-MY_NODE_MODULE_CALLBACK(getDefaultPrinterName)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    //This does not return default user printer name according to https://www.cups.org/documentation.php/doc-2.0/api-cups.html#cupsGetDefault2
-    //so leave as undefined and JS implementation will loop in all printers
-    /*
-    const char * printerName = cupsGetDefault();
-
-    // return default printer name only if defined
-    if(printerName != NULL) {
-        MY_NODE_MODULE_RETURN_VALUE(V8_STRING_NEW_UTF8(printerName));
-    }
-    */
-    MY_NODE_MODULE_RETURN_UNDEFINED();
-}
-
-MY_NODE_MODULE_CALLBACK(getPrinter)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    REQUIRE_ARGUMENTS(iArgs, 1);
-    REQUIRE_ARGUMENT_STRING(iArgs, 0, printername);
-
-    cups_dest_t *printers = NULL, *printer = NULL;
-    int printers_size = cupsGetDests(&printers);
-    printer = cupsGetDest(*printername, NULL, printers_size, printers);
-    v8::Local<v8::Object> result_printer = V8_VALUE_NEW_DEFAULT_V_0_11_10(Object);
-    if(printer != NULL)
-    {
-        parsePrinterInfo(printer, result_printer);
-    }
-    cupsFreeDests(printers_size, printers);
-    if(printer == NULL)
-    {
-        // printer not found
-        RETURN_EXCEPTION_STR("Printer not found");
-    }
-    MY_NODE_MODULE_RETURN_VALUE(result_printer);
-}
-
-MY_NODE_MODULE_CALLBACK(getPrinterDriverOptions)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    REQUIRE_ARGUMENTS(iArgs, 1);
-    REQUIRE_ARGUMENT_STRING(iArgs, 0, printername);
-
-    cups_dest_t *printers = NULL, *printer = NULL;
-    int printers_size = cupsGetDests(&printers);
-    printer = cupsGetDest(*printername, NULL, printers_size, printers);
-    v8::Local<v8::Object> driver_options = V8_VALUE_NEW_DEFAULT_V_0_11_10(Object);
-    if(printer != NULL)
-    {
-        parseDriverOptions(printer, driver_options);
-    }
-    cupsFreeDests(printers_size, printers);
-    if(printer == NULL)
-    {
-        // printer not found
-        RETURN_EXCEPTION_STR("Printer not found");
-    }
-    MY_NODE_MODULE_RETURN_VALUE(driver_options);
-}
-
-MY_NODE_MODULE_CALLBACK(getJob)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    REQUIRE_ARGUMENTS(iArgs, 2);
-    REQUIRE_ARGUMENT_STRING(iArgs, 0, printername);
-    REQUIRE_ARGUMENT_INTEGER(iArgs, 1, jobId);
-
-    v8::Local<v8::Object> result_printer_job = V8_VALUE_NEW_DEFAULT_V_0_11_10(Object);
-    // Get printer jobs
-    cups_job_t *jobs = NULL, *jobFound = NULL;
-    int totalJobs = cupsGetJobs(&jobs, *printername, 0 /*0 means all users*/, CUPS_WHICHJOBS_ALL);
-    if(totalJobs > 0)
-    {
-        int jobi =0;
-        cups_job_t * job = jobs;
-        for(; jobi < totalJobs; ++jobi, ++job)
-        {
-            if(job->id != jobId)
-            {
-                continue;
-            }
-            // Job Found
-            jobFound = job;
-            parseJobObject(job, result_printer_job);
-            break;
-        }
-    }
-    cupsFreeJobs(totalJobs, jobs);
-    if(jobFound == NULL)
-    {
-        // printer not found
-        RETURN_EXCEPTION_STR("Printer job not found");
-    }
-    MY_NODE_MODULE_RETURN_VALUE(result_printer_job);
-}
-
-MY_NODE_MODULE_CALLBACK(setJob)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    REQUIRE_ARGUMENTS(iArgs, 3);
-    REQUIRE_ARGUMENT_STRING(iArgs, 0, printername);
-    REQUIRE_ARGUMENT_INTEGER(iArgs, 1, jobId);
-    REQUIRE_ARGUMENT_STRING(iArgs, 2, jobCommandV8);
-    if(jobId < 0)
-    {
-        RETURN_EXCEPTION_STR("Wrong job number");
-    }
-    std::string jobCommandStr(*jobCommandV8);
-    bool result_ok = false;
-    if(jobCommandStr == "CANCEL")
-    {
-        result_ok = (cupsCancelJob(*printername, jobId) == 1);
-    }
-    else
-    {
-        RETURN_EXCEPTION_STR("wrong job command. use getSupportedJobCommands to see the possible commands");
-    }
-    MY_NODE_MODULE_RETURN_VALUE(V8_VALUE_NEW_V_0_11_10(Boolean, result_ok));
-}
-
-MY_NODE_MODULE_CALLBACK(getSupportedJobCommands)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    v8::Local<v8::Array> result = V8_VALUE_NEW_DEFAULT_V_0_11_10(Array);
-    int i = 0;
-    result->Set(i++, V8_STRING_NEW_UTF8("CANCEL"));
-    MY_NODE_MODULE_RETURN_VALUE(result);
-}
-
-MY_NODE_MODULE_CALLBACK(getSupportedPrintFormats)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    v8::Local<v8::Array> result = V8_VALUE_NEW_DEFAULT_V_0_11_10(Array);
-    int i = 0;
-    for(FormatMapType::const_iterator itFormat = getPrinterFormatMap().begin(); itFormat != getPrinterFormatMap().end(); ++itFormat)
-    {
-        result->Set(i++, V8_STRING_NEW_UTF8(itFormat->first.c_str()));
-    }
-    MY_NODE_MODULE_RETURN_VALUE(result);
-}
-
-MY_NODE_MODULE_CALLBACK(PrintDirect)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    REQUIRE_ARGUMENTS(iArgs, 5);
-
-    // can be string or buffer
-    if(iArgs.Length() <= 0)
-    {
-        RETURN_EXCEPTION_STR("Argument 0 missing");
-    }
-
-    std::string data;
-    v8::Handle<v8::Value> arg0(iArgs[0]);
-    if (!getStringOrBufferFromV8Value(arg0, data))
-    {
-        RETURN_EXCEPTION_STR("Argument 0 must be a string or Buffer");
-    }
-
-    REQUIRE_ARGUMENT_STRING(iArgs, 1, printername);
-    REQUIRE_ARGUMENT_STRING(iArgs, 2, docname);
-    REQUIRE_ARGUMENT_STRING(iArgs, 3, type);
-    REQUIRE_ARGUMENT_OBJECT(iArgs, 4, print_options);
-
-    std::string type_str(*type);
-    FormatMapType::const_iterator itFormat = getPrinterFormatMap().find(type_str);
-    if(itFormat == getPrinterFormatMap().end())
-    {
-        RETURN_EXCEPTION_STR("unsupported format type");
-    }
-    type_str = itFormat->second;
-
-    CupsOptions options(print_options);
-
-    int job_id = cupsCreateJob(CUPS_HTTP_DEFAULT, *printername, *docname, options.getNumOptions(), options.get());
-    if(job_id == 0) {
-        RETURN_EXCEPTION_STR(cupsLastErrorString());
-    }
-
-    if(HTTP_CONTINUE != cupsStartDocument(CUPS_HTTP_DEFAULT, *printername, job_id, *docname, type_str.c_str(), 1 /*last document*/)) {
-        RETURN_EXCEPTION_STR(cupsLastErrorString());
-    }
-
-    /* cupsWriteRequestData can be called as many times as needed */
-    //TODO: to split big buffer
-    if (HTTP_CONTINUE != cupsWriteRequestData(CUPS_HTTP_DEFAULT, data.c_str(), data.size())) {
-        cupsFinishDocument(CUPS_HTTP_DEFAULT, *printername);
-        RETURN_EXCEPTION_STR(cupsLastErrorString());
-    }
-
-    cupsFinishDocument(CUPS_HTTP_DEFAULT, *printername);
-
-    MY_NODE_MODULE_RETURN_VALUE(V8_VALUE_NEW(Number, job_id));
-}
-
-MY_NODE_MODULE_CALLBACK(PrintFile)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    REQUIRE_ARGUMENTS(iArgs, 3);
-
-    // can be string or buffer
-    if(iArgs.Length() <= 0)
-    {
-        RETURN_EXCEPTION_STR("Argument 0 missing");
-    }
-
-    REQUIRE_ARGUMENT_STRING(iArgs, 0, filename);
-    REQUIRE_ARGUMENT_STRING(iArgs, 1, docname);
-    REQUIRE_ARGUMENT_STRING(iArgs, 2, printer);
-    REQUIRE_ARGUMENT_OBJECT(iArgs, 3, print_options);
-
-    CupsOptions options(print_options);
-
-    int job_id = cupsPrintFile(*printer, *filename, *docname, options.getNumOptions(), options.get());
-
-    if(job_id == 0){
-        MY_NODE_MODULE_RETURN_VALUE(V8_STRING_NEW_UTF8(cupsLastErrorString()));
-    } else {
-        MY_NODE_MODULE_RETURN_VALUE(V8_VALUE_NEW(Number, job_id));
-    }
-}
diff --git a/js/Windows/node_modules/printer/src/node_printer_win.cc b/js/Windows/node_modules/printer/src/node_printer_win.cc
deleted file mode 100644
index 7152eb1fe2a3e520eb15b29e9af637fabb4a23ee..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/src/node_printer_win.cc
+++ /dev/null
@@ -1,744 +0,0 @@
-#include "node_printer.hpp"
-
-#if _MSC_VER
-#include <windows.h>
-#include <Winspool.h>
-#include <Wingdi.h>
-#pragma  comment(lib, "Winspool.lib")
-#else
-#error "Unsupported compiler for windows. Feel free to add it."
-#endif
-
-#include <string>
-#include <map>
-#include <utility>
-#include <sstream>
-#include <node_version.h>
-
-namespace{
-    typedef std::map<std::string, DWORD> StatusMapType;
-
-    /** Memory value class management to avoid memory leak
-    */
-    template<typename Type>
-    class MemValue: public MemValueBase<Type> {
-    public:
-        /** Constructor of allocating iSizeKbytes bytes memory;
-        * @param iSizeKbytes size in bytes of required allocating memory
-        */
-        MemValue(const DWORD iSizeKbytes) {
-            _value = (Type*)malloc(iSizeKbytes);
-        }
-		
-        ~MemValue () {
-            free();
-        }
-    protected:
-        virtual void free() {
-            if(_value != NULL)
-            {
-                ::free(_value);
-                _value = NULL;
-            }
-        }
-    };
-
-    struct PrinterHandle
-    {
-        PrinterHandle(LPWSTR iPrinterName)
-        {
-            _ok = OpenPrinterW(iPrinterName, &_printer, NULL);
-        }
-        ~PrinterHandle()
-        {
-            if(_ok)
-            {
-                ClosePrinter(_printer);
-            }
-        }
-        operator HANDLE() {return _printer;}
-        operator bool() { return (!!_ok);}
-        HANDLE & operator *() { return _printer;}
-        HANDLE * operator ->() { return &_printer;}
-        const HANDLE & operator ->() const { return _printer;}
-        HANDLE _printer;
-        BOOL _ok;
-    };
-
-    const StatusMapType& getStatusMap()
-    {
-        static StatusMapType result;
-        if(!result.empty())
-        {
-            return result;
-        }
-        // add only first time
-#define STATUS_PRINTER_ADD(value, type) result.insert(std::make_pair(value, type))
-        STATUS_PRINTER_ADD("BUSY", PRINTER_STATUS_BUSY);
-        STATUS_PRINTER_ADD("DOOR-OPEN", PRINTER_STATUS_DOOR_OPEN);
-        STATUS_PRINTER_ADD("ERROR", PRINTER_STATUS_ERROR);
-        STATUS_PRINTER_ADD("INITIALIZING", PRINTER_STATUS_INITIALIZING);
-        STATUS_PRINTER_ADD("IO-ACTIVE", PRINTER_STATUS_IO_ACTIVE);
-        STATUS_PRINTER_ADD("MANUAL-FEED", PRINTER_STATUS_MANUAL_FEED);
-        STATUS_PRINTER_ADD("NO-TONER", PRINTER_STATUS_NO_TONER);
-        STATUS_PRINTER_ADD("NOT-AVAILABLE", PRINTER_STATUS_NOT_AVAILABLE);
-        STATUS_PRINTER_ADD("OFFLINE", PRINTER_STATUS_OFFLINE);
-        STATUS_PRINTER_ADD("OUT-OF-MEMORY", PRINTER_STATUS_OUT_OF_MEMORY);
-        STATUS_PRINTER_ADD("OUTPUT-BIN-FULL", PRINTER_STATUS_OUTPUT_BIN_FULL);
-        STATUS_PRINTER_ADD("PAGE-PUNT", PRINTER_STATUS_PAGE_PUNT);
-        STATUS_PRINTER_ADD("PAPER-JAM", PRINTER_STATUS_PAPER_JAM);
-        STATUS_PRINTER_ADD("PAPER-OUT", PRINTER_STATUS_PAPER_OUT);
-        STATUS_PRINTER_ADD("PAPER-PROBLEM", PRINTER_STATUS_PAPER_PROBLEM);
-        STATUS_PRINTER_ADD("PAUSED", PRINTER_STATUS_PAUSED);
-        STATUS_PRINTER_ADD("PENDING-DELETION", PRINTER_STATUS_PENDING_DELETION);
-        STATUS_PRINTER_ADD("POWER-SAVE", PRINTER_STATUS_POWER_SAVE);
-        STATUS_PRINTER_ADD("PRINTING", PRINTER_STATUS_PRINTING);
-        STATUS_PRINTER_ADD("PROCESSING", PRINTER_STATUS_PROCESSING);
-        STATUS_PRINTER_ADD("SERVER-UNKNOWN", PRINTER_STATUS_SERVER_UNKNOWN);
-        STATUS_PRINTER_ADD("TONER-LOW", PRINTER_STATUS_TONER_LOW);
-        STATUS_PRINTER_ADD("USER-INTERVENTION", PRINTER_STATUS_USER_INTERVENTION);
-        STATUS_PRINTER_ADD("WAITING", PRINTER_STATUS_WAITING);
-        STATUS_PRINTER_ADD("WARMING-UP", PRINTER_STATUS_WARMING_UP);
-#undef STATUS_PRINTER_ADD
-        return result;
-    }
-
-    const StatusMapType& getJobStatusMap()
-    {
-        static StatusMapType result;
-        if(!result.empty())
-        {
-            return result;
-        }
-        // add only first time
-#define STATUS_PRINTER_ADD(value, type) result.insert(std::make_pair(value, type))
-        // Common statuses
-        STATUS_PRINTER_ADD("PRINTING", JOB_STATUS_PRINTING);
-        STATUS_PRINTER_ADD("PRINTED", JOB_STATUS_PRINTED);
-        STATUS_PRINTER_ADD("PAUSED", JOB_STATUS_PAUSED);
-
-        // Specific statuses
-        STATUS_PRINTER_ADD("BLOCKED-DEVQ", JOB_STATUS_BLOCKED_DEVQ);
-        STATUS_PRINTER_ADD("DELETED", JOB_STATUS_DELETED);
-        STATUS_PRINTER_ADD("DELETING", JOB_STATUS_DELETING);
-        STATUS_PRINTER_ADD("ERROR", JOB_STATUS_ERROR);
-        STATUS_PRINTER_ADD("OFFLINE", JOB_STATUS_OFFLINE);
-        STATUS_PRINTER_ADD("PAPEROUT", JOB_STATUS_PAPEROUT);
-        STATUS_PRINTER_ADD("RESTART", JOB_STATUS_RESTART);
-        STATUS_PRINTER_ADD("SPOOLING", JOB_STATUS_SPOOLING);
-        STATUS_PRINTER_ADD("USER-INTERVENTION", JOB_STATUS_USER_INTERVENTION);
-        // XP and later
-#ifdef JOB_STATUS_COMPLETE
-        STATUS_PRINTER_ADD("COMPLETE", JOB_STATUS_COMPLETE);
-#endif
-#ifdef JOB_STATUS_RETAINED
-        STATUS_PRINTER_ADD("RETAINED", JOB_STATUS_RETAINED);
-#endif
-
-#undef STATUS_PRINTER_ADD
-        return result;
-    }
-
-    const StatusMapType& getAttributeMap()
-    {
-        static StatusMapType result;
-        if(!result.empty())
-        {
-            return result;
-        }
-        // add only first time
-#define ATTRIBUTE_PRINTER_ADD(value, type) result.insert(std::make_pair(value, type))
-        ATTRIBUTE_PRINTER_ADD("DIRECT", PRINTER_ATTRIBUTE_DIRECT);
-        ATTRIBUTE_PRINTER_ADD("DO-COMPLETE-FIRST", PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST);
-        ATTRIBUTE_PRINTER_ADD("ENABLE-DEVQ", PRINTER_ATTRIBUTE_ENABLE_DEVQ);
-        ATTRIBUTE_PRINTER_ADD("HIDDEN", PRINTER_ATTRIBUTE_HIDDEN);
-        ATTRIBUTE_PRINTER_ADD("KEEPPRINTEDJOBS", PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS);
-        ATTRIBUTE_PRINTER_ADD("LOCAL", PRINTER_ATTRIBUTE_LOCAL);
-        ATTRIBUTE_PRINTER_ADD("NETWORK", PRINTER_ATTRIBUTE_NETWORK);
-        ATTRIBUTE_PRINTER_ADD("PUBLISHED", PRINTER_ATTRIBUTE_PUBLISHED);
-        ATTRIBUTE_PRINTER_ADD("QUEUED", PRINTER_ATTRIBUTE_QUEUED);
-        ATTRIBUTE_PRINTER_ADD("RAW-ONLY", PRINTER_ATTRIBUTE_RAW_ONLY);
-        ATTRIBUTE_PRINTER_ADD("SHARED", PRINTER_ATTRIBUTE_SHARED);
-        ATTRIBUTE_PRINTER_ADD("OFFLINE", PRINTER_ATTRIBUTE_WORK_OFFLINE);
-        // XP
-#ifdef PRINTER_ATTRIBUTE_FAX
-        ATTRIBUTE_PRINTER_ADD("FAX", PRINTER_ATTRIBUTE_FAX);
-#endif
-        // vista
-#ifdef PRINTER_ATTRIBUTE_FRIENDLY_NAME
-        ATTRIBUTE_PRINTER_ADD("FRIENDLY-NAME", PRINTER_ATTRIBUTE_FRIENDLY_NAME);
-        ATTRIBUTE_PRINTER_ADD("MACHINE", PRINTER_ATTRIBUTE_MACHINE);
-        ATTRIBUTE_PRINTER_ADD("PUSHED-USER", PRINTER_ATTRIBUTE_PUSHED_USER);
-        ATTRIBUTE_PRINTER_ADD("PUSHED-MACHINE", PRINTER_ATTRIBUTE_PUSHED_MACHINE);
-#endif
-        // server 2003
-#ifdef PRINTER_ATTRIBUTE_TS
-        ATTRIBUTE_PRINTER_ADD("TS", PRINTER_ATTRIBUTE_TS);
-#endif
-#undef ATTRIBUTE_PRINTER_ADD
-        return result;
-    }
-
-    const StatusMapType& getJobCommandMap()
-    {
-        static StatusMapType result;
-        if(!result.empty())
-        {
-            return result;
-        }
-        // add only first time
-#define COMMAND_JOB_ADD(value, type) result.insert(std::make_pair(value, type))
-        COMMAND_JOB_ADD("CANCEL", JOB_CONTROL_CANCEL);
-        COMMAND_JOB_ADD("PAUSE", JOB_CONTROL_PAUSE);
-        COMMAND_JOB_ADD("RESTART", JOB_CONTROL_RESTART);
-        COMMAND_JOB_ADD("RESUME", JOB_CONTROL_RESUME);
-        COMMAND_JOB_ADD("DELETE", JOB_CONTROL_DELETE);
-        COMMAND_JOB_ADD("SENT-TO-PRINTER", JOB_CONTROL_SENT_TO_PRINTER);
-        COMMAND_JOB_ADD("LAST-PAGE-EJECTED", JOB_CONTROL_LAST_PAGE_EJECTED);
-#ifdef JOB_CONTROL_RETAIN
-        COMMAND_JOB_ADD("RETAIN", JOB_CONTROL_RETAIN);
-#endif
-#ifdef JOB_CONTROL_RELEASE
-        COMMAND_JOB_ADD("RELEASE", JOB_CONTROL_RELEASE);
-#endif
-#undef COMMAND_JOB_ADD
-        return result;
-    }
-
-    void parseJobObject(JOB_INFO_2W *job, v8::Handle<v8::Object> result_printer_job)
-    {
-        MY_NODE_MODULE_ISOLATE_DECL
-        //Common fields
-        //DWORD                JobId;
-        result_printer_job->Set(V8_STRING_NEW_UTF8("id"), V8_VALUE_NEW(Number, job->JobId));
-#define ADD_V8_STRING_PROPERTY(name, key) if((job->##key != NULL) && (*job->##key != L'\0'))    \
-        {                                   \
-            result_printer_job->Set(V8_STRING_NEW_UTF8(#name), V8_STRING_NEW_2BYTES((uint16_t*)job->##key)); \
-        }
-        //LPTSTR               pPrinterName;
-        ADD_V8_STRING_PROPERTY(name, pPrinterName)
-        //LPTSTR               pPrinterName;
-        ADD_V8_STRING_PROPERTY(printerName, pPrinterName);
-        //LPTSTR               pUserName;
-        ADD_V8_STRING_PROPERTY(user, pUserName);
-        //LPTSTR               pDatatype;
-        ADD_V8_STRING_PROPERTY(format, pDatatype);
-        //DWORD                Priority;
-        result_printer_job->Set(V8_STRING_NEW_UTF8("priority"), V8_VALUE_NEW(Number, job->Priority));
-        //DWORD                Size;
-        result_printer_job->Set(V8_STRING_NEW_UTF8("size"), V8_VALUE_NEW(Number, job->Size));
-        //DWORD                Status;
-        v8::Local<v8::Array> result_printer_job_status = V8_VALUE_NEW_DEFAULT_V_0_11_10(Array);
-        int i_status = 0;
-        for(StatusMapType::const_iterator itStatus = getJobStatusMap().begin(); itStatus != getJobStatusMap().end(); ++itStatus)
-        {
-            if(job->Status & itStatus->second)
-            {
-                result_printer_job_status->Set(i_status++, V8_STRING_NEW_UTF8(itStatus->first.c_str()));
-            }
-        }
-        //LPTSTR               pStatus;
-        if((job->pStatus != NULL) && (*job->pStatus != L'\0'))
-        {
-            result_printer_job_status->Set(i_status++, V8_STRING_NEW_2BYTES((uint16_t*)job->pStatus));
-        }
-        result_printer_job->Set(V8_STRING_NEW_UTF8("status"), result_printer_job_status);
-
-        // Specific fields
-        //LPTSTR               pMachineName;
-        ADD_V8_STRING_PROPERTY(machineName, pMachineName);
-        //LPTSTR               pDocument;
-        ADD_V8_STRING_PROPERTY(document, pDocument);
-        //LPTSTR               pNotifyName;
-        ADD_V8_STRING_PROPERTY(notifyName, pNotifyName);
-        //LPTSTR               pPrintProcessor;
-        ADD_V8_STRING_PROPERTY(printProcessor, pPrintProcessor);
-        //LPTSTR               pParameters;
-        ADD_V8_STRING_PROPERTY(parameters, pParameters);
-        //LPTSTR               pDriverName;
-        ADD_V8_STRING_PROPERTY(driverName, pDriverName);
-#undef ADD_V8_STRING_PROPERTY
-        //LPDEVMODE            pDevMode;
-        //PSECURITY_DESCRIPTOR pSecurityDescriptor;
-        //DWORD                Position;
-        result_printer_job->Set(V8_STRING_NEW_UTF8("position"), V8_VALUE_NEW(Number, job->Position));
-        //DWORD                StartTime;
-        result_printer_job->Set(V8_STRING_NEW_UTF8("startTime"), V8_VALUE_NEW(Number, job->StartTime));
-        //DWORD                UntilTime;
-        result_printer_job->Set(V8_STRING_NEW_UTF8("untilTime"), V8_VALUE_NEW(Number, job->UntilTime));
-        //DWORD                TotalPages;
-        result_printer_job->Set(V8_STRING_NEW_UTF8("totalPages"), V8_VALUE_NEW(Number, job->TotalPages));
-        //SYSTEMTIME           Submitted;
-        //DWORD                Time;
-        result_printer_job->Set(V8_STRING_NEW_UTF8("time"), V8_VALUE_NEW(Number, job->Time));
-        //DWORD                PagesPrinted;
-        result_printer_job->Set(V8_STRING_NEW_UTF8("pagesPrinted"), V8_VALUE_NEW(Number, job->PagesPrinted));
-    }
-
-    /**
-     * Returns last error code and message string
-     */
-    std::string getLastErrorCodeAndMessage() {
-    	std::ostringstream s;
-    	DWORD erroCode = GetLastError();
-    	s << "code: " << erroCode;
-    	DWORD retSize;
-    	LPTSTR pTemp = NULL;
-    	retSize = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|
-                                FORMAT_MESSAGE_FROM_SYSTEM|
-                                FORMAT_MESSAGE_ARGUMENT_ARRAY,
-                                NULL,
-                                erroCode,
-                                LANG_NEUTRAL,
-                                (LPTSTR)&pTemp,
-                                0,
-                                NULL );
-        if (retSize && pTemp != NULL) {
-	    //pTemp[strlen(pTemp)-2]='\0'; //remove cr and newline character
-	    //TODO: check if it is needed to convert c string to std::string
-	    std::string stringMessage(pTemp);
-	    s << ", message: " << stringMessage;
-	    LocalFree((HLOCAL)pTemp);
-	}
-
-    	return s.str();
-    }
-
-    std::string retrieveAndParseJobs(const LPWSTR iPrinterName,
-                                     const DWORD& iTotalJobs,
-                                     v8::Handle<v8::Object> result_printer_jobs,
-                                     PrinterHandle& iPrinterHandle)
-    {
-        MY_NODE_MODULE_ISOLATE_DECL
-        DWORD bytes_needed = 0, totalJobs = 0;
-        BOOL bError = EnumJobsW(*iPrinterHandle, 0, iTotalJobs, 2, NULL, bytes_needed, &bytes_needed, &totalJobs);
-        MemValue<JOB_INFO_2W> jobs(bytes_needed);
-        if(!jobs)
-        {
-            std::string error_str("Error on allocating memory for jobs: ");
-            error_str += getLastErrorCodeAndMessage();
-            return error_str;
-        }
-        DWORD dummy_bytes = 0;
-        bError = EnumJobsW(*iPrinterHandle, 0, iTotalJobs, 2, (LPBYTE)jobs.get(), bytes_needed, &dummy_bytes, &totalJobs);
-        if(!bError)
-        {
-            std::string error_str("Error on EnumJobsW: ");
-            error_str += getLastErrorCodeAndMessage();
-            return error_str;
-        }
-        JOB_INFO_2W *job = jobs.get();
-        for(DWORD i = 0; i < totalJobs; ++i, ++job)
-        {
-            v8::Local<v8::Object> result_printer_job = V8_VALUE_NEW_DEFAULT_V_0_11_10(Object);
-            parseJobObject(job, result_printer_job);
-            result_printer_jobs->Set(i, result_printer_job);
-        }
-        return std::string("");
-    }
-
-    std::string parsePrinterInfo(const PRINTER_INFO_2W *printer, v8::Handle<v8::Object> result_printer, PrinterHandle& iPrinterHandle)
-    {
-        MY_NODE_MODULE_ISOLATE_DECL
-    #define ADD_V8_STRING_PROPERTY(name, key) if((printer->##key != NULL) && (*printer->##key != L'\0'))    \
-        {                                   \
-            result_printer->Set(V8_STRING_NEW_UTF8(#name), V8_STRING_NEW_2BYTES((uint16_t*)printer->##key)); \
-        }
-        //LPTSTR               pPrinterName;
-        ADD_V8_STRING_PROPERTY(name, pPrinterName)
-        //LPTSTR               pServerName;
-        ADD_V8_STRING_PROPERTY(serverName, pServerName)
-        //LPTSTR               pShareName;
-        ADD_V8_STRING_PROPERTY(shareName, pShareName)
-        //LPTSTR               pPortName;
-        ADD_V8_STRING_PROPERTY(portName, pPortName)
-        //LPTSTR               pDriverName;
-        ADD_V8_STRING_PROPERTY(driverName, pDriverName)
-        //LPTSTR               pComment;
-        ADD_V8_STRING_PROPERTY(comment, pComment)
-        //LPTSTR               pLocation;
-        ADD_V8_STRING_PROPERTY(location, pLocation)
-        //LPTSTR               pSepFile;
-        ADD_V8_STRING_PROPERTY(sepFile, pSepFile)
-        //LPTSTR               pPrintProcessor;
-        ADD_V8_STRING_PROPERTY(printProcessor, pPrintProcessor)
-        //LPTSTR               pDatatype;
-        ADD_V8_STRING_PROPERTY(datatype, pDatatype)
-        //LPTSTR               pParameters;
-        ADD_V8_STRING_PROPERTY(parameters, pParameters)
-    #undef ADD_V8_STRING_PROPERTY
-        //DWORD                Status;
-        // statuses from:
-        // http://msdn.microsoft.com/en-gb/library/windows/desktop/dd162845(v=vs.85).aspx
-        v8::Local<v8::Array> result_printer_status = V8_VALUE_NEW_DEFAULT_V_0_11_10(Array);
-        int i_status = 0;
-        for(StatusMapType::const_iterator itStatus = getStatusMap().begin(); itStatus != getStatusMap().end(); ++itStatus)
-        {
-            if(printer->Status & itStatus->second)
-            {
-                result_printer_status->Set(i_status, V8_STRING_NEW_UTF8(itStatus->first.c_str()));
-                ++i_status;
-            }
-        }
-        result_printer->Set(V8_STRING_NEW_UTF8("status"), result_printer_status);
-        result_printer->Set(V8_STRING_NEW_UTF8("statusNumber"), V8_VALUE_NEW(Number, printer->Status));
-        //DWORD                Attributes;
-        v8::Local<v8::Array> result_printer_attributes = V8_VALUE_NEW_DEFAULT_V_0_11_10(Array);
-        int i_attribute = 0;
-        for(StatusMapType::const_iterator itAttribute = getAttributeMap().begin(); itAttribute != getAttributeMap().end(); ++itAttribute)
-        {
-            if(printer->Attributes & itAttribute->second)
-            {
-                result_printer_attributes->Set(i_attribute, V8_STRING_NEW_UTF8(itAttribute->first.c_str()));
-                ++i_attribute;
-            }
-        }
-        result_printer->Set(V8_STRING_NEW_UTF8("attributes"), result_printer_attributes);
-        //DWORD                Priority;
-        result_printer->Set(V8_STRING_NEW_UTF8("priority"), V8_VALUE_NEW(Number, printer->Priority));
-        //DWORD                DefaultPriority;
-        result_printer->Set(V8_STRING_NEW_UTF8("defaultPriority"), V8_VALUE_NEW(Number, printer->DefaultPriority));
-        //DWORD                cJobs;
-        //result_printer->Set(V8_STRING_NEW_UTF8("jobs"), V8_VALUE_NEW(Number, printer->cJobs));
-        //DWORD                AveragePPM;
-        result_printer->Set(V8_STRING_NEW_UTF8("averagePPM"), V8_VALUE_NEW(Number, printer->AveragePPM));
-
-        //DWORD                StartTime;
-        if(printer->StartTime > 0)
-        {
-            result_printer->Set(V8_STRING_NEW_UTF8("startTime"), V8_VALUE_NEW(Number, printer->StartTime));
-        }
-        //DWORD                UntilTime;
-        if(printer->UntilTime > 0)
-        {
-            result_printer->Set(V8_STRING_NEW_UTF8("untilTime"), V8_VALUE_NEW(Number, printer->UntilTime));
-        }
-
-        //TODO: to finish to extract all data
-        //LPDEVMODE            pDevMode;
-        //PSECURITY_DESCRIPTOR pSecurityDescriptor;
-
-        if(printer->cJobs > 0)
-        {
-            v8::Local<v8::Array> result_printer_jobs = V8_VALUE_NEW_V_0_11_10(Array, printer->cJobs);
-            // get jobs
-            std::string error_str = retrieveAndParseJobs(printer->pPrinterName, printer->cJobs, result_printer_jobs, iPrinterHandle);
-            if(!error_str.empty())
-            {
-                return error_str;
-            }
-            result_printer->Set(V8_STRING_NEW_UTF8("jobs"), result_printer_jobs);
-        }
-        return "";
-    }
-}
-
-MY_NODE_MODULE_CALLBACK(getPrinters)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    DWORD printers_size = 0;
-    DWORD printers_size_bytes = 0, dummyBytes = 0;
-    DWORD Level = 2;
-    DWORD flags = PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS;// https://msdn.microsoft.com/en-us/library/cc244669.aspx
-    // First try to retrieve the number of printers
-    BOOL bError = EnumPrintersW(flags, NULL, 2, NULL, 0, &printers_size_bytes, &printers_size);
-    // allocate the required memmory
-    MemValue<PRINTER_INFO_2W> printers(printers_size_bytes);
-    if(!printers)
-    {
-        RETURN_EXCEPTION_STR("Error on allocating memory for printers");
-    }
-
-    bError = EnumPrintersW(flags, NULL, 2, (LPBYTE)(printers.get()), printers_size_bytes, &dummyBytes, &printers_size);
-    if(!bError)
-    {
-        std::string error_str("Error on EnumPrinters: ");
-	error_str += getLastErrorCodeAndMessage();
-        RETURN_EXCEPTION_STR(error_str.c_str());
-    }
-    v8::Local<v8::Array> result = V8_VALUE_NEW_V_0_11_10(Array, printers_size);
-    // http://msdn.microsoft.com/en-gb/library/windows/desktop/dd162845(v=vs.85).aspx
-	PRINTER_INFO_2W *printer = printers.get();
-	DWORD i = 0;
-    for(; i < printers_size; ++i, ++printer)
-    {
-        v8::Local<v8::Object> result_printer = V8_VALUE_NEW_DEFAULT_V_0_11_10(Object);
-        PrinterHandle printerHandle((LPWSTR)(printer->pPrinterName));
-        std::string error_str = parsePrinterInfo(printer, result_printer, printerHandle);
-        if(!error_str.empty())
-        {
-            RETURN_EXCEPTION_STR(error_str.c_str());
-        }
-        result->Set(i, result_printer);
-    }
-    MY_NODE_MODULE_RETURN_VALUE(result);
-}
-
-MY_NODE_MODULE_CALLBACK(getDefaultPrinterName)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    // size in chars of the printer name: https://msdn.microsoft.com/en-us/library/windows/desktop/dd144876(v=vs.85).aspx
-    DWORD cSize = 0;
-    GetDefaultPrinterW(NULL, &cSize);
-
-    if(cSize == 0) {
-        MY_NODE_MODULE_RETURN_VALUE(V8_STRING_NEW_UTF8(""));
-    }
-
-    MemValue<uint16_t> bPrinterName(cSize*sizeof(uint16_t));
-    BOOL res = GetDefaultPrinterW((LPWSTR)(bPrinterName.get()), &cSize);
-
-    if(!res) {
-        MY_NODE_MODULE_RETURN_VALUE(V8_STRING_NEW_UTF8(""));
-    }
-
-    MY_NODE_MODULE_RETURN_VALUE(V8_STRING_NEW_2BYTES((uint16_t*)bPrinterName.get()));
-}
-
-MY_NODE_MODULE_CALLBACK(getPrinter)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    REQUIRE_ARGUMENTS(iArgs, 1);
-    REQUIRE_ARGUMENT_STRINGW(iArgs, 0, printername);
-
-    // Open a handle to the printer.
-    PrinterHandle printerHandle((LPWSTR)(*printername));
-    if(!printerHandle)
-    {
-        std::string error_str("error on PrinterHandle: ");
-        error_str += getLastErrorCodeAndMessage();
-        RETURN_EXCEPTION_STR(error_str.c_str());
-    }
-    DWORD printers_size_bytes = 0, dummyBytes = 0;
-    GetPrinterW(*printerHandle, 2, NULL, printers_size_bytes, &printers_size_bytes);
-    MemValue<PRINTER_INFO_2W> printer(printers_size_bytes);
-    if(!printer)
-    {
-        RETURN_EXCEPTION_STR("Error on allocating memory for printers");
-    }
-    BOOL bOK = GetPrinterW(*printerHandle, 2, (LPBYTE)(printer.get()), printers_size_bytes, &printers_size_bytes);
-    if(!bOK)
-    {
-        std::string error_str("Error on GetPrinter: ");
-	error_str += getLastErrorCodeAndMessage();
-        RETURN_EXCEPTION_STR(error_str.c_str());
-    }
-    v8::Local<v8::Object> result_printer = V8_VALUE_NEW_DEFAULT_V_0_11_10(Object);
-    std::string error_str = parsePrinterInfo(printer.get(), result_printer, printerHandle);
-    if(!error_str.empty())
-    {
-        RETURN_EXCEPTION_STR(error_str.c_str());
-    }
-
-    MY_NODE_MODULE_RETURN_VALUE(result_printer);
-}
-
-MY_NODE_MODULE_CALLBACK(getPrinterDriverOptions)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    RETURN_EXCEPTION_STR("not supported on windows");
-}
-
-MY_NODE_MODULE_CALLBACK(getJob)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    REQUIRE_ARGUMENTS(iArgs, 2);
-    REQUIRE_ARGUMENT_STRINGW(iArgs, 0, printername);
-    REQUIRE_ARGUMENT_INTEGER(iArgs, 1, jobId);
-    if(jobId < 0)
-    {
-        RETURN_EXCEPTION_STR("Wrong job number");
-    }
-    // Open a handle to the printer.
-    PrinterHandle printerHandle((LPWSTR)(*printername));
-    if(!printerHandle)
-    {
-        std::string error_str("error on PrinterHandle: ");
-	error_str += getLastErrorCodeAndMessage();
-        RETURN_EXCEPTION_STR(error_str.c_str());
-    }
-    DWORD size_bytes = 0, dummyBytes = 0;
-    GetJobW(*printerHandle, static_cast<DWORD>(jobId), 2, NULL, size_bytes, &size_bytes);
-    MemValue<JOB_INFO_2W> job(size_bytes);
-    if(!job)
-    {
-        RETURN_EXCEPTION_STR("Error on allocating memory for printers");
-    }
-    BOOL bOK = GetJobW(*printerHandle, static_cast<DWORD>(jobId), 2, (LPBYTE)job.get(), size_bytes, &dummyBytes);
-    if(!bOK)
-    {
-        std::string error_str("Error on GetJob. Wrong job id or it was deleted: ");
-	error_str += getLastErrorCodeAndMessage();
-        RETURN_EXCEPTION_STR(error_str.c_str());
-    }
-    v8::Local<v8::Object> result_printer_job = V8_VALUE_NEW_DEFAULT_V_0_11_10(Object);
-    parseJobObject(job.get(), result_printer_job);
-    MY_NODE_MODULE_RETURN_VALUE(result_printer_job);
-}
-
-MY_NODE_MODULE_CALLBACK(setJob)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    REQUIRE_ARGUMENTS(iArgs, 3);
-    REQUIRE_ARGUMENT_STRINGW(iArgs, 0, printername);
-    REQUIRE_ARGUMENT_INTEGER(iArgs, 1, jobId);
-    REQUIRE_ARGUMENT_STRING(iArgs, 2, jobCommandV8);
-    if(jobId < 0)
-    {
-        RETURN_EXCEPTION_STR("Wrong job number");
-    }
-    std::string jobCommandStr(*jobCommandV8);
-    StatusMapType::const_iterator itJobCommand = getJobCommandMap().find(jobCommandStr);
-    if(itJobCommand == getJobCommandMap().end())
-    {
-        RETURN_EXCEPTION_STR("wrong job command. use getSupportedJobCommands to see the possible commands");
-    }
-    DWORD jobCommand = itJobCommand->second;
-    // Open a handle to the printer.
-    PrinterHandle printerHandle((LPWSTR)(*printername));
-    if(!printerHandle)
-    {
-        std::string error_str("error on PrinterHandle: ");
-        error_str += getLastErrorCodeAndMessage();
-        RETURN_EXCEPTION_STR(error_str.c_str());
-    }
-    // TODO: add the possibility to set job properties
-    // http://msdn.microsoft.com/en-us/library/windows/desktop/dd162978(v=vs.85).aspx
-    BOOL ok = SetJobW(*printerHandle, (DWORD)jobId, 0, NULL, jobCommand);
-    MY_NODE_MODULE_RETURN_VALUE(V8_VALUE_NEW_V_0_11_10(Boolean, ok == TRUE));
-}
-
-MY_NODE_MODULE_CALLBACK(getSupportedJobCommands)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    v8::Local<v8::Array> result = V8_VALUE_NEW_DEFAULT_V_0_11_10(Array);
-    int i = 0;
-    for(StatusMapType::const_iterator itJob = getJobCommandMap().begin(); itJob != getJobCommandMap().end(); ++itJob)
-    {
-        result->Set(i++, V8_STRING_NEW_UTF8(itJob->first.c_str()));
-    }
-    MY_NODE_MODULE_RETURN_VALUE(result);
-}
-
-MY_NODE_MODULE_CALLBACK(getSupportedPrintFormats)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    v8::Local<v8::Array> result = V8_VALUE_NEW_DEFAULT_V_0_11_10(Array);
-    int format_i = 0;
-
-    LPTSTR name = NULL;
-    DWORD numBytes = 0, processorsNum = 0;
-
-    // Check the amount of bytes required
-    LPWSTR nullVal = NULL;
-    EnumPrintProcessorsW(nullVal, nullVal, 1, (LPBYTE)(NULL), numBytes, &numBytes, &processorsNum);
-    MemValue<_PRINTPROCESSOR_INFO_1W> processors(numBytes);
-    // Retrieve processors
-    BOOL isOK = EnumPrintProcessorsW(nullVal, nullVal, 1, (LPBYTE)(processors.get()), numBytes, &numBytes, &processorsNum);
-
-    if(!isOK) {
-        std::string error_str("error on EnumPrintProcessorsW: ");
-        error_str += getLastErrorCodeAndMessage();
-        RETURN_EXCEPTION_STR(error_str.c_str());
-    }
-
-    _PRINTPROCESSOR_INFO_1W *pProcessor = processors.get();
-
-    for(DWORD processor_i = 0; processor_i < processorsNum; ++processor_i, ++pProcessor) {
-        numBytes = 0;
-        DWORD dataTypesNum = 0;
-        EnumPrintProcessorDatatypesW(nullVal, pProcessor->pName, 1, (LPBYTE)(NULL), numBytes, &numBytes, &dataTypesNum);
-        MemValue<_DATATYPES_INFO_1W> dataTypes(numBytes);
-        isOK = EnumPrintProcessorDatatypesW(nullVal, pProcessor->pName, 1, (LPBYTE)(dataTypes.get()), numBytes, &numBytes, &dataTypesNum);
-
-        if(!isOK) {
-            std::string error_str("error on EnumPrintProcessorDatatypesW: ");
-            error_str += getLastErrorCodeAndMessage();
-            RETURN_EXCEPTION_STR(error_str.c_str());
-        }
-
-        _DATATYPES_INFO_1W *pDataType = dataTypes.get();
-        for(DWORD j = 0; j < dataTypesNum; ++j, ++pDataType) {
-            result->Set(format_i++, V8_STRING_NEW_2BYTES((uint16_t*)(pDataType->pName)));
-        }
-    }
-
-    MY_NODE_MODULE_RETURN_VALUE(result);
-}
-
-MY_NODE_MODULE_CALLBACK(PrintDirect)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    //TODO: to move in an unique place win and posix input parameters processing
-    REQUIRE_ARGUMENTS(iArgs, 5);
-
-    // can be string or buffer
-    if(iArgs.Length()<=0)
-    {
-        RETURN_EXCEPTION_STR("Argument 0 missing");
-    }
-
-    std::string data;
-    v8::Handle<v8::Value> arg0(iArgs[0]);
-    if (!getStringOrBufferFromV8Value(arg0, data))
-    {
-        RETURN_EXCEPTION_STR("Argument 0 must be a string or Buffer");
-    }
-
-    REQUIRE_ARGUMENT_STRINGW(iArgs, 1, printername);
-    REQUIRE_ARGUMENT_STRINGW(iArgs, 2, docname);
-    REQUIRE_ARGUMENT_STRINGW(iArgs, 3, type);
-
-    BOOL     bStatus = true;
-    // Open a handle to the printer.
-    PrinterHandle printerHandle((LPWSTR)(*printername));
-    DOC_INFO_1W DocInfo;
-    DWORD      dwJob = 0L;
-    DWORD      dwBytesWritten = 0L;
-
-    if (!printerHandle)
-    {
-        std::string error_str("error on PrinterHandle: ");
-        error_str += getLastErrorCodeAndMessage();
-        RETURN_EXCEPTION_STR(error_str.c_str());
-    }
-
-    // Fill in the structure with info about this "document."
-    DocInfo.pDocName = (LPWSTR)(*docname);
-    DocInfo.pOutputFile =  NULL;
-    DocInfo.pDatatype = (LPWSTR)(*type);
-
-    // Inform the spooler the document is beginning.
-    dwJob = StartDocPrinterW(*printerHandle, 1, (LPBYTE)&DocInfo );
-    if (dwJob > 0) {
-        // Start a page.
-        bStatus = StartPagePrinter(*printerHandle);
-        if (bStatus) {
-            // Send the data to the printer.
-            //TODO: check with sizeof(LPTSTR) is the same as sizeof(char)
-            bStatus = WritePrinter( *printerHandle, (LPVOID)(data.c_str()), (DWORD)data.size(), &dwBytesWritten);
-            EndPagePrinter(*printerHandle);
-        }else{
-            std::string error_str("StartPagePrinter error: ");
-    	    error_str += getLastErrorCodeAndMessage();
-            RETURN_EXCEPTION_STR(error_str.c_str());
-        }
-        // Inform the spooler that the document is ending.
-        EndDocPrinter(*printerHandle);
-    }else{
-    	std::string error_str("StartDocPrinterW error: ");
-    	error_str += getLastErrorCodeAndMessage();
-        RETURN_EXCEPTION_STR(error_str.c_str());
-    }
-    // Check to see if correct number of bytes were written.
-    if (dwBytesWritten != data.size()) {
-        RETURN_EXCEPTION_STR("not sent all bytes");
-    }
-    MY_NODE_MODULE_RETURN_VALUE(V8_VALUE_NEW(Number, dwJob));
-}
-
-MY_NODE_MODULE_CALLBACK(PrintFile)
-{
-    MY_NODE_MODULE_HANDLESCOPE;
-    RETURN_EXCEPTION_STR("Not yet implemented on Windows");
-}
diff --git a/js/Windows/node_modules/printer/tools/getSourceFiles.py b/js/Windows/node_modules/printer/tools/getSourceFiles.py
deleted file mode 100644
index de6d59973750f53aeabcb4426887b22165a8499b..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/printer/tools/getSourceFiles.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# simple python command to list files like ls -1
-import os, sys
-
-if len(sys.argv) < 3:
-    sys.stderr.write('use: '+sys.argv[0]+' <path> <ext>. e.g.:'+sys.argv[0]+' src cc\n')
-    sys.exit(1)
-folder = sys.argv[1]
-file_ext = '.'+sys.argv[2]
-
-for file in os.listdir(folder):
-    if (file.endswith(file_ext)):
-        print(folder+'/'+file)
diff --git a/js/Windows/node_modules/safe-buffer/.travis.yml b/js/Windows/node_modules/safe-buffer/.travis.yml
deleted file mode 100644
index 7b20f28cb01a0ce5445a401c3ec1bc92f96fe10d..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/safe-buffer/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: node_js
-node_js:
-  - 'node'
-  - '5'
-  - '4'
-  - '0.12'
-  - '0.10'
diff --git a/js/Windows/node_modules/safe-buffer/LICENSE b/js/Windows/node_modules/safe-buffer/LICENSE
deleted file mode 100644
index 0c068ceecbd48fc4e8279e6451793fec2bf12178..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/safe-buffer/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Feross Aboukhadijeh
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/Windows/node_modules/safe-buffer/README.md b/js/Windows/node_modules/safe-buffer/README.md
deleted file mode 100644
index 96eb387aa0858665c6745a92703623eb7f15a8bc..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/safe-buffer/README.md
+++ /dev/null
@@ -1,581 +0,0 @@
-# safe-buffer [![travis][travis-image]][travis-url] [![npm][npm-image]][npm-url] [![downloads][downloads-image]][npm-url]
-
-#### Safer Node.js Buffer API
-
-**Use the new Node.js v6 Buffer APIs (`Buffer.from`, `Buffer.alloc`,
-`Buffer.allocUnsafe`, `Buffer.allocUnsafeSlow`) in Node.js v0.10, v0.12, v4.x, and v5.x.**
-
-**Uses the built-in implementations when available.**
-
-[travis-image]: https://img.shields.io/travis/feross/safe-buffer.svg
-[travis-url]: https://travis-ci.org/feross/safe-buffer
-[npm-image]: https://img.shields.io/npm/v/safe-buffer.svg
-[npm-url]: https://npmjs.org/package/safe-buffer
-[downloads-image]: https://img.shields.io/npm/dm/safe-buffer.svg
-
-## install
-
-```
-npm install safe-buffer
-```
-
-## usage
-
-The goal of this package is to provide a safe replacement for the node.js `Buffer`.
-
-It's a drop-in replacement for `Buffer`. You can use it by adding one `require` line to
-the top of your node.js modules:
-
-```js
-var Buffer = require('safe-buffer').Buffer
-
-// Existing buffer code will continue to work without issues:
-
-new Buffer('hey', 'utf8')
-new Buffer([1, 2, 3], 'utf8')
-new Buffer(obj)
-new Buffer(16) // create an uninitialized buffer (potentially unsafe)
-
-// But you can use these new explicit APIs to make clear what you want:
-
-Buffer.from('hey', 'utf8') // convert from many types to a Buffer
-Buffer.alloc(16) // create a zero-filled buffer (safe)
-Buffer.allocUnsafe(16) // create an uninitialized buffer (potentially unsafe)
-```
-
-## api
-
-### Class Method: Buffer.from(array)
-<!-- YAML
-added: v3.0.0
--->
-
-* `array` {Array}
-
-Allocates a new `Buffer` using an `array` of octets.
-
-```js
-const buf = Buffer.from([0x62,0x75,0x66,0x66,0x65,0x72]);
-  // creates a new Buffer containing ASCII bytes
-  // ['b','u','f','f','e','r']
-```
-
-A `TypeError` will be thrown if `array` is not an `Array`.
-
-### Class Method: Buffer.from(arrayBuffer[, byteOffset[, length]])
-<!-- YAML
-added: v5.10.0
--->
-
-* `arrayBuffer` {ArrayBuffer} The `.buffer` property of a `TypedArray` or
-  a `new ArrayBuffer()`
-* `byteOffset` {Number} Default: `0`
-* `length` {Number} Default: `arrayBuffer.length - byteOffset`
-
-When passed a reference to the `.buffer` property of a `TypedArray` instance,
-the newly created `Buffer` will share the same allocated memory as the
-TypedArray.
-
-```js
-const arr = new Uint16Array(2);
-arr[0] = 5000;
-arr[1] = 4000;
-
-const buf = Buffer.from(arr.buffer); // shares the memory with arr;
-
-console.log(buf);
-  // Prints: <Buffer 88 13 a0 0f>
-
-// changing the TypedArray changes the Buffer also
-arr[1] = 6000;
-
-console.log(buf);
-  // Prints: <Buffer 88 13 70 17>
-```
-
-The optional `byteOffset` and `length` arguments specify a memory range within
-the `arrayBuffer` that will be shared by the `Buffer`.
-
-```js
-const ab = new ArrayBuffer(10);
-const buf = Buffer.from(ab, 0, 2);
-console.log(buf.length);
-  // Prints: 2
-```
-
-A `TypeError` will be thrown if `arrayBuffer` is not an `ArrayBuffer`.
-
-### Class Method: Buffer.from(buffer)
-<!-- YAML
-added: v3.0.0
--->
-
-* `buffer` {Buffer}
-
-Copies the passed `buffer` data onto a new `Buffer` instance.
-
-```js
-const buf1 = Buffer.from('buffer');
-const buf2 = Buffer.from(buf1);
-
-buf1[0] = 0x61;
-console.log(buf1.toString());
-  // 'auffer'
-console.log(buf2.toString());
-  // 'buffer' (copy is not changed)
-```
-
-A `TypeError` will be thrown if `buffer` is not a `Buffer`.
-
-### Class Method: Buffer.from(str[, encoding])
-<!-- YAML
-added: v5.10.0
--->
-
-* `str` {String} String to encode.
-* `encoding` {String} Encoding to use, Default: `'utf8'`
-
-Creates a new `Buffer` containing the given JavaScript string `str`. If
-provided, the `encoding` parameter identifies the character encoding.
-If not provided, `encoding` defaults to `'utf8'`.
-
-```js
-const buf1 = Buffer.from('this is a tést');
-console.log(buf1.toString());
-  // prints: this is a tést
-console.log(buf1.toString('ascii'));
-  // prints: this is a tC)st
-
-const buf2 = Buffer.from('7468697320697320612074c3a97374', 'hex');
-console.log(buf2.toString());
-  // prints: this is a tést
-```
-
-A `TypeError` will be thrown if `str` is not a string.
-
-### Class Method: Buffer.alloc(size[, fill[, encoding]])
-<!-- YAML
-added: v5.10.0
--->
-
-* `size` {Number}
-* `fill` {Value} Default: `undefined`
-* `encoding` {String} Default: `utf8`
-
-Allocates a new `Buffer` of `size` bytes. If `fill` is `undefined`, the
-`Buffer` will be *zero-filled*.
-
-```js
-const buf = Buffer.alloc(5);
-console.log(buf);
-  // <Buffer 00 00 00 00 00>
-```
-
-The `size` must be less than or equal to the value of
-`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is
-`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will
-be created if a `size` less than or equal to 0 is specified.
-
-If `fill` is specified, the allocated `Buffer` will be initialized by calling
-`buf.fill(fill)`. See [`buf.fill()`][] for more information.
-
-```js
-const buf = Buffer.alloc(5, 'a');
-console.log(buf);
-  // <Buffer 61 61 61 61 61>
-```
-
-If both `fill` and `encoding` are specified, the allocated `Buffer` will be
-initialized by calling `buf.fill(fill, encoding)`. For example:
-
-```js
-const buf = Buffer.alloc(11, 'aGVsbG8gd29ybGQ=', 'base64');
-console.log(buf);
-  // <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64>
-```
-
-Calling `Buffer.alloc(size)` can be significantly slower than the alternative
-`Buffer.allocUnsafe(size)` but ensures that the newly created `Buffer` instance
-contents will *never contain sensitive data*.
-
-A `TypeError` will be thrown if `size` is not a number.
-
-### Class Method: Buffer.allocUnsafe(size)
-<!-- YAML
-added: v5.10.0
--->
-
-* `size` {Number}
-
-Allocates a new *non-zero-filled* `Buffer` of `size` bytes.  The `size` must
-be less than or equal to the value of `require('buffer').kMaxLength` (on 64-bit
-architectures, `kMaxLength` is `(2^31)-1`). Otherwise, a [`RangeError`][] is
-thrown. A zero-length Buffer will be created if a `size` less than or equal to
-0 is specified.
-
-The underlying memory for `Buffer` instances created in this way is *not
-initialized*. The contents of the newly created `Buffer` are unknown and
-*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such
-`Buffer` instances to zeroes.
-
-```js
-const buf = Buffer.allocUnsafe(5);
-console.log(buf);
-  // <Buffer 78 e0 82 02 01>
-  // (octets will be different, every time)
-buf.fill(0);
-console.log(buf);
-  // <Buffer 00 00 00 00 00>
-```
-
-A `TypeError` will be thrown if `size` is not a number.
-
-Note that the `Buffer` module pre-allocates an internal `Buffer` instance of
-size `Buffer.poolSize` that is used as a pool for the fast allocation of new
-`Buffer` instances created using `Buffer.allocUnsafe(size)` (and the deprecated
-`new Buffer(size)` constructor) only when `size` is less than or equal to
-`Buffer.poolSize >> 1` (floor of `Buffer.poolSize` divided by two). The default
-value of `Buffer.poolSize` is `8192` but can be modified.
-
-Use of this pre-allocated internal memory pool is a key difference between
-calling `Buffer.alloc(size, fill)` vs. `Buffer.allocUnsafe(size).fill(fill)`.
-Specifically, `Buffer.alloc(size, fill)` will *never* use the internal Buffer
-pool, while `Buffer.allocUnsafe(size).fill(fill)` *will* use the internal
-Buffer pool if `size` is less than or equal to half `Buffer.poolSize`. The
-difference is subtle but can be important when an application requires the
-additional performance that `Buffer.allocUnsafe(size)` provides.
-
-### Class Method: Buffer.allocUnsafeSlow(size)
-<!-- YAML
-added: v5.10.0
--->
-
-* `size` {Number}
-
-Allocates a new *non-zero-filled* and non-pooled `Buffer` of `size` bytes.  The
-`size` must be less than or equal to the value of
-`require('buffer').kMaxLength` (on 64-bit architectures, `kMaxLength` is
-`(2^31)-1`). Otherwise, a [`RangeError`][] is thrown. A zero-length Buffer will
-be created if a `size` less than or equal to 0 is specified.
-
-The underlying memory for `Buffer` instances created in this way is *not
-initialized*. The contents of the newly created `Buffer` are unknown and
-*may contain sensitive data*. Use [`buf.fill(0)`][] to initialize such
-`Buffer` instances to zeroes.
-
-When using `Buffer.allocUnsafe()` to allocate new `Buffer` instances,
-allocations under 4KB are, by default, sliced from a single pre-allocated
-`Buffer`. This allows applications to avoid the garbage collection overhead of
-creating many individually allocated Buffers. This approach improves both
-performance and memory usage by eliminating the need to track and cleanup as
-many `Persistent` objects.
-
-However, in the case where a developer may need to retain a small chunk of
-memory from a pool for an indeterminate amount of time, it may be appropriate
-to create an un-pooled Buffer instance using `Buffer.allocUnsafeSlow()` then
-copy out the relevant bits.
-
-```js
-// need to keep around a few small chunks of memory
-const store = [];
-
-socket.on('readable', () => {
-  const data = socket.read();
-  // allocate for retained data
-  const sb = Buffer.allocUnsafeSlow(10);
-  // copy the data into the new allocation
-  data.copy(sb, 0, 0, 10);
-  store.push(sb);
-});
-```
-
-Use of `Buffer.allocUnsafeSlow()` should be used only as a last resort *after*
-a developer has observed undue memory retention in their applications.
-
-A `TypeError` will be thrown if `size` is not a number.
-
-### All the Rest
-
-The rest of the `Buffer` API is exactly the same as in node.js.
-[See the docs](https://nodejs.org/api/buffer.html).
-
-
-## Related links
-
-- [Node.js issue: Buffer(number) is unsafe](https://github.com/nodejs/node/issues/4660)
-- [Node.js Enhancement Proposal: Buffer.from/Buffer.alloc/Buffer.zalloc/Buffer() soft-deprecate](https://github.com/nodejs/node-eps/pull/4)
-
-## Why is `Buffer` unsafe?
-
-Today, the node.js `Buffer` constructor is overloaded to handle many different argument
-types like `String`, `Array`, `Object`, `TypedArrayView` (`Uint8Array`, etc.),
-`ArrayBuffer`, and also `Number`.
-
-The API is optimized for convenience: you can throw any type at it, and it will try to do
-what you want.
-
-Because the Buffer constructor is so powerful, you often see code like this:
-
-```js
-// Convert UTF-8 strings to hex
-function toHex (str) {
-  return new Buffer(str).toString('hex')
-}
-```
-
-***But what happens if `toHex` is called with a `Number` argument?***
-
-### Remote Memory Disclosure
-
-If an attacker can make your program call the `Buffer` constructor with a `Number`
-argument, then they can make it allocate uninitialized memory from the node.js process.
-This could potentially disclose TLS private keys, user data, or database passwords.
-
-When the `Buffer` constructor is passed a `Number` argument, it returns an
-**UNINITIALIZED** block of memory of the specified `size`. When you create a `Buffer` like
-this, you **MUST** overwrite the contents before returning it to the user.
-
-From the [node.js docs](https://nodejs.org/api/buffer.html#buffer_new_buffer_size):
-
-> `new Buffer(size)`
->
-> - `size` Number
->
-> The underlying memory for `Buffer` instances created in this way is not initialized.
-> **The contents of a newly created `Buffer` are unknown and could contain sensitive
-> data.** Use `buf.fill(0)` to initialize a Buffer to zeroes.
-
-(Emphasis our own.)
-
-Whenever the programmer intended to create an uninitialized `Buffer` you often see code
-like this:
-
-```js
-var buf = new Buffer(16)
-
-// Immediately overwrite the uninitialized buffer with data from another buffer
-for (var i = 0; i < buf.length; i++) {
-  buf[i] = otherBuf[i]
-}
-```
-
-
-### Would this ever be a problem in real code?
-
-Yes. It's surprisingly common to forget to check the type of your variables in a
-dynamically-typed language like JavaScript.
-
-Usually the consequences of assuming the wrong type is that your program crashes with an
-uncaught exception. But the failure mode for forgetting to check the type of arguments to
-the `Buffer` constructor is more catastrophic.
-
-Here's an example of a vulnerable service that takes a JSON payload and converts it to
-hex:
-
-```js
-// Take a JSON payload {str: "some string"} and convert it to hex
-var server = http.createServer(function (req, res) {
-  var data = ''
-  req.setEncoding('utf8')
-  req.on('data', function (chunk) {
-    data += chunk
-  })
-  req.on('end', function () {
-    var body = JSON.parse(data)
-    res.end(new Buffer(body.str).toString('hex'))
-  })
-})
-
-server.listen(8080)
-```
-
-In this example, an http client just has to send:
-
-```json
-{
-  "str": 1000
-}
-```
-
-and it will get back 1,000 bytes of uninitialized memory from the server.
-
-This is a very serious bug. It's similar in severity to the
-[the Heartbleed bug](http://heartbleed.com/) that allowed disclosure of OpenSSL process
-memory by remote attackers.
-
-
-### Which real-world packages were vulnerable?
-
-#### [`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht)
-
-[Mathias Buus](https://github.com/mafintosh) and I
-([Feross Aboukhadijeh](http://feross.org/)) found this issue in one of our own packages,
-[`bittorrent-dht`](https://www.npmjs.com/package/bittorrent-dht). The bug would allow
-anyone on the internet to send a series of messages to a user of `bittorrent-dht` and get
-them to reveal 20 bytes at a time of uninitialized memory from the node.js process.
-
-Here's
-[the commit](https://github.com/feross/bittorrent-dht/commit/6c7da04025d5633699800a99ec3fbadf70ad35b8)
-that fixed it. We released a new fixed version, created a
-[Node Security Project disclosure](https://nodesecurity.io/advisories/68), and deprecated all
-vulnerable versions on npm so users will get a warning to upgrade to a newer version.
-
-#### [`ws`](https://www.npmjs.com/package/ws)
-
-That got us wondering if there were other vulnerable packages. Sure enough, within a short
-period of time, we found the same issue in [`ws`](https://www.npmjs.com/package/ws), the
-most popular WebSocket implementation in node.js.
-
-If certain APIs were called with `Number` parameters instead of `String` or `Buffer` as
-expected, then uninitialized server memory would be disclosed to the remote peer.
-
-These were the vulnerable methods:
-
-```js
-socket.send(number)
-socket.ping(number)
-socket.pong(number)
-```
-
-Here's a vulnerable socket server with some echo functionality:
-
-```js
-server.on('connection', function (socket) {
-  socket.on('message', function (message) {
-    message = JSON.parse(message)
-    if (message.type === 'echo') {
-      socket.send(message.data) // send back the user's message
-    }
-  })
-})
-```
-
-`socket.send(number)` called on the server, will disclose server memory.
-
-Here's [the release](https://github.com/websockets/ws/releases/tag/1.0.1) where the issue
-was fixed, with a more detailed explanation. Props to
-[Arnout Kazemier](https://github.com/3rd-Eden) for the quick fix. Here's the
-[Node Security Project disclosure](https://nodesecurity.io/advisories/67).
-
-
-### What's the solution?
-
-It's important that node.js offers a fast way to get memory otherwise performance-critical
-applications would needlessly get a lot slower.
-
-But we need a better way to *signal our intent* as programmers. **When we want
-uninitialized memory, we should request it explicitly.**
-
-Sensitive functionality should not be packed into a developer-friendly API that loosely
-accepts many different types. This type of API encourages the lazy practice of passing
-variables in without checking the type very carefully.
-
-#### A new API: `Buffer.allocUnsafe(number)`
-
-The functionality of creating buffers with uninitialized memory should be part of another
-API. We propose `Buffer.allocUnsafe(number)`. This way, it's not part of an API that
-frequently gets user input of all sorts of different types passed into it.
-
-```js
-var buf = Buffer.allocUnsafe(16) // careful, uninitialized memory!
-
-// Immediately overwrite the uninitialized buffer with data from another buffer
-for (var i = 0; i < buf.length; i++) {
-  buf[i] = otherBuf[i]
-}
-```
-
-
-### How do we fix node.js core?
-
-We sent [a PR to node.js core](https://github.com/nodejs/node/pull/4514) (merged as
-`semver-major`) which defends against one case:
-
-```js
-var str = 16
-new Buffer(str, 'utf8')
-```
-
-In this situation, it's implied that the programmer intended the first argument to be a
-string, since they passed an encoding as a second argument. Today, node.js will allocate
-uninitialized memory in the case of `new Buffer(number, encoding)`, which is probably not
-what the programmer intended.
-
-But this is only a partial solution, since if the programmer does `new Buffer(variable)`
-(without an `encoding` parameter) there's no way to know what they intended. If `variable`
-is sometimes a number, then uninitialized memory will sometimes be returned.
-
-### What's the real long-term fix?
-
-We could deprecate and remove `new Buffer(number)` and use `Buffer.allocUnsafe(number)` when
-we need uninitialized memory. But that would break 1000s of packages.
-
-~~We believe the best solution is to:~~
-
-~~1. Change `new Buffer(number)` to return safe, zeroed-out memory~~
-
-~~2. Create a new API for creating uninitialized Buffers. We propose: `Buffer.allocUnsafe(number)`~~
-
-#### Update
-
-We now support adding three new APIs:
-
-- `Buffer.from(value)` - convert from any type to a buffer
-- `Buffer.alloc(size)` - create a zero-filled buffer
-- `Buffer.allocUnsafe(size)` - create an uninitialized buffer with given size
-
-This solves the core problem that affected `ws` and `bittorrent-dht` which is
-`Buffer(variable)` getting tricked into taking a number argument.
-
-This way, existing code continues working and the impact on the npm ecosystem will be
-minimal. Over time, npm maintainers can migrate performance-critical code to use
-`Buffer.allocUnsafe(number)` instead of `new Buffer(number)`.
-
-
-### Conclusion
-
-We think there's a serious design issue with the `Buffer` API as it exists today. It
-promotes insecure software by putting high-risk functionality into a convenient API
-with friendly "developer ergonomics".
-
-This wasn't merely a theoretical exercise because we found the issue in some of the
-most popular npm packages.
-
-Fortunately, there's an easy fix that can be applied today. Use `safe-buffer` in place of
-`buffer`.
-
-```js
-var Buffer = require('safe-buffer').Buffer
-```
-
-Eventually, we hope that node.js core can switch to this new, safer behavior. We believe
-the impact on the ecosystem would be minimal since it's not a breaking change.
-Well-maintained, popular packages would be updated to use `Buffer.alloc` quickly, while
-older, insecure packages would magically become safe from this attack vector.
-
-
-## links
-
-- [Node.js PR: buffer: throw if both length and enc are passed](https://github.com/nodejs/node/pull/4514)
-- [Node Security Project disclosure for `ws`](https://nodesecurity.io/advisories/67)
-- [Node Security Project disclosure for`bittorrent-dht`](https://nodesecurity.io/advisories/68)
-
-
-## credit
-
-The original issues in `bittorrent-dht`
-([disclosure](https://nodesecurity.io/advisories/68)) and
-`ws` ([disclosure](https://nodesecurity.io/advisories/67)) were discovered by
-[Mathias Buus](https://github.com/mafintosh) and
-[Feross Aboukhadijeh](http://feross.org/).
-
-Thanks to [Adam Baldwin](https://github.com/evilpacket) for helping disclose these issues
-and for his work running the [Node Security Project](https://nodesecurity.io/).
-
-Thanks to [John Hiesey](https://github.com/jhiesey) for proofreading this README and
-auditing the code.
-
-
-## license
-
-MIT. Copyright (C) [Feross Aboukhadijeh](http://feross.org)
diff --git a/js/Windows/node_modules/safe-buffer/browser.js b/js/Windows/node_modules/safe-buffer/browser.js
deleted file mode 100644
index 0bd12027d30ff7bddbd4d78db61b27d344511cae..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/safe-buffer/browser.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('buffer')
diff --git a/js/Windows/node_modules/safe-buffer/index.js b/js/Windows/node_modules/safe-buffer/index.js
deleted file mode 100644
index 74a7358ee82ac58bda839be95ced8e5333d2eead..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/safe-buffer/index.js
+++ /dev/null
@@ -1,58 +0,0 @@
-var buffer = require('buffer')
-
-if (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {
-  module.exports = buffer
-} else {
-  // Copy properties from require('buffer')
-  Object.keys(buffer).forEach(function (prop) {
-    exports[prop] = buffer[prop]
-  })
-  exports.Buffer = SafeBuffer
-}
-
-function SafeBuffer (arg, encodingOrOffset, length) {
-  return Buffer(arg, encodingOrOffset, length)
-}
-
-// Copy static methods from Buffer
-Object.keys(Buffer).forEach(function (prop) {
-  SafeBuffer[prop] = Buffer[prop]
-})
-
-SafeBuffer.from = function (arg, encodingOrOffset, length) {
-  if (typeof arg === 'number') {
-    throw new TypeError('Argument must not be a number')
-  }
-  return Buffer(arg, encodingOrOffset, length)
-}
-
-SafeBuffer.alloc = function (size, fill, encoding) {
-  if (typeof size !== 'number') {
-    throw new TypeError('Argument must be a number')
-  }
-  var buf = Buffer(size)
-  if (fill !== undefined) {
-    if (typeof encoding === 'string') {
-      buf.fill(fill, encoding)
-    } else {
-      buf.fill(fill)
-    }
-  } else {
-    buf.fill(0)
-  }
-  return buf
-}
-
-SafeBuffer.allocUnsafe = function (size) {
-  if (typeof size !== 'number') {
-    throw new TypeError('Argument must be a number')
-  }
-  return Buffer(size)
-}
-
-SafeBuffer.allocUnsafeSlow = function (size) {
-  if (typeof size !== 'number') {
-    throw new TypeError('Argument must be a number')
-  }
-  return buffer.SlowBuffer(size)
-}
diff --git a/js/Windows/node_modules/safe-buffer/package.json b/js/Windows/node_modules/safe-buffer/package.json
deleted file mode 100644
index 44efec41cac42db751befba5b35d570c268e44cd..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/safe-buffer/package.json
+++ /dev/null
@@ -1,103 +0,0 @@
-{
-  "_args": [
-    [
-      {
-        "raw": "safe-buffer@~5.0.1",
-        "scope": null,
-        "escapedName": "safe-buffer",
-        "name": "safe-buffer",
-        "rawSpec": "~5.0.1",
-        "spec": ">=5.0.1 <5.1.0",
-        "type": "range"
-      },
-      "C:\\MIT\\fablab\\PrintServer\\node_modules\\ws"
-    ]
-  ],
-  "_from": "safe-buffer@>=5.0.1 <5.1.0",
-  "_id": "safe-buffer@5.0.1",
-  "_inCache": true,
-  "_location": "/safe-buffer",
-  "_nodeVersion": "4.4.5",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/safe-buffer-5.0.1.tgz_1464588482081_0.8112505874596536"
-  },
-  "_npmUser": {
-    "name": "feross",
-    "email": "feross@feross.org"
-  },
-  "_npmVersion": "2.15.5",
-  "_phantomChildren": {},
-  "_requested": {
-    "raw": "safe-buffer@~5.0.1",
-    "scope": null,
-    "escapedName": "safe-buffer",
-    "name": "safe-buffer",
-    "rawSpec": "~5.0.1",
-    "spec": ">=5.0.1 <5.1.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/ws"
-  ],
-  "_resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
-  "_shasum": "d263ca54696cd8a306b5ca6551e92de57918fbe7",
-  "_shrinkwrap": null,
-  "_spec": "safe-buffer@~5.0.1",
-  "_where": "C:\\MIT\\fablab\\PrintServer\\node_modules\\ws",
-  "author": {
-    "name": "Feross Aboukhadijeh",
-    "email": "feross@feross.org",
-    "url": "http://feross.org"
-  },
-  "browser": "./browser.js",
-  "bugs": {
-    "url": "https://github.com/feross/safe-buffer/issues"
-  },
-  "dependencies": {},
-  "description": "Safer Node.js Buffer API",
-  "devDependencies": {
-    "standard": "^7.0.0",
-    "tape": "^4.0.0",
-    "zuul": "^3.0.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "d263ca54696cd8a306b5ca6551e92de57918fbe7",
-    "tarball": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz"
-  },
-  "gitHead": "1e371a367da962afae2bebc527b50271c739d28c",
-  "homepage": "https://github.com/feross/safe-buffer",
-  "keywords": [
-    "buffer",
-    "buffer allocate",
-    "node security",
-    "safe",
-    "safe-buffer",
-    "security",
-    "uninitialized"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "feross",
-      "email": "feross@feross.org"
-    },
-    {
-      "name": "mafintosh",
-      "email": "mathiasbuus@gmail.com"
-    }
-  ],
-  "name": "safe-buffer",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/feross/safe-buffer.git"
-  },
-  "scripts": {
-    "test": "standard && tape test.js"
-  },
-  "version": "5.0.1"
-}
diff --git a/js/Windows/node_modules/safe-buffer/test.js b/js/Windows/node_modules/safe-buffer/test.js
deleted file mode 100644
index 7da8ad761ee720bab57c1315453378fc5c524e0d..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/safe-buffer/test.js
+++ /dev/null
@@ -1,99 +0,0 @@
-var test = require('tape')
-var SafeBuffer = require('./').Buffer
-
-test('new SafeBuffer(value) works just like Buffer', function (t) {
-  t.deepEqual(new SafeBuffer('hey'), new Buffer('hey'))
-  t.deepEqual(new SafeBuffer('hey', 'utf8'), new Buffer('hey', 'utf8'))
-  t.deepEqual(new SafeBuffer('686579', 'hex'), new Buffer('686579', 'hex'))
-  t.deepEqual(new SafeBuffer([1, 2, 3]), new Buffer([1, 2, 3]))
-  t.deepEqual(new SafeBuffer(new Uint8Array([1, 2, 3])), new Buffer(new Uint8Array([1, 2, 3])))
-
-  t.equal(typeof SafeBuffer.isBuffer, 'function')
-  t.equal(SafeBuffer.isBuffer(new SafeBuffer('hey')), true)
-  t.equal(Buffer.isBuffer(new SafeBuffer('hey')), true)
-  t.notOk(SafeBuffer.isBuffer({}))
-
-  t.end()
-})
-
-test('SafeBuffer.from(value) converts to a Buffer', function (t) {
-  t.deepEqual(SafeBuffer.from('hey'), new Buffer('hey'))
-  t.deepEqual(SafeBuffer.from('hey', 'utf8'), new Buffer('hey', 'utf8'))
-  t.deepEqual(SafeBuffer.from('686579', 'hex'), new Buffer('686579', 'hex'))
-  t.deepEqual(SafeBuffer.from([1, 2, 3]), new Buffer([1, 2, 3]))
-  t.deepEqual(SafeBuffer.from(new Uint8Array([1, 2, 3])), new Buffer(new Uint8Array([1, 2, 3])))
-
-  t.end()
-})
-
-test('SafeBuffer.alloc(number) returns zeroed-out memory', function (t) {
-  for (var i = 0; i < 10; i++) {
-    var expected1 = new Buffer(1000)
-    expected1.fill(0)
-    t.deepEqual(SafeBuffer.alloc(1000), expected1)
-
-    var expected2 = new Buffer(1000 * 1000)
-    expected2.fill(0)
-    t.deepEqual(SafeBuffer.alloc(1000 * 1000), expected2)
-  }
-  t.end()
-})
-
-test('SafeBuffer.allocUnsafe(number)', function (t) {
-  var buf = SafeBuffer.allocUnsafe(100) // unitialized memory
-  t.equal(buf.length, 100)
-  t.equal(SafeBuffer.isBuffer(buf), true)
-  t.equal(Buffer.isBuffer(buf), true)
-  t.end()
-})
-
-test('SafeBuffer.from() throws with number types', function (t) {
-  t.plan(5)
-  t.throws(function () {
-    SafeBuffer.from(0)
-  })
-  t.throws(function () {
-    SafeBuffer.from(-1)
-  })
-  t.throws(function () {
-    SafeBuffer.from(NaN)
-  })
-  t.throws(function () {
-    SafeBuffer.from(Infinity)
-  })
-  t.throws(function () {
-    SafeBuffer.from(99)
-  })
-})
-
-test('SafeBuffer.allocUnsafe() throws with non-number types', function (t) {
-  t.plan(4)
-  t.throws(function () {
-    SafeBuffer.allocUnsafe('hey')
-  })
-  t.throws(function () {
-    SafeBuffer.allocUnsafe('hey', 'utf8')
-  })
-  t.throws(function () {
-    SafeBuffer.allocUnsafe([1, 2, 3])
-  })
-  t.throws(function () {
-    SafeBuffer.allocUnsafe({})
-  })
-})
-
-test('SafeBuffer.alloc() throws with non-number types', function (t) {
-  t.plan(4)
-  t.throws(function () {
-    SafeBuffer.alloc('hey')
-  })
-  t.throws(function () {
-    SafeBuffer.alloc('hey', 'utf8')
-  })
-  t.throws(function () {
-    SafeBuffer.alloc([1, 2, 3])
-  })
-  t.throws(function () {
-    SafeBuffer.alloc({})
-  })
-})
diff --git a/js/Windows/node_modules/ultron/LICENSE b/js/Windows/node_modules/ultron/LICENSE
deleted file mode 100644
index 6dc9316a6c92f2782c0bcf29951bf2a704524277..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ultron/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Unshift.io, Arnout Kazemier,  the Contributors.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
diff --git a/js/Windows/node_modules/ultron/index.js b/js/Windows/node_modules/ultron/index.js
deleted file mode 100644
index 9e0677aa07c0add048eb661b6bf5acb5448f1319..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ultron/index.js
+++ /dev/null
@@ -1,138 +0,0 @@
-'use strict';
-
-var has = Object.prototype.hasOwnProperty;
-
-/**
- * An auto incrementing id which we can use to create "unique" Ultron instances
- * so we can track the event emitters that are added through the Ultron
- * interface.
- *
- * @type {Number}
- * @private
- */
-var id = 0;
-
-/**
- * Ultron is high-intelligence robot. It gathers intelligence so it can start improving
- * upon his rudimentary design. It will learn from your EventEmitting patterns
- * and exterminate them.
- *
- * @constructor
- * @param {EventEmitter} ee EventEmitter instance we need to wrap.
- * @api public
- */
-function Ultron(ee) {
-  if (!(this instanceof Ultron)) return new Ultron(ee);
-
-  this.id = id++;
-  this.ee = ee;
-}
-
-/**
- * Register a new EventListener for the given event.
- *
- * @param {String} event Name of the event.
- * @param {Functon} fn Callback function.
- * @param {Mixed} context The context of the function.
- * @returns {Ultron}
- * @api public
- */
-Ultron.prototype.on = function on(event, fn, context) {
-  fn.__ultron = this.id;
-  this.ee.on(event, fn, context);
-
-  return this;
-};
-/**
- * Add an EventListener that's only called once.
- *
- * @param {String} event Name of the event.
- * @param {Function} fn Callback function.
- * @param {Mixed} context The context of the function.
- * @returns {Ultron}
- * @api public
- */
-Ultron.prototype.once = function once(event, fn, context) {
-  fn.__ultron = this.id;
-  this.ee.once(event, fn, context);
-
-  return this;
-};
-
-/**
- * Remove the listeners we assigned for the given event.
- *
- * @returns {Ultron}
- * @api public
- */
-Ultron.prototype.remove = function remove() {
-  var args = arguments
-    , ee = this.ee
-    , event;
-
-  //
-  // When no event names are provided we assume that we need to clear all the
-  // events that were assigned through us.
-  //
-  if (args.length === 1 && 'string' === typeof args[0]) {
-    args = args[0].split(/[, ]+/);
-  } else if (!args.length) {
-    if (ee.eventNames) {
-      args = ee.eventNames();
-    } else if (ee._events) {
-      args = [];
-
-      for (event in ee._events) {
-        if (has.call(ee._events, event)) args.push(event);
-      }
-
-      if (Object.getOwnPropertySymbols) {
-        args = args.concat(Object.getOwnPropertySymbols(ee._events));
-      }
-    }
-  }
-
-  for (var i = 0; i < args.length; i++) {
-    var listeners = ee.listeners(args[i]);
-
-    for (var j = 0; j < listeners.length; j++) {
-      event = listeners[j];
-
-      //
-      // Once listeners have a `listener` property that stores the real listener
-      // in the EventEmitter that ships with Node.js.
-      //
-      if (event.listener) {
-        if (event.listener.__ultron !== this.id) continue;
-        delete event.listener.__ultron;
-      } else {
-        if (event.__ultron !== this.id) continue;
-        delete event.__ultron;
-      }
-
-      ee.removeListener(args[i], event);
-    }
-  }
-
-  return this;
-};
-
-/**
- * Destroy the Ultron instance, remove all listeners and release all references.
- *
- * @returns {Boolean}
- * @api public
- */
-Ultron.prototype.destroy = function destroy() {
-  if (!this.ee) return false;
-
-  this.remove();
-  this.ee = null;
-
-  return true;
-};
-
-//
-// Expose the module.
-//
-module.exports = Ultron;
diff --git a/js/Windows/node_modules/ultron/package.json b/js/Windows/node_modules/ultron/package.json
deleted file mode 100644
index 5670e3bf54d34d5926fb1a98544632b6884eca19..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ultron/package.json
+++ /dev/null
@@ -1,112 +0,0 @@
-{
-  "_args": [
-    [
-      {
-        "raw": "ultron@~1.1.0",
-        "scope": null,
-        "escapedName": "ultron",
-        "name": "ultron",
-        "rawSpec": "~1.1.0",
-        "spec": ">=1.1.0 <1.2.0",
-        "type": "range"
-      },
-      "C:\\MIT\\fablab\\PrintServer\\node_modules\\ws"
-    ]
-  ],
-  "_from": "ultron@>=1.1.0 <1.2.0",
-  "_id": "ultron@1.1.0",
-  "_inCache": true,
-  "_location": "/ultron",
-  "_nodeVersion": "6.2.1",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/ultron-1.1.0.tgz_1483969751660_0.8877595944795758"
-  },
-  "_npmUser": {
-    "name": "3rdeden",
-    "email": "npm@3rd-Eden.com"
-  },
-  "_npmVersion": "3.9.3",
-  "_phantomChildren": {},
-  "_requested": {
-    "raw": "ultron@~1.1.0",
-    "scope": null,
-    "escapedName": "ultron",
-    "name": "ultron",
-    "rawSpec": "~1.1.0",
-    "spec": ">=1.1.0 <1.2.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/ws"
-  ],
-  "_resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz",
-  "_shasum": "b07a2e6a541a815fc6a34ccd4533baec307ca864",
-  "_shrinkwrap": null,
-  "_spec": "ultron@~1.1.0",
-  "_where": "C:\\MIT\\fablab\\PrintServer\\node_modules\\ws",
-  "author": {
-    "name": "Arnout Kazemier"
-  },
-  "bugs": {
-    "url": "https://github.com/unshiftio/ultron/issues"
-  },
-  "dependencies": {},
-  "description": "Ultron is high-intelligence robot. It gathers intel so it can start improving upon his rudimentary design",
-  "devDependencies": {
-    "assume": "1.4.x",
-    "eventemitter3": "2.0.x",
-    "istanbul": "0.4.x",
-    "mocha": "~3.2.0",
-    "pre-commit": "~1.2.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "b07a2e6a541a815fc6a34ccd4533baec307ca864",
-    "tarball": "https://registry.npmjs.org/ultron/-/ultron-1.1.0.tgz"
-  },
-  "gitHead": "6eb97b74402978aebda4a9d497cb6243ec80c9f1",
-  "homepage": "https://github.com/unshiftio/ultron",
-  "keywords": [
-    "Ultron",
-    "robot",
-    "gather",
-    "intelligence",
-    "event",
-    "events",
-    "eventemitter",
-    "emitter",
-    "cleanup"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "unshift",
-      "email": "npm@unshift.io"
-    },
-    {
-      "name": "v1",
-      "email": "info@3rd-Eden.com"
-    },
-    {
-      "name": "3rdeden",
-      "email": "npm@3rd-Eden.com"
-    }
-  ],
-  "name": "ultron",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/unshiftio/ultron.git"
-  },
-  "scripts": {
-    "100%": "istanbul check-coverage --statements 100 --functions 100 --lines 100 --branches 100",
-    "coverage": "istanbul cover _mocha -- test.js",
-    "test": "mocha test.js",
-    "test-travis": "istanbul cover _mocha --report lcovonly -- test.js",
-    "watch": "mocha --watch test.js"
-  },
-  "version": "1.1.0"
-}
diff --git a/js/Windows/node_modules/ws/LICENSE b/js/Windows/node_modules/ws/LICENSE
deleted file mode 100644
index a145cd1dff053182c444072e1c199926e0cb09ad..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2011 Einar Otto Stangvik <einaros@gmail.com>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/Windows/node_modules/ws/README.md b/js/Windows/node_modules/ws/README.md
deleted file mode 100644
index 1ca0bdb917ae7c44327eb624f1399ccc49f0b85b..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/README.md
+++ /dev/null
@@ -1,260 +0,0 @@
-# ws: a Node.js WebSocket library
-
-[![Version npm](https://img.shields.io/npm/v/ws.svg)](https://www.npmjs.com/package/ws)
-[![Linux Build](https://img.shields.io/travis/websockets/ws/master.svg)](https://travis-ci.org/websockets/ws)
-[![Windows Build](https://ci.appveyor.com/api/projects/status/github/websockets/ws?branch=master&svg=true)](https://ci.appveyor.com/project/lpinca/ws)
-[![Coverage Status](https://img.shields.io/coveralls/websockets/ws/master.svg)](https://coveralls.io/r/websockets/ws?branch=master)
-
-`ws` is a simple to use, blazing fast, and thoroughly tested WebSocket client
-and server implementation.
-
-Passes the quite extensive Autobahn test suite. See http://websockets.github.io/ws/
-for the full reports.
-
-**Note**: This module does not work in the browser. The client in the docs is a
-reference to a back end with the role of a client in the WebSocket
-communication. Browser clients must use the native
-[`WebSocket`](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) object.
-
-## Protocol support
-
-* **HyBi drafts 07-12** (Use the option `protocolVersion: 8`)
-* **HyBi drafts 13-17** (Current default, alternatively option `protocolVersion: 13`)
-
-## Installing
-
-```
-npm install --save ws
-```
-
-### Opt-in for performance and spec compliance
-
-There are 2 optional modules that can be installed along side with the `ws`
-module. These modules are binary addons which improve certain operations.
-Prebuilt binaries are available for the most popular platforms so you don't
-necessarily need to have a C++ compiler installed on your machine.
-
-- `npm install --save-optional bufferutil`: Allows to efficiently perform
-  operations such as masking and unmasking the data payload of the WebSocket
-  frames.
-- `npm install --save-optional utf-8-validate`: Allows to efficiently check
-  if a message contains valid UTF-8 as required by the spec.
-
-## API Docs
-
-See [`/doc/ws.md`](https://github.com/websockets/ws/blob/master/doc/ws.md)
-for Node.js-like docs for the ws classes.
-
-## WebSocket compression
-
-`ws` supports the [permessage-deflate extension][permessage-deflate] which
-enables the client and server to negotiate a compression algorithm and its
-parameters, and then selectively apply it to the data payloads of each
-WebSocket message.
-
-The extension is enabled by default but adds a significant overhead in terms of
-performance and memory comsumption. We suggest to use WebSocket compression
-only if it is really needed.
-
-To disable the extension you can set the `perMessageDeflate` option to `false`.
-On the server:
-
-```js
-const WebSocket = require('ws');
-
-const wss = new WebSocket.Server({
-  perMessageDeflate: false,
-  port: 8080
-});
-```
-
-On the client:
-
-```js
-const WebSocket = require('ws');
-
-const ws = new WebSocket('ws://www.host.com/path', {
-  perMessageDeflate: false
-});
-```
-
-## Usage examples
-
-### Sending and receiving text data
-
-```js
-const WebSocket = require('ws');
-
-const ws = new WebSocket('ws://www.host.com/path');
-
-ws.on('open', function open() {
-  ws.send('something');
-});
-
-ws.on('message', function incoming(data, flags) {
-  // flags.binary will be set if a binary data is received.
-  // flags.masked will be set if the data was masked.
-});
-```
-
-### Sending binary data
-
-```js
-const WebSocket = require('ws');
-
-const ws = new WebSocket('ws://www.host.com/path');
-
-ws.on('open', function open() {
-  const array = new Float32Array(5);
-
-  for (var i = 0; i < array.length; ++i) {
-    array[i] = i / 2;
-  }
-
-  ws.send(array);
-});
-```
-
-### Server example
-
-```js
-const WebSocket = require('ws');
-
-const wss = new WebSocket.Server({ port: 8080 });
-
-wss.on('connection', function connection(ws) {
-  ws.on('message', function incoming(message) {
-    console.log('received: %s', message);
-  });
-
-  ws.send('something');
-});
-```
-
-### Broadcast example
-
-```js
-const WebSocket = require('ws');
-
-const wss = new WebSocket.Server({ port: 8080 });
-
-// Broadcast to all.
-wss.broadcast = function broadcast(data) {
-  wss.clients.forEach(function each(client) {
-    if (client.readyState === WebSocket.OPEN) {
-      client.send(data);
-    }
-  });
-};
-
-wss.on('connection', function connection(ws) {
-  ws.on('message', function incoming(data) {
-    // Broadcast to everyone else.
-    wss.clients.forEach(function each(client) {
-      if (client !== ws && client.readyState === WebSocket.OPEN) {
-        client.send(data);
-      }
-    });
-  });
-});
-```
-
-### ExpressJS example
-
-```js
-const express = require('express');
-const http = require('http');
-const url = require('url');
-const WebSocket = require('ws');
-
-const app = express();
-
-app.use(function (req, res) {
-  res.send({ msg: "hello" });
-});
-
-const server = http.createServer(app);
-const wss = new WebSocket.Server({ server });
-
-wss.on('connection', function connection(ws) {
-  const location = url.parse(ws.upgradeReq.url, true);
-  // You might use location.query.access_token to authenticate or share sessions
-  // or ws.upgradeReq.headers.cookie (see http://stackoverflow.com/a/16395220/151312)
-
-  ws.on('message', function incoming(message) {
-    console.log('received: %s', message);
-  });
-
-  ws.send('something');
-});
-
-server.listen(8080, function listening() {
-  console.log('Listening on %d', server.address().port);
-});
-```
-
-### echo.websocket.org demo
-
-```js
-const WebSocket = require('ws');
-
-const ws = new WebSocket('wss://echo.websocket.org/', {
-  origin: 'https://websocket.org'
-});
-
-ws.on('open', function open() {
-  console.log('connected');
-  ws.send(Date.now());
-});
-
-ws.on('close', function close() {
-  console.log('disconnected');
-});
-
-ws.on('message', function incoming(data, flags) {
-  console.log(`Roundtrip time: ${Date.now() - data} ms`, flags);
-
-  setTimeout(function timeout() {
-    ws.send(Date.now());
-  }, 500);
-});
-```
-
-### Other examples
-
-For a full example with a browser client communicating with a ws server, see the
-examples folder.
-
-Otherwise, see the test cases.
-
-## Error handling best practices
-
-```js
-// If the WebSocket is closed before the following send is attempted
-ws.send('something');
-
-// Errors (both immediate and async write errors) can be detected in an optional
-// callback. The callback is also the only way of being notified that data has
-// actually been sent.
-ws.send('something', function ack(error) {
-  // If error is not defined, the send has been completed, otherwise the error
-  // object will indicate what failed.
-});
-
-// Immediate errors can also be handled with `try...catch`, but **note** that
-// since sends are inherently asynchronous, socket write failures will *not* be
-// captured when this technique is used.
-try { ws.send('something'); }
-catch (e) { /* handle error */ }
-```
-
-## Changelog
-
-We're using the GitHub [`releases`](https://github.com/websockets/ws/releases)
-for changelog entries.
-
-## License
-
-[MIT](LICENSE)
-
-[permessage-deflate]: https://tools.ietf.org/html/rfc7692
diff --git a/js/Windows/node_modules/ws/index.js b/js/Windows/node_modules/ws/index.js
deleted file mode 100644
index 489e169426e835f41ff723f023aadd732f7494a1..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-'use strict';
-
-const WebSocket = require('./lib/WebSocket');
-
-WebSocket.Server = require('./lib/WebSocketServer');
-WebSocket.Receiver = require('./lib/Receiver');
-WebSocket.Sender = require('./lib/Sender');
-
-module.exports = WebSocket;
diff --git a/js/Windows/node_modules/ws/lib/BufferUtil.js b/js/Windows/node_modules/ws/lib/BufferUtil.js
deleted file mode 100644
index 6a35e8f43bc5e56c5debab7dec90229810dfb05d..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/lib/BufferUtil.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-'use strict';
-
-const safeBuffer = require('safe-buffer');
-
-const Buffer = safeBuffer.Buffer;
-
-/**
- * Merges an array of buffers into a new buffer.
- *
- * @param {Buffer[]} list The array of buffers to concat
- * @param {Number} totalLength The total length of buffers in the list
- * @return {Buffer} The resulting buffer
- * @public
- */
-const concat = (list, totalLength) => {
-  const target = Buffer.allocUnsafe(totalLength);
-  var offset = 0;
-
-  for (var i = 0; i < list.length; i++) {
-    const buf = list[i];
-    buf.copy(target, offset);
-    offset += buf.length;
-  }
-
-  return target;
-};
-
-try {
-  const bufferUtil = require('bufferutil');
-
-  module.exports = Object.assign({ concat }, bufferUtil.BufferUtil || bufferUtil);
-} catch (e) /* istanbul ignore next */ {
-  /**
-   * Masks a buffer using the given mask.
-   *
-   * @param {Buffer} source The buffer to mask
-   * @param {Buffer} mask The mask to use
-   * @param {Buffer} output The buffer where to store the result
-   * @param {Number} offset The offset at which to start writing
-   * @param {Number} length The number of bytes to mask.
-   * @public
-   */
-  const mask = (source, mask, output, offset, length) => {
-    for (var i = 0; i < length; i++) {
-      output[offset + i] = source[i] ^ mask[i & 3];
-    }
-  };
-
-  /**
-   * Unmasks a buffer using the given mask.
-   *
-   * @param {Buffer} buffer The buffer to unmask
-   * @param {Buffer} mask The mask to use
-   * @public
-   */
-  const unmask = (buffer, mask) => {
-    // Required until https://github.com/nodejs/node/issues/9006 is resolved.
-    const length = buffer.length;
-    for (var i = 0; i < length; i++) {
-      buffer[i] ^= mask[i & 3];
-    }
-  };
-
-  module.exports = { concat, mask, unmask };
-}
diff --git a/js/Windows/node_modules/ws/lib/Constants.js b/js/Windows/node_modules/ws/lib/Constants.js
deleted file mode 100644
index 39044146294895f8390e5de301dbc1dc12ca4395..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/lib/Constants.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict';
-
-const safeBuffer = require('safe-buffer');
-
-const Buffer = safeBuffer.Buffer;
-
-exports.BINARY_TYPES = ['nodebuffer', 'arraybuffer', 'fragments'];
-exports.GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
-exports.EMPTY_BUFFER = Buffer.alloc(0);
-exports.NOOP = () => {};
diff --git a/js/Windows/node_modules/ws/lib/ErrorCodes.js b/js/Windows/node_modules/ws/lib/ErrorCodes.js
deleted file mode 100644
index f51557162565a87287956c4cd408319a112d7761..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/lib/ErrorCodes.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-'use strict';
-
-module.exports = {
-  isValidErrorCode: function (code) {
-    return (code >= 1000 && code <= 1013 && code !== 1004 && code !== 1005 && code !== 1006) ||
-      (code >= 3000 && code <= 4999);
-  },
-  1000: 'normal',
-  1001: 'going away',
-  1002: 'protocol error',
-  1003: 'unsupported data',
-  1004: 'reserved',
-  1005: 'reserved for extensions',
-  1006: 'reserved for extensions',
-  1007: 'inconsistent or invalid data',
-  1008: 'policy violation',
-  1009: 'message too big',
-  1010: 'extension handshake missing',
-  1011: 'an unexpected condition prevented the request from being fulfilled',
-  1012: 'service restart',
-  1013: 'try again later'
-};
diff --git a/js/Windows/node_modules/ws/lib/EventTarget.js b/js/Windows/node_modules/ws/lib/EventTarget.js
deleted file mode 100644
index e30b1b3edc57629788fd0495f8f36e450e28e872..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/lib/EventTarget.js
+++ /dev/null
@@ -1,155 +0,0 @@
-'use strict';
-
-/**
- * Class representing an event.
- *
- * @private
- */
-class Event {
-  /**
-   * Create a new `Event`.
-   *
-   * @param {String} type The name of the event
-   * @param {Object} target A reference to the target to which the event was dispatched
-   */
-  constructor (type, target) {
-    this.target = target;
-    this.type = type;
-  }
-}
-
-/**
- * Class representing a message event.
- *
- * @extends Event
- * @private
- */
-class MessageEvent extends Event {
-  /**
-   * Create a new `MessageEvent`.
-   *
-   * @param {(String|Buffer|ArrayBuffer|Buffer[])} data The received data
-   * @param {Boolean} isBinary Specifies if `data` is binary
-   * @param {WebSocket} target A reference to the target to which the event was dispatched
-   */
-  constructor (data, isBinary, target) {
-    super('message', target);
-
-    this.binary = isBinary; // non-standard.
-    this.data = data;
-  }
-}
-
-/**
- * Class representing a close event.
- *
- * @extends Event
- * @private
- */
-class CloseEvent extends Event {
-  /**
-   * Create a new `CloseEvent`.
-   *
-   * @param {Number} code The status code explaining why the connection is being closed
-   * @param {String} reason A human-readable string explaining why the connection is closing
-   * @param {WebSocket} target A reference to the target to which the event was dispatched
-   */
-  constructor (code, reason, target) {
-    super('close', target);
-
-    this.wasClean = code === undefined || code === 1000;
-    this.reason = reason;
-    this.target = target;
-    this.type = 'close';
-    this.code = code;
-  }
-}
-
-/**
- * Class representing an open event.
- *
- * @extends Event
- * @private
- */
-class OpenEvent extends Event {
-  /**
-   * Create a new `OpenEvent`.
-   *
-   * @param {WebSocket} target A reference to the target to which the event was dispatched
-   */
-  constructor (target) {
-    super('open', target);
-  }
-}
-
-/**
- * This provides methods for emulating the `EventTarget` interface. It's not
- * meant to be used directly.
- *
- * @mixin
- */
-const EventTarget = {
-  /**
-   * Register an event listener.
-   *
-   * @param {String} method A string representing the event type to listen for
-   * @param {Function} listener The listener to add
-   * @public
-   */
-  addEventListener (method, listener) {
-    if (typeof listener !== 'function') return;
-
-    function onMessage (data, flags) {
-      listener.call(this, new MessageEvent(data, !!flags.binary, this));
-    }
-
-    function onClose (code, message) {
-      listener.call(this, new CloseEvent(code, message, this));
-    }
-
-    function onError (event) {
-      event.type = 'error';
-      event.target = this;
-      listener.call(this, event);
-    }
-
-    function onOpen () {
-      listener.call(this, new OpenEvent(this));
-    }
-
-    if (method === 'message') {
-      onMessage._listener = listener;
-      this.on(method, onMessage);
-    } else if (method === 'close') {
-      onClose._listener = listener;
-      this.on(method, onClose);
-    } else if (method === 'error') {
-      onError._listener = listener;
-      this.on(method, onError);
-    } else if (method === 'open') {
-      onOpen._listener = listener;
-      this.on(method, onOpen);
-    } else {
-      this.on(method, listener);
-    }
-  },
-
-  /**
-   * Remove an event listener.
-   *
-   * @param {String} method A string representing the event type to remove
-   * @param {Function} listener The listener to remove
-   * @public
-   */
-  removeEventListener (method, listener) {
-    const listeners = this.listeners(method);
-
-    for (var i = 0; i < listeners.length; i++) {
-      if (listeners[i] === listener || listeners[i]._listener === listener) {
-        this.removeListener(method, listeners[i]);
-      }
-    }
-  }
-};
-
-module.exports = EventTarget;
diff --git a/js/Windows/node_modules/ws/lib/Extensions.js b/js/Windows/node_modules/ws/lib/Extensions.js
deleted file mode 100644
index a91910eb2ca6136e22e8093b6c4888c5a47ea1a0..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/lib/Extensions.js
+++ /dev/null
@@ -1,67 +0,0 @@
-'use strict';
-
-/**
- * Parse the `Sec-WebSocket-Extensions` header into an object.
- *
- * @param {String} value field value of the header
- * @return {Object} The parsed object
- * @public
- */
-const parse = (value) => {
-  value = value || '';
-
-  const extensions = {};
-
-  value.split(',').forEach((v) => {
-    const params = v.split(';');
-    const token = params.shift().trim();
-    const paramsList = extensions[token] = extensions[token] || [];
-    const parsedParams = {};
-
-    params.forEach((param) => {
-      const parts = param.trim().split('=');
-      const key = parts[0];
-      var value = parts[1];
-
-      if (value === undefined) {
-        value = true;
-      } else {
-        // unquote value
-        if (value[0] === '"') {
-          value = value.slice(1);
-        }
-        if (value[value.length - 1] === '"') {
-          value = value.slice(0, value.length - 1);
-        }
-      }
-      (parsedParams[key] = parsedParams[key] || []).push(value);
-    });
-
-    paramsList.push(parsedParams);
-  });
-
-  return extensions;
-};
-
-/**
- * Serialize a parsed `Sec-WebSocket-Extensions` header to a string.
- *
- * @param {Object} value The object to format
- * @return {String} A string representing the given value
- * @public
- */
-const format = (value) => {
-  return Object.keys(value).map((token) => {
-    var paramsList = value[token];
-    if (!Array.isArray(paramsList)) paramsList = [paramsList];
-    return paramsList.map((params) => {
-      return [token].concat(Object.keys(params).map((k) => {
-        var p = params[k];
-        if (!Array.isArray(p)) p = [p];
-        return p.map((v) => v === true ? k : `${k}=${v}`).join('; ');
-      })).join('; ');
-    }).join(', ');
-  }).join(', ');
-};
-
-module.exports = { format, parse };
diff --git a/js/Windows/node_modules/ws/lib/PerMessageDeflate.js b/js/Windows/node_modules/ws/lib/PerMessageDeflate.js
deleted file mode 100644
index c1a1d3c7007d4888cdaf166afa7e253c5d9a43c9..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/lib/PerMessageDeflate.js
+++ /dev/null
@@ -1,384 +0,0 @@
-'use strict';
-
-const safeBuffer = require('safe-buffer');
-const zlib = require('zlib');
-
-const bufferUtil = require('./BufferUtil');
-
-const Buffer = safeBuffer.Buffer;
-
-const AVAILABLE_WINDOW_BITS = [8, 9, 10, 11, 12, 13, 14, 15];
-const TRAILER = Buffer.from([0x00, 0x00, 0xff, 0xff]);
-const EMPTY_BLOCK = Buffer.from([0x00]);
-const DEFAULT_WINDOW_BITS = 15;
-const DEFAULT_MEM_LEVEL = 8;
-
-/**
- * Per-message Deflate implementation.
- */
-class PerMessageDeflate {
-  constructor (options, isServer, maxPayload) {
-    this._options = options || {};
-    this._isServer = !!isServer;
-    this._inflate = null;
-    this._deflate = null;
-    this.params = null;
-    this._maxPayload = maxPayload || 0;
-    this.threshold = this._options.threshold === undefined ? 1024 : this._options.threshold;
-  }
-
-  static get extensionName () {
-    return 'permessage-deflate';
-  }
-
-  /**
-   * Create extension parameters offer.
-   *
-   * @return {Object} Extension parameters
-   * @public
-   */
-  offer () {
-    const params = {};
-
-    if (this._options.serverNoContextTakeover) {
-      params.server_no_context_takeover = true;
-    }
-    if (this._options.clientNoContextTakeover) {
-      params.client_no_context_takeover = true;
-    }
-    if (this._options.serverMaxWindowBits) {
-      params.server_max_window_bits = this._options.serverMaxWindowBits;
-    }
-    if (this._options.clientMaxWindowBits) {
-      params.client_max_window_bits = this._options.clientMaxWindowBits;
-    } else if (this._options.clientMaxWindowBits == null) {
-      params.client_max_window_bits = true;
-    }
-
-    return params;
-  }
-
-  /**
-   * Accept extension offer.
-   *
-   * @param {Array} paramsList Extension parameters
-   * @return {Object} Accepted configuration
-   * @public
-   */
-  accept (paramsList) {
-    paramsList = this.normalizeParams(paramsList);
-
-    var params;
-    if (this._isServer) {
-      params = this.acceptAsServer(paramsList);
-    } else {
-      params = this.acceptAsClient(paramsList);
-    }
-
-    this.params = params;
-    return params;
-  }
-
-  /**
-   * Releases all resources used by the extension.
-   *
-   * @public
-   */
-  cleanup () {
-    if (this._inflate) {
-      if (this._inflate.writeInProgress) {
-        this._inflate.pendingClose = true;
-      } else {
-        this._inflate.close();
-        this._inflate = null;
-      }
-    }
-    if (this._deflate) {
-      if (this._deflate.writeInProgress) {
-        this._deflate.pendingClose = true;
-      } else {
-        this._deflate.close();
-        this._deflate = null;
-      }
-    }
-  }
-
-  /**
-   * Accept extension offer from client.
-   *
-   * @param {Array} paramsList Extension parameters
-   * @return {Object} Accepted configuration
-   * @private
-   */
-  acceptAsServer (paramsList) {
-    const accepted = {};
-    const result = paramsList.some((params) => {
-      if ((
-        this._options.serverNoContextTakeover === false &&
-        params.server_no_context_takeover
-      ) || (
-        this._options.serverMaxWindowBits === false &&
-        params.server_max_window_bits
-      ) || (
-        typeof this._options.serverMaxWindowBits === 'number' &&
-        typeof params.server_max_window_bits === 'number' &&
-        this._options.serverMaxWindowBits > params.server_max_window_bits
-      ) || (
-        typeof this._options.clientMaxWindowBits === 'number' &&
-        !params.client_max_window_bits
-      )) {
-        return;
-      }
-
-      if (
-        this._options.serverNoContextTakeover ||
-        params.server_no_context_takeover
-      ) {
-        accepted.server_no_context_takeover = true;
-      }
-      if (this._options.clientNoContextTakeover) {
-        accepted.client_no_context_takeover = true;
-      }
-      if (
-        this._options.clientNoContextTakeover !== false &&
-        params.client_no_context_takeover
-      ) {
-        accepted.client_no_context_takeover = true;
-      }
-      if (typeof this._options.serverMaxWindowBits === 'number') {
-        accepted.server_max_window_bits = this._options.serverMaxWindowBits;
-      } else if (typeof params.server_max_window_bits === 'number') {
-        accepted.server_max_window_bits = params.server_max_window_bits;
-      }
-      if (typeof this._options.clientMaxWindowBits === 'number') {
-        accepted.client_max_window_bits = this._options.clientMaxWindowBits;
-      } else if (
-        this._options.clientMaxWindowBits !== false &&
-        typeof params.client_max_window_bits === 'number'
-      ) {
-        accepted.client_max_window_bits = params.client_max_window_bits;
-      }
-      return true;
-    });
-
-    if (!result) throw new Error(`Doesn't support the offered configuration`);
-
-    return accepted;
-  }
-
-  /**
-   * Accept extension response from server.
-   *
-   * @param {Array} paramsList Extension parameters
-   * @return {Object} Accepted configuration
-   * @private
-   */
-  acceptAsClient (paramsList) {
-    const params = paramsList[0];
-
-    if (this._options.clientNoContextTakeover != null) {
-      if (
-        this._options.clientNoContextTakeover === false &&
-        params.client_no_context_takeover
-      ) {
-        throw new Error('Invalid value for "client_no_context_takeover"');
-      }
-    }
-    if (this._options.clientMaxWindowBits != null) {
-      if (
-        this._options.clientMaxWindowBits === false &&
-        params.client_max_window_bits
-      ) {
-        throw new Error('Invalid value for "client_max_window_bits"');
-      }
-      if (
-        typeof this._options.clientMaxWindowBits === 'number' && (
-        !params.client_max_window_bits ||
-        params.client_max_window_bits > this._options.clientMaxWindowBits
-      )) {
-        throw new Error('Invalid value for "client_max_window_bits"');
-      }
-    }
-
-    return params;
-  }
-
-  /**
-   * Normalize extensions parameters.
-   *
-   * @param {Array} paramsList Extension parameters
-   * @return {Array} Normalized extensions parameters
-   * @private
-   */
-  normalizeParams (paramsList) {
-    return paramsList.map((params) => {
-      Object.keys(params).forEach((key) => {
-        var value = params[key];
-        if (value.length > 1) {
-          throw new Error(`Multiple extension parameters for ${key}`);
-        }
-
-        value = value[0];
-
-        switch (key) {
-          case 'server_no_context_takeover':
-          case 'client_no_context_takeover':
-            if (value !== true) {
-              throw new Error(`invalid extension parameter value for ${key} (${value})`);
-            }
-            params[key] = true;
-            break;
-          case 'server_max_window_bits':
-          case 'client_max_window_bits':
-            if (typeof value === 'string') {
-              value = parseInt(value, 10);
-              if (!~AVAILABLE_WINDOW_BITS.indexOf(value)) {
-                throw new Error(`invalid extension parameter value for ${key} (${value})`);
-              }
-            }
-            if (!this._isServer && value === true) {
-              throw new Error(`Missing extension parameter value for ${key}`);
-            }
-            params[key] = value;
-            break;
-          default:
-            throw new Error(`Not defined extension parameter (${key})`);
-        }
-      });
-      return params;
-    });
-  }
-
-  /**
-   * Decompress data.
-   *
-   * @param {Buffer} data Compressed data
-   * @param {Boolean} fin Specifies whether or not this is the last fragment
-   * @param {Function} callback Callback
-   * @public
-   */
-  decompress (data, fin, callback) {
-    const endpoint = this._isServer ? 'client' : 'server';
-
-    if (!this._inflate) {
-      const maxWindowBits = this.params[`${endpoint}_max_window_bits`];
-      this._inflate = zlib.createInflateRaw({
-        windowBits: typeof maxWindowBits === 'number' ? maxWindowBits : DEFAULT_WINDOW_BITS
-      });
-    }
-    this._inflate.writeInProgress = true;
-
-    var totalLength = 0;
-    const buffers = [];
-    var err;
-
-    const onData = (data) => {
-      totalLength += data.length;
-      if (this._maxPayload < 1 || totalLength <= this._maxPayload) {
-        return buffers.push(data);
-      }
-
-      err = new Error('max payload size exceeded');
-      err.closeCode = 1009;
-      this._inflate.reset();
-    };
-
-    const onError = (err) => {
-      cleanup();
-      callback(err);
-    };
-
-    const cleanup = () => {
-      if (!this._inflate) return;
-
-      this._inflate.removeListener('error', onError);
-      this._inflate.removeListener('data', onData);
-      this._inflate.writeInProgress = false;
-
-      if (
-        (fin && this.params[`${endpoint}_no_context_takeover`]) ||
-        this._inflate.pendingClose
-      ) {
-        this._inflate.close();
-        this._inflate = null;
-      }
-    };
-
-    this._inflate.on('error', onError).on('data', onData);
-    this._inflate.write(data);
-    if (fin) this._inflate.write(TRAILER);
-
-    this._inflate.flush(() => {
-      cleanup();
-      if (err) callback(err);
-      else callback(null, bufferUtil.concat(buffers, totalLength));
-    });
-  }
-
-  /**
-   * Compress data.
-   *
-   * @param {Buffer} data Data to compress
-   * @param {Boolean} fin Specifies whether or not this is the last fragment
-   * @param {Function} callback Callback
-   * @public
-   */
-  compress (data, fin, callback) {
-    if (!data || data.length === 0) {
-      process.nextTick(callback, null, EMPTY_BLOCK);
-      return;
-    }
-
-    const endpoint = this._isServer ? 'server' : 'client';
-
-    if (!this._deflate) {
-      const maxWindowBits = this.params[`${endpoint}_max_window_bits`];
-      this._deflate = zlib.createDeflateRaw({
-        flush: zlib.Z_SYNC_FLUSH,
-        windowBits: typeof maxWindowBits === 'number' ? maxWindowBits : DEFAULT_WINDOW_BITS,
-        memLevel: this._options.memLevel || DEFAULT_MEM_LEVEL
-      });
-    }
-    this._deflate.writeInProgress = true;
-
-    var totalLength = 0;
-    const buffers = [];
-
-    const onData = (data) => {
-      totalLength += data.length;
-      buffers.push(data);
-    };
-
-    const onError = (err) => {
-      cleanup();
-      callback(err);
-    };
-
-    const cleanup = () => {
-      if (!this._deflate) return;
-
-      this._deflate.removeListener('error', onError);
-      this._deflate.removeListener('data', onData);
-      this._deflate.writeInProgress = false;
-
-      if (
-        (fin && this.params[`${endpoint}_no_context_takeover`]) ||
-        this._deflate.pendingClose
-      ) {
-        this._deflate.close();
-        this._deflate = null;
-      }
-    };
-
-    this._deflate.on('error', onError).on('data', onData);
-    this._deflate.write(data);
-    this._deflate.flush(zlib.Z_SYNC_FLUSH, () => {
-      cleanup();
-      var data = bufferUtil.concat(buffers, totalLength);
-      if (fin) data = data.slice(0, data.length - 4);
-      callback(null, data);
-    });
-  }
-}
-
-module.exports = PerMessageDeflate;
diff --git a/js/Windows/node_modules/ws/lib/Receiver.js b/js/Windows/node_modules/ws/lib/Receiver.js
deleted file mode 100644
index 6c1a10e2cc80108fd310bc17a509cd886da73e45..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/lib/Receiver.js
+++ /dev/null
@@ -1,555 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-'use strict';
-
-const safeBuffer = require('safe-buffer');
-
-const PerMessageDeflate = require('./PerMessageDeflate');
-const isValidUTF8 = require('./Validation');
-const bufferUtil = require('./BufferUtil');
-const ErrorCodes = require('./ErrorCodes');
-const constants = require('./Constants');
-
-const Buffer = safeBuffer.Buffer;
-
-const GET_INFO = 0;
-const GET_PAYLOAD_LENGTH_16 = 1;
-const GET_PAYLOAD_LENGTH_64 = 2;
-const GET_MASK = 3;
-const GET_DATA = 4;
-const INFLATING = 5;
-
-/**
- * HyBi Receiver implementation.
- */
-class Receiver {
-  /**
-   * Creates a Receiver instance.
-   *
-   * @param {Object} extensions An object containing the negotiated extensions
-   * @param {Number} maxPayload The maximum allowed message length
-   * @param {String} binaryType The type for binary data
-   */
-  constructor (extensions, maxPayload, binaryType) {
-    this.binaryType = binaryType || constants.BINARY_TYPES[0];
-    this.extensions = extensions || {};
-    this.maxPayload = maxPayload | 0;
-
-    this.bufferedBytes = 0;
-    this.buffers = [];
-
-    this.compressed = false;
-    this.payloadLength = 0;
-    this.fragmented = 0;
-    this.masked = false;
-    this.fin = false;
-    this.mask = null;
-    this.opcode = 0;
-
-    this.totalPayloadLength = 0;
-    this.messageLength = 0;
-    this.fragments = [];
-
-    this.cleanupCallback = null;
-    this.hadError = false;
-    this.dead = false;
-    this.loop = false;
-
-    this.onmessage = null;
-    this.onclose = null;
-    this.onerror = null;
-    this.onping = null;
-    this.onpong = null;
-
-    this.state = GET_INFO;
-  }
-
-  /**
-   * Consumes bytes from the available buffered data.
-   *
-   * @param {Number} bytes The number of bytes to consume
-   * @return {Buffer} Consumed bytes
-   * @private
-   */
-  readBuffer (bytes) {
-    var offset = 0;
-    var dst;
-    var l;
-
-    this.bufferedBytes -= bytes;
-
-    if (bytes === this.buffers[0].length) return this.buffers.shift();
-
-    if (bytes < this.buffers[0].length) {
-      dst = this.buffers[0].slice(0, bytes);
-      this.buffers[0] = this.buffers[0].slice(bytes);
-      return dst;
-    }
-
-    dst = Buffer.allocUnsafe(bytes);
-
-    while (bytes > 0) {
-      l = this.buffers[0].length;
-
-      if (bytes >= l) {
-        this.buffers[0].copy(dst, offset);
-        offset += l;
-        this.buffers.shift();
-      } else {
-        this.buffers[0].copy(dst, offset, 0, bytes);
-        this.buffers[0] = this.buffers[0].slice(bytes);
-      }
-
-      bytes -= l;
-    }
-
-    return dst;
-  }
-
-  /**
-   * Checks if the number of buffered bytes is bigger or equal than `n` and
-   * calls `cleanup` if necessary.
-   *
-   * @param {Number} n The number of bytes to check against
-   * @return {Boolean} `true` if `bufferedBytes >= n`, else `false`
-   * @private
-   */
-  hasBufferedBytes (n) {
-    if (this.bufferedBytes >= n) return true;
-
-    this.loop = false;
-    if (this.dead) this.cleanup(this.cleanupCallback);
-    return false;
-  }
-
-  /**
-   * Adds new data to the parser.
-   *
-   * @public
-   */
-  add (data) {
-    if (this.dead) return;
-
-    this.bufferedBytes += data.length;
-    this.buffers.push(data);
-    this.startLoop();
-  }
-
-  /**
-   * Starts the parsing loop.
-   *
-   * @private
-   */
-  startLoop () {
-    this.loop = true;
-
-    while (this.loop) {
-      switch (this.state) {
-        case GET_INFO:
-          this.getInfo();
-          break;
-        case GET_PAYLOAD_LENGTH_16:
-          this.getPayloadLength16();
-          break;
-        case GET_PAYLOAD_LENGTH_64:
-          this.getPayloadLength64();
-          break;
-        case GET_MASK:
-          this.getMask();
-          break;
-        case GET_DATA:
-          this.getData();
-          break;
-        default: // `INFLATING`
-          this.loop = false;
-      }
-    }
-  }
-
-  /**
-   * Reads the first two bytes of a frame.
-   *
-   * @private
-   */
-  getInfo () {
-    if (!this.hasBufferedBytes(2)) return;
-
-    const buf = this.readBuffer(2);
-
-    if ((buf[0] & 0x30) !== 0x00) {
-      this.error(new Error('RSV2 and RSV3 must be clear'), 1002);
-      return;
-    }
-
-    const compressed = (buf[0] & 0x40) === 0x40;
-
-    if (compressed && !this.extensions[PerMessageDeflate.extensionName]) {
-      this.error(new Error('RSV1 must be clear'), 1002);
-      return;
-    }
-
-    this.fin = (buf[0] & 0x80) === 0x80;
-    this.opcode = buf[0] & 0x0f;
-    this.payloadLength = buf[1] & 0x7f;
-
-    if (this.opcode === 0x00) {
-      if (compressed) {
-        this.error(new Error('RSV1 must be clear'), 1002);
-        return;
-      }
-
-      if (!this.fragmented) {
-        this.error(new Error(`invalid opcode: ${this.opcode}`), 1002);
-        return;
-      } else {
-        this.opcode = this.fragmented;
-      }
-    } else if (this.opcode === 0x01 || this.opcode === 0x02) {
-      if (this.fragmented) {
-        this.error(new Error(`invalid opcode: ${this.opcode}`), 1002);
-        return;
-      }
-
-      this.compressed = compressed;
-    } else if (this.opcode > 0x07 && this.opcode < 0x0b) {
-      if (!this.fin) {
-        this.error(new Error('FIN must be set'), 1002);
-        return;
-      }
-
-      if (compressed) {
-        this.error(new Error('RSV1 must be clear'), 1002);
-        return;
-      }
-
-      if (this.payloadLength > 0x7d) {
-        this.error(new Error('invalid payload length'), 1002);
-        return;
-      }
-    } else {
-      this.error(new Error(`invalid opcode: ${this.opcode}`), 1002);
-      return;
-    }
-
-    if (!this.fin && !this.fragmented) this.fragmented = this.opcode;
-
-    this.masked = (buf[1] & 0x80) === 0x80;
-
-    if (this.payloadLength === 126) this.state = GET_PAYLOAD_LENGTH_16;
-    else if (this.payloadLength === 127) this.state = GET_PAYLOAD_LENGTH_64;
-    else this.haveLength();
-  }
-
-  /**
-   * Gets extended payload length (7+16).
-   *
-   * @private
-   */
-  getPayloadLength16 () {
-    if (!this.hasBufferedBytes(2)) return;
-
-    this.payloadLength = this.readBuffer(2).readUInt16BE(0, true);
-    this.haveLength();
-  }
-
-  /**
-   * Gets extended payload length (7+64).
-   *
-   * @private
-   */
-  getPayloadLength64 () {
-    if (!this.hasBufferedBytes(8)) return;
-
-    const buf = this.readBuffer(8);
-    const num = buf.readUInt32BE(0, true);
-
-    //
-    // The maximum safe integer in JavaScript is 2^53 - 1. An error is returned
-    // if payload length is greater than this number.
-    //
-    if (num > Math.pow(2, 53 - 32) - 1) {
-      this.error(new Error('max payload size exceeded'), 1009);
-      return;
-    }
-
-    this.payloadLength = (num * Math.pow(2, 32)) + buf.readUInt32BE(4, true);
-    this.haveLength();
-  }
-
-  /**
-   * Payload length has been read.
-   *
-   * @private
-   */
-  haveLength () {
-    if (this.opcode < 0x08 && this.maxPayloadExceeded(this.payloadLength)) {
-      return;
-    }
-
-    if (this.masked) this.state = GET_MASK;
-    else this.state = GET_DATA;
-  }
-
-  /**
-   * Reads mask bytes.
-   *
-   * @private
-   */
-  getMask () {
-    if (!this.hasBufferedBytes(4)) return;
-
-    this.mask = this.readBuffer(4);
-    this.state = GET_DATA;
-  }
-
-  /**
-   * Reads data bytes.
-   *
-   * @private
-   */
-  getData () {
-    var data = constants.EMPTY_BUFFER;
-
-    if (this.payloadLength) {
-      if (!this.hasBufferedBytes(this.payloadLength)) return;
-
-      data = this.readBuffer(this.payloadLength);
-      if (this.masked) bufferUtil.unmask(data, this.mask);
-    }
-
-    if (this.opcode > 0x07) {
-      this.controlMessage(data);
-    } else if (this.compressed) {
-      this.state = INFLATING;
-      this.decompress(data);
-    } else if (this.pushFragment(data)) {
-      this.dataMessage();
-    }
-  }
-
-  /**
-   * Decompresses data.
-   *
-   * @param {Buffer} data Compressed data
-   * @private
-   */
-  decompress (data) {
-    const extension = this.extensions[PerMessageDeflate.extensionName];
-
-    extension.decompress(data, this.fin, (err, buf) => {
-      if (err) {
-        this.error(err, err.closeCode === 1009 ? 1009 : 1007);
-        return;
-      }
-
-      if (this.pushFragment(buf)) this.dataMessage();
-      this.startLoop();
-    });
-  }
-
-  /**
-   * Handles a data message.
-   *
-   * @private
-   */
-  dataMessage () {
-    if (this.fin) {
-      const messageLength = this.messageLength;
-      const fragments = this.fragments;
-
-      this.totalPayloadLength = 0;
-      this.messageLength = 0;
-      this.fragmented = 0;
-      this.fragments = [];
-
-      if (this.opcode === 2) {
-        var data;
-
-        if (this.binaryType === 'nodebuffer') {
-          data = toBuffer(fragments, messageLength);
-        } else if (this.binaryType === 'arraybuffer') {
-          data = toArrayBuffer(toBuffer(fragments, messageLength));
-        } else {
-          data = fragments;
-        }
-
-        this.onmessage(data, { masked: this.masked, binary: true });
-      } else {
-        const buf = toBuffer(fragments, messageLength);
-
-        if (!isValidUTF8(buf)) {
-          this.error(new Error('invalid utf8 sequence'), 1007);
-          return;
-        }
-
-        this.onmessage(buf.toString(), { masked: this.masked });
-      }
-    }
-
-    this.state = GET_INFO;
-  }
-
-  /**
-   * Handles a control message.
-   *
-   * @param {Buffer} data Data to handle
-   * @private
-   */
-  controlMessage (data) {
-    if (this.opcode === 0x08) {
-      if (data.length === 0) {
-        this.onclose(1000, '', { masked: this.masked });
-        this.loop = false;
-        this.cleanup(this.cleanupCallback);
-      } else if (data.length === 1) {
-        this.error(new Error('invalid payload length'), 1002);
-      } else {
-        const code = data.readUInt16BE(0, true);
-
-        if (!ErrorCodes.isValidErrorCode(code)) {
-          this.error(new Error(`invalid status code: ${code}`), 1002);
-          return;
-        }
-
-        const buf = data.slice(2);
-
-        if (!isValidUTF8(buf)) {
-          this.error(new Error('invalid utf8 sequence'), 1007);
-          return;
-        }
-
-        this.onclose(code, buf.toString(), { masked: this.masked });
-        this.loop = false;
-        this.cleanup(this.cleanupCallback);
-      }
-
-      return;
-    }
-
-    const flags = { masked: this.masked, binary: true };
-
-    if (this.opcode === 0x09) this.onping(data, flags);
-    else this.onpong(data, flags);
-
-    this.state = GET_INFO;
-  }
-
-  /**
-   * Handles an error.
-   *
-   * @param {Error} err The error
-   * @param {Number} code Close code
-   * @private
-   */
-  error (err, code) {
-    this.onerror(err, code);
-    this.hadError = true;
-    this.loop = false;
-    this.cleanup(this.cleanupCallback);
-  }
-
-  /**
-   * Checks payload size, disconnects socket when it exceeds `maxPayload`.
-   *
-   * @param {Number} length Payload length
-   * @private
-   */
-  maxPayloadExceeded (length) {
-    if (length === 0 || this.maxPayload < 1) return false;
-
-    const fullLength = this.totalPayloadLength + length;
-
-    if (fullLength <= this.maxPayload) {
-      this.totalPayloadLength = fullLength;
-      return false;
-    }
-
-    this.error(new Error('max payload size exceeded'), 1009);
-    return true;
-  }
-
-  /**
-   * Appends a fragment in the fragments array after checking that the sum of
-   * fragment lengths does not exceed `maxPayload`.
-   *
-   * @param {Buffer} fragment The fragment to add
-   * @return {Boolean} `true` if `maxPayload` is not exceeded, else `false`
-   * @private
-   */
-  pushFragment (fragment) {
-    if (fragment.length === 0) return true;
-
-    const totalLength = this.messageLength + fragment.length;
-
-    if (this.maxPayload < 1 || totalLength <= this.maxPayload) {
-      this.messageLength = totalLength;
-      this.fragments.push(fragment);
-      return true;
-    }
-
-    this.error(new Error('max payload size exceeded'), 1009);
-    return false;
-  }
-
-  /**
-   * Releases resources used by the receiver.
-   *
-   * @param {Function} cb Callback
-   * @public
-   */
-  cleanup (cb) {
-    this.dead = true;
-
-    if (!this.hadError && (this.loop || this.state === INFLATING)) {
-      this.cleanupCallback = cb;
-    } else {
-      this.extensions = null;
-      this.fragments = null;
-      this.buffers = null;
-      this.mask = null;
-
-      this.cleanupCallback = null;
-      this.onmessage = null;
-      this.onclose = null;
-      this.onerror = null;
-      this.onping = null;
-      this.onpong = null;
-
-      if (cb) cb();
-    }
-  }
-}
-
-module.exports = Receiver;
-
-/**
- * Makes a buffer from a list of fragments.
- *
- * @param {Buffer[]} fragments The list of fragments composing the message
- * @param {Number} messageLength The length of the message
- * @return {Buffer}
- * @private
- */
-function toBuffer (fragments, messageLength) {
-  if (fragments.length === 1) return fragments[0];
-  if (fragments.length > 1) return bufferUtil.concat(fragments, messageLength);
-  return constants.EMPTY_BUFFER;
-}
-
-/**
- * Converts a buffer to an `ArrayBuffer`.
- *
- * @param {Buffer} The buffer to convert
- * @return {ArrayBuffer} Converted buffer
- */
-function toArrayBuffer (buf) {
-  if (buf.byteOffset === 0 && buf.byteLength === buf.buffer.byteLength) {
-    return buf.buffer;
-  }
-
-  return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);
-}
diff --git a/js/Windows/node_modules/ws/lib/Sender.js b/js/Windows/node_modules/ws/lib/Sender.js
deleted file mode 100644
index 79e68a5a3156f19c7c3017a310075aeb68efa6ce..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/lib/Sender.js
+++ /dev/null
@@ -1,403 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-'use strict';
-
-const safeBuffer = require('safe-buffer');
-const crypto = require('crypto');
-
-const PerMessageDeflate = require('./PerMessageDeflate');
-const bufferUtil = require('./BufferUtil');
-const ErrorCodes = require('./ErrorCodes');
-
-const Buffer = safeBuffer.Buffer;
-
-/**
- * HyBi Sender implementation.
- */
-class Sender {
-  /**
-   * Creates a Sender instance.
-   *
-   * @param {net.Socket} socket The connection socket
-   * @param {Object} extensions An object containing the negotiated extensions
-   */
-  constructor (socket, extensions) {
-    this.perMessageDeflate = (extensions || {})[PerMessageDeflate.extensionName];
-    this._socket = socket;
-
-    this.firstFragment = true;
-    this.compress = false;
-
-    this.bufferedBytes = 0;
-    this.deflating = false;
-    this.queue = [];
-
-    this.onerror = null;
-  }
-
-  /**
-   * Frames a piece of data according to the HyBi WebSocket protocol.
-   *
-   * @param {Buffer} data The data to frame
-   * @param {Object} options Options object
-   * @param {Number} options.opcode The opcode
-   * @param {Boolean} options.readOnly Specifies whether `data` can be modified
-   * @param {Boolean} options.fin Specifies whether or not to set the FIN bit
-   * @param {Boolean} options.mask Specifies whether or not to mask `data`
-   * @param {Boolean} options.rsv1 Specifies whether or not to set the RSV1 bit
-   * @return {Buffer[]} The framed data as a list of `Buffer` instances
-   * @public
-   */
-  static frame (data, options) {
-    const merge = data.length < 1024 || (options.mask && options.readOnly);
-    var offset = options.mask ? 6 : 2;
-    var payloadLength = data.length;
-
-    if (data.length >= 65536) {
-      offset += 8;
-      payloadLength = 127;
-    } else if (data.length > 125) {
-      offset += 2;
-      payloadLength = 126;
-    }
-
-    const target = Buffer.allocUnsafe(merge ? data.length + offset : offset);
-
-    target[0] = options.fin ? options.opcode | 0x80 : options.opcode;
-    if (options.rsv1) target[0] |= 0x40;
-
-    if (payloadLength === 126) {
-      target.writeUInt16BE(data.length, 2, true);
-    } else if (payloadLength === 127) {
-      target.writeUInt32BE(0, 2, true);
-      target.writeUInt32BE(data.length, 6, true);
-    }
-
-    if (!options.mask) {
-      target[1] = payloadLength;
-      if (merge) {
-        data.copy(target, offset);
-        return [target];
-      }
-
-      return [target, data];
-    }
-
-    const mask = crypto.randomBytes(4);
-
-    target[1] = payloadLength | 0x80;
-    target[offset - 4] = mask[0];
-    target[offset - 3] = mask[1];
-    target[offset - 2] = mask[2];
-    target[offset - 1] = mask[3];
-
-    if (merge) {
-      bufferUtil.mask(data, mask, target, offset, data.length);
-      return [target];
-    }
-
-    bufferUtil.mask(data, mask, data, 0, data.length);
-    return [target, data];
-  }
-
-  /**
-   * Sends a close message to the other peer.
-   *
-   * @param {(Number|undefined)} code The status code component of the body
-   * @param {String} data The message component of the body
-   * @param {Boolean} mask Specifies whether or not to mask the message
-   * @param {Function} cb Callback
-   * @public
-   */
-  close (code, data, mask, cb) {
-    if (code !== undefined && (typeof code !== 'number' || !ErrorCodes.isValidErrorCode(code))) {
-      throw new Error('first argument must be a valid error code number');
-    }
-
-    const buf = Buffer.allocUnsafe(2 + (data ? Buffer.byteLength(data) : 0));
-
-    buf.writeUInt16BE(code || 1000, 0, true);
-    if (buf.length > 2) buf.write(data, 2);
-
-    if (this.deflating) {
-      this.enqueue([this.doClose, buf, mask, cb]);
-    } else {
-      this.doClose(buf, mask, cb);
-    }
-  }
-
-  /**
-   * Frames and sends a close message.
-   *
-   * @param {Buffer} data The message to send
-   * @param {Boolean} mask Specifies whether or not to mask `data`
-   * @param {Function} cb Callback
-   * @private
-   */
-  doClose (data, mask, cb) {
-    this.sendFrame(Sender.frame(data, {
-      fin: true,
-      rsv1: false,
-      opcode: 0x08,
-      mask,
-      readOnly: false
-    }), cb);
-  }
-
-  /**
-   * Sends a ping message to the other peer.
-   *
-   * @param {*} data The message to send
-   * @param {Boolean} mask Specifies whether or not to mask `data`
-   * @public
-   */
-  ping (data, mask) {
-    var readOnly = true;
-
-    if (!Buffer.isBuffer(data)) {
-      if (data instanceof ArrayBuffer) {
-        data = Buffer.from(data);
-      } else if (ArrayBuffer.isView(data)) {
-        data = viewToBuffer(data);
-      } else {
-        data = Buffer.from(data);
-        readOnly = false;
-      }
-    }
-
-    if (this.deflating) {
-      this.enqueue([this.doPing, data, mask, readOnly]);
-    } else {
-      this.doPing(data, mask, readOnly);
-    }
-  }
-
-  /**
-   * Frames and sends a ping message.
-   *
-   * @param {*} data The message to send
-   * @param {Boolean} mask Specifies whether or not to mask `data`
-   * @param {Boolean} readOnly Specifies whether `data` can be modified
-   * @private
-   */
-  doPing (data, mask, readOnly) {
-    this.sendFrame(Sender.frame(data, {
-      fin: true,
-      rsv1: false,
-      opcode: 0x09,
-      mask,
-      readOnly
-    }));
-  }
-
-  /**
-   * Sends a pong message to the other peer.
-   *
-   * @param {*} data The message to send
-   * @param {Boolean} mask Specifies whether or not to mask `data`
-   * @public
-   */
-  pong (data, mask) {
-    var readOnly = true;
-
-    if (!Buffer.isBuffer(data)) {
-      if (data instanceof ArrayBuffer) {
-        data = Buffer.from(data);
-      } else if (ArrayBuffer.isView(data)) {
-        data = viewToBuffer(data);
-      } else {
-        data = Buffer.from(data);
-        readOnly = false;
-      }
-    }
-
-    if (this.deflating) {
-      this.enqueue([this.doPong, data, mask, readOnly]);
-    } else {
-      this.doPong(data, mask, readOnly);
-    }
-  }
-
-  /**
-   * Frames and sends a pong message.
-   *
-   * @param {*} data The message to send
-   * @param {Boolean} mask Specifies whether or not to mask `data`
-   * @param {Boolean} readOnly Specifies whether `data` can be modified
-   * @private
-   */
-  doPong (data, mask, readOnly) {
-    this.sendFrame(Sender.frame(data, {
-      fin: true,
-      rsv1: false,
-      opcode: 0x0a,
-      mask,
-      readOnly
-    }));
-  }
-
-  /**
-   * Sends a data message to the other peer.
-   *
-   * @param {*} data The message to send
-   * @param {Object} options Options object
-   * @param {Boolean} options.compress Specifies whether or not to compress `data`
-   * @param {Boolean} options.binary Specifies whether `data` is binary or text
-   * @param {Boolean} options.fin Specifies whether the fragment is the last one
-   * @param {Boolean} options.mask Specifies whether or not to mask `data`
-   * @param {Function} cb Callback
-   * @public
-   */
-  send (data, options, cb) {
-    var opcode = options.binary ? 2 : 1;
-    var rsv1 = options.compress;
-    var readOnly = true;
-
-    if (!Buffer.isBuffer(data)) {
-      if (data instanceof ArrayBuffer) {
-        data = Buffer.from(data);
-      } else if (ArrayBuffer.isView(data)) {
-        data = viewToBuffer(data);
-      } else {
-        data = Buffer.from(data);
-        readOnly = false;
-      }
-    }
-
-    if (this.firstFragment) {
-      this.firstFragment = false;
-      if (rsv1 && this.perMessageDeflate) {
-        rsv1 = data.length >= this.perMessageDeflate.threshold;
-      }
-      this.compress = rsv1;
-    } else {
-      rsv1 = false;
-      opcode = 0;
-    }
-
-    if (options.fin) this.firstFragment = true;
-
-    if (this.perMessageDeflate) {
-      const opts = {
-        fin: options.fin,
-        rsv1,
-        opcode,
-        mask: options.mask,
-        readOnly
-      };
-
-      if (this.deflating) {
-        this.enqueue([this.dispatch, data, this.compress, opts, cb]);
-      } else {
-        this.dispatch(data, this.compress, opts, cb);
-      }
-    } else {
-      this.sendFrame(Sender.frame(data, {
-        fin: options.fin,
-        rsv1: false,
-        opcode,
-        mask: options.mask,
-        readOnly
-      }), cb);
-    }
-  }
-
-  /**
-   * Dispatches a data message.
-   *
-   * @param {Buffer} data The message to send
-   * @param {Boolean} compress Specifies whether or not to compress `data`
-   * @param {Object} options Options object
-   * @param {Number} options.opcode The opcode
-   * @param {Boolean} options.readOnly Specifies whether `data` can be modified
-   * @param {Boolean} options.fin Specifies whether or not to set the FIN bit
-   * @param {Boolean} options.mask Specifies whether or not to mask `data`
-   * @param {Boolean} options.rsv1 Specifies whether or not to set the RSV1 bit
-   * @param {Function} cb Callback
-   * @private
-   */
-  dispatch (data, compress, options, cb) {
-    if (!compress) {
-      this.sendFrame(Sender.frame(data, options), cb);
-      return;
-    }
-
-    this.deflating = true;
-    this.perMessageDeflate.compress(data, options.fin, (err, buf) => {
-      if (err) {
-        if (cb) cb(err);
-        else this.onerror(err);
-        return;
-      }
-
-      options.readOnly = false;
-      this.sendFrame(Sender.frame(buf, options), cb);
-      this.deflating = false;
-      this.dequeue();
-    });
-  }
-
-  /**
-   * Executes queued send operations.
-   *
-   * @private
-   */
-  dequeue () {
-    while (!this.deflating && this.queue.length) {
-      const params = this.queue.shift();
-
-      this.bufferedBytes -= params[1].length;
-      params[0].apply(this, params.slice(1));
-    }
-  }
-
-  /**
-   * Enqueues a send operation.
-   *
-   * @param {Array} params Send operation parameters.
-   * @private
-   */
-  enqueue (params) {
-    this.bufferedBytes += params[1].length;
-    this.queue.push(params);
-  }
-
-  /**
-   * Sends a frame.
-   *
-   * @param {Buffer[]} list The frame to send
-   * @param {Function} cb Callback
-   * @private
-   */
-  sendFrame (list, cb) {
-    if (list.length === 2) {
-      this._socket.write(list[0]);
-      this._socket.write(list[1], cb);
-    } else {
-      this._socket.write(list[0], cb);
-    }
-  }
-}
-
-module.exports = Sender;
-
-/**
- * Converts an `ArrayBuffer` view into a buffer.
- *
- * @param {(DataView|TypedArray)} view The view to convert
- * @return {Buffer} Converted view
- * @private
- */
-function viewToBuffer (view) {
-  const buf = Buffer.from(view.buffer);
-
-  if (view.byteLength !== view.buffer.byteLength) {
-    return buf.slice(view.byteOffset, view.byteOffset + view.byteLength);
-  }
-
-  return buf;
-}
diff --git a/js/Windows/node_modules/ws/lib/Validation.js b/js/Windows/node_modules/ws/lib/Validation.js
deleted file mode 100644
index fcb170f312085684d7eabb643f59d5237ba7dea4..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/lib/Validation.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-'use strict';
-
-try {
-  const isValidUTF8 = require('utf-8-validate');
-
-  module.exports = typeof isValidUTF8 === 'object'
-    ? isValidUTF8.Validation.isValidUTF8  // utf-8-validate@<3.0.0
-    : isValidUTF8;
-} catch (e) /* istanbul ignore next */ {
-  module.exports = () => true;
-}
diff --git a/js/Windows/node_modules/ws/lib/WebSocket.js b/js/Windows/node_modules/ws/lib/WebSocket.js
deleted file mode 100644
index 41868d8328385c58f2cd1c6fd4cb042186b7633a..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/lib/WebSocket.js
+++ /dev/null
@@ -1,712 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-'use strict';
-
-const EventEmitter = require('events');
-const crypto = require('crypto');
-const Ultron = require('ultron');
-const https = require('https');
-const http = require('http');
-const url = require('url');
-
-const PerMessageDeflate = require('./PerMessageDeflate');
-const EventTarget = require('./EventTarget');
-const Extensions = require('./Extensions');
-const constants = require('./Constants');
-const Receiver = require('./Receiver');
-const Sender = require('./Sender');
-
-const protocolVersions = [8, 13];
-const closeTimeout = 30 * 1000; // Allow 30 seconds to terminate the connection cleanly.
-
-/**
- * Class representing a WebSocket.
- *
- * @extends EventEmitter
- */
-class WebSocket extends EventEmitter {
-  /**
-   * Create a new `WebSocket`.
-   *
-   * @param {String} address The URL to which to connect
-   * @param {(String|String[])} protocols The subprotocols
-   * @param {Object} options Connection options
-   */
-  constructor (address, protocols, options) {
-    super();
-
-    if (!protocols) {
-      protocols = [];
-    } else if (typeof protocols === 'string') {
-      protocols = [protocols];
-    } else if (!Array.isArray(protocols)) {
-      options = protocols;
-      protocols = [];
-    }
-
-    this.readyState = WebSocket.CONNECTING;
-    this.bytesReceived = 0;
-    this.extensions = {};
-    this.protocol = '';
-
-    this._binaryType = constants.BINARY_TYPES[0];
-    this._finalize = this.finalize.bind(this);
-    this._finalizeCalled = false;
-    this._closeMessage = null;
-    this._closeTimer = null;
-    this._closeCode = null;
-    this._receiver = null;
-    this._sender = null;
-    this._socket = null;
-    this._ultron = null;
-
-    if (Array.isArray(address)) {
-      initAsServerClient.call(this, address[0], address[1], address[2], options);
-    } else {
-      initAsClient.call(this, address, protocols, options);
-    }
-  }
-
-  get CONNECTING () { return WebSocket.CONNECTING; }
-  get CLOSING () { return WebSocket.CLOSING; }
-  get CLOSED () { return WebSocket.CLOSED; }
-  get OPEN () { return WebSocket.OPEN; }
-
-  /**
-   * @type {Number}
-   */
-  get bufferedAmount () {
-    var amount = 0;
-
-    if (this._socket) {
-      amount = this._socket.bufferSize + this._sender.bufferedBytes;
-    }
-    return amount;
-  }
-
-  /**
-   * This deviates from the WHATWG interface since ws doesn't support the required
-   * default "blob" type (instead we define a custom "nodebuffer" type).
-   *
-   * @type {String}
-   */
-  get binaryType () {
-    return this._binaryType;
-  }
-
-  set binaryType (type) {
-    if (constants.BINARY_TYPES.indexOf(type) < 0) return;
-
-    this._binaryType = type;
-
-    //
-    // Allow to change `binaryType` on the fly.
-    //
-    if (this._receiver) this._receiver.binaryType = type;
-  }
-
-  /**
-   * Set up the socket and the internal resources.
-   *
-   * @param {net.Socket} socket The network socket between the server and client
-   * @param {Buffer} head The first packet of the upgraded stream
-   * @private
-   */
-  setSocket (socket, head) {
-    socket.setTimeout(0);
-    socket.setNoDelay();
-
-    this._receiver = new Receiver(this.extensions, this.maxPayload, this.binaryType);
-    this._sender = new Sender(socket, this.extensions);
-    this._ultron = new Ultron(socket);
-    this._socket = socket;
-
-    // socket cleanup handlers
-    this._ultron.on('close', this._finalize);
-    this._ultron.on('error', this._finalize);
-    this._ultron.on('end', this._finalize);
-
-    // ensure that the head is added to the receiver
-    if (head && head.length > 0) {
-      socket.unshift(head);
-      head = null;
-    }
-
-    // subsequent packets are pushed to the receiver
-    this._ultron.on('data', (data) => {
-      this.bytesReceived += data.length;
-      this._receiver.add(data);
-    });
-
-    // receiver event handlers
-    this._receiver.onmessage = (data, flags) => this.emit('message', data, flags);
-    this._receiver.onping = (data, flags) => {
-      this.pong(data, !this._isServer, true);
-      this.emit('ping', data, flags);
-    };
-    this._receiver.onpong = (data, flags) => this.emit('pong', data, flags);
-    this._receiver.onclose = (code, reason) => {
-      this._closeMessage = reason;
-      this._closeCode = code;
-      this.close(code, reason);
-    };
-    this._receiver.onerror = (error, code) => {
-      // close the connection when the receiver reports a HyBi error code
-      this.close(code, '');
-      this.emit('error', error);
-    };
-
-    // sender event handlers
-    this._sender.onerror = (error) => {
-      this.close(1002, '');
-      this.emit('error', error);
-    };
-
-    this.readyState = WebSocket.OPEN;
-    this.emit('open');
-  }
-
-  /**
-   * Clean up and release internal resources.
-   *
-   * @param {(Boolean|Error)} Indicates whether or not an error occurred
-   * @private
-   */
-  finalize (error) {
-    if (this._finalizeCalled) return;
-
-    this.readyState = WebSocket.CLOSING;
-    this._finalizeCalled = true;
-
-    clearTimeout(this._closeTimer);
-    this._closeTimer = null;
-
-    //
-    // If the connection was closed abnormally (with an error), or if the close
-    // control frame was malformed or not received then the close code must be
-    // 1006.
-    //
-    if (error) this._closeCode = 1006;
-
-    if (this._socket) {
-      this._ultron.destroy();
-      this._socket.on('error', function onerror () {
-        this.destroy();
-      });
-
-      if (!error) this._socket.end();
-      else this._socket.destroy();
-
-      this._socket = null;
-      this._ultron = null;
-    }
-
-    if (this._sender) {
-      this._sender = this._sender.onerror = null;
-    }
-
-    if (this._receiver) {
-      this._receiver.cleanup(() => this.emitClose());
-      this._receiver = null;
-    } else {
-      this.emitClose();
-    }
-  }
-
-  /**
-   * Emit the `close` event.
-   *
-   * @private
-   */
-  emitClose () {
-    this.readyState = WebSocket.CLOSED;
-    this.emit('close', this._closeCode || 1006, this._closeMessage || '');
-
-    if (this.extensions[PerMessageDeflate.extensionName]) {
-      this.extensions[PerMessageDeflate.extensionName].cleanup();
-    }
-
-    this.extensions = null;
-
-    this.removeAllListeners();
-    this.on('error', constants.NOOP); // Catch all errors after this.
-  }
-
-  /**
-   * Pause the socket stream.
-   *
-   * @public
-   */
-  pause () {
-    if (this.readyState !== WebSocket.OPEN) throw new Error('not opened');
-
-    this._socket.pause();
-  }
-
-  /**
-   * Resume the socket stream
-   *
-   * @public
-   */
-  resume () {
-    if (this.readyState !== WebSocket.OPEN) throw new Error('not opened');
-
-    this._socket.resume();
-  }
-
-  /**
-   * Start a closing handshake.
-   *
-   * @param {Number} code Status code explaining why the connection is closing
-   * @param {String} data A string explaining why the connection is closing
-   * @public
-   */
-  close (code, data) {
-    if (this.readyState === WebSocket.CLOSED) return;
-    if (this.readyState === WebSocket.CONNECTING) {
-      if (this._req && !this._req.aborted) {
-        this._req.abort();
-        this.emit('error', new Error('closed before the connection is established'));
-        this.finalize(true);
-      }
-      return;
-    }
-
-    if (this.readyState === WebSocket.CLOSING) {
-      if (this._closeCode && this._socket) this._socket.end();
-      return;
-    }
-
-    this.readyState = WebSocket.CLOSING;
-    this._sender.close(code, data, !this._isServer, (err) => {
-      if (err) this.emit('error', err);
-
-      if (this._socket) {
-        if (this._closeCode) this._socket.end();
-        //
-        // Ensure that the connection is cleaned up even when the closing
-        // handshake fails.
-        //
-        clearTimeout(this._closeTimer);
-        this._closeTimer = setTimeout(this._finalize, closeTimeout, true);
-      }
-    });
-  }
-
-  /**
-   * Send a ping message.
-   *
-   * @param {*} data The message to send
-   * @param {Boolean} mask Indicates whether or not to mask `data`
-   * @param {Boolean} failSilently Indicates whether or not to throw if `readyState` isn't `OPEN`
-   * @public
-   */
-  ping (data, mask, failSilently) {
-    if (this.readyState !== WebSocket.OPEN) {
-      if (failSilently) return;
-      throw new Error('not opened');
-    }
-
-    if (typeof data === 'number') data = data.toString();
-    if (mask === undefined) mask = !this._isServer;
-    this._sender.ping(data || constants.EMPTY_BUFFER, mask);
-  }
-
-  /**
-   * Send a pong message.
-   *
-   * @param {*} data The message to send
-   * @param {Boolean} mask Indicates whether or not to mask `data`
-   * @param {Boolean} failSilently Indicates whether or not to throw if `readyState` isn't `OPEN`
-   * @public
-   */
-  pong (data, mask, failSilently) {
-    if (this.readyState !== WebSocket.OPEN) {
-      if (failSilently) return;
-      throw new Error('not opened');
-    }
-
-    if (typeof data === 'number') data = data.toString();
-    if (mask === undefined) mask = !this._isServer;
-    this._sender.pong(data || constants.EMPTY_BUFFER, mask);
-  }
-
-  /**
-   * Send a data message.
-   *
-   * @param {*} data The message to send
-   * @param {Object} options Options object
-   * @param {Boolean} options.compress Specifies whether or not to compress `data`
-   * @param {Boolean} options.binary Specifies whether `data` is binary or text
-   * @param {Boolean} options.fin Specifies whether the fragment is the last one
-   * @param {Boolean} options.mask Specifies whether or not to mask `data`
-   * @param {Function} cb Callback which is executed when data is written out
-   * @public
-   */
-  send (data, options, cb) {
-    if (typeof options === 'function') {
-      cb = options;
-      options = {};
-    }
-
-    if (this.readyState !== WebSocket.OPEN) {
-      if (cb) cb(new Error('not opened'));
-      else throw new Error('not opened');
-      return;
-    }
-
-    if (typeof data === 'number') data = data.toString();
-
-    const opts = Object.assign({
-      binary: typeof data !== 'string',
-      mask: !this._isServer,
-      compress: true,
-      fin: true
-    }, options);
-
-    if (!this.extensions[PerMessageDeflate.extensionName]) {
-      opts.compress = false;
-    }
-
-    this._sender.send(data || constants.EMPTY_BUFFER, opts, cb);
-  }
-
-  /**
-   * Forcibly close the connection.
-   *
-   * @public
-   */
-  terminate () {
-    if (this.readyState === WebSocket.CLOSED) return;
-    if (this.readyState === WebSocket.CONNECTING) {
-      if (this._req && !this._req.aborted) {
-        this._req.abort();
-        this.emit('error', new Error('closed before the connection is established'));
-        this.finalize(true);
-      }
-      return;
-    }
-
-    this.finalize(true);
-  }
-}
-
-WebSocket.CONNECTING = 0;
-WebSocket.OPEN = 1;
-WebSocket.CLOSING = 2;
-WebSocket.CLOSED = 3;
-
-//
-// Add the `onopen`, `onerror`, `onclose`, and `onmessage` attributes.
-// See https://html.spec.whatwg.org/multipage/comms.html#the-websocket-interface
-//
-['open', 'error', 'close', 'message'].forEach((method) => {
-  Object.defineProperty(WebSocket.prototype, `on${method}`, {
-    /**
-     * Return the listener of the event.
-     *
-     * @return {(Function|undefined)} The event listener or `undefined`
-     * @public
-     */
-    get () {
-      const listeners = this.listeners(method);
-      for (var i = 0; i < listeners.length; i++) {
-        if (listeners[i]._listener) return listeners[i]._listener;
-      }
-    },
-    /**
-     * Add a listener for the event.
-     *
-     * @param {Function} listener The listener to add
-     * @public
-     */
-    set (listener) {
-      const listeners = this.listeners(method);
-      for (var i = 0; i < listeners.length; i++) {
-        //
-        // Remove only the listeners added via `addEventListener`.
-        //
-        if (listeners[i]._listener) this.removeListener(method, listeners[i]);
-      }
-      this.addEventListener(method, listener);
-    }
-  });
-});
-
-WebSocket.prototype.addEventListener = EventTarget.addEventListener;
-WebSocket.prototype.removeEventListener = EventTarget.removeEventListener;
-
-module.exports = WebSocket;
-
-/**
- * Initialize a WebSocket server client.
- *
- * @param {http.IncomingMessage} req The request object
- * @param {net.Socket} socket The network socket between the server and client
- * @param {Buffer} head The first packet of the upgraded stream
- * @param {Object} options WebSocket attributes
- * @param {Number} options.protocolVersion The WebSocket protocol version
- * @param {Object} options.extensions The negotiated extensions
- * @param {Number} options.maxPayload The maximum allowed message size
- * @param {String} options.protocol The chosen subprotocol
- * @private
- */
-function initAsServerClient (req, socket, head, options) {
-  this.protocolVersion = options.protocolVersion;
-  this.extensions = options.extensions;
-  this.maxPayload = options.maxPayload;
-  this.protocol = options.protocol;
-
-  this.upgradeReq = req;
-  this._isServer = true;
-
-  this.setSocket(socket, head);
-}
-
-/**
- * Initialize a WebSocket client.
- *
- * @param {String} address The URL to which to connect
- * @param {String[]} protocols The list of subprotocols
- * @param {Object} options Connection options
- * @param {String} options.protocol Value of the `Sec-WebSocket-Protocol` header
- * @param {(Boolean|Object)} options.perMessageDeflate Enable/disable permessage-deflate
- * @param {String} options.localAddress Local interface to bind for network connections
- * @param {Number} options.protocolVersion Value of the `Sec-WebSocket-Version` header
- * @param {Object} options.headers An object containing request headers
- * @param {String} options.origin Value of the `Origin` or `Sec-WebSocket-Origin` header
- * @param {http.Agent} options.agent Use the specified Agent
- * @param {String} options.host Value of the `Host` header
- * @param {Number} options.family IP address family to use during hostname lookup (4 or 6).
- * @param {Function} options.checkServerIdentity A function to validate the server hostname
- * @param {Boolean} options.rejectUnauthorized Verify or not the server certificate
- * @param {String} options.passphrase The passphrase for the private key or pfx
- * @param {String} options.ciphers The ciphers to use or exclude
- * @param {(String|String[]|Buffer|Buffer[])} options.cert The certificate key
- * @param {(String|String[]|Buffer|Buffer[])} options.key The private key
- * @param {(String|Buffer)} options.pfx The private key, certificate, and CA certs
- * @param {(String|String[]|Buffer|Buffer[])} options.ca Trusted certificates
- * @private
- */
-function initAsClient (address, protocols, options) {
-  options = Object.assign({
-    protocolVersion: protocolVersions[1],
-    protocol: protocols.join(','),
-    perMessageDeflate: true,
-    localAddress: null,
-    headers: null,
-    family: null,
-    origin: null,
-    agent: null,
-    host: null,
-
-    //
-    // SSL options.
-    //
-    checkServerIdentity: null,
-    rejectUnauthorized: null,
-    passphrase: null,
-    ciphers: null,
-    cert: null,
-    key: null,
-    pfx: null,
-    ca: null
-  }, options);
-
-  if (protocolVersions.indexOf(options.protocolVersion) === -1) {
-    throw new Error(
-      `unsupported protocol version: ${options.protocolVersion} ` +
-      `(supported versions: ${protocolVersions.join(', ')})`
-    );
-  }
-
-  this.protocolVersion = options.protocolVersion;
-  this._isServer = false;
-  this.url = address;
-
-  const serverUrl = url.parse(address);
-  const isUnixSocket = serverUrl.protocol === 'ws+unix:';
-
-  if (!serverUrl.host && (!isUnixSocket || !serverUrl.path)) {
-    throw new Error('invalid url');
-  }
-
-  const isSecure = serverUrl.protocol === 'wss:' || serverUrl.protocol === 'https:';
-  const key = crypto.randomBytes(16).toString('base64');
-  const httpObj = isSecure ? https : http;
-
-  //
-  // Prepare extensions.
-  //
-  const extensionsOffer = {};
-  var perMessageDeflate;
-
-  if (options.perMessageDeflate) {
-    perMessageDeflate = new PerMessageDeflate(
-      options.perMessageDeflate !== true ? options.perMessageDeflate : {},
-      false
-    );
-    extensionsOffer[PerMessageDeflate.extensionName] = perMessageDeflate.offer();
-  }
-
-  const requestOptions = {
-    port: serverUrl.port || (isSecure ? 443 : 80),
-    host: serverUrl.hostname,
-    path: '/',
-    headers: {
-      'Sec-WebSocket-Version': options.protocolVersion,
-      'Sec-WebSocket-Key': key,
-      'Connection': 'Upgrade',
-      'Upgrade': 'websocket'
-    }
-  };
-
-  if (options.headers) Object.assign(requestOptions.headers, options.headers);
-  if (Object.keys(extensionsOffer).length) {
-    requestOptions.headers['Sec-WebSocket-Extensions'] = Extensions.format(extensionsOffer);
-  }
-  if (options.protocol) {
-    requestOptions.headers['Sec-WebSocket-Protocol'] = options.protocol;
-  }
-  if (options.origin) {
-    if (options.protocolVersion < 13) {
-      requestOptions.headers['Sec-WebSocket-Origin'] = options.origin;
-    } else {
-      requestOptions.headers.Origin = options.origin;
-    }
-  }
-  if (options.host) requestOptions.headers.Host = options.host;
-  if (serverUrl.auth) requestOptions.auth = serverUrl.auth;
-
-  if (options.localAddress) requestOptions.localAddress = options.localAddress;
-  if (options.family) requestOptions.family = options.family;
-
-  if (isUnixSocket) {
-    const parts = serverUrl.path.split(':');
-
-    requestOptions.socketPath = parts[0];
-    requestOptions.path = parts[1];
-  } else if (serverUrl.path) {
-    //
-    // Make sure that path starts with `/`.
-    //
-    if (serverUrl.path.charAt(0) !== '/') {
-      requestOptions.path = `/${serverUrl.path}`;
-    } else {
-      requestOptions.path = serverUrl.path;
-    }
-  }
-
-  var agent = options.agent;
-
-  //
-  // A custom agent is required for these options.
-  //
-  if (
-    options.rejectUnauthorized != null ||
-    options.checkServerIdentity ||
-    options.passphrase ||
-    options.ciphers ||
-    options.cert ||
-    options.key ||
-    options.pfx ||
-    options.ca
-  ) {
-    if (options.passphrase) requestOptions.passphrase = options.passphrase;
-    if (options.ciphers) requestOptions.ciphers = options.ciphers;
-    if (options.cert) requestOptions.cert = options.cert;
-    if (options.key) requestOptions.key = options.key;
-    if (options.pfx) requestOptions.pfx = options.pfx;
-    if (options.ca) requestOptions.ca = options.ca;
-    if (options.checkServerIdentity) {
-      requestOptions.checkServerIdentity = options.checkServerIdentity;
-    }
-    if (options.rejectUnauthorized != null) {
-      requestOptions.rejectUnauthorized = options.rejectUnauthorized;
-    }
-
-    if (!agent) agent = new httpObj.Agent(requestOptions);
-  }
-
-  if (agent) requestOptions.agent = agent;
-
-  this._req = httpObj.get(requestOptions);
-
-  this._req.on('error', (error) => {
-    if (this._req.aborted) return;
-
-    this._req = null;
-    this.emit('error', error);
-    this.finalize(true);
-  });
-
-  this._req.on('response', (res) => {
-    if (!this.emit('unexpected-response', this._req, res)) {
-      this._req.abort();
-      this.emit('error', new Error(`unexpected server response (${res.statusCode})`));
-      this.finalize(true);
-    }
-  });
-
-  this._req.on('upgrade', (res, socket, head) => {
-    this.emit('headers', res.headers, res);
-
-    //
-    // The user may have closed the connection from a listener of the `headers`
-    // event.
-    //
-    if (this.readyState !== WebSocket.CONNECTING) return;
-
-    this._req = null;
-
-    const digest = crypto.createHash('sha1')
-      .update(key + constants.GUID, 'binary')
-      .digest('base64');
-
-    if (res.headers['sec-websocket-accept'] !== digest) {
-      socket.destroy();
-      this.emit('error', new Error('invalid server key'));
-      return this.finalize(true);
-    }
-
-    const serverProt = res.headers['sec-websocket-protocol'];
-    const protList = (options.protocol || '').split(/, */);
-    var protError;
-
-    if (!options.protocol && serverProt) {
-      protError = 'server sent a subprotocol even though none requested';
-    } else if (options.protocol && !serverProt) {
-      protError = 'server sent no subprotocol even though requested';
-    } else if (serverProt && protList.indexOf(serverProt) === -1) {
-      protError = 'server responded with an invalid protocol';
-    }
-
-    if (protError) {
-      socket.destroy();
-      this.emit('error', new Error(protError));
-      return this.finalize(true);
-    }
-
-    if (serverProt) this.protocol = serverProt;
-
-    const serverExtensions = Extensions.parse(res.headers['sec-websocket-extensions']);
-
-    if (perMessageDeflate && serverExtensions[PerMessageDeflate.extensionName]) {
-      try {
-        perMessageDeflate.accept(serverExtensions[PerMessageDeflate.extensionName]);
-      } catch (err) {
-        socket.destroy();
-        this.emit('error', new Error('invalid extension parameter'));
-        return this.finalize(true);
-      }
-
-      this.extensions[PerMessageDeflate.extensionName] = perMessageDeflate;
-    }
-
-    this.setSocket(socket, head);
-  });
-}
diff --git a/js/Windows/node_modules/ws/lib/WebSocketServer.js b/js/Windows/node_modules/ws/lib/WebSocketServer.js
deleted file mode 100644
index bd3ef24e3cd7bf0f0d70d9e2b0d7d6c39d18ad3c..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/lib/WebSocketServer.js
+++ /dev/null
@@ -1,336 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-'use strict';
-
-const safeBuffer = require('safe-buffer');
-const EventEmitter = require('events');
-const crypto = require('crypto');
-const Ultron = require('ultron');
-const http = require('http');
-const url = require('url');
-
-const PerMessageDeflate = require('./PerMessageDeflate');
-const Extensions = require('./Extensions');
-const constants = require('./Constants');
-const WebSocket = require('./WebSocket');
-
-const Buffer = safeBuffer.Buffer;
-
-/**
- * Class representing a WebSocket server.
- *
- * @extends EventEmitter
- */
-class WebSocketServer extends EventEmitter {
-  /**
-   * Create a `WebSocketServer` instance.
-   *
-   * @param {Object} options Configuration options
-   * @param {String} options.host The hostname where to bind the server
-   * @param {Number} options.port The port where to bind the server
-   * @param {http.Server} options.server A pre-created HTTP/S server to use
-   * @param {Function} options.verifyClient An hook to reject connections
-   * @param {Function} options.handleProtocols An hook to handle protocols
-   * @param {String} options.path Accept only connections matching this path
-   * @param {Boolean} options.noServer Enable no server mode
-   * @param {Boolean} options.clientTracking Specifies whether or not to track clients
-   * @param {(Boolean|Object)} options.perMessageDeflate Enable/disable permessage-deflate
-   * @param {Number} options.maxPayload The maximum allowed message size
-   * @param {Function} callback A listener for the `listening` event
-   */
-  constructor (options, callback) {
-    super();
-
-    options = Object.assign({
-      maxPayload: 100 * 1024 * 1024,
-      perMessageDeflate: true,
-      handleProtocols: null,
-      clientTracking: true,
-      verifyClient: null,
-      noServer: false,
-      backlog: null, // use default (511 as implemented in net.js)
-      server: null,
-      host: null,
-      path: null,
-      port: null
-    }, options);
-
-    if (options.port == null && !options.server && !options.noServer) {
-      throw new TypeError('missing or invalid options');
-    }
-
-    if (options.port != null) {
-      this._server = http.createServer((req, res) => {
-        const body = http.STATUS_CODES[426];
-
-        res.writeHead(426, {
-          'Content-Length': body.length,
-          'Content-Type': 'text/plain'
-        });
-        res.end(body);
-      });
-      this._server.allowHalfOpen = false;
-      this._server.listen(options.port, options.host, options.backlog, callback);
-    } else if (options.server) {
-      this._server = options.server;
-    }
-
-    if (this._server) {
-      this._ultron = new Ultron(this._server);
-      this._ultron.on('listening', () => this.emit('listening'));
-      this._ultron.on('error', (err) => this.emit('error', err));
-      this._ultron.on('upgrade', (req, socket, head) => {
-        this.handleUpgrade(req, socket, head, (client) => {
-          this.emit(`connection${req.url}`, client);
-          this.emit('connection', client);
-        });
-      });
-    }
-
-    if (options.clientTracking) this.clients = new Set();
-    this.options = options;
-    this.path = options.path;
-  }
-
-  /**
-   * Close the server.
-   *
-   * @param {Function} cb Callback
-   * @public
-   */
-  close (cb) {
-    //
-    // Terminate all associated clients.
-    //
-    if (this.clients) {
-      for (const client of this.clients) client.terminate();
-    }
-
-    const server = this._server;
-
-    if (server) {
-      this._ultron.destroy();
-      this._ultron = this._server = null;
-
-      //
-      // Close the http server if it was internally created.
-      //
-      if (this.options.port != null) return server.close(cb);
-    }
-
-    if (cb) cb();
-  }
-
-  /**
-   * See if a given request should be handled by this server instance.
-   *
-   * @param {http.IncomingMessage} req Request object to inspect
-   * @return {Boolean} `true` if the request is valid, else `false`
-   * @public
-   */
-  shouldHandle (req) {
-    if (this.options.path && url.parse(req.url).pathname !== this.options.path) {
-      return false;
-    }
-
-    return true;
-  }
-
-  /**
-   * Handle a HTTP Upgrade request.
-   *
-   * @param {http.IncomingMessage} req The request object
-   * @param {net.Socket} socket The network socket between the server and client
-   * @param {Buffer} head The first packet of the upgraded stream
-   * @param {Function} cb Callback
-   * @public
-   */
-  handleUpgrade (req, socket, head, cb) {
-    socket.on('error', socketError);
-
-    const version = +req.headers['sec-websocket-version'];
-
-    if (
-      req.method !== 'GET' || req.headers.upgrade.toLowerCase() !== 'websocket' ||
-      !req.headers['sec-websocket-key'] || (version !== 8 && version !== 13) ||
-      !this.shouldHandle(req)
-    ) {
-      return abortConnection(socket, 400);
-    }
-
-    var protocol = (req.headers['sec-websocket-protocol'] || '').split(/, */);
-
-    //
-    // Optionally call external protocol selection handler.
-    //
-    if (this.options.handleProtocols) {
-      protocol = this.options.handleProtocols(protocol, req);
-      if (protocol === false) return abortConnection(socket, 401);
-    } else {
-      protocol = protocol[0];
-    }
-
-    //
-    // Optionally call external client verification handler.
-    //
-    if (this.options.verifyClient) {
-      const info = {
-        origin: req.headers[`${version === 8 ? 'sec-websocket-origin' : 'origin'}`],
-        secure: !!(req.connection.authorized || req.connection.encrypted),
-        req
-      };
-
-      if (this.options.verifyClient.length === 2) {
-        this.options.verifyClient(info, (verified, code, message) => {
-          if (!verified) return abortConnection(socket, code || 401, message);
-
-          this.completeUpgrade(protocol, version, req, socket, head, cb);
-        });
-        return;
-      } else if (!this.options.verifyClient(info)) {
-        return abortConnection(socket, 401);
-      }
-    }
-
-    this.completeUpgrade(protocol, version, req, socket, head, cb);
-  }
-
-  /**
-   * Upgrade the connection to WebSocket.
-   *
-   * @param {String} protocol The chosen subprotocol
-   * @param {Number} version The WebSocket protocol version
-   * @param {http.IncomingMessage} req The request object
-   * @param {net.Socket} socket The network socket between the server and client
-   * @param {Buffer} head The first packet of the upgraded stream
-   * @param {Function} cb Callback
-   * @private
-   */
-  completeUpgrade (protocol, version, req, socket, head, cb) {
-    //
-    // Destroy the socket if the client has already sent a FIN packet.
-    //
-    if (!socket.readable || !socket.writable) return socket.destroy();
-
-    const key = crypto.createHash('sha1')
-      .update(req.headers['sec-websocket-key'] + constants.GUID, 'binary')
-      .digest('base64');
-
-    const headers = [
-      'HTTP/1.1 101 Switching Protocols',
-      'Upgrade: websocket',
-      'Connection: Upgrade',
-      `Sec-WebSocket-Accept: ${key}`
-    ];
-
-    if (protocol) headers.push(`Sec-WebSocket-Protocol: ${protocol}`);
-
-    const offer = Extensions.parse(req.headers['sec-websocket-extensions']);
-    var extensions;
-
-    try {
-      extensions = acceptExtensions(this.options, offer);
-    } catch (err) {
-      return abortConnection(socket, 400);
-    }
-
-    const props = Object.keys(extensions);
-
-    if (props.length) {
-      const serverExtensions = props.reduce((obj, key) => {
-        obj[key] = [extensions[key].params];
-        return obj;
-      }, {});
-
-      headers.push(`Sec-WebSocket-Extensions: ${Extensions.format(serverExtensions)}`);
-    }
-
-    //
-    // Allow external modification/inspection of handshake headers.
-    //
-    this.emit('headers', headers, req);
-
-    socket.write(headers.concat('', '').join('\r\n'));
-
-    const client = new WebSocket([req, socket, head], null, {
-      maxPayload: this.options.maxPayload,
-      protocolVersion: version,
-      extensions,
-      protocol
-    });
-
-    if (this.clients) {
-      this.clients.add(client);
-      client.on('close', () => this.clients.delete(client));
-    }
-
-    socket.removeListener('error', socketError);
-    cb(client);
-  }
-}
-
-module.exports = WebSocketServer;
-
-/**
- * Handle premature socket errors.
- *
- * @private
- */
-function socketError () {
-  this.destroy();
-}
-
-/**
- * Accept WebSocket extensions.
- *
- * @param {Object} options The `WebSocketServer` configuration options
- * @param {Object} offer The parsed value of the `sec-websocket-extensions` header
- * @return {Object} Accepted extensions
- * @private
- */
-function acceptExtensions (options, offer) {
-  const pmd = options.perMessageDeflate;
-  const extensions = {};
-
-  if (pmd && offer[PerMessageDeflate.extensionName]) {
-    const perMessageDeflate = new PerMessageDeflate(
-      pmd !== true ? pmd : {},
-      true,
-      options.maxPayload
-    );
-
-    perMessageDeflate.accept(offer[PerMessageDeflate.extensionName]);
-    extensions[PerMessageDeflate.extensionName] = perMessageDeflate;
-  }
-
-  return extensions;
-}
-
-/**
- * Close the connection when preconditions are not fulfilled.
- *
- * @param {net.Socket} socket The socket of the upgrade request
- * @param {Number} code The HTTP response status code
- * @param {String} [message] The HTTP response body
- * @private
- */
-function abortConnection (socket, code, message) {
-  if (socket.writable) {
-    message = message || http.STATUS_CODES[code];
-    socket.write(
-      `HTTP/1.1 ${code} ${http.STATUS_CODES[code]}\r\n` +
-      'Connection: close\r\n' +
-      'Content-type: text/html\r\n' +
-      `Content-Length: ${Buffer.byteLength(message)}\r\n` +
-      '\r\n' +
-      message
-    );
-  }
-
-  socket.removeListener('error', socketError);
-  socket.destroy();
-}
diff --git a/js/Windows/node_modules/ws/package.json b/js/Windows/node_modules/ws/package.json
deleted file mode 100644
index 6b9ca84d69bc707d91750965ed76082af68d1a92..0000000000000000000000000000000000000000
--- a/js/Windows/node_modules/ws/package.json
+++ /dev/null
@@ -1,127 +0,0 @@
-{
-  "_args": [
-    [
-      {
-        "raw": "ws",
-        "scope": null,
-        "escapedName": "ws",
-        "name": "ws",
-        "rawSpec": "",
-        "spec": "latest",
-        "type": "tag"
-      },
-      "C:\\MIT\\fablab\\PrintServer"
-    ]
-  ],
-  "_from": "ws@latest",
-  "_id": "ws@2.3.1",
-  "_inCache": true,
-  "_location": "/ws",
-  "_nodeVersion": "7.9.0",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/ws-2.3.1.tgz_1492711201097_0.04034068179316819"
-  },
-  "_npmUser": {
-    "name": "lpinca",
-    "email": "luigipinca@gmail.com"
-  },
-  "_npmVersion": "4.2.0",
-  "_phantomChildren": {},
-  "_requested": {
-    "raw": "ws",
-    "scope": null,
-    "escapedName": "ws",
-    "name": "ws",
-    "rawSpec": "",
-    "spec": "latest",
-    "type": "tag"
-  },
-  "_requiredBy": [
-    "#USER",
-    "/"
-  ],
-  "_resolved": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz",
-  "_shasum": "6b94b3e447cb6a363f785eaf94af6359e8e81c80",
-  "_shrinkwrap": null,
-  "_spec": "ws",
-  "_where": "C:\\MIT\\fablab\\PrintServer",
-  "author": {
-    "name": "Einar Otto Stangvik",
-    "email": "einaros@gmail.com",
-    "url": "http://2x.io"
-  },
-  "bugs": {
-    "url": "https://github.com/websockets/ws/issues"
-  },
-  "dependencies": {
-    "safe-buffer": "~5.0.1",
-    "ultron": "~1.1.0"
-  },
-  "description": "Simple to use, blazing fast and thoroughly tested websocket client and server for Node.js",
-  "devDependencies": {
-    "benchmark": "~2.1.2",
-    "bufferutil": "~3.0.0",
-    "eslint": "~3.19.0",
-    "eslint-config-standard": "~10.2.0",
-    "eslint-plugin-import": "~2.2.0",
-    "eslint-plugin-node": "~4.2.0",
-    "eslint-plugin-promise": "~3.5.0",
-    "eslint-plugin-standard": "~3.0.0",
-    "mocha": "~3.2.0",
-    "nyc": "~10.2.0",
-    "utf-8-validate": "~3.0.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "6b94b3e447cb6a363f785eaf94af6359e8e81c80",
-    "tarball": "https://registry.npmjs.org/ws/-/ws-2.3.1.tgz"
-  },
-  "files": [
-    "index.js",
-    "lib"
-  ],
-  "gitHead": "732aaf06b76700f104eeff2740e1896be4e88199",
-  "homepage": "https://github.com/websockets/ws",
-  "keywords": [
-    "HyBi",
-    "Push",
-    "RFC-6455",
-    "WebSocket",
-    "WebSockets",
-    "real-time"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "3rdeden",
-      "email": "npm@3rd-Eden.com"
-    },
-    {
-      "name": "einaros",
-      "email": "einaros@gmail.com"
-    },
-    {
-      "name": "lpinca",
-      "email": "luigipinca@gmail.com"
-    },
-    {
-      "name": "v1",
-      "email": "npm@3rd-Eden.com"
-    }
-  ],
-  "name": "ws",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/websockets/ws.git"
-  },
-  "scripts": {
-    "integration": "eslint . && mocha test/*.integration.js",
-    "lint": "eslint .",
-    "test": "eslint . && nyc --reporter=html --reporter=text mocha test/*.test.js"
-  },
-  "version": "2.3.1"
-}
diff --git a/js/node_modules/.bin/serialport-list b/js/node_modules/.bin/serialport-list
deleted file mode 120000
index 1cf710738b1113cc9a833bf3674166545324d2e1..0000000000000000000000000000000000000000
--- a/js/node_modules/.bin/serialport-list
+++ /dev/null
@@ -1 +0,0 @@
-../serialport/bin/serialport-list.js
\ No newline at end of file
diff --git a/js/node_modules/.bin/serialport-term b/js/node_modules/.bin/serialport-term
deleted file mode 120000
index 2abe194aa1456c95d75f6ad58e518e905ff7dc28..0000000000000000000000000000000000000000
--- a/js/node_modules/.bin/serialport-term
+++ /dev/null
@@ -1 +0,0 @@
-../serialport/bin/serialport-terminal.js
\ No newline at end of file
diff --git a/js/node_modules/.bin/serialportlist b/js/node_modules/.bin/serialportlist
deleted file mode 120000
index 5fa87b270df6fb17f171ef2ebd6af3704ce70e70..0000000000000000000000000000000000000000
--- a/js/node_modules/.bin/serialportlist
+++ /dev/null
@@ -1 +0,0 @@
-../serialport/bin/serialportList.js
\ No newline at end of file
diff --git a/js/node_modules/.bin/serialportterm b/js/node_modules/.bin/serialportterm
deleted file mode 120000
index be4d33437a1c894d879f59a134c33efcc36e68c9..0000000000000000000000000000000000000000
--- a/js/node_modules/.bin/serialportterm
+++ /dev/null
@@ -1 +0,0 @@
-../serialport/bin/serialportTerminal.js
\ No newline at end of file
diff --git a/js/node_modules/bindings/README.md b/js/node_modules/bindings/README.md
deleted file mode 100644
index 585cf512b9b1f662db23d8ec64dc9b701b1de3c5..0000000000000000000000000000000000000000
--- a/js/node_modules/bindings/README.md
+++ /dev/null
@@ -1,97 +0,0 @@
-node-bindings
-=============
-### Helper module for loading your native module's .node file
-
-This is a helper module for authors of Node.js native addon modules.
-It is basically the "swiss army knife" of `require()`ing your native module's
-`.node` file.
-
-Throughout the course of Node's native addon history, addons have ended up being
-compiled in a variety of different places, depending on which build tool and which
-version of node was used. To make matters worse, now the _gyp_ build tool can
-produce either a _Release_ or _Debug_ build, each being built into different
-locations.
-
-This module checks _all_ the possible locations that a native addon would be built
-at, and returns the first one that loads successfully.
-
-
-Installation
-------------
-
-Install with `npm`:
-
-``` bash
-$ npm install bindings
-```
-
-Or add it to the `"dependencies"` section of your _package.json_ file.
-
-
-Example
--------
-
-`require()`ing the proper bindings file for the current node version, platform
-and architecture is as simple as:
-
-``` js
-var bindings = require('bindings')('binding.node')
-
-// Use your bindings defined in your C files
-bindings.your_c_function()
-```
-
-
-Nice Error Output
------------------
-
-When the `.node` file could not be loaded, `node-bindings` throws an Error with
-a nice error message telling you exactly what was tried. You can also check the
-`err.tries` Array property.
-
-```
-Error: Could not load the bindings file. Tried:
- → /Users/nrajlich/ref/build/binding.node
- → /Users/nrajlich/ref/build/Debug/binding.node
- → /Users/nrajlich/ref/build/Release/binding.node
- → /Users/nrajlich/ref/out/Debug/binding.node
- → /Users/nrajlich/ref/Debug/binding.node
- → /Users/nrajlich/ref/out/Release/binding.node
- → /Users/nrajlich/ref/Release/binding.node
- → /Users/nrajlich/ref/build/default/binding.node
- → /Users/nrajlich/ref/compiled/0.8.2/darwin/x64/binding.node
-    at bindings (/Users/nrajlich/ref/node_modules/bindings/bindings.js:84:13)
-    at Object.<anonymous> (/Users/nrajlich/ref/lib/ref.js:5:47)
-    at Module._compile (module.js:449:26)
-    at Object.Module._extensions..js (module.js:467:10)
-    at Module.load (module.js:356:32)
-    at Function.Module._load (module.js:312:12)
-    ...
-```
-
-
-License
--------
-
-(The MIT License)
-
-Copyright (c) 2012 Nathan Rajlich &lt;nathan@tootallnate.net&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/bindings/bindings.js b/js/node_modules/bindings/bindings.js
deleted file mode 100644
index 93dcf85a187afec1e6153f0921d65122be6da02e..0000000000000000000000000000000000000000
--- a/js/node_modules/bindings/bindings.js
+++ /dev/null
@@ -1,166 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var fs = require('fs')
-  , path = require('path')
-  , join = path.join
-  , dirname = path.dirname
-  , exists = fs.existsSync || path.existsSync
-  , defaults = {
-        arrow: process.env.NODE_BINDINGS_ARROW || ' → '
-      , compiled: process.env.NODE_BINDINGS_COMPILED_DIR || 'compiled'
-      , platform: process.platform
-      , arch: process.arch
-      , version: process.versions.node
-      , bindings: 'bindings.node'
-      , try: [
-          // node-gyp's linked version in the "build" dir
-          [ 'module_root', 'build', 'bindings' ]
-          // node-waf and gyp_addon (a.k.a node-gyp)
-        , [ 'module_root', 'build', 'Debug', 'bindings' ]
-        , [ 'module_root', 'build', 'Release', 'bindings' ]
-          // Debug files, for development (legacy behavior, remove for node v0.9)
-        , [ 'module_root', 'out', 'Debug', 'bindings' ]
-        , [ 'module_root', 'Debug', 'bindings' ]
-          // Release files, but manually compiled (legacy behavior, remove for node v0.9)
-        , [ 'module_root', 'out', 'Release', 'bindings' ]
-        , [ 'module_root', 'Release', 'bindings' ]
-          // Legacy from node-waf, node <= 0.4.x
-        , [ 'module_root', 'build', 'default', 'bindings' ]
-          // Production "Release" buildtype binary (meh...)
-        , [ 'module_root', 'compiled', 'version', 'platform', 'arch', 'bindings' ]
-        ]
-    }
-
-/**
- * The main `bindings()` function loads the compiled bindings for a given module.
- * It uses V8's Error API to determine the parent filename that this function is
- * being invoked from, which is then used to find the root directory.
- */
-
-function bindings (opts) {
-
-  // Argument surgery
-  if (typeof opts == 'string') {
-    opts = { bindings: opts }
-  } else if (!opts) {
-    opts = {}
-  }
-  opts.__proto__ = defaults
-
-  // Get the module root
-  if (!opts.module_root) {
-    opts.module_root = exports.getRoot(exports.getFileName())
-  }
-
-  // Ensure the given bindings name ends with .node
-  if (path.extname(opts.bindings) != '.node') {
-    opts.bindings += '.node'
-  }
-
-  var tries = []
-    , i = 0
-    , l = opts.try.length
-    , n
-    , b
-    , err
-
-  for (; i<l; i++) {
-    n = join.apply(null, opts.try[i].map(function (p) {
-      return opts[p] || p
-    }))
-    tries.push(n)
-    try {
-      b = opts.path ? require.resolve(n) : require(n)
-      if (!opts.path) {
-        b.path = n
-      }
-      return b
-    } catch (e) {
-      if (!/not find/i.test(e.message)) {
-        throw e
-      }
-    }
-  }
-
-  err = new Error('Could not locate the bindings file. Tried:\n'
-    + tries.map(function (a) { return opts.arrow + a }).join('\n'))
-  err.tries = tries
-  throw err
-}
-module.exports = exports = bindings
-
-
-/**
- * Gets the filename of the JavaScript file that invokes this function.
- * Used to help find the root directory of a module.
- * Optionally accepts an filename argument to skip when searching for the invoking filename
- */
-
-exports.getFileName = function getFileName (calling_file) {
-  var origPST = Error.prepareStackTrace
-    , origSTL = Error.stackTraceLimit
-    , dummy = {}
-    , fileName
-
-  Error.stackTraceLimit = 10
-
-  Error.prepareStackTrace = function (e, st) {
-    for (var i=0, l=st.length; i<l; i++) {
-      fileName = st[i].getFileName()
-      if (fileName !== __filename) {
-        if (calling_file) {
-            if (fileName !== calling_file) {
-              return
-            }
-        } else {
-          return
-        }
-      }
-    }
-  }
-
-  // run the 'prepareStackTrace' function above
-  Error.captureStackTrace(dummy)
-  dummy.stack
-
-  // cleanup
-  Error.prepareStackTrace = origPST
-  Error.stackTraceLimit = origSTL
-
-  return fileName
-}
-
-/**
- * Gets the root directory of a module, given an arbitrary filename
- * somewhere in the module tree. The "root directory" is the directory
- * containing the `package.json` file.
- *
- *   In:  /home/nate/node-native-module/lib/index.js
- *   Out: /home/nate/node-native-module
- */
-
-exports.getRoot = function getRoot (file) {
-  var dir = dirname(file)
-    , prev
-  while (true) {
-    if (dir === '.') {
-      // Avoids an infinite loop in rare cases, like the REPL
-      dir = process.cwd()
-    }
-    if (exists(join(dir, 'package.json')) || exists(join(dir, 'node_modules'))) {
-      // Found the 'package.json' file or 'node_modules' dir; we're done
-      return dir
-    }
-    if (prev === dir) {
-      // Got to the top
-      throw new Error('Could not find module root given file: "' + file
-                    + '". Do you have a `package.json` file? ')
-    }
-    // Try the parent dir next
-    prev = dir
-    dir = join(dir, '..')
-  }
-}
diff --git a/js/node_modules/bindings/package.json b/js/node_modules/bindings/package.json
deleted file mode 100644
index 161646f7743de3479d87dd5e82d9274da5388082..0000000000000000000000000000000000000000
--- a/js/node_modules/bindings/package.json
+++ /dev/null
@@ -1,83 +0,0 @@
-{
-  "_args": [
-    [
-      "bindings@1.2.1",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport"
-    ]
-  ],
-  "_from": "bindings@1.2.1",
-  "_id": "bindings@1.2.1",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/bindings",
-  "_npmUser": {
-    "email": "nathan@tootallnate.net",
-    "name": "tootallnate"
-  },
-  "_npmVersion": "1.4.14",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "bindings",
-    "raw": "bindings@1.2.1",
-    "rawSpec": "1.2.1",
-    "scope": null,
-    "spec": "1.2.1",
-    "type": "version"
-  },
-  "_requiredBy": [
-    "/serialport"
-  ],
-  "_resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz",
-  "_shasum": "14ad6113812d2d37d72e67b4cacb4bb726505f11",
-  "_shrinkwrap": null,
-  "_spec": "bindings@1.2.1",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport",
-  "author": {
-    "email": "nathan@tootallnate.net",
-    "name": "Nathan Rajlich",
-    "url": "http://tootallnate.net"
-  },
-  "bugs": {
-    "url": "https://github.com/TooTallNate/node-bindings/issues"
-  },
-  "dependencies": {},
-  "description": "Helper module for loading your native module's .node file",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "14ad6113812d2d37d72e67b4cacb4bb726505f11",
-    "tarball": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz"
-  },
-  "gitHead": "e404152ee27f8478ccbc7122ee051246e8e5ec02",
-  "homepage": "https://github.com/TooTallNate/node-bindings",
-  "keywords": [
-    "addon",
-    "bindings",
-    "c",
-    "c++",
-    "gyp",
-    "native",
-    "waf"
-  ],
-  "license": "MIT",
-  "main": "./bindings.js",
-  "maintainers": [
-    {
-      "name": "TooTallNate",
-      "email": "nathan@tootallnate.net"
-    },
-    {
-      "name": "tootallnate",
-      "email": "nathan@tootallnate.net"
-    }
-  ],
-  "name": "bindings",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/TooTallNate/node-bindings.git"
-  },
-  "scripts": {},
-  "version": "1.2.1"
-}
diff --git a/js/node_modules/commander/History.md b/js/node_modules/commander/History.md
deleted file mode 100644
index 1b47439cbe54a69e5666ddb9597f5bb6798357f6..0000000000000000000000000000000000000000
--- a/js/node_modules/commander/History.md
+++ /dev/null
@@ -1,261 +0,0 @@
-
-2.9.0 / 2015-10-13
-==================
-
-  * Add option `isDefault` to set default subcommand #415 @Qix-
-  * Add callback to allow filtering or post-processing of help text #434 @djulien
-  * Fix `undefined` text in help information close #414 #416 @zhiyelee
-
-2.8.1 / 2015-04-22
-==================
-
- * Back out `support multiline description` Close #396 #397
-
-2.8.0 / 2015-04-07
-==================
-
-  * Add `process.execArg` support, execution args like `--harmony` will be passed to sub-commands #387 @DigitalIO @zhiyelee
-  * Fix bug in Git-style sub-commands #372 @zhiyelee
-  * Allow commands to be hidden from help #383 @tonylukasavage
-  * When git-style sub-commands are in use, yet none are called, display help #382 @claylo
-  * Add ability to specify arguments syntax for top-level command #258 @rrthomas
-  * Support multiline descriptions #208 @zxqfox
-
-2.7.1 / 2015-03-11
-==================
-
- * Revert #347 (fix collisions when option and first arg have same name) which causes a bug in #367.
-
-2.7.0 / 2015-03-09
-==================
-
- * Fix git-style bug when installed globally. Close #335 #349 @zhiyelee
- * Fix collisions when option and first arg have same name. Close #346 #347 @tonylukasavage
- * Add support for camelCase on `opts()`. Close #353  @nkzawa
- * Add node.js 0.12 and io.js to travis.yml
- * Allow RegEx options. #337 @palanik
- * Fixes exit code when sub-command failing.  Close #260 #332 @pirelenito
- * git-style `bin` files in $PATH make sense. Close #196 #327  @zhiyelee
-
-2.6.0 / 2014-12-30
-==================
-
-  * added `Command#allowUnknownOption` method. Close #138 #318 @doozr @zhiyelee
-  * Add application description to the help msg. Close #112 @dalssoft
-
-2.5.1 / 2014-12-15
-==================
-
-  * fixed two bugs incurred by variadic arguments. Close #291 @Quentin01 #302 @zhiyelee
-
-2.5.0 / 2014-10-24
-==================
-
- * add support for variadic arguments. Closes #277 @whitlockjc
-
-2.4.0 / 2014-10-17
-==================
-
- * fixed a bug on executing the coercion function of subcommands option. Closes #270
- * added `Command.prototype.name` to retrieve command name. Closes #264 #266 @tonylukasavage
- * added `Command.prototype.opts` to retrieve all the options as a simple object of key-value pairs. Closes #262 @tonylukasavage
- * fixed a bug on subcommand name. Closes #248 @jonathandelgado
- * fixed function normalize doesn’t honor option terminator. Closes #216 @abbr
-
-2.3.0 / 2014-07-16
-==================
-
- * add command alias'. Closes PR #210
- * fix: Typos. Closes #99
- * fix: Unused fs module. Closes #217
-
-2.2.0 / 2014-03-29
-==================
-
- * add passing of previous option value
- * fix: support subcommands on windows. Closes #142
- * Now the defaultValue passed as the second argument of the coercion function.
-
-2.1.0 / 2013-11-21
-==================
-
- * add: allow cflag style option params, unit test, fixes #174
-
-2.0.0 / 2013-07-18
-==================
-
- * remove input methods (.prompt, .confirm, etc)
-
-1.3.2 / 2013-07-18
-==================
-
- * add support for sub-commands to co-exist with the original command
-
-1.3.1 / 2013-07-18
-==================
-
- * add quick .runningCommand hack so you can opt-out of other logic when running a sub command
-
-1.3.0 / 2013-07-09
-==================
-
- * add EACCES error handling
- * fix sub-command --help
-
-1.2.0 / 2013-06-13
-==================
-
- * allow "-" hyphen as an option argument
- * support for RegExp coercion
-
-1.1.1 / 2012-11-20
-==================
-
-  * add more sub-command padding
-  * fix .usage() when args are present. Closes #106
-
-1.1.0 / 2012-11-16
-==================
-
-  * add git-style executable subcommand support. Closes #94
-
-1.0.5 / 2012-10-09
-==================
-
-  * fix `--name` clobbering. Closes #92
-  * fix examples/help. Closes #89
-
-1.0.4 / 2012-09-03
-==================
-
-  * add `outputHelp()` method.
-
-1.0.3 / 2012-08-30
-==================
-
-  * remove invalid .version() defaulting
-
-1.0.2 / 2012-08-24
-==================
-
-  * add `--foo=bar` support [arv]
-  * fix password on node 0.8.8. Make backward compatible with 0.6 [focusaurus]
-
-1.0.1 / 2012-08-03
-==================
-
-  * fix issue #56
-  * fix tty.setRawMode(mode) was moved to tty.ReadStream#setRawMode() (i.e. process.stdin.setRawMode())
-
-1.0.0 / 2012-07-05
-==================
-
-  * add support for optional option descriptions
-  * add defaulting of `.version()` to package.json's version
-
-0.6.1 / 2012-06-01
-==================
-
-  * Added: append (yes or no) on confirmation
-  * Added: allow node.js v0.7.x
-
-0.6.0 / 2012-04-10
-==================
-
-  * Added `.prompt(obj, callback)` support. Closes #49
-  * Added default support to .choose(). Closes #41
-  * Fixed the choice example
-
-0.5.1 / 2011-12-20
-==================
-
-  * Fixed `password()` for recent nodes. Closes #36
-
-0.5.0 / 2011-12-04
-==================
-
-  * Added sub-command option support [itay]
-
-0.4.3 / 2011-12-04
-==================
-
-  * Fixed custom help ordering. Closes #32
-
-0.4.2 / 2011-11-24
-==================
-
-  * Added travis support
-  * Fixed: line-buffered input automatically trimmed. Closes #31
-
-0.4.1 / 2011-11-18
-==================
-
-  * Removed listening for "close" on --help
-
-0.4.0 / 2011-11-15
-==================
-
-  * Added support for `--`. Closes #24
-
-0.3.3 / 2011-11-14
-==================
-
-  * Fixed: wait for close event when writing help info [Jerry Hamlet]
-
-0.3.2 / 2011-11-01
-==================
-
-  * Fixed long flag definitions with values [felixge]
-
-0.3.1 / 2011-10-31
-==================
-
-  * Changed `--version` short flag to `-V` from `-v`
-  * Changed `.version()` so it's configurable [felixge]
-
-0.3.0 / 2011-10-31
-==================
-
-  * Added support for long flags only. Closes #18
-
-0.2.1 / 2011-10-24
-==================
-
-  * "node": ">= 0.4.x < 0.7.0". Closes #20
-
-0.2.0 / 2011-09-26
-==================
-
-  * Allow for defaults that are not just boolean. Default peassignment only occurs for --no-*, optional, and required arguments. [Jim Isaacs]
-
-0.1.0 / 2011-08-24
-==================
-
-  * Added support for custom `--help` output
-
-0.0.5 / 2011-08-18
-==================
-
-  * Changed: when the user enters nothing prompt for password again
-  * Fixed issue with passwords beginning with numbers [NuckChorris]
-
-0.0.4 / 2011-08-15
-==================
-
-  * Fixed `Commander#args`
-
-0.0.3 / 2011-08-15
-==================
-
-  * Added default option value support
-
-0.0.2 / 2011-08-15
-==================
-
-  * Added mask support to `Command#password(str[, mask], fn)`
-  * Added `Command#password(str, fn)`
-
-0.0.1 / 2010-01-03
-==================
-
-  * Initial release
diff --git a/js/node_modules/commander/LICENSE b/js/node_modules/commander/LICENSE
deleted file mode 100644
index 10f997ab104594695189c3fca8fa6c65ae9ccdd6..0000000000000000000000000000000000000000
--- a/js/node_modules/commander/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/commander/Readme.md b/js/node_modules/commander/Readme.md
deleted file mode 100644
index 08b9e4cb94ab588576e02acc79460840854e12bb..0000000000000000000000000000000000000000
--- a/js/node_modules/commander/Readme.md
+++ /dev/null
@@ -1,351 +0,0 @@
-# Commander.js
-
-
-[![Build Status](https://api.travis-ci.org/tj/commander.js.svg)](http://travis-ci.org/tj/commander.js)
-[![NPM Version](http://img.shields.io/npm/v/commander.svg?style=flat)](https://www.npmjs.org/package/commander)
-[![NPM Downloads](https://img.shields.io/npm/dm/commander.svg?style=flat)](https://www.npmjs.org/package/commander)
-[![Join the chat at https://gitter.im/tj/commander.js](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/tj/commander.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-  The complete solution for [node.js](http://nodejs.org) command-line interfaces, inspired by Ruby's [commander](https://github.com/tj/commander).  
-  [API documentation](http://tj.github.com/commander.js/)
-
-
-## Installation
-
-    $ npm install commander
-
-## Option parsing
-
- Options with commander are defined with the `.option()` method, also serving as documentation for the options. The example below parses args and options from `process.argv`, leaving remaining args as the `program.args` array which were not consumed by options.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
-  .version('0.0.1')
-  .option('-p, --peppers', 'Add peppers')
-  .option('-P, --pineapple', 'Add pineapple')
-  .option('-b, --bbq-sauce', 'Add bbq sauce')
-  .option('-c, --cheese [type]', 'Add the specified type of cheese [marble]', 'marble')
-  .parse(process.argv);
-
-console.log('you ordered a pizza with:');
-if (program.peppers) console.log('  - peppers');
-if (program.pineapple) console.log('  - pineapple');
-if (program.bbqSauce) console.log('  - bbq');
-console.log('  - %s cheese', program.cheese);
-```
-
- Short flags may be passed as a single arg, for example `-abc` is equivalent to `-a -b -c`. Multi-word options such as "--template-engine" are camel-cased, becoming `program.templateEngine` etc.
-
-
-## Coercion
-
-```js
-function range(val) {
-  return val.split('..').map(Number);
-}
-
-function list(val) {
-  return val.split(',');
-}
-
-function collect(val, memo) {
-  memo.push(val);
-  return memo;
-}
-
-function increaseVerbosity(v, total) {
-  return total + 1;
-}
-
-program
-  .version('0.0.1')
-  .usage('[options] <file ...>')
-  .option('-i, --integer <n>', 'An integer argument', parseInt)
-  .option('-f, --float <n>', 'A float argument', parseFloat)
-  .option('-r, --range <a>..<b>', 'A range', range)
-  .option('-l, --list <items>', 'A list', list)
-  .option('-o, --optional [value]', 'An optional value')
-  .option('-c, --collect [value]', 'A repeatable value', collect, [])
-  .option('-v, --verbose', 'A value that can be increased', increaseVerbosity, 0)
-  .parse(process.argv);
-
-console.log(' int: %j', program.integer);
-console.log(' float: %j', program.float);
-console.log(' optional: %j', program.optional);
-program.range = program.range || [];
-console.log(' range: %j..%j', program.range[0], program.range[1]);
-console.log(' list: %j', program.list);
-console.log(' collect: %j', program.collect);
-console.log(' verbosity: %j', program.verbose);
-console.log(' args: %j', program.args);
-```
-
-## Regular Expression
-```js
-program
-  .version('0.0.1')
-  .option('-s --size <size>', 'Pizza size', /^(large|medium|small)$/i, 'medium')
-  .option('-d --drink [drink]', 'Drink', /^(coke|pepsi|izze)$/i)
-  .parse(process.argv);
-  
-console.log(' size: %j', program.size);
-console.log(' drink: %j', program.drink);
-```
-
-## Variadic arguments
-
- The last argument of a command can be variadic, and only the last argument.  To make an argument variadic you have to
- append `...` to the argument name.  Here is an example:
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
-  .version('0.0.1')
-  .command('rmdir <dir> [otherDirs...]')
-  .action(function (dir, otherDirs) {
-    console.log('rmdir %s', dir);
-    if (otherDirs) {
-      otherDirs.forEach(function (oDir) {
-        console.log('rmdir %s', oDir);
-      });
-    }
-  });
-
-program.parse(process.argv);
-```
-
- An `Array` is used for the value of a variadic argument.  This applies to `program.args` as well as the argument passed
- to your action as demonstrated above.
-
-## Specify the argument syntax
-
-```js
-#!/usr/bin/env node
-
-var program = require('../');
-
-program
-  .version('0.0.1')
-  .arguments('<cmd> [env]')
-  .action(function (cmd, env) {
-     cmdValue = cmd;
-     envValue = env;
-  });
-
-program.parse(process.argv);
-
-if (typeof cmdValue === 'undefined') {
-   console.error('no command given!');
-   process.exit(1);
-}
-console.log('command:', cmdValue);
-console.log('environment:', envValue || "no environment given");
-```
-
-## Git-style sub-commands
-
-```js
-// file: ./examples/pm
-var program = require('..');
-
-program
-  .version('0.0.1')
-  .command('install [name]', 'install one or more packages')
-  .command('search [query]', 'search with optional query')
-  .command('list', 'list packages installed', {isDefault: true})
-  .parse(process.argv);
-```
-
-When `.command()` is invoked with a description argument, no `.action(callback)` should be called to handle sub-commands, otherwise there will be an error. This tells commander that you're going to use separate executables for sub-commands, much like `git(1)` and other popular tools.  
-The commander will try to search the executables in the directory of the entry script (like `./examples/pm`) with the name `program-command`, like `pm-install`, `pm-search`.
-
-Options can be passed with the call to `.command()`. Specifying `true` for `opts.noHelp` will remove the option from the generated help output. Specifying `true` for `opts.isDefault` will run the subcommand if no other subcommand is specified.
-
-If the program is designed to be installed globally, make sure the executables have proper modes, like `755`.
-
-### `--harmony`
-
-You can enable `--harmony` option in two ways:
-* Use `#! /usr/bin/env node --harmony` in the sub-commands scripts. Note some os version don’t support this pattern.
-* Use the `--harmony` option when call the command, like `node --harmony examples/pm publish`. The `--harmony` option will be preserved when spawning sub-command process.
-
-## Automated --help
-
- The help information is auto-generated based on the information commander already knows about your program, so the following `--help` info is for free:
-
-```  
- $ ./examples/pizza --help
-
-   Usage: pizza [options]
-
-   An application for pizzas ordering
-
-   Options:
-
-     -h, --help           output usage information
-     -V, --version        output the version number
-     -p, --peppers        Add peppers
-     -P, --pineapple      Add pineapple
-     -b, --bbq            Add bbq sauce
-     -c, --cheese <type>  Add the specified type of cheese [marble]
-     -C, --no-cheese      You do not want any cheese
-
-```
-
-## Custom help
-
- You can display arbitrary `-h, --help` information
- by listening for "--help". Commander will automatically
- exit once you are done so that the remainder of your program
- does not execute causing undesired behaviours, for example
- in the following executable "stuff" will not output when
- `--help` is used.
-
-```js
-#!/usr/bin/env node
-
-/**
- * Module dependencies.
- */
-
-var program = require('commander');
-
-program
-  .version('0.0.1')
-  .option('-f, --foo', 'enable some foo')
-  .option('-b, --bar', 'enable some bar')
-  .option('-B, --baz', 'enable some baz');
-
-// must be before .parse() since
-// node's emit() is immediate
-
-program.on('--help', function(){
-  console.log('  Examples:');
-  console.log('');
-  console.log('    $ custom-help --help');
-  console.log('    $ custom-help -h');
-  console.log('');
-});
-
-program.parse(process.argv);
-
-console.log('stuff');
-```
-
-Yields the following help output when `node script-name.js -h` or `node script-name.js --help` are run:
-
-```
-
-Usage: custom-help [options]
-
-Options:
-
-  -h, --help     output usage information
-  -V, --version  output the version number
-  -f, --foo      enable some foo
-  -b, --bar      enable some bar
-  -B, --baz      enable some baz
-
-Examples:
-
-  $ custom-help --help
-  $ custom-help -h
-
-```
-
-## .outputHelp(cb)
-
-Output help information without exiting.
-Optional callback cb allows post-processing of help text before it is displayed.
-
-If you want to display help by default (e.g. if no command was provided), you can use something like:
-
-```js
-var program = require('commander');
-var colors = require('colors');
-
-program
-  .version('0.0.1')
-  .command('getstream [url]', 'get stream URL')
-  .parse(process.argv);
-
-  if (!process.argv.slice(2).length) {
-    program.outputHelp(make_red);
-  }
-
-function make_red(txt) {
-  return colors.red(txt); //display the help text in red on the console
-}
-```
-
-## .help(cb)
-
-  Output help information and exit immediately.
-  Optional callback cb allows post-processing of help text before it is displayed.
-
-## Examples
-
-```js
-var program = require('commander');
-
-program
-  .version('0.0.1')
-  .option('-C, --chdir <path>', 'change the working directory')
-  .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
-  .option('-T, --no-tests', 'ignore test hook')
-
-program
-  .command('setup [env]')
-  .description('run setup commands for all envs')
-  .option("-s, --setup_mode [mode]", "Which setup mode to use")
-  .action(function(env, options){
-    var mode = options.setup_mode || "normal";
-    env = env || 'all';
-    console.log('setup for %s env(s) with %s mode', env, mode);
-  });
-
-program
-  .command('exec <cmd>')
-  .alias('ex')
-  .description('execute the given remote cmd')
-  .option("-e, --exec_mode <mode>", "Which exec mode to use")
-  .action(function(cmd, options){
-    console.log('exec "%s" using %s mode', cmd, options.exec_mode);
-  }).on('--help', function() {
-    console.log('  Examples:');
-    console.log();
-    console.log('    $ deploy exec sequential');
-    console.log('    $ deploy exec async');
-    console.log();
-  });
-
-program
-  .command('*')
-  .action(function(env){
-    console.log('deploying "%s"', env);
-  });
-
-program.parse(process.argv);
-```
-
-More Demos can be found in the [examples](https://github.com/tj/commander.js/tree/master/examples) directory.
-
-## License
-
-MIT
-
diff --git a/js/node_modules/commander/index.js b/js/node_modules/commander/index.js
deleted file mode 100644
index a19c05d2e3dd91a1a2ac99bc2f03620b0c2eb734..0000000000000000000000000000000000000000
--- a/js/node_modules/commander/index.js
+++ /dev/null
@@ -1,1110 +0,0 @@
-/**
- * Module dependencies.
- */
-
-var EventEmitter = require('events').EventEmitter;
-var spawn = require('child_process').spawn;
-var readlink = require('graceful-readlink').readlinkSync;
-var path = require('path');
-var dirname = path.dirname;
-var basename = path.basename;
-var fs = require('fs');
-
-/**
- * Expose the root command.
- */
-
-exports = module.exports = new Command();
-
-/**
- * Expose `Command`.
- */
-
-exports.Command = Command;
-
-/**
- * Expose `Option`.
- */
-
-exports.Option = Option;
-
-/**
- * Initialize a new `Option` with the given `flags` and `description`.
- *
- * @param {String} flags
- * @param {String} description
- * @api public
- */
-
-function Option(flags, description) {
-  this.flags = flags;
-  this.required = ~flags.indexOf('<');
-  this.optional = ~flags.indexOf('[');
-  this.bool = !~flags.indexOf('-no-');
-  flags = flags.split(/[ ,|]+/);
-  if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();
-  this.long = flags.shift();
-  this.description = description || '';
-}
-
-/**
- * Return option name.
- *
- * @return {String}
- * @api private
- */
-
-Option.prototype.name = function() {
-  return this.long
-    .replace('--', '')
-    .replace('no-', '');
-};
-
-/**
- * Check if `arg` matches the short or long flag.
- *
- * @param {String} arg
- * @return {Boolean}
- * @api private
- */
-
-Option.prototype.is = function(arg) {
-  return arg == this.short || arg == this.long;
-};
-
-/**
- * Initialize a new `Command`.
- *
- * @param {String} name
- * @api public
- */
-
-function Command(name) {
-  this.commands = [];
-  this.options = [];
-  this._execs = {};
-  this._allowUnknownOption = false;
-  this._args = [];
-  this._name = name || '';
-}
-
-/**
- * Inherit from `EventEmitter.prototype`.
- */
-
-Command.prototype.__proto__ = EventEmitter.prototype;
-
-/**
- * Add command `name`.
- *
- * The `.action()` callback is invoked when the
- * command `name` is specified via __ARGV__,
- * and the remaining arguments are applied to the
- * function for access.
- *
- * When the `name` is "*" an un-matched command
- * will be passed as the first arg, followed by
- * the rest of __ARGV__ remaining.
- *
- * Examples:
- *
- *      program
- *        .version('0.0.1')
- *        .option('-C, --chdir <path>', 'change the working directory')
- *        .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')
- *        .option('-T, --no-tests', 'ignore test hook')
- *
- *      program
- *        .command('setup')
- *        .description('run remote setup commands')
- *        .action(function() {
- *          console.log('setup');
- *        });
- *
- *      program
- *        .command('exec <cmd>')
- *        .description('run the given remote command')
- *        .action(function(cmd) {
- *          console.log('exec "%s"', cmd);
- *        });
- *
- *      program
- *        .command('teardown <dir> [otherDirs...]')
- *        .description('run teardown commands')
- *        .action(function(dir, otherDirs) {
- *          console.log('dir "%s"', dir);
- *          if (otherDirs) {
- *            otherDirs.forEach(function (oDir) {
- *              console.log('dir "%s"', oDir);
- *            });
- *          }
- *        });
- *
- *      program
- *        .command('*')
- *        .description('deploy the given env')
- *        .action(function(env) {
- *          console.log('deploying "%s"', env);
- *        });
- *
- *      program.parse(process.argv);
-  *
- * @param {String} name
- * @param {String} [desc] for git-style sub-commands
- * @return {Command} the new command
- * @api public
- */
-
-Command.prototype.command = function(name, desc, opts) {
-  opts = opts || {};
-  var args = name.split(/ +/);
-  var cmd = new Command(args.shift());
-
-  if (desc) {
-    cmd.description(desc);
-    this.executables = true;
-    this._execs[cmd._name] = true;
-    if (opts.isDefault) this.defaultExecutable = cmd._name;
-  }
-
-  cmd._noHelp = !!opts.noHelp;
-  this.commands.push(cmd);
-  cmd.parseExpectedArgs(args);
-  cmd.parent = this;
-
-  if (desc) return this;
-  return cmd;
-};
-
-/**
- * Define argument syntax for the top-level command.
- *
- * @api public
- */
-
-Command.prototype.arguments = function (desc) {
-  return this.parseExpectedArgs(desc.split(/ +/));
-};
-
-/**
- * Add an implicit `help [cmd]` subcommand
- * which invokes `--help` for the given command.
- *
- * @api private
- */
-
-Command.prototype.addImplicitHelpCommand = function() {
-  this.command('help [cmd]', 'display help for [cmd]');
-};
-
-/**
- * Parse expected `args`.
- *
- * For example `["[type]"]` becomes `[{ required: false, name: 'type' }]`.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parseExpectedArgs = function(args) {
-  if (!args.length) return;
-  var self = this;
-  args.forEach(function(arg) {
-    var argDetails = {
-      required: false,
-      name: '',
-      variadic: false
-    };
-
-    switch (arg[0]) {
-      case '<':
-        argDetails.required = true;
-        argDetails.name = arg.slice(1, -1);
-        break;
-      case '[':
-        argDetails.name = arg.slice(1, -1);
-        break;
-    }
-
-    if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') {
-      argDetails.variadic = true;
-      argDetails.name = argDetails.name.slice(0, -3);
-    }
-    if (argDetails.name) {
-      self._args.push(argDetails);
-    }
-  });
-  return this;
-};
-
-/**
- * Register callback `fn` for the command.
- *
- * Examples:
- *
- *      program
- *        .command('help')
- *        .description('display verbose help')
- *        .action(function() {
- *           // output help here
- *        });
- *
- * @param {Function} fn
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.action = function(fn) {
-  var self = this;
-  var listener = function(args, unknown) {
-    // Parse any so-far unknown options
-    args = args || [];
-    unknown = unknown || [];
-
-    var parsed = self.parseOptions(unknown);
-
-    // Output help if necessary
-    outputHelpIfNecessary(self, parsed.unknown);
-
-    // If there are still any unknown options, then we simply
-    // die, unless someone asked for help, in which case we give it
-    // to them, and then we die.
-    if (parsed.unknown.length > 0) {
-      self.unknownOption(parsed.unknown[0]);
-    }
-
-    // Leftover arguments need to be pushed back. Fixes issue #56
-    if (parsed.args.length) args = parsed.args.concat(args);
-
-    self._args.forEach(function(arg, i) {
-      if (arg.required && null == args[i]) {
-        self.missingArgument(arg.name);
-      } else if (arg.variadic) {
-        if (i !== self._args.length - 1) {
-          self.variadicArgNotLast(arg.name);
-        }
-
-        args[i] = args.splice(i);
-      }
-    });
-
-    // Always append ourselves to the end of the arguments,
-    // to make sure we match the number of arguments the user
-    // expects
-    if (self._args.length) {
-      args[self._args.length] = self;
-    } else {
-      args.push(self);
-    }
-
-    fn.apply(self, args);
-  };
-  var parent = this.parent || this;
-  var name = parent === this ? '*' : this._name;
-  parent.on(name, listener);
-  if (this._alias) parent.on(this._alias, listener);
-  return this;
-};
-
-/**
- * Define option with `flags`, `description` and optional
- * coercion `fn`.
- *
- * The `flags` string should contain both the short and long flags,
- * separated by comma, a pipe or space. The following are all valid
- * all will output this way when `--help` is used.
- *
- *    "-p, --pepper"
- *    "-p|--pepper"
- *    "-p --pepper"
- *
- * Examples:
- *
- *     // simple boolean defaulting to false
- *     program.option('-p, --pepper', 'add pepper');
- *
- *     --pepper
- *     program.pepper
- *     // => Boolean
- *
- *     // simple boolean defaulting to true
- *     program.option('-C, --no-cheese', 'remove cheese');
- *
- *     program.cheese
- *     // => true
- *
- *     --no-cheese
- *     program.cheese
- *     // => false
- *
- *     // required argument
- *     program.option('-C, --chdir <path>', 'change the working directory');
- *
- *     --chdir /tmp
- *     program.chdir
- *     // => "/tmp"
- *
- *     // optional argument
- *     program.option('-c, --cheese [type]', 'add cheese [marble]');
- *
- * @param {String} flags
- * @param {String} description
- * @param {Function|Mixed} fn or default
- * @param {Mixed} defaultValue
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.option = function(flags, description, fn, defaultValue) {
-  var self = this
-    , option = new Option(flags, description)
-    , oname = option.name()
-    , name = camelcase(oname);
-
-  // default as 3rd arg
-  if (typeof fn != 'function') {
-    if (fn instanceof RegExp) {
-      var regex = fn;
-      fn = function(val, def) {
-        var m = regex.exec(val);
-        return m ? m[0] : def;
-      }
-    }
-    else {
-      defaultValue = fn;
-      fn = null;
-    }
-  }
-
-  // preassign default value only for --no-*, [optional], or <required>
-  if (false == option.bool || option.optional || option.required) {
-    // when --no-* we make sure default is true
-    if (false == option.bool) defaultValue = true;
-    // preassign only if we have a default
-    if (undefined !== defaultValue) self[name] = defaultValue;
-  }
-
-  // register the option
-  this.options.push(option);
-
-  // when it's passed assign the value
-  // and conditionally invoke the callback
-  this.on(oname, function(val) {
-    // coercion
-    if (null !== val && fn) val = fn(val, undefined === self[name]
-      ? defaultValue
-      : self[name]);
-
-    // unassigned or bool
-    if ('boolean' == typeof self[name] || 'undefined' == typeof self[name]) {
-      // if no value, bool true, and we have a default, then use it!
-      if (null == val) {
-        self[name] = option.bool
-          ? defaultValue || true
-          : false;
-      } else {
-        self[name] = val;
-      }
-    } else if (null !== val) {
-      // reassign
-      self[name] = val;
-    }
-  });
-
-  return this;
-};
-
-/**
- * Allow unknown options on the command line.
- *
- * @param {Boolean} arg if `true` or omitted, no error will be thrown
- * for unknown options.
- * @api public
- */
-Command.prototype.allowUnknownOption = function(arg) {
-    this._allowUnknownOption = arguments.length === 0 || arg;
-    return this;
-};
-
-/**
- * Parse `argv`, settings options and invoking commands when defined.
- *
- * @param {Array} argv
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.parse = function(argv) {
-  // implicit help
-  if (this.executables) this.addImplicitHelpCommand();
-
-  // store raw args
-  this.rawArgs = argv;
-
-  // guess name
-  this._name = this._name || basename(argv[1], '.js');
-
-  // github-style sub-commands with no sub-command
-  if (this.executables && argv.length < 3 && !this.defaultExecutable) {
-    // this user needs help
-    argv.push('--help');
-  }
-
-  // process argv
-  var parsed = this.parseOptions(this.normalize(argv.slice(2)));
-  var args = this.args = parsed.args;
-
-  var result = this.parseArgs(this.args, parsed.unknown);
-
-  // executable sub-commands
-  var name = result.args[0];
-  if (this._execs[name] && typeof this._execs[name] != "function") {
-    return this.executeSubCommand(argv, args, parsed.unknown);
-  } else if (this.defaultExecutable) {
-    // use the default subcommand
-    args.unshift(name = this.defaultExecutable);
-    return this.executeSubCommand(argv, args, parsed.unknown);
-  }
-
-  return result;
-};
-
-/**
- * Execute a sub-command executable.
- *
- * @param {Array} argv
- * @param {Array} args
- * @param {Array} unknown
- * @api private
- */
-
-Command.prototype.executeSubCommand = function(argv, args, unknown) {
-  args = args.concat(unknown);
-
-  if (!args.length) this.help();
-  if ('help' == args[0] && 1 == args.length) this.help();
-
-  // <cmd> --help
-  if ('help' == args[0]) {
-    args[0] = args[1];
-    args[1] = '--help';
-  }
-
-  // executable
-  var f = argv[1];
-  // name of the subcommand, link `pm-install`
-  var bin = basename(f, '.js') + '-' + args[0];
-
-
-  // In case of globally installed, get the base dir where executable
-  //  subcommand file should be located at
-  var baseDir
-    , link = readlink(f);
-
-  // when symbolink is relative path
-  if (link !== f && link.charAt(0) !== '/') {
-    link = path.join(dirname(f), link)
-  }
-  baseDir = dirname(link);
-
-  // prefer local `./<bin>` to bin in the $PATH
-  var localBin = path.join(baseDir, bin);
-
-  // whether bin file is a js script with explicit `.js` extension
-  var isExplicitJS = false;
-  if (exists(localBin + '.js')) {
-    bin = localBin + '.js';
-    isExplicitJS = true;
-  } else if (exists(localBin)) {
-    bin = localBin;
-  }
-
-  args = args.slice(1);
-
-  var proc;
-  if (process.platform !== 'win32') {
-    if (isExplicitJS) {
-      args.unshift(localBin);
-      // add executable arguments to spawn
-      args = (process.execArgv || []).concat(args);
-
-      proc = spawn('node', args, { stdio: 'inherit', customFds: [0, 1, 2] });
-    } else {
-      proc = spawn(bin, args, { stdio: 'inherit', customFds: [0, 1, 2] });
-    }
-  } else {
-    args.unshift(localBin);
-    proc = spawn(process.execPath, args, { stdio: 'inherit'});
-  }
-
-  proc.on('close', process.exit.bind(process));
-  proc.on('error', function(err) {
-    if (err.code == "ENOENT") {
-      console.error('\n  %s(1) does not exist, try --help\n', bin);
-    } else if (err.code == "EACCES") {
-      console.error('\n  %s(1) not executable. try chmod or run with root\n', bin);
-    }
-    process.exit(1);
-  });
-
-  // Store the reference to the child process
-  this.runningCommand = proc;
-};
-
-/**
- * Normalize `args`, splitting joined short flags. For example
- * the arg "-abc" is equivalent to "-a -b -c".
- * This also normalizes equal sign and splits "--abc=def" into "--abc def".
- *
- * @param {Array} args
- * @return {Array}
- * @api private
- */
-
-Command.prototype.normalize = function(args) {
-  var ret = []
-    , arg
-    , lastOpt
-    , index;
-
-  for (var i = 0, len = args.length; i < len; ++i) {
-    arg = args[i];
-    if (i > 0) {
-      lastOpt = this.optionFor(args[i-1]);
-    }
-
-    if (arg === '--') {
-      // Honor option terminator
-      ret = ret.concat(args.slice(i));
-      break;
-    } else if (lastOpt && lastOpt.required) {
-      ret.push(arg);
-    } else if (arg.length > 1 && '-' == arg[0] && '-' != arg[1]) {
-      arg.slice(1).split('').forEach(function(c) {
-        ret.push('-' + c);
-      });
-    } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {
-      ret.push(arg.slice(0, index), arg.slice(index + 1));
-    } else {
-      ret.push(arg);
-    }
-  }
-
-  return ret;
-};
-
-/**
- * Parse command `args`.
- *
- * When listener(s) are available those
- * callbacks are invoked, otherwise the "*"
- * event is emitted and those actions are invoked.
- *
- * @param {Array} args
- * @return {Command} for chaining
- * @api private
- */
-
-Command.prototype.parseArgs = function(args, unknown) {
-  var name;
-
-  if (args.length) {
-    name = args[0];
-    if (this.listeners(name).length) {
-      this.emit(args.shift(), args, unknown);
-    } else {
-      this.emit('*', args);
-    }
-  } else {
-    outputHelpIfNecessary(this, unknown);
-
-    // If there were no args and we have unknown options,
-    // then they are extraneous and we need to error.
-    if (unknown.length > 0) {
-      this.unknownOption(unknown[0]);
-    }
-  }
-
-  return this;
-};
-
-/**
- * Return an option matching `arg` if any.
- *
- * @param {String} arg
- * @return {Option}
- * @api private
- */
-
-Command.prototype.optionFor = function(arg) {
-  for (var i = 0, len = this.options.length; i < len; ++i) {
-    if (this.options[i].is(arg)) {
-      return this.options[i];
-    }
-  }
-};
-
-/**
- * Parse options from `argv` returning `argv`
- * void of these options.
- *
- * @param {Array} argv
- * @return {Array}
- * @api public
- */
-
-Command.prototype.parseOptions = function(argv) {
-  var args = []
-    , len = argv.length
-    , literal
-    , option
-    , arg;
-
-  var unknownOptions = [];
-
-  // parse options
-  for (var i = 0; i < len; ++i) {
-    arg = argv[i];
-
-    // literal args after --
-    if ('--' == arg) {
-      literal = true;
-      continue;
-    }
-
-    if (literal) {
-      args.push(arg);
-      continue;
-    }
-
-    // find matching Option
-    option = this.optionFor(arg);
-
-    // option is defined
-    if (option) {
-      // requires arg
-      if (option.required) {
-        arg = argv[++i];
-        if (null == arg) return this.optionMissingArgument(option);
-        this.emit(option.name(), arg);
-      // optional arg
-      } else if (option.optional) {
-        arg = argv[i+1];
-        if (null == arg || ('-' == arg[0] && '-' != arg)) {
-          arg = null;
-        } else {
-          ++i;
-        }
-        this.emit(option.name(), arg);
-      // bool
-      } else {
-        this.emit(option.name());
-      }
-      continue;
-    }
-
-    // looks like an option
-    if (arg.length > 1 && '-' == arg[0]) {
-      unknownOptions.push(arg);
-
-      // If the next argument looks like it might be
-      // an argument for this option, we pass it on.
-      // If it isn't, then it'll simply be ignored
-      if (argv[i+1] && '-' != argv[i+1][0]) {
-        unknownOptions.push(argv[++i]);
-      }
-      continue;
-    }
-
-    // arg
-    args.push(arg);
-  }
-
-  return { args: args, unknown: unknownOptions };
-};
-
-/**
- * Return an object containing options as key-value pairs
- *
- * @return {Object}
- * @api public
- */
-Command.prototype.opts = function() {
-  var result = {}
-    , len = this.options.length;
-
-  for (var i = 0 ; i < len; i++) {
-    var key = camelcase(this.options[i].name());
-    result[key] = key === 'version' ? this._version : this[key];
-  }
-  return result;
-};
-
-/**
- * Argument `name` is missing.
- *
- * @param {String} name
- * @api private
- */
-
-Command.prototype.missingArgument = function(name) {
-  console.error();
-  console.error("  error: missing required argument `%s'", name);
-  console.error();
-  process.exit(1);
-};
-
-/**
- * `Option` is missing an argument, but received `flag` or nothing.
- *
- * @param {String} option
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.optionMissingArgument = function(option, flag) {
-  console.error();
-  if (flag) {
-    console.error("  error: option `%s' argument missing, got `%s'", option.flags, flag);
-  } else {
-    console.error("  error: option `%s' argument missing", option.flags);
-  }
-  console.error();
-  process.exit(1);
-};
-
-/**
- * Unknown option `flag`.
- *
- * @param {String} flag
- * @api private
- */
-
-Command.prototype.unknownOption = function(flag) {
-  if (this._allowUnknownOption) return;
-  console.error();
-  console.error("  error: unknown option `%s'", flag);
-  console.error();
-  process.exit(1);
-};
-
-/**
- * Variadic argument with `name` is not the last argument as required.
- *
- * @param {String} name
- * @api private
- */
-
-Command.prototype.variadicArgNotLast = function(name) {
-  console.error();
-  console.error("  error: variadic arguments must be last `%s'", name);
-  console.error();
-  process.exit(1);
-};
-
-/**
- * Set the program version to `str`.
- *
- * This method auto-registers the "-V, --version" flag
- * which will print the version number when passed.
- *
- * @param {String} str
- * @param {String} flags
- * @return {Command} for chaining
- * @api public
- */
-
-Command.prototype.version = function(str, flags) {
-  if (0 == arguments.length) return this._version;
-  this._version = str;
-  flags = flags || '-V, --version';
-  this.option(flags, 'output the version number');
-  this.on('version', function() {
-    process.stdout.write(str + '\n');
-    process.exit(0);
-  });
-  return this;
-};
-
-/**
- * Set the description to `str`.
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.description = function(str) {
-  if (0 === arguments.length) return this._description;
-  this._description = str;
-  return this;
-};
-
-/**
- * Set an alias for the command
- *
- * @param {String} alias
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.alias = function(alias) {
-  if (0 == arguments.length) return this._alias;
-  this._alias = alias;
-  return this;
-};
-
-/**
- * Set / get the command usage `str`.
- *
- * @param {String} str
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.usage = function(str) {
-  var args = this._args.map(function(arg) {
-    return humanReadableArgName(arg);
-  });
-
-  var usage = '[options]'
-    + (this.commands.length ? ' [command]' : '')
-    + (this._args.length ? ' ' + args.join(' ') : '');
-
-  if (0 == arguments.length) return this._usage || usage;
-  this._usage = str;
-
-  return this;
-};
-
-/**
- * Get the name of the command
- *
- * @param {String} name
- * @return {String|Command}
- * @api public
- */
-
-Command.prototype.name = function() {
-  return this._name;
-};
-
-/**
- * Return the largest option length.
- *
- * @return {Number}
- * @api private
- */
-
-Command.prototype.largestOptionLength = function() {
-  return this.options.reduce(function(max, option) {
-    return Math.max(max, option.flags.length);
-  }, 0);
-};
-
-/**
- * Return help for options.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.optionHelp = function() {
-  var width = this.largestOptionLength();
-
-  // Prepend the help information
-  return [pad('-h, --help', width) + '  ' + 'output usage information']
-      .concat(this.options.map(function(option) {
-        return pad(option.flags, width) + '  ' + option.description;
-      }))
-      .join('\n');
-};
-
-/**
- * Return command help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.commandHelp = function() {
-  if (!this.commands.length) return '';
-
-  var commands = this.commands.filter(function(cmd) {
-    return !cmd._noHelp;
-  }).map(function(cmd) {
-    var args = cmd._args.map(function(arg) {
-      return humanReadableArgName(arg);
-    }).join(' ');
-
-    return [
-      cmd._name
-        + (cmd._alias ? '|' + cmd._alias : '')
-        + (cmd.options.length ? ' [options]' : '')
-        + ' ' + args
-      , cmd.description()
-    ];
-  });
-
-  var width = commands.reduce(function(max, command) {
-    return Math.max(max, command[0].length);
-  }, 0);
-
-  return [
-    ''
-    , '  Commands:'
-    , ''
-    , commands.map(function(cmd) {
-      var desc = cmd[1] ? '  ' + cmd[1] : '';
-      return pad(cmd[0], width) + desc;
-    }).join('\n').replace(/^/gm, '    ')
-    , ''
-  ].join('\n');
-};
-
-/**
- * Return program help documentation.
- *
- * @return {String}
- * @api private
- */
-
-Command.prototype.helpInformation = function() {
-  var desc = [];
-  if (this._description) {
-    desc = [
-      '  ' + this._description
-      , ''
-    ];
-  }
-
-  var cmdName = this._name;
-  if (this._alias) {
-    cmdName = cmdName + '|' + this._alias;
-  }
-  var usage = [
-    ''
-    ,'  Usage: ' + cmdName + ' ' + this.usage()
-    , ''
-  ];
-
-  var cmds = [];
-  var commandHelp = this.commandHelp();
-  if (commandHelp) cmds = [commandHelp];
-
-  var options = [
-    '  Options:'
-    , ''
-    , '' + this.optionHelp().replace(/^/gm, '    ')
-    , ''
-    , ''
-  ];
-
-  return usage
-    .concat(cmds)
-    .concat(desc)
-    .concat(options)
-    .join('\n');
-};
-
-/**
- * Output help information for this command
- *
- * @api public
- */
-
-Command.prototype.outputHelp = function(cb) {
-  if (!cb) {
-    cb = function(passthru) {
-      return passthru;
-    }
-  }
-  process.stdout.write(cb(this.helpInformation()));
-  this.emit('--help');
-};
-
-/**
- * Output help information and exit.
- *
- * @api public
- */
-
-Command.prototype.help = function(cb) {
-  this.outputHelp(cb);
-  process.exit();
-};
-
-/**
- * Camel-case the given `flag`
- *
- * @param {String} flag
- * @return {String}
- * @api private
- */
-
-function camelcase(flag) {
-  return flag.split('-').reduce(function(str, word) {
-    return str + word[0].toUpperCase() + word.slice(1);
-  });
-}
-
-/**
- * Pad `str` to `width`.
- *
- * @param {String} str
- * @param {Number} width
- * @return {String}
- * @api private
- */
-
-function pad(str, width) {
-  var len = Math.max(0, width - str.length);
-  return str + Array(len + 1).join(' ');
-}
-
-/**
- * Output help information if necessary
- *
- * @param {Command} command to output help for
- * @param {Array} array of options to search for -h or --help
- * @api private
- */
-
-function outputHelpIfNecessary(cmd, options) {
-  options = options || [];
-  for (var i = 0; i < options.length; i++) {
-    if (options[i] == '--help' || options[i] == '-h') {
-      cmd.outputHelp();
-      process.exit(0);
-    }
-  }
-}
-
-/**
- * Takes an argument an returns its human readable equivalent for help usage.
- *
- * @param {Object} arg
- * @return {String}
- * @api private
- */
-
-function humanReadableArgName(arg) {
-  var nameOutput = arg.name + (arg.variadic === true ? '...' : '');
-
-  return arg.required
-    ? '<' + nameOutput + '>'
-    : '[' + nameOutput + ']'
-}
-
-// for versions before node v0.8 when there weren't `fs.existsSync`
-function exists(file) {
-  try {
-    if (fs.statSync(file).isFile()) {
-      return true;
-    }
-  } catch (e) {
-    return false;
-  }
-}
-
diff --git a/js/node_modules/commander/package.json b/js/node_modules/commander/package.json
deleted file mode 100644
index 0e92554dd0a6172e670b4704720ede3e5c36df1f..0000000000000000000000000000000000000000
--- a/js/node_modules/commander/package.json
+++ /dev/null
@@ -1,97 +0,0 @@
-{
-  "_args": [
-    [
-      "commander@^2.9.0",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport"
-    ]
-  ],
-  "_from": "commander@>=2.9.0 <3.0.0",
-  "_id": "commander@2.9.0",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/commander",
-  "_nodeVersion": "0.12.7",
-  "_npmUser": {
-    "email": "zhiyelee@gmail.com",
-    "name": "zhiyelee"
-  },
-  "_npmVersion": "2.11.3",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "commander",
-    "raw": "commander@^2.9.0",
-    "rawSpec": "^2.9.0",
-    "scope": null,
-    "spec": ">=2.9.0 <3.0.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/serialport",
-    "/serialport/node-pre-gyp/request/har-validator"
-  ],
-  "_resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
-  "_shasum": "9c99094176e12240cb22d6c5146098400fe0f7d4",
-  "_shrinkwrap": null,
-  "_spec": "commander@^2.9.0",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport",
-  "author": {
-    "email": "tj@vision-media.ca",
-    "name": "TJ Holowaychuk"
-  },
-  "bugs": {
-    "url": "https://github.com/tj/commander.js/issues"
-  },
-  "dependencies": {
-    "graceful-readlink": ">= 1.0.0"
-  },
-  "description": "the complete solution for node.js command-line programs",
-  "devDependencies": {
-    "should": ">= 0.0.1",
-    "sinon": ">=1.17.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "9c99094176e12240cb22d6c5146098400fe0f7d4",
-    "tarball": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz"
-  },
-  "engines": {
-    "node": ">= 0.6.x"
-  },
-  "files": [
-    "index.js"
-  ],
-  "gitHead": "b2aad7a8471d434593a85306aa73777a526e9f75",
-  "homepage": "https://github.com/tj/commander.js#readme",
-  "keywords": [
-    "command",
-    "option",
-    "parser"
-  ],
-  "license": "MIT",
-  "main": "index",
-  "maintainers": [
-    {
-      "name": "tjholowaychuk",
-      "email": "tj@vision-media.ca"
-    },
-    {
-      "name": "somekittens",
-      "email": "rkoutnik@gmail.com"
-    },
-    {
-      "name": "zhiyelee",
-      "email": "zhiyelee@gmail.com"
-    }
-  ],
-  "name": "commander",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/tj/commander.js.git"
-  },
-  "scripts": {
-    "test": "make test"
-  },
-  "version": "2.9.0"
-}
diff --git a/js/node_modules/debug/.jshintrc b/js/node_modules/debug/.jshintrc
deleted file mode 100644
index 299877f26aeb6c6841df333c5920795f6312a902..0000000000000000000000000000000000000000
--- a/js/node_modules/debug/.jshintrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "laxbreak": true
-}
diff --git a/js/node_modules/debug/.npmignore b/js/node_modules/debug/.npmignore
deleted file mode 100644
index 7e6163db02e5e7bf4a57ecde7242819f755ff173..0000000000000000000000000000000000000000
--- a/js/node_modules/debug/.npmignore
+++ /dev/null
@@ -1,6 +0,0 @@
-support
-test
-examples
-example
-*.sock
-dist
diff --git a/js/node_modules/debug/History.md b/js/node_modules/debug/History.md
deleted file mode 100644
index 854c9711c6fd68a3b531b5970d19d36faad71487..0000000000000000000000000000000000000000
--- a/js/node_modules/debug/History.md
+++ /dev/null
@@ -1,195 +0,0 @@
-
-2.2.0 / 2015-05-09
-==================
-
-  * package: update "ms" to v0.7.1 (#202, @dougwilson)
-  * README: add logging to file example (#193, @DanielOchoa)
-  * README: fixed a typo (#191, @amir-s)
-  * browser: expose `storage` (#190, @stephenmathieson)
-  * Makefile: add a `distclean` target (#189, @stephenmathieson)
-
-2.1.3 / 2015-03-13
-==================
-
-  * Updated stdout/stderr example (#186)
-  * Updated example/stdout.js to match debug current behaviour
-  * Renamed example/stderr.js to stdout.js
-  * Update Readme.md (#184)
-  * replace high intensity foreground color for bold (#182, #183)
-
-2.1.2 / 2015-03-01
-==================
-
-  * dist: recompile
-  * update "ms" to v0.7.0
-  * package: update "browserify" to v9.0.3
-  * component: fix "ms.js" repo location
-  * changed bower package name
-  * updated documentation about using debug in a browser
-  * fix: security error on safari (#167, #168, @yields)
-
-2.1.1 / 2014-12-29
-==================
-
-  * browser: use `typeof` to check for `console` existence
-  * browser: check for `console.log` truthiness (fix IE 8/9)
-  * browser: add support for Chrome apps
-  * Readme: added Windows usage remarks
-  * Add `bower.json` to properly support bower install
-
-2.1.0 / 2014-10-15
-==================
-
-  * node: implement `DEBUG_FD` env variable support
-  * package: update "browserify" to v6.1.0
-  * package: add "license" field to package.json (#135, @panuhorsmalahti)
-
-2.0.0 / 2014-09-01
-==================
-
-  * package: update "browserify" to v5.11.0
-  * node: use stderr rather than stdout for logging (#29, @stephenmathieson)
-
-1.0.4 / 2014-07-15
-==================
-
-  * dist: recompile
-  * example: remove `console.info()` log usage
-  * example: add "Content-Type" UTF-8 header to browser example
-  * browser: place %c marker after the space character
-  * browser: reset the "content" color via `color: inherit`
-  * browser: add colors support for Firefox >= v31
-  * debug: prefer an instance `log()` function over the global one (#119)
-  * Readme: update documentation about styled console logs for FF v31 (#116, @wryk)
-
-1.0.3 / 2014-07-09
-==================
-
-  * Add support for multiple wildcards in namespaces (#122, @seegno)
-  * browser: fix lint
-
-1.0.2 / 2014-06-10
-==================
-
-  * browser: update color palette (#113, @gscottolson)
-  * common: make console logging function configurable (#108, @timoxley)
-  * node: fix %o colors on old node <= 0.8.x
-  * Makefile: find node path using shell/which (#109, @timoxley)
-
-1.0.1 / 2014-06-06
-==================
-
-  * browser: use `removeItem()` to clear localStorage
-  * browser, node: don't set DEBUG if namespaces is undefined (#107, @leedm777)
-  * package: add "contributors" section
-  * node: fix comment typo
-  * README: list authors
-
-1.0.0 / 2014-06-04
-==================
-
-  * make ms diff be global, not be scope
-  * debug: ignore empty strings in enable()
-  * node: make DEBUG_COLORS able to disable coloring
-  * *: export the `colors` array
-  * npmignore: don't publish the `dist` dir
-  * Makefile: refactor to use browserify
-  * package: add "browserify" as a dev dependency
-  * Readme: add Web Inspector Colors section
-  * node: reset terminal color for the debug content
-  * node: map "%o" to `util.inspect()`
-  * browser: map "%j" to `JSON.stringify()`
-  * debug: add custom "formatters"
-  * debug: use "ms" module for humanizing the diff
-  * Readme: add "bash" syntax highlighting
-  * browser: add Firebug color support
-  * browser: add colors for WebKit browsers
-  * node: apply log to `console`
-  * rewrite: abstract common logic for Node & browsers
-  * add .jshintrc file
-
-0.8.1 / 2014-04-14
-==================
-
-  * package: re-add the "component" section
-
-0.8.0 / 2014-03-30
-==================
-
-  * add `enable()` method for nodejs. Closes #27
-  * change from stderr to stdout
-  * remove unnecessary index.js file
-
-0.7.4 / 2013-11-13
-==================
-
-  * remove "browserify" key from package.json (fixes something in browserify)
-
-0.7.3 / 2013-10-30
-==================
-
-  * fix: catch localStorage security error when cookies are blocked (Chrome)
-  * add debug(err) support. Closes #46
-  * add .browser prop to package.json. Closes #42
-
-0.7.2 / 2013-02-06
-==================
-
-  * fix package.json
-  * fix: Mobile Safari (private mode) is broken with debug
-  * fix: Use unicode to send escape character to shell instead of octal to work with strict mode javascript
-
-0.7.1 / 2013-02-05
-==================
-
-  * add repository URL to package.json
-  * add DEBUG_COLORED to force colored output
-  * add browserify support
-  * fix component. Closes #24
-
-0.7.0 / 2012-05-04
-==================
-
-  * Added .component to package.json
-  * Added debug.component.js build
-
-0.6.0 / 2012-03-16
-==================
-
-  * Added support for "-" prefix in DEBUG [Vinay Pulim]
-  * Added `.enabled` flag to the node version [TooTallNate]
-
-0.5.0 / 2012-02-02
-==================
-
-  * Added: humanize diffs. Closes #8
-  * Added `debug.disable()` to the CS variant
-  * Removed padding. Closes #10
-  * Fixed: persist client-side variant again. Closes #9
-
-0.4.0 / 2012-02-01
-==================
-
-  * Added browser variant support for older browsers [TooTallNate]
-  * Added `debug.enable('project:*')` to browser variant [TooTallNate]
-  * Added padding to diff (moved it to the right)
-
-0.3.0 / 2012-01-26
-==================
-
-  * Added millisecond diff when isatty, otherwise UTC string
-
-0.2.0 / 2012-01-22
-==================
-
-  * Added wildcard support
-
-0.1.0 / 2011-12-02
-==================
-
-  * Added: remove colors unless stderr isatty [TooTallNate]
-
-0.0.1 / 2010-01-03
-==================
-
-  * Initial release
diff --git a/js/node_modules/debug/Makefile b/js/node_modules/debug/Makefile
deleted file mode 100644
index 5cf4a5962b8ba3719bd0f2ff7703cba5de225d1a..0000000000000000000000000000000000000000
--- a/js/node_modules/debug/Makefile
+++ /dev/null
@@ -1,36 +0,0 @@
-
-# get Makefile directory name: http://stackoverflow.com/a/5982798/376773
-THIS_MAKEFILE_PATH:=$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))
-THIS_DIR:=$(shell cd $(dir $(THIS_MAKEFILE_PATH));pwd)
-
-# BIN directory
-BIN := $(THIS_DIR)/node_modules/.bin
-
-# applications
-NODE ?= $(shell which node)
-NPM ?= $(NODE) $(shell which npm)
-BROWSERIFY ?= $(NODE) $(BIN)/browserify
-
-all: dist/debug.js
-
-install: node_modules
-
-clean:
-	@rm -rf dist
-
-dist:
-	@mkdir -p $@
-
-dist/debug.js: node_modules browser.js debug.js dist
-	@$(BROWSERIFY) \
-		--standalone debug \
-		. > $@
-
-distclean: clean
-	@rm -rf node_modules
-
-node_modules: package.json
-	@NODE_ENV= $(NPM) install
-	@touch node_modules
-
-.PHONY: all install clean distclean
diff --git a/js/node_modules/debug/Readme.md b/js/node_modules/debug/Readme.md
deleted file mode 100644
index b4f45e3cc6a33a97be55d6abfef6da81daa2f8e1..0000000000000000000000000000000000000000
--- a/js/node_modules/debug/Readme.md
+++ /dev/null
@@ -1,188 +0,0 @@
-# debug
-
-  tiny node.js debugging utility modelled after node core's debugging technique.
-
-## Installation
-
-```bash
-$ npm install debug
-```
-
-## Usage
-
- With `debug` you simply invoke the exported function to generate your debug function, passing it a name which will determine if a noop function is returned, or a decorated `console.error`, so all of the `console` format string goodies you're used to work fine. A unique color is selected per-function for visibility.
-
-Example _app.js_:
-
-```js
-var debug = require('debug')('http')
-  , http = require('http')
-  , name = 'My App';
-
-// fake app
-
-debug('booting %s', name);
-
-http.createServer(function(req, res){
-  debug(req.method + ' ' + req.url);
-  res.end('hello\n');
-}).listen(3000, function(){
-  debug('listening');
-});
-
-// fake worker of some kind
-
-require('./worker');
-```
-
-Example _worker.js_:
-
-```js
-var debug = require('debug')('worker');
-
-setInterval(function(){
-  debug('doing some work');
-}, 1000);
-```
-
- The __DEBUG__ environment variable is then used to enable these based on space or comma-delimited names. Here are some examples:
-
-  ![debug http and worker](http://f.cl.ly/items/18471z1H402O24072r1J/Screenshot.png)
-
-  ![debug worker](http://f.cl.ly/items/1X413v1a3M0d3C2c1E0i/Screenshot.png)
-
-#### Windows note
-
- On Windows the environment variable is set using the `set` command.
-
- ```cmd
- set DEBUG=*,-not_this
- ```
-
-Then, run the program to be debugged as usual.
-
-## Millisecond diff
-
-  When actively developing an application it can be useful to see when the time spent between one `debug()` call and the next. Suppose for example you invoke `debug()` before requesting a resource, and after as well, the "+NNNms" will show you how much time was spent between calls.
-
-  ![](http://f.cl.ly/items/2i3h1d3t121M2Z1A3Q0N/Screenshot.png)
-
-  When stdout is not a TTY, `Date#toUTCString()` is used, making it more useful for logging the debug information as shown below:
-
-  ![](http://f.cl.ly/items/112H3i0e0o0P0a2Q2r11/Screenshot.png)
-
-## Conventions
-
- If you're using this in one or more of your libraries, you _should_ use the name of your library so that developers may toggle debugging as desired without guessing names. If you have more than one debuggers you _should_ prefix them with your library name and use ":" to separate features. For example "bodyParser" from Connect would then be "connect:bodyParser".
-
-## Wildcards
-
-  The `*` character may be used as a wildcard. Suppose for example your library has debuggers named "connect:bodyParser", "connect:compress", "connect:session", instead of listing all three with `DEBUG=connect:bodyParser,connect:compress,connect:session`, you may simply do `DEBUG=connect:*`, or to run everything using this module simply use `DEBUG=*`.
-
-  You can also exclude specific debuggers by prefixing them with a "-" character.  For example, `DEBUG=*,-connect:*` would include all debuggers except those starting with "connect:".
-
-## Browser support
-
-  Debug works in the browser as well, currently persisted by `localStorage`. Consider the situation shown below where you have `worker:a` and `worker:b`, and wish to debug both. Somewhere in the code on your page, include:
-
-```js
-window.myDebug = require("debug");
-```
-
-  ("debug" is a global object in the browser so we give this object a different name.) When your page is open in the browser, type the following in the console:
-
-```js
-myDebug.enable("worker:*")
-```
-
-  Refresh the page. Debug output will continue to be sent to the console until it is disabled by typing `myDebug.disable()` in the console.
-
-```js
-a = debug('worker:a');
-b = debug('worker:b');
-
-setInterval(function(){
-  a('doing some work');
-}, 1000);
-
-setInterval(function(){
-  b('doing some work');
-}, 1200);
-```
-
-#### Web Inspector Colors
-
-  Colors are also enabled on "Web Inspectors" that understand the `%c` formatting
-  option. These are WebKit web inspectors, Firefox ([since version
-  31](https://hacks.mozilla.org/2014/05/editable-box-model-multiple-selection-sublime-text-keys-much-more-firefox-developer-tools-episode-31/))
-  and the Firebug plugin for Firefox (any version).
-
-  Colored output looks something like:
-
-  ![](https://cloud.githubusercontent.com/assets/71256/3139768/b98c5fd8-e8ef-11e3-862a-f7253b6f47c6.png)
-
-### stderr vs stdout
-
-You can set an alternative logging method per-namespace by overriding the `log` method on a per-namespace or globally:
-
-Example _stdout.js_:
-
-```js
-var debug = require('debug');
-var error = debug('app:error');
-
-// by default stderr is used
-error('goes to stderr!');
-
-var log = debug('app:log');
-// set this namespace to log via console.log
-log.log = console.log.bind(console); // don't forget to bind to console!
-log('goes to stdout');
-error('still goes to stderr!');
-
-// set all output to go via console.info
-// overrides all per-namespace log settings
-debug.log = console.info.bind(console);
-error('now goes to stdout via console.info');
-log('still goes to stdout, but via console.info now');
-```
-
-### Save debug output to a file
-
-You can save all debug statements to a file by piping them.
-
-Example:
-
-```bash
-$ DEBUG_FD=3 node your-app.js 3> whatever.log
-```
-
-## Authors
-
- - TJ Holowaychuk
- - Nathan Rajlich
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2014 TJ Holowaychuk &lt;tj@vision-media.ca&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/debug/bower.json b/js/node_modules/debug/bower.json
deleted file mode 100644
index 6af573ff5c260dc640c976bcba675e5dab0f1afb..0000000000000000000000000000000000000000
--- a/js/node_modules/debug/bower.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
-  "name": "visionmedia-debug",
-  "main": "dist/debug.js",
-  "version": "2.2.0",
-  "homepage": "https://github.com/visionmedia/debug",
-  "authors": [
-    "TJ Holowaychuk <tj@vision-media.ca>"
-  ],
-  "description": "visionmedia-debug",
-  "moduleType": [
-    "amd",
-    "es6",
-    "globals",
-    "node"
-  ],
-  "keywords": [
-    "visionmedia",
-    "debug"
-  ],
-  "license": "MIT",
-  "ignore": [
-    "**/.*",
-    "node_modules",
-    "bower_components",
-    "test",
-    "tests"
-  ]
-}
diff --git a/js/node_modules/debug/browser.js b/js/node_modules/debug/browser.js
deleted file mode 100644
index 7c76452219939f82fe7247533dfce2dd795737c2..0000000000000000000000000000000000000000
--- a/js/node_modules/debug/browser.js
+++ /dev/null
@@ -1,168 +0,0 @@
-
-/**
- * This is the web browser implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = require('./debug');
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-exports.storage = 'undefined' != typeof chrome
-               && 'undefined' != typeof chrome.storage
-                  ? chrome.storage.local
-                  : localstorage();
-
-/**
- * Colors.
- */
-
-exports.colors = [
-  'lightseagreen',
-  'forestgreen',
-  'goldenrod',
-  'dodgerblue',
-  'darkorchid',
-  'crimson'
-];
-
-/**
- * Currently only WebKit-based Web Inspectors, Firefox >= v31,
- * and the Firebug extension (any Firefox version) are known
- * to support "%c" CSS customizations.
- *
- * TODO: add a `localStorage` variable to explicitly enable/disable colors
- */
-
-function useColors() {
-  // is webkit? http://stackoverflow.com/a/16459606/376773
-  return ('WebkitAppearance' in document.documentElement.style) ||
-    // is firebug? http://stackoverflow.com/a/398120/376773
-    (window.console && (console.firebug || (console.exception && console.table))) ||
-    // is firefox >= v31?
-    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
-    (navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31);
-}
-
-/**
- * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
- */
-
-exports.formatters.j = function(v) {
-  return JSON.stringify(v);
-};
-
-
-/**
- * Colorize log arguments if enabled.
- *
- * @api public
- */
-
-function formatArgs() {
-  var args = arguments;
-  var useColors = this.useColors;
-
-  args[0] = (useColors ? '%c' : '')
-    + this.namespace
-    + (useColors ? ' %c' : ' ')
-    + args[0]
-    + (useColors ? '%c ' : ' ')
-    + '+' + exports.humanize(this.diff);
-
-  if (!useColors) return args;
-
-  var c = 'color: ' + this.color;
-  args = [args[0], c, 'color: inherit'].concat(Array.prototype.slice.call(args, 1));
-
-  // the final "%c" is somewhat tricky, because there could be other
-  // arguments passed either before or after the %c, so we need to
-  // figure out the correct index to insert the CSS into
-  var index = 0;
-  var lastC = 0;
-  args[0].replace(/%[a-z%]/g, function(match) {
-    if ('%%' === match) return;
-    index++;
-    if ('%c' === match) {
-      // we only are interested in the *last* %c
-      // (the user may have provided their own)
-      lastC = index;
-    }
-  });
-
-  args.splice(lastC, 0, c);
-  return args;
-}
-
-/**
- * Invokes `console.log()` when available.
- * No-op when `console.log` is not a "function".
- *
- * @api public
- */
-
-function log() {
-  // this hackery is required for IE8/9, where
-  // the `console.log` function doesn't have 'apply'
-  return 'object' === typeof console
-    && console.log
-    && Function.prototype.apply.call(console.log, console, arguments);
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
-  try {
-    if (null == namespaces) {
-      exports.storage.removeItem('debug');
-    } else {
-      exports.storage.debug = namespaces;
-    }
-  } catch(e) {}
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-  var r;
-  try {
-    r = exports.storage.debug;
-  } catch(e) {}
-  return r;
-}
-
-/**
- * Enable namespaces listed in `localStorage.debug` initially.
- */
-
-exports.enable(load());
-
-/**
- * Localstorage attempts to return the localstorage.
- *
- * This is necessary because safari throws
- * when a user disables cookies/localstorage
- * and you attempt to access it.
- *
- * @return {LocalStorage}
- * @api private
- */
-
-function localstorage(){
-  try {
-    return window.localStorage;
-  } catch (e) {}
-}
diff --git a/js/node_modules/debug/component.json b/js/node_modules/debug/component.json
deleted file mode 100644
index ca1063724a4498247faa551f694192f5a53bf7f5..0000000000000000000000000000000000000000
--- a/js/node_modules/debug/component.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "debug",
-  "repo": "visionmedia/debug",
-  "description": "small debugging utility",
-  "version": "2.2.0",
-  "keywords": [
-    "debug",
-    "log",
-    "debugger"
-  ],
-  "main": "browser.js",
-  "scripts": [
-    "browser.js",
-    "debug.js"
-  ],
-  "dependencies": {
-    "rauchg/ms.js": "0.7.1"
-  }
-}
diff --git a/js/node_modules/debug/debug.js b/js/node_modules/debug/debug.js
deleted file mode 100644
index 7571a86058aec060b5e57a0b45b5406efc79bb2a..0000000000000000000000000000000000000000
--- a/js/node_modules/debug/debug.js
+++ /dev/null
@@ -1,197 +0,0 @@
-
-/**
- * This is the common logic for both the Node.js and web browser
- * implementations of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = debug;
-exports.coerce = coerce;
-exports.disable = disable;
-exports.enable = enable;
-exports.enabled = enabled;
-exports.humanize = require('ms');
-
-/**
- * The currently active debug mode names, and names to skip.
- */
-
-exports.names = [];
-exports.skips = [];
-
-/**
- * Map of special "%n" handling functions, for the debug "format" argument.
- *
- * Valid key names are a single, lowercased letter, i.e. "n".
- */
-
-exports.formatters = {};
-
-/**
- * Previously assigned color.
- */
-
-var prevColor = 0;
-
-/**
- * Previous log timestamp.
- */
-
-var prevTime;
-
-/**
- * Select a color.
- *
- * @return {Number}
- * @api private
- */
-
-function selectColor() {
-  return exports.colors[prevColor++ % exports.colors.length];
-}
-
-/**
- * Create a debugger with the given `namespace`.
- *
- * @param {String} namespace
- * @return {Function}
- * @api public
- */
-
-function debug(namespace) {
-
-  // define the `disabled` version
-  function disabled() {
-  }
-  disabled.enabled = false;
-
-  // define the `enabled` version
-  function enabled() {
-
-    var self = enabled;
-
-    // set `diff` timestamp
-    var curr = +new Date();
-    var ms = curr - (prevTime || curr);
-    self.diff = ms;
-    self.prev = prevTime;
-    self.curr = curr;
-    prevTime = curr;
-
-    // add the `color` if not set
-    if (null == self.useColors) self.useColors = exports.useColors();
-    if (null == self.color && self.useColors) self.color = selectColor();
-
-    var args = Array.prototype.slice.call(arguments);
-
-    args[0] = exports.coerce(args[0]);
-
-    if ('string' !== typeof args[0]) {
-      // anything else let's inspect with %o
-      args = ['%o'].concat(args);
-    }
-
-    // apply any `formatters` transformations
-    var index = 0;
-    args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {
-      // if we encounter an escaped % then don't increase the array index
-      if (match === '%%') return match;
-      index++;
-      var formatter = exports.formatters[format];
-      if ('function' === typeof formatter) {
-        var val = args[index];
-        match = formatter.call(self, val);
-
-        // now we need to remove `args[index]` since it's inlined in the `format`
-        args.splice(index, 1);
-        index--;
-      }
-      return match;
-    });
-
-    if ('function' === typeof exports.formatArgs) {
-      args = exports.formatArgs.apply(self, args);
-    }
-    var logFn = enabled.log || exports.log || console.log.bind(console);
-    logFn.apply(self, args);
-  }
-  enabled.enabled = true;
-
-  var fn = exports.enabled(namespace) ? enabled : disabled;
-
-  fn.namespace = namespace;
-
-  return fn;
-}
-
-/**
- * Enables a debug mode by namespaces. This can include modes
- * separated by a colon and wildcards.
- *
- * @param {String} namespaces
- * @api public
- */
-
-function enable(namespaces) {
-  exports.save(namespaces);
-
-  var split = (namespaces || '').split(/[\s,]+/);
-  var len = split.length;
-
-  for (var i = 0; i < len; i++) {
-    if (!split[i]) continue; // ignore empty strings
-    namespaces = split[i].replace(/\*/g, '.*?');
-    if (namespaces[0] === '-') {
-      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));
-    } else {
-      exports.names.push(new RegExp('^' + namespaces + '$'));
-    }
-  }
-}
-
-/**
- * Disable debug output.
- *
- * @api public
- */
-
-function disable() {
-  exports.enable('');
-}
-
-/**
- * Returns true if the given mode name is enabled, false otherwise.
- *
- * @param {String} name
- * @return {Boolean}
- * @api public
- */
-
-function enabled(name) {
-  var i, len;
-  for (i = 0, len = exports.skips.length; i < len; i++) {
-    if (exports.skips[i].test(name)) {
-      return false;
-    }
-  }
-  for (i = 0, len = exports.names.length; i < len; i++) {
-    if (exports.names[i].test(name)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-/**
- * Coerce `val`.
- *
- * @param {Mixed} val
- * @return {Mixed}
- * @api private
- */
-
-function coerce(val) {
-  if (val instanceof Error) return val.stack || val.message;
-  return val;
-}
diff --git a/js/node_modules/debug/node.js b/js/node_modules/debug/node.js
deleted file mode 100644
index 1d392a81d6c785f0fd3d5fefd111b2a828a25ae5..0000000000000000000000000000000000000000
--- a/js/node_modules/debug/node.js
+++ /dev/null
@@ -1,209 +0,0 @@
-
-/**
- * Module dependencies.
- */
-
-var tty = require('tty');
-var util = require('util');
-
-/**
- * This is the Node.js implementation of `debug()`.
- *
- * Expose `debug()` as the module.
- */
-
-exports = module.exports = require('./debug');
-exports.log = log;
-exports.formatArgs = formatArgs;
-exports.save = save;
-exports.load = load;
-exports.useColors = useColors;
-
-/**
- * Colors.
- */
-
-exports.colors = [6, 2, 3, 4, 5, 1];
-
-/**
- * The file descriptor to write the `debug()` calls to.
- * Set the `DEBUG_FD` env variable to override with another value. i.e.:
- *
- *   $ DEBUG_FD=3 node script.js 3>debug.log
- */
-
-var fd = parseInt(process.env.DEBUG_FD, 10) || 2;
-var stream = 1 === fd ? process.stdout :
-             2 === fd ? process.stderr :
-             createWritableStdioStream(fd);
-
-/**
- * Is stdout a TTY? Colored output is enabled when `true`.
- */
-
-function useColors() {
-  var debugColors = (process.env.DEBUG_COLORS || '').trim().toLowerCase();
-  if (0 === debugColors.length) {
-    return tty.isatty(fd);
-  } else {
-    return '0' !== debugColors
-        && 'no' !== debugColors
-        && 'false' !== debugColors
-        && 'disabled' !== debugColors;
-  }
-}
-
-/**
- * Map %o to `util.inspect()`, since Node doesn't do that out of the box.
- */
-
-var inspect = (4 === util.inspect.length ?
-  // node <= 0.8.x
-  function (v, colors) {
-    return util.inspect(v, void 0, void 0, colors);
-  } :
-  // node > 0.8.x
-  function (v, colors) {
-    return util.inspect(v, { colors: colors });
-  }
-);
-
-exports.formatters.o = function(v) {
-  return inspect(v, this.useColors)
-    .replace(/\s*\n\s*/g, ' ');
-};
-
-/**
- * Adds ANSI color escape codes if enabled.
- *
- * @api public
- */
-
-function formatArgs() {
-  var args = arguments;
-  var useColors = this.useColors;
-  var name = this.namespace;
-
-  if (useColors) {
-    var c = this.color;
-
-    args[0] = '  \u001b[3' + c + ';1m' + name + ' '
-      + '\u001b[0m'
-      + args[0] + '\u001b[3' + c + 'm'
-      + ' +' + exports.humanize(this.diff) + '\u001b[0m';
-  } else {
-    args[0] = new Date().toUTCString()
-      + ' ' + name + ' ' + args[0];
-  }
-  return args;
-}
-
-/**
- * Invokes `console.error()` with the specified arguments.
- */
-
-function log() {
-  return stream.write(util.format.apply(this, arguments) + '\n');
-}
-
-/**
- * Save `namespaces`.
- *
- * @param {String} namespaces
- * @api private
- */
-
-function save(namespaces) {
-  if (null == namespaces) {
-    // If you set a process.env field to null or undefined, it gets cast to the
-    // string 'null' or 'undefined'. Just delete instead.
-    delete process.env.DEBUG;
-  } else {
-    process.env.DEBUG = namespaces;
-  }
-}
-
-/**
- * Load `namespaces`.
- *
- * @return {String} returns the previously persisted debug modes
- * @api private
- */
-
-function load() {
-  return process.env.DEBUG;
-}
-
-/**
- * Copied from `node/src/node.js`.
- *
- * XXX: It's lame that node doesn't expose this API out-of-the-box. It also
- * relies on the undocumented `tty_wrap.guessHandleType()` which is also lame.
- */
-
-function createWritableStdioStream (fd) {
-  var stream;
-  var tty_wrap = process.binding('tty_wrap');
-
-  // Note stream._type is used for test-module-load-list.js
-
-  switch (tty_wrap.guessHandleType(fd)) {
-    case 'TTY':
-      stream = new tty.WriteStream(fd);
-      stream._type = 'tty';
-
-      // Hack to have stream not keep the event loop alive.
-      // See https://github.com/joyent/node/issues/1726
-      if (stream._handle && stream._handle.unref) {
-        stream._handle.unref();
-      }
-      break;
-
-    case 'FILE':
-      var fs = require('fs');
-      stream = new fs.SyncWriteStream(fd, { autoClose: false });
-      stream._type = 'fs';
-      break;
-
-    case 'PIPE':
-    case 'TCP':
-      var net = require('net');
-      stream = new net.Socket({
-        fd: fd,
-        readable: false,
-        writable: true
-      });
-
-      // FIXME Should probably have an option in net.Socket to create a
-      // stream from an existing fd which is writable only. But for now
-      // we'll just add this hack and set the `readable` member to false.
-      // Test: ./node test/fixtures/echo.js < /etc/passwd
-      stream.readable = false;
-      stream.read = null;
-      stream._type = 'pipe';
-
-      // FIXME Hack to have stream not keep the event loop alive.
-      // See https://github.com/joyent/node/issues/1726
-      if (stream._handle && stream._handle.unref) {
-        stream._handle.unref();
-      }
-      break;
-
-    default:
-      // Probably an error on in uv_guess_handle()
-      throw new Error('Implement me. Unknown stream file type!');
-  }
-
-  // For supporting legacy API we put the FD here.
-  stream.fd = fd;
-
-  stream._isStdio = true;
-
-  return stream;
-}
-
-/**
- * Enable namespaces listed in `process.env.DEBUG` initially.
- */
-
-exports.enable(load());
diff --git a/js/node_modules/debug/package.json b/js/node_modules/debug/package.json
deleted file mode 100644
index f1ce8353e30ca9b9725203ec13985f48dcf4538c..0000000000000000000000000000000000000000
--- a/js/node_modules/debug/package.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
-  "_args": [
-    [
-      "debug@^2.1.1",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport"
-    ]
-  ],
-  "_from": "debug@>=2.1.1 <3.0.0",
-  "_id": "debug@2.2.0",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/debug",
-  "_nodeVersion": "0.12.2",
-  "_npmUser": {
-    "email": "nathan@tootallnate.net",
-    "name": "tootallnate"
-  },
-  "_npmVersion": "2.7.4",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "debug",
-    "raw": "debug@^2.1.1",
-    "rawSpec": "^2.1.1",
-    "scope": null,
-    "spec": ">=2.1.1 <3.0.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/serialport",
-    "/serialport/node-pre-gyp/tar-pack"
-  ],
-  "_resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
-  "_shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da",
-  "_shrinkwrap": null,
-  "_spec": "debug@^2.1.1",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport",
-  "author": {
-    "email": "tj@vision-media.ca",
-    "name": "TJ Holowaychuk"
-  },
-  "browser": "./browser.js",
-  "bugs": {
-    "url": "https://github.com/visionmedia/debug/issues"
-  },
-  "component": {
-    "scripts": {
-      "debug/debug.js": "debug.js",
-      "debug/index.js": "browser.js"
-    }
-  },
-  "contributors": [
-    {
-      "name": "Nathan Rajlich",
-      "email": "nathan@tootallnate.net",
-      "url": "http://n8.io"
-    }
-  ],
-  "dependencies": {
-    "ms": "0.7.1"
-  },
-  "description": "small debugging utility",
-  "devDependencies": {
-    "browserify": "9.0.3",
-    "mocha": "*"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "f87057e995b1a1f6ae6a4960664137bc56f039da",
-    "tarball": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz"
-  },
-  "gitHead": "b38458422b5aa8aa6d286b10dfe427e8a67e2b35",
-  "homepage": "https://github.com/visionmedia/debug",
-  "keywords": [
-    "debug",
-    "debugger",
-    "log"
-  ],
-  "license": "MIT",
-  "main": "./node.js",
-  "maintainers": [
-    {
-      "name": "tjholowaychuk",
-      "email": "tj@vision-media.ca"
-    },
-    {
-      "name": "tootallnate",
-      "email": "nathan@tootallnate.net"
-    }
-  ],
-  "name": "debug",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/visionmedia/debug.git"
-  },
-  "scripts": {},
-  "version": "2.2.0"
-}
diff --git a/js/node_modules/define-properties/.editorconfig b/js/node_modules/define-properties/.editorconfig
deleted file mode 100644
index eaa214161f5cdb409c32465fd822624c633a6bd8..0000000000000000000000000000000000000000
--- a/js/node_modules/define-properties/.editorconfig
+++ /dev/null
@@ -1,13 +0,0 @@
-root = true
-
-[*]
-indent_style = tab;
-insert_final_newline = true;
-quote_type = auto;
-space_after_anonymous_functions = true;
-space_after_control_statements = true;
-spaces_around_operators = true;
-trim_trailing_whitespace = true;
-spaces_in_brackets = false;
-end_of_line = lf;
-
diff --git a/js/node_modules/define-properties/.eslintrc b/js/node_modules/define-properties/.eslintrc
deleted file mode 100644
index 87e47e11ffdc9a4c48b9da63d06816915904cd22..0000000000000000000000000000000000000000
--- a/js/node_modules/define-properties/.eslintrc
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"id-length": [2, { "min": 1, "max": 35 }],
-		"max-params": [2, 4],
-		"max-statements": [2, 13]
-	}
-}
diff --git a/js/node_modules/define-properties/.jscs.json b/js/node_modules/define-properties/.jscs.json
deleted file mode 100644
index 034652c9cd79451a0bc8d512be1ccf49abcf8c40..0000000000000000000000000000000000000000
--- a/js/node_modules/define-properties/.jscs.json
+++ /dev/null
@@ -1,131 +0,0 @@
-{
-	"es3": true,
-
-	"additionalRules": [],
-
-	"requireSemicolons": true,
-
-	"disallowMultipleSpaces": true,
-
-	"disallowIdentifierNames": [],
-
-	"requireCurlyBraces": ["if", "else", "for", "while", "do", "try", "catch"],
-
-	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
-
-	"disallowSpaceAfterKeywords": [],
-
-	"disallowSpaceBeforeComma": true,
-	"disallowSpaceBeforeSemicolon": true,
-
-	"disallowNodeTypes": [
-		"DebuggerStatement",
-		"LabeledStatement",
-		"SwitchCase",
-		"SwitchStatement",
-		"WithStatement"
-	],
-
-	"requireObjectKeysOnNewLine": false,
-
-	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
-	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
-	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
-
-	"requireSpaceBetweenArguments": true,
-
-	"disallowSpacesInsideParentheses": true,
-
-	"disallowSpacesInsideArrayBrackets": true,
-
-	"disallowQuotedKeysInObjects": "allButReserved",
-
-	"disallowSpaceAfterObjectKeys": true,
-
-	"requireCommaBeforeLineBreak": true,
-
-	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
-	"requireSpaceAfterPrefixUnaryOperators": [],
-
-	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
-	"requireSpaceBeforePostfixUnaryOperators": [],
-
-	"disallowSpaceBeforeBinaryOperators": [],
-	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-
-	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-	"disallowSpaceAfterBinaryOperators": [],
-
-	"disallowImplicitTypeConversion": ["binary", "string"],
-
-	"disallowKeywords": ["with", "eval"],
-
-	"requireKeywordsOnNewLine": [],
-	"disallowKeywordsOnNewLine": ["else"],
-
-	"requireLineFeedAtFileEnd": true,
-
-	"disallowTrailingWhitespace": true,
-
-	"disallowTrailingComma": true,
-
-	"excludeFiles": ["node_modules/**", "vendor/**"],
-
-	"disallowMultipleLineStrings": true,
-
-	"requireDotNotation": true,
-
-	"requireParenthesesAroundIIFE": true,
-
-	"validateLineBreaks": "LF",
-
-	"validateQuoteMarks": {
-		"escape": true,
-		"mark": "'"
-	},
-
-	"disallowOperatorBeforeLineBreak": [],
-
-	"requireSpaceBeforeKeywords": [
-		"do",
-		"for",
-		"if",
-		"else",
-		"switch",
-		"case",
-		"try",
-		"catch",
-		"finally",
-		"while",
-		"with",
-		"return"
-	],
-
-	"validateAlignedFunctionParameters": {
-		"lineBreakAfterOpeningBraces": true,
-		"lineBreakBeforeClosingBraces": true
-	},
-
-	"requirePaddingNewLinesBeforeExport": true,
-
-	"validateNewlineAfterArrayElements": {
-		"maximum": 3
-	},
-
-	"requirePaddingNewLinesAfterUseStrict": true,
-
-	"disallowArrowFunctions": true,
-
-	"disallowMultiLineTernary": true,
-
-	"validateOrderInObjectKeys": "asc-insensitive",
-
-	"disallowIdenticalDestructuringNames": true,
-
-	"disallowNestedTernaries": { "maxLevel": 1 },
-
-	"requireSpaceAfterComma": true
-}
-
diff --git a/js/node_modules/define-properties/.npmignore b/js/node_modules/define-properties/.npmignore
deleted file mode 100644
index a777a81389f004e72f0d53b02c7ed724f59d5a95..0000000000000000000000000000000000000000
--- a/js/node_modules/define-properties/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-test/*
-
diff --git a/js/node_modules/define-properties/.travis.yml b/js/node_modules/define-properties/.travis.yml
deleted file mode 100644
index 324496cd48ad589e8921b736e8b9382ac1a341bc..0000000000000000000000000000000000000000
--- a/js/node_modules/define-properties/.travis.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-language: node_js
-node_js:
-  - "4.2"
-  - "4.1"
-  - "4.0"
-  - "iojs-v3.3"
-  - "iojs-v3.2"
-  - "iojs-v3.1"
-  - "iojs-v3.0"
-  - "iojs-v2.5"
-  - "iojs-v2.4"
-  - "iojs-v2.3"
-  - "iojs-v2.2"
-  - "iojs-v2.1"
-  - "iojs-v2.0"
-  - "iojs-v1.8"
-  - "iojs-v1.7"
-  - "iojs-v1.6"
-  - "iojs-v1.5"
-  - "iojs-v1.4"
-  - "iojs-v1.3"
-  - "iojs-v1.2"
-  - "iojs-v1.1"
-  - "iojs-v1.0"
-  - "0.12"
-  - "0.11"
-  - "0.10"
-  - "0.9"
-  - "0.8"
-  - "0.6"
-  - "0.4"
-before_install:
-  - '[ "${TRAVIS_NODE_VERSION}" = "0.6" ] || npm install -g npm@1.4.28 && npm install -g npm'
-sudo: false
-matrix:
-  fast_finish: true
-  allow_failures:
-    - node_js: "4.1"
-    - node_js: "4.0"
-    - node_js: "iojs-v3.2"
-    - node_js: "iojs-v3.1"
-    - node_js: "iojs-v3.0"
-    - node_js: "iojs-v2.4"
-    - node_js: "iojs-v2.3"
-    - node_js: "iojs-v2.2"
-    - node_js: "iojs-v2.1"
-    - node_js: "iojs-v2.0"
-    - node_js: "iojs-v1.7"
-    - node_js: "iojs-v1.6"
-    - node_js: "iojs-v1.5"
-    - node_js: "iojs-v1.4"
-    - node_js: "iojs-v1.3"
-    - node_js: "iojs-v1.2"
-    - node_js: "iojs-v1.1"
-    - node_js: "iojs-v1.0"
-    - node_js: "0.11"
-    - node_js: "0.9"
-    - node_js: "0.8"
-    - node_js: "0.6"
-    - node_js: "0.4"
diff --git a/js/node_modules/define-properties/CHANGELOG.md b/js/node_modules/define-properties/CHANGELOG.md
deleted file mode 100644
index 3217f899ebf8995543c895944730adb45dc0a35a..0000000000000000000000000000000000000000
--- a/js/node_modules/define-properties/CHANGELOG.md
+++ /dev/null
@@ -1,35 +0,0 @@
-1.1.2 / 2015-10-14
-=================
- * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
- * [Deps] Update `object-keys`
- * [Dev Deps] update `jscs`, `tape`, `eslint`, `@ljharb/eslint-config`, `nsp`
- * [Tests] up to `io.js` `v3.3`, `node` `v4.2`
-
-1.1.1 / 2015-07-21
-=================
- * [Deps] Update `object-keys`
- * [Dev Deps] Update `tape`, `eslint`
- * [Tests] Test on `io.js` `v2.4`
-
-1.1.0 / 2015-07-01
-=================
- * [New] Add support for symbol-valued properties.
- * [Dev Deps] Update `nsp`, `eslint`
- * [Tests] Test up to `io.js` `v2.3`
-
-1.0.3 / 2015-05-30
-=================
- * Using a more reliable check for supported property descriptors.
-
-1.0.2 / 2015-05-23
-=================
- * Test up to `io.js` `v2.0`
- * Update `tape`, `jscs`, `nsp`, `eslint`, `object-keys`, `editorconfig-tools`, `covert`
-
-1.0.1 / 2015-01-06
-=================
- * Update `object-keys` to fix ES3 support
-
-1.0.0 / 2015-01-04
-=================
-  * v1.0.0
diff --git a/js/node_modules/define-properties/LICENSE b/js/node_modules/define-properties/LICENSE
deleted file mode 100644
index 8c271c14b62fa20621eac06b1fb298602f82324a..0000000000000000000000000000000000000000
--- a/js/node_modules/define-properties/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (C) 2015 Jordan Harband
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
\ No newline at end of file
diff --git a/js/node_modules/define-properties/README.md b/js/node_modules/define-properties/README.md
deleted file mode 100644
index 33b6111f161852d5647fe33c6f8e1115a9be02f9..0000000000000000000000000000000000000000
--- a/js/node_modules/define-properties/README.md
+++ /dev/null
@@ -1,86 +0,0 @@
-#define-properties <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
-
-[![Build Status][travis-svg]][travis-url]
-[![dependency status][deps-svg]][deps-url]
-[![dev dependency status][dev-deps-svg]][dev-deps-url]
-[![License][license-image]][license-url]
-[![Downloads][downloads-image]][downloads-url]
-
-[![npm badge][npm-badge-png]][package-url]
-
-[![browser support][testling-svg]][testling-url]
-
-Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.
-Existing properties are not overridden. Accepts a map of property names to a predicate that, when true, force-overrides.
-
-## Example
-
-```js
-var define = require('define-properties');
-var assert = require('assert');
-
-var obj = define({ a: 1, b: 2 }, {
-	a: 10,
-	b: 20,
-	c: 30
-});
-assert(obj.a === 1);
-assert(obj.b === 2);
-assert(obj.c === 30);
-if (define.supportsDescriptors) {
-	assert.deepEqual(Object.keys(obj), ['a', 'b']);
-	assert.deepEqual(Object.getOwnPropertyDescriptor(obj, 'c'), {
-		configurable: true,
-		enumerable: false,
-		value: 30,
-		writable: false
-	});
-}
-```
-
-Then, with predicates:
-```js
-var define = require('define-properties');
-var assert = require('assert');
-
-var obj = define({ a: 1, b: 2, c: 3 }, {
-	a: 10,
-	b: 20,
-	c: 30
-}, {
-	a: function () { return false; },
-	b: function () { return true; }
-});
-assert(obj.a === 1);
-assert(obj.b === 20);
-assert(obj.c === 3);
-if (define.supportsDescriptors) {
-	assert.deepEqual(Object.keys(obj), ['a', 'c']);
-	assert.deepEqual(Object.getOwnPropertyDescriptor(obj, 'b'), {
-		configurable: true,
-		enumerable: false,
-		value: 20,
-		writable: false
-	});
-}
-```
-
-## Tests
-Simply clone the repo, `npm install`, and run `npm test`
-
-[package-url]: https://npmjs.org/package/define-properties
-[npm-version-svg]: http://versionbadg.es/ljharb/define-properties.svg
-[travis-svg]: https://travis-ci.org/ljharb/define-properties.svg
-[travis-url]: https://travis-ci.org/ljharb/define-properties
-[deps-svg]: https://david-dm.org/ljharb/define-properties.svg
-[deps-url]: https://david-dm.org/ljharb/define-properties
-[dev-deps-svg]: https://david-dm.org/ljharb/define-properties/dev-status.svg
-[dev-deps-url]: https://david-dm.org/ljharb/define-properties#info=devDependencies
-[testling-svg]: https://ci.testling.com/ljharb/define-properties.png
-[testling-url]: https://ci.testling.com/ljharb/define-properties
-[npm-badge-png]: https://nodei.co/npm/define-properties.png?downloads=true&stars=true
-[license-image]: http://img.shields.io/npm/l/define-properties.svg
-[license-url]: LICENSE
-[downloads-image]: http://img.shields.io/npm/dm/define-properties.svg
-[downloads-url]: http://npm-stat.com/charts.html?package=define-properties
-
diff --git a/js/node_modules/define-properties/index.js b/js/node_modules/define-properties/index.js
deleted file mode 100644
index 4bd579046aa4ec5633b3fd98603bb8ab2e11e137..0000000000000000000000000000000000000000
--- a/js/node_modules/define-properties/index.js
+++ /dev/null
@@ -1,56 +0,0 @@
-'use strict';
-
-var keys = require('object-keys');
-var foreach = require('foreach');
-var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
-
-var toStr = Object.prototype.toString;
-
-var isFunction = function (fn) {
-	return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
-};
-
-var arePropertyDescriptorsSupported = function () {
-	var obj = {};
-	try {
-		Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
-        /* eslint-disable no-unused-vars, no-restricted-syntax */
-        for (var _ in obj) { return false; }
-        /* eslint-enable no-unused-vars, no-restricted-syntax */
-		return obj.x === obj;
-	} catch (e) { /* this is IE 8. */
-		return false;
-	}
-};
-var supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();
-
-var defineProperty = function (object, name, value, predicate) {
-	if (name in object && (!isFunction(predicate) || !predicate())) {
-		return;
-	}
-	if (supportsDescriptors) {
-		Object.defineProperty(object, name, {
-			configurable: true,
-			enumerable: false,
-			value: value,
-			writable: true
-		});
-	} else {
-		object[name] = value;
-	}
-};
-
-var defineProperties = function (object, map) {
-	var predicates = arguments.length > 2 ? arguments[2] : {};
-	var props = keys(map);
-	if (hasSymbols) {
-		props = props.concat(Object.getOwnPropertySymbols(map));
-	}
-	foreach(props, function (name) {
-		defineProperty(object, name, map[name], predicates[name]);
-	});
-};
-
-defineProperties.supportsDescriptors = !!supportsDescriptors;
-
-module.exports = defineProperties;
diff --git a/js/node_modules/define-properties/package.json b/js/node_modules/define-properties/package.json
deleted file mode 100644
index 250334d3b7ed51d0401f5570a631ca81a19b9f52..0000000000000000000000000000000000000000
--- a/js/node_modules/define-properties/package.json
+++ /dev/null
@@ -1,119 +0,0 @@
-{
-  "_args": [
-    [
-      "define-properties@^1.1.2",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/object.assign"
-    ]
-  ],
-  "_from": "define-properties@>=1.1.2 <2.0.0",
-  "_id": "define-properties@1.1.2",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/define-properties",
-  "_nodeVersion": "4.2.1",
-  "_npmUser": {
-    "email": "ljharb@gmail.com",
-    "name": "ljharb"
-  },
-  "_npmVersion": "2.14.7",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "define-properties",
-    "raw": "define-properties@^1.1.2",
-    "rawSpec": "^1.1.2",
-    "scope": null,
-    "spec": ">=1.1.2 <2.0.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/object.assign"
-  ],
-  "_resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
-  "_shasum": "83a73f2fea569898fb737193c8f873caf6d45c94",
-  "_shrinkwrap": null,
-  "_spec": "define-properties@^1.1.2",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/object.assign",
-  "author": {
-    "name": "Jordan Harband"
-  },
-  "bugs": {
-    "url": "https://github.com/ljharb/define-properties/issues"
-  },
-  "dependencies": {
-    "foreach": "^2.0.5",
-    "object-keys": "^1.0.8"
-  },
-  "description": "Define multiple non-enumerable properties at once. Uses `Object.defineProperty` when available; falls back to standard assignment in older engines.",
-  "devDependencies": {
-    "@ljharb/eslint-config": "^1.3.0",
-    "covert": "^1.1.0",
-    "editorconfig-tools": "^0.1.1",
-    "eslint": "^1.6.0",
-    "jscs": "^2.3.1",
-    "nsp": "^1.1.0",
-    "tape": "^4.2.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "83a73f2fea569898fb737193c8f873caf6d45c94",
-    "tarball": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz"
-  },
-  "engines": {
-    "node": ">= 0.4"
-  },
-  "gitHead": "6467a10e6f493d8a1a4f6ec8442ffee137aab7ba",
-  "homepage": "https://github.com/ljharb/define-properties#readme",
-  "keywords": [
-    "ES5",
-    "Object.defineProperties",
-    "Object.defineProperty",
-    "define",
-    "descriptor",
-    "object",
-    "property descriptor"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "ljharb",
-      "email": "ljharb@gmail.com"
-    }
-  ],
-  "name": "define-properties",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/ljharb/define-properties.git"
-  },
-  "scripts": {
-    "coverage": "covert test/*.js",
-    "coverage-quiet": "covert test/*.js --quiet",
-    "eccheck": "editorconfig-tools check *.js **/*.js > /dev/null",
-    "eslint": "eslint test/*.js *.js",
-    "jscs": "jscs test/*.js *.js",
-    "lint": "npm run jscs && npm run eslint",
-    "security": "nsp package",
-    "test": "npm run lint && node test/index.js && npm run security"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2",
-      "chrome/20.0..latest",
-      "chrome/4.0..10.0",
-      "chrome/canary",
-      "firefox/15.0..latest",
-      "firefox/3.0..6.0",
-      "firefox/nightly",
-      "iexplore/6.0..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/10.0..latest",
-      "opera/next",
-      "safari/4.0..latest"
-    ],
-    "files": "test/index.js"
-  },
-  "version": "1.1.2"
-}
diff --git a/js/node_modules/define-properties/test/index.js b/js/node_modules/define-properties/test/index.js
deleted file mode 100644
index 33ce0513fd73d5a9cfde24f4fbf40810a9720d2b..0000000000000000000000000000000000000000
--- a/js/node_modules/define-properties/test/index.js
+++ /dev/null
@@ -1,126 +0,0 @@
-'use strict';
-
-var define = require('../');
-var test = require('tape');
-var keys = require('object-keys');
-
-var arePropertyDescriptorsSupported = function () {
-	var obj = { a: 1 };
-	try {
-		Object.defineProperty(obj, 'x', { value: obj });
-		return obj.x === obj;
-	} catch (e) { /* this is IE 8. */
-		return false;
-	}
-};
-var descriptorsSupported = !!Object.defineProperty && arePropertyDescriptorsSupported();
-
-var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
-
-test('defineProperties', function (dt) {
-
-	dt.test('with descriptor support', { skip: !descriptorsSupported }, function (t) {
-		var getDescriptor = function (value) {
-			return {
-				configurable: true,
-				enumerable: false,
-				value: value,
-				writable: true
-			};
-		};
-
-		var obj = {
-			a: 1,
-			b: 2,
-			c: 3
-		};
-		t.deepEqual(keys(obj), ['a', 'b', 'c'], 'all literal-set keys start enumerable');
-		define(obj, {
-			b: 3,
-			c: 4,
-			d: 5
-		});
-		t.deepEqual(obj, {
-			a: 1,
-			b: 2,
-			c: 3
-		}, 'existing properties were not overridden');
-		t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'new property "d" was added and is not enumerable');
-		t.deepEqual(['a', 'b', 'c'], keys(obj), 'new keys are not enumerable');
-
-		define(obj, {
-			a: 2,
-			b: 3,
-			c: 4
-		}, {
-			a: function () { return true; },
-			b: function () { return false; }
-		});
-		t.deepEqual(obj, {
-			b: 2,
-			c: 3
-		}, 'properties only overriden when predicate exists and returns true');
-		t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'existing property "d" remained and is not enumerable');
-		t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'a'), getDescriptor(2), 'existing property "a" was overridden and is not enumerable');
-		t.deepEqual(['b', 'c'], keys(obj), 'overridden keys are not enumerable');
-
-		t.end();
-	});
-
-	dt.test('without descriptor support', { skip: descriptorsSupported }, function (t) {
-		var obj = {
-			a: 1,
-			b: 2,
-			c: 3
-		};
-		define(obj, {
-			b: 3,
-			c: 4,
-			d: 5
-		});
-		t.deepEqual(obj, {
-			a: 1,
-			b: 2,
-			c: 3,
-			d: 5
-		}, 'existing properties were not overridden, new properties were added');
-
-		define(obj, {
-			a: 2,
-			b: 3,
-			c: 4
-		}, {
-			a: function () { return true; },
-			b: function () { return false; }
-		});
-		t.deepEqual(obj, {
-			a: 2,
-			b: 2,
-			c: 3,
-			d: 5
-		}, 'properties only overriden when predicate exists and returns true');
-
-		t.end();
-	});
-
-	dt.end();
-});
-
-test('symbols', { skip: !hasSymbols }, function (t) {
-	var sym = Symbol('foo');
-	var obj = {};
-	var aValue = {};
-	var bValue = {};
-	var properties = { a: aValue };
-	properties[sym] = bValue;
-
-	define(obj, properties);
-
-	t.deepEqual(Object.keys(obj), [], 'object has no enumerable keys');
-	t.deepEqual(Object.getOwnPropertyNames(obj), ['a'], 'object has non-enumerable "a" key');
-	t.deepEqual(Object.getOwnPropertySymbols(obj), [sym], 'object has non-enumerable symbol key');
-	t.equal(obj.a, aValue, 'string keyed value is defined');
-	t.equal(obj[sym], bValue, 'symbol keyed value is defined');
-
-	t.end();
-});
diff --git a/js/node_modules/es6-promise/CHANGELOG.md b/js/node_modules/es6-promise/CHANGELOG.md
deleted file mode 100644
index 773e5dc9d380f438c8295fb0a4fdb697970944cd..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/CHANGELOG.md
+++ /dev/null
@@ -1,92 +0,0 @@
-# Master
-
-# 3.3.1
-
-* fix links in readme
-
-# 3.3.0
-
-* support polyfil on WebMAF (playstation env)
-* fix tampering related bug global `constructor` was referenced by mistake.
-* provide TS Typings
-* increase compatibliity with sinon.useFakeTimers();
-* update build tools (use rollup)
-* directly export promise;
-
-# 3.2.2
-
-* IE8: use isArray
-* update build dependencies
-
-# 3.2.1
-
-* fix race tampering issue
-* use eslint
-* fix Promise.all tampering
-* remove unused code
-* fix issues with NWJS/electron
-
-# 3.2.0
-
-* improve tamper resistence of Promise.all Promise.race and
-  Promise.prototype.then (note, this isn't complete, but addresses an exception
-  when used \w core-js, follow up work will address entirely)
-* remove spec incompatible then chaining fast-path
-* add eslint
-* update build deps
-
-# 3.1.2
-
-* fix node detection issues with NWJS/electron
-
-# 3.1.0
-
-* improve performance of Promise.all when it encounters a non-promise input object input
-* then/resolve tamper protection
-* reduce AST size of promise constructor, to facilitate more inlining
-* Update README.md with details about PhantomJS requirement for running tests
-* Mangle and compress the minified version
-
-# 3.0.1
-
-* no longer include dist/test in npm releases
-
-# 3.0.0
-
-* use nextTick() instead of setImmediate() to schedule microtasks with node 0.10. Later versions of
-  nodes are not affected as they were already using nextTick(). Note that using nextTick() might
-  trigger a depreciation warning on 0.10 as described at https://github.com/cujojs/when/issues/410.
-  The reason why nextTick() is preferred is that is setImmediate() would schedule a macrotask
-  instead of a microtask and might result in a different scheduling.
-  If needed you can revert to the former behavior as follow:
-
-    var Promise = require('es6-promise').Promise;
-    Promise._setScheduler(setImmediate);
-
-# 2.3.0
-
-* #121: Ability to override the internal asap implementation
-* #120: Use an ascii character for an apostrophe, for source maps
-
-# 2.2.0
-
-* #116: Expose asap() and a way to override the scheduling mechanism on Promise
-* Lock to v0.2.3 of ember-cli
-
-# 2.1.1
-
-* Fix #100 via #105: tell browserify to ignore vertx require
-* Fix #101 via #102: "follow thenable state, not own state"
-
-# 2.1.0
-
-* #59: Automatic polyfill. No need to invoke `ES6Promise.polyfill()` anymore.
-* ... (see the commit log)
-
-# 2.0.0
-
-* re-sync with RSVP. Many large performance improvements and bugfixes.
-
-# 1.0.0
-
-* first subset of RSVP
diff --git a/js/node_modules/es6-promise/LICENSE b/js/node_modules/es6-promise/LICENSE
deleted file mode 100644
index 954ec5992df7508499c41d0e9d7ed74ef5d5032c..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/es6-promise/README.md b/js/node_modules/es6-promise/README.md
deleted file mode 100644
index 5b7155ec8d410f4a04bfff291eb681ab0586ae94..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/README.md
+++ /dev/null
@@ -1,74 +0,0 @@
-# ES6-Promise (subset of [rsvp.js](https://github.com/tildeio/rsvp.js)) [![Build Status](https://travis-ci.org/stefanpenner/es6-promise.svg?branch=master)](https://travis-ci.org/stefanpenner/es6-promise)
-
-This is a polyfill of the [ES6 Promise](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-constructor). The implementation is a subset of [rsvp.js](https://github.com/tildeio/rsvp.js) extracted by @jakearchibald, if you're wanting extra features and more debugging options, check out the [full library](https://github.com/tildeio/rsvp.js).
-
-For API details and how to use promises, see the <a href="http://www.html5rocks.com/en/tutorials/es6/promises/">JavaScript Promises HTML5Rocks article</a>.
-
-## Downloads
-
-* [es6-promise 27.86 KB (7.33 KB gzipped)](https://raw.githubusercontent.com/stefanpenner/es6-promise/master/dist/es6-promise.js)
-* [es6-promise-min 6.17 KB (2.4 KB gzipped)](https://raw.githubusercontent.com/stefanpenner/es6-promise/master/dist/es6-promise.min.js)
-
-## Node.js
-
-To install:
-
-```sh
-npm install es6-promise
-```
-
-To use:
-
-```js
-var Promise = require('es6-promise').Promise;
-```
-
-## Bower
-
-To install:
-
-```sh
-bower install es6-promise --save
-```
-
-
-## Usage in IE<9
-
-`catch` is a reserved word in IE<9, meaning `promise.catch(func)` throws a syntax error. To work around this, you can use a string to access the property as shown in the following example.
-
-However, please remember that such technique is already provided by most common minifiers, making the resulting code safe for old browsers and production:
-
-```js
-promise['catch'](function(err) {
-  // ...
-});
-```
-
-Or use `.then` instead:
-
-```js
-promise.then(undefined, function(err) {
-  // ...
-});
-```
-
-## Auto-polyfill
-
-To polyfill the global environment (either in Node or in the browser via CommonJS) use the following code snippet:
-
-```js
-require('es6-promise').polyfill();
-```
-
-Notice that we don't assign the result of `polyfill()` to any variable. The `polyfill()` method will patch the global environment (in this case to the `Promise` name) when called.
-
-## Building & Testing
-
-You will need to have PhantomJS installed globally in order to run the tests.
-
-`npm install -g phantomjs`
-
-* `npm run build` to build
-* `npm test` to run tests
-* `npm start` to run a build watcher, and webserver to test
-* `npm run test:server` for a testem test runner and watching builder
diff --git a/js/node_modules/es6-promise/dist/es6-promise.js b/js/node_modules/es6-promise/dist/es6-promise.js
deleted file mode 100644
index 9ea6bce852c43241a29ae3ff266439bf198bfae5..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/dist/es6-promise.js
+++ /dev/null
@@ -1,1154 +0,0 @@
-/*!
- * @overview es6-promise - a tiny implementation of Promises/A+.
- * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
- * @license   Licensed under MIT license
- *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
- * @version   3.3.1
- */
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global.ES6Promise = factory());
-}(this, (function () { 'use strict';
-
-function objectOrFunction(x) {
-  return typeof x === 'function' || typeof x === 'object' && x !== null;
-}
-
-function isFunction(x) {
-  return typeof x === 'function';
-}
-
-var _isArray = undefined;
-if (!Array.isArray) {
-  _isArray = function (x) {
-    return Object.prototype.toString.call(x) === '[object Array]';
-  };
-} else {
-  _isArray = Array.isArray;
-}
-
-var isArray = _isArray;
-
-var len = 0;
-var vertxNext = undefined;
-var customSchedulerFn = undefined;
-
-var asap = function asap(callback, arg) {
-  queue[len] = callback;
-  queue[len + 1] = arg;
-  len += 2;
-  if (len === 2) {
-    // If len is 2, that means that we need to schedule an async flush.
-    // If additional callbacks are queued before the queue is flushed, they
-    // will be processed by this flush that we are scheduling.
-    if (customSchedulerFn) {
-      customSchedulerFn(flush);
-    } else {
-      scheduleFlush();
-    }
-  }
-};
-
-function setScheduler(scheduleFn) {
-  customSchedulerFn = scheduleFn;
-}
-
-function setAsap(asapFn) {
-  asap = asapFn;
-}
-
-var browserWindow = typeof window !== 'undefined' ? window : undefined;
-var browserGlobal = browserWindow || {};
-var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
-var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';
-
-// test for web worker but not in IE10
-var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
-
-// node
-function useNextTick() {
-  // node version 0.10.x displays a deprecation warning when nextTick is used recursively
-  // see https://github.com/cujojs/when/issues/410 for details
-  return function () {
-    return process.nextTick(flush);
-  };
-}
-
-// vertx
-function useVertxTimer() {
-  return function () {
-    vertxNext(flush);
-  };
-}
-
-function useMutationObserver() {
-  var iterations = 0;
-  var observer = new BrowserMutationObserver(flush);
-  var node = document.createTextNode('');
-  observer.observe(node, { characterData: true });
-
-  return function () {
-    node.data = iterations = ++iterations % 2;
-  };
-}
-
-// web worker
-function useMessageChannel() {
-  var channel = new MessageChannel();
-  channel.port1.onmessage = flush;
-  return function () {
-    return channel.port2.postMessage(0);
-  };
-}
-
-function useSetTimeout() {
-  // Store setTimeout reference so es6-promise will be unaffected by
-  // other code modifying setTimeout (like sinon.useFakeTimers())
-  var globalSetTimeout = setTimeout;
-  return function () {
-    return globalSetTimeout(flush, 1);
-  };
-}
-
-var queue = new Array(1000);
-function flush() {
-  for (var i = 0; i < len; i += 2) {
-    var callback = queue[i];
-    var arg = queue[i + 1];
-
-    callback(arg);
-
-    queue[i] = undefined;
-    queue[i + 1] = undefined;
-  }
-
-  len = 0;
-}
-
-function attemptVertx() {
-  try {
-    var r = require;
-    var vertx = r('vertx');
-    vertxNext = vertx.runOnLoop || vertx.runOnContext;
-    return useVertxTimer();
-  } catch (e) {
-    return useSetTimeout();
-  }
-}
-
-var scheduleFlush = undefined;
-// Decide what async method to use to triggering processing of queued callbacks:
-if (isNode) {
-  scheduleFlush = useNextTick();
-} else if (BrowserMutationObserver) {
-  scheduleFlush = useMutationObserver();
-} else if (isWorker) {
-  scheduleFlush = useMessageChannel();
-} else if (browserWindow === undefined && typeof require === 'function') {
-  scheduleFlush = attemptVertx();
-} else {
-  scheduleFlush = useSetTimeout();
-}
-
-function then(onFulfillment, onRejection) {
-  var _arguments = arguments;
-
-  var parent = this;
-
-  var child = new this.constructor(noop);
-
-  if (child[PROMISE_ID] === undefined) {
-    makePromise(child);
-  }
-
-  var _state = parent._state;
-
-  if (_state) {
-    (function () {
-      var callback = _arguments[_state - 1];
-      asap(function () {
-        return invokeCallback(_state, child, callback, parent._result);
-      });
-    })();
-  } else {
-    subscribe(parent, child, onFulfillment, onRejection);
-  }
-
-  return child;
-}
-
-/**
-  `Promise.resolve` returns a promise that will become resolved with the
-  passed `value`. It is shorthand for the following:
-
-  ```javascript
-  let promise = new Promise(function(resolve, reject){
-    resolve(1);
-  });
-
-  promise.then(function(value){
-    // value === 1
-  });
-  ```
-
-  Instead of writing the above, your code now simply becomes the following:
-
-  ```javascript
-  let promise = Promise.resolve(1);
-
-  promise.then(function(value){
-    // value === 1
-  });
-  ```
-
-  @method resolve
-  @static
-  @param {Any} value value that the returned promise will be resolved with
-  Useful for tooling.
-  @return {Promise} a promise that will become fulfilled with the given
-  `value`
-*/
-function resolve(object) {
-  /*jshint validthis:true */
-  var Constructor = this;
-
-  if (object && typeof object === 'object' && object.constructor === Constructor) {
-    return object;
-  }
-
-  var promise = new Constructor(noop);
-  _resolve(promise, object);
-  return promise;
-}
-
-var PROMISE_ID = Math.random().toString(36).substring(16);
-
-function noop() {}
-
-var PENDING = void 0;
-var FULFILLED = 1;
-var REJECTED = 2;
-
-var GET_THEN_ERROR = new ErrorObject();
-
-function selfFulfillment() {
-  return new TypeError("You cannot resolve a promise with itself");
-}
-
-function cannotReturnOwn() {
-  return new TypeError('A promises callback cannot return that same promise.');
-}
-
-function getThen(promise) {
-  try {
-    return promise.then;
-  } catch (error) {
-    GET_THEN_ERROR.error = error;
-    return GET_THEN_ERROR;
-  }
-}
-
-function tryThen(then, value, fulfillmentHandler, rejectionHandler) {
-  try {
-    then.call(value, fulfillmentHandler, rejectionHandler);
-  } catch (e) {
-    return e;
-  }
-}
-
-function handleForeignThenable(promise, thenable, then) {
-  asap(function (promise) {
-    var sealed = false;
-    var error = tryThen(then, thenable, function (value) {
-      if (sealed) {
-        return;
-      }
-      sealed = true;
-      if (thenable !== value) {
-        _resolve(promise, value);
-      } else {
-        fulfill(promise, value);
-      }
-    }, function (reason) {
-      if (sealed) {
-        return;
-      }
-      sealed = true;
-
-      _reject(promise, reason);
-    }, 'Settle: ' + (promise._label || ' unknown promise'));
-
-    if (!sealed && error) {
-      sealed = true;
-      _reject(promise, error);
-    }
-  }, promise);
-}
-
-function handleOwnThenable(promise, thenable) {
-  if (thenable._state === FULFILLED) {
-    fulfill(promise, thenable._result);
-  } else if (thenable._state === REJECTED) {
-    _reject(promise, thenable._result);
-  } else {
-    subscribe(thenable, undefined, function (value) {
-      return _resolve(promise, value);
-    }, function (reason) {
-      return _reject(promise, reason);
-    });
-  }
-}
-
-function handleMaybeThenable(promise, maybeThenable, then$$) {
-  if (maybeThenable.constructor === promise.constructor && then$$ === then && maybeThenable.constructor.resolve === resolve) {
-    handleOwnThenable(promise, maybeThenable);
-  } else {
-    if (then$$ === GET_THEN_ERROR) {
-      _reject(promise, GET_THEN_ERROR.error);
-    } else if (then$$ === undefined) {
-      fulfill(promise, maybeThenable);
-    } else if (isFunction(then$$)) {
-      handleForeignThenable(promise, maybeThenable, then$$);
-    } else {
-      fulfill(promise, maybeThenable);
-    }
-  }
-}
-
-function _resolve(promise, value) {
-  if (promise === value) {
-    _reject(promise, selfFulfillment());
-  } else if (objectOrFunction(value)) {
-    handleMaybeThenable(promise, value, getThen(value));
-  } else {
-    fulfill(promise, value);
-  }
-}
-
-function publishRejection(promise) {
-  if (promise._onerror) {
-    promise._onerror(promise._result);
-  }
-
-  publish(promise);
-}
-
-function fulfill(promise, value) {
-  if (promise._state !== PENDING) {
-    return;
-  }
-
-  promise._result = value;
-  promise._state = FULFILLED;
-
-  if (promise._subscribers.length !== 0) {
-    asap(publish, promise);
-  }
-}
-
-function _reject(promise, reason) {
-  if (promise._state !== PENDING) {
-    return;
-  }
-  promise._state = REJECTED;
-  promise._result = reason;
-
-  asap(publishRejection, promise);
-}
-
-function subscribe(parent, child, onFulfillment, onRejection) {
-  var _subscribers = parent._subscribers;
-  var length = _subscribers.length;
-
-  parent._onerror = null;
-
-  _subscribers[length] = child;
-  _subscribers[length + FULFILLED] = onFulfillment;
-  _subscribers[length + REJECTED] = onRejection;
-
-  if (length === 0 && parent._state) {
-    asap(publish, parent);
-  }
-}
-
-function publish(promise) {
-  var subscribers = promise._subscribers;
-  var settled = promise._state;
-
-  if (subscribers.length === 0) {
-    return;
-  }
-
-  var child = undefined,
-      callback = undefined,
-      detail = promise._result;
-
-  for (var i = 0; i < subscribers.length; i += 3) {
-    child = subscribers[i];
-    callback = subscribers[i + settled];
-
-    if (child) {
-      invokeCallback(settled, child, callback, detail);
-    } else {
-      callback(detail);
-    }
-  }
-
-  promise._subscribers.length = 0;
-}
-
-function ErrorObject() {
-  this.error = null;
-}
-
-var TRY_CATCH_ERROR = new ErrorObject();
-
-function tryCatch(callback, detail) {
-  try {
-    return callback(detail);
-  } catch (e) {
-    TRY_CATCH_ERROR.error = e;
-    return TRY_CATCH_ERROR;
-  }
-}
-
-function invokeCallback(settled, promise, callback, detail) {
-  var hasCallback = isFunction(callback),
-      value = undefined,
-      error = undefined,
-      succeeded = undefined,
-      failed = undefined;
-
-  if (hasCallback) {
-    value = tryCatch(callback, detail);
-
-    if (value === TRY_CATCH_ERROR) {
-      failed = true;
-      error = value.error;
-      value = null;
-    } else {
-      succeeded = true;
-    }
-
-    if (promise === value) {
-      _reject(promise, cannotReturnOwn());
-      return;
-    }
-  } else {
-    value = detail;
-    succeeded = true;
-  }
-
-  if (promise._state !== PENDING) {
-    // noop
-  } else if (hasCallback && succeeded) {
-      _resolve(promise, value);
-    } else if (failed) {
-      _reject(promise, error);
-    } else if (settled === FULFILLED) {
-      fulfill(promise, value);
-    } else if (settled === REJECTED) {
-      _reject(promise, value);
-    }
-}
-
-function initializePromise(promise, resolver) {
-  try {
-    resolver(function resolvePromise(value) {
-      _resolve(promise, value);
-    }, function rejectPromise(reason) {
-      _reject(promise, reason);
-    });
-  } catch (e) {
-    _reject(promise, e);
-  }
-}
-
-var id = 0;
-function nextId() {
-  return id++;
-}
-
-function makePromise(promise) {
-  promise[PROMISE_ID] = id++;
-  promise._state = undefined;
-  promise._result = undefined;
-  promise._subscribers = [];
-}
-
-function Enumerator(Constructor, input) {
-  this._instanceConstructor = Constructor;
-  this.promise = new Constructor(noop);
-
-  if (!this.promise[PROMISE_ID]) {
-    makePromise(this.promise);
-  }
-
-  if (isArray(input)) {
-    this._input = input;
-    this.length = input.length;
-    this._remaining = input.length;
-
-    this._result = new Array(this.length);
-
-    if (this.length === 0) {
-      fulfill(this.promise, this._result);
-    } else {
-      this.length = this.length || 0;
-      this._enumerate();
-      if (this._remaining === 0) {
-        fulfill(this.promise, this._result);
-      }
-    }
-  } else {
-    _reject(this.promise, validationError());
-  }
-}
-
-function validationError() {
-  return new Error('Array Methods must be provided an Array');
-};
-
-Enumerator.prototype._enumerate = function () {
-  var length = this.length;
-  var _input = this._input;
-
-  for (var i = 0; this._state === PENDING && i < length; i++) {
-    this._eachEntry(_input[i], i);
-  }
-};
-
-Enumerator.prototype._eachEntry = function (entry, i) {
-  var c = this._instanceConstructor;
-  var resolve$$ = c.resolve;
-
-  if (resolve$$ === resolve) {
-    var _then = getThen(entry);
-
-    if (_then === then && entry._state !== PENDING) {
-      this._settledAt(entry._state, i, entry._result);
-    } else if (typeof _then !== 'function') {
-      this._remaining--;
-      this._result[i] = entry;
-    } else if (c === Promise) {
-      var promise = new c(noop);
-      handleMaybeThenable(promise, entry, _then);
-      this._willSettleAt(promise, i);
-    } else {
-      this._willSettleAt(new c(function (resolve$$) {
-        return resolve$$(entry);
-      }), i);
-    }
-  } else {
-    this._willSettleAt(resolve$$(entry), i);
-  }
-};
-
-Enumerator.prototype._settledAt = function (state, i, value) {
-  var promise = this.promise;
-
-  if (promise._state === PENDING) {
-    this._remaining--;
-
-    if (state === REJECTED) {
-      _reject(promise, value);
-    } else {
-      this._result[i] = value;
-    }
-  }
-
-  if (this._remaining === 0) {
-    fulfill(promise, this._result);
-  }
-};
-
-Enumerator.prototype._willSettleAt = function (promise, i) {
-  var enumerator = this;
-
-  subscribe(promise, undefined, function (value) {
-    return enumerator._settledAt(FULFILLED, i, value);
-  }, function (reason) {
-    return enumerator._settledAt(REJECTED, i, reason);
-  });
-};
-
-/**
-  `Promise.all` accepts an array of promises, and returns a new promise which
-  is fulfilled with an array of fulfillment values for the passed promises, or
-  rejected with the reason of the first passed promise to be rejected. It casts all
-  elements of the passed iterable to promises as it runs this algorithm.
-
-  Example:
-
-  ```javascript
-  let promise1 = resolve(1);
-  let promise2 = resolve(2);
-  let promise3 = resolve(3);
-  let promises = [ promise1, promise2, promise3 ];
-
-  Promise.all(promises).then(function(array){
-    // The array here would be [ 1, 2, 3 ];
-  });
-  ```
-
-  If any of the `promises` given to `all` are rejected, the first promise
-  that is rejected will be given as an argument to the returned promises's
-  rejection handler. For example:
-
-  Example:
-
-  ```javascript
-  let promise1 = resolve(1);
-  let promise2 = reject(new Error("2"));
-  let promise3 = reject(new Error("3"));
-  let promises = [ promise1, promise2, promise3 ];
-
-  Promise.all(promises).then(function(array){
-    // Code here never runs because there are rejected promises!
-  }, function(error) {
-    // error.message === "2"
-  });
-  ```
-
-  @method all
-  @static
-  @param {Array} entries array of promises
-  @param {String} label optional string for labeling the promise.
-  Useful for tooling.
-  @return {Promise} promise that is fulfilled when all `promises` have been
-  fulfilled, or rejected if any of them become rejected.
-  @static
-*/
-function all(entries) {
-  return new Enumerator(this, entries).promise;
-}
-
-/**
-  `Promise.race` returns a new promise which is settled in the same way as the
-  first passed promise to settle.
-
-  Example:
-
-  ```javascript
-  let promise1 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 1');
-    }, 200);
-  });
-
-  let promise2 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 2');
-    }, 100);
-  });
-
-  Promise.race([promise1, promise2]).then(function(result){
-    // result === 'promise 2' because it was resolved before promise1
-    // was resolved.
-  });
-  ```
-
-  `Promise.race` is deterministic in that only the state of the first
-  settled promise matters. For example, even if other promises given to the
-  `promises` array argument are resolved, but the first settled promise has
-  become rejected before the other promises became fulfilled, the returned
-  promise will become rejected:
-
-  ```javascript
-  let promise1 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 1');
-    }, 200);
-  });
-
-  let promise2 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      reject(new Error('promise 2'));
-    }, 100);
-  });
-
-  Promise.race([promise1, promise2]).then(function(result){
-    // Code here never runs
-  }, function(reason){
-    // reason.message === 'promise 2' because promise 2 became rejected before
-    // promise 1 became fulfilled
-  });
-  ```
-
-  An example real-world use case is implementing timeouts:
-
-  ```javascript
-  Promise.race([ajax('foo.json'), timeout(5000)])
-  ```
-
-  @method race
-  @static
-  @param {Array} promises array of promises to observe
-  Useful for tooling.
-  @return {Promise} a promise which settles in the same way as the first passed
-  promise to settle.
-*/
-function race(entries) {
-  /*jshint validthis:true */
-  var Constructor = this;
-
-  if (!isArray(entries)) {
-    return new Constructor(function (_, reject) {
-      return reject(new TypeError('You must pass an array to race.'));
-    });
-  } else {
-    return new Constructor(function (resolve, reject) {
-      var length = entries.length;
-      for (var i = 0; i < length; i++) {
-        Constructor.resolve(entries[i]).then(resolve, reject);
-      }
-    });
-  }
-}
-
-/**
-  `Promise.reject` returns a promise rejected with the passed `reason`.
-  It is shorthand for the following:
-
-  ```javascript
-  let promise = new Promise(function(resolve, reject){
-    reject(new Error('WHOOPS'));
-  });
-
-  promise.then(function(value){
-    // Code here doesn't run because the promise is rejected!
-  }, function(reason){
-    // reason.message === 'WHOOPS'
-  });
-  ```
-
-  Instead of writing the above, your code now simply becomes the following:
-
-  ```javascript
-  let promise = Promise.reject(new Error('WHOOPS'));
-
-  promise.then(function(value){
-    // Code here doesn't run because the promise is rejected!
-  }, function(reason){
-    // reason.message === 'WHOOPS'
-  });
-  ```
-
-  @method reject
-  @static
-  @param {Any} reason value that the returned promise will be rejected with.
-  Useful for tooling.
-  @return {Promise} a promise rejected with the given `reason`.
-*/
-function reject(reason) {
-  /*jshint validthis:true */
-  var Constructor = this;
-  var promise = new Constructor(noop);
-  _reject(promise, reason);
-  return promise;
-}
-
-function needsResolver() {
-  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
-}
-
-function needsNew() {
-  throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
-}
-
-/**
-  Promise objects represent the eventual result of an asynchronous operation. The
-  primary way of interacting with a promise is through its `then` method, which
-  registers callbacks to receive either a promise's eventual value or the reason
-  why the promise cannot be fulfilled.
-
-  Terminology
-  -----------
-
-  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
-  - `thenable` is an object or function that defines a `then` method.
-  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
-  - `exception` is a value that is thrown using the throw statement.
-  - `reason` is a value that indicates why a promise was rejected.
-  - `settled` the final resting state of a promise, fulfilled or rejected.
-
-  A promise can be in one of three states: pending, fulfilled, or rejected.
-
-  Promises that are fulfilled have a fulfillment value and are in the fulfilled
-  state.  Promises that are rejected have a rejection reason and are in the
-  rejected state.  A fulfillment value is never a thenable.
-
-  Promises can also be said to *resolve* a value.  If this value is also a
-  promise, then the original promise's settled state will match the value's
-  settled state.  So a promise that *resolves* a promise that rejects will
-  itself reject, and a promise that *resolves* a promise that fulfills will
-  itself fulfill.
-
-
-  Basic Usage:
-  ------------
-
-  ```js
-  let promise = new Promise(function(resolve, reject) {
-    // on success
-    resolve(value);
-
-    // on failure
-    reject(reason);
-  });
-
-  promise.then(function(value) {
-    // on fulfillment
-  }, function(reason) {
-    // on rejection
-  });
-  ```
-
-  Advanced Usage:
-  ---------------
-
-  Promises shine when abstracting away asynchronous interactions such as
-  `XMLHttpRequest`s.
-
-  ```js
-  function getJSON(url) {
-    return new Promise(function(resolve, reject){
-      let xhr = new XMLHttpRequest();
-
-      xhr.open('GET', url);
-      xhr.onreadystatechange = handler;
-      xhr.responseType = 'json';
-      xhr.setRequestHeader('Accept', 'application/json');
-      xhr.send();
-
-      function handler() {
-        if (this.readyState === this.DONE) {
-          if (this.status === 200) {
-            resolve(this.response);
-          } else {
-            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
-          }
-        }
-      };
-    });
-  }
-
-  getJSON('/posts.json').then(function(json) {
-    // on fulfillment
-  }, function(reason) {
-    // on rejection
-  });
-  ```
-
-  Unlike callbacks, promises are great composable primitives.
-
-  ```js
-  Promise.all([
-    getJSON('/posts'),
-    getJSON('/comments')
-  ]).then(function(values){
-    values[0] // => postsJSON
-    values[1] // => commentsJSON
-
-    return values;
-  });
-  ```
-
-  @class Promise
-  @param {function} resolver
-  Useful for tooling.
-  @constructor
-*/
-function Promise(resolver) {
-  this[PROMISE_ID] = nextId();
-  this._result = this._state = undefined;
-  this._subscribers = [];
-
-  if (noop !== resolver) {
-    typeof resolver !== 'function' && needsResolver();
-    this instanceof Promise ? initializePromise(this, resolver) : needsNew();
-  }
-}
-
-Promise.all = all;
-Promise.race = race;
-Promise.resolve = resolve;
-Promise.reject = reject;
-Promise._setScheduler = setScheduler;
-Promise._setAsap = setAsap;
-Promise._asap = asap;
-
-Promise.prototype = {
-  constructor: Promise,
-
-  /**
-    The primary way of interacting with a promise is through its `then` method,
-    which registers callbacks to receive either a promise's eventual value or the
-    reason why the promise cannot be fulfilled.
-  
-    ```js
-    findUser().then(function(user){
-      // user is available
-    }, function(reason){
-      // user is unavailable, and you are given the reason why
-    });
-    ```
-  
-    Chaining
-    --------
-  
-    The return value of `then` is itself a promise.  This second, 'downstream'
-    promise is resolved with the return value of the first promise's fulfillment
-    or rejection handler, or rejected if the handler throws an exception.
-  
-    ```js
-    findUser().then(function (user) {
-      return user.name;
-    }, function (reason) {
-      return 'default name';
-    }).then(function (userName) {
-      // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
-      // will be `'default name'`
-    });
-  
-    findUser().then(function (user) {
-      throw new Error('Found user, but still unhappy');
-    }, function (reason) {
-      throw new Error('`findUser` rejected and we're unhappy');
-    }).then(function (value) {
-      // never reached
-    }, function (reason) {
-      // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
-      // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
-    });
-    ```
-    If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
-  
-    ```js
-    findUser().then(function (user) {
-      throw new PedagogicalException('Upstream error');
-    }).then(function (value) {
-      // never reached
-    }).then(function (value) {
-      // never reached
-    }, function (reason) {
-      // The `PedgagocialException` is propagated all the way down to here
-    });
-    ```
-  
-    Assimilation
-    ------------
-  
-    Sometimes the value you want to propagate to a downstream promise can only be
-    retrieved asynchronously. This can be achieved by returning a promise in the
-    fulfillment or rejection handler. The downstream promise will then be pending
-    until the returned promise is settled. This is called *assimilation*.
-  
-    ```js
-    findUser().then(function (user) {
-      return findCommentsByAuthor(user);
-    }).then(function (comments) {
-      // The user's comments are now available
-    });
-    ```
-  
-    If the assimliated promise rejects, then the downstream promise will also reject.
-  
-    ```js
-    findUser().then(function (user) {
-      return findCommentsByAuthor(user);
-    }).then(function (comments) {
-      // If `findCommentsByAuthor` fulfills, we'll have the value here
-    }, function (reason) {
-      // If `findCommentsByAuthor` rejects, we'll have the reason here
-    });
-    ```
-  
-    Simple Example
-    --------------
-  
-    Synchronous Example
-  
-    ```javascript
-    let result;
-  
-    try {
-      result = findResult();
-      // success
-    } catch(reason) {
-      // failure
-    }
-    ```
-  
-    Errback Example
-  
-    ```js
-    findResult(function(result, err){
-      if (err) {
-        // failure
-      } else {
-        // success
-      }
-    });
-    ```
-  
-    Promise Example;
-  
-    ```javascript
-    findResult().then(function(result){
-      // success
-    }, function(reason){
-      // failure
-    });
-    ```
-  
-    Advanced Example
-    --------------
-  
-    Synchronous Example
-  
-    ```javascript
-    let author, books;
-  
-    try {
-      author = findAuthor();
-      books  = findBooksByAuthor(author);
-      // success
-    } catch(reason) {
-      // failure
-    }
-    ```
-  
-    Errback Example
-  
-    ```js
-  
-    function foundBooks(books) {
-  
-    }
-  
-    function failure(reason) {
-  
-    }
-  
-    findAuthor(function(author, err){
-      if (err) {
-        failure(err);
-        // failure
-      } else {
-        try {
-          findBoooksByAuthor(author, function(books, err) {
-            if (err) {
-              failure(err);
-            } else {
-              try {
-                foundBooks(books);
-              } catch(reason) {
-                failure(reason);
-              }
-            }
-          });
-        } catch(error) {
-          failure(err);
-        }
-        // success
-      }
-    });
-    ```
-  
-    Promise Example;
-  
-    ```javascript
-    findAuthor().
-      then(findBooksByAuthor).
-      then(function(books){
-        // found books
-    }).catch(function(reason){
-      // something went wrong
-    });
-    ```
-  
-    @method then
-    @param {Function} onFulfilled
-    @param {Function} onRejected
-    Useful for tooling.
-    @return {Promise}
-  */
-  then: then,
-
-  /**
-    `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
-    as the catch block of a try/catch statement.
-  
-    ```js
-    function findAuthor(){
-      throw new Error('couldn't find that author');
-    }
-  
-    // synchronous
-    try {
-      findAuthor();
-    } catch(reason) {
-      // something went wrong
-    }
-  
-    // async with promises
-    findAuthor().catch(function(reason){
-      // something went wrong
-    });
-    ```
-  
-    @method catch
-    @param {Function} onRejection
-    Useful for tooling.
-    @return {Promise}
-  */
-  'catch': function _catch(onRejection) {
-    return this.then(null, onRejection);
-  }
-};
-
-function polyfill() {
-    var local = undefined;
-
-    if (typeof global !== 'undefined') {
-        local = global;
-    } else if (typeof self !== 'undefined') {
-        local = self;
-    } else {
-        try {
-            local = Function('return this')();
-        } catch (e) {
-            throw new Error('polyfill failed because global object is unavailable in this environment');
-        }
-    }
-
-    var P = local.Promise;
-
-    if (P) {
-        var promiseToString = null;
-        try {
-            promiseToString = Object.prototype.toString.call(P.resolve());
-        } catch (e) {
-            // silently ignored
-        }
-
-        if (promiseToString === '[object Promise]' && !P.cast) {
-            return;
-        }
-    }
-
-    local.Promise = Promise;
-}
-
-polyfill();
-// Strange compat..
-Promise.polyfill = polyfill;
-Promise.Promise = Promise;
-
-return Promise;
-
-})));
-//# sourceMappingURL=es6-promise.map
\ No newline at end of file
diff --git a/js/node_modules/es6-promise/dist/es6-promise.map b/js/node_modules/es6-promise/dist/es6-promise.map
deleted file mode 100644
index 6c0f091d7cdfe91e4f364cfc4f37c76f7af41baf..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/dist/es6-promise.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["config/versionTemplate.txt","lib/es6-promise/utils.js","lib/es6-promise/asap.js","lib/es6-promise/then.js","lib/es6-promise/promise/resolve.js","lib/es6-promise/-internal.js","lib/es6-promise/enumerator.js","lib/es6-promise/promise/all.js","lib/es6-promise/promise/race.js","lib/es6-promise/promise/reject.js","lib/es6-promise/promise.js","lib/es6-promise/polyfill.js","lib/es6-promise.js"],"sourcesContent":["/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version   3.3.1\n */\n","'use strict';\n\nexport { objectOrFunction };\nexport { isFunction };\nexport { isMaybeThenable };\n\nfunction objectOrFunction(x) {\n  return typeof x === 'function' || typeof x === 'object' && x !== null;\n}\n\nfunction isFunction(x) {\n  return typeof x === 'function';\n}\n\nfunction isMaybeThenable(x) {\n  return typeof x === 'object' && x !== null;\n}\n\nvar _isArray = undefined;\nif (!Array.isArray) {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n} else {\n  _isArray = Array.isArray;\n}\n\nvar isArray = _isArray;\nexport { isArray };","'use strict';\n\nexport { setScheduler };\nexport { setAsap };\nvar len = 0;\nvar vertxNext = undefined;\nvar customSchedulerFn = undefined;\n\nvar asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nexport { asap };\n\nfunction setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  return function () {\n    vertxNext(flush);\n  };\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var r = require;\n    var vertx = r('vertx');\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = undefined;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}","'use strict';\n\nexport default then;\nimport { invokeCallback, subscribe, FULFILLED, REJECTED, noop, makePromise, PROMISE_ID } from './-internal';\n\nimport { asap } from './asap';\nfunction then(onFulfillment, onRejection) {\n  var _arguments = arguments;\n\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n  if (_state) {\n    (function () {\n      var callback = _arguments[_state - 1];\n      asap(function () {\n        return invokeCallback(_state, child, callback, parent._result);\n      });\n    })();\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}","'use strict';\n\nexport default resolve;\nimport { noop, resolve as _resolve } from '../-internal';\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nfunction resolve(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  _resolve(promise, object);\n  return promise;\n}","'use strict';\n\nimport { objectOrFunction, isFunction } from './utils';\n\nimport { asap } from './asap';\n\nimport originalThen from './then';\nimport originalResolve from './promise/resolve';\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nexport { PROMISE_ID };\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n  try {\n    return promise.then;\n  } catch (error) {\n    GET_THEN_ERROR.error = error;\n    return GET_THEN_ERROR;\n  }\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return resolve(promise, value);\n    }, function (reason) {\n      return reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then) {\n  if (maybeThenable.constructor === promise.constructor && then === originalThen && maybeThenable.constructor.resolve === originalResolve) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then === GET_THEN_ERROR) {\n      reject(promise, GET_THEN_ERROR.error);\n    } else if (then === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then)) {\n      handleForeignThenable(promise, maybeThenable, then);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction resolve(promise, value) {\n  if (promise === value) {\n    reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    handleMaybeThenable(promise, value, getThen(value));\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = undefined,\n      callback = undefined,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n  this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n  try {\n    return callback(detail);\n  } catch (e) {\n    TRY_CATCH_ERROR.error = e;\n    return TRY_CATCH_ERROR;\n  }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = undefined,\n      error = undefined,\n      succeeded = undefined,\n      failed = undefined;\n\n  if (hasCallback) {\n    value = tryCatch(callback, detail);\n\n    if (value === TRY_CATCH_ERROR) {\n      failed = true;\n      error = value.error;\n      value = null;\n    } else {\n      succeeded = true;\n    }\n\n    if (promise === value) {\n      reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n    succeeded = true;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n      resolve(promise, value);\n    } else if (failed) {\n      reject(promise, error);\n    } else if (settled === FULFILLED) {\n      fulfill(promise, value);\n    } else if (settled === REJECTED) {\n      reject(promise, value);\n    }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      resolve(promise, value);\n    }, function rejectPromise(reason) {\n      reject(promise, reason);\n    });\n  } catch (e) {\n    reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nexport { nextId, makePromise, getThen, noop, resolve, reject, fulfill, subscribe, publish, publishRejection, initializePromise, invokeCallback, FULFILLED, REJECTED, PENDING, handleMaybeThenable };","'use strict';\n\nimport { isArray, isMaybeThenable } from './utils';\n\nimport { noop, reject, fulfill, subscribe, FULFILLED, REJECTED, PENDING, getThen, handleMaybeThenable } from './-internal';\n\nimport then from './then';\nimport Promise from './promise';\nimport originalResolve from './promise/resolve';\nimport originalThen from './then';\nimport { makePromise, PROMISE_ID } from './-internal';\n\nexport default Enumerator;\nfunction Enumerator(Constructor, input) {\n  this._instanceConstructor = Constructor;\n  this.promise = new Constructor(noop);\n\n  if (!this.promise[PROMISE_ID]) {\n    makePromise(this.promise);\n  }\n\n  if (isArray(input)) {\n    this._input = input;\n    this.length = input.length;\n    this._remaining = input.length;\n\n    this._result = new Array(this.length);\n\n    if (this.length === 0) {\n      fulfill(this.promise, this._result);\n    } else {\n      this.length = this.length || 0;\n      this._enumerate();\n      if (this._remaining === 0) {\n        fulfill(this.promise, this._result);\n      }\n    }\n  } else {\n    reject(this.promise, validationError());\n  }\n}\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n};\n\nEnumerator.prototype._enumerate = function () {\n  var length = this.length;\n  var _input = this._input;\n\n  for (var i = 0; this._state === PENDING && i < length; i++) {\n    this._eachEntry(_input[i], i);\n  }\n};\n\nEnumerator.prototype._eachEntry = function (entry, i) {\n  var c = this._instanceConstructor;\n  var resolve = c.resolve;\n\n  if (resolve === originalResolve) {\n    var _then = getThen(entry);\n\n    if (_then === originalThen && entry._state !== PENDING) {\n      this._settledAt(entry._state, i, entry._result);\n    } else if (typeof _then !== 'function') {\n      this._remaining--;\n      this._result[i] = entry;\n    } else if (c === Promise) {\n      var promise = new c(noop);\n      handleMaybeThenable(promise, entry, _then);\n      this._willSettleAt(promise, i);\n    } else {\n      this._willSettleAt(new c(function (resolve) {\n        return resolve(entry);\n      }), i);\n    }\n  } else {\n    this._willSettleAt(resolve(entry), i);\n  }\n};\n\nEnumerator.prototype._settledAt = function (state, i, value) {\n  var promise = this.promise;\n\n  if (promise._state === PENDING) {\n    this._remaining--;\n\n    if (state === REJECTED) {\n      reject(promise, value);\n    } else {\n      this._result[i] = value;\n    }\n  }\n\n  if (this._remaining === 0) {\n    fulfill(promise, this._result);\n  }\n};\n\nEnumerator.prototype._willSettleAt = function (promise, i) {\n  var enumerator = this;\n\n  subscribe(promise, undefined, function (value) {\n    return enumerator._settledAt(FULFILLED, i, value);\n  }, function (reason) {\n    return enumerator._settledAt(REJECTED, i, reason);\n  });\n};","'use strict';\n\nexport default all;\nimport Enumerator from '../enumerator';\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nfunction all(entries) {\n  return new Enumerator(this, entries).promise;\n}","\"use strict\";\n\nexport default race;\nimport { isArray } from \"../utils\";\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nfunction race(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}","'use strict';\n\nexport default reject;\nimport { noop, reject as _reject } from '../-internal';\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  _reject(promise, reason);\n  return promise;\n}","'use strict';\n\nexport default Promise;\n\nimport { isFunction } from './utils';\n\nimport { noop, nextId, PROMISE_ID, initializePromise } from './-internal';\n\nimport { asap, setAsap, setScheduler } from './asap';\n\nimport all from './promise/all';\nimport race from './promise/race';\nimport Resolve from './promise/resolve';\nimport Reject from './promise/reject';\nimport then from './then';\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {function} resolver\n  Useful for tooling.\n  @constructor\n*/\nfunction Promise(resolver) {\n  this[PROMISE_ID] = nextId();\n  this._result = this._state = undefined;\n  this._subscribers = [];\n\n  if (noop !== resolver) {\n    typeof resolver !== 'function' && needsResolver();\n    this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n  }\n}\n\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = Resolve;\nPromise.reject = Reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;\n\nPromise.prototype = {\n  constructor: Promise,\n\n  /**\n    The primary way of interacting with a promise is through its `then` method,\n    which registers callbacks to receive either a promise's eventual value or the\n    reason why the promise cannot be fulfilled.\n  \n    ```js\n    findUser().then(function(user){\n      // user is available\n    }, function(reason){\n      // user is unavailable, and you are given the reason why\n    });\n    ```\n  \n    Chaining\n    --------\n  \n    The return value of `then` is itself a promise.  This second, 'downstream'\n    promise is resolved with the return value of the first promise's fulfillment\n    or rejection handler, or rejected if the handler throws an exception.\n  \n    ```js\n    findUser().then(function (user) {\n      return user.name;\n    }, function (reason) {\n      return 'default name';\n    }).then(function (userName) {\n      // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n      // will be `'default name'`\n    });\n  \n    findUser().then(function (user) {\n      throw new Error('Found user, but still unhappy');\n    }, function (reason) {\n      throw new Error('`findUser` rejected and we're unhappy');\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n      // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n    });\n    ```\n    If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n  \n    ```js\n    findUser().then(function (user) {\n      throw new PedagogicalException('Upstream error');\n    }).then(function (value) {\n      // never reached\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // The `PedgagocialException` is propagated all the way down to here\n    });\n    ```\n  \n    Assimilation\n    ------------\n  \n    Sometimes the value you want to propagate to a downstream promise can only be\n    retrieved asynchronously. This can be achieved by returning a promise in the\n    fulfillment or rejection handler. The downstream promise will then be pending\n    until the returned promise is settled. This is called *assimilation*.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // The user's comments are now available\n    });\n    ```\n  \n    If the assimliated promise rejects, then the downstream promise will also reject.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // If `findCommentsByAuthor` fulfills, we'll have the value here\n    }, function (reason) {\n      // If `findCommentsByAuthor` rejects, we'll have the reason here\n    });\n    ```\n  \n    Simple Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let result;\n  \n    try {\n      result = findResult();\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n    findResult(function(result, err){\n      if (err) {\n        // failure\n      } else {\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findResult().then(function(result){\n      // success\n    }, function(reason){\n      // failure\n    });\n    ```\n  \n    Advanced Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let author, books;\n  \n    try {\n      author = findAuthor();\n      books  = findBooksByAuthor(author);\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n  \n    function foundBooks(books) {\n  \n    }\n  \n    function failure(reason) {\n  \n    }\n  \n    findAuthor(function(author, err){\n      if (err) {\n        failure(err);\n        // failure\n      } else {\n        try {\n          findBoooksByAuthor(author, function(books, err) {\n            if (err) {\n              failure(err);\n            } else {\n              try {\n                foundBooks(books);\n              } catch(reason) {\n                failure(reason);\n              }\n            }\n          });\n        } catch(error) {\n          failure(err);\n        }\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findAuthor().\n      then(findBooksByAuthor).\n      then(function(books){\n        // found books\n    }).catch(function(reason){\n      // something went wrong\n    });\n    ```\n  \n    @method then\n    @param {Function} onFulfilled\n    @param {Function} onRejected\n    Useful for tooling.\n    @return {Promise}\n  */\n  then: then,\n\n  /**\n    `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n    as the catch block of a try/catch statement.\n  \n    ```js\n    function findAuthor(){\n      throw new Error('couldn't find that author');\n    }\n  \n    // synchronous\n    try {\n      findAuthor();\n    } catch(reason) {\n      // something went wrong\n    }\n  \n    // async with promises\n    findAuthor().catch(function(reason){\n      // something went wrong\n    });\n    ```\n  \n    @method catch\n    @param {Function} onRejection\n    Useful for tooling.\n    @return {Promise}\n  */\n  'catch': function _catch(onRejection) {\n    return this.then(null, onRejection);\n  }\n};","/*global self*/\n'use strict';\n\nexport default polyfill;\nimport Promise from './promise';\nfunction polyfill() {\n    var local = undefined;\n\n    if (typeof global !== 'undefined') {\n        local = global;\n    } else if (typeof self !== 'undefined') {\n        local = self;\n    } else {\n        try {\n            local = Function('return this')();\n        } catch (e) {\n            throw new Error('polyfill failed because global object is unavailable in this environment');\n        }\n    }\n\n    var P = local.Promise;\n\n    if (P) {\n        var promiseToString = null;\n        try {\n            promiseToString = Object.prototype.toString.call(P.resolve());\n        } catch (e) {\n            // silently ignored\n        }\n\n        if (promiseToString === '[object Promise]' && !P.cast) {\n            return;\n        }\n    }\n\n    local.Promise = Promise;\n}","'use strict';\n\nimport Promise from './es6-promise/promise';\nimport polyfill from './es6-promise/polyfill';\n\npolyfill();\n// Strange compat..\nPromise.polyfill = polyfill;\nPromise.Promise = Promise;\nexport default Promise;"],"names":["reject","resolve","originalResolve","originalThen","then","Resolve","Reject"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACAA,SAAS,gBAAgB,CAAC,CAAC,EAAE;EAC3B,OAAO,OAAO,CAAC,KAAK,UAAU,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC;CACvE;;AAED,SAAS,UAAU,CAAC,CAAC,EAAE;EACrB,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC;CAChC;;AAED,AAIA,IAAI,QAAQ,GAAG,SAAS,CAAC;AACzB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;EAClB,QAAQ,GAAG,UAAU,CAAC,EAAE;IACtB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC;GAC/D,CAAC;CACH,MAAM;EACL,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;CAC1B;;AAED,IAAI,OAAO,GAAG,QAAQ,CAAC,AACvB;;ACxBA,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAI,SAAS,GAAG,SAAS,CAAC;AAC1B,IAAI,iBAAiB,GAAG,SAAS,CAAC;;AAElC,IAAI,IAAI,GAAG,SAAS,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;EACtC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;EACtB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;EACrB,GAAG,IAAI,CAAC,CAAC;EACT,IAAI,GAAG,KAAK,CAAC,EAAE;;;;IAIb,IAAI,iBAAiB,EAAE;MACrB,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC1B,MAAM;MACL,aAAa,EAAE,CAAC;KACjB;GACF;CACF,CAAC;;AAEF,AAEA,SAAS,YAAY,CAAC,UAAU,EAAE;EAChC,iBAAiB,GAAG,UAAU,CAAC;CAChC;;AAED,SAAS,OAAO,CAAC,MAAM,EAAE;EACvB,IAAI,GAAG,MAAM,CAAC;CACf;;AAED,IAAI,aAAa,GAAG,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACvE,IAAI,aAAa,GAAG,aAAa,IAAI,EAAE,CAAC;AACxC,IAAI,uBAAuB,GAAG,aAAa,CAAC,gBAAgB,IAAI,aAAa,CAAC,sBAAsB,CAAC;AACrG,IAAI,MAAM,GAAG,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,kBAAkB,CAAC;;;AAGjI,IAAI,QAAQ,GAAG,OAAO,iBAAiB,KAAK,WAAW,IAAI,OAAO,aAAa,KAAK,WAAW,IAAI,OAAO,cAAc,KAAK,WAAW,CAAC;;;AAGzI,SAAS,WAAW,GAAG;;;EAGrB,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;GAChC,CAAC;CACH;;;AAGD,SAAS,aAAa,GAAG;EACvB,OAAO,YAAY;IACjB,SAAS,CAAC,KAAK,CAAC,CAAC;GAClB,CAAC;CACH;;AAED,SAAS,mBAAmB,GAAG;EAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;EACnB,IAAI,QAAQ,GAAG,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;EAClD,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;EACvC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;;EAEhD,OAAO,YAAY;IACjB,IAAI,CAAC,IAAI,GAAG,UAAU,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC;GAC3C,CAAC;CACH;;;AAGD,SAAS,iBAAiB,GAAG;EAC3B,IAAI,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;EACnC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;EAChC,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;GACrC,CAAC;CACH;;AAED,SAAS,aAAa,GAAG;;;EAGvB,IAAI,gBAAgB,GAAG,UAAU,CAAC;EAClC,OAAO,YAAY;IACjB,OAAO,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;GACnC,CAAC;CACH;;AAED,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,SAAS,KAAK,GAAG;EACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;IAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;IAEvB,QAAQ,CAAC,GAAG,CAAC,CAAC;;IAEd,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACrB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;GAC1B;;EAED,GAAG,GAAG,CAAC,CAAC;CACT;;AAED,SAAS,YAAY,GAAG;EACtB,IAAI;IACF,IAAI,CAAC,GAAG,OAAO,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACvB,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY,CAAC;IAClD,OAAO,aAAa,EAAE,CAAC;GACxB,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,aAAa,EAAE,CAAC;GACxB;CACF;;AAED,IAAI,aAAa,GAAG,SAAS,CAAC;;AAE9B,IAAI,MAAM,EAAE;EACV,aAAa,GAAG,WAAW,EAAE,CAAC;CAC/B,MAAM,IAAI,uBAAuB,EAAE;EAClC,aAAa,GAAG,mBAAmB,EAAE,CAAC;CACvC,MAAM,IAAI,QAAQ,EAAE;EACnB,aAAa,GAAG,iBAAiB,EAAE,CAAC;CACrC,MAAM,IAAI,aAAa,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;EACvE,aAAa,GAAG,YAAY,EAAE,CAAC;CAChC,MAAM;EACL,aAAa,GAAG,aAAa,EAAE,CAAC;;;ACtHlC,SAAS,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE;EACxC,IAAI,UAAU,GAAG,SAAS,CAAC;;EAE3B,IAAI,MAAM,GAAG,IAAI,CAAC;;EAElB,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;;EAEvC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;IACnC,WAAW,CAAC,KAAK,CAAC,CAAC;GACpB;;EAED,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;EAE3B,IAAI,MAAM,EAAE;IACV,CAAC,YAAY;MACX,IAAI,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;MACtC,IAAI,CAAC,YAAY;QACf,OAAO,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;OAChE,CAAC,CAAC;KACJ,CAAC,EAAE,CAAC;GACN,MAAM;IACL,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;GACtD;;EAED,OAAO,KAAK,CAAC;;;ACzBf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,SAAS,OAAO,CAAC,MAAM,EAAE;;EAEvB,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,EAAE;IAC9E,OAAO,MAAM,CAAC;GACf;;EAED,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAC1B,OAAO,OAAO,CAAC;;;ACrCjB,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;;AAE1D,AACA,SAAS,IAAI,GAAG,EAAE;;AAElB,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC;AACrB,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;;AAEjB,IAAI,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC;;AAEvC,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;CAClE;;AAED,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;CAC9E;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE;EACxB,IAAI;IACF,OAAO,OAAO,CAAC,IAAI,CAAC;GACrB,CAAC,OAAO,KAAK,EAAE;IACd,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;IAC7B,OAAO,cAAc,CAAC;GACvB;CACF;;AAED,SAAS,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE;EAClE,IAAI;IACF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;GACxD,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,CAAC;GACV;CACF;;AAED,SAAS,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;EACtD,IAAI,CAAC,UAAU,OAAO,EAAE;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,KAAK,EAAE;MACnD,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;MACd,IAAI,QAAQ,KAAK,KAAK,EAAE;QACtBC,QAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB,MAAM;QACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB;KACF,EAAE,UAAU,MAAM,EAAE;MACnB,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;;MAEdD,OAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC;;IAExD,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE;MACpB,MAAM,GAAG,IAAI,CAAC;MACdA,OAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB;GACF,EAAE,OAAO,CAAC,CAAC;CACb;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE;IACjC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACpC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;IACvCA,OAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACnC,MAAM;IACL,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;MAC9C,OAAOC,QAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KAChC,EAAE,UAAU,MAAM,EAAE;MACnB,OAAOD,OAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC,CAAC;GACJ;CACF;;AAED,SAAS,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAEI,MAAI,EAAE;EACzD,IAAI,aAAa,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,IAAIA,MAAI,KAAKD,IAAY,IAAI,aAAa,CAAC,WAAW,CAAC,OAAO,KAAKD,OAAe,EAAE;IACvI,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;GAC3C,MAAM;IACL,IAAIE,MAAI,KAAK,cAAc,EAAE;MAC3BJ,OAAM,CAAC,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;KACvC,MAAM,IAAII,MAAI,KAAK,SAAS,EAAE;MAC7B,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC,MAAM,IAAI,UAAU,CAACA,MAAI,CAAC,EAAE;MAC3B,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAEA,MAAI,CAAC,CAAC;KACrD,MAAM;MACL,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC;GACF;CACF;;AAED,SAASH,QAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,KAAK,KAAK,EAAE;IACrBD,OAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;GACpC,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;IAClC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;GACrD,MAAM;IACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB;CACF;;AAED,SAAS,gBAAgB,CAAC,OAAO,EAAE;EACjC,IAAI,OAAO,CAAC,QAAQ,EAAE;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;GACnC;;EAED,OAAO,CAAC,OAAO,CAAC,CAAC;CAClB;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;;EAED,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;EACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;EAE3B,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;IACrC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;GACxB;CACF;;AAED,SAASA,OAAM,CAAC,OAAO,EAAE,MAAM,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;EACD,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;EAC1B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;;EAEzB,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;CACjC;;AAED,SAAS,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE;EAC5D,IAAI,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;EACvC,IAAI,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;;EAEjC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;;EAEvB,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;EAC7B,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,aAAa,CAAC;EACjD,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC;;EAE9C,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;GACvB;CACF;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE;EACxB,IAAI,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;EACvC,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;;EAE7B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;IAC5B,OAAO;GACR;;EAED,IAAI,KAAK,GAAG,SAAS;MACjB,QAAQ,GAAG,SAAS;MACpB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;;EAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;IAC9C,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;;IAEpC,IAAI,KAAK,EAAE;MACT,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;KAClD,MAAM;MACL,QAAQ,CAAC,MAAM,CAAC,CAAC;KAClB;GACF;;EAED,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;CACjC;;AAED,SAAS,WAAW,GAAG;EACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB;;AAED,IAAI,eAAe,GAAG,IAAI,WAAW,EAAE,CAAC;;AAExC,SAAS,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE;EAClC,IAAI;IACF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;GACzB,CAAC,OAAO,CAAC,EAAE;IACV,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;IAC1B,OAAO,eAAe,CAAC;GACxB;CACF;;AAED,SAAS,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;EAC1D,IAAI,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;MAClC,KAAK,GAAG,SAAS;MACjB,KAAK,GAAG,SAAS;MACjB,SAAS,GAAG,SAAS;MACrB,MAAM,GAAG,SAAS,CAAC;;EAEvB,IAAI,WAAW,EAAE;IACf,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;;IAEnC,IAAI,KAAK,KAAK,eAAe,EAAE;MAC7B,MAAM,GAAG,IAAI,CAAC;MACd,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;MACpB,KAAK,GAAG,IAAI,CAAC;KACd,MAAM;MACL,SAAS,GAAG,IAAI,CAAC;KAClB;;IAED,IAAI,OAAO,KAAK,KAAK,EAAE;MACrBA,OAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;MACnC,OAAO;KACR;GACF,MAAM;IACL,KAAK,GAAG,MAAM,CAAC;IACf,SAAS,GAAG,IAAI,CAAC;GAClB;;EAED,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;;GAE/B,MAAM,IAAI,WAAW,IAAI,SAAS,EAAE;MACjCC,QAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACzB,MAAM,IAAI,MAAM,EAAE;MACjBD,OAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB,MAAM,IAAI,OAAO,KAAK,SAAS,EAAE;MAChC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACzB,MAAM,IAAI,OAAO,KAAK,QAAQ,EAAE;MAC/BA,OAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB;CACJ;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI;IACF,QAAQ,CAAC,SAAS,cAAc,CAAC,KAAK,EAAE;MACtCC,QAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACzB,EAAE,SAAS,aAAa,CAAC,MAAM,EAAE;MAChCD,OAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,CAAC,CAAC;GACJ,CAAC,OAAO,CAAC,EAAE;IACVA,OAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;GACpB;CACF;;AAED,IAAI,EAAE,GAAG,CAAC,CAAC;AACX,SAAS,MAAM,GAAG;EAChB,OAAO,EAAE,EAAE,CAAC;CACb;;AAED,SAAS,WAAW,CAAC,OAAO,EAAE;EAC5B,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;EAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;EAC3B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;EAC5B,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;CAC3B,AAED;;AC5PA,SAAS,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE;EACtC,IAAI,CAAC,oBAAoB,GAAG,WAAW,CAAC;EACxC,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;;EAErC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;IAC7B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;GAC3B;;EAED,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;IAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;;IAE/B,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;IAEtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;MACrB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KACrC,MAAM;MACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;MAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;MAClB,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;OACrC;KACF;GACF,MAAM;IACLA,OAAM,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;GACzC;CACF;;AAED,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;CAC7D,CAAC;;AAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,YAAY;EAC5C,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;EACzB,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;EAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;IAC1D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;GAC/B;CACF,CAAC;;AAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,KAAK,EAAE,CAAC,EAAE;EACpD,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC;EAClC,IAAIC,SAAO,GAAG,CAAC,CAAC,OAAO,CAAC;;EAExB,IAAIA,SAAO,KAAKC,OAAe,EAAE;IAC/B,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;;IAE3B,IAAI,KAAK,KAAKC,IAAY,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;MACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;KACjD,MAAM,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;MACtC,IAAI,CAAC,UAAU,EAAE,CAAC;MAClB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;KACzB,MAAM,IAAI,CAAC,KAAK,OAAO,EAAE;MACxB,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;MAC1B,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;MAC3C,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;KAChC,MAAM;MACL,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,UAAUF,SAAO,EAAE;QAC1C,OAAOA,SAAO,CAAC,KAAK,CAAC,CAAC;OACvB,CAAC,EAAE,CAAC,CAAC,CAAC;KACR;GACF,MAAM;IACL,IAAI,CAAC,aAAa,CAACA,SAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;GACvC;CACF,CAAC;;AAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;EAC3D,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;EAE3B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;;IAElB,IAAI,KAAK,KAAK,QAAQ,EAAE;MACtBD,OAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB,MAAM;MACL,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;KACzB;GACF;;EAED,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;IACzB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;GAChC;CACF,CAAC;;AAEF,UAAU,CAAC,SAAS,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,CAAC,EAAE;EACzD,IAAI,UAAU,GAAG,IAAI,CAAC;;EAEtB,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;IAC7C,OAAO,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;GACnD,EAAE,UAAU,MAAM,EAAE;IACnB,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;GACnD,CAAC,CAAC;CACJ;;ACtGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,SAAS,GAAG,CAAC,OAAO,EAAE;EACpB,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;;;AChD/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,SAAS,IAAI,CAAC,OAAO,EAAE;;EAErB,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;IACrB,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE;MAC1C,OAAO,MAAM,CAAC,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC,CAAC;KACjE,CAAC,CAAC;GACJ,MAAM;IACL,OAAO,IAAI,WAAW,CAAC,UAAU,OAAO,EAAE,MAAM,EAAE;MAChD,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;MAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAC/B,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;OACvD;KACF,CAAC,CAAC;GACJ;;;AChFH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,SAAS,MAAM,CAAC,MAAM,EAAE;;EAEtB,IAAI,WAAW,GAAG,IAAI,CAAC;EACvB,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACzB,OAAO,OAAO,CAAC;;;AC5BjB,SAAS,aAAa,GAAG;EACvB,MAAM,IAAI,SAAS,CAAC,oFAAoF,CAAC,CAAC;CAC3G;;AAED,SAAS,QAAQ,GAAG;EAClB,MAAM,IAAI,SAAS,CAAC,uHAAuH,CAAC,CAAC;CAC9I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyGD,SAAS,OAAO,CAAC,QAAQ,EAAE;EACzB,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAAC;EAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;EACvC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;EAEvB,IAAI,IAAI,KAAK,QAAQ,EAAE;IACrB,OAAO,QAAQ,KAAK,UAAU,IAAI,aAAa,EAAE,CAAC;IAClD,IAAI,YAAY,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC;GAC1E;CACF;;AAED,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAClB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AACpB,OAAO,CAAC,OAAO,GAAGK,OAAO,CAAC;AAC1B,OAAO,CAAC,MAAM,GAAGC,MAAM,CAAC;AACxB,OAAO,CAAC,aAAa,GAAG,YAAY,CAAC;AACrC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;AAC3B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;;AAErB,OAAO,CAAC,SAAS,GAAG;EAClB,WAAW,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmMpB,IAAI,EAAE,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BV,OAAO,EAAE,SAAS,MAAM,CAAC,WAAW,EAAE;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;GACrC;CACF;;ACjXD,SAAS,QAAQ,GAAG;IAChB,IAAI,KAAK,GAAG,SAAS,CAAC;;IAEtB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QAC/B,KAAK,GAAG,MAAM,CAAC;KAClB,MAAM,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;QACpC,KAAK,GAAG,IAAI,CAAC;KAChB,MAAM;QACH,IAAI;YACA,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;SACrC,CAAC,OAAO,CAAC,EAAE;YACR,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;SAC/F;KACJ;;IAED,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;;IAEtB,IAAI,CAAC,EAAE;QACH,IAAI,eAAe,GAAG,IAAI,CAAC;QAC3B,IAAI;YACA,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;SACjE,CAAC,OAAO,CAAC,EAAE;;SAEX;;QAED,IAAI,eAAe,KAAK,kBAAkB,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;YACnD,OAAO;SACV;KACJ;;IAED,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;;;AC9B5B,QAAQ,EAAE,CAAC;;AAEX,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC5B,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,AAC1B,;;,;;;","file":"es6-promise.js"}
\ No newline at end of file
diff --git a/js/node_modules/es6-promise/dist/es6-promise.min.js b/js/node_modules/es6-promise/dist/es6-promise.min.js
deleted file mode 100644
index 86440321546341292297e27795f08103902ee015..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/dist/es6-promise.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.ES6Promise=e()}(this,function(){"use strict";function t(t){return"function"==typeof t||"object"==typeof t&&null!==t}function e(t){return"function"==typeof t}function n(t){I=t}function r(t){J=t}function o(){return function(){return process.nextTick(a)}}function i(){return function(){H(a)}}function s(){var t=0,e=new V(a),n=document.createTextNode("");return e.observe(n,{characterData:!0}),function(){n.data=t=++t%2}}function u(){var t=new MessageChannel;return t.port1.onmessage=a,function(){return t.port2.postMessage(0)}}function c(){var t=setTimeout;return function(){return t(a,1)}}function a(){for(var t=0;t<G;t+=2){var e=$[t],n=$[t+1];e(n),$[t]=void 0,$[t+1]=void 0}G=0}function f(){try{var t=require,e=t("vertx");return H=e.runOnLoop||e.runOnContext,i()}catch(n){return c()}}function l(t,e){var n=arguments,r=this,o=new this.constructor(p);void 0===o[et]&&k(o);var i=r._state;return i?!function(){var t=n[i-1];J(function(){return x(i,o,t,r._result)})}():E(r,o,t,e),o}function h(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)return t;var n=new e(p);return g(n,t),n}function p(){}function v(){return new TypeError("You cannot resolve a promise with itself")}function d(){return new TypeError("A promises callback cannot return that same promise.")}function _(t){try{return t.then}catch(e){return it.error=e,it}}function y(t,e,n,r){try{t.call(e,n,r)}catch(o){return o}}function m(t,e,n){J(function(t){var r=!1,o=y(n,e,function(n){r||(r=!0,e!==n?g(t,n):S(t,n))},function(e){r||(r=!0,j(t,e))},"Settle: "+(t._label||" unknown promise"));!r&&o&&(r=!0,j(t,o))},t)}function b(t,e){e._state===rt?S(t,e._result):e._state===ot?j(t,e._result):E(e,void 0,function(e){return g(t,e)},function(e){return j(t,e)})}function w(t,n,r){n.constructor===t.constructor&&r===l&&n.constructor.resolve===h?b(t,n):r===it?j(t,it.error):void 0===r?S(t,n):e(r)?m(t,n,r):S(t,n)}function g(e,n){e===n?j(e,v()):t(n)?w(e,n,_(n)):S(e,n)}function A(t){t._onerror&&t._onerror(t._result),T(t)}function S(t,e){t._state===nt&&(t._result=e,t._state=rt,0!==t._subscribers.length&&J(T,t))}function j(t,e){t._state===nt&&(t._state=ot,t._result=e,J(A,t))}function E(t,e,n,r){var o=t._subscribers,i=o.length;t._onerror=null,o[i]=e,o[i+rt]=n,o[i+ot]=r,0===i&&t._state&&J(T,t)}function T(t){var e=t._subscribers,n=t._state;if(0!==e.length){for(var r=void 0,o=void 0,i=t._result,s=0;s<e.length;s+=3)r=e[s],o=e[s+n],r?x(n,r,o,i):o(i);t._subscribers.length=0}}function M(){this.error=null}function P(t,e){try{return t(e)}catch(n){return st.error=n,st}}function x(t,n,r,o){var i=e(r),s=void 0,u=void 0,c=void 0,a=void 0;if(i){if(s=P(r,o),s===st?(a=!0,u=s.error,s=null):c=!0,n===s)return void j(n,d())}else s=o,c=!0;n._state!==nt||(i&&c?g(n,s):a?j(n,u):t===rt?S(n,s):t===ot&&j(n,s))}function C(t,e){try{e(function(e){g(t,e)},function(e){j(t,e)})}catch(n){j(t,n)}}function O(){return ut++}function k(t){t[et]=ut++,t._state=void 0,t._result=void 0,t._subscribers=[]}function Y(t,e){this._instanceConstructor=t,this.promise=new t(p),this.promise[et]||k(this.promise),B(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?S(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&S(this.promise,this._result))):j(this.promise,q())}function q(){return new Error("Array Methods must be provided an Array")}function F(t){return new Y(this,t).promise}function D(t){var e=this;return new e(B(t)?function(n,r){for(var o=t.length,i=0;i<o;i++)e.resolve(t[i]).then(n,r)}:function(t,e){return e(new TypeError("You must pass an array to race."))})}function K(t){var e=this,n=new e(p);return j(n,t),n}function L(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function N(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function U(t){this[et]=O(),this._result=this._state=void 0,this._subscribers=[],p!==t&&("function"!=typeof t&&L(),this instanceof U?C(this,t):N())}function W(){var t=void 0;if("undefined"!=typeof global)t=global;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var n=t.Promise;if(n){var r=null;try{r=Object.prototype.toString.call(n.resolve())}catch(e){}if("[object Promise]"===r&&!n.cast)return}t.Promise=U}var z=void 0;z=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var B=z,G=0,H=void 0,I=void 0,J=function(t,e){$[G]=t,$[G+1]=e,G+=2,2===G&&(I?I(a):tt())},Q="undefined"!=typeof window?window:void 0,R=Q||{},V=R.MutationObserver||R.WebKitMutationObserver,X="undefined"==typeof self&&"undefined"!=typeof process&&"[object process]"==={}.toString.call(process),Z="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,$=new Array(1e3),tt=void 0;tt=X?o():V?s():Z?u():void 0===Q&&"function"==typeof require?f():c();var et=Math.random().toString(36).substring(16),nt=void 0,rt=1,ot=2,it=new M,st=new M,ut=0;return Y.prototype._enumerate=function(){for(var t=this.length,e=this._input,n=0;this._state===nt&&n<t;n++)this._eachEntry(e[n],n)},Y.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===h){var o=_(t);if(o===l&&t._state!==nt)this._settledAt(t._state,e,t._result);else if("function"!=typeof o)this._remaining--,this._result[e]=t;else if(n===U){var i=new n(p);w(i,t,o),this._willSettleAt(i,e)}else this._willSettleAt(new n(function(e){return e(t)}),e)}else this._willSettleAt(r(t),e)},Y.prototype._settledAt=function(t,e,n){var r=this.promise;r._state===nt&&(this._remaining--,t===ot?j(r,n):this._result[e]=n),0===this._remaining&&S(r,this._result)},Y.prototype._willSettleAt=function(t,e){var n=this;E(t,void 0,function(t){return n._settledAt(rt,e,t)},function(t){return n._settledAt(ot,e,t)})},U.all=F,U.race=D,U.resolve=h,U.reject=K,U._setScheduler=n,U._setAsap=r,U._asap=J,U.prototype={constructor:U,then:l,"catch":function(t){return this.then(null,t)}},W(),U.polyfill=W,U.Promise=U,U});
\ No newline at end of file
diff --git a/js/node_modules/es6-promise/dist/es6-promise.min.map b/js/node_modules/es6-promise/dist/es6-promise.min.map
deleted file mode 100644
index 0a5026ea6674dfb90e78ba8a44d0d74fbbf9482a..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/dist/es6-promise.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"sources":["config/versionTemplate.txt","lib/es6-promise/utils.js","lib/es6-promise/asap.js","lib/es6-promise/then.js","lib/es6-promise/promise/resolve.js","lib/es6-promise/-internal.js","lib/es6-promise/enumerator.js","lib/es6-promise/promise/all.js","lib/es6-promise/promise/race.js","lib/es6-promise/promise/reject.js","lib/es6-promise/promise.js","lib/es6-promise/polyfill.js","lib/es6-promise.js"],"sourcesContent":["/*!\n * @overview es6-promise - a tiny implementation of Promises/A+.\n * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)\n * @license   Licensed under MIT license\n *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE\n * @version   3.3.1\n */\n","'use strict';\n\nexport { objectOrFunction };\nexport { isFunction };\nexport { isMaybeThenable };\n\nfunction objectOrFunction(x) {\n  return typeof x === 'function' || typeof x === 'object' && x !== null;\n}\n\nfunction isFunction(x) {\n  return typeof x === 'function';\n}\n\nfunction isMaybeThenable(x) {\n  return typeof x === 'object' && x !== null;\n}\n\nvar _isArray = undefined;\nif (!Array.isArray) {\n  _isArray = function (x) {\n    return Object.prototype.toString.call(x) === '[object Array]';\n  };\n} else {\n  _isArray = Array.isArray;\n}\n\nvar isArray = _isArray;\nexport { isArray };","'use strict';\n\nexport { setScheduler };\nexport { setAsap };\nvar len = 0;\nvar vertxNext = undefined;\nvar customSchedulerFn = undefined;\n\nvar asap = function asap(callback, arg) {\n  queue[len] = callback;\n  queue[len + 1] = arg;\n  len += 2;\n  if (len === 2) {\n    // If len is 2, that means that we need to schedule an async flush.\n    // If additional callbacks are queued before the queue is flushed, they\n    // will be processed by this flush that we are scheduling.\n    if (customSchedulerFn) {\n      customSchedulerFn(flush);\n    } else {\n      scheduleFlush();\n    }\n  }\n};\n\nexport { asap };\n\nfunction setScheduler(scheduleFn) {\n  customSchedulerFn = scheduleFn;\n}\n\nfunction setAsap(asapFn) {\n  asap = asapFn;\n}\n\nvar browserWindow = typeof window !== 'undefined' ? window : undefined;\nvar browserGlobal = browserWindow || {};\nvar BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\nvar isNode = typeof self === 'undefined' && typeof process !== 'undefined' && ({}).toString.call(process) === '[object process]';\n\n// test for web worker but not in IE10\nvar isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n// node\nfunction useNextTick() {\n  // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n  // see https://github.com/cujojs/when/issues/410 for details\n  return function () {\n    return process.nextTick(flush);\n  };\n}\n\n// vertx\nfunction useVertxTimer() {\n  return function () {\n    vertxNext(flush);\n  };\n}\n\nfunction useMutationObserver() {\n  var iterations = 0;\n  var observer = new BrowserMutationObserver(flush);\n  var node = document.createTextNode('');\n  observer.observe(node, { characterData: true });\n\n  return function () {\n    node.data = iterations = ++iterations % 2;\n  };\n}\n\n// web worker\nfunction useMessageChannel() {\n  var channel = new MessageChannel();\n  channel.port1.onmessage = flush;\n  return function () {\n    return channel.port2.postMessage(0);\n  };\n}\n\nfunction useSetTimeout() {\n  // Store setTimeout reference so es6-promise will be unaffected by\n  // other code modifying setTimeout (like sinon.useFakeTimers())\n  var globalSetTimeout = setTimeout;\n  return function () {\n    return globalSetTimeout(flush, 1);\n  };\n}\n\nvar queue = new Array(1000);\nfunction flush() {\n  for (var i = 0; i < len; i += 2) {\n    var callback = queue[i];\n    var arg = queue[i + 1];\n\n    callback(arg);\n\n    queue[i] = undefined;\n    queue[i + 1] = undefined;\n  }\n\n  len = 0;\n}\n\nfunction attemptVertx() {\n  try {\n    var r = require;\n    var vertx = r('vertx');\n    vertxNext = vertx.runOnLoop || vertx.runOnContext;\n    return useVertxTimer();\n  } catch (e) {\n    return useSetTimeout();\n  }\n}\n\nvar scheduleFlush = undefined;\n// Decide what async method to use to triggering processing of queued callbacks:\nif (isNode) {\n  scheduleFlush = useNextTick();\n} else if (BrowserMutationObserver) {\n  scheduleFlush = useMutationObserver();\n} else if (isWorker) {\n  scheduleFlush = useMessageChannel();\n} else if (browserWindow === undefined && typeof require === 'function') {\n  scheduleFlush = attemptVertx();\n} else {\n  scheduleFlush = useSetTimeout();\n}","'use strict';\n\nexport default then;\nimport { invokeCallback, subscribe, FULFILLED, REJECTED, noop, makePromise, PROMISE_ID } from './-internal';\n\nimport { asap } from './asap';\nfunction then(onFulfillment, onRejection) {\n  var _arguments = arguments;\n\n  var parent = this;\n\n  var child = new this.constructor(noop);\n\n  if (child[PROMISE_ID] === undefined) {\n    makePromise(child);\n  }\n\n  var _state = parent._state;\n\n  if (_state) {\n    (function () {\n      var callback = _arguments[_state - 1];\n      asap(function () {\n        return invokeCallback(_state, child, callback, parent._result);\n      });\n    })();\n  } else {\n    subscribe(parent, child, onFulfillment, onRejection);\n  }\n\n  return child;\n}","'use strict';\n\nexport default resolve;\nimport { noop, resolve as _resolve } from '../-internal';\n\n/**\n  `Promise.resolve` returns a promise that will become resolved with the\n  passed `value`. It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    resolve(1);\n  });\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.resolve(1);\n\n  promise.then(function(value){\n    // value === 1\n  });\n  ```\n\n  @method resolve\n  @static\n  @param {Any} value value that the returned promise will be resolved with\n  Useful for tooling.\n  @return {Promise} a promise that will become fulfilled with the given\n  `value`\n*/\nfunction resolve(object) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (object && typeof object === 'object' && object.constructor === Constructor) {\n    return object;\n  }\n\n  var promise = new Constructor(noop);\n  _resolve(promise, object);\n  return promise;\n}","'use strict';\n\nimport { objectOrFunction, isFunction } from './utils';\n\nimport { asap } from './asap';\n\nimport originalThen from './then';\nimport originalResolve from './promise/resolve';\n\nvar PROMISE_ID = Math.random().toString(36).substring(16);\n\nexport { PROMISE_ID };\nfunction noop() {}\n\nvar PENDING = void 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\n\nvar GET_THEN_ERROR = new ErrorObject();\n\nfunction selfFulfillment() {\n  return new TypeError(\"You cannot resolve a promise with itself\");\n}\n\nfunction cannotReturnOwn() {\n  return new TypeError('A promises callback cannot return that same promise.');\n}\n\nfunction getThen(promise) {\n  try {\n    return promise.then;\n  } catch (error) {\n    GET_THEN_ERROR.error = error;\n    return GET_THEN_ERROR;\n  }\n}\n\nfunction tryThen(then, value, fulfillmentHandler, rejectionHandler) {\n  try {\n    then.call(value, fulfillmentHandler, rejectionHandler);\n  } catch (e) {\n    return e;\n  }\n}\n\nfunction handleForeignThenable(promise, thenable, then) {\n  asap(function (promise) {\n    var sealed = false;\n    var error = tryThen(then, thenable, function (value) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n      if (thenable !== value) {\n        resolve(promise, value);\n      } else {\n        fulfill(promise, value);\n      }\n    }, function (reason) {\n      if (sealed) {\n        return;\n      }\n      sealed = true;\n\n      reject(promise, reason);\n    }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n    if (!sealed && error) {\n      sealed = true;\n      reject(promise, error);\n    }\n  }, promise);\n}\n\nfunction handleOwnThenable(promise, thenable) {\n  if (thenable._state === FULFILLED) {\n    fulfill(promise, thenable._result);\n  } else if (thenable._state === REJECTED) {\n    reject(promise, thenable._result);\n  } else {\n    subscribe(thenable, undefined, function (value) {\n      return resolve(promise, value);\n    }, function (reason) {\n      return reject(promise, reason);\n    });\n  }\n}\n\nfunction handleMaybeThenable(promise, maybeThenable, then) {\n  if (maybeThenable.constructor === promise.constructor && then === originalThen && maybeThenable.constructor.resolve === originalResolve) {\n    handleOwnThenable(promise, maybeThenable);\n  } else {\n    if (then === GET_THEN_ERROR) {\n      reject(promise, GET_THEN_ERROR.error);\n    } else if (then === undefined) {\n      fulfill(promise, maybeThenable);\n    } else if (isFunction(then)) {\n      handleForeignThenable(promise, maybeThenable, then);\n    } else {\n      fulfill(promise, maybeThenable);\n    }\n  }\n}\n\nfunction resolve(promise, value) {\n  if (promise === value) {\n    reject(promise, selfFulfillment());\n  } else if (objectOrFunction(value)) {\n    handleMaybeThenable(promise, value, getThen(value));\n  } else {\n    fulfill(promise, value);\n  }\n}\n\nfunction publishRejection(promise) {\n  if (promise._onerror) {\n    promise._onerror(promise._result);\n  }\n\n  publish(promise);\n}\n\nfunction fulfill(promise, value) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n\n  promise._result = value;\n  promise._state = FULFILLED;\n\n  if (promise._subscribers.length !== 0) {\n    asap(publish, promise);\n  }\n}\n\nfunction reject(promise, reason) {\n  if (promise._state !== PENDING) {\n    return;\n  }\n  promise._state = REJECTED;\n  promise._result = reason;\n\n  asap(publishRejection, promise);\n}\n\nfunction subscribe(parent, child, onFulfillment, onRejection) {\n  var _subscribers = parent._subscribers;\n  var length = _subscribers.length;\n\n  parent._onerror = null;\n\n  _subscribers[length] = child;\n  _subscribers[length + FULFILLED] = onFulfillment;\n  _subscribers[length + REJECTED] = onRejection;\n\n  if (length === 0 && parent._state) {\n    asap(publish, parent);\n  }\n}\n\nfunction publish(promise) {\n  var subscribers = promise._subscribers;\n  var settled = promise._state;\n\n  if (subscribers.length === 0) {\n    return;\n  }\n\n  var child = undefined,\n      callback = undefined,\n      detail = promise._result;\n\n  for (var i = 0; i < subscribers.length; i += 3) {\n    child = subscribers[i];\n    callback = subscribers[i + settled];\n\n    if (child) {\n      invokeCallback(settled, child, callback, detail);\n    } else {\n      callback(detail);\n    }\n  }\n\n  promise._subscribers.length = 0;\n}\n\nfunction ErrorObject() {\n  this.error = null;\n}\n\nvar TRY_CATCH_ERROR = new ErrorObject();\n\nfunction tryCatch(callback, detail) {\n  try {\n    return callback(detail);\n  } catch (e) {\n    TRY_CATCH_ERROR.error = e;\n    return TRY_CATCH_ERROR;\n  }\n}\n\nfunction invokeCallback(settled, promise, callback, detail) {\n  var hasCallback = isFunction(callback),\n      value = undefined,\n      error = undefined,\n      succeeded = undefined,\n      failed = undefined;\n\n  if (hasCallback) {\n    value = tryCatch(callback, detail);\n\n    if (value === TRY_CATCH_ERROR) {\n      failed = true;\n      error = value.error;\n      value = null;\n    } else {\n      succeeded = true;\n    }\n\n    if (promise === value) {\n      reject(promise, cannotReturnOwn());\n      return;\n    }\n  } else {\n    value = detail;\n    succeeded = true;\n  }\n\n  if (promise._state !== PENDING) {\n    // noop\n  } else if (hasCallback && succeeded) {\n      resolve(promise, value);\n    } else if (failed) {\n      reject(promise, error);\n    } else if (settled === FULFILLED) {\n      fulfill(promise, value);\n    } else if (settled === REJECTED) {\n      reject(promise, value);\n    }\n}\n\nfunction initializePromise(promise, resolver) {\n  try {\n    resolver(function resolvePromise(value) {\n      resolve(promise, value);\n    }, function rejectPromise(reason) {\n      reject(promise, reason);\n    });\n  } catch (e) {\n    reject(promise, e);\n  }\n}\n\nvar id = 0;\nfunction nextId() {\n  return id++;\n}\n\nfunction makePromise(promise) {\n  promise[PROMISE_ID] = id++;\n  promise._state = undefined;\n  promise._result = undefined;\n  promise._subscribers = [];\n}\n\nexport { nextId, makePromise, getThen, noop, resolve, reject, fulfill, subscribe, publish, publishRejection, initializePromise, invokeCallback, FULFILLED, REJECTED, PENDING, handleMaybeThenable };","'use strict';\n\nimport { isArray, isMaybeThenable } from './utils';\n\nimport { noop, reject, fulfill, subscribe, FULFILLED, REJECTED, PENDING, getThen, handleMaybeThenable } from './-internal';\n\nimport then from './then';\nimport Promise from './promise';\nimport originalResolve from './promise/resolve';\nimport originalThen from './then';\nimport { makePromise, PROMISE_ID } from './-internal';\n\nexport default Enumerator;\nfunction Enumerator(Constructor, input) {\n  this._instanceConstructor = Constructor;\n  this.promise = new Constructor(noop);\n\n  if (!this.promise[PROMISE_ID]) {\n    makePromise(this.promise);\n  }\n\n  if (isArray(input)) {\n    this._input = input;\n    this.length = input.length;\n    this._remaining = input.length;\n\n    this._result = new Array(this.length);\n\n    if (this.length === 0) {\n      fulfill(this.promise, this._result);\n    } else {\n      this.length = this.length || 0;\n      this._enumerate();\n      if (this._remaining === 0) {\n        fulfill(this.promise, this._result);\n      }\n    }\n  } else {\n    reject(this.promise, validationError());\n  }\n}\n\nfunction validationError() {\n  return new Error('Array Methods must be provided an Array');\n};\n\nEnumerator.prototype._enumerate = function () {\n  var length = this.length;\n  var _input = this._input;\n\n  for (var i = 0; this._state === PENDING && i < length; i++) {\n    this._eachEntry(_input[i], i);\n  }\n};\n\nEnumerator.prototype._eachEntry = function (entry, i) {\n  var c = this._instanceConstructor;\n  var resolve = c.resolve;\n\n  if (resolve === originalResolve) {\n    var _then = getThen(entry);\n\n    if (_then === originalThen && entry._state !== PENDING) {\n      this._settledAt(entry._state, i, entry._result);\n    } else if (typeof _then !== 'function') {\n      this._remaining--;\n      this._result[i] = entry;\n    } else if (c === Promise) {\n      var promise = new c(noop);\n      handleMaybeThenable(promise, entry, _then);\n      this._willSettleAt(promise, i);\n    } else {\n      this._willSettleAt(new c(function (resolve) {\n        return resolve(entry);\n      }), i);\n    }\n  } else {\n    this._willSettleAt(resolve(entry), i);\n  }\n};\n\nEnumerator.prototype._settledAt = function (state, i, value) {\n  var promise = this.promise;\n\n  if (promise._state === PENDING) {\n    this._remaining--;\n\n    if (state === REJECTED) {\n      reject(promise, value);\n    } else {\n      this._result[i] = value;\n    }\n  }\n\n  if (this._remaining === 0) {\n    fulfill(promise, this._result);\n  }\n};\n\nEnumerator.prototype._willSettleAt = function (promise, i) {\n  var enumerator = this;\n\n  subscribe(promise, undefined, function (value) {\n    return enumerator._settledAt(FULFILLED, i, value);\n  }, function (reason) {\n    return enumerator._settledAt(REJECTED, i, reason);\n  });\n};","'use strict';\n\nexport default all;\nimport Enumerator from '../enumerator';\n\n/**\n  `Promise.all` accepts an array of promises, and returns a new promise which\n  is fulfilled with an array of fulfillment values for the passed promises, or\n  rejected with the reason of the first passed promise to be rejected. It casts all\n  elements of the passed iterable to promises as it runs this algorithm.\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = resolve(2);\n  let promise3 = resolve(3);\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // The array here would be [ 1, 2, 3 ];\n  });\n  ```\n\n  If any of the `promises` given to `all` are rejected, the first promise\n  that is rejected will be given as an argument to the returned promises's\n  rejection handler. For example:\n\n  Example:\n\n  ```javascript\n  let promise1 = resolve(1);\n  let promise2 = reject(new Error(\"2\"));\n  let promise3 = reject(new Error(\"3\"));\n  let promises = [ promise1, promise2, promise3 ];\n\n  Promise.all(promises).then(function(array){\n    // Code here never runs because there are rejected promises!\n  }, function(error) {\n    // error.message === \"2\"\n  });\n  ```\n\n  @method all\n  @static\n  @param {Array} entries array of promises\n  @param {String} label optional string for labeling the promise.\n  Useful for tooling.\n  @return {Promise} promise that is fulfilled when all `promises` have been\n  fulfilled, or rejected if any of them become rejected.\n  @static\n*/\nfunction all(entries) {\n  return new Enumerator(this, entries).promise;\n}","\"use strict\";\n\nexport default race;\nimport { isArray } from \"../utils\";\n\n/**\n  `Promise.race` returns a new promise which is settled in the same way as the\n  first passed promise to settle.\n\n  Example:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 2');\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // result === 'promise 2' because it was resolved before promise1\n    // was resolved.\n  });\n  ```\n\n  `Promise.race` is deterministic in that only the state of the first\n  settled promise matters. For example, even if other promises given to the\n  `promises` array argument are resolved, but the first settled promise has\n  become rejected before the other promises became fulfilled, the returned\n  promise will become rejected:\n\n  ```javascript\n  let promise1 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      resolve('promise 1');\n    }, 200);\n  });\n\n  let promise2 = new Promise(function(resolve, reject){\n    setTimeout(function(){\n      reject(new Error('promise 2'));\n    }, 100);\n  });\n\n  Promise.race([promise1, promise2]).then(function(result){\n    // Code here never runs\n  }, function(reason){\n    // reason.message === 'promise 2' because promise 2 became rejected before\n    // promise 1 became fulfilled\n  });\n  ```\n\n  An example real-world use case is implementing timeouts:\n\n  ```javascript\n  Promise.race([ajax('foo.json'), timeout(5000)])\n  ```\n\n  @method race\n  @static\n  @param {Array} promises array of promises to observe\n  Useful for tooling.\n  @return {Promise} a promise which settles in the same way as the first passed\n  promise to settle.\n*/\nfunction race(entries) {\n  /*jshint validthis:true */\n  var Constructor = this;\n\n  if (!isArray(entries)) {\n    return new Constructor(function (_, reject) {\n      return reject(new TypeError('You must pass an array to race.'));\n    });\n  } else {\n    return new Constructor(function (resolve, reject) {\n      var length = entries.length;\n      for (var i = 0; i < length; i++) {\n        Constructor.resolve(entries[i]).then(resolve, reject);\n      }\n    });\n  }\n}","'use strict';\n\nexport default reject;\nimport { noop, reject as _reject } from '../-internal';\n\n/**\n  `Promise.reject` returns a promise rejected with the passed `reason`.\n  It is shorthand for the following:\n\n  ```javascript\n  let promise = new Promise(function(resolve, reject){\n    reject(new Error('WHOOPS'));\n  });\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  Instead of writing the above, your code now simply becomes the following:\n\n  ```javascript\n  let promise = Promise.reject(new Error('WHOOPS'));\n\n  promise.then(function(value){\n    // Code here doesn't run because the promise is rejected!\n  }, function(reason){\n    // reason.message === 'WHOOPS'\n  });\n  ```\n\n  @method reject\n  @static\n  @param {Any} reason value that the returned promise will be rejected with.\n  Useful for tooling.\n  @return {Promise} a promise rejected with the given `reason`.\n*/\nfunction reject(reason) {\n  /*jshint validthis:true */\n  var Constructor = this;\n  var promise = new Constructor(noop);\n  _reject(promise, reason);\n  return promise;\n}","'use strict';\n\nexport default Promise;\n\nimport { isFunction } from './utils';\n\nimport { noop, nextId, PROMISE_ID, initializePromise } from './-internal';\n\nimport { asap, setAsap, setScheduler } from './asap';\n\nimport all from './promise/all';\nimport race from './promise/race';\nimport Resolve from './promise/resolve';\nimport Reject from './promise/reject';\nimport then from './then';\n\nfunction needsResolver() {\n  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n}\n\nfunction needsNew() {\n  throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n}\n\n/**\n  Promise objects represent the eventual result of an asynchronous operation. The\n  primary way of interacting with a promise is through its `then` method, which\n  registers callbacks to receive either a promise's eventual value or the reason\n  why the promise cannot be fulfilled.\n\n  Terminology\n  -----------\n\n  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n  - `thenable` is an object or function that defines a `then` method.\n  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n  - `exception` is a value that is thrown using the throw statement.\n  - `reason` is a value that indicates why a promise was rejected.\n  - `settled` the final resting state of a promise, fulfilled or rejected.\n\n  A promise can be in one of three states: pending, fulfilled, or rejected.\n\n  Promises that are fulfilled have a fulfillment value and are in the fulfilled\n  state.  Promises that are rejected have a rejection reason and are in the\n  rejected state.  A fulfillment value is never a thenable.\n\n  Promises can also be said to *resolve* a value.  If this value is also a\n  promise, then the original promise's settled state will match the value's\n  settled state.  So a promise that *resolves* a promise that rejects will\n  itself reject, and a promise that *resolves* a promise that fulfills will\n  itself fulfill.\n\n\n  Basic Usage:\n  ------------\n\n  ```js\n  let promise = new Promise(function(resolve, reject) {\n    // on success\n    resolve(value);\n\n    // on failure\n    reject(reason);\n  });\n\n  promise.then(function(value) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Advanced Usage:\n  ---------------\n\n  Promises shine when abstracting away asynchronous interactions such as\n  `XMLHttpRequest`s.\n\n  ```js\n  function getJSON(url) {\n    return new Promise(function(resolve, reject){\n      let xhr = new XMLHttpRequest();\n\n      xhr.open('GET', url);\n      xhr.onreadystatechange = handler;\n      xhr.responseType = 'json';\n      xhr.setRequestHeader('Accept', 'application/json');\n      xhr.send();\n\n      function handler() {\n        if (this.readyState === this.DONE) {\n          if (this.status === 200) {\n            resolve(this.response);\n          } else {\n            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n          }\n        }\n      };\n    });\n  }\n\n  getJSON('/posts.json').then(function(json) {\n    // on fulfillment\n  }, function(reason) {\n    // on rejection\n  });\n  ```\n\n  Unlike callbacks, promises are great composable primitives.\n\n  ```js\n  Promise.all([\n    getJSON('/posts'),\n    getJSON('/comments')\n  ]).then(function(values){\n    values[0] // => postsJSON\n    values[1] // => commentsJSON\n\n    return values;\n  });\n  ```\n\n  @class Promise\n  @param {function} resolver\n  Useful for tooling.\n  @constructor\n*/\nfunction Promise(resolver) {\n  this[PROMISE_ID] = nextId();\n  this._result = this._state = undefined;\n  this._subscribers = [];\n\n  if (noop !== resolver) {\n    typeof resolver !== 'function' && needsResolver();\n    this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n  }\n}\n\nPromise.all = all;\nPromise.race = race;\nPromise.resolve = Resolve;\nPromise.reject = Reject;\nPromise._setScheduler = setScheduler;\nPromise._setAsap = setAsap;\nPromise._asap = asap;\n\nPromise.prototype = {\n  constructor: Promise,\n\n  /**\n    The primary way of interacting with a promise is through its `then` method,\n    which registers callbacks to receive either a promise's eventual value or the\n    reason why the promise cannot be fulfilled.\n  \n    ```js\n    findUser().then(function(user){\n      // user is available\n    }, function(reason){\n      // user is unavailable, and you are given the reason why\n    });\n    ```\n  \n    Chaining\n    --------\n  \n    The return value of `then` is itself a promise.  This second, 'downstream'\n    promise is resolved with the return value of the first promise's fulfillment\n    or rejection handler, or rejected if the handler throws an exception.\n  \n    ```js\n    findUser().then(function (user) {\n      return user.name;\n    }, function (reason) {\n      return 'default name';\n    }).then(function (userName) {\n      // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n      // will be `'default name'`\n    });\n  \n    findUser().then(function (user) {\n      throw new Error('Found user, but still unhappy');\n    }, function (reason) {\n      throw new Error('`findUser` rejected and we're unhappy');\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n      // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.\n    });\n    ```\n    If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n  \n    ```js\n    findUser().then(function (user) {\n      throw new PedagogicalException('Upstream error');\n    }).then(function (value) {\n      // never reached\n    }).then(function (value) {\n      // never reached\n    }, function (reason) {\n      // The `PedgagocialException` is propagated all the way down to here\n    });\n    ```\n  \n    Assimilation\n    ------------\n  \n    Sometimes the value you want to propagate to a downstream promise can only be\n    retrieved asynchronously. This can be achieved by returning a promise in the\n    fulfillment or rejection handler. The downstream promise will then be pending\n    until the returned promise is settled. This is called *assimilation*.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // The user's comments are now available\n    });\n    ```\n  \n    If the assimliated promise rejects, then the downstream promise will also reject.\n  \n    ```js\n    findUser().then(function (user) {\n      return findCommentsByAuthor(user);\n    }).then(function (comments) {\n      // If `findCommentsByAuthor` fulfills, we'll have the value here\n    }, function (reason) {\n      // If `findCommentsByAuthor` rejects, we'll have the reason here\n    });\n    ```\n  \n    Simple Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let result;\n  \n    try {\n      result = findResult();\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n    findResult(function(result, err){\n      if (err) {\n        // failure\n      } else {\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findResult().then(function(result){\n      // success\n    }, function(reason){\n      // failure\n    });\n    ```\n  \n    Advanced Example\n    --------------\n  \n    Synchronous Example\n  \n    ```javascript\n    let author, books;\n  \n    try {\n      author = findAuthor();\n      books  = findBooksByAuthor(author);\n      // success\n    } catch(reason) {\n      // failure\n    }\n    ```\n  \n    Errback Example\n  \n    ```js\n  \n    function foundBooks(books) {\n  \n    }\n  \n    function failure(reason) {\n  \n    }\n  \n    findAuthor(function(author, err){\n      if (err) {\n        failure(err);\n        // failure\n      } else {\n        try {\n          findBoooksByAuthor(author, function(books, err) {\n            if (err) {\n              failure(err);\n            } else {\n              try {\n                foundBooks(books);\n              } catch(reason) {\n                failure(reason);\n              }\n            }\n          });\n        } catch(error) {\n          failure(err);\n        }\n        // success\n      }\n    });\n    ```\n  \n    Promise Example;\n  \n    ```javascript\n    findAuthor().\n      then(findBooksByAuthor).\n      then(function(books){\n        // found books\n    }).catch(function(reason){\n      // something went wrong\n    });\n    ```\n  \n    @method then\n    @param {Function} onFulfilled\n    @param {Function} onRejected\n    Useful for tooling.\n    @return {Promise}\n  */\n  then: then,\n\n  /**\n    `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same\n    as the catch block of a try/catch statement.\n  \n    ```js\n    function findAuthor(){\n      throw new Error('couldn't find that author');\n    }\n  \n    // synchronous\n    try {\n      findAuthor();\n    } catch(reason) {\n      // something went wrong\n    }\n  \n    // async with promises\n    findAuthor().catch(function(reason){\n      // something went wrong\n    });\n    ```\n  \n    @method catch\n    @param {Function} onRejection\n    Useful for tooling.\n    @return {Promise}\n  */\n  'catch': function _catch(onRejection) {\n    return this.then(null, onRejection);\n  }\n};","/*global self*/\n'use strict';\n\nexport default polyfill;\nimport Promise from './promise';\nfunction polyfill() {\n    var local = undefined;\n\n    if (typeof global !== 'undefined') {\n        local = global;\n    } else if (typeof self !== 'undefined') {\n        local = self;\n    } else {\n        try {\n            local = Function('return this')();\n        } catch (e) {\n            throw new Error('polyfill failed because global object is unavailable in this environment');\n        }\n    }\n\n    var P = local.Promise;\n\n    if (P) {\n        var promiseToString = null;\n        try {\n            promiseToString = Object.prototype.toString.call(P.resolve());\n        } catch (e) {\n            // silently ignored\n        }\n\n        if (promiseToString === '[object Promise]' && !P.cast) {\n            return;\n        }\n    }\n\n    local.Promise = Promise;\n}","'use strict';\n\nimport Promise from './es6-promise/promise';\nimport polyfill from './es6-promise/polyfill';\n\npolyfill();\n// Strange compat..\nPromise.polyfill = polyfill;\nPromise.Promise = Promise;\nexport default Promise;"],"names":["reject","resolve","originalResolve","originalThen","then","Resolve","Reject"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;ACAA,SAAS,gBAAgB,CAAC,CAAC,EAAE;EAC3B,OAAO,OAAO,CAAC,KAAK,UAAU,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC;CACvE;;AAED,SAAS,UAAU,CAAC,CAAC,EAAE;EACrB,OAAO,OAAO,CAAC,KAAK,UAAU,CAAC;CAChC;;AAED,AAIA,IAAI,QAAQ,GAAG,SAAS,CAAC;AACzB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;EAClB,QAAQ,GAAG,UAAU,CAAC,EAAE;IACtB,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC;GAC/D,CAAC;CACH,MAAM;EACL,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;CAC1B;;AAED,IAAI,OAAO,GAAG,QAAQ,CAAC,AACvB;;ACxBA,IAAI,GAAG,GAAG,CAAC,CAAC;AACZ,IAAI,SAAS,GAAG,SAAS,CAAC;AAC1B,IAAI,iBAAiB,GAAG,SAAS,CAAC;;AAElC,IAAI,IAAI,GAAG,SAAS,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;EACtC,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;EACtB,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;EACrB,GAAG,IAAI,CAAC,CAAC;EACT,IAAI,GAAG,KAAK,CAAC,EAAE;;;;IAIb,IAAI,iBAAiB,EAAE;MACrB,iBAAiB,CAAC,KAAK,CAAC,CAAC;KAC1B,MAAM;MACL,aAAa,EAAE,CAAC;KACjB;GACF;CACF,CAAC;;AAEF,AAEA,SAAS,YAAY,CAAC,UAAU,EAAE;EAChC,iBAAiB,GAAG,UAAU,CAAC;CAChC;;AAED,SAAS,OAAO,CAAC,MAAM,EAAE;EACvB,IAAI,GAAG,MAAM,CAAC;CACf;;AAED,IAAI,aAAa,GAAG,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACvE,IAAI,aAAa,GAAG,aAAa,IAAI,EAAE,CAAC;AACxC,IAAI,uBAAuB,GAAG,aAAa,CAAC,gBAAgB,IAAI,aAAa,CAAC,sBAAsB,CAAC;AACrG,IAAI,MAAM,GAAG,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,kBAAkB,CAAC;;;AAGjI,IAAI,QAAQ,GAAG,OAAO,iBAAiB,KAAK,WAAW,IAAI,OAAO,aAAa,KAAK,WAAW,IAAI,OAAO,cAAc,KAAK,WAAW,CAAC;;;AAGzI,SAAS,WAAW,GAAG;;;EAGrB,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;GAChC,CAAC;CACH;;;AAGD,SAAS,aAAa,GAAG;EACvB,OAAO,YAAY;IACjB,SAAS,CAAC,KAAK,CAAC,CAAC;GAClB,CAAC;CACH;;AAED,SAAS,mBAAmB,GAAG;EAC7B,IAAI,UAAU,GAAG,CAAC,CAAC;EACnB,IAAI,QAAQ,GAAG,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;EAClD,IAAI,IAAI,GAAG,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;EACvC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;;EAEhD,OAAO,YAAY;IACjB,IAAI,CAAC,IAAI,GAAG,UAAU,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC;GAC3C,CAAC;CACH;;;AAGD,SAAS,iBAAiB,GAAG;EAC3B,IAAI,OAAO,GAAG,IAAI,cAAc,EAAE,CAAC;EACnC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;EAChC,OAAO,YAAY;IACjB,OAAO,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;GACrC,CAAC;CACH;;AAED,SAAS,aAAa,GAAG;;;EAGvB,IAAI,gBAAgB,GAAG,UAAU,CAAC;EAClC,OAAO,YAAY;IACjB,OAAO,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;GACnC,CAAC;CACH;;AAED,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,SAAS,KAAK,GAAG;EACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE;IAC/B,IAAI,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;IAEvB,QAAQ,CAAC,GAAG,CAAC,CAAC;;IAEd,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IACrB,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;GAC1B;;EAED,GAAG,GAAG,CAAC,CAAC;CACT;;AAED,SAAS,YAAY,GAAG;EACtB,IAAI;IACF,IAAI,CAAC,GAAG,OAAO,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;IACvB,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,YAAY,CAAC;IAClD,OAAO,aAAa,EAAE,CAAC;GACxB,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,aAAa,EAAE,CAAC;GACxB;CACF;;AAED,IAAI,aAAa,GAAG,SAAS,CAAC;;AAE9B,IAAI,MAAM,EAAE;EACV,aAAa,GAAG,WAAW,EAAE,CAAC;CAC/B,MAAM,IAAI,uBAAuB,EAAE;EAClC,aAAa,GAAG,mBAAmB,EAAE,CAAC;CACvC,MAAM,IAAI,QAAQ,EAAE;EACnB,aAAa,GAAG,iBAAiB,EAAE,CAAC;CACrC,MAAM,IAAI,aAAa,KAAK,SAAS,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE;EACvE,aAAa,GAAG,YAAY,EAAE,CAAC;CAChC,MAAM;EACL,aAAa,GAAG,aAAa,EAAE,CAAC;;;ACtHlC,SAAS,IAAI,CAAC,aAAa,EAAE,WAAW,EAAE;EACxC,IAAI,UAAU,GAAG,SAAS,CAAC;;EAE3B,IAAI,MAAM,GAAG,IAAI,CAAC;;EAElB,IAAI,KAAK,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;;EAEvC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;IACnC,WAAW,CAAC,KAAK,CAAC,CAAC;GACpB;;EAED,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;;EAE3B,IAAI,MAAM,EAAE;IACV,CAAC,YAAY;MACX,IAAI,QAAQ,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;MACtC,IAAI,CAAC,YAAY;QACf,OAAO,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;OAChE,CAAC,CAAC;KACJ,CAAC,EAAE,CAAC;GACN,MAAM;IACL,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;GACtD;;EAED,OAAO,KAAK,CAAC;;;ACzBf;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,SAAS,OAAO,CAAC,MAAM,EAAE;;EAEvB,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,KAAK,WAAW,EAAE;IAC9E,OAAO,MAAM,CAAC;GACf;;EAED,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EAC1B,OAAO,OAAO,CAAC;;;ACrCjB,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;;AAE1D,AACA,SAAS,IAAI,GAAG,EAAE;;AAElB,IAAI,OAAO,GAAG,KAAK,CAAC,CAAC;AACrB,IAAI,SAAS,GAAG,CAAC,CAAC;AAClB,IAAI,QAAQ,GAAG,CAAC,CAAC;;AAEjB,IAAI,cAAc,GAAG,IAAI,WAAW,EAAE,CAAC;;AAEvC,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;CAClE;;AAED,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;CAC9E;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE;EACxB,IAAI;IACF,OAAO,OAAO,CAAC,IAAI,CAAC;GACrB,CAAC,OAAO,KAAK,EAAE;IACd,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;IAC7B,OAAO,cAAc,CAAC;GACvB;CACF;;AAED,SAAS,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE;EAClE,IAAI;IACF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;GACxD,CAAC,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,CAAC;GACV;CACF;;AAED,SAAS,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE;EACtD,IAAI,CAAC,UAAU,OAAO,EAAE;IACtB,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,KAAK,EAAE;MACnD,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;MACd,IAAI,QAAQ,KAAK,KAAK,EAAE;QACtBC,QAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB,MAAM;QACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;OACzB;KACF,EAAE,UAAU,MAAM,EAAE;MACnB,IAAI,MAAM,EAAE;QACV,OAAO;OACR;MACD,MAAM,GAAG,IAAI,CAAC;;MAEdD,OAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,EAAE,UAAU,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC,CAAC,CAAC;;IAExD,IAAI,CAAC,MAAM,IAAI,KAAK,EAAE;MACpB,MAAM,GAAG,IAAI,CAAC;MACdA,OAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB;GACF,EAAE,OAAO,CAAC,CAAC;CACb;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI,QAAQ,CAAC,MAAM,KAAK,SAAS,EAAE;IACjC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACpC,MAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,EAAE;IACvCA,OAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC;GACnC,MAAM;IACL,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;MAC9C,OAAOC,QAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KAChC,EAAE,UAAU,MAAM,EAAE;MACnB,OAAOD,OAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KAChC,CAAC,CAAC;GACJ;CACF;;AAED,SAAS,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAEI,MAAI,EAAE;EACzD,IAAI,aAAa,CAAC,WAAW,KAAK,OAAO,CAAC,WAAW,IAAIA,MAAI,KAAKD,IAAY,IAAI,aAAa,CAAC,WAAW,CAAC,OAAO,KAAKD,OAAe,EAAE;IACvI,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;GAC3C,MAAM;IACL,IAAIE,MAAI,KAAK,cAAc,EAAE;MAC3BJ,OAAM,CAAC,OAAO,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;KACvC,MAAM,IAAII,MAAI,KAAK,SAAS,EAAE;MAC7B,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC,MAAM,IAAI,UAAU,CAACA,MAAI,CAAC,EAAE;MAC3B,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAEA,MAAI,CAAC,CAAC;KACrD,MAAM;MACL,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;KACjC;GACF;CACF;;AAED,SAASH,QAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,KAAK,KAAK,EAAE;IACrBD,OAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;GACpC,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;IAClC,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;GACrD,MAAM;IACL,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;GACzB;CACF;;AAED,SAAS,gBAAgB,CAAC,OAAO,EAAE;EACjC,IAAI,OAAO,CAAC,QAAQ,EAAE;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;GACnC;;EAED,OAAO,CAAC,OAAO,CAAC,CAAC;CAClB;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;;EAED,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;EACxB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;EAE3B,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;IACrC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;GACxB;CACF;;AAED,SAASA,OAAM,CAAC,OAAO,EAAE,MAAM,EAAE;EAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,OAAO;GACR;EACD,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;EAC1B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC;;EAEzB,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;CACjC;;AAED,SAAS,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE;EAC5D,IAAI,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;EACvC,IAAI,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC;;EAEjC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;;EAEvB,YAAY,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;EAC7B,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,aAAa,CAAC;EACjD,YAAY,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,WAAW,CAAC;;EAE9C,IAAI,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE;IACjC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;GACvB;CACF;;AAED,SAAS,OAAO,CAAC,OAAO,EAAE;EACxB,IAAI,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;EACvC,IAAI,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;;EAE7B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;IAC5B,OAAO;GACR;;EAED,IAAI,KAAK,GAAG,SAAS;MACjB,QAAQ,GAAG,SAAS;MACpB,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;;EAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;IAC9C,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACvB,QAAQ,GAAG,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;;IAEpC,IAAI,KAAK,EAAE;MACT,cAAc,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;KAClD,MAAM;MACL,QAAQ,CAAC,MAAM,CAAC,CAAC;KAClB;GACF;;EAED,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;CACjC;;AAED,SAAS,WAAW,GAAG;EACrB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;CACnB;;AAED,IAAI,eAAe,GAAG,IAAI,WAAW,EAAE,CAAC;;AAExC,SAAS,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE;EAClC,IAAI;IACF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;GACzB,CAAC,OAAO,CAAC,EAAE;IACV,eAAe,CAAC,KAAK,GAAG,CAAC,CAAC;IAC1B,OAAO,eAAe,CAAC;GACxB;CACF;;AAED,SAAS,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;EAC1D,IAAI,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC;MAClC,KAAK,GAAG,SAAS;MACjB,KAAK,GAAG,SAAS;MACjB,SAAS,GAAG,SAAS;MACrB,MAAM,GAAG,SAAS,CAAC;;EAEvB,IAAI,WAAW,EAAE;IACf,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;;IAEnC,IAAI,KAAK,KAAK,eAAe,EAAE;MAC7B,MAAM,GAAG,IAAI,CAAC;MACd,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;MACpB,KAAK,GAAG,IAAI,CAAC;KACd,MAAM;MACL,SAAS,GAAG,IAAI,CAAC;KAClB;;IAED,IAAI,OAAO,KAAK,KAAK,EAAE;MACrBA,OAAM,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;MACnC,OAAO;KACR;GACF,MAAM;IACL,KAAK,GAAG,MAAM,CAAC;IACf,SAAS,GAAG,IAAI,CAAC;GAClB;;EAED,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;;GAE/B,MAAM,IAAI,WAAW,IAAI,SAAS,EAAE;MACjCC,QAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACzB,MAAM,IAAI,MAAM,EAAE;MACjBD,OAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB,MAAM,IAAI,OAAO,KAAK,SAAS,EAAE;MAChC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACzB,MAAM,IAAI,OAAO,KAAK,QAAQ,EAAE;MAC/BA,OAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB;CACJ;;AAED,SAAS,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE;EAC5C,IAAI;IACF,QAAQ,CAAC,SAAS,cAAc,CAAC,KAAK,EAAE;MACtCC,QAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACzB,EAAE,SAAS,aAAa,CAAC,MAAM,EAAE;MAChCD,OAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;KACzB,CAAC,CAAC;GACJ,CAAC,OAAO,CAAC,EAAE;IACVA,OAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;GACpB;CACF;;AAED,IAAI,EAAE,GAAG,CAAC,CAAC;AACX,SAAS,MAAM,GAAG;EAChB,OAAO,EAAE,EAAE,CAAC;CACb;;AAED,SAAS,WAAW,CAAC,OAAO,EAAE;EAC5B,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;EAC3B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;EAC3B,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;EAC5B,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;CAC3B,AAED;;AC5PA,SAAS,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE;EACtC,IAAI,CAAC,oBAAoB,GAAG,WAAW,CAAC;EACxC,IAAI,CAAC,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;;EAErC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE;IAC7B,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;GAC3B;;EAED,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;IAClB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACpB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;;IAE/B,IAAI,CAAC,OAAO,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;IAEtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;MACrB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KACrC,MAAM;MACL,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;MAC/B,IAAI,CAAC,UAAU,EAAE,CAAC;MAClB,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;QACzB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;OACrC;KACF;GACF,MAAM;IACLA,OAAM,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;GACzC;CACF;;AAED,SAAS,eAAe,GAAG;EACzB,OAAO,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;CAC7D,CAAC;;AAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,YAAY;EAC5C,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;EACzB,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;;EAEzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;IAC1D,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;GAC/B;CACF,CAAC;;AAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,KAAK,EAAE,CAAC,EAAE;EACpD,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC;EAClC,IAAIC,SAAO,GAAG,CAAC,CAAC,OAAO,CAAC;;EAExB,IAAIA,SAAO,KAAKC,OAAe,EAAE;IAC/B,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;;IAE3B,IAAI,KAAK,KAAKC,IAAY,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE;MACtD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;KACjD,MAAM,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;MACtC,IAAI,CAAC,UAAU,EAAE,CAAC;MAClB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;KACzB,MAAM,IAAI,CAAC,KAAK,OAAO,EAAE;MACxB,IAAI,OAAO,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;MAC1B,mBAAmB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;MAC3C,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;KAChC,MAAM;MACL,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,UAAUF,SAAO,EAAE;QAC1C,OAAOA,SAAO,CAAC,KAAK,CAAC,CAAC;OACvB,CAAC,EAAE,CAAC,CAAC,CAAC;KACR;GACF,MAAM;IACL,IAAI,CAAC,aAAa,CAACA,SAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;GACvC;CACF,CAAC;;AAEF,UAAU,CAAC,SAAS,CAAC,UAAU,GAAG,UAAU,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE;EAC3D,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;;EAE3B,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE;IAC9B,IAAI,CAAC,UAAU,EAAE,CAAC;;IAElB,IAAI,KAAK,KAAK,QAAQ,EAAE;MACtBD,OAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;KACxB,MAAM;MACL,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;KACzB;GACF;;EAED,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;IACzB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;GAChC;CACF,CAAC;;AAEF,UAAU,CAAC,SAAS,CAAC,aAAa,GAAG,UAAU,OAAO,EAAE,CAAC,EAAE;EACzD,IAAI,UAAU,GAAG,IAAI,CAAC;;EAEtB,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE;IAC7C,OAAO,UAAU,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;GACnD,EAAE,UAAU,MAAM,EAAE;IACnB,OAAO,UAAU,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;GACnD,CAAC,CAAC;CACJ;;ACtGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+CA,SAAS,GAAG,CAAC,OAAO,EAAE;EACpB,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;;;AChD/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiEA,SAAS,IAAI,CAAC,OAAO,EAAE;;EAErB,IAAI,WAAW,GAAG,IAAI,CAAC;;EAEvB,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;IACrB,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE;MAC1C,OAAO,MAAM,CAAC,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC,CAAC;KACjE,CAAC,CAAC;GACJ,MAAM;IACL,OAAO,IAAI,WAAW,CAAC,UAAU,OAAO,EAAE,MAAM,EAAE;MAChD,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;MAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;QAC/B,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;OACvD;KACF,CAAC,CAAC;GACJ;;;AChFH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,SAAS,MAAM,CAAC,MAAM,EAAE;;EAEtB,IAAI,WAAW,GAAG,IAAI,CAAC;EACvB,IAAI,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC;EACpC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;EACzB,OAAO,OAAO,CAAC;;;AC5BjB,SAAS,aAAa,GAAG;EACvB,MAAM,IAAI,SAAS,CAAC,oFAAoF,CAAC,CAAC;CAC3G;;AAED,SAAS,QAAQ,GAAG;EAClB,MAAM,IAAI,SAAS,CAAC,uHAAuH,CAAC,CAAC;CAC9I;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyGD,SAAS,OAAO,CAAC,QAAQ,EAAE;EACzB,IAAI,CAAC,UAAU,CAAC,GAAG,MAAM,EAAE,CAAC;EAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;EACvC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;;EAEvB,IAAI,IAAI,KAAK,QAAQ,EAAE;IACrB,OAAO,QAAQ,KAAK,UAAU,IAAI,aAAa,EAAE,CAAC;IAClD,IAAI,YAAY,OAAO,GAAG,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC;GAC1E;CACF;;AAED,OAAO,CAAC,GAAG,GAAG,GAAG,CAAC;AAClB,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AACpB,OAAO,CAAC,OAAO,GAAGK,OAAO,CAAC;AAC1B,OAAO,CAAC,MAAM,GAAGC,MAAM,CAAC;AACxB,OAAO,CAAC,aAAa,GAAG,YAAY,CAAC;AACrC,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC;AAC3B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;;AAErB,OAAO,CAAC,SAAS,GAAG;EAClB,WAAW,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmMpB,IAAI,EAAE,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BV,OAAO,EAAE,SAAS,MAAM,CAAC,WAAW,EAAE;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;GACrC;CACF;;ACjXD,SAAS,QAAQ,GAAG;IAChB,IAAI,KAAK,GAAG,SAAS,CAAC;;IAEtB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QAC/B,KAAK,GAAG,MAAM,CAAC;KAClB,MAAM,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE;QACpC,KAAK,GAAG,IAAI,CAAC;KAChB,MAAM;QACH,IAAI;YACA,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;SACrC,CAAC,OAAO,CAAC,EAAE;YACR,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;SAC/F;KACJ;;IAED,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;;IAEtB,IAAI,CAAC,EAAE;QACH,IAAI,eAAe,GAAG,IAAI,CAAC;QAC3B,IAAI;YACA,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;SACjE,CAAC,OAAO,CAAC,EAAE;;SAEX;;QAED,IAAI,eAAe,KAAK,kBAAkB,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE;YACnD,OAAO;SACV;KACJ;;IAED,KAAK,CAAC,OAAO,GAAG,OAAO,CAAC;;;AC9B5B,QAAQ,EAAE,CAAC;;AAEX,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;AAC5B,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,AAC1B,;;,;;;","file":"es6-promise.min.js"}
\ No newline at end of file
diff --git a/js/node_modules/es6-promise/es6-promise.d.ts b/js/node_modules/es6-promise/es6-promise.d.ts
deleted file mode 100644
index d90ab85a59eb8353c5548afa84245dbb074ddbf2..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/es6-promise.d.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-export interface Thenable <R> {
-  then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): Thenable<U>;
-  then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => void): Thenable<U>;
-}
-
-export class Promise <R> implements Thenable <R> {
-  /**
-   * If you call resolve in the body of the callback passed to the constructor,
-   * your promise is fulfilled with result object passed to resolve.
-   * If you call reject your promise is rejected with the object passed to resolve.
-   * For consistency and debugging (eg stack traces), obj should be an instanceof Error.
-   * Any errors thrown in the constructor callback will be implicitly passed to reject().
-   */
-  constructor (callback: (resolve : (value?: R | Thenable<R>) => void, reject: (error?: any) => void) => void);
-
-  /**
-   * onFulfilled is called when/if "promise" resolves. onRejected is called when/if "promise" rejects.
-   * Both are optional, if either/both are omitted the next onFulfilled/onRejected in the chain is called.
-   * Both callbacks have a single parameter , the fulfillment value or rejection reason.
-   * "then" returns a new promise equivalent to the value you return from onFulfilled/onRejected after being passed through Promise.resolve.
-   * If an error is thrown in the callback, the returned promise rejects with that error.
-   *
-   * @param onFulfilled called when/if "promise" resolves
-   * @param onRejected called when/if "promise" rejects
-   */
-  then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => U | Thenable<U>): Promise<U>;
-  then <U> (onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: any) => void): Promise<U>;
-
-  /**
-   * Sugar for promise.then(undefined, onRejected)
-   *
-   * @param onRejected called when/if "promise" rejects
-   */
-  catch <U> (onRejected?: (error: any) => U | Thenable<U>): Promise<U>;
-
-  /**
-   * Make a new promise from the thenable.
-   * A thenable is promise-like in as far as it has a "then" method.
-   */
-  static resolve (): Promise<void>;
-  static resolve <R> (value: R | Thenable<R>): Promise<R>;
-
-  /**
-   * Make a promise that rejects to obj. For consistency and debugging (eg stack traces), obj should be an instanceof Error
-   */
-  static reject <R> (error: any): Promise<R>;
-
-  /**
-   * Make a promise that fulfills when every item in the array fulfills, and rejects if (and when) any item rejects.
-   * the array passed to all can be a mixture of promise-like objects and other objects.
-   * The fulfillment value is an array (in order) of fulfillment values. The rejection value is the first rejection value.
-   */
-  static all<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>, T8 | Thenable<T8>, T9 | Thenable<T9>, T10 | Thenable<T10>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]>;
-  static all<T1, T2, T3, T4, T5, T6, T7, T8, T9>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>, T8 | Thenable<T8>, T9 | Thenable<T9>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8, T9]>;
-  static all<T1, T2, T3, T4, T5, T6, T7, T8>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>, T8 | Thenable<T8>]): Promise<[T1, T2, T3, T4, T5, T6, T7, T8]>;
-  static all<T1, T2, T3, T4, T5, T6, T7>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>, T7 | Thenable<T7>]): Promise<[T1, T2, T3, T4, T5, T6, T7]>;
-  static all<T1, T2, T3, T4, T5, T6>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>, T6 | Thenable<T6>]): Promise<[T1, T2, T3, T4, T5, T6]>;
-  static all<T1, T2, T3, T4, T5>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>, T5 | Thenable<T5>]): Promise<[T1, T2, T3, T4, T5]>;
-  static all<T1, T2, T3, T4>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>, T4 | Thenable <T4>]): Promise<[T1, T2, T3, T4]>;
-  static all<T1, T2, T3>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>, T3 | Thenable<T3>]): Promise<[T1, T2, T3]>;
-  static all<T1, T2>(values: [T1 | Thenable<T1>, T2 | Thenable<T2>]): Promise<[T1, T2]>;
-  static all<T1>(values: [T1 | Thenable<T1>]): Promise<[T1]>;
-  static all<TAll>(values: Array<TAll | Thenable<TAll>>): Promise<TAll[]>;
-
-  /**
-   * Make a Promise that fulfills when any item fulfills, and rejects if any item rejects.
-   */
-  static race <R> (promises: (R | Thenable<R>)[]): Promise<R>;
-}
-
-/**
- * The polyfill method will patch the global environment (in this case to the Promise name) when called.
- */
-export function polyfill (): void;
diff --git a/js/node_modules/es6-promise/lib/es6-promise.js b/js/node_modules/es6-promise/lib/es6-promise.js
deleted file mode 100644
index 8c8dbd82058b3e0afea422b3e64ec00a8fb0c96e..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import Promise from './es6-promise/promise';
-import polyfill from './es6-promise/polyfill';
-
-polyfill();
-// Strange compat..
-Promise.polyfill = polyfill;
-Promise.Promise = Promise;
-export default Promise;
diff --git a/js/node_modules/es6-promise/lib/es6-promise/-internal.js b/js/node_modules/es6-promise/lib/es6-promise/-internal.js
deleted file mode 100644
index b6d07de69e3735522319b32d091528497485c511..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise/-internal.js
+++ /dev/null
@@ -1,270 +0,0 @@
-import {
-  objectOrFunction,
-  isFunction
-} from './utils';
-
-import {
-  asap
-} from './asap';
-
-import originalThen from './then';
-import originalResolve from './promise/resolve';
-
-export const PROMISE_ID = Math.random().toString(36).substring(16);
-
-function noop() {}
-
-const PENDING   = void 0;
-const FULFILLED = 1;
-const REJECTED  = 2;
-
-const GET_THEN_ERROR = new ErrorObject();
-
-function selfFulfillment() {
-  return new TypeError("You cannot resolve a promise with itself");
-}
-
-function cannotReturnOwn() {
-  return new TypeError('A promises callback cannot return that same promise.');
-}
-
-function getThen(promise) {
-  try {
-    return promise.then;
-  } catch(error) {
-    GET_THEN_ERROR.error = error;
-    return GET_THEN_ERROR;
-  }
-}
-
-function tryThen(then, value, fulfillmentHandler, rejectionHandler) {
-  try {
-    then.call(value, fulfillmentHandler, rejectionHandler);
-  } catch(e) {
-    return e;
-  }
-}
-
-function handleForeignThenable(promise, thenable, then) {
-   asap(promise => {
-    var sealed = false;
-    var error = tryThen(then, thenable, value => {
-      if (sealed) { return; }
-      sealed = true;
-      if (thenable !== value) {
-        resolve(promise, value);
-      } else {
-        fulfill(promise, value);
-      }
-    }, reason => {
-      if (sealed) { return; }
-      sealed = true;
-
-      reject(promise, reason);
-    }, 'Settle: ' + (promise._label || ' unknown promise'));
-
-    if (!sealed && error) {
-      sealed = true;
-      reject(promise, error);
-    }
-  }, promise);
-}
-
-function handleOwnThenable(promise, thenable) {
-  if (thenable._state === FULFILLED) {
-    fulfill(promise, thenable._result);
-  } else if (thenable._state === REJECTED) {
-    reject(promise, thenable._result);
-  } else {
-    subscribe(thenable, undefined, value  => resolve(promise, value),
-                                   reason => reject(promise, reason))
-  }
-}
-
-function handleMaybeThenable(promise, maybeThenable, then) {
-  if (maybeThenable.constructor === promise.constructor &&
-      then === originalThen &&
-      maybeThenable.constructor.resolve === originalResolve) {
-    handleOwnThenable(promise, maybeThenable);
-  } else {
-    if (then === GET_THEN_ERROR) {
-      reject(promise, GET_THEN_ERROR.error);
-    } else if (then === undefined) {
-      fulfill(promise, maybeThenable);
-    } else if (isFunction(then)) {
-      handleForeignThenable(promise, maybeThenable, then);
-    } else {
-      fulfill(promise, maybeThenable);
-    }
-  }
-}
-
-function resolve(promise, value) {
-  if (promise === value) {
-    reject(promise, selfFulfillment());
-  } else if (objectOrFunction(value)) {
-    handleMaybeThenable(promise, value, getThen(value));
-  } else {
-    fulfill(promise, value);
-  }
-}
-
-function publishRejection(promise) {
-  if (promise._onerror) {
-    promise._onerror(promise._result);
-  }
-
-  publish(promise);
-}
-
-function fulfill(promise, value) {
-  if (promise._state !== PENDING) { return; }
-
-  promise._result = value;
-  promise._state = FULFILLED;
-
-  if (promise._subscribers.length !== 0) {
-    asap(publish, promise);
-  }
-}
-
-function reject(promise, reason) {
-  if (promise._state !== PENDING) { return; }
-  promise._state = REJECTED;
-  promise._result = reason;
-
-  asap(publishRejection, promise);
-}
-
-function subscribe(parent, child, onFulfillment, onRejection) {
-  let { _subscribers } = parent;
-  let { length } = _subscribers;
-
-  parent._onerror = null;
-
-  _subscribers[length] = child;
-  _subscribers[length + FULFILLED] = onFulfillment;
-  _subscribers[length + REJECTED]  = onRejection;
-
-  if (length === 0 && parent._state) {
-    asap(publish, parent);
-  }
-}
-
-function publish(promise) {
-  let subscribers = promise._subscribers;
-  let settled = promise._state;
-
-  if (subscribers.length === 0) { return; }
-
-  let child, callback, detail = promise._result;
-
-  for (let i = 0; i < subscribers.length; i += 3) {
-    child = subscribers[i];
-    callback = subscribers[i + settled];
-
-    if (child) {
-      invokeCallback(settled, child, callback, detail);
-    } else {
-      callback(detail);
-    }
-  }
-
-  promise._subscribers.length = 0;
-}
-
-function ErrorObject() {
-  this.error = null;
-}
-
-const TRY_CATCH_ERROR = new ErrorObject();
-
-function tryCatch(callback, detail) {
-  try {
-    return callback(detail);
-  } catch(e) {
-    TRY_CATCH_ERROR.error = e;
-    return TRY_CATCH_ERROR;
-  }
-}
-
-function invokeCallback(settled, promise, callback, detail) {
-  let hasCallback = isFunction(callback),
-      value, error, succeeded, failed;
-
-  if (hasCallback) {
-    value = tryCatch(callback, detail);
-
-    if (value === TRY_CATCH_ERROR) {
-      failed = true;
-      error = value.error;
-      value = null;
-    } else {
-      succeeded = true;
-    }
-
-    if (promise === value) {
-      reject(promise, cannotReturnOwn());
-      return;
-    }
-
-  } else {
-    value = detail;
-    succeeded = true;
-  }
-
-  if (promise._state !== PENDING) {
-    // noop
-  } else if (hasCallback && succeeded) {
-    resolve(promise, value);
-  } else if (failed) {
-    reject(promise, error);
-  } else if (settled === FULFILLED) {
-    fulfill(promise, value);
-  } else if (settled === REJECTED) {
-    reject(promise, value);
-  }
-}
-
-function initializePromise(promise, resolver) {
-  try {
-    resolver(function resolvePromise(value){
-      resolve(promise, value);
-    }, function rejectPromise(reason) {
-      reject(promise, reason);
-    });
-  } catch(e) {
-    reject(promise, e);
-  }
-}
-
-let id = 0;
-function nextId() {
-  return id++;
-}
-
-function makePromise(promise) {
-  promise[PROMISE_ID] = id++;
-  promise._state = undefined;
-  promise._result = undefined;
-  promise._subscribers = [];
-}
-
-export {
-  nextId,
-  makePromise,
-  getThen,
-  noop,
-  resolve,
-  reject,
-  fulfill,
-  subscribe,
-  publish,
-  publishRejection,
-  initializePromise,
-  invokeCallback,
-  FULFILLED,
-  REJECTED,
-  PENDING,
-  handleMaybeThenable
-};
diff --git a/js/node_modules/es6-promise/lib/es6-promise/asap.js b/js/node_modules/es6-promise/lib/es6-promise/asap.js
deleted file mode 100644
index 0d48317e72610309cb5c3cf51a48eed893814697..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise/asap.js
+++ /dev/null
@@ -1,116 +0,0 @@
-let len = 0;
-let vertxNext;
-let customSchedulerFn;
-
-export var asap = function asap(callback, arg) {
-  queue[len] = callback;
-  queue[len + 1] = arg;
-  len += 2;
-  if (len === 2) {
-    // If len is 2, that means that we need to schedule an async flush.
-    // If additional callbacks are queued before the queue is flushed, they
-    // will be processed by this flush that we are scheduling.
-    if (customSchedulerFn) {
-      customSchedulerFn(flush);
-    } else {
-      scheduleFlush();
-    }
-  }
-}
-
-export function setScheduler(scheduleFn) {
-  customSchedulerFn = scheduleFn;
-}
-
-export function setAsap(asapFn) {
-  asap = asapFn;
-}
-
-const browserWindow = (typeof window !== 'undefined') ? window : undefined;
-const browserGlobal = browserWindow || {};
-const BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
-const isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
-
-// test for web worker but not in IE10
-const isWorker = typeof Uint8ClampedArray !== 'undefined' &&
-  typeof importScripts !== 'undefined' &&
-  typeof MessageChannel !== 'undefined';
-
-// node
-function useNextTick() {
-  // node version 0.10.x displays a deprecation warning when nextTick is used recursively
-  // see https://github.com/cujojs/when/issues/410 for details
-  return () => process.nextTick(flush);
-}
-
-// vertx
-function useVertxTimer() {
-  return function() {
-    vertxNext(flush);
-  };
-}
-
-function useMutationObserver() {
-  let iterations = 0;
-  const observer = new BrowserMutationObserver(flush);
-  const node = document.createTextNode('');
-  observer.observe(node, { characterData: true });
-
-  return () => {
-    node.data = (iterations = ++iterations % 2);
-  };
-}
-
-// web worker
-function useMessageChannel() {
-  const channel = new MessageChannel();
-  channel.port1.onmessage = flush;
-  return () => channel.port2.postMessage(0);
-}
-
-function useSetTimeout() {
-  // Store setTimeout reference so es6-promise will be unaffected by
-  // other code modifying setTimeout (like sinon.useFakeTimers())
-  const globalSetTimeout = setTimeout;
-  return () => globalSetTimeout(flush, 1);
-}
-
-const queue = new Array(1000);
-function flush() {
-  for (let i = 0; i < len; i+=2) {
-    let callback = queue[i];
-    let arg = queue[i+1];
-
-    callback(arg);
-
-    queue[i] = undefined;
-    queue[i+1] = undefined;
-  }
-
-  len = 0;
-}
-
-function attemptVertx() {
-  try {
-    const r = require;
-    const vertx = r('vertx');
-    vertxNext = vertx.runOnLoop || vertx.runOnContext;
-    return useVertxTimer();
-  } catch(e) {
-    return useSetTimeout();
-  }
-}
-
-let scheduleFlush;
-// Decide what async method to use to triggering processing of queued callbacks:
-if (isNode) {
-  scheduleFlush = useNextTick();
-} else if (BrowserMutationObserver) {
-  scheduleFlush = useMutationObserver();
-} else if (isWorker) {
-  scheduleFlush = useMessageChannel();
-} else if (browserWindow === undefined && typeof require === 'function') {
-  scheduleFlush = attemptVertx();
-} else {
-  scheduleFlush = useSetTimeout();
-}
diff --git a/js/node_modules/es6-promise/lib/es6-promise/enumerator.js b/js/node_modules/es6-promise/lib/es6-promise/enumerator.js
deleted file mode 100644
index ca8b05e2b43a057e4ef88ec7bade185d3dfde339..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise/enumerator.js
+++ /dev/null
@@ -1,114 +0,0 @@
-import {
-  isArray,
-  isMaybeThenable
-} from './utils';
-
-import {
-  noop,
-  reject,
-  fulfill,
-  subscribe,
-  FULFILLED,
-  REJECTED,
-  PENDING,
-  getThen,
-  handleMaybeThenable
-} from './-internal';
-
-import then from './then';
-import Promise from './promise';
-import originalResolve from './promise/resolve';
-import originalThen from './then';
-import { makePromise, PROMISE_ID } from './-internal';
-
-export default Enumerator;
-function Enumerator(Constructor, input) {
-  this._instanceConstructor = Constructor;
-  this.promise = new Constructor(noop);
-
-  if (!this.promise[PROMISE_ID]) {
-    makePromise(this.promise);
-  }
-
-  if (isArray(input)) {
-    this._input     = input;
-    this.length     = input.length;
-    this._remaining = input.length;
-
-    this._result = new Array(this.length);
-
-    if (this.length === 0) {
-      fulfill(this.promise, this._result);
-    } else {
-      this.length = this.length || 0;
-      this._enumerate();
-      if (this._remaining === 0) {
-        fulfill(this.promise, this._result);
-      }
-    }
-  } else {
-    reject(this.promise, validationError());
-  }
-}
-
-function validationError() {
-  return new Error('Array Methods must be provided an Array');
-};
-
-Enumerator.prototype._enumerate = function() {
-  let { length, _input } = this;
-
-  for (let i = 0; this._state === PENDING && i < length; i++) {
-    this._eachEntry(_input[i], i);
-  }
-};
-
-Enumerator.prototype._eachEntry = function(entry, i) {
-  let c = this._instanceConstructor;
-  let { resolve } = c;
-
-  if (resolve === originalResolve) {
-    let then = getThen(entry);
-
-    if (then === originalThen &&
-        entry._state !== PENDING) {
-      this._settledAt(entry._state, i, entry._result);
-    } else if (typeof then !== 'function') {
-      this._remaining--;
-      this._result[i] = entry;
-    } else if (c === Promise) {
-      let promise = new c(noop);
-      handleMaybeThenable(promise, entry, then);
-      this._willSettleAt(promise, i);
-    } else {
-      this._willSettleAt(new c(resolve => resolve(entry)), i);
-    }
-  } else {
-    this._willSettleAt(resolve(entry), i);
-  }
-};
-
-Enumerator.prototype._settledAt = function(state, i, value) {
-  let { promise } = this;
-
-  if (promise._state === PENDING) {
-    this._remaining--;
-
-    if (state === REJECTED) {
-      reject(promise, value);
-    } else {
-      this._result[i] = value;
-    }
-  }
-
-  if (this._remaining === 0) {
-    fulfill(promise, this._result);
-  }
-};
-
-Enumerator.prototype._willSettleAt = function(promise, i) {
-  let enumerator = this;
-
-  subscribe(promise, undefined, value => enumerator._settledAt(FULFILLED, i, value),
-                               reason => enumerator._settledAt(REJECTED, i, reason));
-};
diff --git a/js/node_modules/es6-promise/lib/es6-promise/polyfill.js b/js/node_modules/es6-promise/lib/es6-promise/polyfill.js
deleted file mode 100644
index 83ddf0662b9802b1f48bcfa783a5a6acdd0f5201..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise/polyfill.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*global self*/
-import Promise from './promise';
-
-export default function polyfill() {
-  let local;
-
-  if (typeof global !== 'undefined') {
-      local = global;
-  } else if (typeof self !== 'undefined') {
-      local = self;
-  } else {
-      try {
-          local = Function('return this')();
-      } catch (e) {
-          throw new Error('polyfill failed because global object is unavailable in this environment');
-      }
-  }
-
-  let P = local.Promise;
-
-  if (P) {
-    var promiseToString = null;
-    try {
-        promiseToString = Object.prototype.toString.call(P.resolve());
-    } catch(e) {
-        // silently ignored
-    }
-
-    if (promiseToString === '[object Promise]' && !P.cast){
-        return;
-    }
-  }
-
-  local.Promise = Promise;
-}
diff --git a/js/node_modules/es6-promise/lib/es6-promise/promise.js b/js/node_modules/es6-promise/lib/es6-promise/promise.js
deleted file mode 100644
index 20558cbeeaa45e31292575738ef3817ad7bf01f6..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise/promise.js
+++ /dev/null
@@ -1,383 +0,0 @@
-import {
-  isFunction
-} from './utils';
-
-import {
-  noop,
-  nextId,
-  PROMISE_ID,
-  initializePromise
-} from './-internal';
-
-import {
-  asap,
-  setAsap,
-  setScheduler
-} from './asap';
-
-import all from './promise/all';
-import race from './promise/race';
-import Resolve from './promise/resolve';
-import Reject from './promise/reject';
-import then from './then';
-
-
-function needsResolver() {
-  throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
-}
-
-function needsNew() {
-  throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
-}
-
-/**
-  Promise objects represent the eventual result of an asynchronous operation. The
-  primary way of interacting with a promise is through its `then` method, which
-  registers callbacks to receive either a promise's eventual value or the reason
-  why the promise cannot be fulfilled.
-
-  Terminology
-  -----------
-
-  - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
-  - `thenable` is an object or function that defines a `then` method.
-  - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
-  - `exception` is a value that is thrown using the throw statement.
-  - `reason` is a value that indicates why a promise was rejected.
-  - `settled` the final resting state of a promise, fulfilled or rejected.
-
-  A promise can be in one of three states: pending, fulfilled, or rejected.
-
-  Promises that are fulfilled have a fulfillment value and are in the fulfilled
-  state.  Promises that are rejected have a rejection reason and are in the
-  rejected state.  A fulfillment value is never a thenable.
-
-  Promises can also be said to *resolve* a value.  If this value is also a
-  promise, then the original promise's settled state will match the value's
-  settled state.  So a promise that *resolves* a promise that rejects will
-  itself reject, and a promise that *resolves* a promise that fulfills will
-  itself fulfill.
-
-
-  Basic Usage:
-  ------------
-
-  ```js
-  let promise = new Promise(function(resolve, reject) {
-    // on success
-    resolve(value);
-
-    // on failure
-    reject(reason);
-  });
-
-  promise.then(function(value) {
-    // on fulfillment
-  }, function(reason) {
-    // on rejection
-  });
-  ```
-
-  Advanced Usage:
-  ---------------
-
-  Promises shine when abstracting away asynchronous interactions such as
-  `XMLHttpRequest`s.
-
-  ```js
-  function getJSON(url) {
-    return new Promise(function(resolve, reject){
-      let xhr = new XMLHttpRequest();
-
-      xhr.open('GET', url);
-      xhr.onreadystatechange = handler;
-      xhr.responseType = 'json';
-      xhr.setRequestHeader('Accept', 'application/json');
-      xhr.send();
-
-      function handler() {
-        if (this.readyState === this.DONE) {
-          if (this.status === 200) {
-            resolve(this.response);
-          } else {
-            reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
-          }
-        }
-      };
-    });
-  }
-
-  getJSON('/posts.json').then(function(json) {
-    // on fulfillment
-  }, function(reason) {
-    // on rejection
-  });
-  ```
-
-  Unlike callbacks, promises are great composable primitives.
-
-  ```js
-  Promise.all([
-    getJSON('/posts'),
-    getJSON('/comments')
-  ]).then(function(values){
-    values[0] // => postsJSON
-    values[1] // => commentsJSON
-
-    return values;
-  });
-  ```
-
-  @class Promise
-  @param {function} resolver
-  Useful for tooling.
-  @constructor
-*/
-export default function Promise(resolver) {
-  this[PROMISE_ID] = nextId();
-  this._result = this._state = undefined;
-  this._subscribers = [];
-
-  if (noop !== resolver) {
-    typeof resolver !== 'function' && needsResolver();
-    this instanceof Promise ? initializePromise(this, resolver) : needsNew();
-  }
-}
-
-Promise.all = all;
-Promise.race = race;
-Promise.resolve = Resolve;
-Promise.reject = Reject;
-Promise._setScheduler = setScheduler;
-Promise._setAsap = setAsap;
-Promise._asap = asap;
-
-Promise.prototype = {
-  constructor: Promise,
-
-/**
-  The primary way of interacting with a promise is through its `then` method,
-  which registers callbacks to receive either a promise's eventual value or the
-  reason why the promise cannot be fulfilled.
-
-  ```js
-  findUser().then(function(user){
-    // user is available
-  }, function(reason){
-    // user is unavailable, and you are given the reason why
-  });
-  ```
-
-  Chaining
-  --------
-
-  The return value of `then` is itself a promise.  This second, 'downstream'
-  promise is resolved with the return value of the first promise's fulfillment
-  or rejection handler, or rejected if the handler throws an exception.
-
-  ```js
-  findUser().then(function (user) {
-    return user.name;
-  }, function (reason) {
-    return 'default name';
-  }).then(function (userName) {
-    // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
-    // will be `'default name'`
-  });
-
-  findUser().then(function (user) {
-    throw new Error('Found user, but still unhappy');
-  }, function (reason) {
-    throw new Error('`findUser` rejected and we're unhappy');
-  }).then(function (value) {
-    // never reached
-  }, function (reason) {
-    // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
-    // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
-  });
-  ```
-  If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
-
-  ```js
-  findUser().then(function (user) {
-    throw new PedagogicalException('Upstream error');
-  }).then(function (value) {
-    // never reached
-  }).then(function (value) {
-    // never reached
-  }, function (reason) {
-    // The `PedgagocialException` is propagated all the way down to here
-  });
-  ```
-
-  Assimilation
-  ------------
-
-  Sometimes the value you want to propagate to a downstream promise can only be
-  retrieved asynchronously. This can be achieved by returning a promise in the
-  fulfillment or rejection handler. The downstream promise will then be pending
-  until the returned promise is settled. This is called *assimilation*.
-
-  ```js
-  findUser().then(function (user) {
-    return findCommentsByAuthor(user);
-  }).then(function (comments) {
-    // The user's comments are now available
-  });
-  ```
-
-  If the assimliated promise rejects, then the downstream promise will also reject.
-
-  ```js
-  findUser().then(function (user) {
-    return findCommentsByAuthor(user);
-  }).then(function (comments) {
-    // If `findCommentsByAuthor` fulfills, we'll have the value here
-  }, function (reason) {
-    // If `findCommentsByAuthor` rejects, we'll have the reason here
-  });
-  ```
-
-  Simple Example
-  --------------
-
-  Synchronous Example
-
-  ```javascript
-  let result;
-
-  try {
-    result = findResult();
-    // success
-  } catch(reason) {
-    // failure
-  }
-  ```
-
-  Errback Example
-
-  ```js
-  findResult(function(result, err){
-    if (err) {
-      // failure
-    } else {
-      // success
-    }
-  });
-  ```
-
-  Promise Example;
-
-  ```javascript
-  findResult().then(function(result){
-    // success
-  }, function(reason){
-    // failure
-  });
-  ```
-
-  Advanced Example
-  --------------
-
-  Synchronous Example
-
-  ```javascript
-  let author, books;
-
-  try {
-    author = findAuthor();
-    books  = findBooksByAuthor(author);
-    // success
-  } catch(reason) {
-    // failure
-  }
-  ```
-
-  Errback Example
-
-  ```js
-
-  function foundBooks(books) {
-
-  }
-
-  function failure(reason) {
-
-  }
-
-  findAuthor(function(author, err){
-    if (err) {
-      failure(err);
-      // failure
-    } else {
-      try {
-        findBoooksByAuthor(author, function(books, err) {
-          if (err) {
-            failure(err);
-          } else {
-            try {
-              foundBooks(books);
-            } catch(reason) {
-              failure(reason);
-            }
-          }
-        });
-      } catch(error) {
-        failure(err);
-      }
-      // success
-    }
-  });
-  ```
-
-  Promise Example;
-
-  ```javascript
-  findAuthor().
-    then(findBooksByAuthor).
-    then(function(books){
-      // found books
-  }).catch(function(reason){
-    // something went wrong
-  });
-  ```
-
-  @method then
-  @param {Function} onFulfilled
-  @param {Function} onRejected
-  Useful for tooling.
-  @return {Promise}
-*/
-  then: then,
-
-/**
-  `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
-  as the catch block of a try/catch statement.
-
-  ```js
-  function findAuthor(){
-    throw new Error('couldn't find that author');
-  }
-
-  // synchronous
-  try {
-    findAuthor();
-  } catch(reason) {
-    // something went wrong
-  }
-
-  // async with promises
-  findAuthor().catch(function(reason){
-    // something went wrong
-  });
-  ```
-
-  @method catch
-  @param {Function} onRejection
-  Useful for tooling.
-  @return {Promise}
-*/
-  catch(onRejection) {
-    return this.then(null, onRejection);
-  }
-};
diff --git a/js/node_modules/es6-promise/lib/es6-promise/promise/all.js b/js/node_modules/es6-promise/lib/es6-promise/promise/all.js
deleted file mode 100644
index 9ca3c063aa2f623f0391332911f265557eec36e6..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise/promise/all.js
+++ /dev/null
@@ -1,52 +0,0 @@
-import Enumerator from '../enumerator';
-
-/**
-  `Promise.all` accepts an array of promises, and returns a new promise which
-  is fulfilled with an array of fulfillment values for the passed promises, or
-  rejected with the reason of the first passed promise to be rejected. It casts all
-  elements of the passed iterable to promises as it runs this algorithm.
-
-  Example:
-
-  ```javascript
-  let promise1 = resolve(1);
-  let promise2 = resolve(2);
-  let promise3 = resolve(3);
-  let promises = [ promise1, promise2, promise3 ];
-
-  Promise.all(promises).then(function(array){
-    // The array here would be [ 1, 2, 3 ];
-  });
-  ```
-
-  If any of the `promises` given to `all` are rejected, the first promise
-  that is rejected will be given as an argument to the returned promises's
-  rejection handler. For example:
-
-  Example:
-
-  ```javascript
-  let promise1 = resolve(1);
-  let promise2 = reject(new Error("2"));
-  let promise3 = reject(new Error("3"));
-  let promises = [ promise1, promise2, promise3 ];
-
-  Promise.all(promises).then(function(array){
-    // Code here never runs because there are rejected promises!
-  }, function(error) {
-    // error.message === "2"
-  });
-  ```
-
-  @method all
-  @static
-  @param {Array} entries array of promises
-  @param {String} label optional string for labeling the promise.
-  Useful for tooling.
-  @return {Promise} promise that is fulfilled when all `promises` have been
-  fulfilled, or rejected if any of them become rejected.
-  @static
-*/
-export default function all(entries) {
-  return new Enumerator(this, entries).promise;
-}
diff --git a/js/node_modules/es6-promise/lib/es6-promise/promise/race.js b/js/node_modules/es6-promise/lib/es6-promise/promise/race.js
deleted file mode 100644
index 166dc820b5827e5102961da9e748227a3d12653e..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise/promise/race.js
+++ /dev/null
@@ -1,84 +0,0 @@
-import {
-  isArray
-} from "../utils";
-
-/**
-  `Promise.race` returns a new promise which is settled in the same way as the
-  first passed promise to settle.
-
-  Example:
-
-  ```javascript
-  let promise1 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 1');
-    }, 200);
-  });
-
-  let promise2 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 2');
-    }, 100);
-  });
-
-  Promise.race([promise1, promise2]).then(function(result){
-    // result === 'promise 2' because it was resolved before promise1
-    // was resolved.
-  });
-  ```
-
-  `Promise.race` is deterministic in that only the state of the first
-  settled promise matters. For example, even if other promises given to the
-  `promises` array argument are resolved, but the first settled promise has
-  become rejected before the other promises became fulfilled, the returned
-  promise will become rejected:
-
-  ```javascript
-  let promise1 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      resolve('promise 1');
-    }, 200);
-  });
-
-  let promise2 = new Promise(function(resolve, reject){
-    setTimeout(function(){
-      reject(new Error('promise 2'));
-    }, 100);
-  });
-
-  Promise.race([promise1, promise2]).then(function(result){
-    // Code here never runs
-  }, function(reason){
-    // reason.message === 'promise 2' because promise 2 became rejected before
-    // promise 1 became fulfilled
-  });
-  ```
-
-  An example real-world use case is implementing timeouts:
-
-  ```javascript
-  Promise.race([ajax('foo.json'), timeout(5000)])
-  ```
-
-  @method race
-  @static
-  @param {Array} promises array of promises to observe
-  Useful for tooling.
-  @return {Promise} a promise which settles in the same way as the first passed
-  promise to settle.
-*/
-export default function race(entries) {
-  /*jshint validthis:true */
-  let Constructor = this;
-
-  if (!isArray(entries)) {
-    return new Constructor((_, reject) => reject(new TypeError('You must pass an array to race.')));
-  } else {
-    return new Constructor((resolve, reject) => {
-      let length = entries.length;
-      for (let i = 0; i < length; i++) {
-        Constructor.resolve(entries[i]).then(resolve, reject);
-      }
-    });
-  }
-}
diff --git a/js/node_modules/es6-promise/lib/es6-promise/promise/reject.js b/js/node_modules/es6-promise/lib/es6-promise/promise/reject.js
deleted file mode 100644
index cd55faabf537ca35a81e7e3ddf0388ad00ebfff7..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise/promise/reject.js
+++ /dev/null
@@ -1,46 +0,0 @@
-import {
-  noop,
-  reject as _reject
-} from '../-internal';
-
-/**
-  `Promise.reject` returns a promise rejected with the passed `reason`.
-  It is shorthand for the following:
-
-  ```javascript
-  let promise = new Promise(function(resolve, reject){
-    reject(new Error('WHOOPS'));
-  });
-
-  promise.then(function(value){
-    // Code here doesn't run because the promise is rejected!
-  }, function(reason){
-    // reason.message === 'WHOOPS'
-  });
-  ```
-
-  Instead of writing the above, your code now simply becomes the following:
-
-  ```javascript
-  let promise = Promise.reject(new Error('WHOOPS'));
-
-  promise.then(function(value){
-    // Code here doesn't run because the promise is rejected!
-  }, function(reason){
-    // reason.message === 'WHOOPS'
-  });
-  ```
-
-  @method reject
-  @static
-  @param {Any} reason value that the returned promise will be rejected with.
-  Useful for tooling.
-  @return {Promise} a promise rejected with the given `reason`.
-*/
-export default function reject(reason) {
-  /*jshint validthis:true */
-  let Constructor = this;
-  let promise = new Constructor(noop);
-  _reject(promise, reason);
-  return promise;
-}
diff --git a/js/node_modules/es6-promise/lib/es6-promise/promise/resolve.js b/js/node_modules/es6-promise/lib/es6-promise/promise/resolve.js
deleted file mode 100644
index f4642b630e0517df09787c13aa734bf2706dbc6a..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise/promise/resolve.js
+++ /dev/null
@@ -1,48 +0,0 @@
-import {
-  noop,
-  resolve as _resolve
-} from '../-internal';
-
-/**
-  `Promise.resolve` returns a promise that will become resolved with the
-  passed `value`. It is shorthand for the following:
-
-  ```javascript
-  let promise = new Promise(function(resolve, reject){
-    resolve(1);
-  });
-
-  promise.then(function(value){
-    // value === 1
-  });
-  ```
-
-  Instead of writing the above, your code now simply becomes the following:
-
-  ```javascript
-  let promise = Promise.resolve(1);
-
-  promise.then(function(value){
-    // value === 1
-  });
-  ```
-
-  @method resolve
-  @static
-  @param {Any} value value that the returned promise will be resolved with
-  Useful for tooling.
-  @return {Promise} a promise that will become fulfilled with the given
-  `value`
-*/
-export default function resolve(object) {
-  /*jshint validthis:true */
-  let Constructor = this;
-
-  if (object && typeof object === 'object' && object.constructor === Constructor) {
-    return object;
-  }
-
-  let promise = new Constructor(noop);
-  _resolve(promise, object);
-  return promise;
-}
diff --git a/js/node_modules/es6-promise/lib/es6-promise/then.js b/js/node_modules/es6-promise/lib/es6-promise/then.js
deleted file mode 100644
index b2b79f0a14a4d815cf0f1247dd7edc61efbce02a..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise/then.js
+++ /dev/null
@@ -1,32 +0,0 @@
-import {
-  invokeCallback,
-  subscribe,
-  FULFILLED,
-  REJECTED,
-  noop,
-  makePromise,
-  PROMISE_ID
-} from './-internal';
-
-import { asap } from './asap';
-
-export default function then(onFulfillment, onRejection) {
-  const parent = this;
-
-  const child = new this.constructor(noop);
-
-  if (child[PROMISE_ID] === undefined) {
-    makePromise(child);
-  }
-
-  const { _state } = parent;
-
-  if (_state) {
-    const callback = arguments[_state - 1];
-    asap(() => invokeCallback(_state, child, callback, parent._result));
-  } else {
-    subscribe(parent, child, onFulfillment, onRejection);
-  }
-
-  return child;
-}
diff --git a/js/node_modules/es6-promise/lib/es6-promise/utils.js b/js/node_modules/es6-promise/lib/es6-promise/utils.js
deleted file mode 100644
index 86cf3777599b8d74b7a32b9a8488b76e7a243122..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/lib/es6-promise/utils.js
+++ /dev/null
@@ -1,20 +0,0 @@
-export function objectOrFunction(x) {
-  return typeof x === 'function' || (typeof x === 'object' && x !== null);
-}
-
-export function isFunction(x) {
-  return typeof x === 'function';
-}
-
-export function isMaybeThenable(x) {
-  return typeof x === 'object' && x !== null;
-}
-
-let _isArray;
-if (!Array.isArray) {
-  _isArray = x => Object.prototype.toString.call(x) === '[object Array]';
-} else {
-  _isArray = Array.isArray;
-}
-
-export const isArray = _isArray;
diff --git a/js/node_modules/es6-promise/package.json b/js/node_modules/es6-promise/package.json
deleted file mode 100644
index 5657e35678f9c5b9ad8df18daee6cb0169e4c2c5..0000000000000000000000000000000000000000
--- a/js/node_modules/es6-promise/package.json
+++ /dev/null
@@ -1,124 +0,0 @@
-{
-  "_args": [
-    [
-      "es6-promise@^3.2.1",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport"
-    ]
-  ],
-  "_from": "es6-promise@>=3.2.1 <4.0.0",
-  "_id": "es6-promise@3.3.1",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/es6-promise",
-  "_nodeVersion": "6.3.0",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/es6-promise-3.3.1.tgz_1473876184124_0.4918641895055771"
-  },
-  "_npmUser": {
-    "email": "stefan.penner@gmail.com",
-    "name": "stefanpenner"
-  },
-  "_npmVersion": "3.10.5",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "es6-promise",
-    "raw": "es6-promise@^3.2.1",
-    "rawSpec": "^3.2.1",
-    "scope": null,
-    "spec": ">=3.2.1 <4.0.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/serialport"
-  ],
-  "_resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz",
-  "_shasum": "a08cdde84ccdbf34d027a1451bc91d4bcd28a613",
-  "_shrinkwrap": null,
-  "_spec": "es6-promise@^3.2.1",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport",
-  "author": {
-    "name": "Yehuda Katz, Tom Dale, Stefan Penner and contributors",
-    "url": "Conversion to ES6 API by Jake Archibald"
-  },
-  "browser": {
-    "vertx": false
-  },
-  "bugs": {
-    "url": "https://github.com/stefanpenner/es6-promise/issues"
-  },
-  "dependencies": {},
-  "description": "A lightweight library that provides tools for organizing asynchronous code",
-  "devDependencies": {
-    "broccoli-babel-transpiler": "^5.6.1",
-    "broccoli-concat": "^3.0.2",
-    "broccoli-merge-trees": "^1.1.1",
-    "broccoli-rollup": "^1.0.2",
-    "broccoli-stew": "^1.2.0",
-    "broccoli-uglify-js": "^0.2.0",
-    "broccoli-watchify": "v1.0.0",
-    "ember-cli": "^2.7.0",
-    "ember-cli-dependency-checker": "^1.3.0",
-    "ember-publisher": "0.0.7",
-    "git-repo-version": "0.4.0",
-    "json3": "^3.3.2",
-    "mocha": "^1.20.1",
-    "promises-aplus-tests-phantom": "^2.1.0-revise",
-    "release-it": "0.0.10"
-  },
-  "directories": {
-    "lib": "lib"
-  },
-  "dist": {
-    "shasum": "a08cdde84ccdbf34d027a1451bc91d4bcd28a613",
-    "tarball": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz"
-  },
-  "files": [
-    "!dist/test",
-    "dist",
-    "es6-promise.d.ts",
-    "lib"
-  ],
-  "gitHead": "00ad48b202aab74683b440868c20ad12106d0437",
-  "homepage": "https://github.com/stefanpenner/es6-promise#readme",
-  "keywords": [
-    "futures",
-    "promises"
-  ],
-  "license": "MIT",
-  "main": "dist/es6-promise.js",
-  "maintainers": [
-    {
-      "name": "jaffathecake",
-      "email": "jaffathecake@gmail.com"
-    },
-    {
-      "name": "stefanpenner",
-      "email": "stefan.penner@gmail.com"
-    }
-  ],
-  "name": "es6-promise",
-  "namespace": "es6-promise",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/stefanpenner/es6-promise.git"
-  },
-  "scripts": {
-    "build": "ember build --environment production",
-    "build:production": "ember build --env production",
-    "dry-run-release": "ember build --environment production && release-it --dry-run --non-interactive",
-    "lint": "jshint lib",
-    "prepublish": "ember build --environment production",
-    "start": "ember s",
-    "test": "ember test",
-    "test:node": "ember build && mocha ./dist/test/browserify",
-    "test:server": "ember test --server"
-  },
-  "spm": {
-    "main": "dist/es6-promise.js"
-  },
-  "typings": "es6-promise.d.ts",
-  "version": "3.3.1"
-}
diff --git a/js/node_modules/foreach/.npmignore b/js/node_modules/foreach/.npmignore
deleted file mode 100644
index d135df67cb26f72a1d52605960af26a356718b22..0000000000000000000000000000000000000000
--- a/js/node_modules/foreach/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules
-components
-build
\ No newline at end of file
diff --git a/js/node_modules/foreach/LICENSE b/js/node_modules/foreach/LICENSE
deleted file mode 100644
index 3032d6e34cc52525b7f8f6bab96c6cb2d1e67316..0000000000000000000000000000000000000000
--- a/js/node_modules/foreach/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-The MIT License
-
-Copyright (c) 2013 Manuel Stofer
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/foreach/Makefile b/js/node_modules/foreach/Makefile
deleted file mode 100644
index eae41178666a0e7f624dd07f1e9fc8d8e38e038b..0000000000000000000000000000000000000000
--- a/js/node_modules/foreach/Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
-
-build: components
-	@component build
-
-components: component.json
-	@component install --dev
-
-clean:
-	rm -fr build components template.js
-
-.PHONY: clean
diff --git a/js/node_modules/foreach/Readme.md b/js/node_modules/foreach/Readme.md
deleted file mode 100644
index 2752b5746a472d02103a0111e369ca9830e7227c..0000000000000000000000000000000000000000
--- a/js/node_modules/foreach/Readme.md
+++ /dev/null
@@ -1,30 +0,0 @@
-
-# foreach
-
-Iterate over the key value pairs of either an array-like object or a dictionary like object.
-
-[![browser support][1]][2]
-
-## API
-
-### foreach(object, function, [context])
-
-```js
-var each = require('foreach');
-
-each([1,2,3], function (value, key, array) {
-    // value === 1, 2, 3
-    // key === 0, 1, 2
-    // array === [1, 2, 3]
-});
-
-each({0:1,1:2,2:3}, function (value, key, object) {
-    // value === 1, 2, 3
-    // key === 0, 1, 2
-    // object === {0:1,1:2,2:3}
-});
-```
-
-[1]: https://ci.testling.com/manuelstofer/foreach.png
-[2]: https://ci.testling.com/manuelstofer/foreach
-
diff --git a/js/node_modules/foreach/component.json b/js/node_modules/foreach/component.json
deleted file mode 100644
index 0eeecb513ae2a5bc734afe3eefc28d981b82c331..0000000000000000000000000000000000000000
--- a/js/node_modules/foreach/component.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "name": "foreach",
-    "description": "foreach component + npm package",
-    "version": "2.0.5",
-    "keywords": [],
-    "dependencies": {},
-    "scripts": [
-        "index.js"
-    ],
-    "repo": "manuelstofer/foreach"
-}
diff --git a/js/node_modules/foreach/index.js b/js/node_modules/foreach/index.js
deleted file mode 100644
index a961e4e128cfd710db49a7b4c6aeb2ee3834918f..0000000000000000000000000000000000000000
--- a/js/node_modules/foreach/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-
-var hasOwn = Object.prototype.hasOwnProperty;
-var toString = Object.prototype.toString;
-
-module.exports = function forEach (obj, fn, ctx) {
-    if (toString.call(fn) !== '[object Function]') {
-        throw new TypeError('iterator must be a function');
-    }
-    var l = obj.length;
-    if (l === +l) {
-        for (var i = 0; i < l; i++) {
-            fn.call(ctx, obj[i], i, obj);
-        }
-    } else {
-        for (var k in obj) {
-            if (hasOwn.call(obj, k)) {
-                fn.call(ctx, obj[k], k, obj);
-            }
-        }
-    }
-};
-
diff --git a/js/node_modules/foreach/package.json b/js/node_modules/foreach/package.json
deleted file mode 100644
index 9e6ad8a3d92858ff0681d555cbab99630fb94d61..0000000000000000000000000000000000000000
--- a/js/node_modules/foreach/package.json
+++ /dev/null
@@ -1,109 +0,0 @@
-{
-  "_args": [
-    [
-      "foreach@^2.0.5",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/define-properties"
-    ]
-  ],
-  "_from": "foreach@>=2.0.5 <3.0.0",
-  "_id": "foreach@2.0.5",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/foreach",
-  "_npmUser": {
-    "email": "manuel@takimata.ch",
-    "name": "manuelstofer"
-  },
-  "_npmVersion": "1.4.9",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "foreach",
-    "raw": "foreach@^2.0.5",
-    "rawSpec": "^2.0.5",
-    "scope": null,
-    "spec": ">=2.0.5 <3.0.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/define-properties"
-  ],
-  "_resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
-  "_shasum": "0bee005018aeb260d0a3af3ae658dd0136ec1b99",
-  "_shrinkwrap": null,
-  "_spec": "foreach@^2.0.5",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/define-properties",
-  "author": {
-    "email": "manuel@takimata.ch",
-    "name": "Manuel Stofer"
-  },
-  "bugs": {
-    "url": "https://github.com/manuelstofer/foreach/issues"
-  },
-  "contributors": [
-    {
-      "name": "Manuel Stofer"
-    },
-    {
-      "name": "Jordan Harband",
-      "url": "https://github.com/ljharb"
-    }
-  ],
-  "dependencies": {},
-  "description": "foreach component + npm package",
-  "devDependencies": {
-    "covert": "*",
-    "tape": "*"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "0bee005018aeb260d0a3af3ae658dd0136ec1b99",
-    "tarball": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz"
-  },
-  "homepage": "https://github.com/manuelstofer/foreach",
-  "keywords": [
-    "Array#forEach",
-    "Array.prototype.forEach",
-    "each",
-    "forEach",
-    "shim"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "manuelstofer",
-      "email": "manuel@takimata.ch"
-    }
-  ],
-  "name": "foreach",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/manuelstofer/foreach.git"
-  },
-  "scripts": {
-    "coverage": "covert test.js",
-    "coverage-quiet": "covert --quiet test.js",
-    "test": "node test.js"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2",
-      "chrome/22.0..latest",
-      "chrome/4.0",
-      "chrome/canary",
-      "firefox/15.0..latest",
-      "firefox/3.0",
-      "firefox/nightly",
-      "iexplore/6.0..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/10.0..latest",
-      "opera/next",
-      "safari/5.0.5..latest"
-    ],
-    "files": "test.js"
-  },
-  "version": "2.0.5"
-}
diff --git a/js/node_modules/foreach/test.js b/js/node_modules/foreach/test.js
deleted file mode 100644
index c6283c3c0b3337bb80fd96b59fdfe5eb414df86b..0000000000000000000000000000000000000000
--- a/js/node_modules/foreach/test.js
+++ /dev/null
@@ -1,153 +0,0 @@
-var test = require('tape');
-var forEach = require('./index.js');
-
-
-test('second argument: iterator', function (t) {
-    var arr = [];
-    t.throws(function () { forEach(arr); }, TypeError, 'undefined is not a function');
-    t.throws(function () { forEach(arr, null); }, TypeError, 'null is not a function');
-    t.throws(function () { forEach(arr, ''); }, TypeError, 'string is not a function');
-    t.throws(function () { forEach(arr, /a/); }, TypeError, 'regex is not a function');
-    t.throws(function () { forEach(arr, true); }, TypeError, 'true is not a function');
-    t.throws(function () { forEach(arr, false); }, TypeError, 'false is not a function');
-    t.throws(function () { forEach(arr, NaN); }, TypeError, 'NaN is not a function');
-    t.throws(function () { forEach(arr, 42); }, TypeError, '42 is not a function');
-    t.doesNotThrow(function () { forEach(arr, function () {}); }, 'function is a function');
-    t.end();
-});
-
-test('array', function (t) {
-    var arr = [1, 2, 3];
-
-    t.test('iterates over every item', function (st) {
-        var index = 0;
-        forEach(arr, function () { index += 1; });
-        st.equal(index, arr.length, 'iterates ' + arr.length + ' times');
-        st.end();
-    });
-
-    t.test('first iterator argument', function (st) {
-        var index = 0;
-        st.plan(arr.length);
-        forEach(arr, function (item) {
-            st.equal(arr[index], item, 'item ' + index + ' is passed as first argument');
-            index += 1;
-        });
-        st.end();
-    });
-
-    t.test('second iterator argument', function (st) {
-        var counter = 0;
-        st.plan(arr.length);
-        forEach(arr, function (item, index) {
-            st.equal(counter, index, 'index ' + index + ' is passed as second argument');
-            counter += 1;
-        });
-        st.end();
-    });
-
-    t.test('third iterator argument', function (st) {
-        st.plan(arr.length);
-        forEach(arr, function (item, index, array) {
-            st.deepEqual(arr, array, 'array is passed as third argument');
-        });
-        st.end();
-    });
-
-    t.test('context argument', function (st) {
-        var context = {};
-        st.plan(1);
-        forEach([1], function () {
-            st.equal(this, context, '"this" is the passed context');
-        }, context);
-        st.end();
-    });
-
-    t.end();
-});
-
-test('object', function (t) {
-    var obj = {
-        a: 1,
-        b: 2,
-        c: 3
-    };
-    var keys = ['a', 'b', 'c'];
-
-    var F = function () {
-        this.a = 1;
-        this.b = 2;
-    };
-    F.prototype.c = 3;
-    var fKeys = ['a', 'b'];
-
-    t.test('iterates over every object literal key', function (st) {
-        var counter = 0;
-        forEach(obj, function () { counter += 1; });
-        st.equal(counter, keys.length, 'iterated ' + counter + ' times');
-        st.end();
-    });
-
-    t.test('iterates only over own keys', function (st) {
-        var counter = 0;
-        forEach(new F(), function () { counter += 1; });
-        st.equal(counter, fKeys.length, 'iterated ' + fKeys.length + ' times');
-        st.end();
-    });
-
-    t.test('first iterator argument', function (st) {
-        var index = 0;
-        st.plan(keys.length);
-        forEach(obj, function (item) {
-            st.equal(obj[keys[index]], item, 'item at key ' + keys[index] + ' is passed as first argument');
-            index += 1;
-        });
-        st.end();
-    });
-
-    t.test('second iterator argument', function (st) {
-        var counter = 0;
-        st.plan(keys.length);
-        forEach(obj, function (item, key) {
-            st.equal(keys[counter], key, 'key ' + key + ' is passed as second argument');
-            counter += 1;
-        });
-        st.end();
-    });
-
-    t.test('third iterator argument', function (st) {
-        st.plan(keys.length);
-        forEach(obj, function (item, key, object) {
-            st.deepEqual(obj, object, 'object is passed as third argument');
-        });
-        st.end();
-    });
-
-    t.test('context argument', function (st) {
-        var context = {};
-        st.plan(1);
-        forEach({ a: 1 }, function () {
-            st.equal(this, context, '"this" is the passed context');
-        }, context);
-        st.end();
-    });
-
-    t.end();
-});
-
-
-test('string', function (t) {
-    var str = 'str';
-    t.test('second iterator argument', function (st) {
-        var counter = 0;
-        st.plan(str.length * 2 + 1);
-        forEach(str, function (item, index) {
-            st.equal(counter, index, 'index ' + index + ' is passed as second argument');
-            st.equal(str.charAt(index), item);
-            counter += 1;
-        });
-        st.equal(counter, str.length, 'iterates ' + str.length + ' times');
-    });
-    t.end();
-});
-
diff --git a/js/node_modules/function-bind/.eslintrc b/js/node_modules/function-bind/.eslintrc
deleted file mode 100644
index 420b25351af38fa780ce084d7921e65714cb72ab..0000000000000000000000000000000000000000
--- a/js/node_modules/function-bind/.eslintrc
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"max-nested-callbacks": [2, 3],
-		"max-params": [2, 3],
-		"max-statements": [2, 20],
-		"no-new-func": [1],
-		"strict": [0]
-	}
-}
diff --git a/js/node_modules/function-bind/.jscs.json b/js/node_modules/function-bind/.jscs.json
deleted file mode 100644
index d7047f6e952ece3213182e5c5e0774cbfb0218f4..0000000000000000000000000000000000000000
--- a/js/node_modules/function-bind/.jscs.json
+++ /dev/null
@@ -1,159 +0,0 @@
-{
-	"es3": true,
-
-	"additionalRules": [],
-
-	"requireSemicolons": true,
-
-	"disallowMultipleSpaces": true,
-
-	"disallowIdentifierNames": [],
-
-	"requireCurlyBraces": {
-		"allExcept": [],
-		"keywords": ["if", "else", "for", "while", "do", "try", "catch"]
-	},
-
-	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
-
-	"disallowSpaceAfterKeywords": [],
-
-	"disallowSpaceBeforeComma": true,
-	"disallowSpaceAfterComma": false,
-	"disallowSpaceBeforeSemicolon": true,
-
-	"disallowNodeTypes": [
-		"DebuggerStatement",
-		"ForInStatement",
-		"LabeledStatement",
-		"SwitchCase",
-		"SwitchStatement",
-		"WithStatement"
-	],
-
-	"requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },
-
-	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
-	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
-	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
-
-	"requireSpaceBetweenArguments": true,
-
-	"disallowSpacesInsideParentheses": true,
-
-	"disallowSpacesInsideArrayBrackets": true,
-
-	"disallowQuotedKeysInObjects": "allButReserved",
-
-	"disallowSpaceAfterObjectKeys": true,
-
-	"requireCommaBeforeLineBreak": true,
-
-	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
-	"requireSpaceAfterPrefixUnaryOperators": [],
-
-	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
-	"requireSpaceBeforePostfixUnaryOperators": [],
-
-	"disallowSpaceBeforeBinaryOperators": [],
-	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-
-	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-	"disallowSpaceAfterBinaryOperators": [],
-
-	"disallowImplicitTypeConversion": ["binary", "string"],
-
-	"disallowKeywords": ["with", "eval"],
-
-	"requireKeywordsOnNewLine": [],
-	"disallowKeywordsOnNewLine": ["else"],
-
-	"requireLineFeedAtFileEnd": true,
-
-	"disallowTrailingWhitespace": true,
-
-	"disallowTrailingComma": true,
-
-	"excludeFiles": ["node_modules/**", "vendor/**"],
-
-	"disallowMultipleLineStrings": true,
-
-	"requireDotNotation": { "allExcept": ["keywords"] },
-
-	"requireParenthesesAroundIIFE": true,
-
-	"validateLineBreaks": "LF",
-
-	"validateQuoteMarks": {
-		"escape": true,
-		"mark": "'"
-	},
-
-	"disallowOperatorBeforeLineBreak": [],
-
-	"requireSpaceBeforeKeywords": [
-		"do",
-		"for",
-		"if",
-		"else",
-		"switch",
-		"case",
-		"try",
-		"catch",
-		"finally",
-		"while",
-		"with",
-		"return"
-	],
-
-	"validateAlignedFunctionParameters": {
-		"lineBreakAfterOpeningBraces": true,
-		"lineBreakBeforeClosingBraces": true
-	},
-
-	"requirePaddingNewLinesBeforeExport": true,
-
-	"validateNewlineAfterArrayElements": {
-		"maximum": 8
-	},
-
-	"requirePaddingNewLinesAfterUseStrict": true,
-
-	"disallowArrowFunctions": true,
-
-	"disallowMultiLineTernary": true,
-
-	"validateOrderInObjectKeys": "asc-insensitive",
-
-	"disallowIdenticalDestructuringNames": true,
-
-	"disallowNestedTernaries": { "maxLevel": 1 },
-
-	"requireSpaceAfterComma": { "allExcept": ["trailing"] },
-	"requireAlignedMultilineParams": false,
-
-	"requireSpacesInGenerator": {
-		"afterStar": true
-	},
-
-	"disallowSpacesInGenerator": {
-		"beforeStar": true
-	},
-
-	"disallowVar": false,
-
-	"requireArrayDestructuring": false,
-
-	"requireEnhancedObjectLiterals": false,
-
-	"requireObjectDestructuring": false,
-
-	"requireEarlyReturn": false,
-
-	"requireCapitalizedConstructorsNew": {
-		"allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
-	}
-}
-
diff --git a/js/node_modules/function-bind/.npmignore b/js/node_modules/function-bind/.npmignore
deleted file mode 100644
index 8363b8e3d62c28ebb51cbb8ae6b9e040488d8934..0000000000000000000000000000000000000000
--- a/js/node_modules/function-bind/.npmignore
+++ /dev/null
@@ -1,16 +0,0 @@
-.DS_Store
-.monitor
-.*.swp
-.nodemonignore
-releases
-*.log
-*.err
-fleet.json
-public/browserify
-bin/*.json
-.bin
-build
-compile
-.lock-wscript
-coverage
-node_modules
diff --git a/js/node_modules/function-bind/.travis.yml b/js/node_modules/function-bind/.travis.yml
deleted file mode 100644
index caabb460943e53ed4e8e580a79861987f0e0b7b7..0000000000000000000000000000000000000000
--- a/js/node_modules/function-bind/.travis.yml
+++ /dev/null
@@ -1,77 +0,0 @@
-language: node_js
-node_js:
-  - "5.6"
-  - "5.5"
-  - "5.4"
-  - "5.3"
-  - "5.2"
-  - "5.1"
-  - "5.0"
-  - "4.3"
-  - "4.2"
-  - "4.1"
-  - "4.0"
-  - "iojs-v3.3"
-  - "iojs-v3.2"
-  - "iojs-v3.1"
-  - "iojs-v3.0"
-  - "iojs-v2.5"
-  - "iojs-v2.4"
-  - "iojs-v2.3"
-  - "iojs-v2.2"
-  - "iojs-v2.1"
-  - "iojs-v2.0"
-  - "iojs-v1.8"
-  - "iojs-v1.7"
-  - "iojs-v1.6"
-  - "iojs-v1.5"
-  - "iojs-v1.4"
-  - "iojs-v1.3"
-  - "iojs-v1.2"
-  - "iojs-v1.1"
-  - "iojs-v1.0"
-  - "0.12"
-  - "0.11"
-  - "0.10"
-  - "0.9"
-  - "0.8"
-  - "0.6"
-  - "0.4"
-before_install:
-  - 'if [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ;; esac ; fi'
-  - 'if [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then npm install -g npm; fi'
-script:
-  - 'if [ "${TRAVIS_NODE_VERSION}" != "4.3" ]; then npm run tests-only ; else npm test ; fi'
-sudo: false
-matrix:
-  fast_finish: true
-  allow_failures:
-    - node_js: "5.5"
-    - node_js: "5.4"
-    - node_js: "5.3"
-    - node_js: "5.2"
-    - node_js: "5.1"
-    - node_js: "5.0"
-    - node_js: "4.2"
-    - node_js: "4.1"
-    - node_js: "4.0"
-    - node_js: "iojs-v3.2"
-    - node_js: "iojs-v3.1"
-    - node_js: "iojs-v3.0"
-    - node_js: "iojs-v2.4"
-    - node_js: "iojs-v2.3"
-    - node_js: "iojs-v2.2"
-    - node_js: "iojs-v2.1"
-    - node_js: "iojs-v2.0"
-    - node_js: "iojs-v1.7"
-    - node_js: "iojs-v1.6"
-    - node_js: "iojs-v1.5"
-    - node_js: "iojs-v1.4"
-    - node_js: "iojs-v1.3"
-    - node_js: "iojs-v1.2"
-    - node_js: "iojs-v1.1"
-    - node_js: "iojs-v1.0"
-    - node_js: "0.11"
-    - node_js: "0.9"
-    - node_js: "0.6"
-    - node_js: "0.4"
diff --git a/js/node_modules/function-bind/LICENSE b/js/node_modules/function-bind/LICENSE
deleted file mode 100644
index 62d6d237ff179b118746a64a34967f7ff4b5dff8..0000000000000000000000000000000000000000
--- a/js/node_modules/function-bind/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2013 Raynos.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
diff --git a/js/node_modules/function-bind/README.md b/js/node_modules/function-bind/README.md
deleted file mode 100644
index 81862a02cb940c85d931749fd507165b1bc54058..0000000000000000000000000000000000000000
--- a/js/node_modules/function-bind/README.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# function-bind
-
-<!--
-    [![build status][travis-svg]][travis-url]
-    [![NPM version][npm-badge-svg]][npm-url]
-    [![Coverage Status][5]][6]
-    [![gemnasium Dependency Status][7]][8]
-    [![Dependency status][deps-svg]][deps-url]
-    [![Dev Dependency status][dev-deps-svg]][dev-deps-url]
--->
-
-<!-- [![browser support][11]][12] -->
-
-Implementation of function.prototype.bind
-
-## Example
-
-I mainly do this for unit tests I run on phantomjs.
-PhantomJS does not have Function.prototype.bind :(
-
-```js
-Function.prototype.bind = require("function-bind")
-```
-
-## Installation
-
-`npm install function-bind`
-
-## Contributors
-
- - Raynos
-
-## MIT Licenced
-
-  [travis-svg]: https://travis-ci.org/Raynos/function-bind.svg
-  [travis-url]: https://travis-ci.org/Raynos/function-bind
-  [npm-badge-svg]: https://badge.fury.io/js/function-bind.svg
-  [npm-url]: https://npmjs.org/package/function-bind
-  [5]: https://coveralls.io/repos/Raynos/function-bind/badge.png
-  [6]: https://coveralls.io/r/Raynos/function-bind
-  [7]: https://gemnasium.com/Raynos/function-bind.png
-  [8]: https://gemnasium.com/Raynos/function-bind
-  [deps-svg]: https://david-dm.org/Raynos/function-bind.svg
-  [deps-url]: https://david-dm.org/Raynos/function-bind
-  [dev-deps-svg]: https://david-dm.org/Raynos/function-bind/dev-status.svg
-  [dev-deps-url]: https://david-dm.org/Raynos/function-bind#info=devDependencies
-  [11]: https://ci.testling.com/Raynos/function-bind.png
-  [12]: https://ci.testling.com/Raynos/function-bind
diff --git a/js/node_modules/function-bind/implementation.js b/js/node_modules/function-bind/implementation.js
deleted file mode 100644
index 5e91272802571ed9638cc7eaff0b49fc25cf799b..0000000000000000000000000000000000000000
--- a/js/node_modules/function-bind/implementation.js
+++ /dev/null
@@ -1,48 +0,0 @@
-var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
-var slice = Array.prototype.slice;
-var toStr = Object.prototype.toString;
-var funcType = '[object Function]';
-
-module.exports = function bind(that) {
-    var target = this;
-    if (typeof target !== 'function' || toStr.call(target) !== funcType) {
-        throw new TypeError(ERROR_MESSAGE + target);
-    }
-    var args = slice.call(arguments, 1);
-
-    var bound;
-    var binder = function () {
-        if (this instanceof bound) {
-            var result = target.apply(
-                this,
-                args.concat(slice.call(arguments))
-            );
-            if (Object(result) === result) {
-                return result;
-            }
-            return this;
-        } else {
-            return target.apply(
-                that,
-                args.concat(slice.call(arguments))
-            );
-        }
-    };
-
-    var boundLength = Math.max(0, target.length - args.length);
-    var boundArgs = [];
-    for (var i = 0; i < boundLength; i++) {
-        boundArgs.push('$' + i);
-    }
-
-    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
-
-    if (target.prototype) {
-        var Empty = function Empty() {};
-        Empty.prototype = target.prototype;
-        bound.prototype = new Empty();
-        Empty.prototype = null;
-    }
-
-    return bound;
-};
diff --git a/js/node_modules/function-bind/index.js b/js/node_modules/function-bind/index.js
deleted file mode 100644
index 60ba57846097b22548ca62b84d2575e73d07812d..0000000000000000000000000000000000000000
--- a/js/node_modules/function-bind/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var implementation = require('./implementation');
-
-module.exports = Function.prototype.bind || implementation;
diff --git a/js/node_modules/function-bind/package.json b/js/node_modules/function-bind/package.json
deleted file mode 100644
index babdb4219a4b72099d14cf714fabb4d142fdc32c..0000000000000000000000000000000000000000
--- a/js/node_modules/function-bind/package.json
+++ /dev/null
@@ -1,129 +0,0 @@
-{
-  "_args": [
-    [
-      "function-bind@^1.1.0",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/object.assign"
-    ]
-  ],
-  "_from": "function-bind@>=1.1.0 <2.0.0",
-  "_id": "function-bind@1.1.0",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/function-bind",
-  "_nodeVersion": "5.6.0",
-  "_npmOperationalInternal": {
-    "host": "packages-6-west.internal.npmjs.com",
-    "tmp": "tmp/function-bind-1.1.0.tgz_1455438520627_0.822420896962285"
-  },
-  "_npmUser": {
-    "email": "ljharb@gmail.com",
-    "name": "ljharb"
-  },
-  "_npmVersion": "3.6.0",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "function-bind",
-    "raw": "function-bind@^1.1.0",
-    "rawSpec": "^1.1.0",
-    "scope": null,
-    "spec": ">=1.1.0 <2.0.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/object.assign"
-  ],
-  "_resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz",
-  "_shasum": "16176714c801798e4e8f2cf7f7529467bb4a5771",
-  "_shrinkwrap": null,
-  "_spec": "function-bind@^1.1.0",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/object.assign",
-  "author": {
-    "email": "raynos2@gmail.com",
-    "name": "Raynos"
-  },
-  "bugs": {
-    "email": "raynos2@gmail.com",
-    "url": "https://github.com/Raynos/function-bind/issues"
-  },
-  "contributors": [
-    {
-      "name": "Raynos"
-    },
-    {
-      "name": "Jordan Harband",
-      "url": "https://github.com/ljharb"
-    }
-  ],
-  "dependencies": {},
-  "description": "Implementation of Function.prototype.bind",
-  "devDependencies": {
-    "@ljharb/eslint-config": "^2.1.0",
-    "covert": "^1.1.0",
-    "eslint": "^2.0.0",
-    "jscs": "^2.9.0",
-    "tape": "^4.4.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "16176714c801798e4e8f2cf7f7529467bb4a5771",
-    "tarball": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz"
-  },
-  "gitHead": "cb5057f2a0018ac48c812ccee86934a5af30efdb",
-  "homepage": "https://github.com/Raynos/function-bind",
-  "keywords": [
-    "bind",
-    "es5",
-    "function",
-    "shim"
-  ],
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "http://github.com/Raynos/function-bind/raw/master/LICENSE"
-    }
-  ],
-  "main": "index",
-  "maintainers": [
-    {
-      "name": "raynos",
-      "email": "raynos2@gmail.com"
-    },
-    {
-      "name": "ljharb",
-      "email": "ljharb@gmail.com"
-    }
-  ],
-  "name": "function-bind",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/Raynos/function-bind.git"
-  },
-  "scripts": {
-    "coverage": "covert test/*.js",
-    "coverage-quiet": "covert test/*.js --quiet",
-    "eslint": "eslint *.js */*.js",
-    "jscs": "jscs *.js */*.js",
-    "lint": "npm run jscs && npm run eslint",
-    "test": "npm run lint && npm run tests-only && npm run coverage-quiet",
-    "tests-only": "node test"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2..latest",
-      "chrome/22..latest",
-      "chrome/canary",
-      "firefox/16..latest",
-      "firefox/nightly",
-      "ie/8..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest"
-    ],
-    "files": "test/index.js"
-  },
-  "version": "1.1.0"
-}
diff --git a/js/node_modules/function-bind/test/index.js b/js/node_modules/function-bind/test/index.js
deleted file mode 100644
index ba1bfad257575edda86b72e7c7d2a0049fda3517..0000000000000000000000000000000000000000
--- a/js/node_modules/function-bind/test/index.js
+++ /dev/null
@@ -1,250 +0,0 @@
-var test = require('tape');
-
-var functionBind = require('../implementation');
-var getCurrentContext = function () { return this; };
-
-test('functionBind is a function', function (t) {
-    t.equal(typeof functionBind, 'function');
-    t.end();
-});
-
-test('non-functions', function (t) {
-    var nonFunctions = [true, false, [], {}, 42, 'foo', NaN, /a/g];
-    t.plan(nonFunctions.length);
-    for (var i = 0; i < nonFunctions.length; ++i) {
-        try { functionBind.call(nonFunctions[i]); } catch (ex) {
-            t.ok(ex instanceof TypeError, 'throws when given ' + String(nonFunctions[i]));
-        }
-    }
-    t.end();
-});
-
-test('without a context', function (t) {
-    t.test('binds properly', function (st) {
-        var args, context;
-        var namespace = {
-            func: functionBind.call(function () {
-                args = Array.prototype.slice.call(arguments);
-                context = this;
-            })
-        };
-        namespace.func(1, 2, 3);
-        st.deepEqual(args, [1, 2, 3]);
-        st.equal(context, getCurrentContext.call());
-        st.end();
-    });
-
-    t.test('binds properly, and still supplies bound arguments', function (st) {
-        var args, context;
-        var namespace = {
-            func: functionBind.call(function () {
-                args = Array.prototype.slice.call(arguments);
-                context = this;
-            }, undefined, 1, 2, 3)
-        };
-        namespace.func(4, 5, 6);
-        st.deepEqual(args, [1, 2, 3, 4, 5, 6]);
-        st.equal(context, getCurrentContext.call());
-        st.end();
-    });
-
-    t.test('returns properly', function (st) {
-        var args;
-        var namespace = {
-            func: functionBind.call(function () {
-                args = Array.prototype.slice.call(arguments);
-                return this;
-            }, null)
-        };
-        var context = namespace.func(1, 2, 3);
-        st.equal(context, getCurrentContext.call(), 'returned context is namespaced context');
-        st.deepEqual(args, [1, 2, 3], 'passed arguments are correct');
-        st.end();
-    });
-
-    t.test('returns properly with bound arguments', function (st) {
-        var args;
-        var namespace = {
-            func: functionBind.call(function () {
-                args = Array.prototype.slice.call(arguments);
-                return this;
-            }, null, 1, 2, 3)
-        };
-        var context = namespace.func(4, 5, 6);
-        st.equal(context, getCurrentContext.call(), 'returned context is namespaced context');
-        st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct');
-        st.end();
-    });
-
-    t.test('called as a constructor', function (st) {
-        var thunkify = function (value) {
-            return function () { return value; };
-        };
-        st.test('returns object value', function (sst) {
-            var expectedReturnValue = [1, 2, 3];
-            var Constructor = functionBind.call(thunkify(expectedReturnValue), null);
-            var result = new Constructor();
-            sst.equal(result, expectedReturnValue);
-            sst.end();
-        });
-
-        st.test('does not return primitive value', function (sst) {
-            var Constructor = functionBind.call(thunkify(42), null);
-            var result = new Constructor();
-            sst.notEqual(result, 42);
-            sst.end();
-        });
-
-        st.test('object from bound constructor is instance of original and bound constructor', function (sst) {
-            var A = function (x) {
-                this.name = x || 'A';
-            };
-            var B = functionBind.call(A, null, 'B');
-
-            var result = new B();
-            sst.ok(result instanceof B, 'result is instance of bound constructor');
-            sst.ok(result instanceof A, 'result is instance of original constructor');
-            sst.end();
-        });
-
-        st.end();
-    });
-
-    t.end();
-});
-
-test('with a context', function (t) {
-    t.test('with no bound arguments', function (st) {
-        var args, context;
-        var boundContext = {};
-        var namespace = {
-            func: functionBind.call(function () {
-                args = Array.prototype.slice.call(arguments);
-                context = this;
-            }, boundContext)
-        };
-        namespace.func(1, 2, 3);
-        st.equal(context, boundContext, 'binds a context properly');
-        st.deepEqual(args, [1, 2, 3], 'supplies passed arguments');
-        st.end();
-    });
-
-    t.test('with bound arguments', function (st) {
-        var args, context;
-        var boundContext = {};
-        var namespace = {
-            func: functionBind.call(function () {
-                args = Array.prototype.slice.call(arguments);
-                context = this;
-            }, boundContext, 1, 2, 3)
-        };
-        namespace.func(4, 5, 6);
-        st.equal(context, boundContext, 'binds a context properly');
-        st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'supplies bound and passed arguments');
-        st.end();
-    });
-
-    t.test('returns properly', function (st) {
-        var boundContext = {};
-        var args;
-        var namespace = {
-            func: functionBind.call(function () {
-                args = Array.prototype.slice.call(arguments);
-                return this;
-            }, boundContext)
-        };
-        var context = namespace.func(1, 2, 3);
-        st.equal(context, boundContext, 'returned context is bound context');
-        st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context');
-        st.deepEqual(args, [1, 2, 3], 'passed arguments are correct');
-        st.end();
-    });
-
-    t.test('returns properly with bound arguments', function (st) {
-        var boundContext = {};
-        var args;
-        var namespace = {
-            func: functionBind.call(function () {
-                args = Array.prototype.slice.call(arguments);
-                return this;
-            }, boundContext, 1, 2, 3)
-        };
-        var context = namespace.func(4, 5, 6);
-        st.equal(context, boundContext, 'returned context is bound context');
-        st.notEqual(context, getCurrentContext.call(), 'returned context is not lexical context');
-        st.deepEqual(args, [1, 2, 3, 4, 5, 6], 'passed arguments are correct');
-        st.end();
-    });
-
-    t.test('passes the correct arguments when called as a constructor', function (st) {
-        var expected = { name: 'Correct' };
-        var namespace = {
-            Func: functionBind.call(function (arg) {
-                return arg;
-            }, { name: 'Incorrect' })
-        };
-        var returned = new namespace.Func(expected);
-        st.equal(returned, expected, 'returns the right arg when called as a constructor');
-        st.end();
-    });
-
-    t.test('has the new instance\'s context when called as a constructor', function (st) {
-        var actualContext;
-        var expectedContext = { foo: 'bar' };
-        var namespace = {
-            Func: functionBind.call(function () {
-                actualContext = this;
-            }, expectedContext)
-        };
-        var result = new namespace.Func();
-        st.equal(result instanceof namespace.Func, true);
-        st.notEqual(actualContext, expectedContext);
-        st.end();
-    });
-
-    t.end();
-});
-
-test('bound function length', function (t) {
-    t.test('sets a correct length without thisArg', function (st) {
-        var subject = functionBind.call(function (a, b, c) { return a + b + c; });
-        st.equal(subject.length, 3);
-        st.equal(subject(1, 2, 3), 6);
-        st.end();
-    });
-
-    t.test('sets a correct length with thisArg', function (st) {
-        var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {});
-        st.equal(subject.length, 3);
-        st.equal(subject(1, 2, 3), 6);
-        st.end();
-    });
-
-    t.test('sets a correct length without thisArg and first argument', function (st) {
-        var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1);
-        st.equal(subject.length, 2);
-        st.equal(subject(2, 3), 6);
-        st.end();
-    });
-
-    t.test('sets a correct length with thisArg and first argument', function (st) {
-        var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1);
-        st.equal(subject.length, 2);
-        st.equal(subject(2, 3), 6);
-        st.end();
-    });
-
-    t.test('sets a correct length without thisArg and too many arguments', function (st) {
-        var subject = functionBind.call(function (a, b, c) { return a + b + c; }, undefined, 1, 2, 3, 4);
-        st.equal(subject.length, 0);
-        st.equal(subject(), 6);
-        st.end();
-    });
-
-    t.test('sets a correct length with thisArg and too many arguments', function (st) {
-        var subject = functionBind.call(function (a, b, c) { return a + b + c; }, {}, 1, 2, 3, 4);
-        st.equal(subject.length, 0);
-        st.equal(subject(), 6);
-        st.end();
-    });
-});
diff --git a/js/node_modules/graceful-readlink/.npmignore b/js/node_modules/graceful-readlink/.npmignore
deleted file mode 100644
index 3ac7d16c6d65254515d766fe9344fbeda3444afb..0000000000000000000000000000000000000000
--- a/js/node_modules/graceful-readlink/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.idea/
-.DS_Store
-node_modules/
diff --git a/js/node_modules/graceful-readlink/.travis.yml b/js/node_modules/graceful-readlink/.travis.yml
deleted file mode 100644
index baf9be7f6c8c0a3dc03a03e1195f2985854cef7d..0000000000000000000000000000000000000000
--- a/js/node_modules/graceful-readlink/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-node_js:
-  - "0.10"
-  - "0.12"
-  - "io.js"
diff --git a/js/node_modules/graceful-readlink/LICENSE b/js/node_modules/graceful-readlink/LICENSE
deleted file mode 100644
index d1f842f0bb2722b310f364cc7a5d6642a548d012..0000000000000000000000000000000000000000
--- a/js/node_modules/graceful-readlink/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Zhiye Li
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
diff --git a/js/node_modules/graceful-readlink/README.md b/js/node_modules/graceful-readlink/README.md
deleted file mode 100644
index fc63b505a516b2db12eb50ebd50f78447e29178d..0000000000000000000000000000000000000000
--- a/js/node_modules/graceful-readlink/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# graceful-readlink
-[![NPM Version](http://img.shields.io/npm/v/graceful-readlink.svg?style=flat)](https://www.npmjs.org/package/graceful-readlink)
-[![NPM Downloads](https://img.shields.io/npm/dm/graceful-readlink.svg?style=flat)](https://www.npmjs.org/package/graceful-readlink)
-
-
-## Usage
-
-```js
-var readlinkSync = require('graceful-readlink').readlinkSync;
-console.log(readlinkSync(f));
-// output
-//  the file pointed to when `f` is a symbolic link
-//  the `f` itself when `f` is not a symbolic link
-```
-## Licence
-
-MIT License
diff --git a/js/node_modules/graceful-readlink/index.js b/js/node_modules/graceful-readlink/index.js
deleted file mode 100644
index 7e9fc70f0ac25112945e1b3a44ed99c627c2b108..0000000000000000000000000000000000000000
--- a/js/node_modules/graceful-readlink/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var fs = require('fs')
-  , lstat = fs.lstatSync;
-
-exports.readlinkSync = function (p) {
-  if (lstat(p).isSymbolicLink()) {
-    return fs.readlinkSync(p);
-  } else {
-    return p;
-  }
-};
-
-
diff --git a/js/node_modules/graceful-readlink/package.json b/js/node_modules/graceful-readlink/package.json
deleted file mode 100644
index 07a50f27cdba10d8ba0e5555247cae8155cee340..0000000000000000000000000000000000000000
--- a/js/node_modules/graceful-readlink/package.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "_args": [
-    [
-      "graceful-readlink@>= 1.0.0",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/commander"
-    ]
-  ],
-  "_from": "graceful-readlink@>=1.0.0",
-  "_id": "graceful-readlink@1.0.1",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/graceful-readlink",
-  "_nodeVersion": "0.11.14",
-  "_npmUser": {
-    "email": "zhiyelee@gmail.com",
-    "name": "zhiyelee"
-  },
-  "_npmVersion": "2.1.17",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "graceful-readlink",
-    "raw": "graceful-readlink@>= 1.0.0",
-    "rawSpec": ">= 1.0.0",
-    "scope": null,
-    "spec": ">=1.0.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/commander"
-  ],
-  "_resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
-  "_shasum": "4cafad76bc62f02fa039b2f94e9a3dd3a391a725",
-  "_shrinkwrap": null,
-  "_spec": "graceful-readlink@>= 1.0.0",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/commander",
-  "author": {
-    "name": "zhiyelee"
-  },
-  "bugs": {
-    "url": "https://github.com/zhiyelee/graceful-readlink/issues"
-  },
-  "dependencies": {},
-  "description": "graceful fs.readlink",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "4cafad76bc62f02fa039b2f94e9a3dd3a391a725",
-    "tarball": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz"
-  },
-  "gitHead": "f6655275bebef706fb63fd01b5f062a7052419a5",
-  "homepage": "https://github.com/zhiyelee/graceful-readlink",
-  "keywords": [
-    "fs.readlink",
-    "readlink"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "zhiyelee",
-      "email": "zhiyelee@gmail.com"
-    }
-  ],
-  "name": "graceful-readlink",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/zhiyelee/graceful-readlink.git"
-  },
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "version": "1.0.1"
-}
diff --git a/js/node_modules/ms/.npmignore b/js/node_modules/ms/.npmignore
deleted file mode 100644
index d1aa0ce42e1360888a2eae1af82ef65a882be9a5..0000000000000000000000000000000000000000
--- a/js/node_modules/ms/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-node_modules
-test
-History.md
-Makefile
-component.json
diff --git a/js/node_modules/ms/History.md b/js/node_modules/ms/History.md
deleted file mode 100644
index 32fdfc17623565a5af395b2d3e94624c03443ccf..0000000000000000000000000000000000000000
--- a/js/node_modules/ms/History.md
+++ /dev/null
@@ -1,66 +0,0 @@
-
-0.7.1 / 2015-04-20
-==================
-
-  * prevent extraordinary long inputs (@evilpacket)
-  * Fixed broken readme link
-
-0.7.0 / 2014-11-24
-==================
-
- * add time abbreviations, updated tests and readme for the new units
- * fix example in the readme.
- * add LICENSE file
-
-0.6.2 / 2013-12-05
-==================
-
- * Adding repository section to package.json to suppress warning from NPM.
-
-0.6.1 / 2013-05-10
-==================
-
-  * fix singularization [visionmedia]
-
-0.6.0 / 2013-03-15
-==================
-
-  * fix minutes
-
-0.5.1 / 2013-02-24
-==================
-
-  * add component namespace
-
-0.5.0 / 2012-11-09
-==================
-
-  * add short formatting as default and .long option
-  * add .license property to component.json
-  * add version to component.json
-
-0.4.0 / 2012-10-22
-==================
-
-  * add rounding to fix crazy decimals
-
-0.3.0 / 2012-09-07
-==================
-
-  * fix `ms(<String>)` [visionmedia]
-
-0.2.0 / 2012-09-03
-==================
-
-  * add component.json [visionmedia]
-  * add days support [visionmedia]
-  * add hours support [visionmedia]
-  * add minutes support [visionmedia]
-  * add seconds support [visionmedia]
-  * add ms string support [visionmedia]
-  * refactor tests to facilitate ms(number) [visionmedia]
-
-0.1.0 / 2012-03-07
-==================
-
-  * Initial release
diff --git a/js/node_modules/ms/LICENSE b/js/node_modules/ms/LICENSE
deleted file mode 100644
index 6c07561b62ddfa814e23d895ca587dd56c5b666f..0000000000000000000000000000000000000000
--- a/js/node_modules/ms/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014 Guillermo Rauch <rauchg@gmail.com>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/ms/README.md b/js/node_modules/ms/README.md
deleted file mode 100644
index 9b4fd03581b18c554be7c4a641446316236edaf2..0000000000000000000000000000000000000000
--- a/js/node_modules/ms/README.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# ms.js: miliseconds conversion utility
-
-```js
-ms('2 days')  // 172800000
-ms('1d')      // 86400000
-ms('10h')     // 36000000
-ms('2.5 hrs') // 9000000
-ms('2h')      // 7200000
-ms('1m')      // 60000
-ms('5s')      // 5000
-ms('100')     // 100
-```
-
-```js
-ms(60000)             // "1m"
-ms(2 * 60000)         // "2m"
-ms(ms('10 hours'))    // "10h"
-```
-
-```js
-ms(60000, { long: true })             // "1 minute"
-ms(2 * 60000, { long: true })         // "2 minutes"
-ms(ms('10 hours'), { long: true })    // "10 hours"
-```
-
-- Node/Browser compatible. Published as [`ms`](https://www.npmjs.org/package/ms) in [NPM](http://nodejs.org/download).
-- If a number is supplied to `ms`, a string with a unit is returned.
-- If a string that contains the number is supplied, it returns it as
-a number (e.g: it returns `100` for `'100'`).
-- If you pass a string with a number and a valid unit, the number of
-equivalent ms is returned.
-
-## License
-
-MIT
diff --git a/js/node_modules/ms/index.js b/js/node_modules/ms/index.js
deleted file mode 100644
index 4f9277169674b468c444152d77485c60a56a182f..0000000000000000000000000000000000000000
--- a/js/node_modules/ms/index.js
+++ /dev/null
@@ -1,125 +0,0 @@
-/**
- * Helpers.
- */
-
-var s = 1000;
-var m = s * 60;
-var h = m * 60;
-var d = h * 24;
-var y = d * 365.25;
-
-/**
- * Parse or format the given `val`.
- *
- * Options:
- *
- *  - `long` verbose formatting [false]
- *
- * @param {String|Number} val
- * @param {Object} options
- * @return {String|Number}
- * @api public
- */
-
-module.exports = function(val, options){
-  options = options || {};
-  if ('string' == typeof val) return parse(val);
-  return options.long
-    ? long(val)
-    : short(val);
-};
-
-/**
- * Parse the given `str` and return milliseconds.
- *
- * @param {String} str
- * @return {Number}
- * @api private
- */
-
-function parse(str) {
-  str = '' + str;
-  if (str.length > 10000) return;
-  var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(str);
-  if (!match) return;
-  var n = parseFloat(match[1]);
-  var type = (match[2] || 'ms').toLowerCase();
-  switch (type) {
-    case 'years':
-    case 'year':
-    case 'yrs':
-    case 'yr':
-    case 'y':
-      return n * y;
-    case 'days':
-    case 'day':
-    case 'd':
-      return n * d;
-    case 'hours':
-    case 'hour':
-    case 'hrs':
-    case 'hr':
-    case 'h':
-      return n * h;
-    case 'minutes':
-    case 'minute':
-    case 'mins':
-    case 'min':
-    case 'm':
-      return n * m;
-    case 'seconds':
-    case 'second':
-    case 'secs':
-    case 'sec':
-    case 's':
-      return n * s;
-    case 'milliseconds':
-    case 'millisecond':
-    case 'msecs':
-    case 'msec':
-    case 'ms':
-      return n;
-  }
-}
-
-/**
- * Short format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function short(ms) {
-  if (ms >= d) return Math.round(ms / d) + 'd';
-  if (ms >= h) return Math.round(ms / h) + 'h';
-  if (ms >= m) return Math.round(ms / m) + 'm';
-  if (ms >= s) return Math.round(ms / s) + 's';
-  return ms + 'ms';
-}
-
-/**
- * Long format for `ms`.
- *
- * @param {Number} ms
- * @return {String}
- * @api private
- */
-
-function long(ms) {
-  return plural(ms, d, 'day')
-    || plural(ms, h, 'hour')
-    || plural(ms, m, 'minute')
-    || plural(ms, s, 'second')
-    || ms + ' ms';
-}
-
-/**
- * Pluralization helper.
- */
-
-function plural(ms, n, name) {
-  if (ms < n) return;
-  if (ms < n * 1.5) return Math.floor(ms / n) + ' ' + name;
-  return Math.ceil(ms / n) + ' ' + name + 's';
-}
diff --git a/js/node_modules/ms/package.json b/js/node_modules/ms/package.json
deleted file mode 100644
index 581d30e4916a5b12e66030c339e2d31eb41dc77c..0000000000000000000000000000000000000000
--- a/js/node_modules/ms/package.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
-  "_args": [
-    [
-      "ms@0.7.1",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/debug"
-    ]
-  ],
-  "_from": "ms@0.7.1",
-  "_id": "ms@0.7.1",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/ms",
-  "_nodeVersion": "0.12.2",
-  "_npmUser": {
-    "email": "rauchg@gmail.com",
-    "name": "rauchg"
-  },
-  "_npmVersion": "2.7.5",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "ms",
-    "raw": "ms@0.7.1",
-    "rawSpec": "0.7.1",
-    "scope": null,
-    "spec": "0.7.1",
-    "type": "version"
-  },
-  "_requiredBy": [
-    "/debug"
-  ],
-  "_resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
-  "_shasum": "9cd13c03adbff25b65effde7ce864ee952017098",
-  "_shrinkwrap": null,
-  "_spec": "ms@0.7.1",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/debug",
-  "bugs": {
-    "url": "https://github.com/guille/ms.js/issues"
-  },
-  "component": {
-    "scripts": {
-      "ms/index.js": "index.js"
-    }
-  },
-  "dependencies": {},
-  "description": "Tiny ms conversion utility",
-  "devDependencies": {
-    "expect.js": "*",
-    "mocha": "*",
-    "serve": "*"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "9cd13c03adbff25b65effde7ce864ee952017098",
-    "tarball": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz"
-  },
-  "gitHead": "713dcf26d9e6fd9dbc95affe7eff9783b7f1b909",
-  "homepage": "https://github.com/guille/ms.js",
-  "main": "./index",
-  "maintainers": [
-    {
-      "name": "rauchg",
-      "email": "rauchg@gmail.com"
-    }
-  ],
-  "name": "ms",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/guille/ms.js.git"
-  },
-  "scripts": {},
-  "version": "0.7.1"
-}
diff --git a/js/node_modules/nan/CHANGELOG.md b/js/node_modules/nan/CHANGELOG.md
deleted file mode 100644
index 2519fbc400950af2c3a1d5032db9ac233e9a079c..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/CHANGELOG.md
+++ /dev/null
@@ -1,430 +0,0 @@
-# NAN ChangeLog
-
-**Version 2.4.0: current Node 6.3.0, Node 12: 0.12.15, Node 10: 0.10.46, iojs: 3.3.1**
-
-### 2.4.0 Jul 10 2016
-
-  - Feature: Rewrite Callback to add Callback::Reset c4cf44d61f8275cd5f7b0c911d7a806d4004f649
-  - Feature: AsyncProgressWorker: add template types for .send 1242c9a11a7ed481c8f08ec06316385cacc513d0
-  - Bugfix: Add constness to old Persistent comparison operators bd43cb9982c7639605d60fd073efe8cae165d9b2
-
-### 2.3.5 May 31 2016
-
-  - Bugfix: Replace NAN_INLINE with 'inline' keyword. 71819d8725f822990f439479c9aba3b240804909
-
-### 2.3.4 May 31 2016
-
-  - Bugfix: Remove V8 deprecation warnings 0592fb0a47f3a1c7763087ebea8e1138829f24f9
-  - Bugfix: Fix new versions not to use WeakCallbackInfo::IsFirstPass 615c19d9e03d4be2049c10db0151edbc3b229246
-  - Bugfix: Make ObjectWrap::handle() const d19af99595587fe7a26bd850af6595c2a7145afc
-  - Bugfix: Fix compilation errors related to 0592fb0a47f3a1c7763087ebea8e1138829f24f9 e9191c525b94f652718325e28610a1adcf90fed8
-
-### 2.3.3 May 4 2016
-
-  - Bugfix: Refactor SetMethod() to deal with v8::Templates (#566) b9083cf6d5de6ebe6bcb49c7502fbb7c0d9ddda8
-
-### 2.3.2 Apr 27 2016
-
-  - Bugfix: Fix compilation on outdated versions due to Handle removal f8b7c875d04d425a41dfd4f3f8345bc3a11e6c52
-
-### 2.3.1 Apr 27 2016
-
-  - Bugfix: Don't use deprecated v8::Template::Set() in SetMethod a90951e9ea70fa1b3836af4b925322919159100e
-
-### 2.3.0 Apr 27 2016
-
-  - Feature: added Signal() for invoking async callbacks without sending data from AsyncProgressWorker d8adba45f20e077d00561b20199133620c990b38
-  - Bugfix: Don't use deprecated v8::Template::Set() 00dacf0a4b86027415867fa7f1059acc499dcece
-
-### 2.2.1 Mar 29 2016
-
-  - Bugfix: Use NewFromUnsigned in ReturnValue<T>::Set(uint32_t i) for pre_12 3a18f9bdce29826e0e4c217854bc476918241a58
-  - Performance: Remove unneeeded nullptr checks b715ef44887931c94f0d1605b3b1a4156eebece9
-
-### 2.2.0 Jan 9 2016
-
-  - Feature: Add Function::Call wrapper 4c157474dacf284d125c324177b45aa5dabc08c6
-  - Feature: Rename GC*logueCallback to GCCallback for > 4.0 3603435109f981606d300eb88004ca101283acec
-  - Bugfix: Fix Global::Pass for old versions 367e82a60fbaa52716232cc89db1cc3f685d77d9
-  - Bugfix: Remove weird MaybeLocal wrapping of what already is a MaybeLocal 23b4590db10c2ba66aee2338aebe9751c4cb190b
-
-### 2.1.0 Oct 8 2015
-
-  - Deprecation: Deprecate NanErrnoException in favor of ErrnoException 0af1ca4cf8b3f0f65ed31bc63a663ab3319da55c
-  - Feature: added helper class for accessing contents of typedarrays 17b51294c801e534479d5463697a73462d0ca555
-  - Feature: [Maybe types] Add MakeMaybe(...) 48d7b53d9702b0c7a060e69ea10fea8fb48d814d
-  - Feature: new: allow utf16 string with length 66ac6e65c8ab9394ef588adfc59131b3b9d8347b
-  - Feature: Introduce SetCallHandler and SetCallAsFunctionHandler 7764a9a115d60ba10dc24d86feb0fbc9b4f75537
-  - Bugfix: Enable creating Locals from Globals under Node 0.10. 9bf9b8b190821af889790fdc18ace57257e4f9ff
-  - Bugfix: Fix issue #462 where PropertyCallbackInfo data is not stored safely. 55f50adedd543098526c7b9f4fffd607d3f9861f
-
-### 2.0.9 Sep 8 2015
-
-  - Bugfix: EscapableHandleScope in Nan::NewBuffer for Node 0.8 and 0.10 b1654d7
-
-### 2.0.8 Aug 28 2015
-
-  - Work around duplicate linking bug in clang 11902da
-
-### 2.0.7 Aug 26 2015
-
-  - Build: Repackage
-
-### 2.0.6 Aug 26 2015
-
-  - Bugfix: Properly handle null callback in FunctionTemplate factory 6e99cb1
-  - Bugfix: Remove unused static std::map instances 525bddc
-  - Bugfix: Make better use of maybe versions of APIs bfba85b
-  - Bugfix: Fix shadowing issues with handle in ObjectWrap 0a9072d
-
-### 2.0.5 Aug 10 2015
-
-  - Bugfix: Reimplement weak callback in ObjectWrap 98d38c1
-  - Bugfix: Make sure callback classes are not assignable, copyable or movable 81f9b1d
-
-### 2.0.4 Aug 6 2015
-
-  - Build: Repackage
-
-### 2.0.3 Aug 6 2015
-
-  - Bugfix: Don't use clang++ / g++ syntax extension. 231450e
-
-### 2.0.2 Aug 6 2015
-
-  - Build: Repackage
-
-### 2.0.1 Aug 6 2015
-
-  - Bugfix: Add workaround for missing REPLACE_INVALID_UTF8 60d6687
-  - Bugfix: Reimplement ObjectWrap from scratch to prevent memory leaks 6484601
-  - Bugfix: Fix Persistent leak in FunctionCallbackInfo and PropertyCallbackInfo 641ef5f
-  - Bugfix: Add missing overload for Nan::NewInstance that takes argc/argv 29450ed
-
-### 2.0.0 Jul 31 2015
-
-  - Change: Renamed identifiers with leading underscores	b5932b4
-  - Change: Replaced NanObjectWrapHandle with class NanObjectWrap	464f1e1
-  - Change: Replace NanScope and NanEscpableScope macros with classes	47751c4
-  - Change: Rename NanNewBufferHandle to NanNewBuffer	6745f99
-  - Change: Rename NanBufferUse to NanNewBuffer	3e8b0a5
-  - Change: Rename NanNewBuffer to NanCopyBuffer	d6af78d
-  - Change: Remove Nan prefix from all names	72d1f67
-  - Change: Update Buffer API for new upstream changes	d5d3291
-  - Change: Rename Scope and EscapableScope to HandleScope and EscapableHandleScope	21a7a6a
-  - Change: Get rid of Handles	 e6c0daf
-  - Feature: Support io.js 3 with V8 4.4
-  - Feature: Introduce NanPersistent	7fed696
-  - Feature: Introduce NanGlobal	4408da1
-  - Feature: Added NanTryCatch	10f1ca4
-  - Feature: Update for V8 v4.3	4b6404a
-  - Feature: Introduce NanNewOneByteString	c543d32
-  - Feature: Introduce namespace Nan	67ed1b1
-  - Removal: Remove NanLocker and NanUnlocker	dd6e401
-  - Removal: Remove string converters, except NanUtf8String, which now follows the node implementation b5d00a9
-  - Removal: Remove NanReturn* macros	d90a25c
-  - Removal: Remove HasInstance	e8f84fe
-
-
-### 1.9.0 Jul 31 2015
-
-  - Feature: Added `NanFatalException` 81d4a2c
-  - Feature: Added more error types 4265f06
-  - Feature: Added dereference and function call operators to NanCallback c4b2ed0
-  - Feature: Added indexed GetFromPersistent and SaveToPersistent edd510c
-  - Feature: Added more overloads of SaveToPersistent and GetFromPersistent 8b1cef6
-  - Feature: Added NanErrnoException dd87d9e
-  - Correctness: Prevent assign, copy, and move for classes that do not support it 1f55c59, 4b808cb, c96d9b2, fba4a29, 3357130
-  - Deprecation: Deprecate `NanGetPointerSafe` and `NanSetPointerSafe` 81d4a2c
-  - Deprecation: Deprecate `NanBooleanOptionValue` and `NanUInt32OptionValue` 0ad254b
-
-### 1.8.4 Apr 26 2015
-
-  - Build: Repackage
-
-### 1.8.3 Apr 26 2015
-
-  - Bugfix: Include missing header 1af8648
-
-### 1.8.2 Apr 23 2015
-
-  - Build: Repackage
-
-### 1.8.1 Apr 23 2015
-
-  - Bugfix: NanObjectWrapHandle should take a pointer 155f1d3
-
-### 1.8.0 Apr 23 2015
-
-  - Feature: Allow primitives with NanReturnValue 2e4475e
-  - Feature: Added comparison operators to NanCallback 55b075e
-  - Feature: Backport thread local storage 15bb7fa
-  - Removal: Remove support for signatures with arguments 8a2069d
-  - Correcteness: Replaced NanObjectWrapHandle macro with function 0bc6d59
-
-### 1.7.0 Feb 28 2015
-
-  - Feature: Made NanCallback::Call accept optional target 8d54da7
-  - Feature: Support atom-shell 0.21 0b7f1bb
-
-### 1.6.2 Feb 6 2015
-
-  - Bugfix: NanEncode: fix argument type for node::Encode on io.js 2be8639
-
-### 1.6.1 Jan 23 2015
-
-  - Build: version bump
-
-### 1.5.3 Jan 23 2015
-
-  - Build: repackage
-
-### 1.6.0 Jan 23 2015
-
- - Deprecated `NanNewContextHandle` in favor of `NanNew<Context>` 49259af
- - Support utility functions moved in newer v8 versions (Node 0.11.15, io.js 1.0) a0aa179
- - Added `NanEncode`, `NanDecodeBytes` and `NanDecodeWrite` 75e6fb9
-
-### 1.5.2 Jan 23 2015
-
-  - Bugfix: Fix non-inline definition build error with clang++ 21d96a1, 60fadd4
-  - Bugfix: Readded missing String constructors 18d828f
-  - Bugfix: Add overload handling NanNew<FunctionTemplate>(..) 5ef813b
-  - Bugfix: Fix uv_work_cb versioning 997e4ae
-  - Bugfix: Add function factory and test 4eca89c
-  - Bugfix: Add object template factory and test cdcb951
-  - Correctness: Lifted an io.js related typedef c9490be
-  - Correctness: Make explicit downcasts of String lengths 00074e6
-  - Windows: Limit the scope of disabled warning C4530 83d7deb
-
-### 1.5.1 Jan 15 2015
-
-  - Build: version bump
-
-### 1.4.3 Jan 15 2015
-
-  - Build: version bump
-
-### 1.4.2 Jan 15 2015
-
-  - Feature: Support io.js 0dbc5e8
-
-### 1.5.0 Jan 14 2015
-
- - Feature: Support io.js b003843
- - Correctness: Improved NanNew internals 9cd4f6a
- - Feature: Implement progress to NanAsyncWorker 8d6a160
-
-### 1.4.1 Nov 8 2014
-
- - Bugfix: Handle DEBUG definition correctly
- - Bugfix: Accept int as Boolean
-
-### 1.4.0 Nov 1 2014
-
- - Feature: Added NAN_GC_CALLBACK 6a5c245
- - Performance: Removed unnecessary local handle creation 18a7243, 41fe2f8
- - Correctness: Added constness to references in NanHasInstance 02c61cd
- - Warnings: Fixed spurious warnings from -Wundef and -Wshadow, 541b122, 99d8cb6
- - Windoze: Shut Visual Studio up when compiling 8d558c1
- - License: Switch to plain MIT from custom hacked MIT license 11de983
- - Build: Added test target to Makefile e232e46
- - Performance: Removed superfluous scope in NanAsyncWorker f4b7821
- - Sugar/Feature: Added NanReturnThis() and NanReturnHolder() shorthands 237a5ff, d697208
- - Feature: Added suitable overload of NanNew for v8::Integer::NewFromUnsigned b27b450
-
-### 1.3.0 Aug 2 2014
-
- - Added NanNew<v8::String, std::string>(std::string)
- - Added NanNew<v8::String, std::string&>(std::string&)
- - Added NanAsciiString helper class
- - Added NanUtf8String helper class
- - Added NanUcs2String helper class
- - Deprecated NanRawString()
- - Deprecated NanCString()
- - Added NanGetIsolateData(v8::Isolate *isolate)
- - Added NanMakeCallback(v8::Handle<v8::Object> target, v8::Handle<v8::Function> func, int argc, v8::Handle<v8::Value>* argv)
- - Added NanMakeCallback(v8::Handle<v8::Object> target, v8::Handle<v8::String> symbol, int argc, v8::Handle<v8::Value>* argv)
- - Added NanMakeCallback(v8::Handle<v8::Object> target, const char* method, int argc, v8::Handle<v8::Value>* argv)
- - Added NanSetTemplate(v8::Handle<v8::Template> templ, v8::Handle<v8::String> name , v8::Handle<v8::Data> value, v8::PropertyAttribute attributes)
- - Added NanSetPrototypeTemplate(v8::Local<v8::FunctionTemplate> templ, v8::Handle<v8::String> name, v8::Handle<v8::Data> value, v8::PropertyAttribute attributes)
- - Added NanSetInstanceTemplate(v8::Local<v8::FunctionTemplate> templ, const char *name, v8::Handle<v8::Data> value)
- - Added NanSetInstanceTemplate(v8::Local<v8::FunctionTemplate> templ, v8::Handle<v8::String> name, v8::Handle<v8::Data> value, v8::PropertyAttribute attributes)
-
-### 1.2.0 Jun 5 2014
-
- - Add NanSetPrototypeTemplate
- - Changed NAN_WEAK_CALLBACK internals, switched _NanWeakCallbackData to class,
-     introduced _NanWeakCallbackDispatcher
- - Removed -Wno-unused-local-typedefs from test builds
- - Made test builds Windows compatible ('Sleep()')
-
-### 1.1.2 May 28 2014
-
- - Release to fix more stuff-ups in 1.1.1
-
-### 1.1.1 May 28 2014
-
- - Release to fix version mismatch in nan.h and lack of changelog entry for 1.1.0
-
-### 1.1.0 May 25 2014
-
- - Remove nan_isolate, use v8::Isolate::GetCurrent() internally instead
- - Additional explicit overloads for NanNew(): (char*,int), (uint8_t*[,int]),
-     (uint16_t*[,int), double, int, unsigned int, bool, v8::String::ExternalStringResource*,
-     v8::String::ExternalAsciiStringResource*
- - Deprecate NanSymbol()
- - Added SetErrorMessage() and ErrorMessage() to NanAsyncWorker
-
-### 1.0.0 May 4 2014
-
- - Heavy API changes for V8 3.25 / Node 0.11.13
- - Use cpplint.py
- - Removed NanInitPersistent
- - Removed NanPersistentToLocal
- - Removed NanFromV8String
- - Removed NanMakeWeak
- - Removed NanNewLocal
- - Removed NAN_WEAK_CALLBACK_OBJECT
- - Removed NAN_WEAK_CALLBACK_DATA
- - Introduce NanNew, replaces NanNewLocal, NanPersistentToLocal, adds many overloaded typed versions
- - Introduce NanUndefined, NanNull, NanTrue and NanFalse
- - Introduce NanEscapableScope and NanEscapeScope
- - Introduce NanMakeWeakPersistent (requires a special callback to work on both old and new node)
- - Introduce NanMakeCallback for node::MakeCallback
- - Introduce NanSetTemplate
- - Introduce NanGetCurrentContext
- - Introduce NanCompileScript and NanRunScript
- - Introduce NanAdjustExternalMemory
- - Introduce NanAddGCEpilogueCallback, NanAddGCPrologueCallback, NanRemoveGCEpilogueCallback, NanRemoveGCPrologueCallback
- - Introduce NanGetHeapStatistics
- - Rename NanAsyncWorker#SavePersistent() to SaveToPersistent()
-
-### 0.8.0 Jan 9 2014
-
- - NanDispose -> NanDisposePersistent, deprecate NanDispose
- - Extract _NAN_*_RETURN_TYPE, pull up NAN_*()
-
-### 0.7.1 Jan 9 2014
-
- - Fixes to work against debug builds of Node
- - Safer NanPersistentToLocal (avoid reinterpret_cast)
- - Speed up common NanRawString case by only extracting flattened string when necessary
-
-### 0.7.0 Dec 17 2013
-
- - New no-arg form of NanCallback() constructor.
- - NanCallback#Call takes Handle rather than Local
- - Removed deprecated NanCallback#Run method, use NanCallback#Call instead
- - Split off _NAN_*_ARGS_TYPE from _NAN_*_ARGS
- - Restore (unofficial) Node 0.6 compatibility at NanCallback#Call()
- - Introduce NanRawString() for char* (or appropriate void*) from v8::String
-     (replacement for NanFromV8String)
- - Introduce NanCString() for null-terminated char* from v8::String
-
-### 0.6.0 Nov 21 2013
-
- - Introduce NanNewLocal<T>(v8::Handle<T> value) for use in place of
-     v8::Local<T>::New(...) since v8 started requiring isolate in Node 0.11.9
-
-### 0.5.2 Nov 16 2013
-
- - Convert SavePersistent and GetFromPersistent in NanAsyncWorker from protected and public
-
-### 0.5.1 Nov 12 2013
-
- - Use node::MakeCallback() instead of direct v8::Function::Call()
-
-### 0.5.0 Nov 11 2013
-
- - Added @TooTallNate as collaborator
- - New, much simpler, "include_dirs" for binding.gyp
- - Added full range of NAN_INDEX_* macros to match NAN_PROPERTY_* macros
-
-### 0.4.4 Nov 2 2013
-
- - Isolate argument from v8::Persistent::MakeWeak removed for 0.11.8+
-
-### 0.4.3 Nov 2 2013
-
- - Include node_object_wrap.h, removed from node.h for Node 0.11.8.
-
-### 0.4.2 Nov 2 2013
-
- - Handle deprecation of v8::Persistent::Dispose(v8::Isolate* isolate)) for
-     Node 0.11.8 release.
-
-### 0.4.1 Sep 16 2013
-
- - Added explicit `#include <uv.h>` as it was removed from node.h for v0.11.8
-
-### 0.4.0 Sep 2 2013
-
- - Added NAN_INLINE and NAN_DEPRECATED and made use of them
- - Added NanError, NanTypeError and NanRangeError
- - Cleaned up code
-
-### 0.3.2 Aug 30 2013
-
- - Fix missing scope declaration in GetFromPersistent() and SaveToPersistent
-     in NanAsyncWorker
-
-### 0.3.1 Aug 20 2013
-
- - fix "not all control paths return a value" compile warning on some platforms
-
-### 0.3.0 Aug 19 2013
-
- - Made NAN work with NPM
- - Lots of fixes to NanFromV8String, pulling in features from new Node core
- - Changed node::encoding to Nan::Encoding in NanFromV8String to unify the API
- - Added optional error number argument for NanThrowError()
- - Added NanInitPersistent()
- - Added NanReturnNull() and NanReturnEmptyString()
- - Added NanLocker and NanUnlocker
- - Added missing scopes
- - Made sure to clear disposed Persistent handles
- - Changed NanAsyncWorker to allocate error messages on the heap
- - Changed NanThrowError(Local<Value>) to NanThrowError(Handle<Value>)
- - Fixed leak in NanAsyncWorker when errmsg is used
-
-### 0.2.2 Aug 5 2013
-
- - Fixed usage of undefined variable with node::BASE64 in NanFromV8String()
-
-### 0.2.1 Aug 5 2013
-
- - Fixed 0.8 breakage, node::BUFFER encoding type not available in 0.8 for
-     NanFromV8String()
-
-### 0.2.0 Aug 5 2013
-
- - Added NAN_PROPERTY_GETTER, NAN_PROPERTY_SETTER, NAN_PROPERTY_ENUMERATOR,
-     NAN_PROPERTY_DELETER, NAN_PROPERTY_QUERY
- - Extracted _NAN_METHOD_ARGS, _NAN_GETTER_ARGS, _NAN_SETTER_ARGS,
-     _NAN_PROPERTY_GETTER_ARGS, _NAN_PROPERTY_SETTER_ARGS,
-     _NAN_PROPERTY_ENUMERATOR_ARGS, _NAN_PROPERTY_DELETER_ARGS,
-     _NAN_PROPERTY_QUERY_ARGS
- - Added NanGetInternalFieldPointer, NanSetInternalFieldPointer
- - Added NAN_WEAK_CALLBACK, NAN_WEAK_CALLBACK_OBJECT,
-     NAN_WEAK_CALLBACK_DATA, NanMakeWeak
- - Renamed THROW_ERROR to _NAN_THROW_ERROR
- - Added NanNewBufferHandle(char*, size_t, node::smalloc::FreeCallback, void*)
- - Added NanBufferUse(char*, uint32_t)
- - Added NanNewContextHandle(v8::ExtensionConfiguration*,
-       v8::Handle<v8::ObjectTemplate>, v8::Handle<v8::Value>)
- - Fixed broken NanCallback#GetFunction()
- - Added optional encoding and size arguments to NanFromV8String()
- - Added NanGetPointerSafe() and NanSetPointerSafe()
- - Added initial test suite (to be expanded)
- - Allow NanUInt32OptionValue to convert any Number object
-
-### 0.1.0 Jul 21 2013
-
- - Added `NAN_GETTER`, `NAN_SETTER`
- - Added `NanThrowError` with single Local<Value> argument
- - Added `NanNewBufferHandle` with single uint32_t argument
- - Added `NanHasInstance(Persistent<FunctionTemplate>&, Handle<Value>)`
- - Added `Local<Function> NanCallback#GetFunction()`
- - Added `NanCallback#Call(int, Local<Value>[])`
- - Deprecated `NanCallback#Run(int, Local<Value>[])` in favour of Call
diff --git a/js/node_modules/nan/LICENSE.md b/js/node_modules/nan/LICENSE.md
deleted file mode 100644
index e4fc4127eb5b43c297def5f33885d350de19ddbe..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/LICENSE.md
+++ /dev/null
@@ -1,13 +0,0 @@
-The MIT License (MIT)
-=====================
-
-Copyright (c) 2016 NAN contributors
------------------------------------
-
-*NAN contributors listed at <https://github.com/nodejs/nan#contributors>*
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/nan/README.md b/js/node_modules/nan/README.md
deleted file mode 100644
index 7f163b6f0937554ccfb1f3d564f86a20d66595d3..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/README.md
+++ /dev/null
@@ -1,403 +0,0 @@
-Native Abstractions for Node.js
-===============================
-
-**A header file filled with macro and utility goodness for making add-on development for Node.js easier across versions 0.8, 0.10, 0.12, 1, 4, 5 and 6.**
-
-***Current version: 2.4.0***
-
-*(See [CHANGELOG.md](https://github.com/nodejs/nan/blob/master/CHANGELOG.md) for complete ChangeLog)*
-
-[![NPM](https://nodei.co/npm/nan.png?downloads=true&downloadRank=true)](https://nodei.co/npm/nan/) [![NPM](https://nodei.co/npm-dl/nan.png?months=6&height=3)](https://nodei.co/npm/nan/)
-
-[![Build Status](https://api.travis-ci.org/nodejs/nan.svg?branch=master)](http://travis-ci.org/nodejs/nan)
-[![Build status](https://ci.appveyor.com/api/projects/status/kh73pbm9dsju7fgh)](https://ci.appveyor.com/project/RodVagg/nan)
-
-Thanks to the crazy changes in V8 (and some in Node core), keeping native addons compiling happily across versions, particularly 0.10 to 0.12 to 4.0, is a minor nightmare. The goal of this project is to store all logic necessary to develop native Node.js addons without having to inspect `NODE_MODULE_VERSION` and get yourself into a macro-tangle.
-
-This project also contains some helper utilities that make addon development a bit more pleasant.
-
- * **[News & Updates](#news)**
- * **[Usage](#usage)**
- * **[Example](#example)**
- * **[API](#api)**
- * **[Tests](#tests)**
- * **[Governance & Contributing](#governance)**
-
-<a name="news"></a>
-## News & Updates
-
-<a name="usage"></a>
-## Usage
-
-Simply add **NAN** as a dependency in the *package.json* of your Node addon:
-
-``` bash
-$ npm install --save nan
-```
-
-Pull in the path to **NAN** in your *binding.gyp* so that you can use `#include <nan.h>` in your *.cpp* files:
-
-``` python
-"include_dirs" : [
-    "<!(node -e \"require('nan')\")"
-]
-```
-
-This works like a `-I<path-to-NAN>` when compiling your addon.
-
-<a name="example"></a>
-## Example
-
-Just getting started with Nan? Take a look at the **[Node Add-on Examples](https://github.com/nodejs/node-addon-examples)**.
-
-Refer to a [quick-start **Nan** Boilerplate](https://github.com/fcanas/node-native-boilerplate) for a ready-to-go project that utilizes basic Nan functionality.
-
-For a simpler example, see the **[async pi estimation example](https://github.com/nodejs/nan/tree/master/examples/async_pi_estimate)** in the examples directory for full code and an explanation of what this Monte Carlo Pi estimation example does. Below are just some parts of the full example that illustrate the use of **NAN**.
-
-Yet another example is **[nan-example-eol](https://github.com/CodeCharmLtd/nan-example-eol)**. It shows newline detection implemented as a native addon.
-
-Also take a look at our comprehensive **[C++ test suite](https://github.com/nodejs/nan/tree/master/test/cpp)** which has a plehora of code snippets for your pasting pleasure.
-
-<a name="api"></a>
-## API
-
-Additional to the NAN documentation below, please consult:
-
-* [The V8 Getting Started Guide](https://developers.google.com/v8/get_started)
-* [The V8 Embedders Guide](https://developers.google.com/v8/embed)
-* [V8 API Documentation](http://v8docs.nodesource.com/)
-* [Node Add-on Documentation](https://nodejs.org/api/addons.html)
-
-<!-- START API -->
-
-### JavaScript-accessible methods
-
-A _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://developers.google.com/v8/embed#templates) for further information.
-
-In order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type.
-
-* **Method argument types**
- - <a href="doc/methods.md#api_nan_function_callback_info"><b><code>Nan::FunctionCallbackInfo</code></b></a>
- - <a href="doc/methods.md#api_nan_property_callback_info"><b><code>Nan::PropertyCallbackInfo</code></b></a>
- - <a href="doc/methods.md#api_nan_return_value"><b><code>Nan::ReturnValue</code></b></a>
-* **Method declarations**
- - <a href="doc/methods.md#api_nan_method"><b>Method declaration</b></a>
- - <a href="doc/methods.md#api_nan_getter"><b>Getter declaration</b></a>
- - <a href="doc/methods.md#api_nan_setter"><b>Setter declaration</b></a>
- - <a href="doc/methods.md#api_nan_property_getter"><b>Property getter declaration</b></a>
- - <a href="doc/methods.md#api_nan_property_setter"><b>Property setter declaration</b></a>
- - <a href="doc/methods.md#api_nan_property_enumerator"><b>Property enumerator declaration</b></a>
- - <a href="doc/methods.md#api_nan_property_deleter"><b>Property deleter declaration</b></a>
- - <a href="doc/methods.md#api_nan_property_query"><b>Property query declaration</b></a>
- - <a href="doc/methods.md#api_nan_index_getter"><b>Index getter declaration</b></a>
- - <a href="doc/methods.md#api_nan_index_setter"><b>Index setter declaration</b></a>
- - <a href="doc/methods.md#api_nan_index_enumerator"><b>Index enumerator declaration</b></a>
- - <a href="doc/methods.md#api_nan_index_deleter"><b>Index deleter declaration</b></a>
- - <a href="doc/methods.md#api_nan_index_query"><b>Index query declaration</b></a>
-* Method and template helpers
- - <a href="doc/methods.md#api_nan_set_method"><b><code>Nan::SetMethod()</code></b></a>
- - <a href="doc/methods.md#api_nan_set_prototype_method"><b><code>Nan::SetPrototypeMethod()</code></b></a>
- - <a href="doc/methods.md#api_nan_set_accessor"><b><code>Nan::SetAccessor()</code></b></a>
- - <a href="doc/methods.md#api_nan_set_named_property_handler"><b><code>Nan::SetNamedPropertyHandler()</code></b></a>
- - <a href="doc/methods.md#api_nan_set_indexed_property_handler"><b><code>Nan::SetIndexedPropertyHandler()</code></b></a>
- - <a href="doc/methods.md#api_nan_set_template"><b><code>Nan::SetTemplate()</code></b></a>
- - <a href="doc/methods.md#api_nan_set_prototype_template"><b><code>Nan::SetPrototypeTemplate()</code></b></a>
- - <a href="doc/methods.md#api_nan_set_instance_template"><b><code>Nan::SetInstanceTemplate()</code></b></a>
- - <a href="doc/methods.md#api_nan_set_call_handler"><b><code>Nan::SetCallHandler()</code></b></a>
- - <a href="doc/methods.md#api_nan_set_call_as_function_handler"><b><code>Nan::SetCallAsFunctionHandler()</code></b></a>
-
-### Scopes
-
-A _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works.
-
-A handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope.
-
-The creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these.
-
- - <a href="doc/scopes.md#api_nan_handle_scope"><b><code>Nan::HandleScope</code></b></a>
- - <a href="doc/scopes.md#api_nan_escapable_handle_scope"><b><code>Nan::EscapableHandleScope</code></b></a>
-
-Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles).
-
-### Persistent references
-
-An object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed.
-
-Due to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported.
-
- - <a href="doc/persistent.md#api_nan_persistent_base"><b><code>Nan::PersistentBase & v8::PersistentBase</code></b></a>
- - <a href="doc/persistent.md#api_nan_non_copyable_persistent_traits"><b><code>Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits</code></b></a>
- - <a href="doc/persistent.md#api_nan_copyable_persistent_traits"><b><code>Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits</code></b></a>
- - <a href="doc/persistent.md#api_nan_persistent"><b><code>Nan::Persistent</code></b></a>
- - <a href="doc/persistent.md#api_nan_global"><b><code>Nan::Global</code></b></a>
- - <a href="doc/persistent.md#api_nan_weak_callback_info"><b><code>Nan::WeakCallbackInfo</code></b></a>
- - <a href="doc/persistent.md#api_nan_weak_callback_type"><b><code>Nan::WeakCallbackType</code></b></a>
-
-Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles).
-
-### New
-
-NAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8.
-
- - <a href="doc/new.md#api_nan_new"><b><code>Nan::New()</code></b></a>
- - <a href="doc/new.md#api_nan_undefined"><b><code>Nan::Undefined()</code></b></a>
- - <a href="doc/new.md#api_nan_null"><b><code>Nan::Null()</code></b></a>
- - <a href="doc/new.md#api_nan_true"><b><code>Nan::True()</code></b></a>
- - <a href="doc/new.md#api_nan_false"><b><code>Nan::False()</code></b></a>
- - <a href="doc/new.md#api_nan_empty_string"><b><code>Nan::EmptyString()</code></b></a>
-
-
-### Converters
-
-NAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN.
-
- - <a href="doc/converters.md#api_nan_to"><b><code>Nan::To()</code></b></a>
-
-### Maybe Types
-
-The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_.
-
-* **Maybe Types**
-  - <a href="doc/maybe_types.md#api_nan_maybe_local"><b><code>Nan::MaybeLocal</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_maybe"><b><code>Nan::Maybe</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_nothing"><b><code>Nan::Nothing</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_just"><b><code>Nan::Just</code></b></a>
-* **Maybe Helpers**
-  - <a href="doc/maybe_types.md#api_nan_call"><b><code>Nan::Call()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_to_detail_string"><b><code>Nan::ToDetailString()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_to_array_index"><b><code>Nan::ToArrayIndex()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_equals"><b><code>Nan::Equals()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_new_instance"><b><code>Nan::NewInstance()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_get_function"><b><code>Nan::GetFunction()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_set"><b><code>Nan::Set()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_force_set"><b><code>Nan::ForceSet()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_get"><b><code>Nan::Get()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_get_property_attribute"><b><code>Nan::GetPropertyAttributes()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_has"><b><code>Nan::Has()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_delete"><b><code>Nan::Delete()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_get_property_names"><b><code>Nan::GetPropertyNames()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_get_own_property_names"><b><code>Nan::GetOwnPropertyNames()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_set_prototype"><b><code>Nan::SetPrototype()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_object_proto_to_string"><b><code>Nan::ObjectProtoToString()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_has_own_property"><b><code>Nan::HasOwnProperty()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_has_real_named_property"><b><code>Nan::HasRealNamedProperty()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_has_real_indexed_property"><b><code>Nan::HasRealIndexedProperty()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_has_real_named_callback_property"><b><code>Nan::HasRealNamedCallbackProperty()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_get_real_named_property_in_prototype_chain"><b><code>Nan::GetRealNamedPropertyInPrototypeChain()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_get_real_named_property"><b><code>Nan::GetRealNamedProperty()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_call_as_function"><b><code>Nan::CallAsFunction()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_call_as_constructor"><b><code>Nan::CallAsConstructor()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_get_source_line"><b><code>Nan::GetSourceLine()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_get_line_number"><b><code>Nan::GetLineNumber()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_get_start_column"><b><code>Nan::GetStartColumn()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_get_end_column"><b><code>Nan::GetEndColumn()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_clone_element_at"><b><code>Nan::CloneElementAt()</code></b></a>
-  - <a href="doc/maybe_types.md#api_nan_make_maybe"><b><code>Nan::MakeMaybe()</code></b></a>
-
-### Script
-
-NAN provides a `v8::Script` helpers as the API has changed over the supported versions of V8.
-
- - <a href="doc/script.md#api_nan_compile_script"><b><code>Nan::CompileScript()</code></b></a>
- - <a href="doc/script.md#api_nan_run_script"><b><code>Nan::RunScript()</code></b></a>
-
-
-### Errors
-
-NAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted.
-
-Note that an Error object is simply a specialized form of `v8::Value`.
-
-Also consult the V8 Embedders Guide section on [Exceptions](https://developers.google.com/v8/embed#exceptions) for more information.
-
- - <a href="doc/errors.md#api_nan_error"><b><code>Nan::Error()</code></b></a>
- - <a href="doc/errors.md#api_nan_range_error"><b><code>Nan::RangeError()</code></b></a>
- - <a href="doc/errors.md#api_nan_reference_error"><b><code>Nan::ReferenceError()</code></b></a>
- - <a href="doc/errors.md#api_nan_syntax_error"><b><code>Nan::SyntaxError()</code></b></a>
- - <a href="doc/errors.md#api_nan_type_error"><b><code>Nan::TypeError()</code></b></a>
- - <a href="doc/errors.md#api_nan_throw_error"><b><code>Nan::ThrowError()</code></b></a>
- - <a href="doc/errors.md#api_nan_throw_range_error"><b><code>Nan::ThrowRangeError()</code></b></a>
- - <a href="doc/errors.md#api_nan_throw_reference_error"><b><code>Nan::ThrowReferenceError()</code></b></a>
- - <a href="doc/errors.md#api_nan_throw_syntax_error"><b><code>Nan::ThrowSyntaxError()</code></b></a>
- - <a href="doc/errors.md#api_nan_throw_type_error"><b><code>Nan::ThrowTypeError()</code></b></a>
- - <a href="doc/errors.md#api_nan_fatal_exception"><b><code>Nan::FatalException()</code></b></a>
- - <a href="doc/errors.md#api_nan_errno_exception"><b><code>Nan::ErrnoException()</code></b></a>
- - <a href="doc/errors.md#api_nan_try_catch"><b><code>Nan::TryCatch</code></b></a>
-
-
-### Buffers
-
-NAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility.
-
- - <a href="doc/buffers.md#api_nan_new_buffer"><b><code>Nan::NewBuffer()</code></b></a>
- - <a href="doc/buffers.md#api_nan_copy_buffer"><b><code>Nan::CopyBuffer()</code></b></a>
- - <a href="doc/buffers.md#api_nan_free_callback"><b><code>Nan::FreeCallback()</code></b></a>
-
-### Nan::Callback
-
-`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution.
-
- - <a href="doc/callback.md#api_nan_callback"><b><code>Nan::Callback</code></b></a>
-
-### Asynchronous work helpers
-
-`Nan::AsyncWorker` and `Nan::AsyncProgressWorker` are helper classes that make working with asynchronous code easier.
-
- - <a href="doc/asyncworker.md#api_nan_async_worker"><b><code>Nan::AsyncWorker</code></b></a>
- - <a href="doc/asyncworker.md#api_nan_async_progress_worker"><b><code>Nan::AsyncProgressWorkerBase & Nan::AsyncProgressWorker</code></b></a>
- - <a href="doc/asyncworker.md#api_nan_async_queue_worker"><b><code>Nan::AsyncQueueWorker</code></b></a>
-
-### Strings & Bytes
-
-Miscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing.
-
- - <a href="doc/string_bytes.md#api_nan_encoding"><b><code>Nan::Encoding</code></b></a>
- - <a href="doc/string_bytes.md#api_nan_encode"><b><code>Nan::Encode()</code></b></a>
- - <a href="doc/string_bytes.md#api_nan_decode_bytes"><b><code>Nan::DecodeBytes()</code></b></a>
- - <a href="doc/string_bytes.md#api_nan_decode_write"><b><code>Nan::DecodeWrite()</code></b></a>
-
-
-### Object Wrappers
-
-The `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects.
-
- - <a href="doc/object_wrappers.md#api_nan_object_wrap"><b><code>Nan::ObjectWrap</code></b></a>
-
-
-### V8 internals
-
-The hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods.
-
- - <a href="doc/v8_internals.md#api_nan_gc_callback"><b><code>NAN_GC_CALLBACK()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_add_gc_epilogue_callback"><b><code>Nan::AddGCEpilogueCallback()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_remove_gc_epilogue_callback"><b><code>Nan::RemoveGCEpilogueCallback()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_add_gc_prologue_callback"><b><code>Nan::AddGCPrologueCallback()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_remove_gc_prologue_callback"><b><code>Nan::RemoveGCPrologueCallback()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_get_heap_statistics"><b><code>Nan::GetHeapStatistics()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_set_counter_function"><b><code>Nan::SetCounterFunction()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_set_create_histogram_function"><b><code>Nan::SetCreateHistogramFunction()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_set_add_histogram_sample_function"><b><code>Nan::SetAddHistogramSampleFunction()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_idle_notification"><b><code>Nan::IdleNotification()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_low_memory_notification"><b><code>Nan::LowMemoryNotification()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_context_disposed_notification"><b><code>Nan::ContextDisposedNotification()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_get_internal_field_pointer"><b><code>Nan::GetInternalFieldPointer()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_set_internal_field_pointer"><b><code>Nan::SetInternalFieldPointer()</code></b></a>
- - <a href="doc/v8_internals.md#api_nan_adjust_external_memory"><b><code>Nan::AdjustExternalMemory()</code></b></a>
-
-
-### Miscellaneous V8 Helpers
-
- - <a href="doc/v8_misc.md#api_nan_utf8_string"><b><code>Nan::Utf8String</code></b></a>
- - <a href="doc/v8_misc.md#api_nan_get_current_context"><b><code>Nan::GetCurrentContext()</code></b></a>
- - <a href="doc/v8_misc.md#api_nan_set_isolate_data"><b><code>Nan::SetIsolateData()</code></b></a>
- - <a href="doc/v8_misc.md#api_nan_get_isolate_data"><b><code>Nan::GetIsolateData()</code></b></a>
- - <a href="doc/v8_misc.md#api_nan_typedarray_contents"><b><code>Nan::TypedArrayContents</code></b></a>
-
-
-### Miscellaneous Node Helpers
-
- - <a href="doc/node_misc.md#api_nan_make_callback"><b><code>Nan::MakeCallback()</code></b></a>
- - <a href="doc/node_misc.md#api_nan_module_init"><b><code>NAN_MODULE_INIT()</code></b></a>
- - <a href="doc/node_misc.md#api_nan_export"><b><code>Nan::Export()</code></b></a>
-
-<!-- END API -->
-
-
-<a name="tests"></a>
-### Tests
-
-To run the NAN tests do:
-
-``` sh
-npm install
-npm run-script rebuild-tests
-npm test
-```
-
-Or just:
-
-``` sh
-npm install
-make test
-```
-
-<a name="governance"></a>
-## Governance & Contributing
-
-NAN is governed by the [io.js](https://iojs.org/) Addon API Working Group
-
-### Addon API Working Group (WG)
-
-The NAN project is jointly governed by a Working Group which is responsible for high-level guidance of the project.
-
-Members of the WG are also known as Collaborators, there is no distinction between the two, unlike other io.js projects.
-
-The WG has final authority over this project including:
-
-* Technical direction
-* Project governance and process (including this policy)
-* Contribution policy
-* GitHub repository hosting
-* Maintaining the list of additional Collaborators
-
-For the current list of WG members, see the project [README.md](./README.md#collaborators).
-
-Individuals making significant and valuable contributions are made members of the WG and given commit-access to the project. These individuals are identified by the WG and their addition to the WG is discussed via GitHub and requires unanimous consensus amongst those WG members participating in the discussion with a quorum of 50% of WG members required for acceptance of the vote.
-
-_Note:_ If you make a significant contribution and are not considered for commit-access log an issue or contact a WG member directly.
-
-For the current list of WG members / Collaborators, see the project [README.md](./README.md#collaborators).
-
-### Consensus Seeking Process
-
-The WG follows a [Consensus Seeking](http://en.wikipedia.org/wiki/Consensus-seeking_decision-making) decision making model.
-
-Modifications of the contents of the NAN repository are made on a collaborative basis. Anybody with a GitHub account may propose a modification via pull request and it will be considered by the WG. All pull requests must be reviewed and accepted by a WG member with sufficient expertise who is able to take full responsibility for the change. In the case of pull requests proposed by an existing WG member, an additional WG member is required for sign-off. Consensus should be sought if additional WG members participate and there is disagreement around a particular modification.
-
-If a change proposal cannot reach a consensus, a WG member can call for a vote amongst the members of the WG. Simple majority wins.
-
-<a id="developers-certificate-of-origin"></a>
-## Developer's Certificate of Origin 1.1
-
-By making a contribution to this project, I certify that:
-
-* (a) The contribution was created in whole or in part by me and I
-  have the right to submit it under the open source license
-  indicated in the file; or
-
-* (b) The contribution is based upon previous work that, to the best
-  of my knowledge, is covered under an appropriate open source
-  license and I have the right under that license to submit that
-  work with modifications, whether created in whole or in part
-  by me, under the same open source license (unless I am
-  permitted to submit under a different license), as indicated
-  in the file; or
-
-* (c) The contribution was provided directly to me by some other
-  person who certified (a), (b) or (c) and I have not modified
-  it.
-
-* (d) I understand and agree that this project and the contribution
-  are public and that a record of the contribution (including all
-  personal information I submit with it, including my sign-off) is
-  maintained indefinitely and may be redistributed consistent with
-  this project or the open source license(s) involved.
-
-<a name="collaborators"></a>
-### WG Members / Collaborators
-
-<table><tbody>
-<tr><th align="left">Rod Vagg</th><td><a href="https://github.com/rvagg">GitHub/rvagg</a></td><td><a href="http://twitter.com/rvagg">Twitter/@rvagg</a></td></tr>
-<tr><th align="left">Benjamin Byholm</th><td><a href="https://github.com/kkoopa/">GitHub/kkoopa</a></td><td>-</td></tr>
-<tr><th align="left">Trevor Norris</th><td><a href="https://github.com/trevnorris">GitHub/trevnorris</a></td><td><a href="http://twitter.com/trevnorris">Twitter/@trevnorris</a></td></tr>
-<tr><th align="left">Nathan Rajlich</th><td><a href="https://github.com/TooTallNate">GitHub/TooTallNate</a></td><td><a href="http://twitter.com/TooTallNate">Twitter/@TooTallNate</a></td></tr>
-<tr><th align="left">Brett Lawson</th><td><a href="https://github.com/brett19">GitHub/brett19</a></td><td><a href="http://twitter.com/brett19x">Twitter/@brett19x</a></td></tr>
-<tr><th align="left">Ben Noordhuis</th><td><a href="https://github.com/bnoordhuis">GitHub/bnoordhuis</a></td><td><a href="http://twitter.com/bnoordhuis">Twitter/@bnoordhuis</a></td></tr>
-<tr><th align="left">David Siegel</th><td><a href="https://github.com/agnat">GitHub/agnat</a></td><td>-</td></tr>
-</tbody></table>
-
-## Licence &amp; copyright
-
-Copyright (c) 2016 NAN WG Members / Collaborators (listed above).
-
-Native Abstractions for Node.js is licensed under an MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details.
diff --git a/js/node_modules/nan/doc/asyncworker.md b/js/node_modules/nan/doc/asyncworker.md
deleted file mode 100644
index 6bc4cce229fabeb14d72ef1dcbe6acabaf0830c5..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/asyncworker.md
+++ /dev/null
@@ -1,103 +0,0 @@
-## Asynchronous work helpers
-
-`Nan::AsyncWorker` and `Nan::AsyncProgressWorker` are helper classes that make working with asynchronous code easier.
-
- - <a href="#api_nan_async_worker"><b><code>Nan::AsyncWorker</code></b></a>
- - <a href="#api_nan_async_progress_worker"><b><code>Nan::AsyncProgressWorker</code></b></a>
- - <a href="#api_nan_async_queue_worker"><b><code>Nan::AsyncQueueWorker</code></b></a>
-
-<a name="api_nan_async_worker"></a>
-### Nan::AsyncWorker
-
-`Nan::AsyncWorker` is an _abstract_ class that you can subclass to have much of the annoying asynchronous queuing and handling taken care of for you. It can even store arbitrary V8 objects for you and have them persist while the asynchronous work is in progress.
-
-Definition:
-
-```c++
-class AsyncWorker {
- public:
-  explicit AsyncWorker(Callback *callback_);
-
-  virtual ~AsyncWorker();
-
-  virtual void WorkComplete();
-
-  void SaveToPersistent(const char *key, const v8::Local<v8::Value> &value);
-
-  void SaveToPersistent(const v8::Local<v8::String> &key,
-                        const v8::Local<v8::Value> &value);
-
-  void SaveToPersistent(uint32_t index,
-                        const v8::Local<v8::Value> &value);
-
-  v8::Local<v8::Value> GetFromPersistent(const char *key) const;
-
-  v8::Local<v8::Value> GetFromPersistent(const v8::Local<v8::String> &key) const;
-
-  v8::Local<v8::Value> GetFromPersistent(uint32_t index) const;
-
-  virtual void Execute() = 0;
-
-  uv_work_t request;
-
-  virtual void Destroy();
-
- protected:
-  Persistent<v8::Object> persistentHandle;
-
-  Callback *callback;
-
-  virtual void HandleOKCallback();
-
-  virtual void HandleErrorCallback();
-
-  void SetErrorMessage(const char *msg);
-
-  const char* ErrorMessage();
-};
-```
-
-<a name="api_nan_async_progress_worker"></a>
-### Nan::AsyncProgressWorkerBase & Nan::AsyncProgressWorker
-
-`Nan::AsyncProgressWorkerBase` is an _abstract_ class template that extends `Nan::AsyncWorker` and adds additional progress reporting callbacks that can be used during the asynchronous work execution to provide progress data back to JavaScript.
-
-Previously the definiton of `Nan::AsyncProgressWorker` only allowed sending `const char` data. Now extending `Nan::AsyncProgressWorker` will yield an instance of the implicit `Nan::AsyncProgressWorkerBase` template with type `<char>` for compatibility.
-
-Definition:
-
-```c++
-template<class T>
-class AsyncProgressWorkerBase<T> : public AsyncWorker {
- public:
-  explicit AsyncProgressWorker(Callback *callback_);
-
-  virtual ~AsyncProgressWorker();
-
-  void WorkProgress();
-
-  class ExecutionProgress {
-   public:
-    void Signal() const;
-    void Send(const T* data, size_t size) const;
-  };
-
-  virtual void Execute(const ExecutionProgress& progress) = 0;
-
-  virtual void HandleProgressCallback(const T *data, size_t size) = 0;
-
-  virtual void Destroy();
-
-typedef AsyncProgressWorkerBase<T> AsyncProgressWorker;
-```
-
-<a name="api_nan_async_queue_worker"></a>
-### Nan::AsyncQueueWorker
-
-`Nan::AsyncQueueWorker` will run a `Nan::AsyncWorker` asynchronously via libuv. Both the `execute` and `after_work` steps are taken care of for you. Most of the logic for this is embedded in `Nan::AsyncWorker`.
-
-Definition:
-
-```c++
-void AsyncQueueWorker(AsyncWorker *);
-```
diff --git a/js/node_modules/nan/doc/buffers.md b/js/node_modules/nan/doc/buffers.md
deleted file mode 100644
index 8d8d25cf75a854d989ef7bc498caa7721913b89a..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/buffers.md
+++ /dev/null
@@ -1,54 +0,0 @@
-## Buffers
-
-NAN's `node::Buffer` helpers exist as the API has changed across supported Node versions. Use these methods to ensure compatibility.
-
- - <a href="#api_nan_new_buffer"><b><code>Nan::NewBuffer()</code></b></a>
- - <a href="#api_nan_copy_buffer"><b><code>Nan::CopyBuffer()</code></b></a>
- - <a href="#api_nan_free_callback"><b><code>Nan::FreeCallback()</code></b></a>
-
-<a name="api_nan_new_buffer"></a>
-### Nan::NewBuffer()
-
-Allocate a new `node::Buffer` object with the specified size and optional data. Calls `node::Buffer::New()`.
-
-Note that when creating a `Buffer` using `Nan::NewBuffer()` and an existing `char*`, it is assumed that the ownership of the pointer is being transferred to the new `Buffer` for management.
-When a `node::Buffer` instance is garbage collected and a `FreeCallback` has not been specified, `data` will be disposed of via a call to `free()`.
-You _must not_ free the memory space manually once you have created a `Buffer` in this way.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Object> Nan::NewBuffer(uint32_t size)
-Nan::MaybeLocal<v8::Object> Nan::NewBuffer(char* data, uint32_t size)
-Nan::MaybeLocal<v8::Object> Nan::NewBuffer(char *data,
-                                           size_t length,
-                                           Nan::FreeCallback callback,
-                                           void *hint)
-```
-
-
-<a name="api_nan_copy_buffer"></a>
-### Nan::CopyBuffer()
-
-Similar to [`Nan::NewBuffer()`](#api_nan_new_buffer) except that an implicit memcpy will occur within Node. Calls `node::Buffer::Copy()`.
-
-Management of the `char*` is left to the user, you should manually free the memory space if necessary as the new `Buffer` will have its own copy.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Object> Nan::CopyBuffer(const char *data, uint32_t size)
-```
-
-
-<a name="api_nan_free_callback"></a>
-### Nan::FreeCallback()
-
-A free callback that can be provided to [`Nan::NewBuffer()`](#api_nan_new_buffer).
-The supplied callback will be invoked when the `Buffer` undergoes garbage collection.
-
-Signature:
-
-```c++
-typedef void (*FreeCallback)(char *data, void *hint);
-```
diff --git a/js/node_modules/nan/doc/callback.md b/js/node_modules/nan/doc/callback.md
deleted file mode 100644
index 46de1d7172bea9d600ea5ae6695f94eb5b4b3e68..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/callback.md
+++ /dev/null
@@ -1,56 +0,0 @@
-## Nan::Callback
-
-`Nan::Callback` makes it easier to use `v8::Function` handles as callbacks. A class that wraps a `v8::Function` handle, protecting it from garbage collection and making it particularly useful for storage and use across asynchronous execution.
-
- - <a href="#api_nan_callback"><b><code>Nan::Callback</code></b></a>
-
-<a name="api_nan_callback"></a>
-### Nan::Callback
-
-```c++
-class Callback {
- public:
-  Callback();
-
-  explicit Callback(const v8::Local<v8::Function> &fn);
-
-  ~Callback();
-
-  bool operator==(const Callback &other) const;
-
-  bool operator!=(const Callback &other) const;
-
-  v8::Local<v8::Function> operator*() const;
-
-  v8::Local<v8::Value> operator()(v8::Local<v8::Object> target,
-                                  int argc = 0,
-                                  v8::Local<v8::Value> argv[] = 0) const;
-
-  v8::Local<v8::Value> operator()(int argc = 0,
-                                  v8::Local<v8::Value> argv[] = 0) const;
-
-  void SetFunction(const v8::Local<v8::Function> &fn);
-
-  v8::Local<v8::Function> GetFunction() const;
-
-  bool IsEmpty() const;
-
-  void Reset(const v8::Local<v8::Function> &fn);
-
-  void Reset();
-
-  v8::Local<v8::Value> Call(v8::Local<v8::Object> target,
-                            int argc,
-                            v8::Local<v8::Value> argv[]) const;
-
-  v8::Local<v8::Value> Call(int argc, v8::Local<v8::Value> argv[]) const;
-};
-```
-
-Example usage:
-
-```c++
-v8::Local<v8::Function> function;
-Nan::Callback callback(function);
-callback.Call(0, 0);
-```
diff --git a/js/node_modules/nan/doc/converters.md b/js/node_modules/nan/doc/converters.md
deleted file mode 100644
index d20861b5935b6208b594b91f67cabd27a2bb5558..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/converters.md
+++ /dev/null
@@ -1,41 +0,0 @@
-## Converters
-
-NAN contains functions that convert `v8::Value`s to other `v8::Value` types and native types. Since type conversion is not guaranteed to succeed, they return `Nan::Maybe` types. These converters can be used in place of `value->ToX()` and `value->XValue()` (where `X` is one of the types, e.g. `Boolean`) in a way that provides a consistent interface across V8 versions. Newer versions of V8 use the new `v8::Maybe` and `v8::MaybeLocal` types for these conversions, older versions don't have this functionality so it is provided by NAN.
-
- - <a href="#api_nan_to"><b><code>Nan::To()</code></b></a>
-
-<a name="api_nan_to"></a>
-### Nan::To()
-
-Converts a `v8::Local<v8::Value>` to a different subtype of `v8::Value` or to a native data type. Returns a `Nan::MaybeLocal<>` or a `Nan::Maybe<>` accordingly.
-
-See [maybe_types.md](./maybe_types.md) for more information on `Nan::Maybe` types.
-
-Signatures:
-
-```c++
-// V8 types
-Nan::MaybeLocal<v8::Boolean> Nan::To<v8::Boolean>(v8::Local<v8::Value> val);
-Nan::MaybeLocal<v8::Int32> Nan::To<v8::Int32>(v8::Local<v8::Value> val);
-Nan::MaybeLocal<v8::Integer> Nan::To<v8::Integer>(v8::Local<v8::Value> val);
-Nan::MaybeLocal<v8::Object> Nan::To<v8::Object>(v8::Local<v8::Value> val);
-Nan::MaybeLocal<v8::Number> Nan::To<v8::Number>(v8::Local<v8::Value> val);
-Nan::MaybeLocal<v8::String> Nan::To<v8::String>(v8::Local<v8::Value> val);
-Nan::MaybeLocal<v8::Uint32> Nan::To<v8::Uint32>(v8::Local<v8::Value> val);
-
-// Native types
-Nan::Maybe<bool> Nan::To<bool>(v8::Local<v8::Value> val);
-Nan::Maybe<double> Nan::To<double>(v8::Local<v8::Value> val);
-Nan::Maybe<int32_t> Nan::To<int32_t>(v8::Local<v8::Value> val);
-Nan::Maybe<int64_t> Nan::To<int64_t>(v8::Local<v8::Value> val);
-Nan::Maybe<uint32_t> Nan::To<uint32_t>(v8::Local<v8::Value> val);
-```
-
-### Example
-
-```c++
-v8::Local<v8::Value> val;
-Nan::MaybeLocal<v8::String> str = Nan::To<v8::String>(val);
-Nan::Maybe<double> d = Nan::To<double>(val);
-```
-
diff --git a/js/node_modules/nan/doc/errors.md b/js/node_modules/nan/doc/errors.md
deleted file mode 100644
index aac6e087fc6ce7234a27060d7bb391df73f1e469..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/errors.md
+++ /dev/null
@@ -1,226 +0,0 @@
-## Errors
-
-NAN includes helpers for creating, throwing and catching Errors as much of this functionality varies across the supported versions of V8 and must be abstracted.
-
-Note that an Error object is simply a specialized form of `v8::Value`.
-
-Also consult the V8 Embedders Guide section on [Exceptions](https://developers.google.com/v8/embed#exceptions) for more information.
-
- - <a href="#api_nan_error"><b><code>Nan::Error()</code></b></a>
- - <a href="#api_nan_range_error"><b><code>Nan::RangeError()</code></b></a>
- - <a href="#api_nan_reference_error"><b><code>Nan::ReferenceError()</code></b></a>
- - <a href="#api_nan_syntax_error"><b><code>Nan::SyntaxError()</code></b></a>
- - <a href="#api_nan_type_error"><b><code>Nan::TypeError()</code></b></a>
- - <a href="#api_nan_throw_error"><b><code>Nan::ThrowError()</code></b></a>
- - <a href="#api_nan_throw_range_error"><b><code>Nan::ThrowRangeError()</code></b></a>
- - <a href="#api_nan_throw_reference_error"><b><code>Nan::ThrowReferenceError()</code></b></a>
- - <a href="#api_nan_throw_syntax_error"><b><code>Nan::ThrowSyntaxError()</code></b></a>
- - <a href="#api_nan_throw_type_error"><b><code>Nan::ThrowTypeError()</code></b></a>
- - <a href="#api_nan_fatal_exception"><b><code>Nan::FatalException()</code></b></a>
- - <a href="#api_nan_errno_exception"><b><code>Nan::ErrnoException()</code></b></a>
- - <a href="#api_nan_try_catch"><b><code>Nan::TryCatch</code></b></a>
-
-
-<a name="api_nan_error"></a>
-### Nan::Error()
-
-Create a new Error object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.
-
-Note that an Error object is simply a specialized form of `v8::Value`.
-
-Signature:
-
-```c++
-v8::Local<v8::Value> Nan::Error(const char *msg);
-v8::Local<v8::Value> Nan::Error(v8::Local<v8::String> msg);
-```
-
-
-<a name="api_nan_range_error"></a>
-### Nan::RangeError()
-
-Create a new RangeError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.
-
-Note that an RangeError object is simply a specialized form of `v8::Value`.
-
-Signature:
-
-```c++
-v8::Local<v8::Value> Nan::RangeError(const char *msg);
-v8::Local<v8::Value> Nan::RangeError(v8::Local<v8::String> msg);
-```
-
-
-<a name="api_nan_reference_error"></a>
-### Nan::ReferenceError()
-
-Create a new ReferenceError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.
-
-Note that an ReferenceError object is simply a specialized form of `v8::Value`.
-
-Signature:
-
-```c++
-v8::Local<v8::Value> Nan::ReferenceError(const char *msg);
-v8::Local<v8::Value> Nan::ReferenceError(v8::Local<v8::String> msg);
-```
-
-
-<a name="api_nan_syntax_error"></a>
-### Nan::SyntaxError()
-
-Create a new SyntaxError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.
-
-Note that an SyntaxError object is simply a specialized form of `v8::Value`.
-
-Signature:
-
-```c++
-v8::Local<v8::Value> Nan::SyntaxError(const char *msg);
-v8::Local<v8::Value> Nan::SyntaxError(v8::Local<v8::String> msg);
-```
-
-
-<a name="api_nan_type_error"></a>
-### Nan::TypeError()
-
-Create a new TypeError object using the [v8::Exception](https://v8docs.nodesource.com/io.js-3.0/da/d6a/classv8_1_1_exception.html) class in a way that is compatible across the supported versions of V8.
-
-Note that an TypeError object is simply a specialized form of `v8::Value`.
-
-Signature:
-
-```c++
-v8::Local<v8::Value> Nan::TypeError(const char *msg);
-v8::Local<v8::Value> Nan::TypeError(v8::Local<v8::String> msg);
-```
-
-
-<a name="api_nan_throw_error"></a>
-### Nan::ThrowError()
-
-Throw an Error object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new Error object will be created.
-
-Signature:
-
-```c++
-void Nan::ThrowError(const char *msg);
-void Nan::ThrowError(v8::Local<v8::String> msg);
-void Nan::ThrowError(v8::Local<v8::Value> error);
-```
-
-
-<a name="api_nan_throw_range_error"></a>
-### Nan::ThrowRangeError()
-
-Throw an RangeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new RangeError object will be created.
-
-Signature:
-
-```c++
-void Nan::ThrowRangeError(const char *msg);
-void Nan::ThrowRangeError(v8::Local<v8::String> msg);
-void Nan::ThrowRangeError(v8::Local<v8::Value> error);
-```
-
-
-<a name="api_nan_throw_reference_error"></a>
-### Nan::ThrowReferenceError()
-
-Throw an ReferenceError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new ReferenceError object will be created.
-
-Signature:
-
-```c++
-void Nan::ThrowReferenceError(const char *msg);
-void Nan::ThrowReferenceError(v8::Local<v8::String> msg);
-void Nan::ThrowReferenceError(v8::Local<v8::Value> error);
-```
-
-
-<a name="api_nan_throw_syntax_error"></a>
-### Nan::ThrowSyntaxError()
-
-Throw an SyntaxError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new SyntaxError object will be created.
-
-Signature:
-
-```c++
-void Nan::ThrowSyntaxError(const char *msg);
-void Nan::ThrowSyntaxError(v8::Local<v8::String> msg);
-void Nan::ThrowSyntaxError(v8::Local<v8::Value> error);
-```
-
-
-<a name="api_nan_throw_type_error"></a>
-### Nan::ThrowTypeError()
-
-Throw an TypeError object (a specialized `v8::Value` as above) in the current context. If a `msg` is provided, a new TypeError object will be created.
-
-Signature:
-
-```c++
-void Nan::ThrowTypeError(const char *msg);
-void Nan::ThrowTypeError(v8::Local<v8::String> msg);
-void Nan::ThrowTypeError(v8::Local<v8::Value> error);
-```
-
-<a name="api_nan_fatal_exception"></a>
-### Nan::FatalException()
-
-Replaces `node::FatalException()` which has a different API across supported versions of Node. For use with [`Nan::TryCatch`](#api_nan_try_catch).
-
-Signature:
-
-```c++
-void Nan::FatalException(const Nan::TryCatch& try_catch);
-```
-
-<a name="api_nan_errno_exception"></a>
-### Nan::ErrnoException()
-
-Replaces `node::ErrnoException()` which has a different API across supported versions of Node. 
-
-Signature:
-
-```c++
-v8::Local<v8::Value> Nan::ErrnoException(int errorno,
-                                         const char* syscall = NULL,
-                                         const char* message = NULL,
-                                         const char* path = NULL);
-```
-
-
-<a name="api_nan_try_catch"></a>
-### Nan::TryCatch
-
-A simple wrapper around [`v8::TryCatch`](https://v8docs.nodesource.com/io.js-3.0/d4/dc6/classv8_1_1_try_catch.html) compatible with all supported versions of V8. Can be used as a direct replacement in most cases. See also [`Nan::FatalException()`](#api_nan_fatal_exception) for an internal use compatible with `node::FatalException`.
-
-Signature:
-
-```c++
-class Nan::TryCatch {
- public:
-  Nan::TryCatch();
-
-  bool HasCaught() const;
-
-  bool CanContinue() const;
-
-  v8::Local<v8::Value> ReThrow();
-
-  v8::Local<v8::Value> Exception() const;
-
-  // Nan::MaybeLocal for older versions of V8
-  v8::MaybeLocal<v8::Value> StackTrace() const;
-
-  v8::Local<v8::Message> Message() const;
-
-  void Reset();
-
-  void SetVerbose(bool value);
-
-  void SetCaptureMessage(bool value);
-};
-```
-
diff --git a/js/node_modules/nan/doc/maybe_types.md b/js/node_modules/nan/doc/maybe_types.md
deleted file mode 100644
index 9ca9ceecfd0e70665403022d3b48f8840197b7ad..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/maybe_types.md
+++ /dev/null
@@ -1,512 +0,0 @@
-## Maybe Types
-
-The `Nan::MaybeLocal` and `Nan::Maybe` types are monads that encapsulate `v8::Local` handles that _may be empty_.
-
-* **Maybe Types**
-  - <a href="#api_nan_maybe_local"><b><code>Nan::MaybeLocal</code></b></a>
-  - <a href="#api_nan_maybe"><b><code>Nan::Maybe</code></b></a>
-  - <a href="#api_nan_nothing"><b><code>Nan::Nothing</code></b></a>
-  - <a href="#api_nan_just"><b><code>Nan::Just</code></b></a>
-* **Maybe Helpers**
-  - <a href="#api_nan_call"><b><code>Nan::Call()</code></b></a>
-  - <a href="#api_nan_to_detail_string"><b><code>Nan::ToDetailString()</code></b></a>
-  - <a href="#api_nan_to_array_index"><b><code>Nan::ToArrayIndex()</code></b></a>
-  - <a href="#api_nan_equals"><b><code>Nan::Equals()</code></b></a>
-  - <a href="#api_nan_new_instance"><b><code>Nan::NewInstance()</code></b></a>
-  - <a href="#api_nan_get_function"><b><code>Nan::GetFunction()</code></b></a>
-  - <a href="#api_nan_set"><b><code>Nan::Set()</code></b></a>
-  - <a href="#api_nan_force_set"><b><code>Nan::ForceSet()</code></b></a>
-  - <a href="#api_nan_get"><b><code>Nan::Get()</code></b></a>
-  - <a href="#api_nan_get_property_attribute"><b><code>Nan::GetPropertyAttributes()</code></b></a>
-  - <a href="#api_nan_has"><b><code>Nan::Has()</code></b></a>
-  - <a href="#api_nan_delete"><b><code>Nan::Delete()</code></b></a>
-  - <a href="#api_nan_get_property_names"><b><code>Nan::GetPropertyNames()</code></b></a>
-  - <a href="#api_nan_get_own_property_names"><b><code>Nan::GetOwnPropertyNames()</code></b></a>
-  - <a href="#api_nan_set_prototype"><b><code>Nan::SetPrototype()</code></b></a>
-  - <a href="#api_nan_object_proto_to_string"><b><code>Nan::ObjectProtoToString()</code></b></a>
-  - <a href="#api_nan_has_own_property"><b><code>Nan::HasOwnProperty()</code></b></a>
-  - <a href="#api_nan_has_real_named_property"><b><code>Nan::HasRealNamedProperty()</code></b></a>
-  - <a href="#api_nan_has_real_indexed_property"><b><code>Nan::HasRealIndexedProperty()</code></b></a>
-  - <a href="#api_nan_has_real_named_callback_property"><b><code>Nan::HasRealNamedCallbackProperty()</code></b></a>
-  - <a href="#api_nan_get_real_named_property_in_prototype_chain"><b><code>Nan::GetRealNamedPropertyInPrototypeChain()</code></b></a>
-  - <a href="#api_nan_get_real_named_property"><b><code>Nan::GetRealNamedProperty()</code></b></a>
-  - <a href="#api_nan_call_as_function"><b><code>Nan::CallAsFunction()</code></b></a>
-  - <a href="#api_nan_call_as_constructor"><b><code>Nan::CallAsConstructor()</code></b></a>
-  - <a href="#api_nan_get_source_line"><b><code>Nan::GetSourceLine()</code></b></a>
-  - <a href="#api_nan_get_line_number"><b><code>Nan::GetLineNumber()</code></b></a>
-  - <a href="#api_nan_get_start_column"><b><code>Nan::GetStartColumn()</code></b></a>
-  - <a href="#api_nan_get_end_column"><b><code>Nan::GetEndColumn()</code></b></a>
-  - <a href="#api_nan_clone_element_at"><b><code>Nan::CloneElementAt()</code></b></a>
-  - <a href="#api_nan_make_maybe"><b><code>Nan::MakeMaybe()</code></b></a>
-
-<a name="api_nan_maybe_local"></a>
-### Nan::MaybeLocal
-
-A `Nan::MaybeLocal<T>` is a wrapper around [`v8::Local<T>`](https://v8docs.nodesource.com/io.js-3.0/de/deb/classv8_1_1_local.html) that enforces a check that determines whether the `v8::Local<T>` is empty before it can be used.
-
-If an API method returns a `Nan::MaybeLocal`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, an empty `Nan::MaybeLocal` is returned.
-
-Definition:
-
-```c++
-template<typename T> class Nan::MaybeLocal {
- public:
-  MaybeLocal();
-
-  template<typename S> MaybeLocal(v8::Local<S> that);
-
-  bool IsEmpty() const;
-
-  template<typename S> bool ToLocal(v8::Local<S> *out);
-
-  // Will crash if the MaybeLocal<> is empty.
-  v8::Local<T> ToLocalChecked();
-
-  template<typename S> v8::Local<S> FromMaybe(v8::Local<S> default_value) const;
-};
-```
-
-See the documentation for [`v8::MaybeLocal`](https://v8docs.nodesource.com/io.js-3.0/d8/d7d/classv8_1_1_maybe_local.html) for further details.
-
-<a name="api_nan_maybe"></a>
-### Nan::Maybe
-
-A simple `Nan::Maybe` type, representing an object which may or may not have a value, see https://hackage.haskell.org/package/base/docs/Data-Maybe.html.
-
-If an API method returns a `Nan::Maybe<>`, the API method can potentially fail either because an exception is thrown, or because an exception is pending, e.g. because a previous API call threw an exception that hasn't been caught yet, or because a `v8::TerminateExecution` exception was thrown. In that case, a "Nothing" value is returned.
-
-Definition:
-
-```c++
-template<typename T> class Nan::Maybe {
- public:
-  bool IsNothing() const;
-  bool IsJust() const;
-
-  // Will crash if the Maybe<> is nothing.
-  T FromJust();
-
-  T FromMaybe(const T& default_value);
-
-  bool operator==(const Maybe &other);
-
-  bool operator!=(const Maybe &other);
-};
-```
-
-See the documentation for [`v8::Maybe`](https://v8docs.nodesource.com/io.js-3.0/d9/d4b/classv8_1_1_maybe.html) for further details.
-
-<a name="api_nan_nothing"></a>
-### Nan::Nothing
-
-Construct an empty `Nan::Maybe` type representing _nothing_.
-
-```c++
-template<typename T> Nan::Maybe<T> Nan::Nothing();
-```
-
-<a name="api_nan_just"></a>
-### Nan::Just
-
-Construct a `Nan::Maybe` type representing _just_ a value.
-
-```c++
-template<typename T> Nan::Maybe<T> Nan::Just(const T &t);
-```
-
-<a name="api_nan_call"></a>
-### Nan::Call()
-
-A helper method for calling [`v8::Function#Call()`](https://v8docs.nodesource.com/io.js-3.0/d5/d54/classv8_1_1_function.html#a468a89f737af0612db10132799c827c0) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Value> Nan::Call(v8::Local<v8::Function> fun, v8::Local<v8::Object> recv, int argc, v8::Local<v8::Value> argv[]);
-```
-
-
-<a name="api_nan_to_detail_string"></a>
-### Nan::ToDetailString()
-
-A helper method for calling [`v8::Value#ToDetailString()`](https://v8docs.nodesource.com/io.js-3.0/dc/d0a/classv8_1_1_value.html#a2f9770296dc2c8d274bc8cc0dca243e5) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::String> Nan::ToDetailString(v8::Local<v8::Value> val);
-```
-
-
-<a name="api_nan_to_array_index"></a>
-### Nan::ToArrayIndex()
-
-A helper method for calling [`v8::Value#ToArrayIndex()`](https://v8docs.nodesource.com/io.js-3.0/dc/d0a/classv8_1_1_value.html#acc5bbef3c805ec458470c0fcd6f13493) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Uint32> Nan::ToArrayIndex(v8::Local<v8::Value> val);
-```
-
-
-<a name="api_nan_equals"></a>
-### Nan::Equals()
-
-A helper method for calling [`v8::Value#Equals()`](https://v8docs.nodesource.com/io.js-3.0/dc/d0a/classv8_1_1_value.html#a0d9616ab2de899d4e3047c30a10c9285) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<bool> Nan::Equals(v8::Local<v8::Value> a, v8::Local<v8::Value>(b));
-```
-
-
-<a name="api_nan_new_instance"></a>
-### Nan::NewInstance()
-
-A helper method for calling [`v8::Function#NewInstance()`](https://v8docs.nodesource.com/io.js-3.0/d5/d54/classv8_1_1_function.html#a691b13f7a553069732cbacf5ac8c62ec) and [`v8::ObjectTemplate#NewInstance()`](https://v8docs.nodesource.com/io.js-3.0/db/d5f/classv8_1_1_object_template.html#ad605a7543cfbc5dab54cdb0883d14ae4) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Object> Nan::NewInstance(v8::Local<v8::Function> h);
-Nan::MaybeLocal<v8::Object> Nan::NewInstance(v8::Local<v8::Function> h, int argc, v8::Local<v8::Value> argv[]);
-Nan::MaybeLocal<v8::Object> Nan::NewInstance(v8::Local<v8::ObjectTemplate> h);
-```
-
-
-<a name="api_nan_get_function"></a>
-### Nan::GetFunction()
-
-A helper method for calling [`v8::FunctionTemplate#GetFunction()`](https://v8docs.nodesource.com/io.js-3.0/d8/d83/classv8_1_1_function_template.html#a56d904662a86eca78da37d9bb0ed3705) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Function> Nan::GetFunction(v8::Local<v8::FunctionTemplate> t);
-```
-
-
-<a name="api_nan_set"></a>
-### Nan::Set()
-
-A helper method for calling [`v8::Object#Set()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a67604ea3734f170c66026064ea808f20) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<bool> Nan::Set(v8::Local<v8::Object> obj,
-                          v8::Local<v8::Value> key,
-                          v8::Local<v8::Value> value)
-Nan::Maybe<bool> Nan::Set(v8::Local<v8::Object> obj,
-                          uint32_t index,
-                          v8::Local<v8::Value> value);
-```
-
-
-<a name="api_nan_force_set"></a>
-### Nan::ForceSet()
-
-A helper method for calling [`v8::Object#ForceSet()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a796b7b682896fb64bf1872747734e836) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<bool> Nan::ForceSet(v8::Local<v8::Object> obj,
-                               v8::Local<v8::Value> key,
-                               v8::Local<v8::Value> value,
-                               v8::PropertyAttribute attribs = v8::None);
-```
-
-
-<a name="api_nan_get"></a>
-### Nan::Get()
-
-A helper method for calling [`v8::Object#Get()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a2565f03e736694f6b1e1cf22a0b4eac2) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Value> Nan::Get(v8::Local<v8::Object> obj,
-                                    v8::Local<v8::Value> key);
-Nan::MaybeLocal<v8::Value> Nan::Get(v8::Local<v8::Object> obj, uint32_t index);
-```
-
-
-<a name="api_nan_get_property_attribute"></a>
-### Nan::GetPropertyAttributes()
-
-A helper method for calling [`v8::Object#GetPropertyAttributes()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a9b898894da3d1db2714fd9325a54fe57) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<v8::PropertyAttribute> Nan::GetPropertyAttributes(
-    v8::Local<v8::Object> obj,
-    v8::Local<v8::Value> key);
-```
-
-
-<a name="api_nan_has"></a>
-### Nan::Has()
-
-A helper method for calling [`v8::Object#Has()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab3c3d89ea7c2f9afd08965bd7299a41d) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<bool> Nan::Has(v8::Local<v8::Object> obj, v8::Local<v8::String> key);
-Nan::Maybe<bool> Nan::Has(v8::Local<v8::Object> obj, uint32_t index);
-```
-
-
-<a name="api_nan_delete"></a>
-### Nan::Delete()
-
-A helper method for calling [`v8::Object#Delete()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a2fa0f5a592582434ed1ceceff7d891ef) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<bool> Nan::Delete(v8::Local<v8::Object> obj,
-                             v8::Local<v8::String> key);
-Nan::Maybe<bool> Nan::Delete(v8::Local<v8::Object> obj, uint32_t index);
-```
-
-
-<a name="api_nan_get_property_names"></a>
-### Nan::GetPropertyNames()
-
-A helper method for calling [`v8::Object#GetPropertyNames()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#aced885270cfd2c956367b5eedc7fbfe8) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Array> Nan::GetPropertyNames(v8::Local<v8::Object> obj);
-```
-
-
-<a name="api_nan_get_own_property_names"></a>
-### Nan::GetOwnPropertyNames()
-
-A helper method for calling [`v8::Object#GetOwnPropertyNames()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a79a6e4d66049b9aa648ed4dfdb23e6eb) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Array> Nan::GetOwnPropertyNames(v8::Local<v8::Object> obj);
-```
-
-
-<a name="api_nan_set_prototype"></a>
-### Nan::SetPrototype()
-
-A helper method for calling [`v8::Object#SetPrototype()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a442706b22fceda6e6d1f632122a9a9f4) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<bool> Nan::SetPrototype(v8::Local<v8::Object> obj,
-                                   v8::Local<v8::Value> prototype);
-```
-
-
-<a name="api_nan_object_proto_to_string"></a>
-### Nan::ObjectProtoToString()
-
-A helper method for calling [`v8::Object#ObjectProtoToString()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab7a92b4dcf822bef72f6c0ac6fea1f0b) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::String> Nan::ObjectProtoToString(v8::Local<v8::Object> obj);
-```
-
-
-<a name="api_nan_has_own_property"></a>
-### Nan::HasOwnProperty()
-
-A helper method for calling [`v8::Object#HasOwnProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab7b7245442ca6de1e1c145ea3fd653ff) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<bool> Nan::HasOwnProperty(v8::Local<v8::Object> obj,
-                                     v8::Local<v8::String> key);
-```
-
-
-<a name="api_nan_has_real_named_property"></a>
-### Nan::HasRealNamedProperty()
-
-A helper method for calling [`v8::Object#HasRealNamedProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ad8b80a59c9eb3c1e6c3cd6c84571f767) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<bool> Nan::HasRealNamedProperty(v8::Local<v8::Object> obj,
-                                           v8::Local<v8::String> key);
-```
-
-
-<a name="api_nan_has_real_indexed_property"></a>
-### Nan::HasRealIndexedProperty()
-
-A helper method for calling [`v8::Object#HasRealIndexedProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#af94fc1135a5e74a2193fb72c3a1b9855) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<bool> Nan::HasRealIndexedProperty(v8::Local<v8::Object> obj,
-                                             uint32_t index);
-```
-
-
-<a name="api_nan_has_real_named_callback_property"></a>
-### Nan::HasRealNamedCallbackProperty()
-
-A helper method for calling [`v8::Object#HasRealNamedCallbackProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#af743b7ea132b89f84d34d164d0668811) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<bool> Nan::HasRealNamedCallbackProperty(
-    v8::Local<v8::Object> obj,
-    v8::Local<v8::String> key);
-```
-
-
-<a name="api_nan_get_real_named_property_in_prototype_chain"></a>
-### Nan::GetRealNamedPropertyInPrototypeChain()
-
-A helper method for calling [`v8::Object#GetRealNamedPropertyInPrototypeChain()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a8700b1862e6b4783716964ba4d5e6172) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Value> Nan::GetRealNamedPropertyInPrototypeChain(
-    v8::Local<v8::Object> obj,
-    v8::Local<v8::String> key);
-```
-
-
-<a name="api_nan_get_real_named_property"></a>
-### Nan::GetRealNamedProperty()
-
-A helper method for calling [`v8::Object#GetRealNamedProperty()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a84471a824576a5994fdd0ffcbf99ccc0) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Value> Nan::GetRealNamedProperty(v8::Local<v8::Object> obj,
-                                                     v8::Local<v8::String> key);
-```
-
-
-<a name="api_nan_call_as_function"></a>
-### Nan::CallAsFunction()
-
-A helper method for calling [`v8::Object#CallAsFunction()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a9ef18be634e79b4f0cdffa1667a29f58) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Value> Nan::CallAsFunction(v8::Local<v8::Object> obj,
-                                               v8::Local<v8::Object> recv,
-                                               int argc,
-                                               v8::Local<v8::Value> argv[]);
-```
-
-
-<a name="api_nan_call_as_constructor"></a>
-### Nan::CallAsConstructor()
-
-A helper method for calling [`v8::Object#CallAsConstructor()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a50d571de50d0b0dfb28795619d07a01b) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Value> Nan::CallAsConstructor(v8::Local<v8::Object> obj,
-                                                  int argc,
-                                                  v8::Local<v8::Value> argv[]);
-```
-
-
-<a name="api_nan_get_source_line"></a>
-### Nan::GetSourceLine()
-
-A helper method for calling [`v8::Message#GetSourceLine()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#a849f7a6c41549d83d8159825efccd23a) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::String> Nan::GetSourceLine(v8::Local<v8::Message> msg);
-```
-
-
-<a name="api_nan_get_line_number"></a>
-### Nan::GetLineNumber()
-
-A helper method for calling [`v8::Message#GetLineNumber()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#adbe46c10a88a6565f2732a2d2adf99b9) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<int> Nan::GetLineNumber(v8::Local<v8::Message> msg);
-```
-
-
-<a name="api_nan_get_start_column"></a>
-### Nan::GetStartColumn()
-
-A helper method for calling [`v8::Message#GetStartColumn()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#a60ede616ba3822d712e44c7a74487ba6) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<int> Nan::GetStartColumn(v8::Local<v8::Message> msg);
-```
-
-
-<a name="api_nan_get_end_column"></a>
-### Nan::GetEndColumn()
-
-A helper method for calling [`v8::Message#GetEndColumn()`](https://v8docs.nodesource.com/io.js-3.0/d9/d28/classv8_1_1_message.html#aaa004cf19e529da980bc19fcb76d93be) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::Maybe<int> Nan::GetEndColumn(v8::Local<v8::Message> msg);
-```
-
-
-<a name="api_nan_clone_element_at"></a>
-### Nan::CloneElementAt()
-
-A helper method for calling [`v8::Array#CloneElementAt()`](https://v8docs.nodesource.com/io.js-3.0/d3/d32/classv8_1_1_array.html#a1d3a878d4c1c7cae974dd50a1639245e) in a way compatible across supported versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Object> Nan::CloneElementAt(v8::Local<v8::Array> array, uint32_t index);
-```
-
-<a name="api_nan_make_maybe"></a>
-### Nan::MakeMaybe()
-
-Wraps a `v8::Local<>` in a `Nan::MaybeLocal<>`. When called with a `Nan::MaybeLocal<>` it just returns its argument. This is useful in generic template code that builds on NAN.
-
-Synopsis:
-
-```c++
-  MaybeLocal<v8::Number> someNumber = MakeMaybe(New<v8::Number>(3.141592654));
-  MaybeLocal<v8::String> someString = MakeMaybe(New<v8::String>("probably"));
-```
-
-Signature:
-
-```c++
-template <typename T, template <typename> class MaybeMaybe>
-Nan::MaybeLocal<T> Nan::MakeMaybe(MaybeMaybe<T> v);
-```
diff --git a/js/node_modules/nan/doc/methods.md b/js/node_modules/nan/doc/methods.md
deleted file mode 100644
index 0411a7056b54f57432c4e1462e4afc8f0be664ea..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/methods.md
+++ /dev/null
@@ -1,659 +0,0 @@
-## JavaScript-accessible methods
-
-A _template_ is a blueprint for JavaScript functions and objects in a context. You can use a template to wrap C++ functions and data structures within JavaScript objects so that they can be manipulated from JavaScript. See the V8 Embedders Guide section on [Templates](https://developers.google.com/v8/embed#templates) for further information.
-
-In order to expose functionality to JavaScript via a template, you must provide it to V8 in a form that it understands. Across the versions of V8 supported by NAN, JavaScript-accessible method signatures vary widely, NAN fully abstracts method declaration and provides you with an interface that is similar to the most recent V8 API but is backward-compatible with older versions that still use the now-deceased `v8::Argument` type.
-
-* **Method argument types**
- - <a href="#api_nan_function_callback_info"><b><code>Nan::FunctionCallbackInfo</code></b></a>
- - <a href="#api_nan_property_callback_info"><b><code>Nan::PropertyCallbackInfo</code></b></a>
- - <a href="#api_nan_return_value"><b><code>Nan::ReturnValue</code></b></a>
-* **Method declarations**
- - <a href="#api_nan_method"><b>Method declaration</b></a>
- - <a href="#api_nan_getter"><b>Getter declaration</b></a>
- - <a href="#api_nan_setter"><b>Setter declaration</b></a>
- - <a href="#api_nan_property_getter"><b>Property getter declaration</b></a>
- - <a href="#api_nan_property_setter"><b>Property setter declaration</b></a>
- - <a href="#api_nan_property_enumerator"><b>Property enumerator declaration</b></a>
- - <a href="#api_nan_property_deleter"><b>Property deleter declaration</b></a>
- - <a href="#api_nan_property_query"><b>Property query declaration</b></a>
- - <a href="#api_nan_index_getter"><b>Index getter declaration</b></a>
- - <a href="#api_nan_index_setter"><b>Index setter declaration</b></a>
- - <a href="#api_nan_index_enumerator"><b>Index enumerator declaration</b></a>
- - <a href="#api_nan_index_deleter"><b>Index deleter declaration</b></a>
- - <a href="#api_nan_index_query"><b>Index query declaration</b></a>
-* Method and template helpers
- - <a href="#api_nan_set_method"><b><code>Nan::SetMethod()</code></b></a>
- - <a href="#api_nan_set_prototype_method"><b><code>Nan::SetPrototypeMethod()</code></b></a>
- - <a href="#api_nan_set_accessor"><b><code>Nan::SetAccessor()</code></b></a>
- - <a href="#api_nan_set_named_property_handler"><b><code>Nan::SetNamedPropertyHandler()</code></b></a>
- - <a href="#api_nan_set_indexed_property_handler"><b><code>Nan::SetIndexedPropertyHandler()</code></b></a>
- - <a href="#api_nan_set_template"><b><code>Nan::SetTemplate()</code></b></a>
- - <a href="#api_nan_set_prototype_template"><b><code>Nan::SetPrototypeTemplate()</code></b></a>
- - <a href="#api_nan_set_instance_template"><b><code>Nan::SetInstanceTemplate()</code></b></a>
- - <a href="#api_nan_set_call_handler"><b><code>Nan::SetCallHandler()</code></b></a>
- - <a href="#api_nan_set_call_as_function_handler"><b><code>Nan::SetCallAsFunctionHandler()</code></b></a>
-
-<a name="api_nan_function_callback_info"></a>
-### Nan::FunctionCallbackInfo
-
-`Nan::FunctionCallbackInfo` should be used in place of [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/io.js-3.0/dd/d0d/classv8_1_1_function_callback_info.html), even with older versions of Node where `v8::FunctionCallbackInfo` does not exist.
-
-Definition:
-
-```c++
-template<typename T> class FunctionCallbackInfo {
- public:
-  ReturnValue<T> GetReturnValue() const;
-  v8::Local<v8::Function> Callee();
-  v8::Local<v8::Value> Data();
-  v8::Local<v8::Object> Holder();
-  bool IsConstructCall();
-  int Length() const;
-  v8::Local<v8::Value> operator[](int i) const;
-  v8::Local<v8::Object> This() const;
-  v8::Isolate *GetIsolate() const;
-};
-```
-
-See the [`v8::FunctionCallbackInfo`](https://v8docs.nodesource.com/io.js-3.0/dd/d0d/classv8_1_1_function_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from methods.
-
-<a name="api_nan_property_callback_info"></a>
-### Nan::PropertyCallbackInfo
-
-`Nan::PropertyCallbackInfo` should be used in place of [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/io.js-3.0/d7/dc5/classv8_1_1_property_callback_info.html), even with older versions of Node where `v8::PropertyCallbackInfo` does not exist.
-
-Definition:
-
-```c++
-template<typename T> class PropertyCallbackInfo : public PropertyCallbackInfoBase<T> {
- public:
-  ReturnValue<T> GetReturnValue() const;
-  v8::Isolate* GetIsolate() const;
-  v8::Local<v8::Value> Data() const;
-  v8::Local<v8::Object> This() const;
-  v8::Local<v8::Object> Holder() const;
-};
-```
-
-See the [`v8::PropertyCallbackInfo`](https://v8docs.nodesource.com/io.js-3.0/d7/dc5/classv8_1_1_property_callback_info.html) documentation for usage details on these. See [`Nan::ReturnValue`](#api_nan_return_value) for further information on how to set a return value from property accessor methods.
-
-<a name="api_nan_return_value"></a>
-### Nan::ReturnValue
-
-`Nan::ReturnValue` is used in place of [`v8::ReturnValue`](https://v8docs.nodesource.com/io.js-3.0/da/da7/classv8_1_1_return_value.html) on both [`Nan::FunctionCallbackInfo`](#api_nan_function_callback_info) and [`Nan::PropertyCallbackInfo`](#api_nan_property_callback_info) as the return type of `GetReturnValue()`.
-
-Example usage:
-
-```c++
-void EmptyArray(const Nan::FunctionCallbackInfo<v8::Value>& info) {
-  info.GetReturnValue().Set(Nan::New<v8::Array>());
-}
-```
-
-Definition:
-
-```c++
-template<typename T> class ReturnValue {
- public:
-  // Handle setters
-  template <typename S> void Set(const v8::Local<S> &handle);
-  template <typename S> void Set(const Nan::Global<S> &handle);
-
-  // Fast primitive setters
-  void Set(bool value);
-  void Set(double i);
-  void Set(int32_t i);
-  void Set(uint32_t i);
-
-  // Fast JS primitive setters
-  void SetNull();
-  void SetUndefined();
-  void SetEmptyString();
-
-  // Convenience getter for isolate
-  v8::Isolate *GetIsolate() const;
-};
-```
-
-See the documentation on [`v8::ReturnValue`](https://v8docs.nodesource.com/io.js-3.0/da/da7/classv8_1_1_return_value.html) for further information on this.
-
-<a name="api_nan_method"></a>
-### Method declaration
-
-JavaScript-accessible methods should be declared with the following signature to form a `Nan::FunctionCallback`:
-
-```c++
-typedef void(*FunctionCallback)(const FunctionCallbackInfo<v8::Value>&);
-```
-
-Example:
-
-```c++
-void MethodName(const Nan::FunctionCallbackInfo<v8::Value>& info) {
-  ...
-}
-```
-
-You do not need to declare a new `HandleScope` within a method as one is implicitly created for you.
-
-**Example usage**
-
-```c++
-// .h:
-class Foo : public Nan::ObjectWrap {
-  ...
-
-  static void Bar(const Nan::FunctionCallbackInfo<v8::Value>& info);
-  static void Baz(const Nan::FunctionCallbackInfo<v8::Value>& info);
-}
-
-
-// .cc:
-void Foo::Bar(const Nan::FunctionCallbackInfo<v8::Value>& info) {
-  ...
-}
-
-void Foo::Baz(const Nan::FunctionCallbackInfo<v8::Value>& info) {
-  ...
-}
-```
-
-A helper macro `NAN_METHOD(methodname)` exists, compatible with NAN v1 method declarations.
-
-**Example usage with `NAN_METHOD(methodname)`**
-
-```c++
-// .h:
-class Foo : public Nan::ObjectWrap {
-  ...
-
-  static NAN_METHOD(Bar);
-  static NAN_METHOD(Baz);
-}
-
-
-// .cc:
-NAN_METHOD(Foo::Bar) {
-  ...
-}
-
-NAN_METHOD(Foo::Baz) {
-  ...
-}
-```
-
-Use [`Nan::SetPrototypeMethod`](#api_nan_set_prototype_method) to attach a method to a JavaScript function prototype or [`Nan::SetMethod`](#api_nan_set_method) to attach a method directly on a JavaScript object.
-
-<a name="api_nan_getter"></a>
-### Getter declaration
-
-JavaScript-accessible getters should be declared with the following signature to form a `Nan::GetterCallback`:
-
-```c++
-typedef void(*GetterCallback)(v8::Local<v8::String>,
-                              const PropertyCallbackInfo<v8::Value>&);
-```
-
-Example:
-
-```c++
-void GetterName(v8::Local<v8::String> property,
-                const Nan::PropertyCallbackInfo<v8::Value>& info) {
-  ...
-}
-```
-
-You do not need to declare a new `HandleScope` within a getter as one is implicitly created for you.
-
-A helper macro `NAN_GETTER(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on [Accessors](https://developers.google.com/v8/embed#accesssors).
-
-<a name="api_nan_setter"></a>
-### Setter declaration
-
-JavaScript-accessible setters should be declared with the following signature to form a <b><code>Nan::SetterCallback</code></b>:
-
-```c++
-typedef void(*SetterCallback)(v8::Local<v8::String>,
-                              v8::Local<v8::Value>,
-                              const PropertyCallbackInfo<void>&);
-```
-
-Example:
-
-```c++
-void SetterName(v8::Local<v8::String> property,
-                v8::Local<v8::Value> value,
-                const Nan::PropertyCallbackInfo<void>& info) {
-  ...
-}
-```
-
-You do not need to declare a new `HandleScope` within a setter as one is implicitly created for you.
-
-A helper macro `NAN_SETTER(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on [Accessors](https://developers.google.com/v8/embed#accesssors).
-
-<a name="api_nan_property_getter"></a>
-### Property getter declaration
-
-JavaScript-accessible property getters should be declared with the following signature to form a <b><code>Nan::PropertyGetterCallback</code></b>:
-
-```c++
-typedef void(*PropertyGetterCallback)(v8::Local<v8::String>,
-                                      const PropertyCallbackInfo<v8::Value>&);
-```
-
-Example:
-
-```c++
-void PropertyGetterName(v8::Local<v8::String> property,
-                        const Nan::PropertyCallbackInfo<v8::Value>& info) {
-  ...
-}
-```
-
-You do not need to declare a new `HandleScope` within a property getter as one is implicitly created for you.
-
-A helper macro `NAN_PROPERTY_GETTER(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).
-
-<a name="api_nan_property_setter"></a>
-### Property setter declaration
-
-JavaScript-accessible property setters should be declared with the following signature to form a <b><code>Nan::PropertySetterCallback</code></b>:
-
-```c++
-typedef void(*PropertySetterCallback)(v8::Local<v8::String>,
-                                      v8::Local<v8::Value>,
-                                      const PropertyCallbackInfo<v8::Value>&);
-```
-
-Example:
-
-```c++
-void PropertySetterName(v8::Local<v8::String> property,
-                        v8::Local<v8::Value> value,
-                        const Nan::PropertyCallbackInfo<v8::Value>& info);
-```
-
-You do not need to declare a new `HandleScope` within a property setter as one is implicitly created for you.
-
-A helper macro `NAN_PROPERTY_SETTER(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).
-
-<a name="api_nan_property_enumerator"></a>
-### Property enumerator declaration
-
-JavaScript-accessible property enumerators should be declared with the following signature to form a <b><code>Nan::PropertyEnumeratorCallback</code></b>:
-
-```c++
-typedef void(*PropertyEnumeratorCallback)(const PropertyCallbackInfo<v8::Array>&);
-```
-
-Example:
-
-```c++
-void PropertyEnumeratorName(const Nan::PropertyCallbackInfo<v8::Array>& info);
-```
-
-You do not need to declare a new `HandleScope` within a property enumerator as one is implicitly created for you.
-
-A helper macro `NAN_PROPERTY_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).
-
-<a name="api_nan_property_deleter"></a>
-### Property deleter declaration
-
-JavaScript-accessible property deleters should be declared with the following signature to form a <b><code>Nan::PropertyDeleterCallback</code></b>:
-
-```c++
-typedef void(*PropertyDeleterCallback)(v8::Local<v8::String>,
-                                       const PropertyCallbackInfo<v8::Boolean>&);
-```
-
-Example:
-
-```c++
-void PropertyDeleterName(v8::Local<v8::String> property,
-                         const Nan::PropertyCallbackInfo<v8::Boolean>& info);
-```
-
-You do not need to declare a new `HandleScope` within a property deleter as one is implicitly created for you.
-
-A helper macro `NAN_PROPERTY_DELETER(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).
-
-<a name="api_nan_property_query"></a>
-### Property query declaration
-
-JavaScript-accessible property query methods should be declared with the following signature to form a <b><code>Nan::PropertyQueryCallback</code></b>:
-
-```c++
-typedef void(*PropertyQueryCallback)(v8::Local<v8::String>,
-                                     const PropertyCallbackInfo<v8::Integer>&);
-```
-
-Example:
-
-```c++
-void PropertyQueryName(v8::Local<v8::String> property,
-                       const Nan::PropertyCallbackInfo<v8::Integer>& info);
-```
-
-You do not need to declare a new `HandleScope` within a property query method as one is implicitly created for you.
-
-A helper macro `NAN_PROPERTY_QUERY(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on named property [Interceptors](https://developers.google.com/v8/embed#interceptors).
-
-<a name="api_nan_index_getter"></a>
-### Index getter declaration
-
-JavaScript-accessible index getter methods should be declared with the following signature to form a <b><code>Nan::IndexGetterCallback</code></b>:
-
-```c++
-typedef void(*IndexGetterCallback)(uint32_t,
-                                   const PropertyCallbackInfo<v8::Value>&);
-```
-
-Example:
-
-```c++
-void IndexGetterName(uint32_t index, const PropertyCallbackInfo<v8::Value>& info);
-```
-
-You do not need to declare a new `HandleScope` within a index getter as one is implicitly created for you.
-
-A helper macro `NAN_INDEX_GETTER(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).
-
-<a name="api_nan_index_setter"></a>
-### Index setter declaration
-
-JavaScript-accessible index setter methods should be declared with the following signature to form a <b><code>Nan::IndexSetterCallback</code></b>:
-
-```c++
-typedef void(*IndexSetterCallback)(uint32_t,
-                                   v8::Local<v8::Value>,
-                                   const PropertyCallbackInfo<v8::Value>&);
-```
-
-Example:
-
-```c++
-void IndexSetterName(uint32_t index,
-                     v8::Local<v8::Value> value,
-                     const PropertyCallbackInfo<v8::Value>& info);
-```
-
-You do not need to declare a new `HandleScope` within a index setter as one is implicitly created for you.
-
-A helper macro `NAN_INDEX_SETTER(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).
-
-<a name="api_nan_index_enumerator"></a>
-### Index enumerator declaration
-
-JavaScript-accessible index enumerator methods should be declared with the following signature to form a <b><code>Nan::IndexEnumeratorCallback</code></b>:
-
-```c++
-typedef void(*IndexEnumeratorCallback)(const PropertyCallbackInfo<v8::Array>&);
-```
-
-Example:
-
-```c++
-void IndexEnumeratorName(const PropertyCallbackInfo<v8::Array>& info);
-```
-
-You do not need to declare a new `HandleScope` within a index enumerator as one is implicitly created for you.
-
-A helper macro `NAN_INDEX_ENUMERATOR(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).
-
-<a name="api_nan_index_deleter"></a>
-### Index deleter declaration
-
-JavaScript-accessible index deleter methods should be declared with the following signature to form a <b><code>Nan::IndexDeleterCallback</code></b>:
-
-```c++
-typedef void(*IndexDeleterCallback)(uint32_t,
-                                    const PropertyCallbackInfo<v8::Boolean>&);
-```
-
-Example:
-
-```c++
-void IndexDeleterName(uint32_t index, const PropertyCallbackInfo<v8::Boolean>& info);
-```
-
-You do not need to declare a new `HandleScope` within a index deleter as one is implicitly created for you.
-
-A helper macro `NAN_INDEX_DELETER(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).
-
-<a name="api_nan_index_query"></a>
-### Index query declaration
-
-JavaScript-accessible index query methods should be declared with the following signature to form a <b><code>Nan::IndexQueryCallback</code></b>:
-
-```c++
-typedef void(*IndexQueryCallback)(uint32_t,
-                                  const PropertyCallbackInfo<v8::Integer>&);
-```
-
-Example:
-
-```c++
-void IndexQueryName(uint32_t index, const PropertyCallbackInfo<v8::Integer>& info);
-```
-
-You do not need to declare a new `HandleScope` within a index query method as one is implicitly created for you.
-
-A helper macro `NAN_INDEX_QUERY(methodname)` exists, compatible with NAN v1 method declarations.
-
-Also see the V8 Embedders Guide documentation on indexed property [Interceptors](https://developers.google.com/v8/embed#interceptors).
-
-<a name="api_nan_set_method"></a>
-### Nan::SetMethod()
-
-Sets a method with a given name directly on a JavaScript object where the method has the `Nan::FunctionCallback` signature (see <a href="#api_nan_method">Method declaration</a>).
-
-Signature:
-
-```c++
-void Nan::SetMethod(v8::Local<v8::Object> recv,
-                    const char *name,
-                    Nan::FunctionCallback callback)
-void Nan::SetMethod(v8::Local<v8::Template> templ,
-                    const char *name,
-                    Nan::FunctionCallback callback)
-```
-
-<a name="api_nan_set_prototype_method"></a>
-### Nan::SetPrototypeMethod()
-
-Sets a method with a given name on a `FunctionTemplate`'s prototype where the method has the `Nan::FunctionCallback` signature (see <a href="#api_nan_method">Method declaration</a>).
-
-Signature:
-
-```c++
-void Nan::SetPrototypeMethod(v8::Local<v8::FunctionTemplate> recv,
-                             const char* name,
-                             Nan::FunctionCallback callback)
-```
-
-<a name="api_nan_set_accessor"></a>
-### Nan::SetAccessor()
-
-Sets getters and setters for a property with a given name on an `ObjectTemplate` or a plain `Object`. Accepts getters with the `Nan::GetterCallback` signature (see <a href="#api_nan_getter">Getter declaration</a>) and setters with the `Nan::SetterCallback` signature (see <a href="#api_nan_setter">Setter declaration</a>).
-
-Signature:
-
-```c++
-void SetAccessor(v8::Local<v8::ObjectTemplate> tpl,
-                 v8::Local<v8::String> name,
-                 Nan::GetterCallback getter,
-                 Nan::SetterCallback setter = 0,
-                 v8::Local<v8::Value> data = v8::Local<v8::Value>(),
-                 v8::AccessControl settings = v8::DEFAULT,
-                 v8::PropertyAttribute attribute = v8::None,
-                 imp::Sig signature = imp::Sig());
-bool SetAccessor(v8::Local<v8::Object> obj,
-                 v8::Local<v8::String> name,
-                 Nan::GetterCallback getter,
-                 Nan::SetterCallback setter = 0,
-                 v8::Local<v8::Value> data = v8::Local<v8::Value>(),
-                 v8::AccessControl settings = v8::DEFAULT,
-                 v8::PropertyAttribute attribute = v8::None)
-```
-
-See the V8 [`ObjectTemplate#SetAccessor()`](https://v8docs.nodesource.com/io.js-3.0/db/d5f/classv8_1_1_object_template.html#aa90691622f01269c6a11391d372ca0c5) and [`Object#SetAccessor()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#a3f9dee085f5ec346465f1dc924325043) for further information about how to use `Nan::SetAccessor()`.
-
-<a name="api_nan_set_named_property_handler"></a>
-### Nan::SetNamedPropertyHandler()
-
-Sets named property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts:
-
-* Property getters with the `Nan::PropertyGetterCallback` signature (see <a href="#api_nan_property_getter">Property getter declaration</a>)
-* Property setters with the `Nan::PropertySetterCallback` signature (see <a href="#api_nan_property_setter">Property setter declaration</a>)
-* Property query methods with the `Nan::PropertyQueryCallback` signature (see <a href="#api_nan_property_query">Property query declaration</a>)
-* Property deleters with the `Nan::PropertyDeleterCallback` signature (see <a href="#api_nan_property_deleter">Property deleter declaration</a>)
-* Property enumerators with the `Nan::PropertyEnumeratorCallback` signature (see <a href="#api_nan_property_enumerator">Property enumerator declaration</a>)
-
-Signature:
-
-```c++
-void SetNamedPropertyHandler(v8::Local<v8::ObjectTemplate> tpl,
-                             Nan::PropertyGetterCallback getter,
-                             Nan::PropertySetterCallback setter = 0,
-                             Nan::PropertyQueryCallback query = 0,
-                             Nan::PropertyDeleterCallback deleter = 0,
-                             Nan::PropertyEnumeratorCallback enumerator = 0,
-                             v8::Local<v8::Value> data = v8::Local<v8::Value>())
-```
-
-See the V8 [`ObjectTemplate#SetNamedPropertyHandler()`](https://v8docs.nodesource.com/io.js-3.0/db/d5f/classv8_1_1_object_template.html#a34d1cc45b642cd131706663801aadd76) for further information about how to use `Nan::SetNamedPropertyHandler()`.
-
-<a name="api_nan_set_indexed_property_handler"></a>
-### Nan::SetIndexedPropertyHandler()
-
-Sets indexed property getters, setters, query, deleter and enumerator methods on an `ObjectTemplate`. Accepts:
-
-* Indexed property getters with the `Nan::IndexGetterCallback` signature (see <a href="#api_nan_index_getter">Index getter declaration</a>)
-* Indexed property setters with the `Nan::IndexSetterCallback` signature (see <a href="#api_nan_index_setter">Index setter declaration</a>)
-* Indexed property query methods with the `Nan::IndexQueryCallback` signature (see <a href="#api_nan_index_query">Index query declaration</a>)
-* Indexed property deleters with the `Nan::IndexDeleterCallback` signature (see <a href="#api_nan_index_deleter">Index deleter declaration</a>)
-* Indexed property enumerators with the `Nan::IndexEnumeratorCallback` signature (see <a href="#api_nan_index_enumerator">Index enumerator declaration</a>)
-
-Signature:
-
-```c++
-void SetIndexedPropertyHandler(v8::Local<v8::ObjectTemplate> tpl,
-                               Nan::IndexGetterCallback getter,
-                               Nan::IndexSetterCallback setter = 0,
-                               Nan::IndexQueryCallback query = 0,
-                               Nan::IndexDeleterCallback deleter = 0,
-                               Nan::IndexEnumeratorCallback enumerator = 0,
-                               v8::Local<v8::Value> data = v8::Local<v8::Value>())
-```
-
-See the V8 [`ObjectTemplate#SetIndexedPropertyHandler()`](https://v8docs.nodesource.com/io.js-3.0/db/d5f/classv8_1_1_object_template.html#ac0234cbede45d51778bb5f6a32a9e125) for further information about how to use `Nan::SetIndexedPropertyHandler()`.
-
-<a name="api_nan_set_template"></a>
-### Nan::SetTemplate()
-
-Adds properties on an `Object`'s or `Function`'s template.
-
-Signature:
-
-```c++
-void Nan::SetTemplate(v8::Local<v8::Template> templ,
-                      const char *name,
-                      v8::Local<v8::Data> value);
-void Nan::SetTemplate(v8::Local<v8::Template> templ,
-                      v8::Local<v8::String> name,
-                      v8::Local<v8::Data> value,
-                      v8::PropertyAttribute attributes)
-```
-
-Calls the `Template`'s [`Set()`](https://v8docs.nodesource.com/io.js-3.0/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf).
-
-<a name="api_nan_set_prototype_template"></a>
-### Nan::SetPrototypeTemplate()
-
-Adds properties on an `Object`'s or `Function`'s prototype template.
-
-Signature:
-
-```c++
-void Nan::SetPrototypeTemplate(v8::Local<v8::FunctionTemplate> templ,
-                               const char *name,
-                               v8::Local<v8::Data> value);
-void Nan::SetPrototypeTemplate(v8::Local<v8::FunctionTemplate> templ,
-                               v8::Local<v8::String> name,
-                               v8::Local<v8::Data> value,
-                               v8::PropertyAttribute attributes)
-```
-
-Calls the `FunctionTemplate`'s _PrototypeTemplate's_ [`Set()`](https://v8docs.nodesource.com/io.js-3.0/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf).
-
-<a name="api_nan_set_instance_template"></a>
-### Nan::SetInstanceTemplate()
-
-Use to add instance properties on `FunctionTemplate`'s.
-
-Signature:
-
-```c++
-void Nan::SetInstanceTemplate(v8::Local<v8::FunctionTemplate> templ,
-                              const char *name,
-                              v8::Local<v8::Data> value);
-void Nan::SetInstanceTemplate(v8::Local<v8::FunctionTemplate> templ,
-                              v8::Local<v8::String> name,
-                              v8::Local<v8::Data> value,
-                              v8::PropertyAttribute attributes)
-```
-
-Calls the `FunctionTemplate`'s _InstanceTemplate's_ [`Set()`](https://v8docs.nodesource.com/io.js-3.0/db/df7/classv8_1_1_template.html#a2db6a56597bf23c59659c0659e564ddf).
-
-<a name="api_nan_set_call_handler"></a>
-### Nan::SetCallHandler()
-
-Set the call-handler callback for a `v8::FunctionTemplate`.
-This callback is called whenever the function created from this FunctionTemplate is called.
-
-Signature:
-
-```c++
-void Nan::SetCallHandler(v8::Local<v8::FunctionTemplate> templ, Nan::FunctionCallback callback, v8::Local<v8::Value> data = v8::Local<v8::Value>())
-```
-
-Calls the `FunctionTemplate`'s [`SetCallHandler()`](https://v8docs.nodesource.com/io.js-3.0/d8/d83/classv8_1_1_function_template.html#a26cf14e36aa1a47091b98536d08ea821).
-
-<a name="api_nan_set_call_as_function_handler"></a>
-### Nan::SetCallAsFunctionHandler()
-
-Sets the callback to be used when calling instances created from the `v8::ObjectTemplate` as a function.
-If no callback is set, instances behave like normal JavaScript objects that cannot be called as a function.
-
-Signature:
-
-```c++
-void Nan::SetCallAsFunctionHandler(v8::Local<v8::ObjectTemplate> templ, Nan::FunctionCallback callback, v8::Local<v8::Value> data = v8::Local<v8::Value>())
-```
-
-Calls the `ObjectTemplate`'s [`SetCallAsFunctionHandler()`](https://v8docs.nodesource.com/io.js-3.0/db/d5f/classv8_1_1_object_template.html#ae0a0e72fb0c5e5f32e255fe5bcc7316a).
-
diff --git a/js/node_modules/nan/doc/new.md b/js/node_modules/nan/doc/new.md
deleted file mode 100644
index c0734bd7350587222a2bd307c87ad2d78fc9b050..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/new.md
+++ /dev/null
@@ -1,147 +0,0 @@
-## New
-
-NAN provides a `Nan::New()` helper for the creation of new JavaScript objects in a way that's compatible across the supported versions of V8.
-
- - <a href="#api_nan_new"><b><code>Nan::New()</code></b></a>
- - <a href="#api_nan_undefined"><b><code>Nan::Undefined()</code></b></a>
- - <a href="#api_nan_null"><b><code>Nan::Null()</code></b></a>
- - <a href="#api_nan_true"><b><code>Nan::True()</code></b></a>
- - <a href="#api_nan_false"><b><code>Nan::False()</code></b></a>
- - <a href="#api_nan_empty_string"><b><code>Nan::EmptyString()</code></b></a>
-
-
-<a name="api_nan_new"></a>
-### Nan::New()
-
-`Nan::New()` should be used to instantiate new JavaScript objects.
-
-Refer to the specific V8 type in the [V8 documentation](https://v8docs.nodesource.com/io.js-3.0/d1/d83/classv8_1_1_data.html) for information on the types of arguments required for instantiation.
-
-Signatures:
-
-Return types are mostly omitted from the signatures for simplicity. In most cases the type will be contained within a `v8::Local<T>`. The following types will be contained within a `Nan::MaybeLocal<T>`: `v8::String`, `v8::Date`, `v8::RegExp`, `v8::Script`, `v8::UnboundScript`.
-
-Empty objects:
-
-```c++
-Nan::New<T>();
-```
-
-Generic single and multiple-argument:
-
-```c++
-Nan::New<T>(A0 arg0);
-Nan::New<T>(A0 arg0, A1 arg1);
-Nan::New<T>(A0 arg0, A1 arg1, A2 arg2);
-Nan::New<T>(A0 arg0, A1 arg1, A2 arg2, A3 arg3);
-```
-
-For creating `v8::FunctionTemplate` and `v8::Function` objects:
-
-_The definition of `Nan::FunctionCallback` can be found in the [Method declaration](./methods.md#api_nan_method) documentation._
-
-```c++
-Nan::New<T>(Nan::FunctionCallback callback,
-            v8::Local<v8::Value> data = v8::Local<v8::Value>());
-Nan::New<T>(Nan::FunctionCallback callback,
-            v8::Local<v8::Value> data = v8::Local<v8::Value>(),
-            A2 a2 = A2());
-```
-
-Native number types:
-
-```c++
-v8::Local<v8::Boolean> Nan::New<T>(bool value);
-v8::Local<v8::Int32> Nan::New<T>(int32_t value);
-v8::Local<v8::Uint32> Nan::New<T>(uint32_t value);
-v8::Local<v8::Number> Nan::New<T>(double value);
-```
-
-String types:
-
-```c++
-Nan::MaybeLocal<v8::String> Nan::New<T>(std::string const& value);
-Nan::MaybeLocal<v8::String> Nan::New<T>(const char * value, int length);
-Nan::MaybeLocal<v8::String> Nan::New<T>(const char * value);
-Nan::MaybeLocal<v8::String> Nan::New<T>(const uint16_t * value);
-Nan::MaybeLocal<v8::String> Nan::New<T>(const uint16_t * value, int length);
-```
-
-Specialized types:
-
-```c++
-v8::Local<v8::String> Nan::New<T>(v8::String::ExternalStringResource * value);
-v8::Local<v8::String> Nan::New<T>(Nan::ExternalOneByteStringResource * value);
-v8::Local<v8::RegExp> Nan::New<T>(v8::Local<v8::String> pattern, v8::RegExp::Flags flags);
-```
-
-Note that `Nan::ExternalOneByteStringResource` maps to [`v8::String::ExternalOneByteStringResource`](https://v8docs.nodesource.com/io.js-3.0/d9/db3/classv8_1_1_string_1_1_external_one_byte_string_resource.html), and `v8::String::ExternalAsciiStringResource` in older versions of V8.
-
-
-<a name="api_nan_undefined"></a>
-### Nan::Undefined()
-
-A helper method to reference the `v8::Undefined` object in a way that is compatible across all supported versions of V8.
-
-Signature:
-
-```c++
-v8::Local<v8::Primitive> Nan::Undefined()
-```
-
-<a name="api_nan_null"></a>
-### Nan::Null()
-
-A helper method to reference the `v8::Null` object in a way that is compatible across all supported versions of V8.
-
-Signature:
-
-```c++
-v8::Local<v8::Primitive> Nan::Null()
-```
-
-<a name="api_nan_true"></a>
-### Nan::True()
-
-A helper method to reference the `v8::Boolean` object representing the `true` value in a way that is compatible across all supported versions of V8.
-
-Signature:
-
-```c++
-v8::Local<v8::Boolean> Nan::True()
-```
-
-<a name="api_nan_false"></a>
-### Nan::False()
-
-A helper method to reference the `v8::Boolean` object representing the `false` value in a way that is compatible across all supported versions of V8.
-
-Signature:
-
-```c++
-v8::Local<v8::Boolean> Nan::False()
-```
-
-<a name="api_nan_empty_string"></a>
-### Nan::EmptyString()
-
-Call [`v8::String::Empty`](https://v8docs.nodesource.com/io.js-3.0/d2/db3/classv8_1_1_string.html#a7c1bc8886115d7ee46f1d571dd6ebc6d) to reference the empty string in a way that is compatible across all supported versions of V8.
-
-Signature:
-
-```c++
-v8::Local<v8::String> Nan::EmptyString()
-```
-
-
-<a name="api_nan_new_one_byte_string"></a>
-### Nan::NewOneByteString()
-
-An implementation of [`v8::String::NewFromOneByte()`](https://v8docs.nodesource.com/io.js-3.0/d2/db3/classv8_1_1_string.html#a5264d50b96d2c896ce525a734dc10f09) provided for consistent availability and API across supported versions of V8. Allocates a new string from Latin-1 data.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::String> Nan::NewOneByteString(const uint8_t * value,
-                                                  int length = -1)
-```
diff --git a/js/node_modules/nan/doc/node_misc.md b/js/node_modules/nan/doc/node_misc.md
deleted file mode 100644
index 8aa080f52c00271e2a837bb225663c0df6250884..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/node_misc.md
+++ /dev/null
@@ -1,63 +0,0 @@
-## Miscellaneous Node Helpers
-
- - <a href="#api_nan_make_callback"><b><code>Nan::MakeCallback()</code></b></a>
- - <a href="#api_nan_module_init"><b><code>NAN_MODULE_INIT()</code></b></a>
- - <a href="#api_nan_export"><b><code>Nan::Export()</code></b></a>
-
-
-<a name="api_nan_make_callback"></a>
-### Nan::MakeCallback()
-
-Wrappers around `node::MakeCallback()` providing a consistent API across all supported versions of Node.
-
-Use `MakeCallback()` rather than using `v8::Function#Call()` directly in order to properly process internal Node functionality including domains, async hooks, the microtask queue, and other debugging functionality.
-
-Signatures:
-
-```c++
-v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object> target,
-                                       v8::Local<v8::Function> func,
-                                       int argc,
-                                       v8::Local<v8::Value>* argv);
-v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object> target,
-                                       v8::Local<v8::String> symbol,
-                                       int argc,
-                                       v8::Local<v8::Value>* argv);
-v8::Local<v8::Value> Nan::MakeCallback(v8::Local<v8::Object> target,
-                                       const char* method,
-                                       int argc,
-                                       v8::Local<v8::Value>* argv);
-```
-
-
-<a name="api_nan_module_init"></a>
-### NAN_MODULE_INIT()
-
-Used to define the entry point function to a Node add-on. Creates a function with a given `name` that receives a `target` object representing the equivalent of the JavaScript `exports` object.
-
-See example below.
-
-<a name="api_nan_export"></a>
-### Nan::Export()
-
-A simple helper to register a `v8::FunctionTemplate` from a JavaScript-accessible method (see [Methods](./methods.md)) as a property on an object. Can be used in a way similar to assigning properties to `module.exports` in JavaScript.
-
-Signature:
-
-```c++
-void Export(v8::Local<v8::Object> target, const char *name, Nan::FunctionCallback f)
-```
-
-Also available as the shortcut `NAN_EXPORT` macro.
-
-Example:
-
-```c++
-NAN_METHOD(Foo) {
-  ...
-}
-
-NAN_MODULE_INIT(Init) {
-  NAN_EXPORT(target, Foo);
-}
-```
diff --git a/js/node_modules/nan/doc/object_wrappers.md b/js/node_modules/nan/doc/object_wrappers.md
deleted file mode 100644
index 27b0636ba577471b8e8f1b63736a496f2dc4b7c1..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/object_wrappers.md
+++ /dev/null
@@ -1,263 +0,0 @@
-## Object Wrappers
-
-The `ObjectWrap` class can be used to make wrapped C++ objects and a factory of wrapped objects.
-
- - <a href="#api_nan_object_wrap"><b><code>Nan::ObjectWrap</code></b></a>
-
-
-<a name="api_nan_object_wrap"></a>
-### Nan::ObjectWrap()
-
-A reimplementation of `node::ObjectWrap` that adds some API not present in older versions of Node. Should be preferred over `node::ObjectWrap` in all cases for consistency.
-
-Definition:
-
-```c++
-class ObjectWrap {
- public:
-  ObjectWrap();
-
-  virtual ~ObjectWrap();
-
-  template <class T>
-  static inline T* Unwrap(v8::Local<v8::Object> handle);
-
-  inline v8::Local<v8::Object> handle();
-
-  inline Nan::Persistent<v8::Object>& persistent();
-
- protected:
-  inline void Wrap(v8::Local<v8::Object> handle);
-
-  inline void MakeWeak();
-
-  /* Ref() marks the object as being attached to an event loop.
-   * Refed objects will not be garbage collected, even if
-   * all references are lost.
-   */
-  virtual void Ref();
-
-  /* Unref() marks an object as detached from the event loop.  This is its
-   * default state.  When an object with a "weak" reference changes from
-   * attached to detached state it will be freed. Be careful not to access
-   * the object after making this call as it might be gone!
-   * (A "weak reference" means an object that only has a
-   * persistant handle.)
-   *
-   * DO NOT CALL THIS FROM DESTRUCTOR
-   */
-  virtual void Unref();
-
-  int refs_;  // ro
-};
-```
-
-See the Node documentation on [Wrapping C++ Objects](https://nodejs.org/api/addons.html#addons_wrapping_c_objects) for more details.
-
-### This vs. Holder
-
-When calling `Unwrap`, it is important that the argument is indeed some JavaScript object which got wrapped by a `Wrap` call for this class or any derived class.
-The `Signature` installed by [`Nan::SetPrototypeMethod()`](methods.md#api_nan_set_prototype_method) does ensure that `info.Holder()` is just such an instance.
-In Node 0.12 and later, `info.This()` will also be of such a type, since otherwise the invocation will get rejected.
-However, in Node 0.10 and before it was possible to invoke a method on a JavaScript object which just had the extension type in its prototype chain.
-In such a situation, calling `Unwrap` on `info.This()` will likely lead to a failed assertion causing a crash, but could lead to even more serious corruption.
-
-On the other hand, calling `Unwrap` in an [accessor](methods.md#api_nan_set_accessor) should not use `Holder()` if the accessor is defined on the prototype.
-So either define your accessors on the instance template,
-or use `This()` after verifying that it is indeed a valid object.
-
-### Examples
-
-#### Basic
-
-```c++
-class MyObject : public Nan::ObjectWrap {
- public:
-  static NAN_MODULE_INIT(Init) {
-    v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
-    tpl->SetClassName(Nan::New("MyObject").ToLocalChecked());
-    tpl->InstanceTemplate()->SetInternalFieldCount(1);
-
-    SetPrototypeMethod(tpl, "getHandle", GetHandle);
-    SetPrototypeMethod(tpl, "getValue", GetValue);
-
-    constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked());
-    Nan::Set(target, Nan::New("MyObject").ToLocalChecked(),
-      Nan::GetFunction(tpl).ToLocalChecked());
-  }
-
- private:
-  explicit MyObject(double value = 0) : value_(value) {}
-  ~MyObject() {}
-
-  static NAN_METHOD(New) {
-    if (info.IsConstructCall()) {
-      double value = info[0]->IsUndefined() ? 0 : Nan::To<double>(info[0]).FromJust();
-      MyObject *obj = new MyObject(value);
-      obj->Wrap(info.This());
-      info.GetReturnValue().Set(info.This());
-    } else {
-      const int argc = 1;
-      v8::Local<v8::Value> argv[argc] = {info[0]};
-      v8::Local<v8::Function> cons = Nan::New(constructor());
-      info.GetReturnValue().Set(cons->NewInstance(argc, argv));
-    }
-  }
-
-  static NAN_METHOD(GetHandle) {
-    MyObject* obj = Nan::ObjectWrap::Unwrap<MyObject>(info.Holder());
-    info.GetReturnValue().Set(obj->handle());
-  }
-
-  static NAN_METHOD(GetValue) {
-    MyObject* obj = Nan::ObjectWrap::Unwrap<MyObject>(info.Holder());
-    info.GetReturnValue().Set(obj->value_);
-  }
-
-  static inline Nan::Persistent<v8::Function> & constructor() {
-    static Nan::Persistent<v8::Function> my_constructor;
-    return my_constructor;
-  }
-
-  double value_;
-};
-
-NODE_MODULE(objectwrapper, MyObject::Init)
-```
-
-To use in Javascript:
-
-```Javascript
-var objectwrapper = require('bindings')('objectwrapper');
-
-var obj = new objectwrapper.MyObject(5);
-console.log('Should be 5: ' + obj.getValue());
-```
-
-#### Factory of wrapped objects
-
-```c++
-class MyFactoryObject : public Nan::ObjectWrap {
- public:
-  static NAN_MODULE_INIT(Init) {
-    v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
-    tpl->InstanceTemplate()->SetInternalFieldCount(1);
-
-    Nan::SetPrototypeMethod(tpl, "getValue", GetValue);
-
-    constructor().Reset(Nan::GetFunction(tpl).ToLocalChecked());
-  }
-
-  static NAN_METHOD(NewInstance) {
-    v8::Local<v8::Function> cons = Nan::New(constructor());
-    double value = info[0]->IsNumber() ? Nan::To<double>(info[0]).FromJust() : 0;
-    const int argc = 1;
-    v8::Local<v8::Value> argv[1] = {Nan::New(value)};
-    info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked());
-  }
-
-  // Needed for the next example:
-  inline double value() const {
-    return value_;
-  }
-
- private:
-  explicit MyFactoryObject(double value = 0) : value_(value) {}
-  ~MyFactoryObject() {}
-
-  static NAN_METHOD(New) {
-    if (info.IsConstructCall()) {
-      double value = info[0]->IsNumber() ? Nan::To<double>(info[0]).FromJust() : 0;
-      MyFactoryObject * obj = new MyFactoryObject(value);
-      obj->Wrap(info.This());
-      info.GetReturnValue().Set(info.This());
-    } else {
-      const int argc = 1;
-      v8::Local<v8::Value> argv[argc] = {info[0]};
-      v8::Local<v8::Function> cons = Nan::New(constructor());
-      info.GetReturnValue().Set(Nan::NewInstance(cons, argc, argv).ToLocalChecked());
-    }
-  }
-
-  static NAN_METHOD(GetValue) {
-    MyFactoryObject* obj = ObjectWrap::Unwrap<MyFactoryObject>(info.Holder());
-    info.GetReturnValue().Set(obj->value_);
-  }
-
-  static inline Nan::Persistent<v8::Function> & constructor() {
-    static Nan::Persistent<v8::Function> my_constructor;
-    return my_constructor;
-  }
-
-  double value_;
-};
-
-NAN_MODULE_INIT(Init) {
-  MyFactoryObject::Init(target);
-  Nan::Set(target,
-    Nan::New<v8::String>("newFactoryObjectInstance").ToLocalChecked(),
-    Nan::GetFunction(
-      Nan::New<v8::FunctionTemplate>(MyFactoryObject::NewInstance)).ToLocalChecked()
-  );
-}
-
-NODE_MODULE(wrappedobjectfactory, Init)
-```
-
-To use in Javascript:
-
-```Javascript
-var wrappedobjectfactory = require('bindings')('wrappedobjectfactory');
-
-var obj = wrappedobjectfactory.newFactoryObjectInstance(10);
-console.log('Should be 10: ' + obj.getValue());
-```
-
-#### Passing wrapped objects around
-
-Use the `MyFactoryObject` class above along with the following:
-
-```c++
-static NAN_METHOD(Sum) {
-  Nan::MaybeLocal<v8::Object> maybe1 = Nan::To<v8::Object>(info[0]);
-  Nan::MaybeLocal<v8::Object> maybe2 = Nan::To<v8::Object>(info[1]);
-
-  // Quick check:
-  if (maybe1.IsEmpty() || maybe2.IsEmpty()) {
-    // return value is undefined by default
-    return;
-  }
-
-  MyFactoryObject* obj1 =
-    Nan::ObjectWrap::Unwrap<MyFactoryObject>(maybe1.ToLocalChecked());
-  MyFactoryObject* obj2 =
-    Nan::ObjectWrap::Unwrap<MyFactoryObject>(maybe2.ToLocalChecked());
-
-  info.GetReturnValue().Set(Nan::New<v8::Number>(obj1->value() + obj2->value()));
-}
-
-NAN_MODULE_INIT(Init) {
-  MyFactoryObject::Init(target);
-  Nan::Set(target,
-    Nan::New<v8::String>("newFactoryObjectInstance").ToLocalChecked(),
-    Nan::GetFunction(
-      Nan::New<v8::FunctionTemplate>(MyFactoryObject::NewInstance)).ToLocalChecked()
-  );
-  Nan::Set(target,
-    Nan::New<v8::String>("sum").ToLocalChecked(),
-    Nan::GetFunction(Nan::New<v8::FunctionTemplate>(Sum)).ToLocalChecked()
-  );
-}
-
-NODE_MODULE(myaddon, Init)
-```
-
-To use in Javascript:
-
-```Javascript
-var myaddon = require('bindings')('myaddon');
-
-var obj1 = myaddon.newFactoryObjectInstance(5);
-var obj2 = myaddon.newFactoryObjectInstance(10);
-console.log('sum of object values: ' + myaddon.sum(obj1, obj2));
-```
diff --git a/js/node_modules/nan/doc/persistent.md b/js/node_modules/nan/doc/persistent.md
deleted file mode 100644
index 743b44a4c1a6921d69731250e12be2cbf31a27d9..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/persistent.md
+++ /dev/null
@@ -1,295 +0,0 @@
-## Persistent references
-
-An object reference that is independent of any `HandleScope` is a _persistent_ reference. Where a `Local` handle only lives as long as the `HandleScope` in which it was allocated, a `Persistent` handle remains valid until it is explicitly disposed.
-
-Due to the evolution of the V8 API, it is necessary for NAN to provide a wrapper implementation of the `Persistent` classes to supply compatibility across the V8 versions supported.
-
- - <a href="#api_nan_persistent_base"><b><code>Nan::PersistentBase & v8::PersistentBase</code></b></a>
- - <a href="#api_nan_non_copyable_persistent_traits"><b><code>Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits</code></b></a>
- - <a href="#api_nan_copyable_persistent_traits"><b><code>Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits</code></b></a>
- - <a href="#api_nan_persistent"><b><code>Nan::Persistent</code></b></a>
- - <a href="#api_nan_global"><b><code>Nan::Global</code></b></a>
- - <a href="#api_nan_weak_callback_info"><b><code>Nan::WeakCallbackInfo</code></b></a>
- - <a href="#api_nan_weak_callback_type"><b><code>Nan::WeakCallbackType</code></b></a>
-
-Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles).
-
-<a name="api_nan_persistent_base"></a>
-### Nan::PersistentBase & v8::PersistentBase
-
-A persistent handle contains a reference to a storage cell in V8 which holds an object value and which is updated by the garbage collector whenever the object is moved. A new storage cell can be created using the constructor or `Nan::PersistentBase::Reset()`. Existing handles can be disposed using an argument-less `Nan::PersistentBase::Reset()`.
-
-Definition:
-
-_(note: this is implemented as `Nan::PersistentBase` for older versions of V8 and the native `v8::PersistentBase` is used for newer versions of V8)_
-
-```c++
-template<typename T> class PersistentBase {
- public:
-  /**
-   * If non-empty, destroy the underlying storage cell
-   */
-  void Reset();
-
-  /**
-   * If non-empty, destroy the underlying storage cell and create a new one with
-   * the contents of another if it is also non-empty
-   */
-  template<typename S> void Reset(const v8::Local<S> &other);
-
-  /**
-   * If non-empty, destroy the underlying storage cell and create a new one with
-   * the contents of another if it is also non-empty
-   */
-  template<typename S> void Reset(const PersistentBase<S> &other);
-
-  /**
-   * If non-empty, destroy the underlying storage cell
-   * IsEmpty() will return true after this call.
-   */
-  bool IsEmpty();
-
-  void Empty();
-
-  template<typename S> bool operator==(const PersistentBase<S> &that);
-
-  template<typename S> bool operator==(const v8::Local<S> &that);
-
-  template<typename S> bool operator!=(const PersistentBase<S> &that);
-
-  template<typename S> bool operator!=(const v8::Local<S> &that);
-
-   /**
-   *  Install a finalization callback on this object.
-   *  NOTE: There is no guarantee as to *when* or even *if* the callback is
-   *  invoked. The invocation is performed solely on a best effort basis.
-   *  As always, GC-based finalization should *not* be relied upon for any
-   *  critical form of resource management! At the moment you can either
-   *  specify a parameter for the callback or the location of two internal
-   *  fields in the dying object.
-   */
-  template<typename P>
-  void SetWeak(P *parameter,
-               typename WeakCallbackInfo<P>::Callback callback,
-               WeakCallbackType type);
-
-  void ClearWeak();
-
-  /**
-   * Marks the reference to this object independent. Garbage collector is free
-   * to ignore any object groups containing this object. Weak callback for an
-   * independent handle should not assume that it will be preceded by a global
-   * GC prologue callback or followed by a global GC epilogue callback.
-   */
-  void MarkIndependent() const;
-
-  bool IsIndependent() const;
-
-  /** Checks if the handle holds the only reference to an object. */
-  bool IsNearDeath() const;
-
-  /** Returns true if the handle's reference is weak.  */
-  bool IsWeak() const
-};
-```
-
-See the V8 documentation for [`PersistentBase`](https://v8docs.nodesource.com/io.js-3.0/d4/dca/classv8_1_1_persistent_base.html) for further information.
-
-**Tip:** To get a `v8::Local` reference to the original object back from a `PersistentBase` or `Persistent` object:
-
-```c++
-v8::Local<v8::Object> object = Nan::New(persistent);
-```
-
-<a name="api_nan_non_copyable_persistent_traits"></a>
-### Nan::NonCopyablePersistentTraits & v8::NonCopyablePersistentTraits
-
-Default traits for `Nan::Persistent`. This class does not allow use of the a copy constructor or assignment operator. At present `kResetInDestructor` is not set, but that will change in a future version.
-
-Definition:
-
-_(note: this is implemented as `Nan::NonCopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_
-
-```c++
-template<typename T> class NonCopyablePersistentTraits {
- public:
-  typedef Persistent<T, NonCopyablePersistentTraits<T> > NonCopyablePersistent;
-
-  static const bool kResetInDestructor = false;
-
-  template<typename S, typename M>
-  static void Copy(const Persistent<S, M> &source,
-                   NonCopyablePersistent *dest);
-
-  template<typename O> static void Uncompilable();
-};
-```
-
-See the V8 documentation for [`NonCopyablePersistentTraits`](https://v8docs.nodesource.com/io.js-3.0/de/d73/classv8_1_1_non_copyable_persistent_traits.html) for further information.
-
-<a name="api_nan_copyable_persistent_traits"></a>
-### Nan::CopyablePersistentTraits & v8::CopyablePersistentTraits
-
-A helper class of traits to allow copying and assignment of `Persistent`. This will clone the contents of storage cell, but not any of the flags, etc..
-
-Definition:
-
-_(note: this is implemented as `Nan::CopyablePersistentTraits` for older versions of V8 and the native `v8::NonCopyablePersistentTraits` is used for newer versions of V8)_
-
-```c++
-template<typename T>
-class CopyablePersistentTraits {
- public:
-  typedef Persistent<T, CopyablePersistentTraits<T> > CopyablePersistent;
-
-  static const bool kResetInDestructor = true;
-
-  template<typename S, typename M>
-  static void Copy(const Persistent<S, M> &source,
-                   CopyablePersistent *dest);
-};
-```
-
-See the V8 documentation for [`CopyablePersistentTraits`](https://v8docs.nodesource.com/io.js-3.0/da/d5c/structv8_1_1_copyable_persistent_traits.html) for further information.
-
-<a name="api_nan_persistent"></a>
-### Nan::Persistent
-
-A type of `PersistentBase` which allows copy and assignment. Copy, assignment and destructor behavior is controlled by the traits class `M`.
-
-Definition:
-
-```c++
-template<typename T, typename M = NonCopyablePersistentTraits<T> >
-class Persistent;
-
-template<typename T, typename M> class Persistent : public PersistentBase<T> {
- public:
- /**
-  * A Persistent with no storage cell.
-  */
-  Persistent();
-
-  /**
-   * Construct a Persistent from a v8::Local. When the v8::Local is non-empty, a
-   * new storage cell is created pointing to the same object, and no flags are
-   * set.
-   */
-  template<typename S> Persistent(v8::Local<S> that);
-
-  /**
-   * Construct a Persistent from a Persistent. When the Persistent is non-empty,
-   * a new storage cell is created pointing to the same object, and no flags are
-   * set.
-   */
-  Persistent(const Persistent &that);
-
-  /**
-   * The copy constructors and assignment operator create a Persistent exactly
-   * as the Persistent constructor, but the Copy function from the traits class
-   * is called, allowing the setting of flags based on the copied Persistent.
-   */
-  Persistent &operator=(const Persistent &that);
-
-  template <typename S, typename M2>
-  Persistent &operator=(const Persistent<S, M2> &that);
-
-  /**
-   * The destructor will dispose the Persistent based on the kResetInDestructor
-   * flags in the traits class.  Since not calling dispose can result in a
-   * memory leak, it is recommended to always set this flag.
-   */
-  ~Persistent();
-};
-```
-
-See the V8 documentation for [`Persistent`](https://v8docs.nodesource.com/io.js-3.0/d2/d78/classv8_1_1_persistent.html) for further information.
-
-<a name="api_nan_global"></a>
-### Nan::Global
-
-A type of `PersistentBase` which has move semantics.
-
-```c++
-template<typename T> class Global : public PersistentBase<T> {
- public:
-  /**
-   * A Global with no storage cell.
-   */
-  Global();
-
-  /**
-   * Construct a Global from a v8::Local. When the v8::Local is non-empty, a new
-   * storage cell is created pointing to the same object, and no flags are set.
-   */
-  template<typename S> Global(v8::Local<S> that);
-  /**
-   * Construct a Global from a PersistentBase. When the Persistent is non-empty,
-   * a new storage cell is created pointing to the same object, and no flags are
-   * set.
-   */
-  template<typename S> Global(const PersistentBase<S> &that);
-
-  /**
-   * Pass allows returning globals from functions, etc.
-   */
-  Global Pass();
-};
-```
-
-See the V8 documentation for [`Global`](https://v8docs.nodesource.com/io.js-3.0/d5/d40/classv8_1_1_global.html) for further information.
-
-<a name="api_nan_weak_callback_info"></a>
-### Nan::WeakCallbackInfo
-
-`Nan::WeakCallbackInfo` is used as an argument when setting a persistent reference as weak. You may need to free any external resources attached to the object. It is a mirror of `v8:WeakCallbackInfo` as found in newer versions of V8.
-
-Definition:
-
-```c++
-template<typename T> class WeakCallbackInfo {
- public:
-  typedef void (*Callback)(const WeakCallbackInfo<T>& data);
-
-  v8::Isolate *GetIsolate() const;
-
-  /**
-   * Get the parameter that was associated with the weak handle.
-   */
-  T *GetParameter() const;
-
-  /**
-   * Get pointer from internal field, index can be 0 or 1.
-   */
-  void *GetInternalField(int index) const;
-};
-```
-
-Example usage:
-
-```c++
-void weakCallback(const WeakCallbackInfo<int> &data) {
-  int *parameter = data.GetParameter();
-  delete parameter;
-}
-
-Persistent<v8::Object> obj;
-int *data = new int(0);
-obj.SetWeak(data, callback, WeakCallbackType::kParameter);
-```
-
-See the V8 documentation for [`WeakCallbackInfo`](https://v8docs.nodesource.com/io.js-3.0/d8/d06/classv8_1_1_weak_callback_info.html) for further information.
-
-<a name="api_nan_weak_callback_type"></a>
-### Nan::WeakCallbackType
-
-Represents the type of a weak callback.
-A weak callback of type `kParameter` makes the supplied parameter to `Nan::PersistentBase::SetWeak` available through `WeakCallbackInfo::GetParameter`.
-A weak callback of type `kInternalFields` uses up to two internal fields at indices 0 and 1 on the `Nan::PersistentBase<v8::Object>` being made weak.
-Note that only `v8::Object`s and derivatives can have internal fields.
-
-Definition:
-
-```c++
-enum class WeakCallbackType { kParameter, kInternalFields };
-```
diff --git a/js/node_modules/nan/doc/scopes.md b/js/node_modules/nan/doc/scopes.md
deleted file mode 100644
index e9a35d0fe1cebd2cf1128076880325fd1d0da48a..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/scopes.md
+++ /dev/null
@@ -1,73 +0,0 @@
-## Scopes
-
-A _local handle_ is a pointer to an object. All V8 objects are accessed using handles, they are necessary because of the way the V8 garbage collector works.
-
-A handle scope can be thought of as a container for any number of handles. When you've finished with your handles, instead of deleting each one individually you can simply delete their scope.
-
-The creation of `HandleScope` objects is different across the supported versions of V8. Therefore, NAN provides its own implementations that can be used safely across these.
-
- - <a href="#api_nan_handle_scope"><b><code>Nan::HandleScope</code></b></a>
- - <a href="#api_nan_escapable_handle_scope"><b><code>Nan::EscapableHandleScope</code></b></a>
-
-Also see the V8 Embedders Guide section on [Handles and Garbage Collection](https://developers.google.com/v8/embed#handles).
-
-<a name="api_nan_handle_scope"></a>
-### Nan::HandleScope
-
-A simple wrapper around [`v8::HandleScope`](https://v8docs.nodesource.com/io.js-3.0/d3/d95/classv8_1_1_handle_scope.html).
-
-Definition:
-
-```c++
-class Nan::HandleScope {
- public:
-  Nan::HandleScope();
-  static int NumberOfHandles();
-};
-```
-
-Allocate a new `Nan::HandleScope` whenever you are creating new V8 JavaScript objects. Note that an implicit `HandleScope` is created for you on JavaScript-accessible methods so you do not need to insert one yourself.
-
-Example:
-
-```c++
-// new object is created, it needs a new scope:
-void Pointless() {
-  Nan::HandleScope scope;
-  v8::Local<v8::Object> obj = Nan::New<v8::Object>();
-}
-
-// JavaScript-accessible method already has a HandleScope
-NAN_METHOD(Pointless2) {
-  v8::Local<v8::Object> obj = Nan::New<v8::Object>();
-}
-```
-
-<a name="api_nan_escapable_handle_scope"></a>
-### Nan::EscapableHandleScope
-
-Similar to [`Nan::HandleScope`](#api_nan_handle_scope) but should be used in cases where a function needs to return a V8 JavaScript type that has been created within it.
-
-Definition:
-
-```c++
-class Nan::EscapableHandleScope {
- public:
-  Nan::EscapableHandleScope();
-  static int NumberOfHandles();
-  template<typename T> v8::Local<T> Escape(v8::Local<T> value);
-}
-```
-
-Use `Escape(value)` to return the object.
-
-Example:
-
-```c++
-v8::Local<v8::Object> EmptyObj() {
-  Nan::EscapableHandleScope scope;
-  v8::Local<v8::Object> obj = Nan::New<v8::Object>();
-  return scope.Escape(obj);
-}
-```
-
diff --git a/js/node_modules/nan/doc/script.md b/js/node_modules/nan/doc/script.md
deleted file mode 100644
index 1267b5e7cfb04345e6a22f93d6fe51ec2a0a42d5..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/script.md
+++ /dev/null
@@ -1,38 +0,0 @@
-## Script
-
-NAN provides a `v8::Script` helpers as the API has changed over the supported versions of V8.
-
- - <a href="#api_nan_compile_script"><b><code>Nan::CompileScript()</code></b></a>
- - <a href="#api_nan_run_script"><b><code>Nan::RunScript()</code></b></a>
-
-
-<a name="api_nan_compile_script"></a>
-### Nan::CompileScript()
-
-A wrapper around [`v8::Script::Compile()`](https://v8docs.nodesource.com/io.js-3.0/da/da5/classv8_1_1_script_compiler.html#a93f5072a0db55d881b969e9fc98e564b).
-
-Note that `Nan::BoundScript` is an alias for `v8::Script`.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<Nan::BoundScript> Nan::CompileScript(
-    v8::Local<v8::String> s,
-    const v8::ScriptOrigin& origin);
-Nan::MaybeLocal<Nan::BoundScript> Nan::CompileScript(v8::Local<v8::String> s);
-```
-
-
-<a name="api_nan_run_script"></a>
-### Nan::RunScript()
-
-Calls `script->Run()` or `script->BindToCurrentContext()->Run(Nan::GetCurrentContext())`.
-
-Note that `Nan::BoundScript` is an alias for `v8::Script` and `Nan::UnboundScript` is an alias for `v8::UnboundScript` where available and `v8::Script` on older versions of V8.
-
-Signature:
-
-```c++
-Nan::MaybeLocal<v8::Value> Nan::RunScript(v8::Local<Nan::UnboundScript> script)
-Nan::MaybeLocal<v8::Value> Nan::RunScript(v8::Local<Nan::BoundScript> script) 
-```
diff --git a/js/node_modules/nan/doc/string_bytes.md b/js/node_modules/nan/doc/string_bytes.md
deleted file mode 100644
index 7c1bd3250476b6b16a29ff684a3a7f86de26a7f9..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/string_bytes.md
+++ /dev/null
@@ -1,62 +0,0 @@
-## Strings & Bytes
-
-Miscellaneous string & byte encoding and decoding functionality provided for compatibility across supported versions of V8 and Node. Implemented by NAN to ensure that all encoding types are supported, even for older versions of Node where they are missing.
-
- - <a href="#api_nan_encoding"><b><code>Nan::Encoding</code></b></a>
- - <a href="#api_nan_encode"><b><code>Nan::Encode()</code></b></a>
- - <a href="#api_nan_decode_bytes"><b><code>Nan::DecodeBytes()</code></b></a>
- - <a href="#api_nan_decode_write"><b><code>Nan::DecodeWrite()</code></b></a>
-
-
-<a name="api_nan_encoding"></a>
-### Nan::Encoding
-
-An enum representing the supported encoding types. A copy of `node::encoding` that is consistent across versions of Node.
-
-Definition:
-
-```c++
-enum Nan::Encoding { ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER }
-```
-
-
-<a name="api_nan_encode"></a>
-### Nan::Encode()
-
-A wrapper around `node::Encode()` that provides a consistent implementation across supported versions of Node.
-
-Signature:
-
-```c++
-v8::Local<v8::Value> Nan::Encode(const void *buf,
-                                 size_t len,
-                                 enum Nan::Encoding encoding = BINARY);
-```
-
-
-<a name="api_nan_decode_bytes"></a>
-### Nan::DecodeBytes()
-
-A wrapper around `node::DecodeBytes()` that provides a consistent implementation across supported versions of Node.
-
-Signature:
-
-```c++
-ssize_t Nan::DecodeBytes(v8::Local<v8::Value> val,
-                         enum Nan::Encoding encoding = BINARY);
-```
-
-
-<a name="api_nan_decode_write"></a>
-### Nan::DecodeWrite()
-
-A wrapper around `node::DecodeWrite()` that provides a consistent implementation across supported versions of Node.
-
-Signature:
-
-```c++
-ssize_t Nan::DecodeWrite(char *buf,
-                         size_t len,
-                         v8::Local<v8::Value> val,
-                         enum Nan::Encoding encoding = BINARY);
-```
diff --git a/js/node_modules/nan/doc/v8_internals.md b/js/node_modules/nan/doc/v8_internals.md
deleted file mode 100644
index 8e6319ba545aa6ed09218f88da58e386d978e0f6..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/v8_internals.md
+++ /dev/null
@@ -1,199 +0,0 @@
-## V8 internals
-
-The hooks to access V8 internals—including GC and statistics—are different across the supported versions of V8, therefore NAN provides its own hooks that call the appropriate V8 methods.
-
- - <a href="#api_nan_gc_callback"><b><code>NAN_GC_CALLBACK()</code></b></a>
- - <a href="#api_nan_add_gc_epilogue_callback"><b><code>Nan::AddGCEpilogueCallback()</code></b></a>
- - <a href="#api_nan_remove_gc_epilogue_callback"><b><code>Nan::RemoveGCEpilogueCallback()</code></b></a>
- - <a href="#api_nan_add_gc_prologue_callback"><b><code>Nan::AddGCPrologueCallback()</code></b></a>
- - <a href="#api_nan_remove_gc_prologue_callback"><b><code>Nan::RemoveGCPrologueCallback()</code></b></a>
- - <a href="#api_nan_get_heap_statistics"><b><code>Nan::GetHeapStatistics()</code></b></a>
- - <a href="#api_nan_set_counter_function"><b><code>Nan::SetCounterFunction()</code></b></a>
- - <a href="#api_nan_set_create_histogram_function"><b><code>Nan::SetCreateHistogramFunction()</code></b></a>
- - <a href="#api_nan_set_add_histogram_sample_function"><b><code>Nan::SetAddHistogramSampleFunction()</code></b></a>
- - <a href="#api_nan_idle_notification"><b><code>Nan::IdleNotification()</code></b></a>
- - <a href="#api_nan_low_memory_notification"><b><code>Nan::LowMemoryNotification()</code></b></a>
- - <a href="#api_nan_context_disposed_notification"><b><code>Nan::ContextDisposedNotification()</code></b></a>
- - <a href="#api_nan_get_internal_field_pointer"><b><code>Nan::GetInternalFieldPointer()</code></b></a>
- - <a href="#api_nan_set_internal_field_pointer"><b><code>Nan::SetInternalFieldPointer()</code></b></a>
- - <a href="#api_nan_adjust_external_memory"><b><code>Nan::AdjustExternalMemory()</code></b></a>
-
-
-<a name="api_nan_gc_callback"></a>
-### NAN_GC_CALLBACK(callbackname)
-
-Use `NAN_GC_CALLBACK` to declare your callbacks for `Nan::AddGCPrologueCallback()` and `Nan::AddGCEpilogueCallback()`. Your new method receives the arguments `v8::GCType type` and `v8::GCCallbackFlags flags`.
-
-```c++
-static Nan::Persistent<Function> callback;
-
-NAN_GC_CALLBACK(gcPrologueCallback) {
-  v8::Local<Value> argv[] = { Nan::New("prologue").ToLocalChecked() };
-  Nan::MakeCallback(Nan::GetCurrentContext()->Global(), Nan::New(callback), 1, argv);
-}
-
-NAN_METHOD(Hook) {
-  callback.Reset(args[0].As<Function>());
-  Nan::AddGCPrologueCallback(gcPrologueCallback);
-  info.GetReturnValue().Set(info.Holder());
-}
-```
-
-<a name="api_nan_add_gc_epilogue_callback"></a>
-### Nan::AddGCEpilogueCallback()
-
-Signature:
-
-```c++
-void Nan::AddGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback, v8::GCType gc_type_filter = v8::kGCTypeAll)
-```
-
-Calls V8's [`AddGCEpilogueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a90d1860babc76059c62514b422f56960).
-
-<a name="api_nan_remove_gc_epilogue_callback"></a>
-### Nan::RemoveGCEpilogueCallback()
-
-Signature:
-
-```c++
-void Nan::RemoveGCEpilogueCallback(v8::Isolate::GCEpilogueCallback callback)
-```
-
-Calls V8's [`RemoveGCEpilogueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a05c60859fd4b8e96bfcd451281ed6c7c).
-
-<a name="api_nan_add_gc_prologue_callback"></a>
-### Nan::AddGCPrologueCallback()
-
-Signature:
-
-```c++
-void Nan::AddGCPrologueCallback(v8::Isolate::GCPrologueCallback, v8::GCType gc_type_filter callback)
-```
-
-Calls V8's [`AddGCPrologueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ab4b87b8f9f8e5bf95eba4009357e001f).
-
-<a name="api_nan_remove_gc_prologue_callback"></a>
-### Nan::RemoveGCPrologueCallback()
-
-Signature:
-
-```c++
-void Nan::RemoveGCPrologueCallback(v8::Isolate::GCPrologueCallback callback)
-```
-
-Calls V8's [`RemoveGCEpilogueCallback()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a9f6c51932811593f81ff30b949124186).
-
-<a name="api_nan_get_heap_statistics"></a>
-### Nan::GetHeapStatistics()
-
-Signature:
-
-```c++
-void Nan::GetHeapStatistics(v8::HeapStatistics *heap_statistics)
-```
-
-Calls V8's [`GetHeapStatistics()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a5593ac74687b713095c38987e5950b34).
-
-<a name="api_nan_set_counter_function"></a>
-### Nan::SetCounterFunction()
-
-Signature:
-
-```c++
-void Nan::SetCounterFunction(v8::CounterLookupCallback cb)
-```
-
-Calls V8's [`SetCounterFunction()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a045d7754e62fa0ec72ae6c259b29af94).
-
-<a name="api_nan_set_create_histogram_function"></a>
-### Nan::SetCreateHistogramFunction()
-
-Signature:
-
-```c++
-void Nan::SetCreateHistogramFunction(v8::CreateHistogramCallback cb) 
-```
-
-Calls V8's [`SetCreateHistogramFunction()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a542d67e85089cb3f92aadf032f99e732).
-
-<a name="api_nan_set_add_histogram_sample_function"></a>
-### Nan::SetAddHistogramSampleFunction()
-
-Signature:
-
-```c++
-void Nan::SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) 
-```
-
-Calls V8's [`SetAddHistogramSampleFunction()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#aeb420b690bc2c216882d6fdd00ddd3ea).
-
-<a name="api_nan_idle_notification"></a>
-### Nan::IdleNotification()
-
-Signature:
-
-```c++
-void Nan::IdleNotification(v8::HeapStatistics *heap_statistics)
-```
-
-Calls V8's [`IdleNotification()` or `IdleNotificationDeadline()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ad6a2a02657f5425ad460060652a5a118) depending on V8 version.
-
-<a name="api_nan_low_memory_notification"></a>
-### Nan::LowMemoryNotification()
-
-Signature:
-
-```c++
-void Nan::LowMemoryNotification() 
-```
-
-Calls V8's [`IdleNotification()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a24647f61d6b41f69668094bdcd6ea91f).
-
-<a name="api_nan_context_disposed_notification"></a>
-### Nan::ContextDisposedNotification()
-
-Signature:
-
-```c++
-void Nan::ContextDisposedNotification()
-```
-
-Calls V8's [`ContextDisposedNotification()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ad7f5dc559866343fe6cd8db1f134d48b).
-
-<a name="api_nan_get_internal_field_pointer"></a>
-### Nan::GetInternalFieldPointer()
-
-Gets a pointer to the internal field with at `index` from a V8 `Object` handle.
-
-Signature:
-
-```c++
-void* Nan::GetInternalFieldPointer(v8::Local<v8::Object> object, int index) 
-```
-
-Calls the Object's [`GetAlignedPointerFromInternalField()` or `GetPointerFromInternalField()`](https://v8docs.nodesource.com/io.js-3.0/db/d85/classv8_1_1_object.html#ab3c57184263cf29963ef0017bec82281) depending on the version of V8.
-
-<a name="api_nan_set_internal_field_pointer"></a>
-### Nan::SetInternalFieldPointer()
-
-Sets the value of the internal field at `index` on a V8 `Object` handle.
-
-Signature:
-
-```c++
-void Nan::SetInternalFieldPointer(v8::Local<v8::Object> object, int index, void* value)
-```
-
-Calls the Object's [`SetAlignedPointerInInternalField()` or `SetPointerInInternalField()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ad7f5dc559866343fe6cd8db1f134d48b) depending on the version of V8.
-
-<a name="api_nan_adjust_external_memory"></a>
-### Nan::AdjustExternalMemory()
-
-Signature:
-
-```c++
-int Nan::AdjustExternalMemory(int bytesChange)
-```
-
-Calls V8's [`AdjustAmountOfExternalAllocatedMemory()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#ae1a59cac60409d3922582c4af675473e).
-
diff --git a/js/node_modules/nan/doc/v8_misc.md b/js/node_modules/nan/doc/v8_misc.md
deleted file mode 100644
index 64f736d6d16ab40f1babd08752da1eee02c1d13b..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/doc/v8_misc.md
+++ /dev/null
@@ -1,85 +0,0 @@
-## Miscellaneous V8 Helpers
-
- - <a href="#api_nan_utf8_string"><b><code>Nan::Utf8String</code></b></a>
- - <a href="#api_nan_get_current_context"><b><code>Nan::GetCurrentContext()</code></b></a>
- - <a href="#api_nan_set_isolate_data"><b><code>Nan::SetIsolateData()</code></b></a>
- - <a href="#api_nan_get_isolate_data"><b><code>Nan::GetIsolateData()</code></b></a>
- - <a href="#api_nan_typedarray_contents"><b><code>Nan::TypedArrayContents</code></b></a>
-
-
-<a name="api_nan_utf8_string"></a>
-### Nan::Utf8String
-
-Converts an object to a UTF-8-encoded character array. If conversion to a string fails (e.g. due to an exception in the toString() method of the object) then the length() method returns 0 and the * operator returns NULL. The underlying memory used for this object is managed by the object.
-
-An implementation of [`v8::String::Utf8Value`](https://v8docs.nodesource.com/io.js-3.0/d4/d1b/classv8_1_1_string_1_1_utf8_value.html) that is consistent across all supported versions of V8.
-
-Definition:
-
-```c++
-class Nan::Utf8String {
- public:
-  Nan::Utf8String(v8::Local<v8::Value> from);
-
-  int length() const;
-
-  char* operator*();
-  const char* operator*() const;
-};
-```
-
-<a name="api_nan_get_current_context"></a>
-### Nan::GetCurrentContext()
-
-A call to [`v8::Isolate::GetCurrent()->GetCurrentContext()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a81c7a1ed7001ae2a65e89107f75fd053) that works across all supported versions of V8.
-
-Signature:
-
-```c++
-v8::Local<v8::Context> Nan::GetCurrentContext()
-```
-
-<a name="api_nan_set_isolate_data"></a>
-### Nan::SetIsolateData()
-
-A helper to provide a consistent API to [`v8::Isolate#SetData()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#a7acadfe7965997e9c386a05f098fbe36).
-
-Signature:
-
-```c++
-void Nan::SetIsolateData(v8::Isolate *isolate, T *data)
-```
-
-
-<a name="api_nan_get_isolate_data"></a>
-### Nan::GetIsolateData()
-
-A helper to provide a consistent API to [`v8::Isolate#GetData()`](https://v8docs.nodesource.com/io.js-3.0/d5/dda/classv8_1_1_isolate.html#aabd223436bc1100a787dadaa024c6257).
-
-Signature:
-
-```c++
-T *Nan::GetIsolateData(v8::Isolate *isolate)
-```
-
-<a name="api_nan_typedarray_contents"></a>
-### Nan::TypedArrayContents<T>
-
-A helper class for accessing the contents of an ArrayBufferView (aka a typedarray) from C++.  If the input array is not a valid typedarray, then the data pointer of TypedArrayContents will default to `NULL` and the length will be 0.  If the data pointer is not compatible with the alignment requirements of type, an assertion error will fail.
-
-Note that you must store a reference to the `array` object while you are accessing its contents.
-
-Definition:
-
-```c++
-template<typename T>
-class Nan::TypedArrayContents {
- public:
-  TypedArrayContents(v8::Local<Value> array);
-
-  size_t length() const;
-
-  T* const operator*();
-  const T* const operator*() const;
-};
-```
diff --git a/js/node_modules/nan/include_dirs.js b/js/node_modules/nan/include_dirs.js
deleted file mode 100644
index 4f1dfb41667b9b86b4db9bb2255eaef5ab1b9ab6..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/include_dirs.js
+++ /dev/null
@@ -1 +0,0 @@
-console.log(require('path').relative('.', __dirname));
diff --git a/js/node_modules/nan/nan.h b/js/node_modules/nan/nan.h
deleted file mode 100644
index 7176da1719fcd8913a5c64de1331590d1c7e9ab6..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan.h
+++ /dev/null
@@ -1,2274 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors:
- *   - Rod Vagg <https://github.com/rvagg>
- *   - Benjamin Byholm <https://github.com/kkoopa>
- *   - Trevor Norris <https://github.com/trevnorris>
- *   - Nathan Rajlich <https://github.com/TooTallNate>
- *   - Brett Lawson <https://github.com/brett19>
- *   - Ben Noordhuis <https://github.com/bnoordhuis>
- *   - David Siegel <https://github.com/agnat>
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- *
- * Version 2.4.0: current Node 6.3.0, Node 12: 0.12.15, Node 10: 0.10.46, iojs: 3.3.1
- *
- * See https://github.com/nodejs/nan for the latest update to this file
- **********************************************************************************/
-
-#ifndef NAN_H_
-#define NAN_H_
-
-#include <node_version.h>
-
-#define NODE_0_10_MODULE_VERSION 11
-#define NODE_0_12_MODULE_VERSION 14
-#define ATOM_0_21_MODULE_VERSION 41
-#define IOJS_1_0_MODULE_VERSION  42
-#define IOJS_1_1_MODULE_VERSION  43
-#define IOJS_2_0_MODULE_VERSION  44
-#define IOJS_3_0_MODULE_VERSION  45
-#define NODE_4_0_MODULE_VERSION  46
-#define NODE_5_0_MODULE_VERSION  47
-#define NODE_6_0_MODULE_VERSION  48
-
-#ifdef _MSC_VER
-# define NAN_HAS_CPLUSPLUS_11 (_MSC_VER >= 1800)
-#else
-# define NAN_HAS_CPLUSPLUS_11 (__cplusplus >= 201103L)
-#endif
-
-#if NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION && !NAN_HAS_CPLUSPLUS_11
-# error This version of node/NAN/v8 requires a C++11 compiler
-#endif
-
-#include <uv.h>
-#include <node.h>
-#include <node_buffer.h>
-#include <node_object_wrap.h>
-#include <algorithm>
-#include <cstring>
-#include <climits>
-#include <cstdlib>
-#if defined(_MSC_VER)
-# pragma warning( push )
-# pragma warning( disable : 4530 )
-# include <string>
-# include <vector>
-# pragma warning( pop )
-#else
-# include <string>
-# include <vector>
-#endif
-
-// uv helpers
-#ifdef UV_VERSION_MAJOR
-# ifndef UV_VERSION_PATCH
-#  define UV_VERSION_PATCH 0
-# endif
-# define NAUV_UVVERSION ((UV_VERSION_MAJOR << 16) | \
-                         (UV_VERSION_MINOR <<  8) | \
-                         (UV_VERSION_PATCH))
-#else
-# define NAUV_UVVERSION 0x000b00
-#endif
-
-#if NAUV_UVVERSION < 0x000b0b
-# ifdef WIN32
-#  include <windows.h>
-# else
-#  include <pthread.h>
-# endif
-#endif
-
-namespace Nan {
-
-#define NAN_INLINE inline  // TODO(bnoordhuis) Remove in v3.0.0.
-
-#if defined(__GNUC__) && \
-    !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS)
-# define NAN_DEPRECATED __attribute__((deprecated))
-#elif defined(_MSC_VER) && \
-    !(defined(V8_DISABLE_DEPRECATIONS) && V8_DISABLE_DEPRECATIONS)
-# define NAN_DEPRECATED __declspec(deprecated)
-#else
-# define NAN_DEPRECATED
-#endif
-
-#if NAN_HAS_CPLUSPLUS_11
-# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&) = delete;
-# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&) = delete;
-# define NAN_DISALLOW_MOVE(CLASS)                                              \
-    CLASS(CLASS&&) = delete;  /* NOLINT(build/c++11) */                        \
-    void operator=(CLASS&&) = delete;
-#else
-# define NAN_DISALLOW_ASSIGN(CLASS) void operator=(const CLASS&);
-# define NAN_DISALLOW_COPY(CLASS) CLASS(const CLASS&);
-# define NAN_DISALLOW_MOVE(CLASS)
-#endif
-
-#define NAN_DISALLOW_ASSIGN_COPY(CLASS)                                        \
-    NAN_DISALLOW_ASSIGN(CLASS)                                                 \
-    NAN_DISALLOW_COPY(CLASS)
-
-#define NAN_DISALLOW_ASSIGN_MOVE(CLASS)                                        \
-    NAN_DISALLOW_ASSIGN(CLASS)                                                 \
-    NAN_DISALLOW_MOVE(CLASS)
-
-#define NAN_DISALLOW_COPY_MOVE(CLASS)                                          \
-    NAN_DISALLOW_COPY(CLASS)                                                   \
-    NAN_DISALLOW_MOVE(CLASS)
-
-#define NAN_DISALLOW_ASSIGN_COPY_MOVE(CLASS)                                   \
-    NAN_DISALLOW_ASSIGN(CLASS)                                                 \
-    NAN_DISALLOW_COPY(CLASS)                                                   \
-    NAN_DISALLOW_MOVE(CLASS)
-
-#define TYPE_CHECK(T, S)                                                       \
-    while (false) {                                                            \
-      *(static_cast<T *volatile *>(0)) = static_cast<S*>(0);                   \
-    }
-
-//=== RegistrationFunction =====================================================
-
-#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-  typedef v8::Handle<v8::Object> ADDON_REGISTER_FUNCTION_ARGS_TYPE;
-#else
-  typedef v8::Local<v8::Object> ADDON_REGISTER_FUNCTION_ARGS_TYPE;
-#endif
-
-#define NAN_MODULE_INIT(name)                                                  \
-    void name(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE target)
-
-//=== CallbackInfo =============================================================
-
-#include "nan_callbacks.h"  // NOLINT(build/include)
-
-//==============================================================================
-
-#if (NODE_MODULE_VERSION < NODE_0_12_MODULE_VERSION)
-typedef v8::Script             UnboundScript;
-typedef v8::Script             BoundScript;
-#else
-typedef v8::UnboundScript      UnboundScript;
-typedef v8::Script             BoundScript;
-#endif
-
-#if (NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION)
-typedef v8::String::ExternalAsciiStringResource
-    ExternalOneByteStringResource;
-#else
-typedef v8::String::ExternalOneByteStringResource
-    ExternalOneByteStringResource;
-#endif
-
-#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
-template<typename T>
-class NonCopyablePersistentTraits :
-    public v8::NonCopyablePersistentTraits<T> {};
-template<typename T>
-class CopyablePersistentTraits :
-    public v8::CopyablePersistentTraits<T> {};
-
-template<typename T>
-class PersistentBase :
-    public v8::PersistentBase<T> {};
-
-template<typename T, typename M = v8::NonCopyablePersistentTraits<T> >
-class Persistent;
-#else
-template<typename T> class NonCopyablePersistentTraits;
-template<typename T> class PersistentBase;
-template<typename T, typename P> class WeakCallbackData;
-template<typename T, typename M = NonCopyablePersistentTraits<T> >
-class Persistent;
-#endif  // NODE_MODULE_VERSION
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-# include "nan_maybe_43_inl.h"  // NOLINT(build/include)
-#else
-# include "nan_maybe_pre_43_inl.h"  // NOLINT(build/include)
-#endif
-
-#include "nan_converters.h"  // NOLINT(build/include)
-#include "nan_new.h"  // NOLINT(build/include)
-
-#if NAUV_UVVERSION < 0x000b17
-#define NAUV_WORK_CB(func) \
-    void func(uv_async_t *async, int)
-#else
-#define NAUV_WORK_CB(func) \
-    void func(uv_async_t *async)
-#endif
-
-#if NAUV_UVVERSION >= 0x000b0b
-
-typedef uv_key_t nauv_key_t;
-
-inline int nauv_key_create(nauv_key_t *key) {
-  return uv_key_create(key);
-}
-
-inline void nauv_key_delete(nauv_key_t *key) {
-  uv_key_delete(key);
-}
-
-inline void* nauv_key_get(nauv_key_t *key) {
-  return uv_key_get(key);
-}
-
-inline void nauv_key_set(nauv_key_t *key, void *value) {
-  uv_key_set(key, value);
-}
-
-#else
-
-/* Implement thread local storage for older versions of libuv.
- * This is essentially a backport of libuv commit 5d2434bf
- * written by Ben Noordhuis, adjusted for names and inline.
- */
-
-#ifndef WIN32
-
-typedef pthread_key_t nauv_key_t;
-
-inline int nauv_key_create(nauv_key_t* key) {
-  return -pthread_key_create(key, NULL);
-}
-
-inline void nauv_key_delete(nauv_key_t* key) {
-  if (pthread_key_delete(*key))
-    abort();
-}
-
-inline void* nauv_key_get(nauv_key_t* key) {
-  return pthread_getspecific(*key);
-}
-
-inline void nauv_key_set(nauv_key_t* key, void* value) {
-  if (pthread_setspecific(*key, value))
-    abort();
-}
-
-#else
-
-typedef struct {
-  DWORD tls_index;
-} nauv_key_t;
-
-inline int nauv_key_create(nauv_key_t* key) {
-  key->tls_index = TlsAlloc();
-  if (key->tls_index == TLS_OUT_OF_INDEXES)
-    return UV_ENOMEM;
-  return 0;
-}
-
-inline void nauv_key_delete(nauv_key_t* key) {
-  if (TlsFree(key->tls_index) == FALSE)
-    abort();
-  key->tls_index = TLS_OUT_OF_INDEXES;
-}
-
-inline void* nauv_key_get(nauv_key_t* key) {
-  void* value = TlsGetValue(key->tls_index);
-  if (value == NULL)
-    if (GetLastError() != ERROR_SUCCESS)
-      abort();
-  return value;
-}
-
-inline void nauv_key_set(nauv_key_t* key, void* value) {
-  if (TlsSetValue(key->tls_index, value) == FALSE)
-    abort();
-}
-
-#endif
-#endif
-
-#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-template<typename T>
-v8::Local<T> New(v8::Handle<T>);
-#endif
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-  typedef v8::WeakCallbackType WeakCallbackType;
-#else
-struct WeakCallbackType {
-  enum E {kParameter, kInternalFields};
-  E type;
-  WeakCallbackType(E other) : type(other) {}  // NOLINT(runtime/explicit)
-  inline bool operator==(E other) { return other == this->type; }
-  inline bool operator!=(E other) { return !operator==(other); }
-};
-#endif
-
-template<typename P> class WeakCallbackInfo;
-
-#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
-# include "nan_persistent_12_inl.h"  // NOLINT(build/include)
-#else
-# include "nan_persistent_pre_12_inl.h"  // NOLINT(build/include)
-#endif
-
-namespace imp {
-  static const size_t kMaxLength = 0x3fffffff;
-  // v8::String::REPLACE_INVALID_UTF8 was introduced
-  // in node.js v0.10.29 and v0.8.27.
-#if NODE_MAJOR_VERSION > 0 || \
-    NODE_MINOR_VERSION > 10 || \
-    NODE_MINOR_VERSION == 10 && NODE_PATCH_VERSION >= 29 || \
-    NODE_MINOR_VERSION == 8 && NODE_PATCH_VERSION >= 27
-  static const unsigned kReplaceInvalidUtf8 = v8::String::REPLACE_INVALID_UTF8;
-#else
-  static const unsigned kReplaceInvalidUtf8 = 0;
-#endif
-}  // end of namespace imp
-
-//=== HandleScope ==============================================================
-
-class HandleScope {
-  v8::HandleScope scope;
-
- public:
-#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
-  inline HandleScope() : scope(v8::Isolate::GetCurrent()) {}
-  inline static int NumberOfHandles() {
-    return v8::HandleScope::NumberOfHandles(v8::Isolate::GetCurrent());
-  }
-#else
-  inline HandleScope() : scope() {}
-  inline static int NumberOfHandles() {
-    return v8::HandleScope::NumberOfHandles();
-  }
-#endif
-
- private:
-  // Make it hard to create heap-allocated or illegal handle scopes by
-  // disallowing certain operations.
-  HandleScope(const HandleScope &);
-  void operator=(const HandleScope &);
-  void *operator new(size_t size);
-  void operator delete(void *, size_t);
-};
-
-class EscapableHandleScope {
- public:
-#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
-  inline EscapableHandleScope() : scope(v8::Isolate::GetCurrent()) {}
-
-  inline static int NumberOfHandles() {
-    return v8::EscapableHandleScope::NumberOfHandles(v8::Isolate::GetCurrent());
-  }
-
-  template<typename T>
-  inline v8::Local<T> Escape(v8::Local<T> value) {
-    return scope.Escape(value);
-  }
-
- private:
-  v8::EscapableHandleScope scope;
-#else
-  inline EscapableHandleScope() : scope() {}
-
-  inline static int NumberOfHandles() {
-    return v8::HandleScope::NumberOfHandles();
-  }
-
-  template<typename T>
-  inline v8::Local<T> Escape(v8::Local<T> value) {
-    return scope.Close(value);
-  }
-
- private:
-  v8::HandleScope scope;
-#endif
-
- private:
-  // Make it hard to create heap-allocated or illegal handle scopes by
-  // disallowing certain operations.
-  EscapableHandleScope(const EscapableHandleScope &);
-  void operator=(const EscapableHandleScope &);
-  void *operator new(size_t size);
-  void operator delete(void *, size_t);
-};
-
-//=== TryCatch =================================================================
-
-class TryCatch {
-  v8::TryCatch try_catch_;
-  friend void FatalException(const TryCatch&);
-
- public:
-#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
-  TryCatch() : try_catch_(v8::Isolate::GetCurrent()) {}
-#endif
-
-  inline bool HasCaught() const { return try_catch_.HasCaught(); }
-
-  inline bool CanContinue() const { return try_catch_.CanContinue(); }
-
-  inline v8::Local<v8::Value> ReThrow() {
-#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-    return New(try_catch_.ReThrow());
-#else
-    return try_catch_.ReThrow();
-#endif
-  }
-
-  inline v8::Local<v8::Value> Exception() const {
-    return try_catch_.Exception();
-  }
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-  inline v8::MaybeLocal<v8::Value> StackTrace() const {
-    return try_catch_.StackTrace(GetCurrentContext());
-  }
-#else
-  inline MaybeLocal<v8::Value> StackTrace() const {
-    return MaybeLocal<v8::Value>(try_catch_.StackTrace());
-  }
-#endif
-
-  inline v8::Local<v8::Message> Message() const {
-    return try_catch_.Message();
-  }
-
-  inline void Reset() { try_catch_.Reset(); }
-
-  inline void SetVerbose(bool value) { try_catch_.SetVerbose(value); }
-
-  inline void SetCaptureMessage(bool value) {
-    try_catch_.SetCaptureMessage(value);
-  }
-};
-
-//============ =================================================================
-
-/* node 0.12  */
-#if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION
-  inline
-  void SetCounterFunction(v8::CounterLookupCallback cb) {
-    v8::Isolate::GetCurrent()->SetCounterFunction(cb);
-  }
-
-  inline
-  void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) {
-    v8::Isolate::GetCurrent()->SetCreateHistogramFunction(cb);
-  }
-
-  inline
-  void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) {
-    v8::Isolate::GetCurrent()->SetAddHistogramSampleFunction(cb);
-  }
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-  inline bool IdleNotification(int idle_time_in_ms) {
-    return v8::Isolate::GetCurrent()->IdleNotificationDeadline(
-        idle_time_in_ms * 0.001);
-  }
-# else
-  inline bool IdleNotification(int idle_time_in_ms) {
-    return v8::Isolate::GetCurrent()->IdleNotification(idle_time_in_ms);
-  }
-#endif
-
-  inline void LowMemoryNotification() {
-    v8::Isolate::GetCurrent()->LowMemoryNotification();
-  }
-
-  inline void ContextDisposedNotification() {
-    v8::Isolate::GetCurrent()->ContextDisposedNotification();
-  }
-#else
-  inline
-  void SetCounterFunction(v8::CounterLookupCallback cb) {
-    v8::V8::SetCounterFunction(cb);
-  }
-
-  inline
-  void SetCreateHistogramFunction(v8::CreateHistogramCallback cb) {
-    v8::V8::SetCreateHistogramFunction(cb);
-  }
-
-  inline
-  void SetAddHistogramSampleFunction(v8::AddHistogramSampleCallback cb) {
-    v8::V8::SetAddHistogramSampleFunction(cb);
-  }
-
-  inline bool IdleNotification(int idle_time_in_ms) {
-    return v8::V8::IdleNotification(idle_time_in_ms);
-  }
-
-  inline void LowMemoryNotification() {
-    v8::V8::LowMemoryNotification();
-  }
-
-  inline void ContextDisposedNotification() {
-    v8::V8::ContextDisposedNotification();
-  }
-#endif
-
-#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)  // Node 0.12
-  inline v8::Local<v8::Primitive> Undefined() {
-# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-    EscapableHandleScope scope;
-    return scope.Escape(New(v8::Undefined(v8::Isolate::GetCurrent())));
-# else
-    return v8::Undefined(v8::Isolate::GetCurrent());
-# endif
-  }
-
-  inline v8::Local<v8::Primitive> Null() {
-# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-    EscapableHandleScope scope;
-    return scope.Escape(New(v8::Null(v8::Isolate::GetCurrent())));
-# else
-    return v8::Null(v8::Isolate::GetCurrent());
-# endif
-  }
-
-  inline v8::Local<v8::Boolean> True() {
-# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-    EscapableHandleScope scope;
-    return scope.Escape(New(v8::True(v8::Isolate::GetCurrent())));
-# else
-    return v8::True(v8::Isolate::GetCurrent());
-# endif
-  }
-
-  inline v8::Local<v8::Boolean> False() {
-# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-    EscapableHandleScope scope;
-    return scope.Escape(New(v8::False(v8::Isolate::GetCurrent())));
-# else
-    return v8::False(v8::Isolate::GetCurrent());
-# endif
-  }
-
-  inline v8::Local<v8::String> EmptyString() {
-    return v8::String::Empty(v8::Isolate::GetCurrent());
-  }
-
-  inline int AdjustExternalMemory(int bc) {
-    return static_cast<int>(
-        v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(bc));
-  }
-
-  inline void SetTemplate(
-      v8::Local<v8::Template> templ
-    , const char *name
-    , v8::Local<v8::Data> value) {
-    templ->Set(v8::Isolate::GetCurrent(), name, value);
-  }
-
-  inline void SetTemplate(
-      v8::Local<v8::Template> templ
-    , v8::Local<v8::String> name
-    , v8::Local<v8::Data> value
-    , v8::PropertyAttribute attributes) {
-    templ->Set(name, value, attributes);
-  }
-
-  inline v8::Local<v8::Context> GetCurrentContext() {
-    return v8::Isolate::GetCurrent()->GetCurrentContext();
-  }
-
-  inline void* GetInternalFieldPointer(
-      v8::Local<v8::Object> object
-    , int index) {
-    return object->GetAlignedPointerFromInternalField(index);
-  }
-
-  inline void SetInternalFieldPointer(
-      v8::Local<v8::Object> object
-    , int index
-    , void* value) {
-    object->SetAlignedPointerInInternalField(index, value);
-  }
-
-# define NAN_GC_CALLBACK(name)                                                 \
-    void name(v8::Isolate *isolate, v8::GCType type, v8::GCCallbackFlags flags)
-
-#if NODE_MODULE_VERSION <= NODE_4_0_MODULE_VERSION
-  typedef v8::Isolate::GCEpilogueCallback GCEpilogueCallback;
-  typedef v8::Isolate::GCPrologueCallback GCPrologueCallback;
-#else
-  typedef v8::Isolate::GCCallback GCEpilogueCallback;
-  typedef v8::Isolate::GCCallback GCPrologueCallback;
-#endif
-
-  inline void AddGCEpilogueCallback(
-      GCEpilogueCallback callback
-    , v8::GCType gc_type_filter = v8::kGCTypeAll) {
-    v8::Isolate::GetCurrent()->AddGCEpilogueCallback(callback, gc_type_filter);
-  }
-
-  inline void RemoveGCEpilogueCallback(
-      GCEpilogueCallback callback) {
-    v8::Isolate::GetCurrent()->RemoveGCEpilogueCallback(callback);
-  }
-
-  inline void AddGCPrologueCallback(
-      GCPrologueCallback callback
-    , v8::GCType gc_type_filter = v8::kGCTypeAll) {
-    v8::Isolate::GetCurrent()->AddGCPrologueCallback(callback, gc_type_filter);
-  }
-
-  inline void RemoveGCPrologueCallback(
-      GCPrologueCallback callback) {
-    v8::Isolate::GetCurrent()->RemoveGCPrologueCallback(callback);
-  }
-
-  inline void GetHeapStatistics(
-      v8::HeapStatistics *heap_statistics) {
-    v8::Isolate::GetCurrent()->GetHeapStatistics(heap_statistics);
-  }
-
-# define X(NAME)                                                               \
-    inline v8::Local<v8::Value> NAME(const char *msg) {                    \
-      EscapableHandleScope scope;                                              \
-      return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked()));     \
-    }                                                                          \
-                                                                               \
-    inline                                                                 \
-    v8::Local<v8::Value> NAME(v8::Local<v8::String> msg) {                     \
-      return v8::Exception::NAME(msg);                                         \
-    }                                                                          \
-                                                                               \
-    inline void Throw ## NAME(const char *msg) {                           \
-      HandleScope scope;                                                       \
-      v8::Isolate::GetCurrent()->ThrowException(                               \
-          v8::Exception::NAME(New(msg).ToLocalChecked()));                     \
-    }                                                                          \
-                                                                               \
-    inline void Throw ## NAME(v8::Local<v8::String> msg) {                 \
-      HandleScope scope;                                                       \
-      v8::Isolate::GetCurrent()->ThrowException(                               \
-          v8::Exception::NAME(msg));                                           \
-    }
-
-  X(Error)
-  X(RangeError)
-  X(ReferenceError)
-  X(SyntaxError)
-  X(TypeError)
-
-# undef X
-
-  inline void ThrowError(v8::Local<v8::Value> error) {
-    v8::Isolate::GetCurrent()->ThrowException(error);
-  }
-
-  inline MaybeLocal<v8::Object> NewBuffer(
-      char *data
-    , size_t length
-#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
-    , node::Buffer::FreeCallback callback
-#else
-    , node::smalloc::FreeCallback callback
-#endif
-    , void *hint
-  ) {
-    // arbitrary buffer lengths requires
-    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
-    assert(length <= imp::kMaxLength && "too large buffer");
-#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
-    return node::Buffer::New(
-        v8::Isolate::GetCurrent(), data, length, callback, hint);
-#else
-    return MaybeLocal<v8::Object>(node::Buffer::New(
-        v8::Isolate::GetCurrent(), data, length, callback, hint));
-#endif
-  }
-
-  inline MaybeLocal<v8::Object> CopyBuffer(
-      const char *data
-    , uint32_t size
-  ) {
-    // arbitrary buffer lengths requires
-    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
-    assert(size <= imp::kMaxLength && "too large buffer");
-#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
-    return node::Buffer::Copy(
-        v8::Isolate::GetCurrent(), data, size);
-#else
-    return MaybeLocal<v8::Object>(node::Buffer::New(
-        v8::Isolate::GetCurrent(), data, size));
-#endif
-  }
-
-  inline MaybeLocal<v8::Object> NewBuffer(uint32_t size) {
-    // arbitrary buffer lengths requires
-    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
-    assert(size <= imp::kMaxLength && "too large buffer");
-#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
-    return node::Buffer::New(
-        v8::Isolate::GetCurrent(), size);
-#else
-    return MaybeLocal<v8::Object>(node::Buffer::New(
-        v8::Isolate::GetCurrent(), size));
-#endif
-  }
-
-  inline MaybeLocal<v8::Object> NewBuffer(
-      char* data
-    , uint32_t size
-  ) {
-    // arbitrary buffer lengths requires
-    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
-    assert(size <= imp::kMaxLength && "too large buffer");
-#if NODE_MODULE_VERSION > IOJS_2_0_MODULE_VERSION
-    return node::Buffer::New(v8::Isolate::GetCurrent(), data, size);
-#else
-    return MaybeLocal<v8::Object>(
-        node::Buffer::Use(v8::Isolate::GetCurrent(), data, size));
-#endif
-  }
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-  inline MaybeLocal<v8::String>
-  NewOneByteString(const uint8_t * value, int length = -1) {
-    return v8::String::NewFromOneByte(v8::Isolate::GetCurrent(), value,
-          v8::NewStringType::kNormal, length);
-  }
-
-  inline MaybeLocal<BoundScript> CompileScript(
-      v8::Local<v8::String> s
-    , const v8::ScriptOrigin& origin
-  ) {
-    v8::ScriptCompiler::Source source(s, origin);
-    return v8::ScriptCompiler::Compile(GetCurrentContext(), &source);
-  }
-
-  inline MaybeLocal<BoundScript> CompileScript(
-      v8::Local<v8::String> s
-  ) {
-    v8::ScriptCompiler::Source source(s);
-    return v8::ScriptCompiler::Compile(GetCurrentContext(), &source);
-  }
-
-  inline MaybeLocal<v8::Value> RunScript(
-      v8::Local<UnboundScript> script
-  ) {
-    return script->BindToCurrentContext()->Run(GetCurrentContext());
-  }
-
-  inline MaybeLocal<v8::Value> RunScript(
-      v8::Local<BoundScript> script
-  ) {
-    return script->Run(GetCurrentContext());
-  }
-#else
-  inline MaybeLocal<v8::String>
-  NewOneByteString(const uint8_t * value, int length = -1) {
-    return MaybeLocal<v8::String>(
-        v8::String::NewFromOneByte(
-            v8::Isolate::GetCurrent()
-          , value
-          , v8::String::kNormalString, length));
-  }
-
-  inline MaybeLocal<BoundScript> CompileScript(
-      v8::Local<v8::String> s
-    , const v8::ScriptOrigin& origin
-  ) {
-    v8::ScriptCompiler::Source source(s, origin);
-    return MaybeLocal<BoundScript>(
-        v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source));
-  }
-
-  inline MaybeLocal<BoundScript> CompileScript(
-      v8::Local<v8::String> s
-  ) {
-    v8::ScriptCompiler::Source source(s);
-    return MaybeLocal<BoundScript>(
-        v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &source));
-  }
-
-  inline MaybeLocal<v8::Value> RunScript(
-      v8::Local<UnboundScript> script
-  ) {
-    return MaybeLocal<v8::Value>(script->BindToCurrentContext()->Run());
-  }
-
-  inline MaybeLocal<v8::Value> RunScript(
-      v8::Local<BoundScript> script
-  ) {
-    return MaybeLocal<v8::Value>(script->Run());
-  }
-#endif
-
-  inline v8::Local<v8::Value> MakeCallback(
-      v8::Local<v8::Object> target
-    , v8::Local<v8::Function> func
-    , int argc
-    , v8::Local<v8::Value>* argv) {
-#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-    return New(node::MakeCallback(
-        v8::Isolate::GetCurrent(), target, func, argc, argv));
-#else
-    return node::MakeCallback(
-        v8::Isolate::GetCurrent(), target, func, argc, argv);
-#endif
-  }
-
-  inline v8::Local<v8::Value> MakeCallback(
-      v8::Local<v8::Object> target
-    , v8::Local<v8::String> symbol
-    , int argc
-    , v8::Local<v8::Value>* argv) {
-#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-    return New(node::MakeCallback(
-        v8::Isolate::GetCurrent(), target, symbol, argc, argv));
-#else
-    return node::MakeCallback(
-        v8::Isolate::GetCurrent(), target, symbol, argc, argv);
-#endif
-  }
-
-  inline v8::Local<v8::Value> MakeCallback(
-      v8::Local<v8::Object> target
-    , const char* method
-    , int argc
-    , v8::Local<v8::Value>* argv) {
-#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-    return New(node::MakeCallback(
-        v8::Isolate::GetCurrent(), target, method, argc, argv));
-#else
-    return node::MakeCallback(
-        v8::Isolate::GetCurrent(), target, method, argc, argv);
-#endif
-  }
-
-  inline void FatalException(const TryCatch& try_catch) {
-    node::FatalException(v8::Isolate::GetCurrent(), try_catch.try_catch_);
-  }
-
-  inline v8::Local<v8::Value> ErrnoException(
-          int errorno
-       ,  const char* syscall = NULL
-       ,  const char* message = NULL
-       ,  const char* path = NULL) {
-    return node::ErrnoException(v8::Isolate::GetCurrent(), errorno, syscall,
-            message, path);
-  }
-
-  NAN_DEPRECATED inline v8::Local<v8::Value> NanErrnoException(
-          int errorno
-       ,  const char* syscall = NULL
-       ,  const char* message = NULL
-       ,  const char* path = NULL) {
-    return ErrnoException(errorno, syscall, message, path);
-  }
-
-  template<typename T>
-  inline void SetIsolateData(
-      v8::Isolate *isolate
-    , T *data
-  ) {
-      isolate->SetData(0, data);
-  }
-
-  template<typename T>
-  inline T *GetIsolateData(
-      v8::Isolate *isolate
-  ) {
-      return static_cast<T*>(isolate->GetData(0));
-  }
-
-class Utf8String {
- public:
-  inline explicit Utf8String(v8::Local<v8::Value> from) :
-      length_(0), str_(str_st_) {
-    if (!from.IsEmpty()) {
-      v8::Local<v8::String> string = from->ToString();
-      if (!string.IsEmpty()) {
-        size_t len = 3 * string->Length() + 1;
-        assert(len <= INT_MAX);
-        if (len > sizeof (str_st_)) {
-          str_ = static_cast<char*>(malloc(len));
-          assert(str_ != 0);
-        }
-        const int flags =
-            v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8;
-        length_ = string->WriteUtf8(str_, static_cast<int>(len), 0, flags);
-        str_[length_] = '\0';
-      }
-    }
-  }
-
-  inline int length() const {
-    return length_;
-  }
-
-  inline char* operator*() { return str_; }
-  inline const char* operator*() const { return str_; }
-
-  inline ~Utf8String() {
-    if (str_ != str_st_) {
-      free(str_);
-    }
-  }
-
- private:
-  NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String)
-
-  int length_;
-  char *str_;
-  char str_st_[1024];
-};
-
-#else  // Node 0.8 and 0.10
-  inline v8::Local<v8::Primitive> Undefined() {
-    EscapableHandleScope scope;
-    return scope.Escape(New(v8::Undefined()));
-  }
-
-  inline v8::Local<v8::Primitive> Null() {
-    EscapableHandleScope scope;
-    return scope.Escape(New(v8::Null()));
-  }
-
-  inline v8::Local<v8::Boolean> True() {
-    EscapableHandleScope scope;
-    return scope.Escape(New(v8::True()));
-  }
-
-  inline v8::Local<v8::Boolean> False() {
-    EscapableHandleScope scope;
-    return scope.Escape(New(v8::False()));
-  }
-
-  inline v8::Local<v8::String> EmptyString() {
-    return v8::String::Empty();
-  }
-
-  inline int AdjustExternalMemory(int bc) {
-    return static_cast<int>(v8::V8::AdjustAmountOfExternalAllocatedMemory(bc));
-  }
-
-  inline void SetTemplate(
-      v8::Local<v8::Template> templ
-    , const char *name
-    , v8::Local<v8::Data> value) {
-    templ->Set(name, value);
-  }
-
-  inline void SetTemplate(
-      v8::Local<v8::Template> templ
-    , v8::Local<v8::String> name
-    , v8::Local<v8::Data> value
-    , v8::PropertyAttribute attributes) {
-    templ->Set(name, value, attributes);
-  }
-
-  inline v8::Local<v8::Context> GetCurrentContext() {
-    return v8::Context::GetCurrent();
-  }
-
-  inline void* GetInternalFieldPointer(
-      v8::Local<v8::Object> object
-    , int index) {
-    return object->GetPointerFromInternalField(index);
-  }
-
-  inline void SetInternalFieldPointer(
-      v8::Local<v8::Object> object
-    , int index
-    , void* value) {
-    object->SetPointerInInternalField(index, value);
-  }
-
-# define NAN_GC_CALLBACK(name)                                                 \
-    void name(v8::GCType type, v8::GCCallbackFlags flags)
-
-  inline void AddGCEpilogueCallback(
-    v8::GCEpilogueCallback callback
-  , v8::GCType gc_type_filter = v8::kGCTypeAll) {
-    v8::V8::AddGCEpilogueCallback(callback, gc_type_filter);
-  }
-  inline void RemoveGCEpilogueCallback(
-    v8::GCEpilogueCallback callback) {
-    v8::V8::RemoveGCEpilogueCallback(callback);
-  }
-  inline void AddGCPrologueCallback(
-    v8::GCPrologueCallback callback
-  , v8::GCType gc_type_filter = v8::kGCTypeAll) {
-    v8::V8::AddGCPrologueCallback(callback, gc_type_filter);
-  }
-  inline void RemoveGCPrologueCallback(
-    v8::GCPrologueCallback callback) {
-    v8::V8::RemoveGCPrologueCallback(callback);
-  }
-  inline void GetHeapStatistics(
-    v8::HeapStatistics *heap_statistics) {
-    v8::V8::GetHeapStatistics(heap_statistics);
-  }
-
-# define X(NAME)                                                               \
-    inline v8::Local<v8::Value> NAME(const char *msg) {                    \
-      EscapableHandleScope scope;                                              \
-      return scope.Escape(v8::Exception::NAME(New(msg).ToLocalChecked()));     \
-    }                                                                          \
-                                                                               \
-    inline                                                                 \
-    v8::Local<v8::Value> NAME(v8::Local<v8::String> msg) {                     \
-      return v8::Exception::NAME(msg);                                         \
-    }                                                                          \
-                                                                               \
-    inline void Throw ## NAME(const char *msg) {                           \
-      HandleScope scope;                                                       \
-      v8::ThrowException(v8::Exception::NAME(New(msg).ToLocalChecked()));      \
-    }                                                                          \
-                                                                               \
-    inline                                                                 \
-    void Throw ## NAME(v8::Local<v8::String> errmsg) {                         \
-      v8::ThrowException(v8::Exception::NAME(errmsg));                         \
-    }
-
-  X(Error)
-  X(RangeError)
-  X(ReferenceError)
-  X(SyntaxError)
-  X(TypeError)
-
-# undef X
-
-  inline void ThrowError(v8::Local<v8::Value> error) {
-    v8::ThrowException(error);
-  }
-
-  inline MaybeLocal<v8::Object> NewBuffer(
-      char *data
-    , size_t length
-    , node::Buffer::free_callback callback
-    , void *hint
-  ) {
-    EscapableHandleScope scope;
-    // arbitrary buffer lengths requires
-    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
-    assert(length <= imp::kMaxLength && "too large buffer");
-    return MaybeLocal<v8::Object>(scope.Escape(
-        New(node::Buffer::New(data, length, callback, hint)->handle_)));
-  }
-
-  inline MaybeLocal<v8::Object> CopyBuffer(
-      const char *data
-    , uint32_t size
-  ) {
-    EscapableHandleScope scope;
-    // arbitrary buffer lengths requires
-    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
-    assert(size <= imp::kMaxLength && "too large buffer");
-#if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION
-    return MaybeLocal<v8::Object>(
-        scope.Escape(New(node::Buffer::New(data, size)->handle_)));
-#else
-    return MaybeLocal<v8::Object>(scope.Escape(
-        New(node::Buffer::New(const_cast<char*>(data), size)->handle_)));
-#endif
-  }
-
-  inline MaybeLocal<v8::Object> NewBuffer(uint32_t size) {
-    // arbitrary buffer lengths requires
-    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
-    EscapableHandleScope scope;
-    assert(size <= imp::kMaxLength && "too large buffer");
-    return MaybeLocal<v8::Object>(
-        scope.Escape(New(node::Buffer::New(size)->handle_)));
-  }
-
-  inline void FreeData(char *data, void *hint) {
-    (void) hint;  // unused
-    delete[] data;
-  }
-
-  inline MaybeLocal<v8::Object> NewBuffer(
-      char* data
-    , uint32_t size
-  ) {
-    EscapableHandleScope scope;
-    // arbitrary buffer lengths requires
-    // NODE_MODULE_VERSION >= IOJS_3_0_MODULE_VERSION
-    assert(size <= imp::kMaxLength && "too large buffer");
-    return MaybeLocal<v8::Object>(scope.Escape(New(
-        node::Buffer::New(data, size, FreeData, NULL)->handle_)));
-  }
-
-namespace imp {
-inline void
-widenString(std::vector<uint16_t> *ws, const uint8_t *s, int l) {
-  size_t len = static_cast<size_t>(l);
-  if (l < 0) {
-    len = strlen(reinterpret_cast<const char*>(s));
-  }
-  assert(len <= INT_MAX && "string too long");
-  ws->resize(len);
-  std::copy(s, s + len, ws->begin());  // NOLINT(build/include_what_you_use)
-}
-}  // end of namespace imp
-
-  inline MaybeLocal<v8::String>
-  NewOneByteString(const uint8_t * value, int length = -1) {
-    std::vector<uint16_t> wideString;  // NOLINT(build/include_what_you_use)
-    imp::widenString(&wideString, value, length);
-    return imp::Factory<v8::String>::return_t(v8::String::New(
-        &wideString.front(), static_cast<int>(wideString.size())));
-  }
-
-  inline MaybeLocal<BoundScript> CompileScript(
-      v8::Local<v8::String> s
-    , const v8::ScriptOrigin& origin
-  ) {
-    return MaybeLocal<BoundScript>(
-        v8::Script::Compile(s, const_cast<v8::ScriptOrigin *>(&origin)));
-  }
-
-  inline MaybeLocal<BoundScript> CompileScript(
-    v8::Local<v8::String> s
-  ) {
-    return MaybeLocal<BoundScript>(v8::Script::Compile(s));
-  }
-
-  inline
-  MaybeLocal<v8::Value> RunScript(v8::Local<v8::Script> script) {
-    return MaybeLocal<v8::Value>(script->Run());
-  }
-
-  inline v8::Local<v8::Value> MakeCallback(
-      v8::Local<v8::Object> target
-    , v8::Local<v8::Function> func
-    , int argc
-    , v8::Local<v8::Value>* argv) {
-    return New(node::MakeCallback(target, func, argc, argv));
-  }
-
-  inline v8::Local<v8::Value> MakeCallback(
-      v8::Local<v8::Object> target
-    , v8::Local<v8::String> symbol
-    , int argc
-    , v8::Local<v8::Value>* argv) {
-    return New(node::MakeCallback(target, symbol, argc, argv));
-  }
-
-  inline v8::Local<v8::Value> MakeCallback(
-      v8::Local<v8::Object> target
-    , const char* method
-    , int argc
-    , v8::Local<v8::Value>* argv) {
-    return New(node::MakeCallback(target, method, argc, argv));
-  }
-
-  inline void FatalException(const TryCatch& try_catch) {
-    node::FatalException(const_cast<v8::TryCatch &>(try_catch.try_catch_));
-  }
-
-  inline v8::Local<v8::Value> ErrnoException(
-          int errorno
-       ,  const char* syscall = NULL
-       ,  const char* message = NULL
-       ,  const char* path = NULL) {
-    return node::ErrnoException(errorno, syscall, message, path);
-  }
-
-  NAN_DEPRECATED inline v8::Local<v8::Value> NanErrnoException(
-          int errorno
-       ,  const char* syscall = NULL
-       ,  const char* message = NULL
-       ,  const char* path = NULL) {
-    return ErrnoException(errorno, syscall, message, path);
-  }
-
-
-  template<typename T>
-  inline void SetIsolateData(
-      v8::Isolate *isolate
-    , T *data
-  ) {
-      isolate->SetData(data);
-  }
-
-  template<typename T>
-  inline T *GetIsolateData(
-      v8::Isolate *isolate
-  ) {
-      return static_cast<T*>(isolate->GetData());
-  }
-
-class Utf8String {
- public:
-  inline explicit Utf8String(v8::Local<v8::Value> from) :
-      length_(0), str_(str_st_) {
-    if (!from.IsEmpty()) {
-      v8::Local<v8::String> string = from->ToString();
-      if (!string.IsEmpty()) {
-        size_t len = 3 * string->Length() + 1;
-        assert(len <= INT_MAX);
-        if (len > sizeof (str_st_)) {
-          str_ = static_cast<char*>(malloc(len));
-          assert(str_ != 0);
-        }
-        const int flags =
-            v8::String::NO_NULL_TERMINATION | imp::kReplaceInvalidUtf8;
-        length_ = string->WriteUtf8(str_, static_cast<int>(len), 0, flags);
-        str_[length_] = '\0';
-      }
-    }
-  }
-
-  inline int length() const {
-    return length_;
-  }
-
-  inline char* operator*() { return str_; }
-  inline const char* operator*() const { return str_; }
-
-  inline ~Utf8String() {
-    if (str_ != str_st_) {
-      free(str_);
-    }
-  }
-
- private:
-  NAN_DISALLOW_ASSIGN_COPY_MOVE(Utf8String)
-
-  int length_;
-  char *str_;
-  char str_st_[1024];
-};
-
-#endif  // NODE_MODULE_VERSION
-
-typedef void (*FreeCallback)(char *data, void *hint);
-
-typedef const FunctionCallbackInfo<v8::Value>& NAN_METHOD_ARGS_TYPE;
-typedef void NAN_METHOD_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<v8::Value>& NAN_GETTER_ARGS_TYPE;
-typedef void NAN_GETTER_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<void>& NAN_SETTER_ARGS_TYPE;
-typedef void NAN_SETTER_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<v8::Value>&
-    NAN_PROPERTY_GETTER_ARGS_TYPE;
-typedef void NAN_PROPERTY_GETTER_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<v8::Value>&
-    NAN_PROPERTY_SETTER_ARGS_TYPE;
-typedef void NAN_PROPERTY_SETTER_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<v8::Array>&
-    NAN_PROPERTY_ENUMERATOR_ARGS_TYPE;
-typedef void NAN_PROPERTY_ENUMERATOR_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<v8::Boolean>&
-    NAN_PROPERTY_DELETER_ARGS_TYPE;
-typedef void NAN_PROPERTY_DELETER_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<v8::Integer>&
-    NAN_PROPERTY_QUERY_ARGS_TYPE;
-typedef void NAN_PROPERTY_QUERY_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<v8::Value>& NAN_INDEX_GETTER_ARGS_TYPE;
-typedef void NAN_INDEX_GETTER_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<v8::Value>& NAN_INDEX_SETTER_ARGS_TYPE;
-typedef void NAN_INDEX_SETTER_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<v8::Array>&
-    NAN_INDEX_ENUMERATOR_ARGS_TYPE;
-typedef void NAN_INDEX_ENUMERATOR_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<v8::Boolean>&
-    NAN_INDEX_DELETER_ARGS_TYPE;
-typedef void NAN_INDEX_DELETER_RETURN_TYPE;
-
-typedef const PropertyCallbackInfo<v8::Integer>&
-    NAN_INDEX_QUERY_ARGS_TYPE;
-typedef void NAN_INDEX_QUERY_RETURN_TYPE;
-
-#define NAN_METHOD(name)                                                       \
-    Nan::NAN_METHOD_RETURN_TYPE name(Nan::NAN_METHOD_ARGS_TYPE info)
-#define NAN_GETTER(name)                                                       \
-    Nan::NAN_GETTER_RETURN_TYPE name(                                          \
-        v8::Local<v8::String> property                                         \
-      , Nan::NAN_GETTER_ARGS_TYPE info)
-#define NAN_SETTER(name)                                                       \
-    Nan::NAN_SETTER_RETURN_TYPE name(                                          \
-        v8::Local<v8::String> property                                         \
-      , v8::Local<v8::Value> value                                             \
-      , Nan::NAN_SETTER_ARGS_TYPE info)
-#define NAN_PROPERTY_GETTER(name)                                              \
-    Nan::NAN_PROPERTY_GETTER_RETURN_TYPE name(                                 \
-        v8::Local<v8::String> property                                         \
-      , Nan::NAN_PROPERTY_GETTER_ARGS_TYPE info)
-#define NAN_PROPERTY_SETTER(name)                                              \
-    Nan::NAN_PROPERTY_SETTER_RETURN_TYPE name(                                 \
-        v8::Local<v8::String> property                                         \
-      , v8::Local<v8::Value> value                                             \
-      , Nan::NAN_PROPERTY_SETTER_ARGS_TYPE info)
-#define NAN_PROPERTY_ENUMERATOR(name)                                          \
-    Nan::NAN_PROPERTY_ENUMERATOR_RETURN_TYPE name(                             \
-        Nan::NAN_PROPERTY_ENUMERATOR_ARGS_TYPE info)
-#define NAN_PROPERTY_DELETER(name)                                             \
-    Nan::NAN_PROPERTY_DELETER_RETURN_TYPE name(                                \
-        v8::Local<v8::String> property                                         \
-      , Nan::NAN_PROPERTY_DELETER_ARGS_TYPE info)
-#define NAN_PROPERTY_QUERY(name)                                               \
-    Nan::NAN_PROPERTY_QUERY_RETURN_TYPE name(                                  \
-        v8::Local<v8::String> property                                         \
-      , Nan::NAN_PROPERTY_QUERY_ARGS_TYPE info)
-# define NAN_INDEX_GETTER(name)                                                \
-    Nan::NAN_INDEX_GETTER_RETURN_TYPE name(                                    \
-        uint32_t index                                                         \
-      , Nan::NAN_INDEX_GETTER_ARGS_TYPE info)
-#define NAN_INDEX_SETTER(name)                                                 \
-    Nan::NAN_INDEX_SETTER_RETURN_TYPE name(                                    \
-        uint32_t index                                                         \
-      , v8::Local<v8::Value> value                                             \
-      , Nan::NAN_INDEX_SETTER_ARGS_TYPE info)
-#define NAN_INDEX_ENUMERATOR(name)                                             \
-    Nan::NAN_INDEX_ENUMERATOR_RETURN_TYPE                                      \
-    name(Nan::NAN_INDEX_ENUMERATOR_ARGS_TYPE info)
-#define NAN_INDEX_DELETER(name)                                                \
-    Nan::NAN_INDEX_DELETER_RETURN_TYPE name(                                   \
-        uint32_t index                                                         \
-      , Nan::NAN_INDEX_DELETER_ARGS_TYPE info)
-#define NAN_INDEX_QUERY(name)                                                  \
-    Nan::NAN_INDEX_QUERY_RETURN_TYPE name(                                     \
-        uint32_t index                                                         \
-      , Nan::NAN_INDEX_QUERY_ARGS_TYPE info)
-
-class Callback {
- public:
-  Callback() {}
-
-  explicit Callback(const v8::Local<v8::Function> &fn) : handle_(fn) {}
-
-  ~Callback() {
-    handle_.Reset();
-  }
-
-  bool operator==(const Callback &other) const {
-    return handle_ == other.handle_;
-  }
-
-  bool operator!=(const Callback &other) const {
-    return !operator==(other);
-  }
-
-  inline
-  v8::Local<v8::Function> operator*() const { return GetFunction(); }
-
-  inline v8::Local<v8::Value> operator()(
-      v8::Local<v8::Object> target
-    , int argc = 0
-    , v8::Local<v8::Value> argv[] = 0) const {
-    return this->Call(target, argc, argv);
-  }
-
-  inline v8::Local<v8::Value> operator()(
-      int argc = 0
-    , v8::Local<v8::Value> argv[] = 0) const {
-    return this->Call(argc, argv);
-  }
-
-  // TODO(kkoopa): remove
-  inline void SetFunction(const v8::Local<v8::Function> &fn) {
-    Reset(fn);
-  }
-
-  inline void Reset(const v8::Local<v8::Function> &fn) {
-    handle_.Reset(fn);
-  }
-
-  inline void Reset() {
-    handle_.Reset();
-  }
-
-  inline v8::Local<v8::Function> GetFunction() const {
-    return New(handle_);
-  }
-
-  inline bool IsEmpty() const {
-    return handle_.IsEmpty();
-  }
-
-  inline v8::Local<v8::Value>
-  Call(v8::Local<v8::Object> target
-     , int argc
-     , v8::Local<v8::Value> argv[]) const {
-#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
-    v8::Isolate *isolate = v8::Isolate::GetCurrent();
-    return Call_(isolate, target, argc, argv);
-#else
-    return Call_(target, argc, argv);
-#endif
-  }
-
-  inline v8::Local<v8::Value>
-  Call(int argc, v8::Local<v8::Value> argv[]) const {
-#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
-    v8::Isolate *isolate = v8::Isolate::GetCurrent();
-    return Call_(isolate, isolate->GetCurrentContext()->Global(), argc, argv);
-#else
-    return Call_(v8::Context::GetCurrent()->Global(), argc, argv);
-#endif
-  }
-
- private:
-  NAN_DISALLOW_ASSIGN_COPY_MOVE(Callback)
-  Persistent<v8::Function> handle_;
-
-#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
-  v8::Local<v8::Value> Call_(v8::Isolate *isolate
-                           , v8::Local<v8::Object> target
-                           , int argc
-                           , v8::Local<v8::Value> argv[]) const {
-    EscapableHandleScope scope;
-
-    v8::Local<v8::Function> callback = New(handle_);
-# if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-    return scope.Escape(New(node::MakeCallback(
-        isolate
-      , target
-      , callback
-      , argc
-      , argv
-    )));
-# else
-    return scope.Escape(node::MakeCallback(
-        isolate
-      , target
-      , callback
-      , argc
-      , argv
-    ));
-# endif
-  }
-#else
-  v8::Local<v8::Value> Call_(v8::Local<v8::Object> target
-                           , int argc
-                           , v8::Local<v8::Value> argv[]) const {
-    EscapableHandleScope scope;
-
-    v8::Local<v8::Function> callback = New(handle_);
-    return scope.Escape(New(node::MakeCallback(
-        target
-      , callback
-      , argc
-      , argv
-    )));
-  }
-#endif
-};
-
-/* abstract */ class AsyncWorker {
- public:
-  explicit AsyncWorker(Callback *callback_)
-      : callback(callback_), errmsg_(NULL) {
-    request.data = this;
-
-    HandleScope scope;
-    v8::Local<v8::Object> obj = New<v8::Object>();
-    persistentHandle.Reset(obj);
-  }
-
-  virtual ~AsyncWorker() {
-    HandleScope scope;
-
-    if (!persistentHandle.IsEmpty())
-      persistentHandle.Reset();
-    delete callback;
-    delete[] errmsg_;
-  }
-
-  virtual void WorkComplete() {
-    HandleScope scope;
-
-    if (errmsg_ == NULL)
-      HandleOKCallback();
-    else
-      HandleErrorCallback();
-    delete callback;
-    callback = NULL;
-  }
-
-  inline void SaveToPersistent(
-      const char *key, const v8::Local<v8::Value> &value) {
-    HandleScope scope;
-    New(persistentHandle)->Set(New(key).ToLocalChecked(), value);
-  }
-
-  inline void SaveToPersistent(
-      const v8::Local<v8::String> &key, const v8::Local<v8::Value> &value) {
-    HandleScope scope;
-    New(persistentHandle)->Set(key, value);
-  }
-
-  inline void SaveToPersistent(
-      uint32_t index, const v8::Local<v8::Value> &value) {
-    HandleScope scope;
-    New(persistentHandle)->Set(index, value);
-  }
-
-  inline v8::Local<v8::Value> GetFromPersistent(const char *key) const {
-    EscapableHandleScope scope;
-    return scope.Escape(
-        New(persistentHandle)->Get(New(key).ToLocalChecked()));
-  }
-
-  inline v8::Local<v8::Value>
-  GetFromPersistent(const v8::Local<v8::String> &key) const {
-    EscapableHandleScope scope;
-    return scope.Escape(New(persistentHandle)->Get(key));
-  }
-
-  inline v8::Local<v8::Value> GetFromPersistent(uint32_t index) const {
-    EscapableHandleScope scope;
-    return scope.Escape(New(persistentHandle)->Get(index));
-  }
-
-  virtual void Execute() = 0;
-
-  uv_work_t request;
-
-  virtual void Destroy() {
-      delete this;
-  }
-
- protected:
-  Persistent<v8::Object> persistentHandle;
-  Callback *callback;
-
-  virtual void HandleOKCallback() {
-    callback->Call(0, NULL);
-  }
-
-  virtual void HandleErrorCallback() {
-    HandleScope scope;
-
-    v8::Local<v8::Value> argv[] = {
-      v8::Exception::Error(New<v8::String>(ErrorMessage()).ToLocalChecked())
-    };
-    callback->Call(1, argv);
-  }
-
-  void SetErrorMessage(const char *msg) {
-    delete[] errmsg_;
-
-    size_t size = strlen(msg) + 1;
-    errmsg_ = new char[size];
-    memcpy(errmsg_, msg, size);
-  }
-
-  const char* ErrorMessage() const {
-    return errmsg_;
-  }
-
- private:
-  NAN_DISALLOW_ASSIGN_COPY_MOVE(AsyncWorker)
-  char *errmsg_;
-};
-
-
-template<class T>
-/* abstract */ class AsyncProgressWorkerBase : public AsyncWorker {
- public:
-  explicit AsyncProgressWorkerBase(Callback *callback_)
-      : AsyncWorker(callback_), asyncdata_(NULL), asyncsize_(0) {
-    async = new uv_async_t;
-    uv_async_init(
-        uv_default_loop()
-      , async
-      , AsyncProgress_
-    );
-    async->data = this;
-
-    uv_mutex_init(&async_lock);
-  }
-
-  virtual ~AsyncProgressWorkerBase() {
-    uv_mutex_destroy(&async_lock);
-
-    delete[] asyncdata_;
-  }
-
-  void WorkProgress() {
-    uv_mutex_lock(&async_lock);
-    T *data = asyncdata_;
-    size_t size = asyncsize_;
-    asyncdata_ = NULL;
-    uv_mutex_unlock(&async_lock);
-
-    // Don't send progress events after we've already completed.
-    if (callback) {
-        HandleProgressCallback(data, size);
-    }
-    delete[] data;
-  }
-
-  class ExecutionProgress {
-    friend class AsyncProgressWorkerBase;
-   public:
-    void Signal() const {
-        uv_async_send(that_->async);
-    }
-
-    void Send(const T* data, size_t size) const {
-        that_->SendProgress_(data, size);
-    }
-
-   private:
-    explicit ExecutionProgress(AsyncProgressWorkerBase *that) : that_(that) {}
-    NAN_DISALLOW_ASSIGN_COPY_MOVE(ExecutionProgress)
-    AsyncProgressWorkerBase* const that_;
-  };
-
-  virtual void Execute(const ExecutionProgress& progress) = 0;
-  virtual void HandleProgressCallback(const T *data, size_t size) = 0;
-
-  virtual void Destroy() {
-      uv_close(reinterpret_cast<uv_handle_t*>(async), AsyncClose_);
-  }
-
- private:
-  void Execute() /*final override*/ {
-      ExecutionProgress progress(this);
-      Execute(progress);
-  }
-
-  void SendProgress_(const T *data, size_t size) {
-    T *new_data = new T[size];
-    {
-      T *it = new_data;
-      std::copy(data, data + size, it);
-    }
-
-    uv_mutex_lock(&async_lock);
-    T *old_data = asyncdata_;
-    asyncdata_ = new_data;
-    asyncsize_ = size;
-    uv_mutex_unlock(&async_lock);
-
-    delete[] old_data;
-    uv_async_send(async);
-  }
-
-  inline static NAUV_WORK_CB(AsyncProgress_) {
-    AsyncProgressWorkerBase *worker =
-            static_cast<AsyncProgressWorkerBase*>(async->data);
-    worker->WorkProgress();
-  }
-
-  inline static void AsyncClose_(uv_handle_t* handle) {
-    AsyncProgressWorkerBase *worker =
-            static_cast<AsyncProgressWorkerBase*>(handle->data);
-    delete reinterpret_cast<uv_async_t*>(handle);
-    delete worker;
-  }
-
-  uv_async_t *async;
-  uv_mutex_t async_lock;
-  T *asyncdata_;
-  size_t asyncsize_;
-};
-
-// This ensures compatibility to the previous un-templated AsyncProgressWorker
-// class definition.
-typedef AsyncProgressWorkerBase<char> AsyncProgressWorker;
-
-inline void AsyncExecute (uv_work_t* req) {
-  AsyncWorker *worker = static_cast<AsyncWorker*>(req->data);
-  worker->Execute();
-}
-
-inline void AsyncExecuteComplete (uv_work_t* req) {
-  AsyncWorker* worker = static_cast<AsyncWorker*>(req->data);
-  worker->WorkComplete();
-  worker->Destroy();
-}
-
-inline void AsyncQueueWorker (AsyncWorker* worker) {
-  uv_queue_work(
-      uv_default_loop()
-    , &worker->request
-    , AsyncExecute
-    , reinterpret_cast<uv_after_work_cb>(AsyncExecuteComplete)
-  );
-}
-
-namespace imp {
-
-inline
-ExternalOneByteStringResource const*
-GetExternalResource(v8::Local<v8::String> str) {
-#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION
-    return str->GetExternalAsciiStringResource();
-#else
-    return str->GetExternalOneByteStringResource();
-#endif
-}
-
-inline
-bool
-IsExternal(v8::Local<v8::String> str) {
-#if NODE_MODULE_VERSION < ATOM_0_21_MODULE_VERSION
-    return str->IsExternalAscii();
-#else
-    return str->IsExternalOneByte();
-#endif
-}
-
-}  // end of namespace imp
-
-enum Encoding {ASCII, UTF8, BASE64, UCS2, BINARY, HEX, BUFFER};
-
-#if NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION
-# include "nan_string_bytes.h"  // NOLINT(build/include)
-#endif
-
-inline v8::Local<v8::Value> Encode(
-    const void *buf, size_t len, enum Encoding encoding = BINARY) {
-#if (NODE_MODULE_VERSION >= ATOM_0_21_MODULE_VERSION)
-  v8::Isolate* isolate = v8::Isolate::GetCurrent();
-  node::encoding node_enc = static_cast<node::encoding>(encoding);
-
-  if (encoding == UCS2) {
-    return node::Encode(
-        isolate
-      , reinterpret_cast<const uint16_t *>(buf)
-      , len / 2);
-  } else {
-    return node::Encode(
-        isolate
-      , reinterpret_cast<const char *>(buf)
-      , len
-      , node_enc);
-  }
-#elif (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
-  return node::Encode(
-      v8::Isolate::GetCurrent()
-    , buf, len
-    , static_cast<node::encoding>(encoding));
-#else
-# if NODE_MODULE_VERSION >= NODE_0_10_MODULE_VERSION
-  return node::Encode(buf, len, static_cast<node::encoding>(encoding));
-# else
-  return imp::Encode(reinterpret_cast<const char*>(buf), len, encoding);
-# endif
-#endif
-}
-
-inline ssize_t DecodeBytes(
-    v8::Local<v8::Value> val, enum Encoding encoding = BINARY) {
-#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
-  return node::DecodeBytes(
-      v8::Isolate::GetCurrent()
-    , val
-    , static_cast<node::encoding>(encoding));
-#else
-# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION)
-  if (encoding == BUFFER) {
-    return node::DecodeBytes(val, node::BINARY);
-  }
-# endif
-  return node::DecodeBytes(val, static_cast<node::encoding>(encoding));
-#endif
-}
-
-inline ssize_t DecodeWrite(
-    char *buf
-  , size_t len
-  , v8::Local<v8::Value> val
-  , enum Encoding encoding = BINARY) {
-#if (NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION)
-  return node::DecodeWrite(
-      v8::Isolate::GetCurrent()
-    , buf
-    , len
-    , val
-    , static_cast<node::encoding>(encoding));
-#else
-# if (NODE_MODULE_VERSION < NODE_0_10_MODULE_VERSION)
-  if (encoding == BUFFER) {
-    return node::DecodeWrite(buf, len, val, node::BINARY);
-  }
-# endif
-  return node::DecodeWrite(
-      buf
-    , len
-    , val
-    , static_cast<node::encoding>(encoding));
-#endif
-}
-
-inline void SetPrototypeTemplate(
-    v8::Local<v8::FunctionTemplate> templ
-  , const char *name
-  , v8::Local<v8::Data> value
-) {
-  SetTemplate(templ->PrototypeTemplate(), name, value);
-}
-
-inline void SetPrototypeTemplate(
-    v8::Local<v8::FunctionTemplate> templ
-  , v8::Local<v8::String> name
-  , v8::Local<v8::Data> value
-  , v8::PropertyAttribute attributes
-) {
-  SetTemplate(templ->PrototypeTemplate(), name, value, attributes);
-}
-
-inline void SetInstanceTemplate(
-    v8::Local<v8::FunctionTemplate> templ
-  , const char *name
-  , v8::Local<v8::Data> value
-) {
-  SetTemplate(templ->InstanceTemplate(), name, value);
-}
-
-inline void SetInstanceTemplate(
-    v8::Local<v8::FunctionTemplate> templ
-  , v8::Local<v8::String> name
-  , v8::Local<v8::Data> value
-  , v8::PropertyAttribute attributes
-) {
-  SetTemplate(templ->InstanceTemplate(), name, value, attributes);
-}
-
-namespace imp {
-
-// Note(@agnat): Helper to distinguish different receiver types. The first
-// version deals with receivers derived from v8::Template. The second version
-// handles everything else. The final argument only serves as discriminator and
-// is unused.
-template <typename T>
-inline
-void
-SetMethodAux(T recv,
-             v8::Local<v8::String> name,
-             v8::Local<v8::FunctionTemplate> tpl,
-             v8::Template *) {
-  recv->Set(name, tpl);
-}
-
-template <typename T>
-inline
-void
-SetMethodAux(T recv,
-             v8::Local<v8::String> name,
-             v8::Local<v8::FunctionTemplate> tpl,
-             ...) {
-  recv->Set(name, GetFunction(tpl).ToLocalChecked());
-}
-
-}  // end of namespace imp
-
-template <typename T, template <typename> class HandleType>
-inline void SetMethod(
-    HandleType<T> recv
-  , const char *name
-  , FunctionCallback callback) {
-  HandleScope scope;
-  v8::Local<v8::FunctionTemplate> t = New<v8::FunctionTemplate>(callback);
-  v8::Local<v8::String> fn_name = New(name).ToLocalChecked();
-  t->SetClassName(fn_name);
-  // Note(@agnat): Pass an empty T* as discriminator. See note on
-  // SetMethodAux(...) above
-  imp::SetMethodAux(recv, fn_name, t, static_cast<T*>(0));
-}
-
-inline void SetPrototypeMethod(
-    v8::Local<v8::FunctionTemplate> recv
-  , const char* name, FunctionCallback callback) {
-  HandleScope scope;
-  v8::Local<v8::FunctionTemplate> t = New<v8::FunctionTemplate>(
-      callback
-    , v8::Local<v8::Value>()
-    , New<v8::Signature>(recv));
-  v8::Local<v8::String> fn_name = New(name).ToLocalChecked();
-  recv->PrototypeTemplate()->Set(fn_name, t);
-  t->SetClassName(fn_name);
-}
-
-//=== Accessors and Such =======================================================
-
-inline void SetAccessor(
-    v8::Local<v8::ObjectTemplate> tpl
-  , v8::Local<v8::String> name
-  , GetterCallback getter
-  , SetterCallback setter = 0
-  , v8::Local<v8::Value> data = v8::Local<v8::Value>()
-  , v8::AccessControl settings = v8::DEFAULT
-  , v8::PropertyAttribute attribute = v8::None
-  , imp::Sig signature = imp::Sig()) {
-  HandleScope scope;
-
-  imp::NativeGetter getter_ =
-      imp::GetterCallbackWrapper;
-  imp::NativeSetter setter_ =
-      setter ? imp::SetterCallbackWrapper : 0;
-
-  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
-  otpl->SetInternalFieldCount(imp::kAccessorFieldCount);
-  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
-
-  obj->SetInternalField(
-      imp::kGetterIndex
-    , New<v8::External>(reinterpret_cast<void *>(getter)));
-
-  if (setter != 0) {
-    obj->SetInternalField(
-        imp::kSetterIndex
-      , New<v8::External>(reinterpret_cast<void *>(setter)));
-  }
-
-  if (!data.IsEmpty()) {
-    obj->SetInternalField(imp::kDataIndex, data);
-  }
-
-  tpl->SetAccessor(
-      name
-    , getter_
-    , setter_
-    , obj
-    , settings
-    , attribute
-    , signature);
-}
-
-inline bool SetAccessor(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::String> name
-  , GetterCallback getter
-  , SetterCallback setter = 0
-  , v8::Local<v8::Value> data = v8::Local<v8::Value>()
-  , v8::AccessControl settings = v8::DEFAULT
-  , v8::PropertyAttribute attribute = v8::None) {
-  EscapableHandleScope scope;
-
-  imp::NativeGetter getter_ =
-      imp::GetterCallbackWrapper;
-  imp::NativeSetter setter_ =
-      setter ? imp::SetterCallbackWrapper : 0;
-
-  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
-  otpl->SetInternalFieldCount(imp::kAccessorFieldCount);
-  v8::Local<v8::Object> dataobj = NewInstance(otpl).ToLocalChecked();
-
-  dataobj->SetInternalField(
-      imp::kGetterIndex
-    , New<v8::External>(reinterpret_cast<void *>(getter)));
-
-  if (!data.IsEmpty()) {
-    dataobj->SetInternalField(imp::kDataIndex, data);
-  }
-
-  if (setter) {
-    dataobj->SetInternalField(
-        imp::kSetterIndex
-      , New<v8::External>(reinterpret_cast<void *>(setter)));
-  }
-
-#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION)
-  return obj->SetAccessor(
-      GetCurrentContext()
-    , name
-    , getter_
-    , setter_
-    , dataobj
-    , settings
-    , attribute).FromMaybe(false);
-#else
-  return obj->SetAccessor(
-      name
-    , getter_
-    , setter_
-    , dataobj
-    , settings
-    , attribute);
-#endif
-}
-
-inline void SetNamedPropertyHandler(
-    v8::Local<v8::ObjectTemplate> tpl
-  , PropertyGetterCallback getter
-  , PropertySetterCallback setter = 0
-  , PropertyQueryCallback query = 0
-  , PropertyDeleterCallback deleter = 0
-  , PropertyEnumeratorCallback enumerator = 0
-  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
-  HandleScope scope;
-
-  imp::NativePropertyGetter getter_ =
-      imp::PropertyGetterCallbackWrapper;
-  imp::NativePropertySetter setter_ =
-      setter ? imp::PropertySetterCallbackWrapper : 0;
-  imp::NativePropertyQuery query_ =
-      query ? imp::PropertyQueryCallbackWrapper : 0;
-  imp::NativePropertyDeleter *deleter_ =
-      deleter ? imp::PropertyDeleterCallbackWrapper : 0;
-  imp::NativePropertyEnumerator enumerator_ =
-      enumerator ? imp::PropertyEnumeratorCallbackWrapper : 0;
-
-  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
-  otpl->SetInternalFieldCount(imp::kPropertyFieldCount);
-  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
-  obj->SetInternalField(
-      imp::kPropertyGetterIndex
-    , New<v8::External>(reinterpret_cast<void *>(getter)));
-
-  if (setter) {
-    obj->SetInternalField(
-        imp::kPropertySetterIndex
-      , New<v8::External>(reinterpret_cast<void *>(setter)));
-  }
-
-  if (query) {
-    obj->SetInternalField(
-        imp::kPropertyQueryIndex
-      , New<v8::External>(reinterpret_cast<void *>(query)));
-  }
-
-  if (deleter) {
-    obj->SetInternalField(
-        imp::kPropertyDeleterIndex
-      , New<v8::External>(reinterpret_cast<void *>(deleter)));
-  }
-
-  if (enumerator) {
-    obj->SetInternalField(
-        imp::kPropertyEnumeratorIndex
-      , New<v8::External>(reinterpret_cast<void *>(enumerator)));
-  }
-
-  if (!data.IsEmpty()) {
-    obj->SetInternalField(imp::kDataIndex, data);
-  }
-
-#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
-  tpl->SetHandler(v8::NamedPropertyHandlerConfiguration(
-      getter_, setter_, query_, deleter_, enumerator_, obj));
-#else
-  tpl->SetNamedPropertyHandler(
-      getter_
-    , setter_
-    , query_
-    , deleter_
-    , enumerator_
-    , obj);
-#endif
-}
-
-inline void SetIndexedPropertyHandler(
-    v8::Local<v8::ObjectTemplate> tpl
-  , IndexGetterCallback getter
-  , IndexSetterCallback setter = 0
-  , IndexQueryCallback query = 0
-  , IndexDeleterCallback deleter = 0
-  , IndexEnumeratorCallback enumerator = 0
-  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
-  HandleScope scope;
-
-  imp::NativeIndexGetter getter_ =
-      imp::IndexGetterCallbackWrapper;
-  imp::NativeIndexSetter setter_ =
-      setter ? imp::IndexSetterCallbackWrapper : 0;
-  imp::NativeIndexQuery query_ =
-      query ? imp::IndexQueryCallbackWrapper : 0;
-  imp::NativeIndexDeleter deleter_ =
-      deleter ? imp::IndexDeleterCallbackWrapper : 0;
-  imp::NativeIndexEnumerator enumerator_ =
-      enumerator ? imp::IndexEnumeratorCallbackWrapper : 0;
-
-  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
-  otpl->SetInternalFieldCount(imp::kIndexPropertyFieldCount);
-  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
-  obj->SetInternalField(
-      imp::kIndexPropertyGetterIndex
-    , New<v8::External>(reinterpret_cast<void *>(getter)));
-
-  if (setter) {
-    obj->SetInternalField(
-        imp::kIndexPropertySetterIndex
-      , New<v8::External>(reinterpret_cast<void *>(setter)));
-  }
-
-  if (query) {
-    obj->SetInternalField(
-        imp::kIndexPropertyQueryIndex
-      , New<v8::External>(reinterpret_cast<void *>(query)));
-  }
-
-  if (deleter) {
-    obj->SetInternalField(
-        imp::kIndexPropertyDeleterIndex
-      , New<v8::External>(reinterpret_cast<void *>(deleter)));
-  }
-
-  if (enumerator) {
-    obj->SetInternalField(
-        imp::kIndexPropertyEnumeratorIndex
-      , New<v8::External>(reinterpret_cast<void *>(enumerator)));
-  }
-
-  if (!data.IsEmpty()) {
-    obj->SetInternalField(imp::kDataIndex, data);
-  }
-
-#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
-  tpl->SetHandler(v8::IndexedPropertyHandlerConfiguration(
-      getter_, setter_, query_, deleter_, enumerator_, obj));
-#else
-  tpl->SetIndexedPropertyHandler(
-      getter_
-    , setter_
-    , query_
-    , deleter_
-    , enumerator_
-    , obj);
-#endif
-}
-
-inline void SetCallHandler(
-    v8::Local<v8::FunctionTemplate> tpl
-  , FunctionCallback callback
-  , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
-  HandleScope scope;
-
-  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
-  otpl->SetInternalFieldCount(imp::kFunctionFieldCount);
-  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
-
-  obj->SetInternalField(
-      imp::kFunctionIndex
-    , New<v8::External>(reinterpret_cast<void *>(callback)));
-
-  if (!data.IsEmpty()) {
-    obj->SetInternalField(imp::kDataIndex, data);
-  }
-
-  tpl->SetCallHandler(imp::FunctionCallbackWrapper, obj);
-}
-
-
-inline void SetCallAsFunctionHandler(
-    v8::Local<v8::ObjectTemplate> tpl,
-    FunctionCallback callback,
-    v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
-  HandleScope scope;
-
-  v8::Local<v8::ObjectTemplate> otpl = New<v8::ObjectTemplate>();
-  otpl->SetInternalFieldCount(imp::kFunctionFieldCount);
-  v8::Local<v8::Object> obj = NewInstance(otpl).ToLocalChecked();
-
-  obj->SetInternalField(
-      imp::kFunctionIndex
-    , New<v8::External>(reinterpret_cast<void *>(callback)));
-
-  if (!data.IsEmpty()) {
-    obj->SetInternalField(imp::kDataIndex, data);
-  }
-
-  tpl->SetCallAsFunctionHandler(imp::FunctionCallbackWrapper, obj);
-}
-
-//=== Weak Persistent Handling =================================================
-
-#include "nan_weak.h"  // NOLINT(build/include)
-
-//=== ObjectWrap ===============================================================
-
-#include "nan_object_wrap.h"  // NOLINT(build/include)
-
-//=== Export ==================================================================
-
-inline
-void
-Export(ADDON_REGISTER_FUNCTION_ARGS_TYPE target, const char *name,
-    FunctionCallback f) {
-  Set(target, New<v8::String>(name).ToLocalChecked(),
-      GetFunction(New<v8::FunctionTemplate>(f)).ToLocalChecked());
-}
-
-//=== Tap Reverse Binding =====================================================
-
-struct Tap {
-  explicit Tap(v8::Local<v8::Value> t) : t_() {
-    t_.Reset(To<v8::Object>(t).ToLocalChecked());
-  }
-
-  ~Tap() { t_.Reset(); }  // not sure if neccessary
-
-  inline void plan(int i) {
-    v8::Local<v8::Value> arg = New(i);
-    MakeCallback(New(t_), "plan", 1, &arg);
-  }
-
-  inline void ok(bool isOk, const char *msg = NULL) {
-    v8::Local<v8::Value> args[2];
-    args[0] = New(isOk);
-    if (msg) args[1] = New(msg).ToLocalChecked();
-    MakeCallback(New(t_), "ok", msg ? 2 : 1, args);
-  }
-
-  inline void pass(const char * msg = NULL) {
-    v8::Local<v8::Value> hmsg;
-    if (msg) hmsg = New(msg).ToLocalChecked();
-    MakeCallback(New(t_), "pass", msg ? 1 : 0, &hmsg);
-  }
-
- private:
-  Persistent<v8::Object> t_;
-};
-
-#define NAN_STRINGIZE2(x) #x
-#define NAN_STRINGIZE(x) NAN_STRINGIZE2(x)
-#define NAN_TEST_EXPRESSION(expression) \
-  ( expression ), __FILE__ ":" NAN_STRINGIZE(__LINE__) ": " #expression
-
-#define NAN_EXPORT(target, function) Export(target, #function, function)
-
-#undef TYPE_CHECK
-
-//=== Generic Maybefication ===================================================
-
-namespace imp {
-
-template <typename T> struct Maybefier;
-
-template <typename T> struct Maybefier<v8::Local<T> > {
-  static MaybeLocal<T> convert(v8::Local<T> v) {
-    return MaybeLocal<T>(v);
-  }
-};
-
-template <typename T> struct Maybefier<MaybeLocal<T> > {
-  static MaybeLocal<T> convert(MaybeLocal<T> v) {
-    return v;
-  }
-};
-
-}  // end of namespace imp
-
-template <typename T, template <typename> class MaybeMaybe>
-MaybeLocal<T>
-MakeMaybe(MaybeMaybe<T> v) {
-  return imp::Maybefier<MaybeMaybe<T> >::convert(v);
-}
-
-//=== TypedArrayContents =======================================================
-
-#include "nan_typedarray_contents.h"  // NOLINT(build/include)
-
-}  // end of namespace Nan
-
-#endif  // NAN_H_
diff --git a/js/node_modules/nan/nan_callbacks.h b/js/node_modules/nan/nan_callbacks.h
deleted file mode 100644
index 851509fdef51a6e72f08f6824874bdb1708de2ad..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_callbacks.h
+++ /dev/null
@@ -1,88 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_CALLBACKS_H_
-#define NAN_CALLBACKS_H_
-
-template<typename T> class FunctionCallbackInfo;
-template<typename T> class PropertyCallbackInfo;
-template<typename T> class Global;
-
-typedef void(*FunctionCallback)(const FunctionCallbackInfo<v8::Value>&);
-typedef void(*GetterCallback)
-    (v8::Local<v8::String>, const PropertyCallbackInfo<v8::Value>&);
-typedef void(*SetterCallback)(
-    v8::Local<v8::String>,
-    v8::Local<v8::Value>,
-    const PropertyCallbackInfo<void>&);
-typedef void(*PropertyGetterCallback)(
-    v8::Local<v8::String>,
-    const PropertyCallbackInfo<v8::Value>&);
-typedef void(*PropertySetterCallback)(
-    v8::Local<v8::String>,
-    v8::Local<v8::Value>,
-    const PropertyCallbackInfo<v8::Value>&);
-typedef void(*PropertyEnumeratorCallback)
-    (const PropertyCallbackInfo<v8::Array>&);
-typedef void(*PropertyDeleterCallback)(
-    v8::Local<v8::String>,
-    const PropertyCallbackInfo<v8::Boolean>&);
-typedef void(*PropertyQueryCallback)(
-    v8::Local<v8::String>,
-    const PropertyCallbackInfo<v8::Integer>&);
-typedef void(*IndexGetterCallback)(
-    uint32_t,
-    const PropertyCallbackInfo<v8::Value>&);
-typedef void(*IndexSetterCallback)(
-    uint32_t,
-    v8::Local<v8::Value>,
-    const PropertyCallbackInfo<v8::Value>&);
-typedef void(*IndexEnumeratorCallback)
-    (const PropertyCallbackInfo<v8::Array>&);
-typedef void(*IndexDeleterCallback)(
-    uint32_t,
-    const PropertyCallbackInfo<v8::Boolean>&);
-typedef void(*IndexQueryCallback)(
-    uint32_t,
-    const PropertyCallbackInfo<v8::Integer>&);
-
-namespace imp {
-typedef v8::Local<v8::AccessorSignature> Sig;
-
-static const int kDataIndex =                    0;
-
-static const int kFunctionIndex =                1;
-static const int kFunctionFieldCount =           2;
-
-static const int kGetterIndex =                  1;
-static const int kSetterIndex =                  2;
-static const int kAccessorFieldCount =           3;
-
-static const int kPropertyGetterIndex =          1;
-static const int kPropertySetterIndex =          2;
-static const int kPropertyEnumeratorIndex =      3;
-static const int kPropertyDeleterIndex =         4;
-static const int kPropertyQueryIndex =           5;
-static const int kPropertyFieldCount =           6;
-
-static const int kIndexPropertyGetterIndex =     1;
-static const int kIndexPropertySetterIndex =     2;
-static const int kIndexPropertyEnumeratorIndex = 3;
-static const int kIndexPropertyDeleterIndex =    4;
-static const int kIndexPropertyQueryIndex =      5;
-static const int kIndexPropertyFieldCount =      6;
-
-}  // end of namespace imp
-
-#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
-# include "nan_callbacks_12_inl.h"  // NOLINT(build/include)
-#else
-# include "nan_callbacks_pre_12_inl.h"  // NOLINT(build/include)
-#endif
-
-#endif  // NAN_CALLBACKS_H_
diff --git a/js/node_modules/nan/nan_callbacks_12_inl.h b/js/node_modules/nan/nan_callbacks_12_inl.h
deleted file mode 100644
index bea12c71fb36be8d0bceb885936e059bbfc2655b..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_callbacks_12_inl.h
+++ /dev/null
@@ -1,512 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_CALLBACKS_12_INL_H_
-#define NAN_CALLBACKS_12_INL_H_
-
-template<typename T>
-class ReturnValue {
-  v8::ReturnValue<T> value_;
-
- public:
-  template <class S>
-  explicit inline ReturnValue(const v8::ReturnValue<S> &value) :
-      value_(value) {}
-  template <class S>
-  explicit inline ReturnValue(const ReturnValue<S>& that)
-      : value_(that.value_) {
-    TYPE_CHECK(T, S);
-  }
-
-  // Handle setters
-  template <typename S> inline void Set(const v8::Local<S> &handle) {
-    TYPE_CHECK(T, S);
-    value_.Set(handle);
-  }
-
-  template <typename S> inline void Set(const Global<S> &handle) {
-    TYPE_CHECK(T, S);
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) &&                       \
-  (V8_MINOR_VERSION > 5 || (V8_MINOR_VERSION == 5 &&                           \
-  defined(V8_BUILD_NUMBER) && V8_BUILD_NUMBER >= 8))))
-    value_.Set(handle);
-#else
-    value_.Set(*reinterpret_cast<const v8::Persistent<S>*>(&handle));
-    const_cast<Global<S> &>(handle).Reset();
-#endif
-  }
-
-  // Fast primitive setters
-  inline void Set(bool value) {
-    TYPE_CHECK(T, v8::Boolean);
-    value_.Set(value);
-  }
-
-  inline void Set(double i) {
-    TYPE_CHECK(T, v8::Number);
-    value_.Set(i);
-  }
-
-  inline void Set(int32_t i) {
-    TYPE_CHECK(T, v8::Integer);
-    value_.Set(i);
-  }
-
-  inline void Set(uint32_t i) {
-    TYPE_CHECK(T, v8::Integer);
-    value_.Set(i);
-  }
-
-  // Fast JS primitive setters
-  inline void SetNull() {
-    TYPE_CHECK(T, v8::Primitive);
-    value_.SetNull();
-  }
-
-  inline void SetUndefined() {
-    TYPE_CHECK(T, v8::Primitive);
-    value_.SetUndefined();
-  }
-
-  inline void SetEmptyString() {
-    TYPE_CHECK(T, v8::String);
-    value_.SetEmptyString();
-  }
-
-  // Convenience getter for isolate
-  inline v8::Isolate *GetIsolate() const {
-    return value_.GetIsolate();
-  }
-
-  // Pointer setter: Uncompilable to prevent inadvertent misuse.
-  template<typename S>
-  inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); }
-};
-
-template<typename T>
-class FunctionCallbackInfo {
-  const v8::FunctionCallbackInfo<T> &info_;
-  const v8::Local<v8::Value> data_;
-
- public:
-  explicit inline FunctionCallbackInfo(
-      const v8::FunctionCallbackInfo<T> &info
-    , v8::Local<v8::Value> data) :
-          info_(info)
-        , data_(data) {}
-
-  inline ReturnValue<T> GetReturnValue() const {
-    return ReturnValue<T>(info_.GetReturnValue());
-  }
-
-  inline v8::Local<v8::Function> Callee() const { return info_.Callee(); }
-  inline v8::Local<v8::Value> Data() const { return data_; }
-  inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }
-  inline bool IsConstructCall() const { return info_.IsConstructCall(); }
-  inline int Length() const { return info_.Length(); }
-  inline v8::Local<v8::Value> operator[](int i) const { return info_[i]; }
-  inline v8::Local<v8::Object> This() const { return info_.This(); }
-  inline v8::Isolate *GetIsolate() const { return info_.GetIsolate(); }
-
-
- protected:
-  static const int kHolderIndex = 0;
-  static const int kIsolateIndex = 1;
-  static const int kReturnValueDefaultValueIndex = 2;
-  static const int kReturnValueIndex = 3;
-  static const int kDataIndex = 4;
-  static const int kCalleeIndex = 5;
-  static const int kContextSaveIndex = 6;
-  static const int kArgsLength = 7;
-
- private:
-  NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo)
-};
-
-template<typename T>
-class PropertyCallbackInfo {
-  const v8::PropertyCallbackInfo<T> &info_;
-  const v8::Local<v8::Value> data_;
-
- public:
-  explicit inline PropertyCallbackInfo(
-      const v8::PropertyCallbackInfo<T> &info
-    , const v8::Local<v8::Value> data) :
-          info_(info)
-        , data_(data) {}
-
-  inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); }
-  inline v8::Local<v8::Value> Data() const { return data_; }
-  inline v8::Local<v8::Object> This() const { return info_.This(); }
-  inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }
-  inline ReturnValue<T> GetReturnValue() const {
-    return ReturnValue<T>(info_.GetReturnValue());
-  }
-
- protected:
-  static const int kHolderIndex = 0;
-  static const int kIsolateIndex = 1;
-  static const int kReturnValueDefaultValueIndex = 2;
-  static const int kReturnValueIndex = 3;
-  static const int kDataIndex = 4;
-  static const int kThisIndex = 5;
-  static const int kArgsLength = 6;
-
- private:
-  NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfo)
-};
-
-namespace imp {
-static
-void FunctionCallbackWrapper(const v8::FunctionCallbackInfo<v8::Value> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  FunctionCallback callback = reinterpret_cast<FunctionCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kFunctionIndex).As<v8::External>()->Value()));
-  FunctionCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  callback(cbinfo);
-}
-
-typedef void (*NativeFunction)(const v8::FunctionCallbackInfo<v8::Value> &);
-
-#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
-static
-void GetterCallbackWrapper(
-    v8::Local<v8::Name> property
-  , const v8::PropertyCallbackInfo<v8::Value> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  GetterCallback callback = reinterpret_cast<GetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kGetterIndex).As<v8::External>()->Value()));
-  callback(property.As<v8::String>(), cbinfo);
-}
-
-typedef void (*NativeGetter)
-    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value> &);
-
-static
-void SetterCallbackWrapper(
-    v8::Local<v8::Name> property
-  , v8::Local<v8::Value> value
-  , const v8::PropertyCallbackInfo<void> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<void>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  SetterCallback callback = reinterpret_cast<SetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kSetterIndex).As<v8::External>()->Value()));
-  callback(property.As<v8::String>(), value, cbinfo);
-}
-
-typedef void (*NativeSetter)(
-    v8::Local<v8::Name>
-  , v8::Local<v8::Value>
-  , const v8::PropertyCallbackInfo<void> &);
-#else
-static
-void GetterCallbackWrapper(
-    v8::Local<v8::String> property
-  , const v8::PropertyCallbackInfo<v8::Value> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  GetterCallback callback = reinterpret_cast<GetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kGetterIndex).As<v8::External>()->Value()));
-  callback(property, cbinfo);
-}
-
-typedef void (*NativeGetter)
-    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Value> &);
-
-static
-void SetterCallbackWrapper(
-    v8::Local<v8::String> property
-  , v8::Local<v8::Value> value
-  , const v8::PropertyCallbackInfo<void> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<void>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  SetterCallback callback = reinterpret_cast<SetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kSetterIndex).As<v8::External>()->Value()));
-  callback(property, value, cbinfo);
-}
-
-typedef void (*NativeSetter)(
-    v8::Local<v8::String>
-  , v8::Local<v8::Value>
-  , const v8::PropertyCallbackInfo<void> &);
-#endif
-
-#if NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
-static
-void PropertyGetterCallbackWrapper(
-    v8::Local<v8::Name> property
-  , const v8::PropertyCallbackInfo<v8::Value> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyGetterIndex)
-              .As<v8::External>()->Value()));
-  callback(property.As<v8::String>(), cbinfo);
-}
-
-typedef void (*NativePropertyGetter)
-    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Value> &);
-
-static
-void PropertySetterCallbackWrapper(
-    v8::Local<v8::Name> property
-  , v8::Local<v8::Value> value
-  , const v8::PropertyCallbackInfo<v8::Value> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertySetterIndex)
-              .As<v8::External>()->Value()));
-  callback(property.As<v8::String>(), value, cbinfo);
-}
-
-typedef void (*NativePropertySetter)(
-    v8::Local<v8::Name>
-  , v8::Local<v8::Value>
-  , const v8::PropertyCallbackInfo<v8::Value> &);
-
-static
-void PropertyEnumeratorCallbackWrapper(
-    const v8::PropertyCallbackInfo<v8::Array> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Array>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyEnumeratorCallback callback =
-      reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyEnumeratorIndex)
-              .As<v8::External>()->Value()));
-  callback(cbinfo);
-}
-
-typedef void (*NativePropertyEnumerator)
-    (const v8::PropertyCallbackInfo<v8::Array> &);
-
-static
-void PropertyDeleterCallbackWrapper(
-    v8::Local<v8::Name> property
-  , const v8::PropertyCallbackInfo<v8::Boolean> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Boolean>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyDeleterIndex)
-              .As<v8::External>()->Value()));
-  callback(property.As<v8::String>(), cbinfo);
-}
-
-typedef void (NativePropertyDeleter)
-    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Boolean> &);
-
-static
-void PropertyQueryCallbackWrapper(
-    v8::Local<v8::Name> property
-  , const v8::PropertyCallbackInfo<v8::Integer> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Integer>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyQueryIndex)
-              .As<v8::External>()->Value()));
-  callback(property.As<v8::String>(), cbinfo);
-}
-
-typedef void (*NativePropertyQuery)
-    (v8::Local<v8::Name>, const v8::PropertyCallbackInfo<v8::Integer> &);
-#else
-static
-void PropertyGetterCallbackWrapper(
-    v8::Local<v8::String> property
-  , const v8::PropertyCallbackInfo<v8::Value> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyGetterIndex)
-              .As<v8::External>()->Value()));
-  callback(property, cbinfo);
-}
-
-typedef void (*NativePropertyGetter)
-    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Value> &);
-
-static
-void PropertySetterCallbackWrapper(
-    v8::Local<v8::String> property
-  , v8::Local<v8::Value> value
-  , const v8::PropertyCallbackInfo<v8::Value> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertySetterIndex)
-              .As<v8::External>()->Value()));
-  callback(property, value, cbinfo);
-}
-
-typedef void (*NativePropertySetter)(
-    v8::Local<v8::String>
-  , v8::Local<v8::Value>
-  , const v8::PropertyCallbackInfo<v8::Value> &);
-
-static
-void PropertyEnumeratorCallbackWrapper(
-    const v8::PropertyCallbackInfo<v8::Array> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Array>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyEnumeratorCallback callback =
-      reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyEnumeratorIndex)
-              .As<v8::External>()->Value()));
-  callback(cbinfo);
-}
-
-typedef void (*NativePropertyEnumerator)
-    (const v8::PropertyCallbackInfo<v8::Array> &);
-
-static
-void PropertyDeleterCallbackWrapper(
-    v8::Local<v8::String> property
-  , const v8::PropertyCallbackInfo<v8::Boolean> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Boolean>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyDeleterIndex)
-              .As<v8::External>()->Value()));
-  callback(property, cbinfo);
-}
-
-typedef void (NativePropertyDeleter)
-    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Boolean> &);
-
-static
-void PropertyQueryCallbackWrapper(
-    v8::Local<v8::String> property
-  , const v8::PropertyCallbackInfo<v8::Integer> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Integer>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyQueryIndex)
-              .As<v8::External>()->Value()));
-  callback(property, cbinfo);
-}
-
-typedef void (*NativePropertyQuery)
-    (v8::Local<v8::String>, const v8::PropertyCallbackInfo<v8::Integer> &);
-#endif
-
-static
-void IndexGetterCallbackWrapper(
-    uint32_t index, const v8::PropertyCallbackInfo<v8::Value> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  IndexGetterCallback callback = reinterpret_cast<IndexGetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kIndexPropertyGetterIndex)
-              .As<v8::External>()->Value()));
-  callback(index, cbinfo);
-}
-
-typedef void (*NativeIndexGetter)
-    (uint32_t, const v8::PropertyCallbackInfo<v8::Value> &);
-
-static
-void IndexSetterCallbackWrapper(
-    uint32_t index
-  , v8::Local<v8::Value> value
-  , const v8::PropertyCallbackInfo<v8::Value> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  IndexSetterCallback callback = reinterpret_cast<IndexSetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kIndexPropertySetterIndex)
-              .As<v8::External>()->Value()));
-  callback(index, value, cbinfo);
-}
-
-typedef void (*NativeIndexSetter)(
-    uint32_t
-  , v8::Local<v8::Value>
-  , const v8::PropertyCallbackInfo<v8::Value> &);
-
-static
-void IndexEnumeratorCallbackWrapper(
-    const v8::PropertyCallbackInfo<v8::Array> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Array>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  IndexEnumeratorCallback callback = reinterpret_cast<IndexEnumeratorCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(
-              kIndexPropertyEnumeratorIndex).As<v8::External>()->Value()));
-  callback(cbinfo);
-}
-
-typedef void (*NativeIndexEnumerator)
-    (const v8::PropertyCallbackInfo<v8::Array> &);
-
-static
-void IndexDeleterCallbackWrapper(
-    uint32_t index, const v8::PropertyCallbackInfo<v8::Boolean> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Boolean>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  IndexDeleterCallback callback = reinterpret_cast<IndexDeleterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kIndexPropertyDeleterIndex)
-              .As<v8::External>()->Value()));
-  callback(index, cbinfo);
-}
-
-typedef void (*NativeIndexDeleter)
-    (uint32_t, const v8::PropertyCallbackInfo<v8::Boolean> &);
-
-static
-void IndexQueryCallbackWrapper(
-    uint32_t index, const v8::PropertyCallbackInfo<v8::Integer> &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Integer>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  IndexQueryCallback callback = reinterpret_cast<IndexQueryCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kIndexPropertyQueryIndex)
-              .As<v8::External>()->Value()));
-  callback(index, cbinfo);
-}
-
-typedef void (*NativeIndexQuery)
-    (uint32_t, const v8::PropertyCallbackInfo<v8::Integer> &);
-}  // end of namespace imp
-
-#endif  // NAN_CALLBACKS_12_INL_H_
diff --git a/js/node_modules/nan/nan_callbacks_pre_12_inl.h b/js/node_modules/nan/nan_callbacks_pre_12_inl.h
deleted file mode 100644
index 5e2b8e2b2a363bbc1a07735c0448e6da3e12b07e..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_callbacks_pre_12_inl.h
+++ /dev/null
@@ -1,506 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_CALLBACKS_PRE_12_INL_H_
-#define NAN_CALLBACKS_PRE_12_INL_H_
-
-namespace imp {
-template<typename T> class ReturnValueImp;
-}  // end of namespace imp
-
-template<typename T>
-class ReturnValue {
-  v8::Isolate *isolate_;
-  v8::Persistent<T> *value_;
-  friend class imp::ReturnValueImp<T>;
-
- public:
-  template <class S>
-  explicit inline ReturnValue(v8::Isolate *isolate, v8::Persistent<S> *p) :
-      isolate_(isolate), value_(p) {}
-  template <class S>
-  explicit inline ReturnValue(const ReturnValue<S>& that)
-      : isolate_(that.isolate_), value_(that.value_) {
-    TYPE_CHECK(T, S);
-  }
-
-  // Handle setters
-  template <typename S> inline void Set(const v8::Local<S> &handle) {
-    TYPE_CHECK(T, S);
-    value_->Dispose();
-    *value_ = v8::Persistent<T>::New(handle);
-  }
-
-  template <typename S> inline void Set(const Global<S> &handle) {
-    TYPE_CHECK(T, S);
-    value_->Dispose();
-    *value_ = v8::Persistent<T>::New(handle.persistent);
-    const_cast<Global<S> &>(handle).Reset();
-  }
-
-  // Fast primitive setters
-  inline void Set(bool value) {
-    TYPE_CHECK(T, v8::Boolean);
-    value_->Dispose();
-    *value_ = v8::Persistent<T>::New(v8::Boolean::New(value));
-  }
-
-  inline void Set(double i) {
-    TYPE_CHECK(T, v8::Number);
-    value_->Dispose();
-    *value_ = v8::Persistent<T>::New(v8::Number::New(i));
-  }
-
-  inline void Set(int32_t i) {
-    TYPE_CHECK(T, v8::Integer);
-    value_->Dispose();
-    *value_ = v8::Persistent<T>::New(v8::Int32::New(i));
-  }
-
-  inline void Set(uint32_t i) {
-    TYPE_CHECK(T, v8::Integer);
-    value_->Dispose();
-    *value_ = v8::Persistent<T>::New(v8::Uint32::NewFromUnsigned(i));
-  }
-
-  // Fast JS primitive setters
-  inline void SetNull() {
-    TYPE_CHECK(T, v8::Primitive);
-    value_->Dispose();
-    *value_ = v8::Persistent<T>::New(v8::Null());
-  }
-
-  inline void SetUndefined() {
-    TYPE_CHECK(T, v8::Primitive);
-    value_->Dispose();
-    *value_ = v8::Persistent<T>::New(v8::Undefined());
-  }
-
-  inline void SetEmptyString() {
-    TYPE_CHECK(T, v8::String);
-    value_->Dispose();
-    *value_ = v8::Persistent<T>::New(v8::String::Empty());
-  }
-
-  // Convenience getter for isolate
-  inline v8::Isolate *GetIsolate() const {
-    return isolate_;
-  }
-
-  // Pointer setter: Uncompilable to prevent inadvertent misuse.
-  template<typename S>
-  inline void Set(S *whatever) { TYPE_CHECK(S*, v8::Primitive); }
-};
-
-template<typename T>
-class FunctionCallbackInfo {
-  const v8::Arguments &args_;
-  v8::Local<v8::Value> data_;
-  ReturnValue<T> return_value_;
-  v8::Persistent<T> retval_;
-
- public:
-  explicit inline FunctionCallbackInfo(
-      const v8::Arguments &args
-    , v8::Local<v8::Value> data) :
-          args_(args)
-        , data_(data)
-        , return_value_(args.GetIsolate(), &retval_)
-        , retval_(v8::Persistent<T>::New(v8::Undefined())) {}
-
-  inline ~FunctionCallbackInfo() {
-    retval_.Dispose();
-    retval_.Clear();
-  }
-
-  inline ReturnValue<T> GetReturnValue() const {
-    return ReturnValue<T>(return_value_);
-  }
-
-  inline v8::Local<v8::Function> Callee() const { return args_.Callee(); }
-  inline v8::Local<v8::Value> Data() const { return data_; }
-  inline v8::Local<v8::Object> Holder() const { return args_.Holder(); }
-  inline bool IsConstructCall() const { return args_.IsConstructCall(); }
-  inline int Length() const { return args_.Length(); }
-  inline v8::Local<v8::Value> operator[](int i) const { return args_[i]; }
-  inline v8::Local<v8::Object> This() const { return args_.This(); }
-  inline v8::Isolate *GetIsolate() const { return args_.GetIsolate(); }
-
-
- protected:
-  static const int kHolderIndex = 0;
-  static const int kIsolateIndex = 1;
-  static const int kReturnValueDefaultValueIndex = 2;
-  static const int kReturnValueIndex = 3;
-  static const int kDataIndex = 4;
-  static const int kCalleeIndex = 5;
-  static const int kContextSaveIndex = 6;
-  static const int kArgsLength = 7;
-
- private:
-  NAN_DISALLOW_ASSIGN_COPY_MOVE(FunctionCallbackInfo)
-};
-
-template<typename T>
-class PropertyCallbackInfoBase {
-  const v8::AccessorInfo &info_;
-  const v8::Local<v8::Value> data_;
-
- public:
-  explicit inline PropertyCallbackInfoBase(
-      const v8::AccessorInfo &info
-    , const v8::Local<v8::Value> data) :
-          info_(info)
-        , data_(data) {}
-
-  inline v8::Isolate* GetIsolate() const { return info_.GetIsolate(); }
-  inline v8::Local<v8::Value> Data() const { return data_; }
-  inline v8::Local<v8::Object> This() const { return info_.This(); }
-  inline v8::Local<v8::Object> Holder() const { return info_.Holder(); }
-
- protected:
-  static const int kHolderIndex = 0;
-  static const int kIsolateIndex = 1;
-  static const int kReturnValueDefaultValueIndex = 2;
-  static const int kReturnValueIndex = 3;
-  static const int kDataIndex = 4;
-  static const int kThisIndex = 5;
-  static const int kArgsLength = 6;
-
- private:
-  NAN_DISALLOW_ASSIGN_COPY_MOVE(PropertyCallbackInfoBase)
-};
-
-template<typename T>
-class PropertyCallbackInfo : public PropertyCallbackInfoBase<T> {
-  ReturnValue<T> return_value_;
-  v8::Persistent<T> retval_;
-
- public:
-  explicit inline PropertyCallbackInfo(
-      const v8::AccessorInfo &info
-    , const v8::Local<v8::Value> data) :
-          PropertyCallbackInfoBase<T>(info, data)
-        , return_value_(info.GetIsolate(), &retval_)
-        , retval_(v8::Persistent<T>::New(v8::Undefined())) {}
-
-  inline ~PropertyCallbackInfo() {
-    retval_.Dispose();
-    retval_.Clear();
-  }
-
-  inline ReturnValue<T> GetReturnValue() const { return return_value_; }
-};
-
-template<>
-class PropertyCallbackInfo<v8::Array> :
-    public PropertyCallbackInfoBase<v8::Array> {
-  ReturnValue<v8::Array> return_value_;
-  v8::Persistent<v8::Array> retval_;
-
- public:
-  explicit inline PropertyCallbackInfo(
-      const v8::AccessorInfo &info
-    , const v8::Local<v8::Value> data) :
-          PropertyCallbackInfoBase<v8::Array>(info, data)
-        , return_value_(info.GetIsolate(), &retval_)
-        , retval_(v8::Persistent<v8::Array>::New(v8::Local<v8::Array>())) {}
-
-  inline ~PropertyCallbackInfo() {
-    retval_.Dispose();
-    retval_.Clear();
-  }
-
-  inline ReturnValue<v8::Array> GetReturnValue() const {
-    return return_value_;
-  }
-};
-
-template<>
-class PropertyCallbackInfo<v8::Boolean> :
-    public PropertyCallbackInfoBase<v8::Boolean> {
-  ReturnValue<v8::Boolean> return_value_;
-  v8::Persistent<v8::Boolean> retval_;
-
- public:
-  explicit inline PropertyCallbackInfo(
-      const v8::AccessorInfo &info
-    , const v8::Local<v8::Value> data) :
-          PropertyCallbackInfoBase<v8::Boolean>(info, data)
-        , return_value_(info.GetIsolate(), &retval_)
-        , retval_(v8::Persistent<v8::Boolean>::New(v8::Local<v8::Boolean>())) {}
-
-  inline ~PropertyCallbackInfo() {
-    retval_.Dispose();
-    retval_.Clear();
-  }
-
-  inline ReturnValue<v8::Boolean> GetReturnValue() const {
-    return return_value_;
-  }
-};
-
-template<>
-class PropertyCallbackInfo<v8::Integer> :
-    public PropertyCallbackInfoBase<v8::Integer> {
-  ReturnValue<v8::Integer> return_value_;
-  v8::Persistent<v8::Integer> retval_;
-
- public:
-  explicit inline PropertyCallbackInfo(
-      const v8::AccessorInfo &info
-    , const v8::Local<v8::Value> data) :
-          PropertyCallbackInfoBase<v8::Integer>(info, data)
-        , return_value_(info.GetIsolate(), &retval_)
-        , retval_(v8::Persistent<v8::Integer>::New(v8::Local<v8::Integer>())) {}
-
-  inline ~PropertyCallbackInfo() {
-    retval_.Dispose();
-    retval_.Clear();
-  }
-
-  inline ReturnValue<v8::Integer> GetReturnValue() const {
-    return return_value_;
-  }
-};
-
-namespace imp {
-template<typename T>
-class ReturnValueImp : public ReturnValue<T> {
- public:
-  explicit ReturnValueImp(ReturnValue<T> that) :
-      ReturnValue<T>(that) {}
-  inline v8::Handle<T> Value() {
-      return *ReturnValue<T>::value_;
-  }
-};
-
-static
-v8::Handle<v8::Value> FunctionCallbackWrapper(const v8::Arguments &args) {
-  v8::Local<v8::Object> obj = args.Data().As<v8::Object>();
-  FunctionCallback callback = reinterpret_cast<FunctionCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kFunctionIndex).As<v8::External>()->Value()));
-  FunctionCallbackInfo<v8::Value>
-      cbinfo(args, obj->GetInternalField(kDataIndex));
-  callback(cbinfo);
-  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Value> (*NativeFunction)(const v8::Arguments &);
-
-static
-v8::Handle<v8::Value> GetterCallbackWrapper(
-    v8::Local<v8::String> property, const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  GetterCallback callback = reinterpret_cast<GetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kGetterIndex).As<v8::External>()->Value()));
-  callback(property, cbinfo);
-  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Value> (*NativeGetter)
-    (v8::Local<v8::String>, const v8::AccessorInfo &);
-
-static
-void SetterCallbackWrapper(
-    v8::Local<v8::String> property
-  , v8::Local<v8::Value> value
-  , const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<void>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  SetterCallback callback = reinterpret_cast<SetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kSetterIndex).As<v8::External>()->Value()));
-  callback(property, value, cbinfo);
-}
-
-typedef void (*NativeSetter)
-    (v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &);
-
-static
-v8::Handle<v8::Value> PropertyGetterCallbackWrapper(
-    v8::Local<v8::String> property, const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyGetterCallback callback = reinterpret_cast<PropertyGetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyGetterIndex)
-              .As<v8::External>()->Value()));
-  callback(property, cbinfo);
-  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Value> (*NativePropertyGetter)
-    (v8::Local<v8::String>, const v8::AccessorInfo &);
-
-static
-v8::Handle<v8::Value> PropertySetterCallbackWrapper(
-    v8::Local<v8::String> property
-  , v8::Local<v8::Value> value
-  , const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertySetterCallback callback = reinterpret_cast<PropertySetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertySetterIndex)
-              .As<v8::External>()->Value()));
-  callback(property, value, cbinfo);
-  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Value> (*NativePropertySetter)
-    (v8::Local<v8::String>, v8::Local<v8::Value>, const v8::AccessorInfo &);
-
-static
-v8::Handle<v8::Array> PropertyEnumeratorCallbackWrapper(
-    const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Array>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyEnumeratorCallback callback =
-      reinterpret_cast<PropertyEnumeratorCallback>(reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyEnumeratorIndex)
-              .As<v8::External>()->Value()));
-  callback(cbinfo);
-  return ReturnValueImp<v8::Array>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Array> (*NativePropertyEnumerator)
-    (const v8::AccessorInfo &);
-
-static
-v8::Handle<v8::Boolean> PropertyDeleterCallbackWrapper(
-    v8::Local<v8::String> property
-  , const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Boolean>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyDeleterCallback callback = reinterpret_cast<PropertyDeleterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyDeleterIndex)
-              .As<v8::External>()->Value()));
-  callback(property, cbinfo);
-  return ReturnValueImp<v8::Boolean>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Boolean> (NativePropertyDeleter)
-    (v8::Local<v8::String>, const v8::AccessorInfo &);
-
-static
-v8::Handle<v8::Integer> PropertyQueryCallbackWrapper(
-    v8::Local<v8::String> property, const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Integer>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  PropertyQueryCallback callback = reinterpret_cast<PropertyQueryCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kPropertyQueryIndex)
-              .As<v8::External>()->Value()));
-  callback(property, cbinfo);
-  return ReturnValueImp<v8::Integer>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Integer> (*NativePropertyQuery)
-    (v8::Local<v8::String>, const v8::AccessorInfo &);
-
-static
-v8::Handle<v8::Value> IndexGetterCallbackWrapper(
-    uint32_t index, const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  IndexGetterCallback callback = reinterpret_cast<IndexGetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kIndexPropertyGetterIndex)
-              .As<v8::External>()->Value()));
-  callback(index, cbinfo);
-  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Value> (*NativeIndexGetter)
-    (uint32_t, const v8::AccessorInfo &);
-
-static
-v8::Handle<v8::Value> IndexSetterCallbackWrapper(
-    uint32_t index
-  , v8::Local<v8::Value> value
-  , const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Value>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  IndexSetterCallback callback = reinterpret_cast<IndexSetterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kIndexPropertySetterIndex)
-              .As<v8::External>()->Value()));
-  callback(index, value, cbinfo);
-  return ReturnValueImp<v8::Value>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Value> (*NativeIndexSetter)
-    (uint32_t, v8::Local<v8::Value>, const v8::AccessorInfo &);
-
-static
-v8::Handle<v8::Array> IndexEnumeratorCallbackWrapper(
-    const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Array>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  IndexEnumeratorCallback callback = reinterpret_cast<IndexEnumeratorCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kIndexPropertyEnumeratorIndex)
-              .As<v8::External>()->Value()));
-  callback(cbinfo);
-  return ReturnValueImp<v8::Array>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Array> (*NativeIndexEnumerator)
-    (const v8::AccessorInfo &);
-
-static
-v8::Handle<v8::Boolean> IndexDeleterCallbackWrapper(
-    uint32_t index, const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Boolean>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  IndexDeleterCallback callback = reinterpret_cast<IndexDeleterCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kIndexPropertyDeleterIndex)
-              .As<v8::External>()->Value()));
-  callback(index, cbinfo);
-  return ReturnValueImp<v8::Boolean>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Boolean> (*NativeIndexDeleter)
-    (uint32_t, const v8::AccessorInfo &);
-
-static
-v8::Handle<v8::Integer> IndexQueryCallbackWrapper(
-    uint32_t index, const v8::AccessorInfo &info) {
-  v8::Local<v8::Object> obj = info.Data().As<v8::Object>();
-  PropertyCallbackInfo<v8::Integer>
-      cbinfo(info, obj->GetInternalField(kDataIndex));
-  IndexQueryCallback callback = reinterpret_cast<IndexQueryCallback>(
-      reinterpret_cast<intptr_t>(
-          obj->GetInternalField(kIndexPropertyQueryIndex)
-              .As<v8::External>()->Value()));
-  callback(index, cbinfo);
-  return ReturnValueImp<v8::Integer>(cbinfo.GetReturnValue()).Value();
-}
-
-typedef v8::Handle<v8::Integer> (*NativeIndexQuery)
-    (uint32_t, const v8::AccessorInfo &);
-}  // end of namespace imp
-
-#endif  // NAN_CALLBACKS_PRE_12_INL_H_
diff --git a/js/node_modules/nan/nan_converters.h b/js/node_modules/nan/nan_converters.h
deleted file mode 100644
index 7386c3beaa559453e4f7f669f5d5fb7a7f0185f6..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_converters.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_CONVERTERS_H_
-#define NAN_CONVERTERS_H_
-
-namespace imp {
-template<typename T> struct ToFactoryBase {
-  typedef MaybeLocal<T> return_t;
-};
-template<typename T> struct ValueFactoryBase { typedef Maybe<T> return_t; };
-
-template<typename T> struct ToFactory;
-
-#define X(TYPE)                                                                \
-    template<>                                                                 \
-    struct ToFactory<v8::TYPE> : ToFactoryBase<v8::TYPE> {                     \
-      static inline return_t convert(v8::Local<v8::Value> val);                \
-    };
-
-X(Boolean)
-X(Number)
-X(String)
-X(Object)
-X(Integer)
-X(Uint32)
-X(Int32)
-
-#undef X
-
-#define X(TYPE)                                                                \
-    template<>                                                                 \
-    struct ToFactory<TYPE> : ValueFactoryBase<TYPE> {                          \
-      static inline return_t convert(v8::Local<v8::Value> val);                \
-    };
-
-X(bool)
-X(double)
-X(int64_t)
-X(uint32_t)
-X(int32_t)
-
-#undef X
-}  // end of namespace imp
-
-template<typename T>
-inline
-typename imp::ToFactory<T>::return_t To(v8::Local<v8::Value> val) {
-  return imp::ToFactory<T>::convert(val);
-}
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-# include "nan_converters_43_inl.h"
-#else
-# include "nan_converters_pre_43_inl.h"
-#endif
-
-#endif  // NAN_CONVERTERS_H_
diff --git a/js/node_modules/nan/nan_converters_43_inl.h b/js/node_modules/nan/nan_converters_43_inl.h
deleted file mode 100644
index e2eb032fd64fd81b0ee6ca9c5629f8ba5c986d39..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_converters_43_inl.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_CONVERTERS_43_INL_H_
-#define NAN_CONVERTERS_43_INL_H_
-
-#define X(TYPE)                                                                \
-imp::ToFactory<v8::TYPE>::return_t                                             \
-imp::ToFactory<v8::TYPE>::convert(v8::Local<v8::Value> val) {                  \
-  return val->To ## TYPE(GetCurrentContext());                                 \
-}
-
-X(Boolean)
-X(Number)
-X(String)
-X(Object)
-X(Integer)
-X(Uint32)
-X(Int32)
-
-#undef X
-
-#define X(TYPE, NAME)                                                          \
-imp::ToFactory<TYPE>::return_t                                                 \
-imp::ToFactory<TYPE>::convert(v8::Local<v8::Value> val) {                      \
-  return val->NAME ## Value(GetCurrentContext());                              \
-}
-
-X(bool, Boolean)
-X(double, Number)
-X(int64_t, Integer)
-X(uint32_t, Uint32)
-X(int32_t, Int32)
-
-#undef X
-
-#endif  // NAN_CONVERTERS_43_INL_H_
diff --git a/js/node_modules/nan/nan_converters_pre_43_inl.h b/js/node_modules/nan/nan_converters_pre_43_inl.h
deleted file mode 100644
index 177a74a2af5bdab28476b945ba9b5b5c18890708..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_converters_pre_43_inl.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_CONVERTERS_PRE_43_INL_H_
-#define NAN_CONVERTERS_PRE_43_INL_H_
-
-#define X(TYPE)                                                                \
-imp::ToFactory<v8::TYPE>::return_t                                             \
-imp::ToFactory<v8::TYPE>::convert(v8::Local<v8::Value> val) {                  \
-  return MaybeLocal<v8::TYPE>(val->To ## TYPE());                              \
-}
-
-X(Boolean)
-X(Number)
-X(String)
-X(Object)
-X(Integer)
-X(Uint32)
-X(Int32)
-
-#undef X
-
-#define X(TYPE, NAME)                                                          \
-imp::ToFactory<TYPE>::return_t                                                 \
-imp::ToFactory<TYPE>::convert(v8::Local<v8::Value> val) {                      \
-  return Just<TYPE>(val->NAME ##Value());                                      \
-}
-
-X(bool, Boolean)
-X(double, Number)
-X(int64_t, Integer)
-X(uint32_t, Uint32)
-X(int32_t, Int32)
-
-#undef X
-
-#endif  // NAN_CONVERTERS_PRE_43_INL_H_
diff --git a/js/node_modules/nan/nan_implementation_12_inl.h b/js/node_modules/nan/nan_implementation_12_inl.h
deleted file mode 100644
index be50fc67c46f8d4eec98f3a7379fcc822db2f3ac..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_implementation_12_inl.h
+++ /dev/null
@@ -1,409 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_IMPLEMENTATION_12_INL_H_
-#define NAN_IMPLEMENTATION_12_INL_H_
-//==============================================================================
-// node v0.11 implementation
-//==============================================================================
-
-namespace imp {
-
-//=== Array ====================================================================
-
-Factory<v8::Array>::return_t
-Factory<v8::Array>::New() {
-  return v8::Array::New(v8::Isolate::GetCurrent());
-}
-
-Factory<v8::Array>::return_t
-Factory<v8::Array>::New(int length) {
-  return v8::Array::New(v8::Isolate::GetCurrent(), length);
-}
-
-//=== Boolean ==================================================================
-
-Factory<v8::Boolean>::return_t
-Factory<v8::Boolean>::New(bool value) {
-  return v8::Boolean::New(v8::Isolate::GetCurrent(), value);
-}
-
-//=== Boolean Object ===========================================================
-
-Factory<v8::BooleanObject>::return_t
-Factory<v8::BooleanObject>::New(bool value) {
-#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION)
-  return v8::BooleanObject::New(
-    v8::Isolate::GetCurrent(), value).As<v8::BooleanObject>();
-#else
-  return v8::BooleanObject::New(value).As<v8::BooleanObject>();
-#endif
-}
-
-//=== Context ==================================================================
-
-Factory<v8::Context>::return_t
-Factory<v8::Context>::New( v8::ExtensionConfiguration* extensions
-                         , v8::Local<v8::ObjectTemplate> tmpl
-                         , v8::Local<v8::Value> obj) {
-  return v8::Context::New(v8::Isolate::GetCurrent(), extensions, tmpl, obj);
-}
-
-//=== Date =====================================================================
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-Factory<v8::Date>::return_t
-Factory<v8::Date>::New(double value) {
-  v8::Local<v8::Date> ret;
-  if (v8::Date::New(GetCurrentContext(), value).
-      ToLocal(reinterpret_cast<v8::Local<v8::Value>*>(&ret))) {
-    return v8::MaybeLocal<v8::Date>(ret);
-  } else {
-    return v8::MaybeLocal<v8::Date>(ret);
-  }
-}
-#else
-Factory<v8::Date>::return_t
-Factory<v8::Date>::New(double value) {
-  return Factory<v8::Date>::return_t(
-      v8::Date::New(v8::Isolate::GetCurrent(), value).As<v8::Date>());
-}
-#endif
-
-//=== External =================================================================
-
-Factory<v8::External>::return_t
-Factory<v8::External>::New(void * value) {
-  return v8::External::New(v8::Isolate::GetCurrent(), value);
-}
-
-//=== Function =================================================================
-
-Factory<v8::Function>::return_t
-Factory<v8::Function>::New( FunctionCallback callback
-                          , v8::Local<v8::Value> data) {
-  v8::Isolate *isolate = v8::Isolate::GetCurrent();
-  v8::EscapableHandleScope scope(isolate);
-  v8::Local<v8::ObjectTemplate> tpl = v8::ObjectTemplate::New(isolate);
-  tpl->SetInternalFieldCount(imp::kFunctionFieldCount);
-  v8::Local<v8::Object> obj = NewInstance(tpl).ToLocalChecked();
-
-  obj->SetInternalField(
-      imp::kFunctionIndex
-    , v8::External::New(isolate, reinterpret_cast<void *>(callback)));
-
-  v8::Local<v8::Value> val = v8::Local<v8::Value>::New(isolate, data);
-
-  if (!val.IsEmpty()) {
-    obj->SetInternalField(imp::kDataIndex, val);
-  }
-
-  return scope.Escape(v8::Function::New( isolate
-                          , imp::FunctionCallbackWrapper
-                          , obj));
-}
-
-//=== Function Template ========================================================
-
-Factory<v8::FunctionTemplate>::return_t
-Factory<v8::FunctionTemplate>::New( FunctionCallback callback
-                                  , v8::Local<v8::Value> data
-                                  , v8::Local<v8::Signature> signature) {
-  v8::Isolate *isolate = v8::Isolate::GetCurrent();
-  if (callback) {
-    v8::EscapableHandleScope scope(isolate);
-    v8::Local<v8::ObjectTemplate> tpl = v8::ObjectTemplate::New(isolate);
-    tpl->SetInternalFieldCount(imp::kFunctionFieldCount);
-    v8::Local<v8::Object> obj = NewInstance(tpl).ToLocalChecked();
-
-    obj->SetInternalField(
-        imp::kFunctionIndex
-      , v8::External::New(isolate, reinterpret_cast<void *>(callback)));
-    v8::Local<v8::Value> val = v8::Local<v8::Value>::New(isolate, data);
-
-    if (!val.IsEmpty()) {
-      obj->SetInternalField(imp::kDataIndex, val);
-    }
-
-    return scope.Escape(v8::FunctionTemplate::New( isolate
-                                    , imp::FunctionCallbackWrapper
-                                    , obj
-                                    , signature));
-  } else {
-    return v8::FunctionTemplate::New(isolate, 0, data, signature);
-  }
-}
-
-//=== Number ===================================================================
-
-Factory<v8::Number>::return_t
-Factory<v8::Number>::New(double value) {
-  return v8::Number::New(v8::Isolate::GetCurrent(), value);
-}
-
-//=== Number Object ============================================================
-
-Factory<v8::NumberObject>::return_t
-Factory<v8::NumberObject>::New(double value) {
-  return v8::NumberObject::New( v8::Isolate::GetCurrent()
-                              , value).As<v8::NumberObject>();
-}
-
-//=== Integer, Int32 and Uint32 ================================================
-
-template <typename T>
-typename IntegerFactory<T>::return_t
-IntegerFactory<T>::New(int32_t value) {
-  return To<T>(T::New(v8::Isolate::GetCurrent(), value));
-}
-
-template <typename T>
-typename IntegerFactory<T>::return_t
-IntegerFactory<T>::New(uint32_t value) {
-  return To<T>(T::NewFromUnsigned(v8::Isolate::GetCurrent(), value));
-}
-
-Factory<v8::Uint32>::return_t
-Factory<v8::Uint32>::New(int32_t value) {
-  return To<v8::Uint32>(
-      v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value));
-}
-
-Factory<v8::Uint32>::return_t
-Factory<v8::Uint32>::New(uint32_t value) {
-  return To<v8::Uint32>(
-      v8::Uint32::NewFromUnsigned(v8::Isolate::GetCurrent(), value));
-}
-
-//=== Object ===================================================================
-
-Factory<v8::Object>::return_t
-Factory<v8::Object>::New() {
-  return v8::Object::New(v8::Isolate::GetCurrent());
-}
-
-//=== Object Template ==========================================================
-
-Factory<v8::ObjectTemplate>::return_t
-Factory<v8::ObjectTemplate>::New() {
-  return v8::ObjectTemplate::New(v8::Isolate::GetCurrent());
-}
-
-//=== RegExp ===================================================================
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-Factory<v8::RegExp>::return_t
-Factory<v8::RegExp>::New(
-    v8::Local<v8::String> pattern
-  , v8::RegExp::Flags flags) {
-  return v8::RegExp::New(GetCurrentContext(), pattern, flags);
-}
-#else
-Factory<v8::RegExp>::return_t
-Factory<v8::RegExp>::New(
-    v8::Local<v8::String> pattern
-  , v8::RegExp::Flags flags) {
-  return Factory<v8::RegExp>::return_t(v8::RegExp::New(pattern, flags));
-}
-#endif
-
-//=== Script ===================================================================
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-Factory<v8::Script>::return_t
-Factory<v8::Script>::New( v8::Local<v8::String> source) {
-  v8::ScriptCompiler::Source src(source);
-  return v8::ScriptCompiler::Compile(GetCurrentContext(), &src);
-}
-
-Factory<v8::Script>::return_t
-Factory<v8::Script>::New( v8::Local<v8::String> source
-                        , v8::ScriptOrigin const& origin) {
-  v8::ScriptCompiler::Source src(source, origin);
-  return v8::ScriptCompiler::Compile(GetCurrentContext(), &src);
-}
-#else
-Factory<v8::Script>::return_t
-Factory<v8::Script>::New( v8::Local<v8::String> source) {
-  v8::ScriptCompiler::Source src(source);
-  return Factory<v8::Script>::return_t(
-      v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src));
-}
-
-Factory<v8::Script>::return_t
-Factory<v8::Script>::New( v8::Local<v8::String> source
-                        , v8::ScriptOrigin const& origin) {
-  v8::ScriptCompiler::Source src(source, origin);
-  return Factory<v8::Script>::return_t(
-      v8::ScriptCompiler::Compile(v8::Isolate::GetCurrent(), &src));
-}
-#endif
-
-//=== Signature ================================================================
-
-Factory<v8::Signature>::return_t
-Factory<v8::Signature>::New(Factory<v8::Signature>::FTH receiver) {
-  return v8::Signature::New(v8::Isolate::GetCurrent(), receiver);
-}
-
-//=== String ===================================================================
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New() {
-  return Factory<v8::String>::return_t(
-      v8::String::Empty(v8::Isolate::GetCurrent()));
-}
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-Factory<v8::String>::return_t
-Factory<v8::String>::New(const char * value, int length) {
-  return v8::String::NewFromUtf8(
-      v8::Isolate::GetCurrent(), value, v8::NewStringType::kNormal, length);
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(std::string const& value) {
-  assert(value.size() <= INT_MAX && "string too long");
-  return v8::String::NewFromUtf8(v8::Isolate::GetCurrent(),
-      value.data(), v8::NewStringType::kNormal, static_cast<int>(value.size()));
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(const uint16_t * value, int length) {
-  return v8::String::NewFromTwoByte(v8::Isolate::GetCurrent(), value,
-        v8::NewStringType::kNormal, length);
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(v8::String::ExternalStringResource * value) {
-  return v8::String::NewExternalTwoByte(v8::Isolate::GetCurrent(), value);
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(ExternalOneByteStringResource * value) {
-  return v8::String::NewExternalOneByte(v8::Isolate::GetCurrent(), value);
-}
-#else
-Factory<v8::String>::return_t
-Factory<v8::String>::New(const char * value, int length) {
-  return Factory<v8::String>::return_t(
-      v8::String::NewFromUtf8(
-          v8::Isolate::GetCurrent()
-        , value
-        , v8::String::kNormalString
-        , length));
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(
-    std::string const& value) /* NOLINT(build/include_what_you_use) */ {
-  assert(value.size() <= INT_MAX && "string too long");
-  return Factory<v8::String>::return_t(
-      v8::String::NewFromUtf8(
-          v8::Isolate::GetCurrent()
-        , value.data()
-        , v8::String::kNormalString
-        , static_cast<int>(value.size())));
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(const uint16_t * value, int length) {
-  return Factory<v8::String>::return_t(
-      v8::String::NewFromTwoByte(
-          v8::Isolate::GetCurrent()
-        , value
-        , v8::String::kNormalString
-        , length));
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(v8::String::ExternalStringResource * value) {
-  return Factory<v8::String>::return_t(
-      v8::String::NewExternal(v8::Isolate::GetCurrent(), value));
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(ExternalOneByteStringResource * value) {
-  return Factory<v8::String>::return_t(
-      v8::String::NewExternal(v8::Isolate::GetCurrent(), value));
-}
-#endif
-
-//=== String Object ============================================================
-
-Factory<v8::StringObject>::return_t
-Factory<v8::StringObject>::New(v8::Local<v8::String> value) {
-  return v8::StringObject::New(value).As<v8::StringObject>();
-}
-
-//=== Unbound Script ===========================================================
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-Factory<v8::UnboundScript>::return_t
-Factory<v8::UnboundScript>::New(v8::Local<v8::String> source) {
-  v8::ScriptCompiler::Source src(source);
-  return v8::ScriptCompiler::CompileUnboundScript(
-      v8::Isolate::GetCurrent(), &src);
-}
-
-Factory<v8::UnboundScript>::return_t
-Factory<v8::UnboundScript>::New( v8::Local<v8::String> source
-                               , v8::ScriptOrigin const& origin) {
-  v8::ScriptCompiler::Source src(source, origin);
-  return v8::ScriptCompiler::CompileUnboundScript(
-      v8::Isolate::GetCurrent(), &src);
-}
-#else
-Factory<v8::UnboundScript>::return_t
-Factory<v8::UnboundScript>::New(v8::Local<v8::String> source) {
-  v8::ScriptCompiler::Source src(source);
-  return Factory<v8::UnboundScript>::return_t(
-      v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src));
-}
-
-Factory<v8::UnboundScript>::return_t
-Factory<v8::UnboundScript>::New( v8::Local<v8::String> source
-                               , v8::ScriptOrigin const& origin) {
-  v8::ScriptCompiler::Source src(source, origin);
-  return Factory<v8::UnboundScript>::return_t(
-      v8::ScriptCompiler::CompileUnbound(v8::Isolate::GetCurrent(), &src));
-}
-#endif
-
-}  // end of namespace imp
-
-//=== Presistents and Handles ==================================================
-
-#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-template <typename T>
-inline v8::Local<T> New(v8::Handle<T> h) {
-  return v8::Local<T>::New(v8::Isolate::GetCurrent(), h);
-}
-#endif
-
-template <typename T, typename M>
-inline v8::Local<T> New(v8::Persistent<T, M> const& p) {
-  return v8::Local<T>::New(v8::Isolate::GetCurrent(), p);
-}
-
-template <typename T, typename M>
-inline v8::Local<T> New(Persistent<T, M> const& p) {
-  return v8::Local<T>::New(v8::Isolate::GetCurrent(), p);
-}
-
-template <typename T>
-inline v8::Local<T> New(Global<T> const& p) {
-  return v8::Local<T>::New(v8::Isolate::GetCurrent(), p);
-}
-
-#endif  // NAN_IMPLEMENTATION_12_INL_H_
diff --git a/js/node_modules/nan/nan_implementation_pre_12_inl.h b/js/node_modules/nan/nan_implementation_pre_12_inl.h
deleted file mode 100644
index f6642eece57772b56e8fb83dbacdfbfc2c633507..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_implementation_pre_12_inl.h
+++ /dev/null
@@ -1,264 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_IMPLEMENTATION_PRE_12_INL_H_
-#define NAN_IMPLEMENTATION_PRE_12_INL_H_
-
-//==============================================================================
-// node v0.10 implementation
-//==============================================================================
-
-namespace imp {
-
-//=== Array ====================================================================
-
-Factory<v8::Array>::return_t
-Factory<v8::Array>::New() {
-  return v8::Array::New();
-}
-
-Factory<v8::Array>::return_t
-Factory<v8::Array>::New(int length) {
-  return v8::Array::New(length);
-}
-
-//=== Boolean ==================================================================
-
-Factory<v8::Boolean>::return_t
-Factory<v8::Boolean>::New(bool value) {
-  return v8::Boolean::New(value)->ToBoolean();
-}
-
-//=== Boolean Object ===========================================================
-
-Factory<v8::BooleanObject>::return_t
-Factory<v8::BooleanObject>::New(bool value) {
-  return v8::BooleanObject::New(value).As<v8::BooleanObject>();
-}
-
-//=== Context ==================================================================
-
-Factory<v8::Context>::return_t
-Factory<v8::Context>::New( v8::ExtensionConfiguration* extensions
-                         , v8::Local<v8::ObjectTemplate> tmpl
-                         , v8::Local<v8::Value> obj) {
-  v8::Persistent<v8::Context> ctx = v8::Context::New(extensions, tmpl, obj);
-  v8::Local<v8::Context> lctx = v8::Local<v8::Context>::New(ctx);
-  ctx.Dispose();
-  return lctx;
-}
-
-//=== Date =====================================================================
-
-Factory<v8::Date>::return_t
-Factory<v8::Date>::New(double value) {
-  return Factory<v8::Date>::return_t(v8::Date::New(value).As<v8::Date>());
-}
-
-//=== External =================================================================
-
-Factory<v8::External>::return_t
-Factory<v8::External>::New(void * value) {
-  return v8::External::New(value);
-}
-
-//=== Function =================================================================
-
-Factory<v8::Function>::return_t
-Factory<v8::Function>::New( FunctionCallback callback
-                          , v8::Local<v8::Value> data) {
-  return Factory<v8::FunctionTemplate>::New( callback
-                                           , data
-                                           , v8::Local<v8::Signature>()
-                                           )->GetFunction();
-}
-
-
-//=== FunctionTemplate =========================================================
-
-Factory<v8::FunctionTemplate>::return_t
-Factory<v8::FunctionTemplate>::New( FunctionCallback callback
-                                  , v8::Local<v8::Value> data
-                                  , v8::Local<v8::Signature> signature) {
-  if (callback) {
-    v8::HandleScope scope;
-
-    v8::Local<v8::ObjectTemplate> tpl = v8::ObjectTemplate::New();
-    tpl->SetInternalFieldCount(imp::kFunctionFieldCount);
-    v8::Local<v8::Object> obj = tpl->NewInstance();
-
-    obj->SetInternalField(
-        imp::kFunctionIndex
-      , v8::External::New(reinterpret_cast<void *>(callback)));
-
-    v8::Local<v8::Value> val = v8::Local<v8::Value>::New(data);
-
-    if (!val.IsEmpty()) {
-      obj->SetInternalField(imp::kDataIndex, val);
-    }
-
-    // Note(agnat): Emulate length argument here. Unfortunately, I couldn't find
-    // a way. Have at it though...
-    return scope.Close(
-        v8::FunctionTemplate::New(imp::FunctionCallbackWrapper
-                                 , obj
-                                 , signature));
-  } else {
-    return v8::FunctionTemplate::New(0, data, signature);
-  }
-}
-
-//=== Number ===================================================================
-
-Factory<v8::Number>::return_t
-Factory<v8::Number>::New(double value) {
-  return v8::Number::New(value);
-}
-
-//=== Number Object ============================================================
-
-Factory<v8::NumberObject>::return_t
-Factory<v8::NumberObject>::New(double value) {
-  return v8::NumberObject::New(value).As<v8::NumberObject>();
-}
-
-//=== Integer, Int32 and Uint32 ================================================
-
-template <typename T>
-typename IntegerFactory<T>::return_t
-IntegerFactory<T>::New(int32_t value) {
-  return To<T>(T::New(value));
-}
-
-template <typename T>
-typename IntegerFactory<T>::return_t
-IntegerFactory<T>::New(uint32_t value) {
-  return To<T>(T::NewFromUnsigned(value));
-}
-
-Factory<v8::Uint32>::return_t
-Factory<v8::Uint32>::New(int32_t value) {
-  return To<v8::Uint32>(v8::Uint32::NewFromUnsigned(value));
-}
-
-Factory<v8::Uint32>::return_t
-Factory<v8::Uint32>::New(uint32_t value) {
-  return To<v8::Uint32>(v8::Uint32::NewFromUnsigned(value));
-}
-
-
-//=== Object ===================================================================
-
-Factory<v8::Object>::return_t
-Factory<v8::Object>::New() {
-  return v8::Object::New();
-}
-
-//=== Object Template ==========================================================
-
-Factory<v8::ObjectTemplate>::return_t
-Factory<v8::ObjectTemplate>::New() {
-  return v8::ObjectTemplate::New();
-}
-
-//=== RegExp ===================================================================
-
-Factory<v8::RegExp>::return_t
-Factory<v8::RegExp>::New(
-    v8::Local<v8::String> pattern
-  , v8::RegExp::Flags flags) {
-  return Factory<v8::RegExp>::return_t(v8::RegExp::New(pattern, flags));
-}
-
-//=== Script ===================================================================
-
-Factory<v8::Script>::return_t
-Factory<v8::Script>::New( v8::Local<v8::String> source) {
-  return Factory<v8::Script>::return_t(v8::Script::New(source));
-}
-Factory<v8::Script>::return_t
-Factory<v8::Script>::New( v8::Local<v8::String> source
-                        , v8::ScriptOrigin const& origin) {
-  return Factory<v8::Script>::return_t(
-      v8::Script::New(source, const_cast<v8::ScriptOrigin*>(&origin)));
-}
-
-//=== Signature ================================================================
-
-Factory<v8::Signature>::return_t
-Factory<v8::Signature>::New(Factory<v8::Signature>::FTH receiver) {
-  return v8::Signature::New(receiver);
-}
-
-//=== String ===================================================================
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New() {
-  return Factory<v8::String>::return_t(v8::String::Empty());
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(const char * value, int length) {
-  return Factory<v8::String>::return_t(v8::String::New(value, length));
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(
-    std::string const& value) /* NOLINT(build/include_what_you_use) */ {
-  assert(value.size() <= INT_MAX && "string too long");
-  return Factory<v8::String>::return_t(
-      v8::String::New( value.data(), static_cast<int>(value.size())));
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(const uint16_t * value, int length) {
-  return Factory<v8::String>::return_t(v8::String::New(value, length));
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(v8::String::ExternalStringResource * value) {
-  return Factory<v8::String>::return_t(v8::String::NewExternal(value));
-}
-
-Factory<v8::String>::return_t
-Factory<v8::String>::New(v8::String::ExternalAsciiStringResource * value) {
-  return Factory<v8::String>::return_t(v8::String::NewExternal(value));
-}
-
-//=== String Object ============================================================
-
-Factory<v8::StringObject>::return_t
-Factory<v8::StringObject>::New(v8::Local<v8::String> value) {
-  return v8::StringObject::New(value).As<v8::StringObject>();
-}
-
-}  // end of namespace imp
-
-//=== Presistents and Handles ==================================================
-
-template <typename T>
-inline v8::Local<T> New(v8::Handle<T> h) {
-  return v8::Local<T>::New(h);
-}
-
-template <typename T>
-inline v8::Local<T> New(v8::Persistent<T> const& p) {
-  return v8::Local<T>::New(p);
-}
-
-template <typename T, typename M>
-inline v8::Local<T> New(Persistent<T, M> const& p) {
-  return v8::Local<T>::New(p.persistent);
-}
-
-template <typename T>
-inline v8::Local<T> New(Global<T> const& p) {
-  return v8::Local<T>::New(p.persistent);
-}
-
-#endif  // NAN_IMPLEMENTATION_PRE_12_INL_H_
diff --git a/js/node_modules/nan/nan_maybe_43_inl.h b/js/node_modules/nan/nan_maybe_43_inl.h
deleted file mode 100644
index a8b432d57090ad3f54393a5d82c4a85086349856..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_maybe_43_inl.h
+++ /dev/null
@@ -1,245 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_MAYBE_43_INL_H_
-#define NAN_MAYBE_43_INL_H_
-
-template<typename T>
-using MaybeLocal = v8::MaybeLocal<T>;
-
-template<typename T>
-using Maybe = v8::Maybe<T>;
-
-template<typename T>
-inline Maybe<T> Nothing() {
-  return v8::Nothing<T>();
-}
-
-template<typename T>
-inline Maybe<T> Just(const T& t) {
-  return v8::Just<T>(t);
-}
-
-v8::Local<v8::Context> GetCurrentContext();
-
-inline
-MaybeLocal<v8::String> ToDetailString(v8::Local<v8::Value> val) {
-  return val->ToDetailString(GetCurrentContext());
-}
-
-inline
-MaybeLocal<v8::Uint32> ToArrayIndex(v8::Local<v8::Value> val) {
-  return val->ToArrayIndex(GetCurrentContext());
-}
-
-inline
-Maybe<bool> Equals(v8::Local<v8::Value> a, v8::Local<v8::Value>(b)) {
-  return a->Equals(GetCurrentContext(), b);
-}
-
-inline
-MaybeLocal<v8::Object> NewInstance(v8::Local<v8::Function> h) {
-  return h->NewInstance(GetCurrentContext());
-}
-
-inline
-MaybeLocal<v8::Object> NewInstance(
-      v8::Local<v8::Function> h
-    , int argc
-    , v8::Local<v8::Value> argv[]) {
-  return h->NewInstance(GetCurrentContext(), argc, argv);
-}
-
-inline
-MaybeLocal<v8::Object> NewInstance(v8::Local<v8::ObjectTemplate> h) {
-  return h->NewInstance(GetCurrentContext());
-}
-
-
-inline MaybeLocal<v8::Function> GetFunction(
-    v8::Local<v8::FunctionTemplate> t) {
-  return t->GetFunction(GetCurrentContext());
-}
-
-inline Maybe<bool> Set(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::Value> key
-  , v8::Local<v8::Value> value) {
-  return obj->Set(GetCurrentContext(), key, value);
-}
-
-inline Maybe<bool> Set(
-    v8::Local<v8::Object> obj
-  , uint32_t index
-  , v8::Local<v8::Value> value) {
-  return obj->Set(GetCurrentContext(), index, value);
-}
-
-inline Maybe<bool> ForceSet(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::Value> key
-  , v8::Local<v8::Value> value
-  , v8::PropertyAttribute attribs = v8::None) {
-  return obj->ForceSet(GetCurrentContext(), key, value, attribs);
-}
-
-inline MaybeLocal<v8::Value> Get(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::Value> key) {
-  return obj->Get(GetCurrentContext(), key);
-}
-
-inline
-MaybeLocal<v8::Value> Get(v8::Local<v8::Object> obj, uint32_t index) {
-  return obj->Get(GetCurrentContext(), index);
-}
-
-inline v8::PropertyAttribute GetPropertyAttributes(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::Value> key) {
-  return obj->GetPropertyAttributes(GetCurrentContext(), key).FromJust();
-}
-
-inline Maybe<bool> Has(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::String> key) {
-  return obj->Has(GetCurrentContext(), key);
-}
-
-inline Maybe<bool> Has(v8::Local<v8::Object> obj, uint32_t index) {
-  return obj->Has(GetCurrentContext(), index);
-}
-
-inline Maybe<bool> Delete(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::String> key) {
-  return obj->Delete(GetCurrentContext(), key);
-}
-
-inline
-Maybe<bool> Delete(v8::Local<v8::Object> obj, uint32_t index) {
-  return obj->Delete(GetCurrentContext(), index);
-}
-
-inline
-MaybeLocal<v8::Array> GetPropertyNames(v8::Local<v8::Object> obj) {
-  return obj->GetPropertyNames(GetCurrentContext());
-}
-
-inline
-MaybeLocal<v8::Array> GetOwnPropertyNames(v8::Local<v8::Object> obj) {
-  return obj->GetOwnPropertyNames(GetCurrentContext());
-}
-
-inline Maybe<bool> SetPrototype(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::Value> prototype) {
-  return obj->SetPrototype(GetCurrentContext(), prototype);
-}
-
-inline MaybeLocal<v8::String> ObjectProtoToString(
-    v8::Local<v8::Object> obj) {
-  return obj->ObjectProtoToString(GetCurrentContext());
-}
-
-inline Maybe<bool> HasOwnProperty(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::String> key) {
-  return obj->HasOwnProperty(GetCurrentContext(), key);
-}
-
-inline Maybe<bool> HasRealNamedProperty(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::String> key) {
-  return obj->HasRealNamedProperty(GetCurrentContext(), key);
-}
-
-inline Maybe<bool> HasRealIndexedProperty(
-    v8::Local<v8::Object> obj
-  , uint32_t index) {
-  return obj->HasRealIndexedProperty(GetCurrentContext(), index);
-}
-
-inline Maybe<bool> HasRealNamedCallbackProperty(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::String> key) {
-  return obj->HasRealNamedCallbackProperty(GetCurrentContext(), key);
-}
-
-inline MaybeLocal<v8::Value> GetRealNamedPropertyInPrototypeChain(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::String> key) {
-  return obj->GetRealNamedPropertyInPrototypeChain(GetCurrentContext(), key);
-}
-
-inline MaybeLocal<v8::Value> GetRealNamedProperty(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::String> key) {
-  return obj->GetRealNamedProperty(GetCurrentContext(), key);
-}
-
-inline MaybeLocal<v8::Value> CallAsFunction(
-    v8::Local<v8::Object> obj
-  , v8::Local<v8::Object> recv
-  , int argc
-  , v8::Local<v8::Value> argv[]) {
-  return obj->CallAsFunction(GetCurrentContext(), recv, argc, argv);
-}
-
-inline MaybeLocal<v8::Value> CallAsConstructor(
-    v8::Local<v8::Object> obj
-  , int argc, v8::Local<v8::Value> argv[]) {
-  return obj->CallAsConstructor(GetCurrentContext(), argc, argv);
-}
-
-inline
-MaybeLocal<v8::String> GetSourceLine(v8::Local<v8::Message> msg) {
-  return msg->GetSourceLine(GetCurrentContext());
-}
-
-inline Maybe<int> GetLineNumber(v8::Local<v8::Message> msg) {
-  return msg->GetLineNumber(GetCurrentContext());
-}
-
-inline Maybe<int> GetStartColumn(v8::Local<v8::Message> msg) {
-  return msg->GetStartColumn(GetCurrentContext());
-}
-
-inline Maybe<int> GetEndColumn(v8::Local<v8::Message> msg) {
-  return msg->GetEndColumn(GetCurrentContext());
-}
-
-inline MaybeLocal<v8::Object> CloneElementAt(
-    v8::Local<v8::Array> array
-  , uint32_t index) {
-#if (NODE_MODULE_VERSION >= NODE_6_0_MODULE_VERSION)
-  v8::EscapableHandleScope handle_scope(v8::Isolate::GetCurrent());
-  v8::Local<v8::Context> context = GetCurrentContext();
-  v8::Local<v8::Value> elem;
-  if (!array->Get(context, index).ToLocal(&elem)) {
-    return MaybeLocal<v8::Object>();
-  }
-  v8::Local<v8::Object> obj;
-  if (!elem->ToObject(context).ToLocal(&obj)) {
-    return MaybeLocal<v8::Object>();
-  }
-  return MaybeLocal<v8::Object>(handle_scope.Escape(obj->Clone()));
-#else
-  return array->CloneElementAt(GetCurrentContext(), index);
-#endif
-}
-
-inline MaybeLocal<v8::Value> Call(
-    v8::Local<v8::Function> fun
-  , v8::Local<v8::Object> recv
-  , int argc
-  , v8::Local<v8::Value> argv[]) {
-  return fun->Call(GetCurrentContext(), recv, argc, argv);
-}
-
-#endif  // NAN_MAYBE_43_INL_H_
diff --git a/js/node_modules/nan/nan_maybe_pre_43_inl.h b/js/node_modules/nan/nan_maybe_pre_43_inl.h
deleted file mode 100644
index c53868752ef1e3fc1f2d3a7049780ed0fd0fa098..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_maybe_pre_43_inl.h
+++ /dev/null
@@ -1,303 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_MAYBE_PRE_43_INL_H_
-#define NAN_MAYBE_PRE_43_INL_H_
-
-template<typename T>
-class MaybeLocal {
- public:
-  inline MaybeLocal() : val_(v8::Local<T>()) {}
-
-  template<typename S>
-# if NODE_MODULE_VERSION >= NODE_0_12_MODULE_VERSION
-  inline MaybeLocal(v8::Local<S> that) : val_(that) {}
-# else
-  inline MaybeLocal(v8::Local<S> that) :
-      val_(*reinterpret_cast<v8::Local<T>*>(&that)) {}
-# endif
-
-  inline bool IsEmpty() const { return val_.IsEmpty(); }
-
-  template<typename S>
-  inline bool ToLocal(v8::Local<S> *out) const {
-    *out = val_;
-    return !IsEmpty();
-  }
-
-  inline v8::Local<T> ToLocalChecked() const {
-#if defined(V8_ENABLE_CHECKS)
-    assert(!IsEmpty() && "ToLocalChecked is Empty");
-#endif  // V8_ENABLE_CHECKS
-    return val_;
-  }
-
-  template<typename S>
-  inline v8::Local<S> FromMaybe(v8::Local<S> default_value) const {
-    return IsEmpty() ? default_value : val_;
-  }
-
- private:
-  v8::Local<T> val_;
-};
-
-template<typename T>
-class Maybe {
- public:
-  inline bool IsNothing() const { return !has_value_; }
-  inline bool IsJust() const { return has_value_; }
-
-  inline T FromJust() const {
-#if defined(V8_ENABLE_CHECKS)
-    assert(IsJust() && "FromJust is Nothing");
-#endif  // V8_ENABLE_CHECKS
-    return value_;
-  }
-
-  inline T FromMaybe(const T& default_value) const {
-    return has_value_ ? value_ : default_value;
-  }
-
-  inline bool operator==(const Maybe &other) const {
-    return (IsJust() == other.IsJust()) &&
-        (!IsJust() || FromJust() == other.FromJust());
-  }
-
-  inline bool operator!=(const Maybe &other) const {
-    return !operator==(other);
-  }
-
- private:
-  Maybe() : has_value_(false) {}
-  explicit Maybe(const T& t) : has_value_(true), value_(t) {}
-  bool has_value_;
-  T value_;
-
-  template<typename U>
-  friend Maybe<U> Nothing();
-  template<typename U>
-  friend Maybe<U> Just(const U& u);
-};
-
-template<typename T>
-inline Maybe<T> Nothing() {
-  return Maybe<T>();
-}
-
-template<typename T>
-inline Maybe<T> Just(const T& t) {
-  return Maybe<T>(t);
-}
-
-inline
-MaybeLocal<v8::String> ToDetailString(v8::Handle<v8::Value> val) {
-  return MaybeLocal<v8::String>(val->ToDetailString());
-}
-
-inline
-MaybeLocal<v8::Uint32> ToArrayIndex(v8::Handle<v8::Value> val) {
-  return MaybeLocal<v8::Uint32>(val->ToArrayIndex());
-}
-
-inline
-Maybe<bool> Equals(v8::Handle<v8::Value> a, v8::Handle<v8::Value>(b)) {
-  return Just<bool>(a->Equals(b));
-}
-
-inline
-MaybeLocal<v8::Object> NewInstance(v8::Handle<v8::Function> h) {
-  return MaybeLocal<v8::Object>(h->NewInstance());
-}
-
-inline
-MaybeLocal<v8::Object> NewInstance(
-      v8::Local<v8::Function> h
-    , int argc
-    , v8::Local<v8::Value> argv[]) {
-  return MaybeLocal<v8::Object>(h->NewInstance(argc, argv));
-}
-
-inline
-MaybeLocal<v8::Object> NewInstance(v8::Handle<v8::ObjectTemplate> h) {
-  return MaybeLocal<v8::Object>(h->NewInstance());
-}
-
-inline
-MaybeLocal<v8::Function> GetFunction(v8::Handle<v8::FunctionTemplate> t) {
-  return MaybeLocal<v8::Function>(t->GetFunction());
-}
-
-inline Maybe<bool> Set(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::Value> key
-  , v8::Handle<v8::Value> value) {
-  return Just<bool>(obj->Set(key, value));
-}
-
-inline Maybe<bool> Set(
-    v8::Handle<v8::Object> obj
-  , uint32_t index
-  , v8::Handle<v8::Value> value) {
-  return Just<bool>(obj->Set(index, value));
-}
-
-inline Maybe<bool> ForceSet(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::Value> key
-  , v8::Handle<v8::Value> value
-  , v8::PropertyAttribute attribs = v8::None) {
-  return Just<bool>(obj->ForceSet(key, value, attribs));
-}
-
-inline MaybeLocal<v8::Value> Get(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::Value> key) {
-  return MaybeLocal<v8::Value>(obj->Get(key));
-}
-
-inline MaybeLocal<v8::Value> Get(
-    v8::Handle<v8::Object> obj
-  , uint32_t index) {
-  return MaybeLocal<v8::Value>(obj->Get(index));
-}
-
-inline Maybe<v8::PropertyAttribute> GetPropertyAttributes(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::Value> key) {
-  return Just<v8::PropertyAttribute>(obj->GetPropertyAttributes(key));
-}
-
-inline Maybe<bool> Has(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::String> key) {
-  return Just<bool>(obj->Has(key));
-}
-
-inline Maybe<bool> Has(
-    v8::Handle<v8::Object> obj
-  , uint32_t index) {
-  return Just<bool>(obj->Has(index));
-}
-
-inline Maybe<bool> Delete(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::String> key) {
-  return Just<bool>(obj->Delete(key));
-}
-
-inline Maybe<bool> Delete(
-    v8::Handle<v8::Object> obj
-  , uint32_t index) {
-  return Just<bool>(obj->Delete(index));
-}
-
-inline
-MaybeLocal<v8::Array> GetPropertyNames(v8::Handle<v8::Object> obj) {
-  return MaybeLocal<v8::Array>(obj->GetPropertyNames());
-}
-
-inline
-MaybeLocal<v8::Array> GetOwnPropertyNames(v8::Handle<v8::Object> obj) {
-  return MaybeLocal<v8::Array>(obj->GetOwnPropertyNames());
-}
-
-inline Maybe<bool> SetPrototype(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::Value> prototype) {
-  return Just<bool>(obj->SetPrototype(prototype));
-}
-
-inline MaybeLocal<v8::String> ObjectProtoToString(
-    v8::Handle<v8::Object> obj) {
-  return MaybeLocal<v8::String>(obj->ObjectProtoToString());
-}
-
-inline Maybe<bool> HasOwnProperty(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::String> key) {
-  return Just<bool>(obj->HasOwnProperty(key));
-}
-
-inline Maybe<bool> HasRealNamedProperty(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::String> key) {
-  return Just<bool>(obj->HasRealNamedProperty(key));
-}
-
-inline Maybe<bool> HasRealIndexedProperty(
-    v8::Handle<v8::Object> obj
-  , uint32_t index) {
-  return Just<bool>(obj->HasRealIndexedProperty(index));
-}
-
-inline Maybe<bool> HasRealNamedCallbackProperty(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::String> key) {
-  return Just<bool>(obj->HasRealNamedCallbackProperty(key));
-}
-
-inline MaybeLocal<v8::Value> GetRealNamedPropertyInPrototypeChain(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::String> key) {
-  return MaybeLocal<v8::Value>(
-      obj->GetRealNamedPropertyInPrototypeChain(key));
-}
-
-inline MaybeLocal<v8::Value> GetRealNamedProperty(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::String> key) {
-  return MaybeLocal<v8::Value>(obj->GetRealNamedProperty(key));
-}
-
-inline MaybeLocal<v8::Value> CallAsFunction(
-    v8::Handle<v8::Object> obj
-  , v8::Handle<v8::Object> recv
-  , int argc
-  , v8::Handle<v8::Value> argv[]) {
-  return MaybeLocal<v8::Value>(obj->CallAsFunction(recv, argc, argv));
-}
-
-inline MaybeLocal<v8::Value> CallAsConstructor(
-    v8::Handle<v8::Object> obj
-  , int argc
-  , v8::Local<v8::Value> argv[]) {
-  return MaybeLocal<v8::Value>(obj->CallAsConstructor(argc, argv));
-}
-
-inline
-MaybeLocal<v8::String> GetSourceLine(v8::Handle<v8::Message> msg) {
-  return MaybeLocal<v8::String>(msg->GetSourceLine());
-}
-
-inline Maybe<int> GetLineNumber(v8::Handle<v8::Message> msg) {
-  return Just<int>(msg->GetLineNumber());
-}
-
-inline Maybe<int> GetStartColumn(v8::Handle<v8::Message> msg) {
-  return Just<int>(msg->GetStartColumn());
-}
-
-inline Maybe<int> GetEndColumn(v8::Handle<v8::Message> msg) {
-  return Just<int>(msg->GetEndColumn());
-}
-
-inline MaybeLocal<v8::Object> CloneElementAt(
-    v8::Handle<v8::Array> array
-  , uint32_t index) {
-  return MaybeLocal<v8::Object>(array->CloneElementAt(index));
-}
-
-inline MaybeLocal<v8::Value> Call(
-    v8::Local<v8::Function> fun
-  , v8::Local<v8::Object> recv
-  , int argc
-  , v8::Local<v8::Value> argv[]) {
-  return MaybeLocal<v8::Value>(fun->Call(recv, argc, argv));
-}
-
-#endif  // NAN_MAYBE_PRE_43_INL_H_
diff --git a/js/node_modules/nan/nan_new.h b/js/node_modules/nan/nan_new.h
deleted file mode 100644
index 6c7d19fc12fa9ffef509d996478d11766dd8c28a..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_new.h
+++ /dev/null
@@ -1,340 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_NEW_H_
-#define NAN_NEW_H_
-
-namespace imp {  // scnr
-
-// TODO(agnat): Generalize
-template <typename T> v8::Local<T> To(v8::Local<v8::Integer> i);
-
-template <>
-inline
-v8::Local<v8::Integer>
-To<v8::Integer>(v8::Local<v8::Integer> i) {
-  return Nan::To<v8::Integer>(i).ToLocalChecked();
-}
-
-template <>
-inline
-v8::Local<v8::Int32>
-To<v8::Int32>(v8::Local<v8::Integer> i) {
-  return Nan::To<v8::Int32>(i).ToLocalChecked();
-}
-
-template <>
-inline
-v8::Local<v8::Uint32>
-To<v8::Uint32>(v8::Local<v8::Integer> i) {
-  return Nan::To<v8::Uint32>(i).ToLocalChecked();
-}
-
-template <typename T> struct FactoryBase {
-  typedef v8::Local<T> return_t;
-};
-
-template <typename T> struct MaybeFactoryBase {
-  typedef MaybeLocal<T> return_t;
-};
-
-template <typename T> struct Factory;
-
-template <>
-struct Factory<v8::Array> : FactoryBase<v8::Array> {
-  static inline return_t New();
-  static inline return_t New(int length);
-};
-
-template <>
-struct Factory<v8::Boolean> : FactoryBase<v8::Boolean> {
-  static inline return_t New(bool value);
-};
-
-template <>
-struct Factory<v8::BooleanObject> : FactoryBase<v8::BooleanObject> {
-  static inline return_t New(bool value);
-};
-
-template <>
-struct Factory<v8::Context> : FactoryBase<v8::Context> {
-  static inline
-  return_t
-  New( v8::ExtensionConfiguration* extensions = NULL
-     , v8::Local<v8::ObjectTemplate> tmpl = v8::Local<v8::ObjectTemplate>()
-     , v8::Local<v8::Value> obj = v8::Local<v8::Value>());
-};
-
-template <>
-struct Factory<v8::Date> : MaybeFactoryBase<v8::Date> {
-  static inline return_t New(double value);
-};
-
-template <>
-struct Factory<v8::External> : FactoryBase<v8::External> {
-  static inline return_t New(void *value);
-};
-
-template <>
-struct Factory<v8::Function> : FactoryBase<v8::Function> {
-  static inline
-  return_t
-  New( FunctionCallback callback
-     , v8::Local<v8::Value> data = v8::Local<v8::Value>());
-};
-
-template <>
-struct Factory<v8::FunctionTemplate> : FactoryBase<v8::FunctionTemplate> {
-  static inline
-  return_t
-  New( FunctionCallback callback = NULL
-     , v8::Local<v8::Value> data = v8::Local<v8::Value>()
-     , v8::Local<v8::Signature> signature = v8::Local<v8::Signature>());
-};
-
-template <>
-struct Factory<v8::Number> : FactoryBase<v8::Number> {
-  static inline return_t New(double value);
-};
-
-template <>
-struct Factory<v8::NumberObject> : FactoryBase<v8::NumberObject> {
-  static inline return_t New(double value);
-};
-
-template <typename T>
-struct IntegerFactory : FactoryBase<T> {
-  typedef typename FactoryBase<T>::return_t return_t;
-  static inline return_t New(int32_t value);
-  static inline return_t New(uint32_t value);
-};
-
-template <>
-struct Factory<v8::Integer> : IntegerFactory<v8::Integer> {};
-
-template <>
-struct Factory<v8::Int32> : IntegerFactory<v8::Int32> {};
-
-template <>
-struct Factory<v8::Uint32> : FactoryBase<v8::Uint32> {
-  static inline return_t New(int32_t value);
-  static inline return_t New(uint32_t value);
-};
-
-template <>
-struct Factory<v8::Object> : FactoryBase<v8::Object> {
-  static inline return_t New();
-};
-
-template <>
-struct Factory<v8::ObjectTemplate> : FactoryBase<v8::ObjectTemplate> {
-  static inline return_t New();
-};
-
-template <>
-struct Factory<v8::RegExp> : MaybeFactoryBase<v8::RegExp> {
-  static inline return_t New(
-      v8::Local<v8::String> pattern, v8::RegExp::Flags flags);
-};
-
-template <>
-struct Factory<v8::Script> : MaybeFactoryBase<v8::Script> {
-  static inline return_t New( v8::Local<v8::String> source);
-  static inline return_t New( v8::Local<v8::String> source
-                            , v8::ScriptOrigin const& origin);
-};
-
-template <>
-struct Factory<v8::Signature> : FactoryBase<v8::Signature> {
-  typedef v8::Local<v8::FunctionTemplate> FTH;
-  static inline return_t New(FTH receiver = FTH());
-};
-
-template <>
-struct Factory<v8::String> : MaybeFactoryBase<v8::String> {
-  static inline return_t New();
-  static inline return_t New(const char *value, int length = -1);
-  static inline return_t New(const uint16_t *value, int length = -1);
-  static inline return_t New(std::string const& value);
-
-  static inline return_t New(v8::String::ExternalStringResource * value);
-  static inline return_t New(ExternalOneByteStringResource * value);
-};
-
-template <>
-struct Factory<v8::StringObject> : FactoryBase<v8::StringObject> {
-  static inline return_t New(v8::Local<v8::String> value);
-};
-
-}  // end of namespace imp
-
-#if (NODE_MODULE_VERSION >= 12)
-
-namespace imp {
-
-template <>
-struct Factory<v8::UnboundScript> : MaybeFactoryBase<v8::UnboundScript> {
-  static inline return_t New( v8::Local<v8::String> source);
-  static inline return_t New( v8::Local<v8::String> source
-                            , v8::ScriptOrigin const& origin);
-};
-
-}  // end of namespace imp
-
-# include "nan_implementation_12_inl.h"
-
-#else  // NODE_MODULE_VERSION >= 12
-
-# include "nan_implementation_pre_12_inl.h"
-
-#endif
-
-//=== API ======================================================================
-
-template <typename T>
-typename imp::Factory<T>::return_t
-New() {
-  return imp::Factory<T>::New();
-}
-
-template <typename T, typename A0>
-typename imp::Factory<T>::return_t
-New(A0 arg0) {
-  return imp::Factory<T>::New(arg0);
-}
-
-template <typename T, typename A0, typename A1>
-typename imp::Factory<T>::return_t
-New(A0 arg0, A1 arg1) {
-  return imp::Factory<T>::New(arg0, arg1);
-}
-
-template <typename T, typename A0, typename A1, typename A2>
-typename imp::Factory<T>::return_t
-New(A0 arg0, A1 arg1, A2 arg2) {
-  return imp::Factory<T>::New(arg0, arg1, arg2);
-}
-
-template <typename T, typename A0, typename A1, typename A2, typename A3>
-typename imp::Factory<T>::return_t
-New(A0 arg0, A1 arg1, A2 arg2, A3 arg3) {
-  return imp::Factory<T>::New(arg0, arg1, arg2, arg3);
-}
-
-// Note(agnat): When passing overloaded function pointers to template functions
-// as generic arguments the compiler needs help in picking the right overload.
-// These two functions handle New<Function> and New<FunctionTemplate> with
-// all argument variations.
-
-// v8::Function and v8::FunctionTemplate with one or two arguments
-template <typename T>
-typename imp::Factory<T>::return_t
-New( FunctionCallback callback
-      , v8::Local<v8::Value> data = v8::Local<v8::Value>()) {
-    return imp::Factory<T>::New(callback, data);
-}
-
-// v8::Function and v8::FunctionTemplate with three arguments
-template <typename T, typename A2>
-typename imp::Factory<T>::return_t
-New( FunctionCallback callback
-      , v8::Local<v8::Value> data = v8::Local<v8::Value>()
-      , A2 a2 = A2()) {
-    return imp::Factory<T>::New(callback, data, a2);
-}
-
-// Convenience
-
-#if NODE_MODULE_VERSION < IOJS_3_0_MODULE_VERSION
-template <typename T> inline v8::Local<T> New(v8::Handle<T> h);
-#endif
-
-#if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
-template <typename T, typename M>
-    inline v8::Local<T> New(v8::Persistent<T, M> const& p);
-#else
-template <typename T> inline v8::Local<T> New(v8::Persistent<T> const& p);
-#endif
-template <typename T, typename M>
-inline v8::Local<T> New(Persistent<T, M> const& p);
-template <typename T>
-inline v8::Local<T> New(Global<T> const& p);
-
-inline
-imp::Factory<v8::Boolean>::return_t
-New(bool value) {
-  return New<v8::Boolean>(value);
-}
-
-inline
-imp::Factory<v8::Int32>::return_t
-New(int32_t value) {
-  return New<v8::Int32>(value);
-}
-
-inline
-imp::Factory<v8::Uint32>::return_t
-New(uint32_t value) {
-  return New<v8::Uint32>(value);
-}
-
-inline
-imp::Factory<v8::Number>::return_t
-New(double value) {
-  return New<v8::Number>(value);
-}
-
-inline
-imp::Factory<v8::String>::return_t
-New(std::string const& value) {  // NOLINT(build/include_what_you_use)
-  return New<v8::String>(value);
-}
-
-inline
-imp::Factory<v8::String>::return_t
-New(const char * value, int length) {
-  return New<v8::String>(value, length);
-}
-
-inline
-imp::Factory<v8::String>::return_t
-New(const uint16_t * value, int length) {
-  return New<v8::String>(value, length);
-}
-
-inline
-imp::Factory<v8::String>::return_t
-New(const char * value) {
-  return New<v8::String>(value);
-}
-
-inline
-imp::Factory<v8::String>::return_t
-New(const uint16_t * value) {
-  return New<v8::String>(value);
-}
-
-inline
-imp::Factory<v8::String>::return_t
-New(v8::String::ExternalStringResource * value) {
-  return New<v8::String>(value);
-}
-
-inline
-imp::Factory<v8::String>::return_t
-New(ExternalOneByteStringResource * value) {
-  return New<v8::String>(value);
-}
-
-inline
-imp::Factory<v8::RegExp>::return_t
-New(v8::Local<v8::String> pattern, v8::RegExp::Flags flags) {
-  return New<v8::RegExp>(pattern, flags);
-}
-
-#endif  // NAN_NEW_H_
diff --git a/js/node_modules/nan/nan_object_wrap.h b/js/node_modules/nan/nan_object_wrap.h
deleted file mode 100644
index f1cc156bf1946cd6896fc227489d8ec637addb42..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_object_wrap.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_OBJECT_WRAP_H_
-#define NAN_OBJECT_WRAP_H_
-
-class ObjectWrap {
- public:
-  ObjectWrap() {
-    refs_ = 0;
-  }
-
-
-  virtual ~ObjectWrap() {
-    if (persistent().IsEmpty()) {
-      return;
-    }
-
-    assert(persistent().IsNearDeath());
-    persistent().ClearWeak();
-    persistent().Reset();
-  }
-
-
-  template <class T>
-  static inline T* Unwrap(v8::Local<v8::Object> object) {
-    assert(!object.IsEmpty());
-    assert(object->InternalFieldCount() > 0);
-    // Cast to ObjectWrap before casting to T.  A direct cast from void
-    // to T won't work right when T has more than one base class.
-    void* ptr = GetInternalFieldPointer(object, 0);
-    ObjectWrap* wrap = static_cast<ObjectWrap*>(ptr);
-    return static_cast<T*>(wrap);
-  }
-
-
-  inline v8::Local<v8::Object> handle() const {
-    return New(handle_);
-  }
-
-
-  inline Persistent<v8::Object>& persistent() {
-    return handle_;
-  }
-
-
- protected:
-  inline void Wrap(v8::Local<v8::Object> object) {
-    assert(persistent().IsEmpty());
-    assert(object->InternalFieldCount() > 0);
-    SetInternalFieldPointer(object, 0, this);
-    persistent().Reset(object);
-    MakeWeak();
-  }
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-
-  inline void MakeWeak() {
-    persistent().v8::PersistentBase<v8::Object>::SetWeak(
-        this, WeakCallback, v8::WeakCallbackType::kParameter);
-    persistent().MarkIndependent();
-  }
-
-#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
-
-  inline void MakeWeak() {
-    persistent().v8::PersistentBase<v8::Object>::SetWeak(this, WeakCallback);
-    persistent().MarkIndependent();
-  }
-
-#else
-
-  inline void MakeWeak() {
-    persistent().persistent.MakeWeak(this, WeakCallback);
-    persistent().MarkIndependent();
-  }
-
-#endif
-
-  /* Ref() marks the object as being attached to an event loop.
-   * Refed objects will not be garbage collected, even if
-   * all references are lost.
-   */
-  virtual void Ref() {
-    assert(!persistent().IsEmpty());
-    persistent().ClearWeak();
-    refs_++;
-  }
-
-  /* Unref() marks an object as detached from the event loop.  This is its
-   * default state.  When an object with a "weak" reference changes from
-   * attached to detached state it will be freed. Be careful not to access
-   * the object after making this call as it might be gone!
-   * (A "weak reference" means an object that only has a
-   * persistant handle.)
-   *
-   * DO NOT CALL THIS FROM DESTRUCTOR
-   */
-  virtual void Unref() {
-    assert(!persistent().IsEmpty());
-    assert(!persistent().IsWeak());
-    assert(refs_ > 0);
-    if (--refs_ == 0)
-      MakeWeak();
-  }
-
-  int refs_;  // ro
-
- private:
-  NAN_DISALLOW_ASSIGN_COPY_MOVE(ObjectWrap)
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-
-  static void
-  WeakCallback(v8::WeakCallbackInfo<ObjectWrap> const& info) {
-    ObjectWrap* wrap = info.GetParameter();
-    assert(wrap->refs_ == 0);
-    assert(wrap->handle_.IsNearDeath());
-    wrap->handle_.Reset();
-    delete wrap;
-  }
-
-#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
-
-  static void
-  WeakCallback(v8::WeakCallbackData<v8::Object, ObjectWrap> const& data) {
-    ObjectWrap* wrap = data.GetParameter();
-    assert(wrap->refs_ == 0);
-    assert(wrap->handle_.IsNearDeath());
-    wrap->handle_.Reset();
-    delete wrap;
-  }
-
-#else
-
-  static void WeakCallback(v8::Persistent<v8::Value> value, void *data) {
-    ObjectWrap *wrap = static_cast<ObjectWrap*>(data);
-    assert(wrap->refs_ == 0);
-    assert(wrap->handle_.IsNearDeath());
-    wrap->handle_.Reset();
-    delete wrap;
-  }
-
-#endif
-  Persistent<v8::Object> handle_;
-};
-
-
-#endif  // NAN_OBJECT_WRAP_H_
diff --git a/js/node_modules/nan/nan_persistent_12_inl.h b/js/node_modules/nan/nan_persistent_12_inl.h
deleted file mode 100644
index eb4ff109f60eb8109928a87a049ed2003a05722a..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_persistent_12_inl.h
+++ /dev/null
@@ -1,129 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_PERSISTENT_12_INL_H_
-#define NAN_PERSISTENT_12_INL_H_
-
-template<typename T, typename M> class Persistent :
-    public v8::Persistent<T, M> {
- public:
-  inline Persistent() : v8::Persistent<T, M>() {}
-
-  template<typename S> inline Persistent(v8::Local<S> that) :
-      v8::Persistent<T, M>(v8::Isolate::GetCurrent(), that) {}
-
-  template<typename S, typename M2>
-  inline Persistent(const v8::Persistent<S, M2> &that) :
-      v8::Persistent<T, M2>(v8::Isolate::GetCurrent(), that) {}
-
-  inline void Reset() { v8::PersistentBase<T>::Reset(); }
-
-  template <typename S>
-  inline void Reset(const v8::Local<S> &other) {
-    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
-  }
-
-  template <typename S>
-  inline void Reset(const v8::PersistentBase<S> &other) {
-    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
-  }
-
-  template<typename P>
-  inline void SetWeak(
-    P *parameter
-    , typename WeakCallbackInfo<P>::Callback callback
-    , WeakCallbackType type);
-
- private:
-  inline T *operator*() const { return *PersistentBase<T>::persistent; }
-
-  template<typename S, typename M2>
-  inline void Copy(const Persistent<S, M2> &that) {
-    TYPE_CHECK(T, S);
-
-    this->Reset();
-
-    if (!that.IsEmpty()) {
-      this->Reset(that);
-      M::Copy(that, this);
-    }
-  }
-};
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-template<typename T>
-class Global : public v8::Global<T> {
- public:
-  inline Global() : v8::Global<T>() {}
-
-  template<typename S> inline Global(v8::Local<S> that) :
-    v8::Global<T>(v8::Isolate::GetCurrent(), that) {}
-
-  template<typename S>
-  inline Global(const v8::PersistentBase<S> &that) :
-      v8::Global<S>(v8::Isolate::GetCurrent(), that) {}
-
-  inline void Reset() { v8::PersistentBase<T>::Reset(); }
-
-  template <typename S>
-  inline void Reset(const v8::Local<S> &other) {
-    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
-  }
-
-  template <typename S>
-  inline void Reset(const v8::PersistentBase<S> &other) {
-    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
-  }
-
-  template<typename P>
-  inline void SetWeak(
-    P *parameter
-    , typename WeakCallbackInfo<P>::Callback callback
-    , WeakCallbackType type) {
-    reinterpret_cast<Persistent<T>*>(this)->SetWeak(
-        parameter, callback, type);
-  }
-};
-#else
-template<typename T>
-class Global : public v8::UniquePersistent<T> {
- public:
-  inline Global() : v8::UniquePersistent<T>() {}
-
-  template<typename S> inline Global(v8::Local<S> that) :
-    v8::UniquePersistent<T>(v8::Isolate::GetCurrent(), that) {}
-
-  template<typename S>
-  inline Global(const v8::PersistentBase<S> &that) :
-      v8::UniquePersistent<S>(v8::Isolate::GetCurrent(), that) {}
-
-  inline void Reset() { v8::PersistentBase<T>::Reset(); }
-
-  template <typename S>
-  inline void Reset(const v8::Local<S> &other) {
-    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
-  }
-
-  template <typename S>
-  inline void Reset(const v8::PersistentBase<S> &other) {
-    v8::PersistentBase<T>::Reset(v8::Isolate::GetCurrent(), other);
-  }
-
-  template<typename P>
-  inline void SetWeak(
-    P *parameter
-    , typename WeakCallbackInfo<P>::Callback callback
-    , WeakCallbackType type) {
-    reinterpret_cast<Persistent<T>*>(this)->SetWeak(
-        parameter, callback, type);
-  }
-};
-#endif
-
-#endif  // NAN_PERSISTENT_12_INL_H_
diff --git a/js/node_modules/nan/nan_persistent_pre_12_inl.h b/js/node_modules/nan/nan_persistent_pre_12_inl.h
deleted file mode 100644
index 0d427edb18277d2668081839f832a0045f4a6c0e..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_persistent_pre_12_inl.h
+++ /dev/null
@@ -1,242 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_PERSISTENT_PRE_12_INL_H_
-#define NAN_PERSISTENT_PRE_12_INL_H_
-
-template<typename T>
-class PersistentBase {
-  v8::Persistent<T> persistent;
-  template<typename U>
-  friend v8::Local<U> New(const PersistentBase<U> &p);
-  template<typename U, typename M>
-  friend v8::Local<U> New(const Persistent<U, M> &p);
-  template<typename U>
-  friend v8::Local<U> New(const Global<U> &p);
-  template<typename S> friend class ReturnValue;
-
- public:
-  inline PersistentBase() :
-      persistent() {}
-
-  inline void Reset() {
-    persistent.Dispose();
-    persistent.Clear();
-  }
-
-  template<typename S>
-  inline void Reset(const v8::Local<S> &other) {
-    TYPE_CHECK(T, S);
-
-    if (!persistent.IsEmpty()) {
-      persistent.Dispose();
-    }
-
-    if (other.IsEmpty()) {
-      persistent.Clear();
-    } else {
-      persistent = v8::Persistent<T>::New(other);
-    }
-  }
-
-  template<typename S>
-  inline void Reset(const PersistentBase<S> &other) {
-    TYPE_CHECK(T, S);
-
-    if (!persistent.IsEmpty()) {
-      persistent.Dispose();
-    }
-
-    if (other.IsEmpty()) {
-      persistent.Clear();
-    } else {
-      persistent = v8::Persistent<T>::New(other.persistent);
-    }
-  }
-
-  inline bool IsEmpty() const { return persistent.IsEmpty(); }
-
-  inline void Empty() { persistent.Clear(); }
-
-  template<typename S>
-  inline bool operator==(const PersistentBase<S> &that) const {
-    return this->persistent == that.persistent;
-  }
-
-  template<typename S>
-  inline bool operator==(const v8::Local<S> &that) const {
-    return this->persistent == that;
-  }
-
-  template<typename S>
-  inline bool operator!=(const PersistentBase<S> &that) const {
-    return !operator==(that);
-  }
-
-  template<typename S>
-  inline bool operator!=(const v8::Local<S> &that) const {
-    return !operator==(that);
-  }
-
-  template<typename P>
-  inline void SetWeak(
-    P *parameter
-    , typename WeakCallbackInfo<P>::Callback callback
-    , WeakCallbackType type);
-
-  inline void ClearWeak() { persistent.ClearWeak(); }
-
-  inline void MarkIndependent() { persistent.MarkIndependent(); }
-
-  inline bool IsIndependent() const { return persistent.IsIndependent(); }
-
-  inline bool IsNearDeath() const { return persistent.IsNearDeath(); }
-
-  inline bool IsWeak() const { return persistent.IsWeak(); }
-
- private:
-  inline explicit PersistentBase(v8::Persistent<T> that) :
-      persistent(that) { }
-  inline explicit PersistentBase(T *val) : persistent(val) {}
-  template<typename S, typename M> friend class Persistent;
-  template<typename S> friend class Global;
-  friend class ObjectWrap;
-};
-
-template<typename T>
-class NonCopyablePersistentTraits {
- public:
-  typedef Persistent<T, NonCopyablePersistentTraits<T> >
-      NonCopyablePersistent;
-  static const bool kResetInDestructor = false;
-  template<typename S, typename M>
-  inline static void Copy(const Persistent<S, M> &source,
-                             NonCopyablePersistent *dest) {
-    Uncompilable<v8::Object>();
-  }
-
-  template<typename O> inline static void Uncompilable() {
-    TYPE_CHECK(O, v8::Primitive);
-  }
-};
-
-template<typename T>
-struct CopyablePersistentTraits {
-  typedef Persistent<T, CopyablePersistentTraits<T> > CopyablePersistent;
-  static const bool kResetInDestructor = true;
-  template<typename S, typename M>
-  static inline void Copy(const Persistent<S, M> &source,
-                             CopyablePersistent *dest) {}
-};
-
-template<typename T, typename M> class Persistent :
-    public PersistentBase<T> {
- public:
-  inline Persistent() {}
-
-  template<typename S> inline Persistent(v8::Handle<S> that)
-      : PersistentBase<T>(v8::Persistent<T>::New(that)) {
-    TYPE_CHECK(T, S);
-  }
-
-  inline Persistent(const Persistent &that) : PersistentBase<T>() {
-    Copy(that);
-  }
-
-  template<typename S, typename M2>
-  inline Persistent(const Persistent<S, M2> &that) :
-      PersistentBase<T>() {
-    Copy(that);
-  }
-
-  inline Persistent &operator=(const Persistent &that) {
-    Copy(that);
-    return *this;
-  }
-
-  template <class S, class M2>
-  inline Persistent &operator=(const Persistent<S, M2> &that) {
-    Copy(that);
-    return *this;
-  }
-
-  inline ~Persistent() {
-    if (M::kResetInDestructor) this->Reset();
-  }
-
- private:
-  inline T *operator*() const { return *PersistentBase<T>::persistent; }
-
-  template<typename S, typename M2>
-  inline void Copy(const Persistent<S, M2> &that) {
-    TYPE_CHECK(T, S);
-
-    this->Reset();
-
-    if (!that.IsEmpty()) {
-      this->persistent = v8::Persistent<T>::New(that.persistent);
-      M::Copy(that, this);
-    }
-  }
-};
-
-template<typename T>
-class Global : public PersistentBase<T> {
-  struct RValue {
-    inline explicit RValue(Global* obj) : object(obj) {}
-    Global* object;
-  };
-
- public:
-  inline Global() : PersistentBase<T>(0) { }
-
-  template <typename S>
-  inline Global(v8::Local<S> that)
-      : PersistentBase<T>(v8::Persistent<T>::New(that)) {
-    TYPE_CHECK(T, S);
-  }
-
-  template <typename S>
-  inline Global(const PersistentBase<S> &that)
-    : PersistentBase<T>(that) {
-    TYPE_CHECK(T, S);
-  }
-  /**
-   * Move constructor.
-   */
-  inline Global(RValue rvalue)
-    : PersistentBase<T>(rvalue.object->persistent) {
-    rvalue.object->Reset();
-  }
-  inline ~Global() { this->Reset(); }
-  /**
-   * Move via assignment.
-   */
-  template<typename S>
-  inline Global &operator=(Global<S> rhs) {
-    TYPE_CHECK(T, S);
-    this->Reset(rhs.persistent);
-    rhs.Reset();
-    return *this;
-  }
-  /**
-   * Cast operator for moves.
-   */
-  inline operator RValue() { return RValue(this); }
-  /**
-   * Pass allows returning uniques from functions, etc.
-   */
-  Global Pass() { return Global(RValue(this)); }
-
- private:
-  Global(Global &);
-  void operator=(Global &);
-  template<typename S> friend class ReturnValue;
-};
-
-#endif  // NAN_PERSISTENT_PRE_12_INL_H_
diff --git a/js/node_modules/nan/nan_string_bytes.h b/js/node_modules/nan/nan_string_bytes.h
deleted file mode 100644
index a2e6437d12b74cd29fad17ed6c40e1e739eded2c..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_string_bytes.h
+++ /dev/null
@@ -1,305 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-#ifndef NAN_STRING_BYTES_H_
-#define NAN_STRING_BYTES_H_
-
-// Decodes a v8::Local<v8::String> or Buffer to a raw char*
-
-namespace imp {
-
-using v8::Local;
-using v8::Object;
-using v8::String;
-using v8::Value;
-
-
-//// Base 64 ////
-
-#define base64_encoded_size(size) ((size + 2 - ((size + 2) % 3)) / 3 * 4)
-
-
-
-//// HEX ////
-
-static bool contains_non_ascii_slow(const char* buf, size_t len) {
-  for (size_t i = 0; i < len; ++i) {
-    if (buf[i] & 0x80) return true;
-  }
-  return false;
-}
-
-
-static bool contains_non_ascii(const char* src, size_t len) {
-  if (len < 16) {
-    return contains_non_ascii_slow(src, len);
-  }
-
-  const unsigned bytes_per_word = sizeof(void*);
-  const unsigned align_mask = bytes_per_word - 1;
-  const unsigned unaligned = reinterpret_cast<uintptr_t>(src) & align_mask;
-
-  if (unaligned > 0) {
-    const unsigned n = bytes_per_word - unaligned;
-    if (contains_non_ascii_slow(src, n)) return true;
-    src += n;
-    len -= n;
-  }
-
-
-#if defined(__x86_64__) || defined(_WIN64)
-  const uintptr_t mask = 0x8080808080808080ll;
-#else
-  const uintptr_t mask = 0x80808080l;
-#endif
-
-  const uintptr_t* srcw = reinterpret_cast<const uintptr_t*>(src);
-
-  for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) {
-    if (srcw[i] & mask) return true;
-  }
-
-  const unsigned remainder = len & align_mask;
-  if (remainder > 0) {
-    const size_t offset = len - remainder;
-    if (contains_non_ascii_slow(src + offset, remainder)) return true;
-  }
-
-  return false;
-}
-
-
-static void force_ascii_slow(const char* src, char* dst, size_t len) {
-  for (size_t i = 0; i < len; ++i) {
-    dst[i] = src[i] & 0x7f;
-  }
-}
-
-
-static void force_ascii(const char* src, char* dst, size_t len) {
-  if (len < 16) {
-    force_ascii_slow(src, dst, len);
-    return;
-  }
-
-  const unsigned bytes_per_word = sizeof(void*);
-  const unsigned align_mask = bytes_per_word - 1;
-  const unsigned src_unalign = reinterpret_cast<uintptr_t>(src) & align_mask;
-  const unsigned dst_unalign = reinterpret_cast<uintptr_t>(dst) & align_mask;
-
-  if (src_unalign > 0) {
-    if (src_unalign == dst_unalign) {
-      const unsigned unalign = bytes_per_word - src_unalign;
-      force_ascii_slow(src, dst, unalign);
-      src += unalign;
-      dst += unalign;
-      len -= src_unalign;
-    } else {
-      force_ascii_slow(src, dst, len);
-      return;
-    }
-  }
-
-#if defined(__x86_64__) || defined(_WIN64)
-  const uintptr_t mask = ~0x8080808080808080ll;
-#else
-  const uintptr_t mask = ~0x80808080l;
-#endif
-
-  const uintptr_t* srcw = reinterpret_cast<const uintptr_t*>(src);
-  uintptr_t* dstw = reinterpret_cast<uintptr_t*>(dst);
-
-  for (size_t i = 0, n = len / bytes_per_word; i < n; ++i) {
-    dstw[i] = srcw[i] & mask;
-  }
-
-  const unsigned remainder = len & align_mask;
-  if (remainder > 0) {
-    const size_t offset = len - remainder;
-    force_ascii_slow(src + offset, dst + offset, remainder);
-  }
-}
-
-
-static size_t base64_encode(const char* src,
-                            size_t slen,
-                            char* dst,
-                            size_t dlen) {
-  // We know how much we'll write, just make sure that there's space.
-  assert(dlen >= base64_encoded_size(slen) &&
-      "not enough space provided for base64 encode");
-
-  dlen = base64_encoded_size(slen);
-
-  unsigned a;
-  unsigned b;
-  unsigned c;
-  unsigned i;
-  unsigned k;
-  unsigned n;
-
-  static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
-                              "abcdefghijklmnopqrstuvwxyz"
-                              "0123456789+/";
-
-  i = 0;
-  k = 0;
-  n = slen / 3 * 3;
-
-  while (i < n) {
-    a = src[i + 0] & 0xff;
-    b = src[i + 1] & 0xff;
-    c = src[i + 2] & 0xff;
-
-    dst[k + 0] = table[a >> 2];
-    dst[k + 1] = table[((a & 3) << 4) | (b >> 4)];
-    dst[k + 2] = table[((b & 0x0f) << 2) | (c >> 6)];
-    dst[k + 3] = table[c & 0x3f];
-
-    i += 3;
-    k += 4;
-  }
-
-  if (n != slen) {
-    switch (slen - n) {
-      case 1:
-        a = src[i + 0] & 0xff;
-        dst[k + 0] = table[a >> 2];
-        dst[k + 1] = table[(a & 3) << 4];
-        dst[k + 2] = '=';
-        dst[k + 3] = '=';
-        break;
-
-      case 2:
-        a = src[i + 0] & 0xff;
-        b = src[i + 1] & 0xff;
-        dst[k + 0] = table[a >> 2];
-        dst[k + 1] = table[((a & 3) << 4) | (b >> 4)];
-        dst[k + 2] = table[(b & 0x0f) << 2];
-        dst[k + 3] = '=';
-        break;
-    }
-  }
-
-  return dlen;
-}
-
-
-static size_t hex_encode(const char* src, size_t slen, char* dst, size_t dlen) {
-  // We know how much we'll write, just make sure that there's space.
-  assert(dlen >= slen * 2 &&
-      "not enough space provided for hex encode");
-
-  dlen = slen * 2;
-  for (uint32_t i = 0, k = 0; k < dlen; i += 1, k += 2) {
-    static const char hex[] = "0123456789abcdef";
-    uint8_t val = static_cast<uint8_t>(src[i]);
-    dst[k + 0] = hex[val >> 4];
-    dst[k + 1] = hex[val & 15];
-  }
-
-  return dlen;
-}
-
-
-
-static Local<Value> Encode(const char* buf,
-                           size_t buflen,
-                           enum Encoding encoding) {
-  assert(buflen <= node::Buffer::kMaxLength);
-  if (!buflen && encoding != BUFFER)
-    return New("").ToLocalChecked();
-
-  Local<String> val;
-  switch (encoding) {
-    case BUFFER:
-      return CopyBuffer(buf, buflen).ToLocalChecked();
-
-    case ASCII:
-      if (contains_non_ascii(buf, buflen)) {
-        char* out = new char[buflen];
-        force_ascii(buf, out, buflen);
-        val = New<String>(out, buflen).ToLocalChecked();
-        delete[] out;
-      } else {
-        val = New<String>(buf, buflen).ToLocalChecked();
-      }
-      break;
-
-    case UTF8:
-      val = New<String>(buf, buflen).ToLocalChecked();
-      break;
-
-    case BINARY: {
-      // TODO(isaacs) use ExternalTwoByteString?
-      const unsigned char *cbuf = reinterpret_cast<const unsigned char*>(buf);
-      uint16_t * twobytebuf = new uint16_t[buflen];
-      for (size_t i = 0; i < buflen; i++) {
-        // XXX is the following line platform independent?
-        twobytebuf[i] = cbuf[i];
-      }
-      val = New<String>(twobytebuf, buflen).ToLocalChecked();
-      delete[] twobytebuf;
-      break;
-    }
-
-    case BASE64: {
-      size_t dlen = base64_encoded_size(buflen);
-      char* dst = new char[dlen];
-
-      size_t written = base64_encode(buf, buflen, dst, dlen);
-      assert(written == dlen);
-
-      val = New<String>(dst, dlen).ToLocalChecked();
-      delete[] dst;
-      break;
-    }
-
-    case UCS2: {
-      const uint16_t* data = reinterpret_cast<const uint16_t*>(buf);
-      val = New<String>(data, buflen / 2).ToLocalChecked();
-      break;
-    }
-
-    case HEX: {
-      size_t dlen = buflen * 2;
-      char* dst = new char[dlen];
-      size_t written = hex_encode(buf, buflen, dst, dlen);
-      assert(written == dlen);
-
-      val = New<String>(dst, dlen).ToLocalChecked();
-      delete[] dst;
-      break;
-    }
-
-    default:
-      assert(0 && "unknown encoding");
-      break;
-  }
-
-  return val;
-}
-
-#undef base64_encoded_size
-
-}  // end of namespace imp
-
-#endif  // NAN_STRING_BYTES_H_
diff --git a/js/node_modules/nan/nan_typedarray_contents.h b/js/node_modules/nan/nan_typedarray_contents.h
deleted file mode 100644
index b7159619ac09f47db59999f3550ede33e17e9c54..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_typedarray_contents.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_TYPEDARRAY_CONTENTS_H_
-#define NAN_TYPEDARRAY_CONTENTS_H_
-
-template<typename T>
-class TypedArrayContents {
- public:
-  inline explicit TypedArrayContents(v8::Local<v8::Value> from) :
-      length_(0), data_(NULL) {
-
-    size_t length = 0;
-    void*  data = NULL;
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-
-    if (from->IsArrayBufferView()) {
-      v8::Local<v8::ArrayBufferView> array =
-        v8::Local<v8::ArrayBufferView>::Cast(from);
-
-      const size_t    byte_length = array->ByteLength();
-      const ptrdiff_t byte_offset = array->ByteOffset();
-      v8::Local<v8::ArrayBuffer> buffer = array->Buffer();
-
-      length = byte_length / sizeof(T);
-      data   = static_cast<char*>(buffer->GetContents().Data()) + byte_offset;
-    }
-
-#else
-
-    if (from->IsObject() && !from->IsNull()) {
-      v8::Local<v8::Object> array = v8::Local<v8::Object>::Cast(from);
-
-      MaybeLocal<v8::Value> buffer = Get(array,
-        New<v8::String>("buffer").ToLocalChecked());
-      MaybeLocal<v8::Value> byte_length = Get(array,
-        New<v8::String>("byteLength").ToLocalChecked());
-      MaybeLocal<v8::Value> byte_offset = Get(array,
-        New<v8::String>("byteOffset").ToLocalChecked());
-
-      if (!buffer.IsEmpty() &&
-          !byte_length.IsEmpty() && byte_length.ToLocalChecked()->IsUint32() &&
-          !byte_offset.IsEmpty() && byte_offset.ToLocalChecked()->IsUint32()) {
-        data = array->GetIndexedPropertiesExternalArrayData();
-        if(data) {
-          length = byte_length.ToLocalChecked()->Uint32Value() / sizeof(T);
-        }
-      }
-    }
-
-#endif
-
-#if defined(_MSC_VER) && _MSC_VER >= 1900 || __cplusplus >= 201103L
-    assert(reinterpret_cast<uintptr_t>(data) % alignof (T) == 0);
-#elif defined(_MSC_VER) && _MSC_VER >= 1600 || defined(__GNUC__)
-    assert(reinterpret_cast<uintptr_t>(data) % __alignof(T) == 0);
-#else
-    assert(reinterpret_cast<uintptr_t>(data) % sizeof (T) == 0);
-#endif
-
-    length_ = length;
-    data_   = static_cast<T*>(data);
-  }
-
-  inline size_t length() const      { return length_; }
-  inline T* operator*()             { return data_;   }
-  inline const T* operator*() const { return data_;   }
-
- private:
-  NAN_DISALLOW_ASSIGN_COPY_MOVE(TypedArrayContents)
-
-  //Disable heap allocation
-  void *operator new(size_t size);
-  void operator delete(void *, size_t);
-
-  size_t  length_;
-  T*      data_;
-};
-
-#endif  // NAN_TYPEDARRAY_CONTENTS_H_
diff --git a/js/node_modules/nan/nan_weak.h b/js/node_modules/nan/nan_weak.h
deleted file mode 100644
index 93f6fe86abaa7fa8beccd2581062f258165e39db..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/nan_weak.h
+++ /dev/null
@@ -1,432 +0,0 @@
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-#ifndef NAN_WEAK_H_
-#define NAN_WEAK_H_
-
-static const int kInternalFieldsInWeakCallback = 2;
-static const int kNoInternalFieldIndex = -1;
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
-    v8::WeakCallbackInfo<WeakCallbackInfo<T> > const&
-# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
-    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
-# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
-# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
-#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION
-# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
-    v8::PhantomCallbackData<WeakCallbackInfo<T> > const&
-# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
-    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
-# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
-# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
-#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
-# define NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ \
-    v8::PhantomCallbackData<WeakCallbackInfo<T> > const&
-# define NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ \
-    v8::InternalFieldsCallbackData<WeakCallbackInfo<T>, void> const&
-# define NAN_WEAK_PARAMETER_CALLBACK_SIG_ NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
-# define NAN_WEAK_TWOFIELD_CALLBACK_SIG_ NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
-#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
-# define NAN_WEAK_CALLBACK_DATA_TYPE_ \
-    v8::WeakCallbackData<S, WeakCallbackInfo<T> > const&
-# define NAN_WEAK_CALLBACK_SIG_ NAN_WEAK_CALLBACK_DATA_TYPE_
-#else
-# define NAN_WEAK_CALLBACK_DATA_TYPE_ void *
-# define NAN_WEAK_CALLBACK_SIG_ \
-    v8::Persistent<v8::Value>, NAN_WEAK_CALLBACK_DATA_TYPE_
-#endif
-
-template<typename T>
-class WeakCallbackInfo {
- public:
-  typedef void (*Callback)(const WeakCallbackInfo<T>& data);
-  WeakCallbackInfo(
-      Persistent<v8::Value> *persistent
-    , Callback callback
-    , void *parameter
-    , void *field1 = 0
-    , void *field2 = 0) :
-        callback_(callback), isolate_(0), parameter_(parameter) {
-    std::memcpy(&persistent_, persistent, sizeof (v8::Persistent<v8::Value>));
-    internal_fields_[0] = field1;
-    internal_fields_[1] = field2;
-  }
-  inline v8::Isolate *GetIsolate() const { return isolate_; }
-  inline T *GetParameter() const { return static_cast<T*>(parameter_); }
-  inline void *GetInternalField(int index) const {
-    assert((index == 0 || index == 1) && "internal field index out of bounds");
-    if (index == 0) {
-      return internal_fields_[0];
-    } else {
-      return internal_fields_[1];
-    }
-  }
-
- private:
-  NAN_DISALLOW_ASSIGN_COPY_MOVE(WeakCallbackInfo)
-  Callback callback_;
-  v8::Isolate *isolate_;
-  void *parameter_;
-  void *internal_fields_[kInternalFieldsInWeakCallback];
-  v8::Persistent<v8::Value> persistent_;
-  template<typename S, typename M> friend class Persistent;
-  template<typename S> friend class PersistentBase;
-#if NODE_MODULE_VERSION <= NODE_0_12_MODULE_VERSION
-# if NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
-  template<typename S>
-  static void invoke(NAN_WEAK_CALLBACK_SIG_ data);
-  template<typename S>
-  static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data);
-# else
-  static void invoke(NAN_WEAK_CALLBACK_SIG_ data);
-  static WeakCallbackInfo *unwrap(NAN_WEAK_CALLBACK_DATA_TYPE_ data);
-# endif
-#else
-# if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                     \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-  template<bool isFirstPass>
-  static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data);
-  template<bool isFirstPass>
-  static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data);
-# else
-  static void invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data);
-  static void invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data);
-# endif
-  static WeakCallbackInfo *unwrapparameter(
-      NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data);
-  static WeakCallbackInfo *unwraptwofield(
-      NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data);
-#endif
-};
-
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-
-template<typename T>
-template<bool isFirstPass>
-void
-WeakCallbackInfo<T>::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) {
-  WeakCallbackInfo<T> *cbinfo = unwrapparameter(data);
-  if (isFirstPass) {
-    cbinfo->persistent_.Reset();
-    data.SetSecondPassCallback(invokeparameter<false>);
-  } else {
-    cbinfo->callback_(*cbinfo);
-    delete cbinfo;
-  }
-}
-
-template<typename T>
-template<bool isFirstPass>
-void
-WeakCallbackInfo<T>::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) {
-  WeakCallbackInfo<T> *cbinfo = unwraptwofield(data);
-  if (isFirstPass) {
-    cbinfo->persistent_.Reset();
-    data.SetSecondPassCallback(invoketwofield<false>);
-  } else {
-    cbinfo->callback_(*cbinfo);
-    delete cbinfo;
-  }
-}
-
-template<typename T>
-WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrapparameter(
-    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) {
-  WeakCallbackInfo<T> *cbinfo =
-      static_cast<WeakCallbackInfo<T>*>(data.GetParameter());
-  cbinfo->isolate_ = data.GetIsolate();
-  return cbinfo;
-}
-
-template<typename T>
-WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwraptwofield(
-    NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) {
-  WeakCallbackInfo<T> *cbinfo =
-      static_cast<WeakCallbackInfo<T>*>(data.GetInternalField(0));
-  cbinfo->isolate_ = data.GetIsolate();
-  return cbinfo;
-}
-
-#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_
-#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_
-#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
-#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
-# elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
-
-template<typename T>
-void
-WeakCallbackInfo<T>::invokeparameter(NAN_WEAK_PARAMETER_CALLBACK_SIG_ data) {
-  WeakCallbackInfo<T> *cbinfo = unwrapparameter(data);
-  cbinfo->persistent_.Reset();
-  cbinfo->callback_(*cbinfo);
-  delete cbinfo;
-}
-
-template<typename T>
-void
-WeakCallbackInfo<T>::invoketwofield(NAN_WEAK_TWOFIELD_CALLBACK_SIG_ data) {
-  WeakCallbackInfo<T> *cbinfo = unwraptwofield(data);
-  cbinfo->persistent_.Reset();
-  cbinfo->callback_(*cbinfo);
-  delete cbinfo;
-}
-
-template<typename T>
-WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrapparameter(
-    NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_ data) {
-  WeakCallbackInfo<T> *cbinfo =
-       static_cast<WeakCallbackInfo<T>*>(data.GetParameter());
-  cbinfo->isolate_ = data.GetIsolate();
-  return cbinfo;
-}
-
-template<typename T>
-WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwraptwofield(
-    NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_ data) {
-  WeakCallbackInfo<T> *cbinfo =
-       static_cast<WeakCallbackInfo<T>*>(data.GetInternalField1());
-  cbinfo->isolate_ = data.GetIsolate();
-  return cbinfo;
-}
-
-#undef NAN_WEAK_PARAMETER_CALLBACK_SIG_
-#undef NAN_WEAK_TWOFIELD_CALLBACK_SIG_
-#undef NAN_WEAK_PARAMETER_CALLBACK_DATA_TYPE_
-#undef NAN_WEAK_TWOFIELD_CALLBACK_DATA_TYPE_
-#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
-
-template<typename T>
-template<typename S>
-void WeakCallbackInfo<T>::invoke(NAN_WEAK_CALLBACK_SIG_ data) {
-  WeakCallbackInfo<T> *cbinfo = unwrap(data);
-  cbinfo->persistent_.Reset();
-  cbinfo->callback_(*cbinfo);
-  delete cbinfo;
-}
-
-template<typename T>
-template<typename S>
-WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrap(
-    NAN_WEAK_CALLBACK_DATA_TYPE_ data) {
-  void *parameter = data.GetParameter();
-  WeakCallbackInfo<T> *cbinfo =
-      static_cast<WeakCallbackInfo<T>*>(parameter);
-  cbinfo->isolate_ = data.GetIsolate();
-  return cbinfo;
-}
-
-#undef NAN_WEAK_CALLBACK_SIG_
-#undef NAN_WEAK_CALLBACK_DATA_TYPE_
-#else
-
-template<typename T>
-void WeakCallbackInfo<T>::invoke(NAN_WEAK_CALLBACK_SIG_ data) {
-  WeakCallbackInfo<T> *cbinfo = unwrap(data);
-  cbinfo->persistent_.Dispose();
-  cbinfo->persistent_.Clear();
-  cbinfo->callback_(*cbinfo);
-  delete cbinfo;
-}
-
-template<typename T>
-WeakCallbackInfo<T> *WeakCallbackInfo<T>::unwrap(
-    NAN_WEAK_CALLBACK_DATA_TYPE_ data) {
-  WeakCallbackInfo<T> *cbinfo =
-      static_cast<WeakCallbackInfo<T>*>(data);
-  cbinfo->isolate_ = v8::Isolate::GetCurrent();
-  return cbinfo;
-}
-
-#undef NAN_WEAK_CALLBACK_SIG_
-#undef NAN_WEAK_CALLBACK_DATA_TYPE_
-#endif
-
-#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 4 ||                      \
-  (V8_MAJOR_VERSION == 4 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION >= 3))
-template<typename T, typename M>
-template<typename P>
-inline void Persistent<T, M>::SetWeak(
-    P *parameter
-  , typename WeakCallbackInfo<P>::Callback callback
-  , WeakCallbackType type) {
-  WeakCallbackInfo<P> *wcbd;
-  if (type == WeakCallbackType::kParameter) {
-    wcbd = new WeakCallbackInfo<P>(
-        reinterpret_cast<Persistent<v8::Value>*>(this)
-      , callback
-      , parameter);
-    v8::PersistentBase<T>::SetWeak(
-        wcbd
-      , WeakCallbackInfo<P>::template invokeparameter<true>
-      , type);
-  } else {
-    v8::Local<T>* self = reinterpret_cast<v8::Local<T>*>(this);
-    assert((*self)->IsObject());
-    int count = (*self)->InternalFieldCount();
-    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
-    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
-      internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i);
-    }
-    wcbd = new WeakCallbackInfo<P>(
-        reinterpret_cast<Persistent<v8::Value>*>(this)
-      , callback
-      , 0
-      , internal_fields[0]
-      , internal_fields[1]);
-    (*self)->SetAlignedPointerInInternalField(0, wcbd);
-    v8::PersistentBase<T>::SetWeak(
-        static_cast<WeakCallbackInfo<P>*>(0)
-      , WeakCallbackInfo<P>::template invoketwofield<true>
-      , type);
-  }
-}
-#elif NODE_MODULE_VERSION > IOJS_1_1_MODULE_VERSION
-template<typename T, typename M>
-template<typename P>
-inline void Persistent<T, M>::SetWeak(
-    P *parameter
-  , typename WeakCallbackInfo<P>::Callback callback
-  , WeakCallbackType type) {
-  WeakCallbackInfo<P> *wcbd;
-  if (type == WeakCallbackType::kParameter) {
-    wcbd = new WeakCallbackInfo<P>(
-        reinterpret_cast<Persistent<v8::Value>*>(this)
-      , callback
-      , parameter);
-    v8::PersistentBase<T>::SetPhantom(
-        wcbd
-      , WeakCallbackInfo<P>::invokeparameter);
-  } else {
-    v8::Local<T>* self = reinterpret_cast<v8::Local<T>*>(this);
-    assert((*self)->IsObject());
-    int count = (*self)->InternalFieldCount();
-    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
-    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
-      internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i);
-    }
-    wcbd = new WeakCallbackInfo<P>(
-        reinterpret_cast<Persistent<v8::Value>*>(this)
-      , callback
-      , 0
-      , internal_fields[0]
-      , internal_fields[1]);
-    (*self)->SetAlignedPointerInInternalField(0, wcbd);
-    v8::PersistentBase<T>::SetPhantom(
-        static_cast<WeakCallbackInfo<P>*>(0)
-      , WeakCallbackInfo<P>::invoketwofield
-      , 0
-      , count > 1 ? 1 : kNoInternalFieldIndex);
-  }
-}
-#elif NODE_MODULE_VERSION > NODE_0_12_MODULE_VERSION
-template<typename T, typename M>
-template<typename P>
-inline void Persistent<T, M>::SetWeak(
-    P *parameter
-  , typename WeakCallbackInfo<P>::Callback callback
-  , WeakCallbackType type) {
-  WeakCallbackInfo<P> *wcbd;
-  if (type == WeakCallbackType::kParameter) {
-    wcbd = new WeakCallbackInfo<P>(
-        reinterpret_cast<Persistent<v8::Value>*>(this)
-      , callback
-      , parameter);
-    v8::PersistentBase<T>::SetPhantom(
-        wcbd
-      , WeakCallbackInfo<P>::invokeparameter);
-  } else {
-    v8::Local<T>* self = reinterpret_cast<v8::Local<T>*>(this);
-    assert((*self)->IsObject());
-    int count = (*self)->InternalFieldCount();
-    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
-    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
-      internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i);
-    }
-    wcbd = new WeakCallbackInfo<P>(
-        reinterpret_cast<Persistent<v8::Value>*>(this)
-      , callback
-      , 0
-      , internal_fields[0]
-      , internal_fields[1]);
-    (*self)->SetAlignedPointerInInternalField(0, wcbd);
-    v8::PersistentBase<T>::SetPhantom(
-        WeakCallbackInfo<P>::invoketwofield
-      , 0
-      , count > 1 ? 1 : kNoInternalFieldIndex);
-  }
-}
-#elif NODE_MODULE_VERSION > NODE_0_10_MODULE_VERSION
-template<typename T, typename M>
-template<typename P>
-inline void Persistent<T, M>::SetWeak(
-    P *parameter
-  , typename WeakCallbackInfo<P>::Callback callback
-  , WeakCallbackType type) {
-  WeakCallbackInfo<P> *wcbd;
-  if (type == WeakCallbackType::kParameter) {
-    wcbd = new WeakCallbackInfo<P>(
-        reinterpret_cast<Persistent<v8::Value>*>(this)
-      , callback
-      , parameter);
-    v8::PersistentBase<T>::SetWeak(wcbd, WeakCallbackInfo<P>::invoke);
-  } else {
-    v8::Local<T>* self = reinterpret_cast<v8::Local<T>*>(this);
-    assert((*self)->IsObject());
-    int count = (*self)->InternalFieldCount();
-    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
-    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
-      internal_fields[i] = (*self)->GetAlignedPointerFromInternalField(i);
-    }
-    wcbd = new WeakCallbackInfo<P>(
-        reinterpret_cast<Persistent<v8::Value>*>(this)
-      , callback
-      , 0
-      , internal_fields[0]
-      , internal_fields[1]);
-    v8::PersistentBase<T>::SetWeak(wcbd, WeakCallbackInfo<P>::invoke);
-  }
-}
-#else
-template<typename T>
-template<typename P>
-inline void PersistentBase<T>::SetWeak(
-    P *parameter
-  , typename WeakCallbackInfo<P>::Callback callback
-  , WeakCallbackType type) {
-  WeakCallbackInfo<P> *wcbd;
-  if (type == WeakCallbackType::kParameter) {
-    wcbd = new WeakCallbackInfo<P>(
-        reinterpret_cast<Persistent<v8::Value>*>(this)
-      , callback
-      , parameter);
-    persistent.MakeWeak(wcbd, WeakCallbackInfo<P>::invoke);
-  } else {
-    v8::Local<T>* self = reinterpret_cast<v8::Local<T>*>(this);
-    assert((*self)->IsObject());
-    int count = (*self)->InternalFieldCount();
-    void *internal_fields[kInternalFieldsInWeakCallback] = {0, 0};
-    for (int i = 0; i < count && i < kInternalFieldsInWeakCallback; i++) {
-      internal_fields[i] = (*self)->GetPointerFromInternalField(i);
-    }
-    wcbd = new WeakCallbackInfo<P>(
-        reinterpret_cast<Persistent<v8::Value>*>(this)
-      , callback
-      , 0
-      , internal_fields[0]
-      , internal_fields[1]);
-    persistent.MakeWeak(wcbd, WeakCallbackInfo<P>::invoke);
-  }
-}
-#endif
-
-#endif  // NAN_WEAK_H_
diff --git a/js/node_modules/nan/package.json b/js/node_modules/nan/package.json
deleted file mode 100644
index e20f22fe04fe55ccc85ec9918824396573ff4fad..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/package.json
+++ /dev/null
@@ -1,122 +0,0 @@
-{
-  "_args": [
-    [
-      "nan@^2.3.5",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport"
-    ]
-  ],
-  "_from": "nan@>=2.3.5 <3.0.0",
-  "_id": "nan@2.4.0",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/nan",
-  "_nodeVersion": "5.0.0",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/nan-2.4.0.tgz_1468158679820_0.6951719264034182"
-  },
-  "_npmUser": {
-    "email": "bbyholm@abo.fi",
-    "name": "kkoopa"
-  },
-  "_npmVersion": "3.3.6",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "nan",
-    "raw": "nan@^2.3.5",
-    "rawSpec": "^2.3.5",
-    "scope": null,
-    "spec": ">=2.3.5 <3.0.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/serialport"
-  ],
-  "_resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz",
-  "_shasum": "fb3c59d45fe4effe215f0b890f8adf6eb32d2232",
-  "_shrinkwrap": null,
-  "_spec": "nan@^2.3.5",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport",
-  "bugs": {
-    "url": "https://github.com/nodejs/nan/issues"
-  },
-  "contributors": [
-    {
-      "name": "Rod Vagg",
-      "email": "r@va.gg",
-      "url": "https://github.com/rvagg"
-    },
-    {
-      "name": "Benjamin Byholm",
-      "email": "bbyholm@abo.fi",
-      "url": "https://github.com/kkoopa/"
-    },
-    {
-      "name": "Trevor Norris",
-      "email": "trev.norris@gmail.com",
-      "url": "https://github.com/trevnorris"
-    },
-    {
-      "name": "Nathan Rajlich",
-      "email": "nathan@tootallnate.net",
-      "url": "https://github.com/TooTallNate"
-    },
-    {
-      "name": "Brett Lawson",
-      "email": "brett19@gmail.com",
-      "url": "https://github.com/brett19"
-    },
-    {
-      "name": "Ben Noordhuis",
-      "email": "info@bnoordhuis.nl",
-      "url": "https://github.com/bnoordhuis"
-    },
-    {
-      "name": "David Siegel",
-      "email": "david@artcom.de",
-      "url": "https://github.com/agnat"
-    }
-  ],
-  "dependencies": {},
-  "description": "Native Abstractions for Node.js: C++ header for Node 0.8 -> 6 compatibility",
-  "devDependencies": {
-    "bindings": "~1.2.1",
-    "commander": "^2.8.1",
-    "glob": "^5.0.14",
-    "node-gyp": "~3.0.1",
-    "readable-stream": "^2.1.4",
-    "tap": "~0.7.1",
-    "xtend": "~4.0.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "fb3c59d45fe4effe215f0b890f8adf6eb32d2232",
-    "tarball": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz"
-  },
-  "homepage": "https://github.com/nodejs/nan#readme",
-  "license": "MIT",
-  "main": "include_dirs.js",
-  "maintainers": [
-    {
-      "name": "rvagg",
-      "email": "rod@vagg.org"
-    },
-    {
-      "name": "kkoopa",
-      "email": "bbyholm@abo.fi"
-    }
-  ],
-  "name": "nan",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/nodejs/nan.git"
-  },
-  "scripts": {
-    "docs": "doc/.build.sh",
-    "rebuild-tests": "node-gyp rebuild --msvs_version=2013 --directory test",
-    "test": "tap --gc --stderr test/js/*-test.js"
-  },
-  "version": "2.4.0"
-}
diff --git a/js/node_modules/nan/tools/1to2.js b/js/node_modules/nan/tools/1to2.js
deleted file mode 100755
index b7498e438ccd835f2c99780e737cf3699d200a3f..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/tools/1to2.js
+++ /dev/null
@@ -1,412 +0,0 @@
-#!/usr/bin/env node
-/*********************************************************************
- * NAN - Native Abstractions for Node.js
- *
- * Copyright (c) 2016 NAN contributors
- *
- * MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md>
- ********************************************************************/
-
-var commander = require('commander'),
-    fs = require('fs'),
-    glob = require('glob'),
-    groups = [],
-    total = 0,
-    warning1 = '/* ERROR: Rewrite using Buffer */\n',
-    warning2 = '\\/\\* ERROR\\: Rewrite using Buffer \\*\\/\\n',
-    length,
-    i;
-
-fs.readFile(__dirname + '/package.json', 'utf8', function (err, data) {
-  if (err) {
-    throw err;
-  }
-
-  commander
-      .version(JSON.parse(data).version)
-      .usage('[options] <file ...>')
-      .parse(process.argv);
-
-  if (!process.argv.slice(2).length) {
-    commander.outputHelp();
-  }
-});
-
-/* construct strings representing regular expressions
-   each expression contains a unique group allowing for identification of the match
-   the index of this key group, relative to the regular expression in question,
-    is indicated by the first array member */
-
-/* simple substistutions, key group is the entire match, 0 */
-groups.push([0, [
-  '_NAN_',
-  'NODE_SET_METHOD',
-  'NODE_SET_PROTOTYPE_METHOD',
-  'NanAsciiString',
-  'NanEscapeScope',
-  'NanReturnValue',
-  'NanUcs2String'].join('|')]);
-
-/* substitutions of parameterless macros, key group is 1 */
-groups.push([1, ['(', [
-  'NanEscapableScope',
-  'NanReturnNull',
-  'NanReturnUndefined',
-  'NanScope'].join('|'), ')\\(\\)'].join('')]);
-
-/* replace TryCatch with NanTryCatch once, gobbling possible namespace, key group 2 */
-groups.push([2, '(?:(?:v8\\:\\:)?|(Nan)?)(TryCatch)']);
-
-/* NanNew("string") will likely not fail a ToLocalChecked(), key group 1 */ 
-groups.push([1, ['(NanNew)', '(\\("[^\\"]*"[^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]);
-
-/* Removed v8 APIs, warn that the code needs rewriting using node::Buffer, key group 2 */
-groups.push([2, ['(', warning2, ')?', '^.*?(', [
-      'GetIndexedPropertiesExternalArrayDataLength',
-      'GetIndexedPropertiesExternalArrayData',
-      'GetIndexedPropertiesExternalArrayDataType',
-      'GetIndexedPropertiesPixelData',
-      'GetIndexedPropertiesPixelDataLength',
-      'HasIndexedPropertiesInExternalArrayData',
-      'HasIndexedPropertiesInPixelData',
-      'SetIndexedPropertiesToExternalArrayData',
-      'SetIndexedPropertiesToPixelData'].join('|'), ')'].join('')]);
-
-/* No need for NanScope in V8-exposed methods, key group 2 */
-groups.push([2, ['((', [
-      'NAN_METHOD',
-      'NAN_GETTER',
-      'NAN_SETTER',
-      'NAN_PROPERTY_GETTER',
-      'NAN_PROPERTY_SETTER',
-      'NAN_PROPERTY_ENUMERATOR',
-      'NAN_PROPERTY_DELETER',
-      'NAN_PROPERTY_QUERY',
-      'NAN_INDEX_GETTER',
-      'NAN_INDEX_SETTER',
-      'NAN_INDEX_ENUMERATOR',
-      'NAN_INDEX_DELETER',
-      'NAN_INDEX_QUERY'].join('|'), ')\\([^\\)]*\\)\\s*\\{)\\s*NanScope\\(\\)\\s*;'].join('')]);
-
-/* v8::Value::ToXXXXXXX returns v8::MaybeLocal<T>, key group 3 */
-groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->(', [
-      'Boolean',
-      'Number',
-      'String',
-      'Object',
-      'Integer',
-      'Uint32',
-      'Int32'].join('|'), ')\\('].join('')]);
-
-/* v8::Value::XXXXXXXValue returns v8::Maybe<T>, key group 3 */
-groups.push([3, ['([\\s\\(\\)])([^\\s\\(\\)]+)->((?:', [
-      'Boolean',
-      'Number',
-      'Integer',
-      'Uint32',
-      'Int32'].join('|'), ')Value)\\('].join('')]);
-
-/* NAN_WEAK_CALLBACK macro was removed, write out callback definition, key group 1 */
-groups.push([1, '(NAN_WEAK_CALLBACK)\\(([^\\s\\)]+)\\)']);
-
-/* node::ObjectWrap and v8::Persistent have been replaced with Nan implementations, key group 1 */
-groups.push([1, ['(', [
-  'NanDisposePersistent',
-  'NanObjectWrapHandle'].join('|'), ')\\s*\\(\\s*([^\\s\\)]+)'].join('')]);
-
-/* Since NanPersistent there is no need for NanMakeWeakPersistent, key group 1 */
-groups.push([1, '(NanMakeWeakPersistent)\\s*\\(\\s*([^\\s,]+)\\s*,\\s*']);
-
-/* Many methods of v8::Object and others now return v8::MaybeLocal<T>, key group 3 */
-groups.push([3, ['([\\s])([^\\s]+)->(', [
-  'GetEndColumn',
-  'GetFunction',
-  'GetLineNumber',
-  'NewInstance',
-  'GetPropertyNames',
-  'GetOwnPropertyNames',
-  'GetSourceLine',
-  'GetStartColumn',
-  'ObjectProtoToString',
-  'ToArrayIndex',
-  'ToDetailString',
-  'CallAsConstructor',
-  'CallAsFunction',
-  'CloneElementAt',
-  'Delete',
-  'ForceSet',
-  'Get',
-  'GetPropertyAttributes',
-  'GetRealNamedProperty',
-  'GetRealNamedPropertyInPrototypeChain',
-  'Has',
-  'HasOwnProperty',
-  'HasRealIndexedProperty',
-  'HasRealNamedCallbackProperty',
-  'HasRealNamedProperty',
-  'Set',
-  'SetAccessor',
-  'SetIndexedPropertyHandler',
-  'SetNamedPropertyHandler',
-  'SetPrototype'].join('|'), ')\\('].join('')]);
-
-/* You should get an error if any of these fail anyways,
-   or handle the error better, it is indicated either way, key group 2 */
-groups.push([2, ['NanNew(<(?:v8\\:\\:)?(', ['Date', 'String', 'RegExp'].join('|'), ')>)(\\([^\\)]*\\))(?!\\.ToLocalChecked\\(\\))'].join('')]);
-
-/* v8::Value::Equals now returns a v8::Maybe, key group 3 */
-groups.push([3, '([\\s\\(\\)])([^\\s\\(\\)]+)->(Equals)\\(([^\\s\\)]+)']);
-
-/* NanPersistent makes this unnecessary, key group 1 */
-groups.push([1, '(NanAssignPersistent)(?:<v8\\:\\:[^>]+>)?\\(([^,]+),\\s*']);
-
-/* args has been renamed to info, key group 2 */
-groups.push([2, '(\\W)(args)(\\W)'])
-
-/* node::ObjectWrap was replaced with NanObjectWrap, key group 2 */
-groups.push([2, '(\\W)(?:node\\:\\:)?(ObjectWrap)(\\W)']);
-
-/* v8::Persistent was replaced with NanPersistent, key group 2 */
-groups.push([2, '(\\W)(?:v8\\:\\:)?(Persistent)(\\W)']);
-
-/* counts the number of capturing groups in a well-formed regular expression,
-   ignoring non-capturing groups and escaped parentheses */
-function groupcount(s) {
-  var positive = s.match(/\((?!\?)/g),
-      negative = s.match(/\\\(/g);
-  return (positive ? positive.length : 0) - (negative ? negative.length : 0);
-}
-
-/* compute the absolute position of each key group in the joined master RegExp */
-for (i = 1, length = groups.length; i < length; i++) {
-	total += groupcount(groups[i - 1][1]);
-	groups[i][0] += total;
-}
-
-/* create the master RegExp, whis is the union of all the groups' expressions */
-master = new RegExp(groups.map(function (a) { return a[1]; }).join('|'), 'gm');
-
-/* replacement function for String.replace, receives 21 arguments */
-function replace() {
-	/* simple expressions */
-      switch (arguments[groups[0][0]]) {
-        case '_NAN_':
-          return 'NAN_';
-        case 'NODE_SET_METHOD':
-          return 'NanSetMethod';
-        case 'NODE_SET_PROTOTYPE_METHOD':
-          return 'NanSetPrototypeMethod';
-        case 'NanAsciiString':
-          return 'NanUtf8String';
-        case 'NanEscapeScope':
-          return 'scope.Escape';
-        case 'NanReturnNull':
-          return 'info.GetReturnValue().SetNull';
-        case 'NanReturnValue':
-          return 'info.GetReturnValue().Set';
-        case 'NanUcs2String':
-          return 'v8::String::Value';
-        default:
-      }
-
-      /* macros without arguments */
-      switch (arguments[groups[1][0]]) {
-        case 'NanEscapableScope':
-          return 'NanEscapableScope scope'
-        case 'NanReturnUndefined':
-          return 'return';
-        case 'NanScope':
-          return 'NanScope scope';
-        default:
-      }
-
-      /* TryCatch, emulate negative backref */
-      if (arguments[groups[2][0]] === 'TryCatch') {
-        return arguments[groups[2][0] - 1] ? arguments[0] : 'NanTryCatch';
-      }
-
-      /* NanNew("foo") --> NanNew("foo").ToLocalChecked() */
-      if (arguments[groups[3][0]] === 'NanNew') {
-        return [arguments[0], '.ToLocalChecked()'].join('');
-      }
-
-      /* insert warning for removed functions as comment on new line above */
-      switch (arguments[groups[4][0]]) {
-        case 'GetIndexedPropertiesExternalArrayData':
-        case 'GetIndexedPropertiesExternalArrayDataLength':
-        case 'GetIndexedPropertiesExternalArrayDataType':
-        case 'GetIndexedPropertiesPixelData':
-        case 'GetIndexedPropertiesPixelDataLength':
-        case 'HasIndexedPropertiesInExternalArrayData':
-        case 'HasIndexedPropertiesInPixelData':
-        case 'SetIndexedPropertiesToExternalArrayData':
-        case 'SetIndexedPropertiesToPixelData':
-          return arguments[groups[4][0] - 1] ? arguments[0] : [warning1, arguments[0]].join('');
-        default:
-      }
-
-     /* remove unnecessary NanScope() */
-      switch (arguments[groups[5][0]]) {
-        case 'NAN_GETTER':
-        case 'NAN_METHOD':
-        case 'NAN_SETTER':
-        case 'NAN_INDEX_DELETER':
-        case 'NAN_INDEX_ENUMERATOR':
-        case 'NAN_INDEX_GETTER':
-        case 'NAN_INDEX_QUERY':
-        case 'NAN_INDEX_SETTER':
-        case 'NAN_PROPERTY_DELETER':
-        case 'NAN_PROPERTY_ENUMERATOR':
-        case 'NAN_PROPERTY_GETTER':
-        case 'NAN_PROPERTY_QUERY':
-        case 'NAN_PROPERTY_SETTER':
-          return arguments[groups[5][0] - 1];
-        default:
-      }
-
-      /* Value converstion */
-      switch (arguments[groups[6][0]]) {
-        case 'Boolean':
-        case 'Int32':
-        case 'Integer':
-        case 'Number':
-        case 'Object':
-        case 'String':
-        case 'Uint32':
-          return [arguments[groups[6][0] - 2], 'NanTo<v8::', arguments[groups[6][0]], '>(',  arguments[groups[6][0] - 1]].join('');
-        default:
-      }
-
-      /* other value conversion */
-      switch (arguments[groups[7][0]]) {
-        case 'BooleanValue':
-          return [arguments[groups[7][0] - 2], 'NanTo<bool>(', arguments[groups[7][0] - 1]].join('');
-        case 'Int32Value':
-          return [arguments[groups[7][0] - 2], 'NanTo<int32_t>(', arguments[groups[7][0] - 1]].join('');
-        case 'IntegerValue':
-          return [arguments[groups[7][0] - 2], 'NanTo<int64_t>(', arguments[groups[7][0] - 1]].join('');
-        case 'Uint32Value':
-          return [arguments[groups[7][0] - 2], 'NanTo<uint32_t>(', arguments[groups[7][0] - 1]].join('');
-        default:
-      }
-
-      /* NAN_WEAK_CALLBACK */
-      if (arguments[groups[8][0]] === 'NAN_WEAK_CALLBACK') {
-        return ['template<typename T>\nvoid ',
-          arguments[groups[8][0] + 1], '(const NanWeakCallbackInfo<T> &data)'].join('');
-      }
-
-      /* use methods on NAN classes instead */
-      switch (arguments[groups[9][0]]) {
-        case 'NanDisposePersistent':
-          return [arguments[groups[9][0] + 1], '.Reset('].join('');
-        case 'NanObjectWrapHandle':
-          return [arguments[groups[9][0] + 1], '->handle('].join('');
-        default:
-      }
-
-      /* use method on NanPersistent instead */
-      if (arguments[groups[10][0]] === 'NanMakeWeakPersistent') {
-        return arguments[groups[10][0] + 1] + '.SetWeak(';
-      }
-
-      /* These return Maybes, the upper ones take no arguments */
-      switch (arguments[groups[11][0]]) {
-        case 'GetEndColumn':
-        case 'GetFunction':
-        case 'GetLineNumber':
-        case 'GetOwnPropertyNames':
-        case 'GetPropertyNames':
-        case 'GetSourceLine':
-        case 'GetStartColumn':
-        case 'NewInstance':
-        case 'ObjectProtoToString':
-        case 'ToArrayIndex':
-        case 'ToDetailString':
-          return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1]].join('');
-        case 'CallAsConstructor':
-        case 'CallAsFunction':
-        case 'CloneElementAt':
-        case 'Delete':
-        case 'ForceSet':
-        case 'Get':
-        case 'GetPropertyAttributes':
-        case 'GetRealNamedProperty':
-        case 'GetRealNamedPropertyInPrototypeChain':
-        case 'Has':
-        case 'HasOwnProperty':
-        case 'HasRealIndexedProperty':
-        case 'HasRealNamedCallbackProperty':
-        case 'HasRealNamedProperty':
-        case 'Set':
-        case 'SetAccessor':
-        case 'SetIndexedPropertyHandler':
-        case 'SetNamedPropertyHandler':
-        case 'SetPrototype':
-          return [arguments[groups[11][0] - 2], 'Nan', arguments[groups[11][0]], '(', arguments[groups[11][0] - 1], ', '].join('');
-        default:
-      }
-
-      /* Automatic ToLocalChecked(), take it or leave it */
-      switch (arguments[groups[12][0]]) {
-        case 'Date':
-        case 'String':
-        case 'RegExp':
-          return ['NanNew', arguments[groups[12][0] - 1], arguments[groups[12][0] + 1], '.ToLocalChecked()'].join('');
-        default:
-      }
-
-      /* NanEquals is now required for uniformity */
-      if (arguments[groups[13][0]] === 'Equals') {
-        return [arguments[groups[13][0] - 1], 'NanEquals(', arguments[groups[13][0] - 1], ', ', arguments[groups[13][0] + 1]].join('');
-      }
-
-      /* use method on replacement class instead */
-      if (arguments[groups[14][0]] === 'NanAssignPersistent') {
-        return [arguments[groups[14][0] + 1], '.Reset('].join('');
-      }
-
-      /* args --> info */
-      if (arguments[groups[15][0]] === 'args') {
-        return [arguments[groups[15][0] - 1], 'info', arguments[groups[15][0] + 1]].join('');
-      }
-
-      /* ObjectWrap --> NanObjectWrap */
-      if (arguments[groups[16][0]] === 'ObjectWrap') {
-        return [arguments[groups[16][0] - 1], 'NanObjectWrap', arguments[groups[16][0] + 1]].join('');
-      }
-
-      /* Persistent --> NanPersistent */
-      if (arguments[groups[17][0]] === 'Persistent') {
-        return [arguments[groups[17][0] - 1], 'NanPersistent', arguments[groups[17][0] + 1]].join('');
-      }
-
-      /* This should not happen. A switch is probably missing a case if it does. */
-      throw 'Unhandled match: ' + arguments[0];
-}
-
-/* reads a file, runs replacement and writes it back */
-function processFile(file) {
-  fs.readFile(file, {encoding: 'utf8'}, function (err, data) {
-    if (err) {
-      throw err;
-    }
-
-    /* run replacement twice, might need more runs */
-    fs.writeFile(file, data.replace(master, replace).replace(master, replace), function (err) {
-      if (err) {
-        throw err;
-      }
-    });
-  });
-}
-
-/* process file names from command line and process the identified files */
-for (i = 2, length = process.argv.length; i < length; i++) {
-  glob(process.argv[i], function (err, matches) {
-    if (err) {
-      throw err;
-    }
-    matches.forEach(processFile);
-  });
-}
diff --git a/js/node_modules/nan/tools/README.md b/js/node_modules/nan/tools/README.md
deleted file mode 100644
index 7f07e4b8256dd136943943b575776971c36c25e3..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/tools/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-1to2 naively converts source code files from NAN 1 to NAN 2. There will be erroneous conversions,
-false positives and missed opportunities. The input files are rewritten in place. Make sure that
-you have backups. You will have to manually review the changes afterwards and do some touchups.
-
-```sh
-$ tools/1to2.js
-
-  Usage: 1to2 [options] <file ...>
-
-  Options:
-
-    -h, --help     output usage information
-    -V, --version  output the version number
-```
diff --git a/js/node_modules/nan/tools/package.json b/js/node_modules/nan/tools/package.json
deleted file mode 100644
index 2dcdd789394965b8150ff96ead49f1a6ac9caf6a..0000000000000000000000000000000000000000
--- a/js/node_modules/nan/tools/package.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "1to2",
-  "version": "1.0.0",
-  "description": "NAN 1 -> 2 Migration Script",
-  "main": "1to2.js",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/nodejs/nan.git"
-  },
-  "contributors": [
-    "Benjamin Byholm <bbyholm@abo.fi> (https://github.com/kkoopa/)",
-    "Mathias Küsel (https://github.com/mathiask88/)"
-  ],
-  "dependencies": {
-    "glob": "~5.0.10",
-    "commander": "~2.8.1"
-  },
-  "license": "MIT"
-}
diff --git a/js/node_modules/object-keys/.editorconfig b/js/node_modules/object-keys/.editorconfig
deleted file mode 100644
index eaa214161f5cdb409c32465fd822624c633a6bd8..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/.editorconfig
+++ /dev/null
@@ -1,13 +0,0 @@
-root = true
-
-[*]
-indent_style = tab;
-insert_final_newline = true;
-quote_type = auto;
-space_after_anonymous_functions = true;
-space_after_control_statements = true;
-spaces_around_operators = true;
-trim_trailing_whitespace = true;
-spaces_in_brackets = false;
-end_of_line = lf;
-
diff --git a/js/node_modules/object-keys/.eslintrc b/js/node_modules/object-keys/.eslintrc
deleted file mode 100644
index 79bff7f1dc5be0c3e2482a1b2e99e2fb46fe93f2..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/.eslintrc
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"complexity": [2, 11],
-		"id-length": [2, { "min": 1, "max": 40 }],
-		"max-params": [2, 3],
-		"max-statements": [2, 23],
-		"max-statements-per-line": [2, { "max": 2 }],
-		"no-extra-parens": [1],
-		"no-invalid-this": [1],
-		"no-restricted-syntax": [2, "BreakStatement", "ContinueStatement", "LabeledStatement", "WithStatement"],
-		"operator-linebreak": [2, "after"]
-	}
-}
diff --git a/js/node_modules/object-keys/.jscs.json b/js/node_modules/object-keys/.jscs.json
deleted file mode 100644
index 78412234653c16ebe819af57af72e966b06fa40c..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/.jscs.json
+++ /dev/null
@@ -1,175 +0,0 @@
-{
-	"es3": true,
-
-	"additionalRules": [],
-
-	"requireSemicolons": true,
-
-	"disallowMultipleSpaces": true,
-
-	"disallowIdentifierNames": [],
-
-	"requireCurlyBraces": {
-		"allExcept": [],
-		"keywords": ["if", "else", "for", "while", "do", "try", "catch"]
-	},
-
-	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
-
-	"disallowSpaceAfterKeywords": [],
-
-	"disallowSpaceBeforeComma": true,
-	"disallowSpaceAfterComma": false,
-	"disallowSpaceBeforeSemicolon": true,
-
-	"disallowNodeTypes": [
-		"DebuggerStatement",
-		"LabeledStatement",
-		"SwitchCase",
-		"SwitchStatement",
-		"WithStatement"
-	],
-
-	"requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },
-
-	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
-	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
-	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
-
-	"requireSpaceBetweenArguments": true,
-
-	"disallowSpacesInsideParentheses": true,
-
-	"disallowSpacesInsideArrayBrackets": true,
-
-	"disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },
-
-	"disallowSpaceAfterObjectKeys": true,
-
-	"requireCommaBeforeLineBreak": true,
-
-	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
-	"requireSpaceAfterPrefixUnaryOperators": [],
-
-	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
-	"requireSpaceBeforePostfixUnaryOperators": [],
-
-	"disallowSpaceBeforeBinaryOperators": [],
-	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-
-	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-	"disallowSpaceAfterBinaryOperators": [],
-
-	"disallowImplicitTypeConversion": ["binary", "string"],
-
-	"disallowKeywords": ["with", "eval"],
-
-	"requireKeywordsOnNewLine": [],
-	"disallowKeywordsOnNewLine": ["else"],
-
-	"requireLineFeedAtFileEnd": true,
-
-	"disallowTrailingWhitespace": true,
-
-	"disallowTrailingComma": true,
-
-	"excludeFiles": ["node_modules/**", "vendor/**"],
-
-	"disallowMultipleLineStrings": true,
-
-	"requireDotNotation": { "allExcept": ["keywords"] },
-
-	"requireParenthesesAroundIIFE": true,
-
-	"validateLineBreaks": "LF",
-
-	"validateQuoteMarks": {
-		"escape": true,
-		"mark": "'"
-	},
-
-	"disallowOperatorBeforeLineBreak": [],
-
-	"requireSpaceBeforeKeywords": [
-		"do",
-		"for",
-		"if",
-		"else",
-		"switch",
-		"case",
-		"try",
-		"catch",
-		"finally",
-		"while",
-		"with",
-		"return"
-	],
-
-	"validateAlignedFunctionParameters": {
-		"lineBreakAfterOpeningBraces": true,
-		"lineBreakBeforeClosingBraces": true
-	},
-
-	"requirePaddingNewLinesBeforeExport": true,
-
-	"validateNewlineAfterArrayElements": {
-		"maximum": 7
-	},
-
-	"requirePaddingNewLinesAfterUseStrict": true,
-
-	"disallowArrowFunctions": true,
-
-	"disallowMultiLineTernary": true,
-
-	"validateOrderInObjectKeys": "asc-insensitive",
-
-	"disallowIdenticalDestructuringNames": true,
-
-	"disallowNestedTernaries": { "maxLevel": 1 },
-
-	"requireSpaceAfterComma": { "allExcept": ["trailing"] },
-	"requireAlignedMultilineParams": false,
-
-	"requireSpacesInGenerator": {
-		"afterStar": true
-	},
-
-	"disallowSpacesInGenerator": {
-		"beforeStar": true
-	},
-
-	"disallowVar": false,
-
-	"requireArrayDestructuring": false,
-
-	"requireEnhancedObjectLiterals": false,
-
-	"requireObjectDestructuring": false,
-
-	"requireEarlyReturn": false,
-
-	"requireCapitalizedConstructorsNew": {
-		"allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
-	},
-
-	"requireImportAlphabetized": false,
-
-    "requireSpaceBeforeObjectValues": true,
-    "requireSpaceBeforeDestructuredValues": true,
-
-	"disallowSpacesInsideTemplateStringPlaceholders": true,
-
-    "disallowArrayDestructuringReturn": false,
-
-    "requireNewlineBeforeSingleStatementsInIf": false,
-
-	"disallowUnusedVariables": true,
-
-	"requireSpacesInsideImportedObjectBraces": true,
-
-	"requireUseStrict": true
-}
-
diff --git a/js/node_modules/object-keys/.npmignore b/js/node_modules/object-keys/.npmignore
deleted file mode 100644
index a777a81389f004e72f0d53b02c7ed724f59d5a95..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-test/*
-
diff --git a/js/node_modules/object-keys/.travis.yml b/js/node_modules/object-keys/.travis.yml
deleted file mode 100644
index e9f887b421c48272edef1305c24309a53731365f..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/.travis.yml
+++ /dev/null
@@ -1,94 +0,0 @@
-language: node_js
-node_js:
-  - "6.2"
-  - "6.1"
-  - "6.0"
-  - "5.11"
-  - "5.10"
-  - "5.9"
-  - "5.8"
-  - "5.7"
-  - "5.6"
-  - "5.5"
-  - "5.4"
-  - "5.3"
-  - "5.2"
-  - "5.1"
-  - "5.0"
-  - "4.4"
-  - "4.3"
-  - "4.2"
-  - "4.1"
-  - "4.0"
-  - "iojs-v3.3"
-  - "iojs-v3.2"
-  - "iojs-v3.1"
-  - "iojs-v3.0"
-  - "iojs-v2.5"
-  - "iojs-v2.4"
-  - "iojs-v2.3"
-  - "iojs-v2.2"
-  - "iojs-v2.1"
-  - "iojs-v2.0"
-  - "iojs-v1.8"
-  - "iojs-v1.7"
-  - "iojs-v1.6"
-  - "iojs-v1.5"
-  - "iojs-v1.4"
-  - "iojs-v1.3"
-  - "iojs-v1.2"
-  - "iojs-v1.1"
-  - "iojs-v1.0"
-  - "0.12"
-  - "0.11"
-  - "0.10"
-  - "0.9"
-  - "0.8"
-  - "0.6"
-  - "0.4"
-before_install:
-  - 'if [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then case "$(npm --version)" in 1.*) npm install -g npm@1.4.28 ;; 2.*) npm install -g npm@2 ;; esac ; fi'
-  - 'if [ "${TRAVIS_NODE_VERSION}" != "0.6" ] && [ "${TRAVIS_NODE_VERSION}" != "0.9" ]; then npm install -g npm; fi'
-script:
-  - 'if [ "${TRAVIS_NODE_VERSION}" != "4.4" ]; then npm run tests-only ; else npm test ; fi'
-sudo: false
-matrix:
-  fast_finish: true
-  allow_failures:
-    - node_js: "6.1"
-    - node_js: "6.0"
-    - node_js: "5.10"
-    - node_js: "5.9"
-    - node_js: "5.8"
-    - node_js: "5.7"
-    - node_js: "5.6"
-    - node_js: "5.5"
-    - node_js: "5.4"
-    - node_js: "5.3"
-    - node_js: "5.2"
-    - node_js: "5.1"
-    - node_js: "5.0"
-    - node_js: "4.3"
-    - node_js: "4.2"
-    - node_js: "4.1"
-    - node_js: "4.0"
-    - node_js: "iojs-v3.2"
-    - node_js: "iojs-v3.1"
-    - node_js: "iojs-v3.0"
-    - node_js: "iojs-v2.4"
-    - node_js: "iojs-v2.3"
-    - node_js: "iojs-v2.2"
-    - node_js: "iojs-v2.1"
-    - node_js: "iojs-v2.0"
-    - node_js: "iojs-v1.7"
-    - node_js: "iojs-v1.6"
-    - node_js: "iojs-v1.5"
-    - node_js: "iojs-v1.4"
-    - node_js: "iojs-v1.3"
-    - node_js: "iojs-v1.2"
-    - node_js: "iojs-v1.1"
-    - node_js: "iojs-v1.0"
-    - node_js: "0.11"
-    - node_js: "0.9"
-    - node_js: "0.6"
-    - node_js: "0.4"
diff --git a/js/node_modules/object-keys/CHANGELOG.md b/js/node_modules/object-keys/CHANGELOG.md
deleted file mode 100644
index 1647725fb9b47842cff66b8464a9893e6b27add7..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/CHANGELOG.md
+++ /dev/null
@@ -1,216 +0,0 @@
-1.0.11 / 2016-07-05
-=================
-  * [Fix] exclude keys regarding the style (eg. `pageYOffset`) on `window` to avoid reflow (#32)
-
-1.0.10 / 2016-07-04
-=================
-  * [Fix] exclude `height` and `width` keys on `window` to avoid reflow (#31)
-  * [Fix] In IE 6, `window.external` makes `Object.keys` throw
-  * [Tests] up to `node` `v6.2`, `v5.10`, `v4.4`
-  * [Tests] use pretest/posttest for linting/security
-  * [Dev Deps] update `tape`, `jscs`, `nsp`, `eslint`, `@ljharb/eslint-config`
-  * [Dev Deps] remove unused eccheck script + dep
-
-1.0.9 / 2015-10-19
-=================
-  * [Fix] Blacklist 'frame' property on window (#16, #17)
-  * [Dev Deps] update `jscs`, `eslint`, `@ljharb/eslint-config`
-
-1.0.8 / 2015-10-14
-=================
-  * [Fix] wrap automation equality bug checking in try/catch, per [es5-shim#327](https://github.com/es-shims/es5-shim/issues/327)
-  * [Fix] Blacklist 'window.frameElement' per [es5-shim#322](https://github.com/es-shims/es5-shim/issues/322)
-  * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
-  * [Tests] up to `io.js` `v3.3`, `node` `v4.2`
-  * [Dev Deps] update `eslint`, `tape`, `@ljharb/eslint-config`, `jscs`
-
-1.0.7 / 2015-07-18
-=================
-  * [Fix] A proper fix for 176f03335e90d5c8d0d8125a99f27819c9b9cdad / https://github.com/es-shims/es5-shim/issues/275 that doesn't break dontEnum/constructor fixes in IE 8.
-  * [Fix] Remove deprecation message in Chrome by touching deprecated window properties (#15)
-  * [Tests] Improve test output for automation equality bugfix
-  * [Tests] Test on `io.js` `v2.4`
-
-1.0.6 / 2015-07-09
-=================
-  * [Fix] Use an object lookup rather than ES5's `indexOf` (#14)
-  * [Tests] ES3 browsers don't have `Array.isArray`
-  * [Tests] Fix `no-shadow` rule, as well as an IE 8 bug caused by engine NFE shadowing bugs.
-
-1.0.5 / 2015-07-03
-=================
-  * [Fix] Fix a flabbergasting IE 8 bug where `localStorage.constructor.prototype === localStorage` throws
-  * [Tests] Test up to `io.js` `v2.3`
-  * [Dev Deps] Update `nsp`, `eslint`
-
-1.0.4 / 2015-05-23
-=================
-  * Fix a Safari 5.0 bug with `Object.keys` not working with `arguments`
-  * Test on latest `node` and `io.js`
-  * Update `jscs`, `tape`, `eslint`, `nsp`, `is`, `editorconfig-tools`, `covert`
-
-1.0.3 / 2015-01-06
-=================
-  * Revert "Make `object-keys` more robust against later environment tampering" to maintain ES3 compliance
-
-1.0.2 / 2014-12-28
-=================
-  * Update lots of dev dependencies
-  * Tweaks to README
-  * Make `object-keys` more robust against later environment tampering
-
-1.0.1 / 2014-09-03
-=================
-  * Update URLs and badges in README
-
-1.0.0 / 2014-08-26
-=================
-  * v1.0.0
-
-0.6.1 / 2014-08-25
-=================
-  * v0.6.1
-  * Updating dependencies (tape, covert, is)
-  * Update badges in readme
-  * Use separate var statements
-
-0.6.0 / 2014-04-23
-=================
-  * v0.6.0
-  * Updating dependencies (tape, covert)
-  * Make sure boxed primitives, and arguments objects, work properly in ES3 browsers
-  * Improve test matrix: test all node versions, but only latest two stables are a failure
-  * Remove internal foreach shim.
-
-0.5.1 / 2014-03-09
-=================
-  * 0.5.1
-  * Updating dependencies (tape, covert, is)
-  * Removing forEach from the module (but keeping it in tests)
-
-0.5.0 / 2014-01-30
-=================
-  * 0.5.0
-  * Explicitly returning the shim, instead of returning native Object.keys when present
-  * Adding a changelog.
-  * Cleaning up IIFE wrapping
-  * Testing on node 0.4 through 0.11
-
-0.4.0 / 2013-08-14
-==================
-
-  * v0.4.0
-  * In Chrome 4-10 and Safari 4, typeof (new RegExp) === 'function'
-  * If it's a string, make sure to use charAt instead of brackets.
-  * Only use Function#call if necessary.
-  * Making sure the context tests actually run.
-  * Better function detection
-  * Adding the android browser
-  * Fixing testling files
-  * Updating tape
-  * Removing the "is" dependency.
-  * Making an isArguments shim.
-  * Adding a local forEach shim and tests.
-  * Updating paths.
-  * Moving the shim test.
-  * v0.3.0
-
-0.3.0 / 2013-05-18
-==================
-
-  * README tweak.
-  * Fixing constructor enum issue. Fixes [#5](https://github.com/ljharb/object-keys/issues/5).
-  * Adding a test for [#5](https://github.com/ljharb/object-keys/issues/5)
-  * Updating readme.
-  * Updating dependencies.
-  * Giving credit to lodash.
-  * Make sure that a prototype's constructor property is not enumerable. Fixes [#3](https://github.com/ljharb/object-keys/issues/3).
-  * Adding additional tests to handle arguments objects, and to skip "prototype" in functions. Fixes [#2](https://github.com/ljharb/object-keys/issues/2).
-  * Fixing a typo on this test for [#3](https://github.com/ljharb/object-keys/issues/3).
-  * Adding node 0.10 to travis.
-  * Adding an IE < 9 test per [#3](https://github.com/ljharb/object-keys/issues/3)
-  * Adding an iOS 5 mobile Safari test per [#2](https://github.com/ljharb/object-keys/issues/2)
-  * Moving "indexof" and "is" to be dev dependencies.
-  * Making sure the shim works with functions.
-  * Flattening the tests.
-
-0.2.0 / 2013-05-10
-==================
-
-  * v0.2.0
-  * Object.keys should work with arrays.
-
-0.1.8 / 2013-05-10
-==================
-
-  * v0.1.8
-  * Upgrading dependencies.
-  * Using a simpler check.
-  * Fixing a bug in hasDontEnumBug browsers.
-  * Using the newest tape!
-  * Fixing this error test.
-  * "undefined" is probably a reserved word in ES3.
-  * Better test message.
-
-0.1.7 / 2013-04-17
-==================
-
-  * Upgrading "is" once more.
-  * The key "null" is breaking some browsers.
-
-0.1.6 / 2013-04-17
-==================
-
-  * v0.1.6
-  * Upgrading "is"
-
-0.1.5 / 2013-04-14
-==================
-
-  * Bumping version.
-  * Adding more testling browsers.
-  * Updating "is"
-
-0.1.4 / 2013-04-08
-==================
-
-  * Using "is" instead of "is-extended".
-
-0.1.3 / 2013-04-07
-==================
-
-  * Using "foreach" instead of my own shim.
-  * Removing "tap"; I'll just wait for "tape" to fix its node 0.10 bug.
-
-0.1.2 / 2013-04-03
-==================
-
-  * Adding dependency status; moving links to an index at the bottom.
-  * Upgrading is-extended; version 0.1.2
-  * Adding an npm version badge.
-
-0.1.1 / 2013-04-01
-==================
-
-  * Adding Travis CI.
-  * Bumping the version.
-  * Adding indexOf since IE sucks.
-  * Adding a forEach shim since older browsers don't have Array#forEach.
-  * Upgrading tape - 0.3.2 uses Array#map
-  * Using explicit end instead of plan.
-  * Can't test with Array.isArray in older browsers.
-  * Using is-extended.
-  * Fixing testling files.
-  * JSHint/JSLint-ing.
-  * Removing an unused object.
-  * Using strict mode.
-
-0.1.0 / 2013-03-30
-==================
-
-  * Changing the exports should have meant a higher version bump.
-  * Oops, fixing the repo URL.
-  * Adding more tests.
-  * 0.0.2
-  * Merge branch 'export_one_thing'; closes [#1](https://github.com/ljharb/object-keys/issues/1)
-  * Move shim export to a separate file.
diff --git a/js/node_modules/object-keys/LICENSE b/js/node_modules/object-keys/LICENSE
deleted file mode 100644
index 28553fdd06841b14fea43a5093bea3a5773fe1e0..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (C) 2013 Jordan Harband
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
\ No newline at end of file
diff --git a/js/node_modules/object-keys/README.md b/js/node_modules/object-keys/README.md
deleted file mode 100644
index ed4c277023a8a48522ec922f35ed27dda62a0ea8..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/README.md
+++ /dev/null
@@ -1,76 +0,0 @@
-#object-keys <sup>[![Version Badge][npm-version-svg]][package-url]</sup>
-
-[![Build Status][travis-svg]][travis-url]
-[![dependency status][deps-svg]][deps-url]
-[![dev dependency status][dev-deps-svg]][dev-deps-url]
-[![License][license-image]][license-url]
-[![Downloads][downloads-image]][downloads-url]
-
-[![npm badge][npm-badge-png]][package-url]
-
-[![browser support][testling-svg]][testling-url]
-
-An Object.keys shim. Invoke its "shim" method to shim Object.keys if it is unavailable.
-
-Most common usage:
-```js
-var keys = Object.keys || require('object-keys');
-```
-
-## Example
-
-```js
-var keys = require('object-keys');
-var assert = require('assert');
-var obj = {
-	a: true,
-	b: true,
-	c: true
-};
-
-assert.deepEqual(keys(obj), ['a', 'b', 'c']);
-```
-
-```js
-var keys = require('object-keys');
-var assert = require('assert');
-/* when Object.keys is not present */
-delete Object.keys;
-var shimmedKeys = keys.shim();
-assert.equal(shimmedKeys, keys);
-assert.deepEqual(Object.keys(obj), keys(obj));
-```
-
-```js
-var keys = require('object-keys');
-var assert = require('assert');
-/* when Object.keys is present */
-var shimmedKeys = keys.shim();
-assert.equal(shimmedKeys, Object.keys);
-assert.deepEqual(Object.keys(obj), keys(obj));
-```
-
-## Source
-Implementation taken directly from [es5-shim][es5-shim-url], with modifications, including from [lodash][lodash-url].
-
-## Tests
-Simply clone the repo, `npm install`, and run `npm test`
-
-[package-url]: https://npmjs.org/package/object-keys
-[npm-version-svg]: http://versionbadg.es/ljharb/object-keys.svg
-[travis-svg]: https://travis-ci.org/ljharb/object-keys.svg
-[travis-url]: https://travis-ci.org/ljharb/object-keys
-[deps-svg]: https://david-dm.org/ljharb/object-keys.svg
-[deps-url]: https://david-dm.org/ljharb/object-keys
-[dev-deps-svg]: https://david-dm.org/ljharb/object-keys/dev-status.svg
-[dev-deps-url]: https://david-dm.org/ljharb/object-keys#info=devDependencies
-[testling-svg]: https://ci.testling.com/ljharb/object-keys.png
-[testling-url]: https://ci.testling.com/ljharb/object-keys
-[es5-shim-url]: https://github.com/es-shims/es5-shim/blob/master/es5-shim.js#L542-589
-[lodash-url]: https://github.com/lodash/lodash
-[npm-badge-png]: https://nodei.co/npm/object-keys.png?downloads=true&stars=true
-[license-image]: http://img.shields.io/npm/l/object-keys.svg
-[license-url]: LICENSE
-[downloads-image]: http://img.shields.io/npm/dm/object-keys.svg
-[downloads-url]: http://npm-stat.com/charts.html?package=object-keys
-
diff --git a/js/node_modules/object-keys/index.js b/js/node_modules/object-keys/index.js
deleted file mode 100644
index 0c7ee8164be221ce294bee0687911f13fde4dc15..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/index.js
+++ /dev/null
@@ -1,140 +0,0 @@
-'use strict';
-
-// modified from https://github.com/es-shims/es5-shim
-var has = Object.prototype.hasOwnProperty;
-var toStr = Object.prototype.toString;
-var slice = Array.prototype.slice;
-var isArgs = require('./isArguments');
-var isEnumerable = Object.prototype.propertyIsEnumerable;
-var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
-var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
-var dontEnums = [
-	'toString',
-	'toLocaleString',
-	'valueOf',
-	'hasOwnProperty',
-	'isPrototypeOf',
-	'propertyIsEnumerable',
-	'constructor'
-];
-var equalsConstructorPrototype = function (o) {
-	var ctor = o.constructor;
-	return ctor && ctor.prototype === o;
-};
-var excludedKeys = {
-	$console: true,
-	$external: true,
-	$frame: true,
-	$frameElement: true,
-	$frames: true,
-	$innerHeight: true,
-	$innerWidth: true,
-	$outerHeight: true,
-	$outerWidth: true,
-	$pageXOffset: true,
-	$pageYOffset: true,
-	$parent: true,
-	$scrollLeft: true,
-	$scrollTop: true,
-	$scrollX: true,
-	$scrollY: true,
-	$self: true,
-	$webkitIndexedDB: true,
-	$webkitStorageInfo: true,
-	$window: true
-};
-var hasAutomationEqualityBug = (function () {
-	/* global window */
-	if (typeof window === 'undefined') { return false; }
-	for (var k in window) {
-		try {
-			if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
-				try {
-					equalsConstructorPrototype(window[k]);
-				} catch (e) {
-					return true;
-				}
-			}
-		} catch (e) {
-			return true;
-		}
-	}
-	return false;
-}());
-var equalsConstructorPrototypeIfNotBuggy = function (o) {
-	/* global window */
-	if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
-		return equalsConstructorPrototype(o);
-	}
-	try {
-		return equalsConstructorPrototype(o);
-	} catch (e) {
-		return false;
-	}
-};
-
-var keysShim = function keys(object) {
-	var isObject = object !== null && typeof object === 'object';
-	var isFunction = toStr.call(object) === '[object Function]';
-	var isArguments = isArgs(object);
-	var isString = isObject && toStr.call(object) === '[object String]';
-	var theKeys = [];
-
-	if (!isObject && !isFunction && !isArguments) {
-		throw new TypeError('Object.keys called on a non-object');
-	}
-
-	var skipProto = hasProtoEnumBug && isFunction;
-	if (isString && object.length > 0 && !has.call(object, 0)) {
-		for (var i = 0; i < object.length; ++i) {
-			theKeys.push(String(i));
-		}
-	}
-
-	if (isArguments && object.length > 0) {
-		for (var j = 0; j < object.length; ++j) {
-			theKeys.push(String(j));
-		}
-	} else {
-		for (var name in object) {
-			if (!(skipProto && name === 'prototype') && has.call(object, name)) {
-				theKeys.push(String(name));
-			}
-		}
-	}
-
-	if (hasDontEnumBug) {
-		var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
-
-		for (var k = 0; k < dontEnums.length; ++k) {
-			if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
-				theKeys.push(dontEnums[k]);
-			}
-		}
-	}
-	return theKeys;
-};
-
-keysShim.shim = function shimObjectKeys() {
-	if (Object.keys) {
-		var keysWorksWithArguments = (function () {
-			// Safari 5.0 bug
-			return (Object.keys(arguments) || '').length === 2;
-		}(1, 2));
-		if (!keysWorksWithArguments) {
-			var originalKeys = Object.keys;
-			Object.keys = function keys(object) {
-				if (isArgs(object)) {
-					return originalKeys(slice.call(object));
-				} else {
-					return originalKeys(object);
-				}
-			};
-		}
-	} else {
-		Object.keys = keysShim;
-	}
-	return Object.keys || keysShim;
-};
-
-module.exports = keysShim;
diff --git a/js/node_modules/object-keys/isArguments.js b/js/node_modules/object-keys/isArguments.js
deleted file mode 100644
index f2a2a9014d925e99b46c9f776525b02442fb6005..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/isArguments.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-var toStr = Object.prototype.toString;
-
-module.exports = function isArguments(value) {
-	var str = toStr.call(value);
-	var isArgs = str === '[object Arguments]';
-	if (!isArgs) {
-		isArgs = str !== '[object Array]' &&
-			value !== null &&
-			typeof value === 'object' &&
-			typeof value.length === 'number' &&
-			value.length >= 0 &&
-			toStr.call(value.callee) === '[object Function]';
-	}
-	return isArgs;
-};
diff --git a/js/node_modules/object-keys/package.json b/js/node_modules/object-keys/package.json
deleted file mode 100644
index a9bbf8064fb09d7fadc6b2d5ad5a52e2056386e4..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/package.json
+++ /dev/null
@@ -1,147 +0,0 @@
-{
-  "_args": [
-    [
-      "object-keys@^1.0.10",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/object.assign"
-    ]
-  ],
-  "_from": "object-keys@>=1.0.10 <2.0.0",
-  "_id": "object-keys@1.0.11",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/object-keys",
-  "_nodeVersion": "6.2.2",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/object-keys-1.0.11.tgz_1467740975903_0.8028358130250126"
-  },
-  "_npmUser": {
-    "email": "ljharb@gmail.com",
-    "name": "ljharb"
-  },
-  "_npmVersion": "3.9.5",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "object-keys",
-    "raw": "object-keys@^1.0.10",
-    "rawSpec": "^1.0.10",
-    "scope": null,
-    "spec": ">=1.0.10 <2.0.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/define-properties",
-    "/object.assign"
-  ],
-  "_resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
-  "_shasum": "c54601778ad560f1142ce0e01bcca8b56d13426d",
-  "_shrinkwrap": null,
-  "_spec": "object-keys@^1.0.10",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/object.assign",
-  "author": {
-    "email": "ljharb@gmail.com",
-    "name": "Jordan Harband",
-    "url": "http://ljharb.codes"
-  },
-  "bugs": {
-    "url": "https://github.com/ljharb/object-keys/issues"
-  },
-  "contributors": [
-    {
-      "name": "Jordan Harband",
-      "email": "ljharb@gmail.com",
-      "url": "http://ljharb.codes"
-    },
-    {
-      "name": "Raynos",
-      "email": "raynos2@gmail.com"
-    },
-    {
-      "name": "Nathan Rajlich",
-      "email": "nathan@tootallnate.net"
-    },
-    {
-      "name": "Ivan Starkov",
-      "email": "istarkov@gmail.com"
-    },
-    {
-      "name": "Gary Katsevman",
-      "email": "git@gkatsev.com"
-    }
-  ],
-  "dependencies": {},
-  "description": "An Object.keys replacement, in case Object.keys is not available. From https://github.com/es-shims/es5-shim",
-  "devDependencies": {
-    "@ljharb/eslint-config": "^6.0.0",
-    "covert": "^1.1.0",
-    "eslint": "^3.0.0",
-    "foreach": "^2.0.5",
-    "indexof": "^0.0.1",
-    "is": "^3.1.0",
-    "jscs": "^3.0.6",
-    "nsp": "^2.5.0",
-    "tape": "^4.6.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "c54601778ad560f1142ce0e01bcca8b56d13426d",
-    "tarball": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz"
-  },
-  "engines": {
-    "node": ">= 0.4"
-  },
-  "gitHead": "3f869cc4b9f0f0489b2af7e80964f90d6c4403a4",
-  "homepage": "https://github.com/ljharb/object-keys#readme",
-  "keywords": [
-    "ES5",
-    "Object.keys",
-    "keys",
-    "shim"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "ljharb",
-      "email": "ljharb@gmail.com"
-    }
-  ],
-  "name": "object-keys",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/ljharb/object-keys.git"
-  },
-  "scripts": {
-    "coverage": "covert test/*.js",
-    "coverage-quiet": "covert test/*.js --quiet",
-    "eslint": "eslint test/*.js *.js",
-    "jscs": "jscs test/*.js *.js",
-    "lint": "npm run --silent jscs && npm run --silent eslint",
-    "posttest": "npm run --silent security",
-    "pretest": "npm run --silent lint",
-    "security": "nsp check",
-    "test": "npm run --silent tests-only",
-    "tests-only": "node test/index.js"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2",
-      "chrome/20.0..latest",
-      "chrome/4.0..10.0",
-      "chrome/canary",
-      "firefox/15.0..latest",
-      "firefox/3.0..6.0",
-      "firefox/nightly",
-      "iexplore/6.0..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/10.0..latest",
-      "opera/next",
-      "safari/4.0..latest"
-    ],
-    "files": "test/index.js"
-  },
-  "version": "1.0.11"
-}
diff --git a/js/node_modules/object-keys/test/index.js b/js/node_modules/object-keys/test/index.js
deleted file mode 100644
index 5402465a19b5b697128197df09d014c791542c51..0000000000000000000000000000000000000000
--- a/js/node_modules/object-keys/test/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-'use strict';
-
-require('./isArguments');
-
-require('./shim');
diff --git a/js/node_modules/object.assign/.eslintrc b/js/node_modules/object.assign/.eslintrc
deleted file mode 100644
index 85cd8fb1c0a14bdd3341fe345f406f4414e54693..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/.eslintrc
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"complexity": [2, 17],
-		"id-length": [2, { "min": 1, "max": 30 }],
-		"max-nested-callbacks": [2, 3],
-		"max-statements": [2, 33],
-		"max-statements-per-line": [2, { "max": 2 }],
-		"no-invalid-this": [1],
-		"no-magic-numbers": [1, { "ignore": [0] }],
-		"no-restricted-syntax": [2, "BreakStatement", "ContinueStatement", "DebuggerStatement", "LabeledStatement", "WithStatement"],
-		"no-unused-vars": [1, { "vars": "all", "args": "after-used" }]
-	}
-}
diff --git a/js/node_modules/object.assign/CHANGELOG.md b/js/node_modules/object.assign/CHANGELOG.md
deleted file mode 100644
index 166a4fc68ea959d458691cfda2daf1c97ec63de1..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/CHANGELOG.md
+++ /dev/null
@@ -1,171 +0,0 @@
-4.0.4 / 2016-07-04
-==================
-  * [Fix] Cache original `getOwnPropertySymbols`, and use that when `Object.getOwnPropertySymbols` is unavailable
-  * [Deps] update `object-keys`
-  * [Dev Deps] update `eslint`, `get-own-property-symbols`, `core-js`, `jscs`, `nsp`, `browserify`, `@ljharb/eslint-config`, `tape`, `@es-shims/api`
-  * [Tests] up to `node` `v6.2`, `v5.10`, `v4.4`
-  * [Tests] run sham tests on node 0.10
-  * [Tests] use pretest/posttest for linting/security
-
-4.0.3 / 2015-10-21
-==================
-  * [Fix] Support core-js's Symbol sham (#17)
-  * [Fix] Ensure that properties removed or made non-enumerable during enumeration are not assigned (#16)
-  * [Fix] Avoid looking up keys and values more than once
-  * [Tests] Avoid using `reduce` so `npm run test:shams:corejs` passes in `node` `v0.8` ([core-js#122](https://github.com/zloirock/core-js/issues/122))
-  * [Tests] Refactor to use my conventional structure that separates shimmed, implementation, and common tests
-  * [Tests] Create `npm run test:shams` and better organize tests for symbol shams
-  * [Tests] Remove `nsp` in favor of `requiresafe`
-
-4.0.2 / 2015-10-20
-==================
-  * [Fix] Ensure correct property enumeration order, particularly in v8 (#15)
-  * [Deps] update `object-keys`, `define-properties`
-  * [Dev Deps] update `browserify`, `is`, `tape`, `jscs`, `eslint`, `@ljharb/eslint-config`
-  * [Tests] up to `io.js` `v3.3`, `node` `v4.2`
-
-4.0.1 / 2015-08-16
-==================
-  * [Docs] Add `Symbol` note to readme
-
-4.0.0 / 2015-08-15
-==================
-  * [Breaking] Implement the [es-shim API](es-shims/api).
-  * [Robustness] Make implementation robust against later modification of environment methods.
-  * [Refactor] Move implementation to `implementation.js`
-  * [Docs] Switch from vb.teelaun.ch to versionbadg.es for the npm version badge SVG
-  * [Deps] update `object-keys`, `define-properties`
-  * [Dev Deps] update `browserify`, `tape`, `eslint`, `jscs`, `browserify`
-  * [Tests] Add `npm run tests-only`
-  * [Tests] use my personal shared `eslint` config.
-  * [Tests] up to `io.js` `v3.0`
-
-3.0.1 / 2015-06-28
-==================
-  * Cache `Object` and `Array#push` to make the shim more robust.
-  * [Fix] Remove use of `Array#filter`, which isn't in ES3.
-  * [Deps] Update `object-keys`, `define-properties`
-  * [Dev Deps] Update `get-own-property-symbols`, `browserify`, `eslint`, `nsp`
-  * [Tests] Test up to `io.js` `v2.3`
-  * [Tests] Adding `Object.assign` tests for non-object targets, per https://github.com/paulmillr/es6-shim/issues/348
-
-3.0.0 / 2015-05-20
-==================
-  * Attempt to feature-detect Symbols, even if `typeof Symbol() !== 'symbol'` (#12)
-  * Make a separate `hasSymbols` internal module
-  * Update `browserify`, `eslint`
-
-2.0.3 / 2015-06-28
-==================
-  * Cache `Object` and `Array#push` to make the shim more robust.
-  * [Fix] Remove use of `Array#filter`, which isn't in ES3
-  * [Deps] Update `object-keys`, `define-properties`
-  * [Dev Deps] Update `browserify`, `nsp`, `eslint`
-  * [Tests] Test up to `io.js` `v2.3`
-
-2.0.2 / 2015-05-20
-==================
-  * Make sure `.shim` is non-enumerable.
-  * Refactor `.shim` implementation to use `define-properties` predicates, rather than `delete`ing the original.
-  * Update docs to match spec/implementation. (#11)
-  * Add `npm run eslint`
-  * Test up to `io.js` `v2.0`
-  * Update `jscs`, `browserify`, `covert`
-
-2.0.1 / 2015-04-12
-==================
-  * Make sure non-enumerable Symbols are excluded.
-
-2.0.0 / 2015-04-12
-==================
-  * Make sure the shim function overwrites a broken implementation with pending exceptions.
-  * Ensure shim is not enumerable using `define-properties`
-  * Ensure `Object.assign` includes symbols.
-  * All grade A-supported `node`/`iojs` versions now ship with an `npm` that understands `^`.
-  * Run `travis-ci` tests on `iojs` and `node` v0.12; speed up builds; allow 0.8 failures.
-  * Add `npm run security` via `nsp`
-  * Update `browserify`, `jscs`, `tape`, `object-keys`, `is`
-
-1.1.1 / 2014-12-14
-==================
-  * Actually include the browser build in `npm`
-
-1.1.0 / 2014-12-14
-==================
-  * Add `npm run build`, and build an automatic-shimming browser distribution as part of the npm publish process.
-  * Update `is`, `jscs`
-
-1.0.3 / 2014-11-29
-==================
-  * Revert "optimize --production installs"
-
-1.0.2 / 2014-11-27
-==================
-  * Update `jscs`, `is`, `object-keys`, `tape`
-  * Add badges to README
-  * Name URLs in README
-  * Lock `covert` to `v1.0.0`
-  * Optimize --production installs
-
-1.0.1 / 2014-08-26
-==================
-  * Update `is`, `covert`
-
-1.0.0 / 2014-08-07
-==================
-  * Update `object-keys`, `tape`
-
-0.5.0 / 2014-07-31
-==================
-  * Object.assign no longer throws on null or undefined sources, per https://bugs.ecmascript.org/show_bug.cgi?id=3096
-
-0.4.3 / 2014-07-30
-==================
-  * Don’t modify vars in the function signature, since it deoptimizes v8
-
-0.4.2 / 2014-07-30
-==================
-  * Fixing the version number: v0.4.2
-
-0.4.1 / 2014-07-19
-==================
-  * Revert "Use the native Object.keys if it’s available."
-
-0.4.0 / 2014-07-19
-==================
-  * Use the native Object.keys if it’s available.
-  * Fixes [#2](https://github.com/ljharb/object.assign/issues/2).
-  * Adding failing tests for [#2](https://github.com/ljharb/object.assign/issues/2).
-  * Fix indentation.
-  * Adding `npm run lint`
-  * Update `tape`, `covert`
-  * README: Use SVG badge for Travis [#1](https://github.com/ljharb/object.assign/issues/1) from mathiasbynens/patch-1
-
-0.3.1 / 2014-04-10
-==================
-  * Object.assign does partially modify objects if it throws, per https://twitter.com/awbjs/status/454320863093862400
-
-0.3.0 / 2014-04-10
-==================
-  * Update with newest ES6 behavior - Object.assign now takes a variable number of source objects.
-  * Update `tape`
-  * Make sure old and unstable nodes don’t fail Travis
-
-0.2.1 / 2014-03-16
-==================
-  * Let object-keys handle the fallback
-  * Update dependency badges
-  * Adding bower.json
-
-0.2.0 / 2014-03-16
-==================
-  * Use a for loop, because ES3 browsers don’t have "reduce"
-
-0.1.1 / 2014-03-14
-==================
-  * Updating readme
-
-0.1.0 / 2014-03-14
-==================
-  * Initial release.
-
diff --git a/js/node_modules/object.assign/LICENSE b/js/node_modules/object.assign/LICENSE
deleted file mode 100644
index ab29cbd63b72d5d30b0cc92162db190f2e4b9a36..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Jordan Harband
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
diff --git a/js/node_modules/object.assign/dist/browser.js b/js/node_modules/object.assign/dist/browser.js
deleted file mode 100644
index c4b934994da41def1d0e08a5dd0fc2b87a8673dd..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/dist/browser.js
+++ /dev/null
@@ -1,477 +0,0 @@
-(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-'use strict';
-
-var keys = require('object-keys').shim();
-delete keys.shim;
-
-var assign = require('./');
-
-module.exports = assign.shim();
-
-delete assign.shim;
-
-},{"./":4,"object-keys":9}],2:[function(require,module,exports){
-'use strict';
-
-var keys = require('object-keys');
-
-module.exports = function hasSymbols() {
-	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
-	if (typeof Symbol.iterator === 'symbol') { return true; }
-
-	var obj = {};
-	var sym = Symbol('test');
-	var symObj = Object(sym);
-	if (typeof sym === 'string') { return false; }
-
-	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
-	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
-
-	// temp disabled per https://github.com/ljharb/object.assign/issues/17
-	// if (sym instanceof Symbol) { return false; }
-	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
-	// if (!(symObj instanceof Symbol)) { return false; }
-
-	var symVal = 42;
-	obj[sym] = symVal;
-	for (sym in obj) { return false; }
-	if (keys(obj).length !== 0) { return false; }
-	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
-
-	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
-
-	var syms = Object.getOwnPropertySymbols(obj);
-	if (syms.length !== 1 || syms[0] !== sym) { return false; }
-
-	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
-
-	if (typeof Object.getOwnPropertyDescriptor === 'function') {
-		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
-		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
-	}
-
-	return true;
-};
-
-},{"object-keys":9}],3:[function(require,module,exports){
-'use strict';
-
-// modified from https://github.com/es-shims/es6-shim
-var keys = require('object-keys');
-var bind = require('function-bind');
-var canBeObject = function (obj) {
-	return typeof obj !== 'undefined' && obj !== null;
-};
-var hasSymbols = require('./hasSymbols')();
-var toObject = Object;
-var push = bind.call(Function.call, Array.prototype.push);
-var propIsEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable);
-var originalGetSymbols = hasSymbols ? Object.getOwnPropertySymbols : null;
-
-module.exports = function assign(target, source1) {
-	if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
-	var objTarget = toObject(target);
-	var s, source, i, props, syms, value, key;
-	for (s = 1; s < arguments.length; ++s) {
-		source = toObject(arguments[s]);
-		props = keys(source);
-		var getSymbols = hasSymbols && (Object.getOwnPropertySymbols || originalGetSymbols);
-		if (getSymbols) {
-			syms = getSymbols(source);
-			for (i = 0; i < syms.length; ++i) {
-				key = syms[i];
-				if (propIsEnumerable(source, key)) {
-					push(props, key);
-				}
-			}
-		}
-		for (i = 0; i < props.length; ++i) {
-			key = props[i];
-			value = source[key];
-			if (propIsEnumerable(source, key)) {
-				objTarget[key] = value;
-			}
-		}
-	}
-	return objTarget;
-};
-
-},{"./hasSymbols":2,"function-bind":8,"object-keys":9}],4:[function(require,module,exports){
-'use strict';
-
-var defineProperties = require('define-properties');
-
-var implementation = require('./implementation');
-var getPolyfill = require('./polyfill');
-var shim = require('./shim');
-
-var polyfill = getPolyfill();
-
-defineProperties(polyfill, {
-	implementation: implementation,
-	getPolyfill: getPolyfill,
-	shim: shim
-});
-
-module.exports = polyfill;
-
-},{"./implementation":3,"./polyfill":11,"./shim":12,"define-properties":5}],5:[function(require,module,exports){
-'use strict';
-
-var keys = require('object-keys');
-var foreach = require('foreach');
-var hasSymbols = typeof Symbol === 'function' && typeof Symbol() === 'symbol';
-
-var toStr = Object.prototype.toString;
-
-var isFunction = function (fn) {
-	return typeof fn === 'function' && toStr.call(fn) === '[object Function]';
-};
-
-var arePropertyDescriptorsSupported = function () {
-	var obj = {};
-	try {
-		Object.defineProperty(obj, 'x', { enumerable: false, value: obj });
-        /* eslint-disable no-unused-vars, no-restricted-syntax */
-        for (var _ in obj) { return false; }
-        /* eslint-enable no-unused-vars, no-restricted-syntax */
-		return obj.x === obj;
-	} catch (e) { /* this is IE 8. */
-		return false;
-	}
-};
-var supportsDescriptors = Object.defineProperty && arePropertyDescriptorsSupported();
-
-var defineProperty = function (object, name, value, predicate) {
-	if (name in object && (!isFunction(predicate) || !predicate())) {
-		return;
-	}
-	if (supportsDescriptors) {
-		Object.defineProperty(object, name, {
-			configurable: true,
-			enumerable: false,
-			value: value,
-			writable: true
-		});
-	} else {
-		object[name] = value;
-	}
-};
-
-var defineProperties = function (object, map) {
-	var predicates = arguments.length > 2 ? arguments[2] : {};
-	var props = keys(map);
-	if (hasSymbols) {
-		props = props.concat(Object.getOwnPropertySymbols(map));
-	}
-	foreach(props, function (name) {
-		defineProperty(object, name, map[name], predicates[name]);
-	});
-};
-
-defineProperties.supportsDescriptors = !!supportsDescriptors;
-
-module.exports = defineProperties;
-
-},{"foreach":6,"object-keys":9}],6:[function(require,module,exports){
-
-var hasOwn = Object.prototype.hasOwnProperty;
-var toString = Object.prototype.toString;
-
-module.exports = function forEach (obj, fn, ctx) {
-    if (toString.call(fn) !== '[object Function]') {
-        throw new TypeError('iterator must be a function');
-    }
-    var l = obj.length;
-    if (l === +l) {
-        for (var i = 0; i < l; i++) {
-            fn.call(ctx, obj[i], i, obj);
-        }
-    } else {
-        for (var k in obj) {
-            if (hasOwn.call(obj, k)) {
-                fn.call(ctx, obj[k], k, obj);
-            }
-        }
-    }
-};
-
-
-},{}],7:[function(require,module,exports){
-var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
-var slice = Array.prototype.slice;
-var toStr = Object.prototype.toString;
-var funcType = '[object Function]';
-
-module.exports = function bind(that) {
-    var target = this;
-    if (typeof target !== 'function' || toStr.call(target) !== funcType) {
-        throw new TypeError(ERROR_MESSAGE + target);
-    }
-    var args = slice.call(arguments, 1);
-
-    var bound;
-    var binder = function () {
-        if (this instanceof bound) {
-            var result = target.apply(
-                this,
-                args.concat(slice.call(arguments))
-            );
-            if (Object(result) === result) {
-                return result;
-            }
-            return this;
-        } else {
-            return target.apply(
-                that,
-                args.concat(slice.call(arguments))
-            );
-        }
-    };
-
-    var boundLength = Math.max(0, target.length - args.length);
-    var boundArgs = [];
-    for (var i = 0; i < boundLength; i++) {
-        boundArgs.push('$' + i);
-    }
-
-    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
-
-    if (target.prototype) {
-        var Empty = function Empty() {};
-        Empty.prototype = target.prototype;
-        bound.prototype = new Empty();
-        Empty.prototype = null;
-    }
-
-    return bound;
-};
-
-},{}],8:[function(require,module,exports){
-var implementation = require('./implementation');
-
-module.exports = Function.prototype.bind || implementation;
-
-},{"./implementation":7}],9:[function(require,module,exports){
-'use strict';
-
-// modified from https://github.com/es-shims/es5-shim
-var has = Object.prototype.hasOwnProperty;
-var toStr = Object.prototype.toString;
-var slice = Array.prototype.slice;
-var isArgs = require('./isArguments');
-var isEnumerable = Object.prototype.propertyIsEnumerable;
-var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
-var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
-var dontEnums = [
-	'toString',
-	'toLocaleString',
-	'valueOf',
-	'hasOwnProperty',
-	'isPrototypeOf',
-	'propertyIsEnumerable',
-	'constructor'
-];
-var equalsConstructorPrototype = function (o) {
-	var ctor = o.constructor;
-	return ctor && ctor.prototype === o;
-};
-var excludedKeys = {
-	$console: true,
-	$external: true,
-	$frame: true,
-	$frameElement: true,
-	$frames: true,
-	$height: true,
-	$parent: true,
-	$self: true,
-	$webkitIndexedDB: true,
-	$webkitStorageInfo: true,
-	$width: true,
-	$window: true
-};
-var hasAutomationEqualityBug = (function () {
-	/* global window */
-	if (typeof window === 'undefined') { return false; }
-	for (var k in window) {
-		try {
-			if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
-				try {
-					equalsConstructorPrototype(window[k]);
-				} catch (e) {
-					return true;
-				}
-			}
-		} catch (e) {
-			return true;
-		}
-	}
-	return false;
-}());
-var equalsConstructorPrototypeIfNotBuggy = function (o) {
-	/* global window */
-	if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
-		return equalsConstructorPrototype(o);
-	}
-	try {
-		return equalsConstructorPrototype(o);
-	} catch (e) {
-		return false;
-	}
-};
-
-var keysShim = function keys(object) {
-	var isObject = object !== null && typeof object === 'object';
-	var isFunction = toStr.call(object) === '[object Function]';
-	var isArguments = isArgs(object);
-	var isString = isObject && toStr.call(object) === '[object String]';
-	var theKeys = [];
-
-	if (!isObject && !isFunction && !isArguments) {
-		throw new TypeError('Object.keys called on a non-object');
-	}
-
-	var skipProto = hasProtoEnumBug && isFunction;
-	if (isString && object.length > 0 && !has.call(object, 0)) {
-		for (var i = 0; i < object.length; ++i) {
-			theKeys.push(String(i));
-		}
-	}
-
-	if (isArguments && object.length > 0) {
-		for (var j = 0; j < object.length; ++j) {
-			theKeys.push(String(j));
-		}
-	} else {
-		for (var name in object) {
-			if (!(skipProto && name === 'prototype') && has.call(object, name)) {
-				theKeys.push(String(name));
-			}
-		}
-	}
-
-	if (hasDontEnumBug) {
-		var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
-
-		for (var k = 0; k < dontEnums.length; ++k) {
-			if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
-				theKeys.push(dontEnums[k]);
-			}
-		}
-	}
-	return theKeys;
-};
-
-keysShim.shim = function shimObjectKeys() {
-	if (Object.keys) {
-		var keysWorksWithArguments = (function () {
-			// Safari 5.0 bug
-			return (Object.keys(arguments) || '').length === 2;
-		}(1, 2));
-		if (!keysWorksWithArguments) {
-			var originalKeys = Object.keys;
-			Object.keys = function keys(object) {
-				if (isArgs(object)) {
-					return originalKeys(slice.call(object));
-				} else {
-					return originalKeys(object);
-				}
-			};
-		}
-	} else {
-		Object.keys = keysShim;
-	}
-	return Object.keys || keysShim;
-};
-
-module.exports = keysShim;
-
-},{"./isArguments":10}],10:[function(require,module,exports){
-'use strict';
-
-var toStr = Object.prototype.toString;
-
-module.exports = function isArguments(value) {
-	var str = toStr.call(value);
-	var isArgs = str === '[object Arguments]';
-	if (!isArgs) {
-		isArgs = str !== '[object Array]' &&
-			value !== null &&
-			typeof value === 'object' &&
-			typeof value.length === 'number' &&
-			value.length >= 0 &&
-			toStr.call(value.callee) === '[object Function]';
-	}
-	return isArgs;
-};
-
-},{}],11:[function(require,module,exports){
-'use strict';
-
-var implementation = require('./implementation');
-
-var lacksProperEnumerationOrder = function () {
-	if (!Object.assign) {
-		return false;
-	}
-	// v8, specifically in node 4.x, has a bug with incorrect property enumeration order
-	// note: this does not detect the bug unless there's 20 characters
-	var str = 'abcdefghijklmnopqrst';
-	var letters = str.split('');
-	var map = {};
-	for (var i = 0; i < letters.length; ++i) {
-		map[letters[i]] = letters[i];
-	}
-	var obj = Object.assign({}, map);
-	var actual = '';
-	for (var k in obj) {
-		actual += k;
-	}
-	return str !== actual;
-};
-
-var assignHasPendingExceptions = function () {
-	if (!Object.assign || !Object.preventExtensions) {
-		return false;
-	}
-	// Firefox 37 still has "pending exception" logic in its Object.assign implementation,
-	// which is 72% slower than our shim, and Firefox 40's native implementation.
-	var thrower = Object.preventExtensions({ 1: 2 });
-	try {
-		Object.assign(thrower, 'xy');
-	} catch (e) {
-		return thrower[1] === 'y';
-	}
-	return false;
-};
-
-module.exports = function getPolyfill() {
-	if (!Object.assign) {
-		return implementation;
-	}
-	if (lacksProperEnumerationOrder()) {
-		return implementation;
-	}
-	if (assignHasPendingExceptions()) {
-		return implementation;
-	}
-	return Object.assign;
-};
-
-},{"./implementation":3}],12:[function(require,module,exports){
-'use strict';
-
-var define = require('define-properties');
-var getPolyfill = require('./polyfill');
-
-module.exports = function shimAssign() {
-	var polyfill = getPolyfill();
-	define(
-		Object,
-		{ assign: polyfill },
-		{ assign: function () { return Object.assign !== polyfill; } }
-	);
-	return polyfill;
-};
-
-},{"./polyfill":11,"define-properties":5}]},{},[1]);
diff --git a/js/node_modules/object.assign/hasSymbols.js b/js/node_modules/object.assign/hasSymbols.js
deleted file mode 100644
index f6e0db9780ddec6c7e77a814ccb53c7a39d85ff3..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/hasSymbols.js
+++ /dev/null
@@ -1,41 +0,0 @@
-'use strict';
-
-var keys = require('object-keys');
-
-module.exports = function hasSymbols() {
-	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
-	if (typeof Symbol.iterator === 'symbol') { return true; }
-
-	var obj = {};
-	var sym = Symbol('test');
-	var symObj = Object(sym);
-	if (typeof sym === 'string') { return false; }
-
-	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
-	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
-
-	// temp disabled per https://github.com/ljharb/object.assign/issues/17
-	// if (sym instanceof Symbol) { return false; }
-	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
-	// if (!(symObj instanceof Symbol)) { return false; }
-
-	var symVal = 42;
-	obj[sym] = symVal;
-	for (sym in obj) { return false; }
-	if (keys(obj).length !== 0) { return false; }
-	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
-
-	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
-
-	var syms = Object.getOwnPropertySymbols(obj);
-	if (syms.length !== 1 || syms[0] !== sym) { return false; }
-
-	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
-
-	if (typeof Object.getOwnPropertyDescriptor === 'function') {
-		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
-		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
-	}
-
-	return true;
-};
diff --git a/js/node_modules/object.assign/implementation.js b/js/node_modules/object.assign/implementation.js
deleted file mode 100644
index 32311b8400642bbb5175be70f441fff23e3c3eea..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/implementation.js
+++ /dev/null
@@ -1,41 +0,0 @@
-'use strict';
-
-// modified from https://github.com/es-shims/es6-shim
-var keys = require('object-keys');
-var bind = require('function-bind');
-var canBeObject = function (obj) {
-	return typeof obj !== 'undefined' && obj !== null;
-};
-var hasSymbols = require('./hasSymbols')();
-var toObject = Object;
-var push = bind.call(Function.call, Array.prototype.push);
-var propIsEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable);
-var originalGetSymbols = hasSymbols ? Object.getOwnPropertySymbols : null;
-
-module.exports = function assign(target, source1) {
-	if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
-	var objTarget = toObject(target);
-	var s, source, i, props, syms, value, key;
-	for (s = 1; s < arguments.length; ++s) {
-		source = toObject(arguments[s]);
-		props = keys(source);
-		var getSymbols = hasSymbols && (Object.getOwnPropertySymbols || originalGetSymbols);
-		if (getSymbols) {
-			syms = getSymbols(source);
-			for (i = 0; i < syms.length; ++i) {
-				key = syms[i];
-				if (propIsEnumerable(source, key)) {
-					push(props, key);
-				}
-			}
-		}
-		for (i = 0; i < props.length; ++i) {
-			key = props[i];
-			value = source[key];
-			if (propIsEnumerable(source, key)) {
-				objTarget[key] = value;
-			}
-		}
-	}
-	return objTarget;
-};
diff --git a/js/node_modules/object.assign/index.js b/js/node_modules/object.assign/index.js
deleted file mode 100644
index 43f6e9e1a977b7346a673071cf017e1d5564a42b..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-var defineProperties = require('define-properties');
-
-var implementation = require('./implementation');
-var getPolyfill = require('./polyfill');
-var shim = require('./shim');
-
-var polyfill = getPolyfill();
-
-defineProperties(polyfill, {
-	implementation: implementation,
-	getPolyfill: getPolyfill,
-	shim: shim
-});
-
-module.exports = polyfill;
diff --git a/js/node_modules/object.assign/package.json b/js/node_modules/object.assign/package.json
deleted file mode 100644
index 4ff41633e4f717188ca9f63ffca5fc2026e011a1..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/package.json
+++ /dev/null
@@ -1,143 +0,0 @@
-{
-  "_args": [
-    [
-      "object.assign@^4.0.3",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport"
-    ]
-  ],
-  "_from": "object.assign@>=4.0.3 <5.0.0",
-  "_id": "object.assign@4.0.4",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/object.assign",
-  "_nodeVersion": "6.2.2",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/object.assign-4.0.4.tgz_1467661525697_0.9803472796920687"
-  },
-  "_npmUser": {
-    "email": "ljharb@gmail.com",
-    "name": "ljharb"
-  },
-  "_npmVersion": "3.9.5",
-  "_phantomChildren": {},
-  "_requested": {
-    "name": "object.assign",
-    "raw": "object.assign@^4.0.3",
-    "rawSpec": "^4.0.3",
-    "scope": null,
-    "spec": ">=4.0.3 <5.0.0",
-    "type": "range"
-  },
-  "_requiredBy": [
-    "/serialport"
-  ],
-  "_resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz",
-  "_shasum": "b1c9cc044ef1b9fe63606fc141abbb32e14730cc",
-  "_shrinkwrap": null,
-  "_spec": "object.assign@^4.0.3",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js/node_modules/serialport",
-  "author": {
-    "name": "Jordan Harband"
-  },
-  "bugs": {
-    "url": "https://github.com/ljharb/object.assign/issues"
-  },
-  "dependencies": {
-    "define-properties": "^1.1.2",
-    "function-bind": "^1.1.0",
-    "object-keys": "^1.0.10"
-  },
-  "description": "ES6 spec-compliant Object.assign shim. From https://github.com/es-shims/es6-shim",
-  "devDependencies": {
-    "@es-shims/api": "^1.2.0",
-    "@ljharb/eslint-config": "^6.0.0",
-    "browserify": "^13.0.1",
-    "core-js": "^2.4.0",
-    "covert": "^1.1.0",
-    "eslint": "^3.0.0",
-    "for-each": "^0.3.2",
-    "get-own-property-symbols": "^0.9.2",
-    "is": "^3.1.0",
-    "jscs": "^3.0.6",
-    "nsp": "^2.5.0",
-    "tape": "^4.6.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "b1c9cc044ef1b9fe63606fc141abbb32e14730cc",
-    "tarball": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz"
-  },
-  "engines": {
-    "node": ">= 0.4"
-  },
-  "gitHead": "2a76fc5cd47dc47c3a01e5d681b8204213d77c84",
-  "homepage": "https://github.com/ljharb/object.assign#readme",
-  "keywords": [
-    "$.extend",
-    "ES6",
-    "Object.assign",
-    "Underscore",
-    "_.extend",
-    "assign",
-    "es-shim API",
-    "extend",
-    "jQuery",
-    "polyfill",
-    "shim"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "ljharb",
-      "email": "ljharb@gmail.com"
-    }
-  ],
-  "name": "object.assign",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/ljharb/object.assign.git"
-  },
-  "scripts": {
-    "build": "mkdir -p dist && browserify browserShim.js > dist/browser.js",
-    "coverage": "covert test/*.js",
-    "coverage:quiet": "covert test/*.js --quiet",
-    "eslint": "eslint *.js test/*.js",
-    "jscs": "jscs *.js test/*.js",
-    "lint": "npm run --silent jscs && npm run --silent eslint",
-    "posttest": "npm run --silent security",
-    "prepublish": "npm run --silent build",
-    "pretest": "npm run --silent lint && es-shim-api",
-    "security": "nsp check",
-    "test": "npm run --silent tests-only",
-    "test:implementation": "node test/index.js",
-    "test:native": "node test/native.js",
-    "test:shams": "npm run --silent test:shams:getownpropertysymbols && npm run --silent test:shams:corejs",
-    "test:shams:corejs": "node test/shams/core-js.js",
-    "test:shams:getownpropertysymbols": "node test/shams/get-own-property-symbols.js",
-    "test:shim": "node test/shimmed.js",
-    "tests-only": "npm run --silent test:implementation && npm run --silent test:shim && npm run --silent test:shams"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2",
-      "chrome/20.0..latest",
-      "chrome/4.0..10.0",
-      "chrome/canary",
-      "firefox/15.0..latest",
-      "firefox/3.0..6.0",
-      "firefox/nightly",
-      "iexplore/6.0..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/10.0..latest",
-      "opera/next",
-      "safari/4.0..latest"
-    ],
-    "files": "test/index.js"
-  },
-  "version": "4.0.4"
-}
diff --git a/js/node_modules/object.assign/polyfill.js b/js/node_modules/object.assign/polyfill.js
deleted file mode 100644
index 5b6c5774e29606a34d3405a044b178847e412a13..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/polyfill.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict';
-
-var implementation = require('./implementation');
-
-var lacksProperEnumerationOrder = function () {
-	if (!Object.assign) {
-		return false;
-	}
-	// v8, specifically in node 4.x, has a bug with incorrect property enumeration order
-	// note: this does not detect the bug unless there's 20 characters
-	var str = 'abcdefghijklmnopqrst';
-	var letters = str.split('');
-	var map = {};
-	for (var i = 0; i < letters.length; ++i) {
-		map[letters[i]] = letters[i];
-	}
-	var obj = Object.assign({}, map);
-	var actual = '';
-	for (var k in obj) {
-		actual += k;
-	}
-	return str !== actual;
-};
-
-var assignHasPendingExceptions = function () {
-	if (!Object.assign || !Object.preventExtensions) {
-		return false;
-	}
-	// Firefox 37 still has "pending exception" logic in its Object.assign implementation,
-	// which is 72% slower than our shim, and Firefox 40's native implementation.
-	var thrower = Object.preventExtensions({ 1: 2 });
-	try {
-		Object.assign(thrower, 'xy');
-	} catch (e) {
-		return thrower[1] === 'y';
-	}
-	return false;
-};
-
-module.exports = function getPolyfill() {
-	if (!Object.assign) {
-		return implementation;
-	}
-	if (lacksProperEnumerationOrder()) {
-		return implementation;
-	}
-	if (assignHasPendingExceptions()) {
-		return implementation;
-	}
-	return Object.assign;
-};
diff --git a/js/node_modules/object.assign/shim.js b/js/node_modules/object.assign/shim.js
deleted file mode 100644
index 9f896ae3cf90a39f574d789020c40cda3eb4e9bf..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/shim.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict';
-
-var define = require('define-properties');
-var getPolyfill = require('./polyfill');
-
-module.exports = function shimAssign() {
-	var polyfill = getPolyfill();
-	define(
-		Object,
-		{ assign: polyfill },
-		{ assign: function () { return Object.assign !== polyfill; } }
-	);
-	return polyfill;
-};
diff --git a/js/node_modules/object.assign/test.sh b/js/node_modules/object.assign/test.sh
deleted file mode 100644
index da9818d7df93f91df58e2f8c140b959694837683..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/test.sh
+++ /dev/null
@@ -1,53 +0,0 @@
-###-begin-npm-completion-###
-#
-# npm command completion script
-#
-# Installation: npm completion >> ~/.bashrc  (or ~/.zshrc)
-# Or, maybe: npm completion > /usr/local/etc/bash_completion.d/npm
-#
-
-COMP_WORDBREAKS=${COMP_WORDBREAKS/=/}
-COMP_WORDBREAKS=${COMP_WORDBREAKS/@/}
-export COMP_WORDBREAKS
-
-if type complete &>/dev/null; then
-  _npm_completion () {
-    local si="$IFS"
-    IFS=$'\n' COMPREPLY=($(COMP_CWORD="$COMP_CWORD" \
-                           COMP_LINE="$COMP_LINE" \
-                           COMP_POINT="$COMP_POINT" \
-                           npm completion -- "${COMP_WORDS[@]}" \
-                           2>/dev/null)) || return $?
-    IFS="$si"
-  }
-  complete -F _npm_completion npm
-elif type compdef &>/dev/null; then
-  _npm_completion() {
-    si=$IFS
-    compadd -- $(COMP_CWORD=$((CURRENT-1)) \
-                 COMP_LINE=$BUFFER \
-                 COMP_POINT=0 \
-                 npm completion -- "${words[@]}" \
-                 2>/dev/null)
-    IFS=$si
-  }
-  compdef _npm_completion npm
-elif type compctl &>/dev/null; then
-  _npm_completion () {
-    local cword line point words si
-    read -Ac words
-    read -cn cword
-    let cword-=1
-    read -l line
-    read -ln point
-    si="$IFS"
-    IFS=$'\n' reply=($(COMP_CWORD="$cword" \
-                       COMP_LINE="$line" \
-                       COMP_POINT="$point" \
-                       npm completion -- "${words[@]}" \
-                       2>/dev/null)) || return $?
-    IFS="$si"
-  }
-  compctl -K _npm_completion npm
-fi
-###-end-npm-completion-###
diff --git a/js/node_modules/object.assign/test/.eslintrc b/js/node_modules/object.assign/test/.eslintrc
deleted file mode 100644
index 1ca5cdc53ef03ba4029fe478644226742fb053d8..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/test/.eslintrc
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-	"rules": {
-		"max-statements-per-line": [2, { "max": 3 }],
-		"no-magic-numbers": 0
-	}
-}
diff --git a/js/node_modules/object.assign/test/index.js b/js/node_modules/object.assign/test/index.js
deleted file mode 100644
index 12c2f8806f12c7c6683323c7cf29177cb315be33..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/test/index.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-var assign = require('../');
-var test = require('tape');
-var runTests = require('./tests');
-
-test('as a function', function (t) {
-	t.test('bad array/this value', function (st) {
-		st.throws(function () { assign(undefined); }, TypeError, 'undefined is not an object');
-		st.throws(function () { assign(null); }, TypeError, 'null is not an object');
-		st.end();
-	});
-
-	runTests(assign, t);
-
-	t.end();
-});
diff --git a/js/node_modules/object.assign/test/native.js b/js/node_modules/object.assign/test/native.js
deleted file mode 100644
index b1bc8b3091ade24b16d8ab5011a039066ec83499..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/test/native.js
+++ /dev/null
@@ -1,47 +0,0 @@
-'use strict';
-
-var test = require('tape');
-var defineProperties = require('define-properties');
-var isEnumerable = Object.prototype.propertyIsEnumerable;
-var functionsHaveNames = function f() {}.name === 'f';
-
-var runTests = require('./tests');
-
-test('native', function (t) {
-	t.equal(Object.assign.length, 2, 'Object.assign has a length of 2');
-	t.test('Function name', { skip: !functionsHaveNames }, function (st) {
-		st.equal(Object.assign.name, 'assign', 'Object.assign has name "assign"');
-		st.end();
-	});
-
-	t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
-		et.equal(false, isEnumerable.call(Object, 'assign'), 'Object.assign is not enumerable');
-		et.end();
-	});
-
-	var supportsStrictMode = (function () { return typeof this === 'undefined'; }());
-
-	t.test('bad object value', { skip: !supportsStrictMode }, function (st) {
-		st.throws(function () { return Object.assign(undefined); }, TypeError, 'undefined is not an object');
-		st.throws(function () { return Object.assign(null); }, TypeError, 'null is not an object');
-		st.end();
-	});
-
-	// v8 in node 0.8 and 0.10 have non-enumerable string properties
-	var stringCharsAreEnumerable = isEnumerable.call('xy', 0);
-	t.test('when Object.assign is present and has pending exceptions', { skip: !stringCharsAreEnumerable || !Object.preventExtensions }, function (st) {
-		// Firefox 37 still has "pending exception" logic in its Object.assign implementation,
-		// which is 72% slower than our shim, and Firefox 40's native implementation.
-		var thrower = Object.preventExtensions({ 1: '2' });
-		var error;
-		try { Object.assign(thrower, 'xy'); } catch (e) { error = e; }
-		st.equal(error instanceof TypeError, true, 'error is TypeError');
-		st.equal(thrower[1], '2', 'thrower[1] === "2"');
-
-		st.end();
-	});
-
-	runTests(Object.assign, t);
-
-	t.end();
-});
diff --git a/js/node_modules/object.assign/test/shams/core-js.js b/js/node_modules/object.assign/test/shams/core-js.js
deleted file mode 100644
index 3c29c8ec5eaaf774f7e14ef22f48868651d9ec98..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/test/shams/core-js.js
+++ /dev/null
@@ -1,26 +0,0 @@
-'use strict';
-
-var test = require('tape');
-
-if (typeof Symbol === 'function' && typeof Symbol() === 'symbol') {
-	test('has native Symbol support', function (t) {
-		t.equal(typeof Symbol, 'function');
-		t.equal(typeof Symbol(), 'symbol');
-		t.end();
-	});
-	return;
-}
-
-var hasSymbols = require('../../hasSymbols');
-
-test('polyfilled Symbols', function (t) {
-	t.equal(hasSymbols(), false, 'hasSymbols is false before polyfilling');
-	require('core-js/fn/symbol');
-	require('core-js/fn/symbol/to-string-tag');
-	var hasSymbolsAfter = hasSymbols();
-	t.equal(hasSymbolsAfter, true, 'hasSymbols is true after polyfilling');
-	/* eslint-disable global-require */
-	if (hasSymbolsAfter) { require('../'); }
-	/* eslint-enable global-require */
-	t.end();
-});
diff --git a/js/node_modules/object.assign/test/shams/get-own-property-symbols.js b/js/node_modules/object.assign/test/shams/get-own-property-symbols.js
deleted file mode 100644
index e1e07cec8ed179b1073cc55585412150a7478879..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/test/shams/get-own-property-symbols.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict';
-
-var test = require('tape');
-
-if (typeof Symbol === 'function' && typeof Symbol() === 'symbol') {
-	test('has native Symbol support', function (t) {
-		t.equal(typeof Symbol, 'function');
-		t.equal(typeof Symbol(), 'symbol');
-		t.end();
-	});
-	return;
-}
-
-var hasSymbols = require('../../hasSymbols');
-
-test('polyfilled Symbols', function (t) {
-	/* eslint-disable global-require */
-	t.equal(hasSymbols(), false, 'hasSymbols is false before polyfilling');
-	require('get-own-property-symbols');
-	var hasSymbolsAfter = hasSymbols();
-	t.equal(hasSymbolsAfter, true, 'hasSymbols is true after polyfilling');
-	if (hasSymbolsAfter) { require('../'); }
-	/* eslint-enable global-require */
-	t.end();
-});
diff --git a/js/node_modules/object.assign/test/shimmed.js b/js/node_modules/object.assign/test/shimmed.js
deleted file mode 100644
index 35eb8641fa2bab81916f47b6d25e3f599fd73049..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/test/shimmed.js
+++ /dev/null
@@ -1,50 +0,0 @@
-'use strict';
-
-var assign = require('../');
-assign.shim();
-
-var test = require('tape');
-var defineProperties = require('define-properties');
-var isEnumerable = Object.prototype.propertyIsEnumerable;
-var functionsHaveNames = function f() {}.name === 'f';
-
-var runTests = require('./tests');
-
-test('shimmed', function (t) {
-	t.equal(Object.assign.length, 2, 'Object.assign has a length of 2');
-	t.test('Function name', { skip: !functionsHaveNames }, function (st) {
-		st.equal(Object.assign.name, 'assign', 'Object.assign has name "assign"');
-		st.end();
-	});
-
-	t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
-		et.equal(false, isEnumerable.call(Object, 'assign'), 'Object.assign is not enumerable');
-		et.end();
-	});
-
-	var supportsStrictMode = (function () { return typeof this === 'undefined'; }());
-
-	t.test('bad object value', { skip: !supportsStrictMode }, function (st) {
-		st.throws(function () { return Object.assign(undefined); }, TypeError, 'undefined is not an object');
-		st.throws(function () { return Object.assign(null); }, TypeError, 'null is not an object');
-		st.end();
-	});
-
-	// v8 in node 0.8 and 0.10 have non-enumerable string properties
-	var stringCharsAreEnumerable = isEnumerable.call('xy', 0);
-	t.test('when Object.assign is present and has pending exceptions', { skip: !stringCharsAreEnumerable || !Object.preventExtensions }, function (st) {
-		// Firefox 37 still has "pending exception" logic in its Object.assign implementation,
-		// which is 72% slower than our shim, and Firefox 40's native implementation.
-		var thrower = Object.preventExtensions({ 1: '2' });
-		var error;
-		try { Object.assign(thrower, 'xy'); } catch (e) { error = e; }
-		st.equal(error instanceof TypeError, true, 'error is TypeError');
-		st.equal(thrower[1], '2', 'thrower[1] === "2"');
-
-		st.end();
-	});
-
-	runTests(Object.assign, t);
-
-	t.end();
-});
diff --git a/js/node_modules/object.assign/test/tests.js b/js/node_modules/object.assign/test/tests.js
deleted file mode 100644
index 955bf6ad0f6e3ff97a62993f2bdd081295302cb6..0000000000000000000000000000000000000000
--- a/js/node_modules/object.assign/test/tests.js
+++ /dev/null
@@ -1,217 +0,0 @@
-'use strict';
-
-var hasSymbols = require('../hasSymbols')();
-var forEach = require('for-each');
-
-module.exports = function (assign, t) {
-	t.test('error cases', function (st) {
-		st.throws(function () { assign(null); }, TypeError, 'target must be an object');
-		st.throws(function () { assign(undefined); }, TypeError, 'target must be an object');
-		st.throws(function () { assign(null, {}); }, TypeError, 'target must be an object');
-		st.throws(function () { assign(undefined, {}); }, TypeError, 'target must be an object');
-		st.end();
-	});
-
-	t.test('non-object target, no sources', function (st) {
-		var bool = assign(true);
-		st.equal(typeof bool, 'object', 'bool is object');
-		st.equal(Boolean.prototype.valueOf.call(bool), true, 'bool coerces to `true`');
-
-		var number = assign(1);
-		st.equal(typeof number, 'object', 'number is object');
-		st.equal(Number.prototype.valueOf.call(number), 1, 'number coerces to `1`');
-
-		var string = assign('1');
-		st.equal(typeof string, 'object', 'number is object');
-		st.equal(String.prototype.valueOf.call(string), '1', 'number coerces to `"1"`');
-
-		st.end();
-	});
-
-	t.test('non-object target, with sources', function (st) {
-		var signal = {};
-
-		st.test('boolean', function (st2) {
-			var bool = assign(true, { a: signal });
-			st2.equal(typeof bool, 'object', 'bool is object');
-			st.equal(Boolean.prototype.valueOf.call(bool), true, 'bool coerces to `true`');
-			st2.equal(bool.a, signal, 'source properties copied');
-			st2.end();
-		});
-
-		st.test('number', function (st2) {
-			var number = assign(1, { a: signal });
-			st2.equal(typeof number, 'object', 'number is object');
-			st2.equal(Number.prototype.valueOf.call(number), 1, 'number coerces to `1`');
-			st2.equal(number.a, signal, 'source properties copied');
-			st2.end();
-		});
-
-		st.test('string', function (st2) {
-			var string = assign('1', { a: signal });
-			st2.equal(typeof string, 'object', 'number is object');
-			st2.equal(String.prototype.valueOf.call(string), '1', 'number coerces to `"1"`');
-			st2.equal(string.a, signal, 'source properties copied');
-			st2.end();
-		});
-
-		st.end();
-	});
-
-	t.test('non-object sources', function (st) {
-		st.deepEqual(assign({ a: 1 }, null, { b: 2 }), { a: 1, b: 2 }, 'ignores null source');
-		st.deepEqual(assign({ a: 1 }, { b: 2 }, undefined), { a: 1, b: 2 }, 'ignores undefined source');
-		st.end();
-	});
-
-	t.test('returns the modified target object', function (st) {
-		var target = {};
-		var returned = assign(target, { a: 1 });
-		st.equal(returned, target, 'returned object is the same reference as the target object');
-		st.end();
-	});
-
-	t.test('has the right length', function (st) {
-		st.equal(assign.length, 2, 'length is 2 => 2 required arguments');
-		st.end();
-	});
-
-	t.test('merge two objects', function (st) {
-		var target = { a: 1 };
-		var returned = assign(target, { b: 2 });
-		st.deepEqual(returned, { a: 1, b: 2 }, 'returned object has properties from both');
-		st.end();
-	});
-
-	t.test('works with functions', function (st) {
-		var target = function () {};
-		target.a = 1;
-		var returned = assign(target, { b: 2 });
-		st.equal(target, returned, 'returned object is target');
-		st.equal(returned.a, 1);
-		st.equal(returned.b, 2);
-		st.end();
-	});
-
-	t.test('works with primitives', function (st) {
-		var target = 2;
-		var source = { b: 42 };
-		var returned = assign(target, source);
-		st.equal(Object.prototype.toString.call(returned), '[object Number]', 'returned is object form of number primitive');
-		st.equal(Number(returned), target, 'returned and target have same valueOf');
-		st.equal(returned.b, source.b);
-		st.end();
-	});
-
-	t.test('merge N objects', function (st) {
-		var target = { a: 1 };
-		var source1 = { b: 2 };
-		var source2 = { c: 3 };
-		var returned = assign(target, source1, source2);
-		st.deepEqual(returned, { a: 1, b: 2, c: 3 }, 'returned object has properties from all sources');
-		st.end();
-	});
-
-	t.test('only iterates over own keys', function (st) {
-		var Foo = function () {};
-		Foo.prototype.bar = true;
-		var foo = new Foo();
-		foo.baz = true;
-		var target = { a: 1 };
-		var returned = assign(target, foo);
-		st.equal(returned, target, 'returned object is the same reference as the target object');
-		st.deepEqual(target, { baz: true, a: 1 }, 'returned object has only own properties from both');
-		st.end();
-	});
-
-	t.test('includes enumerable symbols, after keys', { skip: !hasSymbols }, function (st) {
-		var visited = [];
-		var obj = {};
-		Object.defineProperty(obj, 'a', { get: function () { visited.push('a'); return 42; }, enumerable: true });
-		var symbol = Symbol('enumerable');
-		Object.defineProperty(obj, symbol, { get: function () { visited.push(symbol); return Infinity; }, enumerable: true });
-		var nonEnumSymbol = Symbol('non-enumerable');
-		Object.defineProperty(obj, nonEnumSymbol, { get: function () { visited.push(nonEnumSymbol); return -Infinity; }, enumerable: false });
-		var target = assign({}, obj);
-		st.deepEqual(visited, ['a', symbol], 'key is visited first, then symbol');
-		st.equal(target.a, 42, 'target.a is 42');
-		st.equal(target[symbol], Infinity, 'target[symbol] is Infinity');
-		st.notEqual(target[nonEnumSymbol], -Infinity, 'target[nonEnumSymbol] is not -Infinity');
-		st.end();
-	});
-
-	t.test('does not fail when symbols are not present', function (st) {
-		var getSyms;
-		if (hasSymbols) {
-			getSyms = Object.getOwnPropertySymbols;
-			delete Object.getOwnPropertySymbols;
-		}
-
-		var visited = [];
-		var obj = {};
-		Object.defineProperty(obj, 'a', { get: function () { visited.push('a'); return 42; }, enumerable: true });
-		var keys = ['a'];
-		if (hasSymbols) {
-			var symbol = Symbol();
-			Object.defineProperty(obj, symbol, {
-				get: function () { visited.push(symbol); return Infinity; },
-				enumerable: true
-			});
-			keys.push(symbol);
-		}
-		var target = assign({}, obj);
-		st.deepEqual(visited, keys, 'assign visits expected keys');
-		st.equal(target.a, 42, 'target.a is 42');
-
-		if (hasSymbols) {
-			st.equal(target[symbol], Infinity);
-
-			Object.getOwnPropertySymbols = getSyms;
-		}
-		st.end();
-	});
-
-	t.test('preserves correct property enumeration order', function (st) {
-		var str = 'abcdefghijklmnopqrst';
-		var letters = {};
-		forEach(str.split(''), function (letter) {
-			letters[letter] = letter;
-		});
-
-		var n = 5;
-		st.comment('run the next test ' + n + ' times');
-		var object = assign({}, letters);
-		var actual = '';
-		for (var k in object) {
-			actual += k;
-		}
-		for (var i = 0; i < n; ++i) {
-			st.equal(actual, str, 'property enumeration order should be followed');
-		}
-		st.end();
-	});
-
-	t.test('checks enumerability and existence, in case of modification during [[Get]]', { skip: !Object.defineProperty }, function (st) {
-		var targetBvalue = {};
-		var targetCvalue = {};
-		var target = { b: targetBvalue, c: targetCvalue };
-		var source = {};
-		Object.defineProperty(source, 'a', {
-			get: function () {
-				delete this.b;
-				Object.defineProperty(this, 'c', { enumerable: false });
-			},
-			enumerable: true
-		});
-		var sourceBvalue = {};
-		var sourceCvalue = {};
-		source.b = sourceBvalue;
-		source.c = sourceCvalue;
-		var result = assign(target, source);
-		st.equal(result, target, 'sanity check: result is === target');
-		st.equal(result.b, targetBvalue, 'target key not overwritten by deleted source key');
-		st.equal(result.c, targetCvalue, 'target key not overwritten by non-enumerable source key');
-
-		st.end();
-	});
-};
diff --git a/js/node_modules/serialport/.eslintrc.js b/js/node_modules/serialport/.eslintrc.js
deleted file mode 100644
index a2e3a0aec85068c80998094c299f8f1e257daaae..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/.eslintrc.js
+++ /dev/null
@@ -1,29 +0,0 @@
-module.exports = {
-  env: {
-    node: true,
-    mocha: true,
-  },
-  parserOptions: {
-    sourceType: "script"
-  },
-  rules: {
-    "brace-style": [2, "1tbs", {"allowSingleLine": true} ],
-    "complexity": [2, 32],
-    "curly": 2,
-    "eqeqeq": 2,
-    "max-depth": 2,
-    "max-statements": [2, 41],
-    "new-cap": 2,
-    "no-caller": 2,
-    "no-cond-assign": 2,
-    "no-else-return": 2,
-    "no-undef": 2,
-    "no-unused-vars": [2, { "args": "after-used" }],
-    "no-use-before-define": 2,
-    "quotes": [2, "single", "avoid-escape"],
-    "semi": [2, "always", {"omitLastInOneLineBlock": true }],
-    "space-before-function-paren": [2, "never"],
-    "strict": 2,
-    "wrap-iife": [2, "inside"]
-  }
-};
diff --git a/js/node_modules/serialport/.npmignore b/js/node_modules/serialport/.npmignore
deleted file mode 100644
index fa9807725df6bb3757414826c7b4177695524df5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/.npmignore
+++ /dev/null
@@ -1,24 +0,0 @@
-.github
-.jshintrc
-.travis.yml
-appveyor.yml
-AUTHORS.md
-changelog.md
-CODE_OF_CONDUCT.md
-CONTRIBUTING.md
-examples/
-Gruntfile.js
-PUBLISHING.md
-test/
-UPGRADE_GUIDE.md
-
-# MIRRORED FROM .gitignore PLEASE MAINTAIN
-*.node
-.DS_Store
-build/
-node_modules
-npm-debug.log
-gyp-mac-tool
-.node_pre_gyprc
-/.idea
-.nyc_output
diff --git a/js/node_modules/serialport/LICENSE b/js/node_modules/serialport/LICENSE
deleted file mode 100644
index e3c325e10e5f6f100fa087b47a3f2fa7f9058c71..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright 2010, 2011, 2012 Christopher Williams. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
\ No newline at end of file
diff --git a/js/node_modules/serialport/README.md b/js/node_modules/serialport/README.md
deleted file mode 100644
index efea476374c3ec6a0a548d78bf1763c197f3faf9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/README.md
+++ /dev/null
@@ -1,576 +0,0 @@
-# Node Serialport
-
-[![npm](https://img.shields.io/npm/dm/serialport.svg?maxAge=2592000)](http://npmjs.com/package/serialport)
-[![Gitter chat](https://badges.gitter.im/EmergingTechnologyAdvisors/node-serialport.svg)](https://gitter.im/EmergingTechnologyAdvisors/node-serialport)
-[![Dependency Status](https://david-dm.org/EmergingTechnologyAdvisors/node-serialport.svg)](https://david-dm.org/EmergingTechnologyAdvisors/node-serialport)
-[![Build Status](https://travis-ci.org/EmergingTechnologyAdvisors/node-serialport.svg?branch=master)](https://travis-ci.org/EmergingTechnologyAdvisors/node-serialport)
-[![Build status](https://ci.appveyor.com/api/projects/status/u6xe3iao2crd7akn/branch/master?svg=true)](https://ci.appveyor.com/project/j5js/node-serialport/branch/master)
-[![Coverage Status](https://coveralls.io/repos/github/EmergingTechnologyAdvisors/node-serialport/badge.svg?branch=master)](https://coveralls.io/github/EmergingTechnologyAdvisors/node-serialport?branch=master)
-
-For support you can open a [github issue](https://github.com/EmergingTechnologyAdvisors/node-serialport/issues/new), for discussions, designs, and clarifications, we recommend you join our [Gitter Chat room](https://gitter.im/EmergingTechnologyAdvisors/node-serialport). We have two related projects [Browser Serialport](https://github.com/garrows/browser-serialport) "just like Node Serialport but for browser apps", and [Serialport Test Piliot](https://github.com/j5js/serialport-test-pilot) which helps us test serialport.
-
-If you'd like to contribute please take a look at [contribution guide](CONTRIBUTING.md) and [code of conduct](CODE_OF_CONDUCT.md). You also might want to see the [road map](https://github.com/EmergingTechnologyAdvisors/node-serialport/issues/746). We also have issues tagged ["good first PR"](https://github.com/EmergingTechnologyAdvisors/node-serialport/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+pr%22) if you'd like to start somewhere specific. We'll do our best to support you until your PR is merged.
-
-***
-
-# Which version of Serialport would you like documentation for?
-
-You're reading the README for the master branch of serialport. You probably want to be looking at the README of our latest release. See our [change log](changelog.md) for what's new and our [upgrade guide](UPGRADE_GUIDE.md) for a walk through on what to look out for between major versions.
-
- - [`serialport@4.0.1` docs are here](https://github.com/EmergingTechnologyAdvisors/node-serialport/blob/4.0.1/README.md) it is the latest `4.x` releases.
- - [`serialport@3.1.2` docs are here](https://github.com/EmergingTechnologyAdvisors/node-serialport/blob/3.1.2/README.md) it is the latest `3.x` releases.
- - [`serialport@2.1.2` docs are here](https://github.com/EmergingTechnologyAdvisors/node-serialport/blob/2.1.2/README.md) it was the last `2.x` release
- - [`serialport@1.7.4` docs are here](https://github.com/EmergingTechnologyAdvisors/node-serialport/blob/v1.7.4/README.md) it was the last `1.x` release
-
-***
-
-Imagine a world where you can write JavaScript to control blenders, lights, security systems, or even robots. Yes, I said robots. That world is here and now with node serialport. It provides a very simple interface to the low level serial port code necessary to program [Arduino](http://www.arduino.cc/) chipsets, [X10](http://www.smarthome.com/manuals/protocol.txt) wireless communications, or even the rising [Z-Wave](http://www.z-wave.com/modules/ZwaveStart/) and [Zigbee](http://www.zigbee.org/) standards. The physical world is your oyster with this goodie. For a full break down of why we made this, please read [NodeBots - The Rise of JS Robotics](http://www.voodootikigod.com/nodebots-the-rise-of-js-robotics).
-
-***
-
-For getting started with node-serialport, we recommend you begin with the following articles:
-* [Johnny-Five](http://johnny-five.io/#hello-world) - The Johnny-Five Robotics and IoT platform's 6 line "Hello World" (awesome).
-* [Arduino Node Security Sensor Hacking](http://nexxylove.tumblr.com/post/20159263403/arduino-node-security-sensor-hacking) - A great all around "how do I use this" article.
-* [NodeBots - The Rise of JS Robotics](http://www.voodootikigod.com/nodebots-the-rise-of-js-robotics) - A survey article of why one would want to program robots in JS and how this all started.
-
-***
-
-* [Platform Support](#platform-support)
-* [Installation](#installation-instructions)
-* [Installation Special Cases](#installation-special-cases)
-  * [Windows](#windows)
-  * [Mac OS X](#mac-os-x)
-  * [Ubuntu/Debian Linux](#ubuntudebian-linux)
-  * [Alpine Linux](#alpine-linux)
-  * [Raspberry Pi Linux](#raspberry-pi-linux)
-  * [Illegal Instruction](#illegal-instruction)
-* [Usage](#usage)
-  * [Opening a Port](#opening-a-port)
-  * [Listing Ports](#listing-ports)
-  * [Parsers](#parsers)
-* [Methods](#methods)
-  * [SerialPort](#serialport-path-options-opencallback)
-  * [close()](#close-callback)
-  * [drain()](#drain-callback)
-  * [flush()](#flush-callback)
-  * [isOpen()](#isopen)
-  * [open()](#open-callback)
-  * [pause()](#pause-)
-  * [resume()](#resume-)
-  * [set()](#set-options-callback)
-  * [update()](#update-options-callback)
-  * [write()](#write-buffer-callback)
-* [Events](#events)
-* [Command Line Tools](#command-line-tools)
-  * [Serial Port List](#serial-port-list)
-  * [Serial Port Terminal](#serial-port-terminal)
-
-***
-
-## Platform Support
-`serialport` supports and tests against the following platforms, architectures and node versions.
-
-| Platform / Arch | Node v0.10.x | Node v0.12.x | Node v4.x | Node v5.x | Node v6.x |
-|       ---       | --- | --- | --- | --- | --- |
-| Linux / ia32    |  ☑  |  ☑  |  ☑  |  ☑  |  ☑  |
-| Linux / x64     |  ☑  |  ☑  |  ☑  |  ☑  |  ☑  |
-| Linux / ARM v6¹ |  ☐  |  ☐  |  ☐  |  ☐  |  ☐  |
-| Linux / ARM v7¹ |  ☐  |  ☐  |  ☐  |  ☐  |  ☐  |
-| Linux / ARM v8¹ |  ☐  |  ☐  |  ☐  |  ☐  |  ☐  |
-| Linux / MIPSel¹ |  ☐  |  ☐  |  ☐  |  ☐  |  ☐  |
-| Linux / PPC64¹  |  ☐  |  ☐  |  ☐  |  ☐  |  ☐  |
-| Windows² / x86  |  ☑  |  ☑  |  ☑  |  ☑  |  ☑  |
-| Windows² / x64  |  ☑  |  ☑  |  ☑  |  ☑  |  ☑  |
-| OSX³ / x64      |  ☑  |  ☑  |  ☑  |  ☑  |  ☑  |
-
-¹ ARM, MIPSel and PPC64¹ platforms are known to work but are not currently part of our test or build matrix. [#846](https://github.com/EmergingTechnologyAdvisors/node-serialport/issues/846) ARM v4 and v5 was dropped from NodeJS after Node v0.10.
-
-² Windows 7, 8, 10, and 10 IoT are supported but only Windows Server 2012 R2 is tested by our CI.
-
-³ OSX 10.4 Tiger and above are supported but only 10.9.5 Mavericks with Xcode 6.1 is tested in our CI.
-
-## Installation Instructions
-
-For most "standard" use cases (node v4.x on mac, linux, windows on a x86 or x64 processor), node-serialport will install nice and easy with a simple
-
-```
-npm install serialport
-```
-
-### Installation Special Cases
-
-We are using [node-pre-gyp](https://github.com/mapbox/node-pre-gyp) to compile and post binaries of the library for most common use cases (linux, mac, windows on standard processor platforms). If you are on a special case, node-serialport will work, but it will compile the binary when you install.
-
-This assumes you have everything on your system necessary to compile ANY native module for Node.js. This may not be the case, though, so please ensure the following are true for your system before filing an issue about "Does not install". For all operatings systems, please ensure you have Python 2.x installed AND not 3.0, node-gyp (what we use to compile) requires Python 2.x.
-
-#### Windows
-
- * Windows 7, Windows 8.1, and Windows 10 are supported.
- * Might just download and install with no extra steps. If the downloaded binary fails you'll have to build it with the following steps.
- * Install [Visual Studio Express 2013 for Windows Desktop](http://www.microsoft.com/visualstudio/eng/2013-downloads#d-2013-express).
- * If you are hacking on an Arduino, be sure to install [the drivers](http://arduino.cc/en/Guide/windows#toc4).
- * Install [node.js](http://nodejs.org/) matching the bitness (32 or 64) of your operating system.
- * Install [Python 2.7.6](http://www.python.org/download/releases/2.7.6/) matching the bitness of your operating system.  For any questions, please refer to their [FAQ](http://docs.python.org/2/faq/windows.html). Default settings are perfect.
- * Open the 'Visual Studio Command Prompt' and add Python to the path.
-
-#### Mac OS X
-
-Ensure that you have at a minimum the xCode Command Line Tools installed appropriate for your system configuration. If you recently upgraded the OS, it probably removed your installation of Command Line Tools, please verify before submitting a ticket. To compile `node-serialport` with Node.js 4.x+, you will need to use g++ v4.8 or higher.
-
-#### Ubuntu/Debian Linux
-
-The best way to install any version of NodeJS is to use the [NodeSource Node.js Binary Distributions](https://github.com/nodesource/distributions#installation-instructions). Older versions of Ubuntu install nodejs with the wrong version and binary name. If you node binary is `nodejs` not `node` or if your node version is [`v0.10.29`](https://github.com/fivdi/onoff/wiki/Node.js-v0.10.29-and-native-addons-on-the-Raspberry-Pi) then you should follow these instructions.
-
-The package `build-essential` is necessary to compile `serialport`. If there's a binary for your platform you won't need it. Keep rocking!
-
-
-```
-# Using Ubuntu and node 6
-curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
-sudo apt-get install -y nodejs
-
-# Using Debian and node 6, as root
-curl -sL https://deb.nodesource.com/setup_6.x | bash -
-apt-get install -y nodejs
-```
-
-#### Alpine Linux
-
-[Alpine](http://www.alpinelinux.org/) is a (very) small distro, but it uses the musl standard library instead of glibc (that most other Linux distros use), so it requires compilation.
-
-```
-# If you don't have node/npm already, add that first
-sudo apk add --no-cache nodejs
-
-# Add the necessary build and runtime dependencies
-sudo apk add --no-cache make gcc g++ python linux-headers udev
-
-# Then we can install serialport, forcing it to compile
-npm install serialport --build-from-source=serialport
-```
-
-#### Raspberry Pi Linux
-
-Follow the instructions for [setting up a Raspberry pi for use with Johnny-Five and Raspi IO](https://github.com/nebrius/raspi-io/wiki/Getting-a-Raspberry-Pi-ready-for-NodeBots). These projects use Node Serialport under the hood.
-
-| Revision       |      CPU              | Arm Version |
-|   ----         |      ---              |     ---     |
-| A, A+, B, B+   | 32-bit ARM1176JZF-S   |    ARMv6    |
-| Compute Module | 32-bit ARM1176JZF-S   |    ARMv6    |
-| Zero           | 32-bit ARM1176JZF-S   |    ARMv6    |
-| B2             | 32-bit ARM Cortex-A7  |    ARMv7    |
-| B3             | 32-bit ARM Cortex-A53 |    ARMv8    |
-
-
-#### Illegal Instruction
-
-The pre-compiled binaries assume a fully capable chip. The Galileo 2 for example lacks a few instruction sets from the `ia32` architecture. A few other platforms have similar issues. So if you get `Illegal Instruction` when trying to run serialport you'll need to rebuild the serialport binary by asking npm to rebuild it.
-
-```bash
-# Will ask npm to build serialport during install time
-npm install serialport --build-from-source
-
-# If you have a package that depends on serialport you can ask npm to rebuild it specifically.
-npm rebuild serialport --build-from-source
-
-# Or leave out the package name to rebuild everything.
-npm rebuild --build-from-source
-```
-
-## Usage
-
-Opening a serial port:
-
-```js
-var SerialPort = require("serialport");
-var port = new SerialPort("/dev/tty-usbserial1", {
-  baudRate: 57600
-});
-```
-
-When opening a serial port, you can specify (in this order).
-
-1. Path to Serial Port - required.
-1. Options - optional and described below.
-
-### Opening a Port
-
-Constructing a `SerialPort` object will open a port on `nextTick`. You can bind events while the port is opening but you must wait until it is open to `write()` to it. (Most port functions require an open port.) You can call code when a port is opened in three ways.
-
- - The `open` event is always emitted when the port is opened
- - The constructor's openCallback is passed to `.open()` when the `autoOpen` option hasn't been disabled, if you have disabled it the callback is ignored.
- - The `.open()` function takes a callback that is called after the port is opened. This can be used if you disabled the `autoOpen` option or have previously closed an open port.
-
-
-```js
-var SerialPort = require('serialport');
-var port = new SerialPort('/dev/tty-usbserial1');
-
-port.on('open', function() {
-  port.write('main screen turn on', function(err) {
-    if (err) {
-      return console.log('Error on write: ', err.message);
-    }
-    console.log('message written');
-  });
-});
-
-// open errors will be emitted as an error event
-port.on('error', function(err) {
-  console.log('Error: ', err.message);
-})
-```
-
-This could be moved to the constructor's callback.
-```js
-var SerialPort = require('serialport');
-var port = new SerialPort('/dev/tty-usbserial1', function (err) {
-  if (err) {
-    return console.log('Error: ', err.message);
-  }
-  port.write('main screen turn on', function(err) {
-    if (err) {
-      return console.log('Error on write: ', err.message);
-    }
-    console.log('message written');
-  });
-});
-```
-
-When disabling the `autoOpen` option you'll need to open the port on your own.
-
-```js
-var SerialPort = require('serialport');
-var port = new SerialPort('/dev/tty-usbserial1', { autoOpen: false });
-
-port.open(function (err) {
-  if (err) {
-    return console.log('Error opening port: ', err.message);
-  }
-
-  // write errors will be emitted on the port since there is no callback to write
-  port.write('main screen turn on');
-});
-
-// the open event will always be emitted
-port.on('open', function() {
-  // open logic
-});
-```
-
-### Listing Ports
-
-`.list(callback)`
-
-Retrieves a list of available serial ports with metadata.
-
-* `callback` is a required function that looks should look like: `function (err, ports) { ... }`. `ports` will be an array of objects with port info. Only the `comName` is guaranteed, all the other fields undefined if unavailable. The `comName` is either the path or identifier (eg `COM1`) used to open the serialport.
-
-```js
-// example port information
-{
-  comName: '/dev/cu.usbmodem1421',
-  manufacturer: 'Arduino (www.arduino.cc)',
-  serialNumber: '757533138333964011C1',
-  pnpId: undefined,
-  locationId: '0x14200000',
-  vendorId: '0x2341',
-  productId: '0x0043'
-}
-
-```
-
-```js
-var SerialPort = require('serialport');
-SerialPort.list(function (err, ports) {
-  ports.forEach(function(port) {
-    console.log(port.comName);
-    console.log(port.pnpId);
-    console.log(port.manufacturer);
-  });
-});
-```
-
-### Parsers
-
-Out of the box, node-serialport provides four parsers: one that simply emits the raw buffer as a data event, one that emits a data event when a specfic byte sequence is received, one that emits a data event every 'length' bytes, and one which provides familiar "readline" style parsing.
-
-To use the readline parser, you must provide a delimiter as such:
-
-```js
-var SerialPort = require('serialport');
-
-var port = new SerialPort('/dev/tty-usbserial1', {
-  parser: SerialPort.parsers.readline('\n')
-});
-```
-
-To use the raw parser don't specify any parser, however if you really want to you can:
-
-```js
-var SerialPort = require('serialport');
-
-var port = new SerialPort('/dev/tty-usbserial1', {
-  parser: SerialPort.parsers.raw
-});
-```
-
-Note that the raw parser does not guarantee that all data it receives will come in a single event.
-
-To use the byte sequence parser, you must provide a delimiter as an array of bytes:
-```js
-var SerialPort = require('serialport');
-
-var port = new SerialPort('/dev/tty-usbserial1', {
-  parser: SerialPort.parsers.byteDelimiter([10,13])
-});
-```
-
-To use the byte length parser, you must provide a delimiter as a length in bytes:
-```js
-var SerialPort = require('serialport');
-
-var port = new SerialPort('/dev/tty-usbserial1', {
-  parser: SerialPort.parsers.byteLength(5)
-});
-```
-
-You can get updates of new data from the Serial Port as follows:
-
-```js
-port.on('data', function (data) {
-  console.log('Data: ' + data);
-});
-```
-
-You can write to the serial port by sending a string or buffer to the write method as follows:
-
-```js
-port.write('Hi Mom!');
-port.write(new Buffer('Hi Mom!'));
-```
-
-Enjoy and do cool things with this code.
-
-## Methods
-
-### SerialPort (path, options, openCallback)
-
-Create a new serial port object for the `path`. In the case of invalid arguments or invalid options when constructing a new SerialPort it will throw an error. The port will open automatically by default which is the equivalent of calling `port.open(openCallback)` in the next tick. This can be disabled by setting the option `autoOpen` to false.
-
-**_path_**
-
-The system path of the serial port to open. For example, `/dev/tty` on Mac/Linux or `COM1` on Windows.
-
-**_options (optional)_**
-
-Port configuration options.
-
-* `autoOpen` Automatically opens the port on `nextTick`, defaults to `true`.
-* `lock` Prevent other processes from opening the port, defaults to `true`. `false` is not currently supported on windows.
-* `baudRate` Baud Rate, defaults to 9600. Should be one of: 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1800, 1200, 600, 300, 200, 150, 134, 110, 75, or 50. Custom rates as allowed by hardware is supported. Windows doesn't support custom baud rates.
-* `dataBits` Data Bits, defaults to 8. Must be one of: 8, 7, 6, or 5.
-* `stopBits` Stop Bits, defaults to 1. Must be one of: 1 or 2.
-* `parity` Parity, defaults to 'none'. Must be one of: 'none', 'even', 'mark', 'odd', 'space'
-* `rtscts` flow control, defaults to false
-* `xon` flow control, defaults to false
-* `xoff` flow control, defaults to false
-* `xany` flow control, defaults to false
-* `bufferSize` Size of read buffer, defaults to 65536. Must be an integer value.
-* `parser` The parser engine to use with read data, defaults to rawPacket strategy which just emits the raw buffer as a "data" event. Can be any function that accepts EventEmitter as first parameter and the raw buffer as the second parameter.
-* `platformOptions` - sets platform specific options, see below.
-
-#### Unix Platform Options
-
-These properties are ignored for windows. An object with the following properties:
-
-* `vmin` (default: 1) - see [`man termios`](http://linux.die.net/man/3/termios)
-* `vtime` (default: 0) - see [`man termios`](http://linux.die.net/man/3/termios)
-
-**_`openCallback` (optional)_**
-
-This function is passed to `.open()` and called when a connection has been opened. The callback should be a function that looks like: `function (error) { ... }`
-
-**Note:** The callback will NOT be called if autoOpen is set to false as the open will not be performed.
-
-### .open (callback)
-
-Opens a connection to the given serial port.
-
-**_callback (optional)_**
-
-Called when a connection has been opened. The callback should be a function that looks like: `function (error) { ... }`
-
-### .isOpen()
-
-Returns `true` if the port is open.
-
-### .write (buffer, callback)
-
-Writes data to the given serial port.
-
-**_buffer_**
-
-The `buffer` parameter accepts a [`Buffer` ](http://nodejs.org/api/buffer.html) object, or a type that is accepted by the `Buffer` constructor (ex. an array of bytes or a string).
-
-**_callback (optional)_**
-
-Called once the write operation returns. The callback should be a function that looks like: `function (error) { ... }`
-
-**Note:** The write operation is non-blocking. When it returns, data may still have not actually been written to the serial port. See `drain()`.
-
-**Note:** Some devices like the Arduino reset when you open a connection to them. In these cases if you immediately write to the device they wont be ready to receive the data. This is often worked around by having the Arduino send a "ready" byte that your node program waits for before writing. You can also often get away with waiting around 400ms.
-
-### .pause ()
-
-Pauses an open connection.
-
-### .resume ()
-
-Resumes a paused connection.
-
-### .flush (callback)
-
-Flushes data received but not read. See [`tcflush()`](http://linux.die.net/man/3/tcflush) for Mac/Linux and [`FlushFileBuffers`](http://msdn.microsoft.com/en-us/library/windows/desktop/aa364439) for Windows.
-
-**_callback (optional)_**
-
-Called once the flush operation returns. The callback should be a function that looks like: `function (error) { ... }`
-
-### .drain (callback)
-
-Waits until all output data has been transmitted to the serial port. See [`tcdrain()`](http://linux.die.net/man/3/tcdrain) or [FlushFileBuffers()](https://msdn.microsoft.com/en-us/library/windows/desktop/aa364439(v=vs.85).aspx) for more information.
-
-**_callback (optional)_**
-
-Called once the drain operation returns. The callback should be a function that looks like: `function (error) { ... }`
-
-**Example**
-
-Writes `data` and waits until it has finish transmitting to the target serial port before calling the callback.
-
-```
-function writeAndDrain (data, callback) {
-  sp.write(data, function () {
-    sp.drain(callback);
-  });
-}
-```
-
-### .close (callback)
-
-Closes an open connection.
-
-**_callback (optional)_**
-
-Called once a connection is closed. The callback should be a function that looks like: `function (error) { ... }` If called without an callback and there is an error, an error event will be emitted.
-
-### .set (options, callback)
-
-Sets flags on an open port. Uses [`SetCommMask`](https://msdn.microsoft.com/en-us/library/windows/desktop/aa363257(v=vs.85).aspx) for windows and [`ioctl`](http://linux.die.net/man/4/tty_ioctl) for mac and linux.
-
-**_options (optional)_**
-
-All options are operating system default when the port is opened. Every flag is set on each call to the provided or default values. If options isn't provided default options will be used.
-
- * `brk` optional boolean, defaults to false
- * `cts` optional boolean, defaults to false
- * `dsr` optional boolean, defaults to false
- * `dtr` optional boolean, defaults to true
- * `rts` optional boolean, defaults to true
-
-**_callback (optional)_**
-
-`function(err) {}`
-
-Called once the port's flags have been set. If `.set` is called without an callback and there is an error, an error event will be emitted.
-
-### .update (options, callback)
-
-Changes the baudrate for an open port. Throws if you provide a bad argument. Emits an error or calls the callback if the baud rate isn't supported.
-
-**_options_**
-
- * `baudRate` Baud Rate should be one of: 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1800, 1200, 600, 300, 200, 150, 134, 110, 75, or 50. Custom rates as allowed by hardware is supported.
-
-**_callback (optional)_**
-
-`callback: function(err)`
-
-Called once the port's baud rate has been changed. If `.update` is called without an callback and there is an error, an error event will be emitted.
-
-## Events
-
-### .on('open', callback)
-Callback is called with no arguments when the port is opened and ready for writing. This happens if you have the constructor open immediately (which opens in the next tick) or if you open the port manually with `open()`. See [Useage/Open Event](#open-event) for more information.
-
-### .on('data', callback)
-Callback is called with data depending on your chosen parser. The default `raw` parser will have a `Buffer` object with a varying amount of data in it. The `readLine` parser will provide a string of your line. See the [parsers](#parsers) section for more information
-
-### .on('close', callback)
-Callback is called with no arguments when the port is closed. In the event of an error, an error event will be triggered
-
-### .on('error', callback)
-Callback is called with an error object whenever there is an error.
-
-### .on('disconnect', callback)
-Callback is called with an error object. This will always happen before a `close` event if a disconnection is detected.
-
-## Command Line Tools
-If you install `serialport` globally. (eg, `npm install -g serialport`) you'll receive two command line tools.
-
-### Serial Port List
-`serialport-list` will list all available serial ports in different formats.
-
-```bash
-$ serialport-list -h
-
-  Usage: serialport-list [options]
-
-  List available serial ports
-
-  Options:
-
-    -h, --help           output usage information
-    -V, --version        output the version number
-    -f, --format <type>  Format the output as text, json, or jsonline. default: text
-
-
-$ serialport-list
-/dev/cu.Bluetooth-Incoming-Port
-/dev/cu.usbmodem1421    Arduino (www.arduino.cc)
-
-$ serialport-list -f json
-[{"comName":"/dev/cu.Bluetooth-Incoming-Port"},{"comName":"/dev/cu.usbmodem1421","manufacturer":"Arduino (www.arduino.cc)","serialNumber":"752303138333518011C1","locationId":"0x14200000","vendorId":"0x2341","productId":"0x0043"}]
-
-$ serialport-list -f jsonline
-{"comName":"/dev/cu.Bluetooth-Incoming-Port"}
-{"comName":"/dev/cu.usbmodem1421","manufacturer":"Arduino (www.arduino.cc)","serialNumber":"752303138333518011C1","locationId":"0x14200000","vendorId":"0x2341","productId":"0x0043"}
-```
-
-### Serial Port Terminal
-`serialport-term provides a basic terminal interface for communicating over a serial port. `ctrl+c` will exit.
-
-```bash
-$ serialport-term -h
-
-  Usage: serialport-term -p <port> [options]
-
-  A basic terminal interface for communicating over a serial port. Pressing ctrl+c exits.
-
-  Options:
-
-    -h, --help                     output usage information
-    -V, --version                  output the version number
-    -l --list                      List available ports then exit
-    -p, --port, --portname <port>  Path or Name of serial port
-    -b, --baud <baudrate>          Baud rate default: 9600
-    --databits <databits>          Data bits default: 8
-    --parity <parity>              Parity default: none
-    --stopbits <bits>              Stop bits default: 1
-    --echo --localecho             Print characters as you type them.
-
-$ serialport-term -l
-/dev/cu.Bluetooth-Incoming-Port
-/dev/cu.usbmodem1421    Arduino (www.arduino.cc)
-```
diff --git a/js/node_modules/serialport/bin/serialport-list.js b/js/node_modules/serialport/bin/serialport-list.js
deleted file mode 100755
index 070f68ad412ebd398580496bf47abe92cabf53e5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/bin/serialport-list.js
+++ /dev/null
@@ -1,43 +0,0 @@
-#!/usr/bin/env node
-'use strict';
-
-var serialport = require('../');
-var version = require('../package.json').version;
-var args = require('commander');
-
-args
-  .version(version)
-  .description('List available serial ports')
-  .option('-f, --format <type>', 'Format the output as text, json, or jsonline. default: text', /^(text|json|jsonline)$/i, 'text')
-  .parse(process.argv);
-
-var formatters = {
-  text: function(err, ports) {
-    if (err) {
-      console.error(err);
-      process.exit(1);
-    }
-    ports.forEach(function(port) {
-      console.log(port.comName + '\t' + (port.pnpId || '') + '\t' + (port.manufacturer || ''));
-    });
-  },
-  json: function(err, ports) {
-    if (err) {
-      console.error(JSON.stringify(err));
-      process.exit(1);
-    }
-    console.log(JSON.stringify(ports));
-  },
-  jsonline: function(err, ports) {
-    if (err) {
-      console.error(JSON.stringify(err));
-      process.exit(1);
-    }
-    ports.forEach(function(port) {
-      console.log(JSON.stringify(port));
-    });
-  }
-};
-
-serialport.list(formatters[args.format]);
-
diff --git a/js/node_modules/serialport/bin/serialport-terminal.js b/js/node_modules/serialport/bin/serialport-terminal.js
deleted file mode 100755
index 312b3b424a39d2fdd933391cfe96f5b57a68c568..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/bin/serialport-terminal.js
+++ /dev/null
@@ -1,78 +0,0 @@
-#!/usr/bin/env node
-'use strict';
-
-var SerialPort = require('../');
-var version = require('../package.json').version;
-var args = require('commander');
-
-args
-  .version(version)
-  .usage('-p <port> [options]')
-  .description('A basic terminal interface for communicating over a serial port. Pressing ctrl+c exits.')
-  .option('-l --list', 'List available ports then exit')
-  // TODO make the port not a flag as it's always required
-  .option('-p, --port, --portname <port>', 'Path or Name of serial port')
-  .option('-b, --baud <baudrate>', 'Baud rate default: 9600', parseInt, 9600)
-  .option('--databits <databits>', 'Data bits default: 8', parseInt, 8)
-  .option('--parity <parity>', 'Parity default: none', 'none')
-  .option('--stopbits <bits>', 'Stop bits default: 1', parseInt, 1)
-  // TODO make this on by default
-  .option('--echo --localecho', 'Print characters as you type them.')
-  .parse(process.argv);
-
-function listPorts() {
-  SerialPort.list(function(err, ports) {
-    if (err) {
-      console.error('Error listing ports', err);
-    } else {
-      ports.forEach(function(port) {
-        console.log(port.comName + '\t' + (port.pnpId || '') + '\t' + (port.manufacturer || ''));
-      });
-    }
-  });
-};
-
-if (args.list) {
-  return listPorts();
-}
-
-if (!args.port) {
-  args.outputHelp();
-  args.missingArgument('port');
-  process.exit(-1);
-}
-
-var openOptions = {
-  baudRate: args.baud,
-  dataBits: args.databits,
-  parity: args.parity,
-  stopBits: args.stopbits
-};
-
-var port = new SerialPort(args.port, openOptions);
-
-process.stdin.resume();
-process.stdin.setRawMode(true);
-process.stdin.on('data', function(s) {
-  if (s[0] === 0x03) {
-    port.close();
-    process.exit(0);
-  }
-  if (args.localecho) {
-    if (s[0] === 0x0d) {
-      process.stdout.write('\n');
-    } else {
-      process.stdout.write(s);
-    }
-  }
-  port.write(s);
-});
-
-port.on('data', function(data) {
-  process.stdout.write(data.toString());
-});
-
-port.on('error', function(err) {
-  console.log('Error', err);
-  process.exit(1);
-});
diff --git a/js/node_modules/serialport/binding.gyp b/js/node_modules/serialport/binding.gyp
deleted file mode 100644
index d5bc26daacb8a6a24a1cd73a05fc90df4786a53e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/binding.gyp
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-  'targets': [
-    {
-      'target_name': 'serialport',
-      'sources': [
-        'src/serialport.cpp',
-      ],
-      'include_dirs': [
-        '<!(node -e "require(\'nan\')")'
-      ],
-      'conditions': [
-        ['OS=="win"',
-          {
-            'sources': [
-              'src/serialport_win.cpp',
-              'src/win/disphelper.c',
-              'src/win/enumser.cpp',
-            ],
-            'msvs_settings': {
-              'VCCLCompilerTool': {
-                'ExceptionHandling': '2',
-                'DisableSpecificWarnings': [ '4530', '4506' ],
-              },
-            },
-          },
-        ],
-        ['OS=="mac"',
-          {
-            'sources': [
-              'src/serialport_unix.cpp',
-              'src/serialport_poller.cpp',
-            ],
-            'xcode_settings': {
-              'OTHER_LDFLAGS': [
-                '-framework CoreFoundation -framework IOKit'
-              ]
-            }
-          }
-        ],
-        ['OS!="win"',
-          {
-            'sources': [
-              'src/serialport_unix.cpp',
-              'src/serialport_poller.cpp',
-            ],
-          }
-        ],
-      ],
-    }
-  ],
-}
diff --git a/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport.node.d b/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport.node.d
deleted file mode 100755
index bb7eaad24d4bd72537e8481589aac99446068f41..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport.node.d
+++ /dev/null
@@ -1 +0,0 @@
-cmd_Release/obj.target/serialport.node := g++-4.8 -shared -pthread -rdynamic -m64  -Wl,-soname=serialport.node -o Release/obj.target/serialport.node -Wl,--start-group Release/obj.target/serialport/src/serialport.o Release/obj.target/serialport/src/serialport_unix.o Release/obj.target/serialport/src/serialport_poller.o -Wl,--end-group 
diff --git a/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport/src/serialport.o.d b/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport/src/serialport.o.d
deleted file mode 100755
index 8d97bbc8f8ff32e91086b403fd5cfe37c2f8d0ae..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport/src/serialport.o.d
+++ /dev/null
@@ -1,60 +0,0 @@
-cmd_Release/obj.target/serialport/src/serialport.o := g++-4.8 '-DNODE_GYP_MODULE_NAME=serialport' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/home/travis/.node-gyp/4.4.7/include/node -I/home/travis/.node-gyp/4.4.7/src -I/home/travis/.node-gyp/4.4.7/deps/uv/include -I/home/travis/.node-gyp/4.4.7/deps/v8/include -I../node_modules/nan  -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3 -ffunction-sections -fdata-sections -fno-omit-frame-pointer -fno-rtti -fno-exceptions -std=gnu++0x -MMD -MF ./Release/.deps/Release/obj.target/serialport/src/serialport.o.d.raw   -c -o Release/obj.target/serialport/src/serialport.o ../src/serialport.cpp
-Release/obj.target/serialport/src/serialport.o: ../src/serialport.cpp \
- ../src/./serialport.h ../node_modules/nan/nan.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_version.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-errno.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-version.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-unix.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-threadpool.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-linux.h \
- /home/travis/.node-gyp/4.4.7/include/node/node.h \
- /home/travis/.node-gyp/4.4.7/include/node/v8.h \
- /home/travis/.node-gyp/4.4.7/include/node/v8-version.h \
- /home/travis/.node-gyp/4.4.7/include/node/v8config.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_version.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_buffer.h \
- /home/travis/.node-gyp/4.4.7/include/node/node.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_object_wrap.h \
- ../node_modules/nan/nan_callbacks.h \
- ../node_modules/nan/nan_callbacks_12_inl.h \
- ../node_modules/nan/nan_maybe_43_inl.h \
- ../node_modules/nan/nan_converters.h \
- ../node_modules/nan/nan_converters_43_inl.h \
- ../node_modules/nan/nan_new.h \
- ../node_modules/nan/nan_implementation_12_inl.h \
- ../node_modules/nan/nan_persistent_12_inl.h \
- ../node_modules/nan/nan_weak.h ../node_modules/nan/nan_object_wrap.h \
- ../node_modules/nan/nan_typedarray_contents.h \
- ../src/./serialport_poller.h ../src/././serialport.h
-../src/serialport.cpp:
-../src/./serialport.h:
-../node_modules/nan/nan.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_version.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-errno.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-version.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-unix.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-threadpool.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-linux.h:
-/home/travis/.node-gyp/4.4.7/include/node/node.h:
-/home/travis/.node-gyp/4.4.7/include/node/v8.h:
-/home/travis/.node-gyp/4.4.7/include/node/v8-version.h:
-/home/travis/.node-gyp/4.4.7/include/node/v8config.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_version.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_buffer.h:
-/home/travis/.node-gyp/4.4.7/include/node/node.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_object_wrap.h:
-../node_modules/nan/nan_callbacks.h:
-../node_modules/nan/nan_callbacks_12_inl.h:
-../node_modules/nan/nan_maybe_43_inl.h:
-../node_modules/nan/nan_converters.h:
-../node_modules/nan/nan_converters_43_inl.h:
-../node_modules/nan/nan_new.h:
-../node_modules/nan/nan_implementation_12_inl.h:
-../node_modules/nan/nan_persistent_12_inl.h:
-../node_modules/nan/nan_weak.h:
-../node_modules/nan/nan_object_wrap.h:
-../node_modules/nan/nan_typedarray_contents.h:
-../src/./serialport_poller.h:
-../src/././serialport.h:
diff --git a/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport/src/serialport_poller.o.d b/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport/src/serialport_poller.o.d
deleted file mode 100755
index 3b4bae33f6ec97900df0afbd2dbae70a24f8a94c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport/src/serialport_poller.o.d
+++ /dev/null
@@ -1,59 +0,0 @@
-cmd_Release/obj.target/serialport/src/serialport_poller.o := g++-4.8 '-DNODE_GYP_MODULE_NAME=serialport' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/home/travis/.node-gyp/4.4.7/include/node -I/home/travis/.node-gyp/4.4.7/src -I/home/travis/.node-gyp/4.4.7/deps/uv/include -I/home/travis/.node-gyp/4.4.7/deps/v8/include -I../node_modules/nan  -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3 -ffunction-sections -fdata-sections -fno-omit-frame-pointer -fno-rtti -fno-exceptions -std=gnu++0x -MMD -MF ./Release/.deps/Release/obj.target/serialport/src/serialport_poller.o.d.raw   -c -o Release/obj.target/serialport/src/serialport_poller.o ../src/serialport_poller.cpp
-Release/obj.target/serialport/src/serialport_poller.o: \
- ../src/serialport_poller.cpp ../node_modules/nan/nan.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_version.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-errno.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-version.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-unix.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-threadpool.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-linux.h \
- /home/travis/.node-gyp/4.4.7/include/node/node.h \
- /home/travis/.node-gyp/4.4.7/include/node/v8.h \
- /home/travis/.node-gyp/4.4.7/include/node/v8-version.h \
- /home/travis/.node-gyp/4.4.7/include/node/v8config.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_version.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_buffer.h \
- /home/travis/.node-gyp/4.4.7/include/node/node.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_object_wrap.h \
- ../node_modules/nan/nan_callbacks.h \
- ../node_modules/nan/nan_callbacks_12_inl.h \
- ../node_modules/nan/nan_maybe_43_inl.h \
- ../node_modules/nan/nan_converters.h \
- ../node_modules/nan/nan_converters_43_inl.h \
- ../node_modules/nan/nan_new.h \
- ../node_modules/nan/nan_implementation_12_inl.h \
- ../node_modules/nan/nan_persistent_12_inl.h \
- ../node_modules/nan/nan_weak.h ../node_modules/nan/nan_object_wrap.h \
- ../node_modules/nan/nan_typedarray_contents.h \
- ../src/./serialport_poller.h ../src/././serialport.h
-../src/serialport_poller.cpp:
-../node_modules/nan/nan.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_version.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-errno.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-version.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-unix.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-threadpool.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-linux.h:
-/home/travis/.node-gyp/4.4.7/include/node/node.h:
-/home/travis/.node-gyp/4.4.7/include/node/v8.h:
-/home/travis/.node-gyp/4.4.7/include/node/v8-version.h:
-/home/travis/.node-gyp/4.4.7/include/node/v8config.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_version.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_buffer.h:
-/home/travis/.node-gyp/4.4.7/include/node/node.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_object_wrap.h:
-../node_modules/nan/nan_callbacks.h:
-../node_modules/nan/nan_callbacks_12_inl.h:
-../node_modules/nan/nan_maybe_43_inl.h:
-../node_modules/nan/nan_converters.h:
-../node_modules/nan/nan_converters_43_inl.h:
-../node_modules/nan/nan_new.h:
-../node_modules/nan/nan_implementation_12_inl.h:
-../node_modules/nan/nan_persistent_12_inl.h:
-../node_modules/nan/nan_weak.h:
-../node_modules/nan/nan_object_wrap.h:
-../node_modules/nan/nan_typedarray_contents.h:
-../src/./serialport_poller.h:
-../src/././serialport.h:
diff --git a/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport/src/serialport_unix.o.d b/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport/src/serialport_unix.o.d
deleted file mode 100755
index 0e637d19e3cb237cb6d02d99aa2253949f6b05b9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/build/Release/.deps/Release/obj.target/serialport/src/serialport_unix.o.d
+++ /dev/null
@@ -1,61 +0,0 @@
-cmd_Release/obj.target/serialport/src/serialport_unix.o := g++-4.8 '-DNODE_GYP_MODULE_NAME=serialport' '-D_LARGEFILE_SOURCE' '-D_FILE_OFFSET_BITS=64' '-DBUILDING_NODE_EXTENSION' -I/home/travis/.node-gyp/4.4.7/include/node -I/home/travis/.node-gyp/4.4.7/src -I/home/travis/.node-gyp/4.4.7/deps/uv/include -I/home/travis/.node-gyp/4.4.7/deps/v8/include -I../node_modules/nan  -fPIC -pthread -Wall -Wextra -Wno-unused-parameter -m64 -O3 -ffunction-sections -fdata-sections -fno-omit-frame-pointer -fno-rtti -fno-exceptions -std=gnu++0x -MMD -MF ./Release/.deps/Release/obj.target/serialport/src/serialport_unix.o.d.raw   -c -o Release/obj.target/serialport/src/serialport_unix.o ../src/serialport_unix.cpp
-Release/obj.target/serialport/src/serialport_unix.o: \
- ../src/serialport_unix.cpp ../src/./serialport.h \
- ../node_modules/nan/nan.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_version.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-errno.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-version.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-unix.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-threadpool.h \
- /home/travis/.node-gyp/4.4.7/include/node/uv-linux.h \
- /home/travis/.node-gyp/4.4.7/include/node/node.h \
- /home/travis/.node-gyp/4.4.7/include/node/v8.h \
- /home/travis/.node-gyp/4.4.7/include/node/v8-version.h \
- /home/travis/.node-gyp/4.4.7/include/node/v8config.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_version.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_buffer.h \
- /home/travis/.node-gyp/4.4.7/include/node/node.h \
- /home/travis/.node-gyp/4.4.7/include/node/node_object_wrap.h \
- ../node_modules/nan/nan_callbacks.h \
- ../node_modules/nan/nan_callbacks_12_inl.h \
- ../node_modules/nan/nan_maybe_43_inl.h \
- ../node_modules/nan/nan_converters.h \
- ../node_modules/nan/nan_converters_43_inl.h \
- ../node_modules/nan/nan_new.h \
- ../node_modules/nan/nan_implementation_12_inl.h \
- ../node_modules/nan/nan_persistent_12_inl.h \
- ../node_modules/nan/nan_weak.h ../node_modules/nan/nan_object_wrap.h \
- ../node_modules/nan/nan_typedarray_contents.h \
- ../src/./serialport_poller.h ../src/././serialport.h
-../src/serialport_unix.cpp:
-../src/./serialport.h:
-../node_modules/nan/nan.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_version.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-errno.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-version.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-unix.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-threadpool.h:
-/home/travis/.node-gyp/4.4.7/include/node/uv-linux.h:
-/home/travis/.node-gyp/4.4.7/include/node/node.h:
-/home/travis/.node-gyp/4.4.7/include/node/v8.h:
-/home/travis/.node-gyp/4.4.7/include/node/v8-version.h:
-/home/travis/.node-gyp/4.4.7/include/node/v8config.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_version.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_buffer.h:
-/home/travis/.node-gyp/4.4.7/include/node/node.h:
-/home/travis/.node-gyp/4.4.7/include/node/node_object_wrap.h:
-../node_modules/nan/nan_callbacks.h:
-../node_modules/nan/nan_callbacks_12_inl.h:
-../node_modules/nan/nan_maybe_43_inl.h:
-../node_modules/nan/nan_converters.h:
-../node_modules/nan/nan_converters_43_inl.h:
-../node_modules/nan/nan_new.h:
-../node_modules/nan/nan_implementation_12_inl.h:
-../node_modules/nan/nan_persistent_12_inl.h:
-../node_modules/nan/nan_weak.h:
-../node_modules/nan/nan_object_wrap.h:
-../node_modules/nan/nan_typedarray_contents.h:
-../src/./serialport_poller.h:
-../src/././serialport.h:
diff --git a/js/node_modules/serialport/build/Release/.deps/Release/serialport.node.d b/js/node_modules/serialport/build/Release/.deps/Release/serialport.node.d
deleted file mode 100755
index 58c403acd69b20ddaf4a4386e722d845e85056ef..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/build/Release/.deps/Release/serialport.node.d
+++ /dev/null
@@ -1 +0,0 @@
-cmd_Release/serialport.node := rm -rf "Release/serialport.node" && cp -af "Release/obj.target/serialport.node" "Release/serialport.node"
diff --git a/js/node_modules/serialport/build/Release/obj.target/serialport.node b/js/node_modules/serialport/build/Release/obj.target/serialport.node
deleted file mode 100755
index 5c6cc0ecad53396987b7256554f003cca2f8b628..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/build/Release/obj.target/serialport.node and /dev/null differ
diff --git a/js/node_modules/serialport/build/Release/obj.target/serialport/src/serialport.o b/js/node_modules/serialport/build/Release/obj.target/serialport/src/serialport.o
deleted file mode 100755
index 63e89e83da09d1b3331f7cbbadc4281a1bf2e6e2..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/build/Release/obj.target/serialport/src/serialport.o and /dev/null differ
diff --git a/js/node_modules/serialport/build/Release/obj.target/serialport/src/serialport_poller.o b/js/node_modules/serialport/build/Release/obj.target/serialport/src/serialport_poller.o
deleted file mode 100755
index 8c5f5a96133f67e6c497593b69ab06aad9faaf57..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/build/Release/obj.target/serialport/src/serialport_poller.o and /dev/null differ
diff --git a/js/node_modules/serialport/build/Release/obj.target/serialport/src/serialport_unix.o b/js/node_modules/serialport/build/Release/obj.target/serialport/src/serialport_unix.o
deleted file mode 100755
index b7f58d54bbeceae2f8264e31c76c93fcd3573d3c..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/build/Release/obj.target/serialport/src/serialport_unix.o and /dev/null differ
diff --git a/js/node_modules/serialport/build/Release/serialport.node b/js/node_modules/serialport/build/Release/serialport.node
deleted file mode 100755
index 5c6cc0ecad53396987b7256554f003cca2f8b628..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/build/Release/serialport.node and /dev/null differ
diff --git a/js/node_modules/serialport/changelog.md b/js/node_modules/serialport/changelog.md
deleted file mode 100644
index 05913d2e954f008707e438625b73866b0d24fbb0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/changelog.md
+++ /dev/null
@@ -1,283 +0,0 @@
-Version 4.0.1
--------------
- - [linux] Do not replace the native Promise when it is available thanks to @zewish for the fix
-
-Version 4.0.0
--------------
- - Requiring `serialport` now returns the SerialPort constructor function instead of a factory object. `SerialPort.SerialPort` is now depreciated.
- - `SerialPort` constructor now throws on argument errors immediately.
- - `.write(writeCallback)` now only calls it's callback once after the entire write operation, it used to be called for each write cycle and return the bytes written. This reduces the number of callbacks by hundreds of thousands over a megabyte at low bandwidth.
- - Disconnections now always attempt to close the port, and you'll always get a `close` event after a `disconnect` event
- - All callbacks are called in the context of the port, `this` now equals the port.
- - Removed `openImmediately` from the constructor's api, the functionality is now named `autoOpen` on the options object.
- - Removed extraneous flow control settings from the `flowControl` option, use the specific options to set these flags now.
- - Removed undocumented callbacks from the options object `disconnectedCallback` and `dataCallback`
- - Renamed `serialportlist` to `serialport-list`
- - Renamed `serialportterm` to `serialport-term`
- - Added a contributors guide
- - Added our first Arduino required integration tests
- - [unix] `.drain` and `.set` now properly report errors
- - [unix] Ports are now locked by default with the new `lock` options matches windows default behavior
- - [windows] `.update()` now supports windows for changing baud rates
- - [windows] Fixed a bug where we weren't properly opening ports (provides better support virtual com ports too) thanks to @RogerHardiman
- - [windows] known issue `lock: false` doesn't work (no change in behavior)
-
-Version 3.1.2
--------------
- - Documentation around "Illegal Instruction" errors
- - Resolve some ambiguities around publishing that was causing some issues on some versions and platforms of npm and node
- - [linux] bug fix in `.list()` where we weren't filtering out non block devices that are named like serial ports
- - [unix] Better unix error messages
- - [unix] Refactor `setBaudrate` for Unix making it easier for custom baudRate support
- - [unix] Update now has less memory leaks, documentation and better error messages
- - [windows] Better error messages for opening ports
-
-Version 3.1.1
--------------
- - fix an issue with bundled deps for node-pre-gyp on npm
-
-Version 3.1.0
--------------
- - Upgrade nan and fix warnings for node 6.0
- - Update the cli tools. serialport-term can now list ports, serialport-list can now output in different formats
-
-Version 3.0.1
--------------
- - Change from BlueBird to es6-promise to save 9.5MB from the package size (19M -> 9.5) and 130k bundle size (186.1kb -> 55.2kb)
- - Experimental node 6 support
-
-Version 3.0.0
--------------
-- `close` and `disconnect` events no longer call `removeAllListeners` and removes your event listeners. This was particularly bad for the `error` event. This is the only change and if you didn't have a special code to deal with this behavior you should probably upgrade from v2.1.2
-
-Version 2.1.2
--------------
-- Start bundling node-pre-gyp but upgrade it to the latest as the previous version doesn't install
-
-Version 2.1.1
--------------
-- `.list` errors are consistent across platforms and no longer has blocking `statSync` calls
-- Stop bundling node-pre-gyp to prevent issues when it's already installed
-- Internal restructuring
-
-Version 2.1.0
--------------
-- Major refactor, bug fixes and docs improvements thanks to @ecksun, @fivdi, @gfcittolin, @jacobrosenthal, @mhart, @nebrius, @pabigot, @paulkaplan, @reconbot, @rodovich, @rwaldron, @sayanee, @tigoe and everyone who reported and helped debug issues!
-- Fix binary paths to confirm with modern standards
-- Integration tests on CI's that support it or for the folks at home with an arduino handy
-- Upgrade to nan-2.2.1 for memory leak fixes and node 6 compatibility (still not supported)
-- Confirm nw.js and electron compatibility
-- Make the outpout of `.list` consistent between platforms and docs
-- Define ambiguous flow control flags and document them
-- Fix support systems who provide 0 as a valid file descriptor
-- Fix race conditions when opening and closing ports that led to errors while reading and writing while closing or opening the port.
-- [unix] Fix a double open bug on unix that would cause opening and closing ports repetitively to error.
-- [unix] Listing serialports on linux now include more ports (including bluetooth devices eg. `/dev/rfcommXX`) and have less bugs in the output
-- [windows] Remove deprecated BuildCommDCB for windows 10 support
-- [windows] Fix a memory leak on windows
-- [windows] Fix a 100% cpu and possible hang bug when ports were disconnected on windows.
-
-Version 2.0.6
--------------
-- Add 5.x build to matrix, thanks @deadprogram
-- Re add nmpignore, thanks @rwaldron
-- Swap to upstream version of node-pre-gyp-github
-
-Version 2.0.5
--------------
-- Fix linux port listing crash since 2.0.3 refactor, thanks @monkbroc
-
-Version 2.0.4
--------------
-- Fix heap corruption issue affecting windows users since 2.0.0, thanks @kunalspathak
-
-Version 2.0.3
--------------
-- Move node-pre-gyp binaries away from Amazon S3 to Github Releases page
-- Fix for missing node-pre-gyp binaries, especially for windows users, since the 2.0.0 refactor which forced windows users to build from source -- generally failing due to lack of dependencies
-- Unix port listing moved away from udev which was not available on all platforms, to whitelisting ttyS ttyACM ttyUSB ttyAMA devices, see #610
-
-Version 2.0.2
--------------
-- Cleanup minor Unix gcc warnings, Thanks @rwaldron
-
-Version 2.0.1
--------------
-- El Capitan Support, thanks @tmpvar
-
-Version 2.0.0
--------------
-- Upgrade to NAN2 to support Node 4 support. Technically not api breaking, though NAN2 requires gcc 4.8 which for Pi Wheezy users at the very least, would be breaking. For those affected users looking to utilize serialport 2.x.x and Node 4 see https://github.com/fivdi/onoff/wiki/Node.js-v4-and-native-addons
-
-Version 1.7.4
--------------
-- Fix OSX 10.10 build errors
-
-Version 1.7.3
--------------
-- Fix OSX 10.10 build errors
-
-Version 1.7.2
--------------
-- Fix OSX 10.10 build errors
-
-Version 1.7.1
--------------
-- Fixed breaking issues in underlying code. (@voodootikigod)
-
-Version 1.7.0
--------------
-- Fix for #518 and #498 If you pass to SerialPort function (constructor) the same object for argument "options", inside SerialPort will use it as internal object and adds handlers to it. That causes only one callback to work on different SerialPort instances. (@bullmastiffo)
-- Update README.md #515 (@arahlf)
-- Fix a memory leak in SerialportPoller::New (@jpilet)
-- unix support for update baudrate #502 (@jacobrosenthal)
-- set cloexec after open, possible fix for #468 (@jacobrosenthal)
-- Added hang up on close option to constructor. #495 (@jbendes)
-- Upgraded NAN to 1.8.4 due to complaints from io.js 2.x users. (@imyller)
-
-Version 1.6.1
--------------
-- Upgraded to NAN 1.7.0
-- #476 adding break signal
-
-Version 1.6.0
--------------
-- Long standing issue resolved thanks to @jacobrosenthal for adding control signals into the serialport. YAY!
-- Fix for #426
-- Ability to return from inside loop #453
-- Emits for close/disconnect. #452
-
-Version 1.5.0
--------------
-- Fixed to work with io.js and node 0.11.x by upgrading to recent nan 1.6.2
-
-
-Version 1.4.8
--------------
-- Simple bump for the binary.
-
-Version 1.4.7
--------------
- - Fix for Issue #398 - Dropped sent characters on OSX and Linux
- - Fix for Issue #387 - added isOpen
- - removed a residual comment
- - Added osx control signalling
- - Fix for Issue #401
- - Fix for double write callbacks.
- - detect a serialport disconnect on linux.
-
-Version 1.4.6
--------------
- - Emit error on serialport when explicit handler present. Fixes gh-369
- - Fix for windows and Node 0.11.13 (atom-shell)
- - Fix for broken Travis-CI build.
-
-Version 1.4.5
--------------
- - Identified and report issue to node.js core about recent 0.11.x system.
- - Removed support for 0.8.x
- - Updated dependencies
-
- Version 1.4.4
- -------------
- - Fix for delete error.
-
-Version 1.3.0
--------------
-- Merged NAN integration for Node 0.8->0.11+ compatibility (#270)
-
-Version 1.2.5
--------------
-- Fixed an issue with pool handlers being global instead of instance isolation (Issue #252 and #255 thanks: foobarth !!! )
-
-
-Version 1.2.4
--------------
-- Resolved parity error under linux as reported here: https://github.com/voodootikigod/node-serialport/issues/219
-
-
-Version 1.1.3
--------------
-- Remove ATL dependency on Windows (added Visual Studio Pro requirement)
-- Update build instructions
-- Four small bugfixes
-
-Version 1.0.7
--------------
-- Guaranteed in-order delivery of messages thanks to Jay Beavers and bnoordhuis
-
-Version 1.0.6
--------------
-- Support higher baud rates in Mac OS X
-
-Version 1.0.5
--------------
-- Added flush support.
-
-Version 1.0.4
--------------
-- Fix for arduino firmata support on windows thanks to @jgautier.
-
-Version 1.0.3
--------------
-- Fixed issue 65 - https://github.com/voodootikigod/node-serialport/issues/65
-- Added note in readme about what is required for the system to be able to compile module, should solve 90% of issues.
-
-Version 1.0.2
--------------
-- Fixed issue 59 - https://github.com/voodootikigod/node-serialport/issues/59
-
-Version 1.0.1
--------------
-- Fixed items from Firmata
-- Added flexibility for options (camelcase or all lower)
-
-Version 1.0.0
--------------
-- Added Windows support thanks to Joe Ferner.
-- Merged in the various underlying changes from node-serialport2 complete thanks to Joe Ferner for that!
-- Verified against known installations.
-
-
-Version 0.6.5
--------------
-- Added SetBaudRate, SetDTR; Custom Baud Rates
-- New "close" listener when device being disconnected
-
-Version 0.2.8
--------------
-- BufferSize fix for readstream (thanks jgautier, you rock)
-
-Version 0.2.7
--------------
-- Make no port available be an exception not error emitted - Ticket #12.
-
-Version 0.2.5 - Version 0.2.6
------------------------------
-- Debugging issue with IOWatcher not holding in the event loop in node.js.
-- Converted to ReadStream instead of IOWatcher.
-
-Version 0.2.4
--------------
-- Integrated arduino tests (rwaldron)
-- Integrated options bug fix (w1nk)
-- Integrated hardware flow control for crazier serial port action (w1nk)
-
-Version 0.2.3
--------------
-- Something amazing that has since been lost and forgotten.
-
-Version 0.2.2
--------------
-- Integrated enhanced version of arduino/readline that actually buffers the data (epeli)
-
-Version 0.2.1
--------------
-- Refactored the parsing code upon data receipt, now allows for dynamic specification of how incoming data is handled.
-- Revised creation interface to use named parameters as an object versions positional parameters.
-
-Version: 0.2
-------------
-- Upgraded to node v. 0.4.X compatibility
-
-All other version are not recorded.
diff --git a/js/node_modules/serialport/lib/bindings.js b/js/node_modules/serialport/lib/bindings.js
deleted file mode 100644
index 9a1adcd5a8b6589a17d08eb2841562475bc16b4a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/lib/bindings.js
+++ /dev/null
@@ -1,34 +0,0 @@
-'use strict';
-
-var bindings = require('bindings')('serialport.node');
-var listUnix = require('./list-unix');
-
-var linux = process.platform !== 'win32' && process.platform !== 'darwin';
-
-function listLinux(callback) {
-  callback = callback || function(err) {
-    if (err) { this.emit('error', err) }
-  }.bind(this);
-  return listUnix(callback);
-};
-
-var platformOptions = {};
-if (process.platform !== 'win32') {
-  platformOptions = {
-    vmin: 1,
-    vtime: 0
-  };
-}
-
-module.exports = {
-  close: bindings.close,
-  drain: bindings.drain,
-  flush: bindings.flush,
-  list: linux ? listLinux : bindings.list,
-  open: bindings.open,
-  SerialportPoller: bindings.SerialportPoller,
-  set: bindings.set,
-  update: bindings.update,
-  write: bindings.write,
-  platformOptions: platformOptions
-};
diff --git a/js/node_modules/serialport/lib/list-unix.js b/js/node_modules/serialport/lib/list-unix.js
deleted file mode 100644
index e42df2259483e5d2df5435a2ee0c32097bb577fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/lib/list-unix.js
+++ /dev/null
@@ -1,112 +0,0 @@
-'use strict';
-
-// requiring es6-promise will replace `Promise` in node, so avoid it if possible
-var Promise = global.Promise || require('es6-promise').Promise;
-
-var childProcess = require('child_process');
-var fs = require('fs');
-var path = require('path');
-
-function promisify(func) {
-  return function(arg) {
-    return new Promise(function(resolve, reject) {
-      func(arg, function(err, data) {
-        if (err) {
-          return reject(err);
-        }
-        resolve(data);
-      });
-    });
-  };
-}
-
-function promisedFilter(func) {
-  return function(data) {
-    var shouldKeep = data.map(func);
-    return Promise.all(shouldKeep).then(function(keep) {
-      return data.filter(function(path, index) {
-        return keep[index];
-      });
-    });
-  };
-}
-
-var statAsync = promisify(fs.stat);
-var readdirAsync = promisify(fs.readdir);
-var execAsync = promisify(childProcess.exec);
-
-function udevParser(output) {
-  var udevInfo = output.split('\n').reduce(function(info, line) {
-    if (!line || line.trim() === '') {
-      return info;
-    }
-    var parts = line.split('=').map(function(part) {
-      return part.trim();
-    });
-
-    info[parts[0].toLowerCase()] = parts[1];
-
-    return info;
-  }, {});
-
-  var pnpId;
-  if (udevInfo.devlinks) {
-    udevInfo.devlinks.split(' ').forEach(function(path) {
-      if (path.indexOf('/by-id/') === -1) { return }
-      pnpId = path.substring(path.lastIndexOf('/') + 1);
-    });
-  }
-
-  var vendorId = udevInfo.id_vendor_id;
-  if (vendorId && vendorId.substring(0, 2) !== '0x') {
-    vendorId = '0x' + vendorId;
-  }
-
-  var productId = udevInfo.id_model_id;
-  if (productId && productId.substring(0, 2) !== '0x') {
-    productId = '0x' + productId;
-  }
-
-  return {
-    comName: udevInfo.devname,
-    manufacturer: udevInfo.id_vendor,
-    serialNumber: udevInfo.id_serial,
-    pnpId: pnpId,
-    vendorId: vendorId,
-    productId: productId
-  };
-}
-
-function checkPathAndDevice(path) {
-  // get only serial port names
-  if (!(/(tty(S|ACM|USB|AMA|MFD)|rfcomm)/).test(path)) {
-    return false;
-  }
-  return statAsync(path).then(function(stats) {
-    return stats.isCharacterDevice();
-  });
-}
-
-function lookupPort(file) {
-  var udevadm = 'udevadm info --query=property -p $(udevadm info -q path -n ' + file + ')';
-  return execAsync(udevadm).then(udevParser);
-}
-
-function listUnix(callback) {
-  var dirName = '/dev';
-  readdirAsync(dirName)
-    .catch(function(err) {
-      // if this directory is not found we just pretend everything is OK
-      // TODO Depreciated this check?
-      if (err.errno === 34) {
-        return [];
-      }
-      throw err;
-    })
-    .then(function(data) { return data.map(function(file) { return path.join(dirName, file) }) })
-    .then(promisedFilter(checkPathAndDevice))
-    .then(function(data) { return Promise.all(data.map(lookupPort)) })
-    .then(function(data) { callback(null, data) }, function(err) { callback(err) });
-}
-
-module.exports = listUnix;
diff --git a/js/node_modules/serialport/lib/parsers.js b/js/node_modules/serialport/lib/parsers.js
deleted file mode 100644
index e6a0c0951814517ca31c5086cd7aa7dbd9376d66..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/lib/parsers.js
+++ /dev/null
@@ -1,64 +0,0 @@
-'use strict';
-
-// Copyright 2011 Chris Williams <chris@iterativedesigns.com>
-
-module.exports = {
-  raw: function(emitter, buffer) {
-    emitter.emit('data', buffer);
-  },
-
-  // encoding: ascii utf8 utf16le ucs2 base64 binary hex
-  // More: http://nodejs.org/api/buffer.html#buffer_buffer
-  readline: function(delimiter, encoding) {
-    if (typeof delimiter === 'undefined' || delimiter === null) { delimiter = '\r' }
-    if (typeof encoding === 'undefined' || encoding === null) { encoding = 'utf8' }
-    // Delimiter buffer saved in closure
-    var data = '';
-    return function(emitter, buffer) {
-      // Collect data
-      data += buffer.toString(encoding);
-      // Split collected data by delimiter
-      var parts = data.split(delimiter);
-      data = parts.pop();
-      parts.forEach(function(part) {
-        emitter.emit('data', part);
-      });
-    };
-  },
-
-  // Emit a data event every `length` bytes
-  byteLength: function(length) {
-    var data = new Buffer(0);
-    return function(emitter, buffer) {
-      data = Buffer.concat([data, buffer]);
-      while (data.length >= length) {
-        var out = data.slice(0, length);
-        data = data.slice(length);
-        emitter.emit('data', out);
-      }
-    };
-  },
-
-  // Emit a data event each time a byte sequence (delimiter is an array of byte) is found
-  // Sample usage : byteDelimiter([10, 13])
-  byteDelimiter: function(delimiter) {
-    if (Object.prototype.toString.call(delimiter) !== '[object Array]') {
-      delimiter = [ delimiter ];
-    }
-    var buf = [];
-    var nextDelimIndex = 0;
-    return function(emitter, buffer) {
-      for (var i = 0; i < buffer.length; i++) {
-        buf[buf.length] = buffer[i];
-        if (buf[buf.length - 1] === delimiter[nextDelimIndex]) {
-          nextDelimIndex++;
-        }
-        if (nextDelimIndex === delimiter.length) {
-          emitter.emit('data', buf);
-          buf = [];
-          nextDelimIndex = 0;
-        }
-      }
-    };
-  }
-};
diff --git a/js/node_modules/serialport/lib/serialport.js b/js/node_modules/serialport/lib/serialport.js
deleted file mode 100644
index 90ba5579e564795ab3ccf1d4357d4e2c45a4cd00..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/lib/serialport.js
+++ /dev/null
@@ -1,471 +0,0 @@
-'use strict';
-
-// Copyright 2011 Chris Williams <chris@iterativedesigns.com>
-
-// 3rd Party Dependencies
-var debug = require('debug')('serialport');
-
-// shims
-var assign = require('object.assign').getPolyfill();
-
-// Internal Dependencies
-var SerialPortBinding = require('./bindings');
-var parsers = require('./parsers');
-
-// Built-ins Dependencies
-var fs = require('fs');
-var stream = require('stream');
-var util = require('util');
-
-//  VALIDATION ARRAYS
-var DATABITS = [5, 6, 7, 8];
-var STOPBITS = [1, 1.5, 2];
-var PARITY = ['none', 'even', 'mark', 'odd', 'space'];
-var FLOWCONTROLS = ['xon', 'xoff', 'xany', 'rtscts'];
-var SET_OPTIONS = ['brk', 'cts', 'dtr', 'dts', 'rts'];
-
-// Stuff from ReadStream, refactored for our usage:
-var kPoolSize = 40 * 1024;
-var kMinPoolSpace = 128;
-
-var defaultSettings = {
-  baudRate: 9600,
-  autoOpen: true,
-  parity: 'none',
-  xon: false,
-  xoff: false,
-  xany: false,
-  rtscts: false,
-  hupcl: true,
-  dataBits: 8,
-  stopBits: 1,
-  bufferSize: 64 * 1024,
-  lock: true,
-  parser: parsers.raw,
-  platformOptions: SerialPortBinding.platformOptions
-};
-
-var defaultSetFlags = {
-  brk: false,
-  cts: false,
-  dtr: true,
-  dts: false,
-  rts: true
-};
-
-// deprecate the lowercase version of these options next major release
-var LOWERCASE_OPTIONS = [
-  'baudRate',
-  'dataBits',
-  'stopBits',
-  'bufferSize',
-  'platformOptions'
-];
-
-function correctOptions(options) {
-  LOWERCASE_OPTIONS.forEach(function(name) {
-    var lowerName = name.toLowerCase();
-    if (options.hasOwnProperty(lowerName)) {
-      var value = options[lowerName];
-      delete options[lowerName];
-      options[name] = value;
-    }
-  });
-  return options;
-}
-
-function SerialPort(path, options, callback) {
-  if (typeof callback === 'boolean') {
-    throw new TypeError('`openImmediately` is now called `autoOpen` and is a property of options');
-  }
-
-  if (typeof options === 'function') {
-    callback = options;
-    options = {};
-  }
-
-  options = options || {};
-
-  stream.Stream.call(this);
-
-  if (!path) {
-    throw new TypeError('No path specified');
-  }
-
-  this.path = path;
-
-  var correctedOptions = correctOptions(options);
-  var settings = assign({}, defaultSettings, correctedOptions);
-
-  if (typeof settings.baudRate !== 'number') {
-    throw new TypeError('Invalid "baudRate" must be a number got: ' + settings.baudRate);
-  }
-
-  if (DATABITS.indexOf(settings.dataBits) === -1) {
-    throw new TypeError('Invalid "databits": ' + settings.dataBits);
-  }
-
-  if (STOPBITS.indexOf(settings.stopBits) === -1) {
-    throw new TypeError('Invalid "stopbits": ' + settings.stopbits);
-  }
-
-  if (PARITY.indexOf(settings.parity) === -1) {
-    throw new TypeError('Invalid "parity": ' + settings.parity);
-  }
-
-  FLOWCONTROLS.forEach(function(control) {
-    if (typeof settings[control] !== 'boolean') {
-      throw new TypeError('Invalid "' + control + '" is not boolean');
-    }
-  });
-
-  settings.disconnectedCallback = this._disconnected.bind(this);
-  settings.dataCallback = settings.parser.bind(this, this);
-
-  this.fd = null;
-  this.paused = true;
-  this.opening = false;
-  this.closing = false;
-
-  if (process.platform !== 'win32') {
-    this.bufferSize = settings.bufferSize;
-    this.readable = true;
-    this.reading = false;
-  }
-
-  this.options = settings;
-
-  if (this.options.autoOpen) {
-    // is nextTick necessary?
-    process.nextTick(this.open.bind(this, callback));
-  }
-}
-
-util.inherits(SerialPort, stream.Stream);
-
-SerialPort.prototype._error = function(error, callback) {
-  if (callback) {
-    callback.call(this, error);
-  } else {
-    this.emit('error', error);
-  }
-};
-
-SerialPort.prototype.open = function(callback) {
-  if (this.isOpen()) {
-    return this._error(new Error('Port is already open'), callback);
-  }
-
-  if (this.opening) {
-    return this._error(new Error('Port is opening'), callback);
-  }
-
-  this.paused = true;
-  this.readable = true;
-  this.reading = false;
-  this.opening = true;
-
-  SerialPortBinding.open(this.path, this.options, function(err, fd) {
-    if (err) {
-      debug('SerialPortBinding.open had an error', err);
-      return this._error(err, callback);
-    }
-    this.fd = fd;
-    this.paused = false;
-    this.opening = false;
-
-    if (process.platform !== 'win32') {
-      this.serialPoller = new SerialPortBinding.SerialportPoller(this.fd, function(err) {
-        if (!err) {
-          this._read();
-        } else {
-          this._disconnected(err);
-        }
-      }.bind(this));
-      this.serialPoller.start();
-    }
-
-    this.emit('open');
-    if (callback) { callback.call(this, null) }
-  }.bind(this));
-};
-
-SerialPort.prototype.update = function(options, callback) {
-  if (!this.isOpen()) {
-    debug('update attempted, but port is not open');
-    return this._error(new Error('Port is not open'), callback);
-  }
-
-  var correctedOptions = correctOptions(options);
-  var settings = assign({}, defaultSettings, correctedOptions);
-  this.options.baudRate = settings.baudRate;
-
-  SerialPortBinding.update(this.fd, this.options, function(err) {
-    if (err) {
-      return this._error(err, callback);
-    }
-    if (callback) { callback.call(this, null) }
-  }.bind(this));
-};
-
-SerialPort.prototype.isOpen = function() {
-  return this.fd !== null && !this.closing;
-};
-
-SerialPort.prototype.write = function(buffer, callback) {
-  if (!this.isOpen()) {
-    debug('write attempted, but port is not open');
-    return this._error(new Error('Port is not open'), callback);
-  }
-
-  if (!Buffer.isBuffer(buffer)) {
-    buffer = new Buffer(buffer);
-  }
-
-  debug('write ' + buffer.length + ' bytes of data');
-  SerialPortBinding.write(this.fd, buffer, function(err) {
-    if (err) {
-      debug('SerialPortBinding.write had an error', err);
-      return this._error(err, callback);
-    }
-    if (callback) { callback.call(this, null) }
-  }.bind(this));
-};
-
-if (process.platform !== 'win32') {
-  SerialPort.prototype._read = function() {
-    if (!this.readable || this.paused || this.reading || this.closing) {
-      return;
-    }
-
-    this.reading = true;
-
-    if (!this.pool || this.pool.length - this.pool.used < kMinPoolSpace) {
-      // discard the old pool. Can't add to the free list because
-      // users might have references to slices on it.
-      this.pool = new Buffer(kPoolSize);
-      this.pool.used = 0;
-    }
-
-    // Grab another reference to the pool in the case that while we're in the
-    // thread pool another read() finishes up the pool, and allocates a new
-    // one.
-    var toRead = Math.min(this.pool.length - this.pool.used, ~~this.bufferSize);
-    var start = this.pool.used;
-
-    var _afterRead = function(err, bytesRead, readPool, bytesRequested) {
-      this.reading = false;
-      if (err) {
-        if (err.code && err.code === 'EAGAIN') {
-          if (this.isOpen()) {
-            this.serialPoller.start();
-          }
-        // handle edge case were mac/unix doesn't clearly know the error.
-        } else if (err.code && (err.code === 'EBADF' || err.code === 'ENXIO' || (err.errno === -1 || err.code === 'UNKNOWN'))) {
-          this._disconnected(err);
-        } else {
-          this.fd = null;
-          this.readable = false;
-          this.emit('error', err);
-        }
-        return;
-      }
-
-      // Since we will often not read the number of bytes requested,
-      // let's mark the ones we didn't need as available again.
-      this.pool.used -= bytesRequested - bytesRead;
-
-      if (bytesRead === 0) {
-        if (this.isOpen()) {
-          this.serialPoller.start();
-        }
-      } else {
-        var b = this.pool.slice(start, start + bytesRead);
-
-        // do not emit events if the stream is paused
-        if (this.paused) {
-          this.buffer = Buffer.concat([this.buffer, b]);
-          return;
-        }
-        this._emitData(b);
-
-        // do not emit events anymore after we declared the stream unreadable
-        if (!this.readable) {
-          return;
-        }
-        this._read();
-      }
-    }.bind(this);
-
-    fs.read(this.fd, this.pool, this.pool.used, toRead, null, function(err, bytesRead) {
-      var readPool = this.pool;
-      var bytesRequested = toRead;
-      _afterRead(err, bytesRead, readPool, bytesRequested);
-    }.bind(this));
-
-    this.pool.used += toRead;
-  };
-
-  SerialPort.prototype._emitData = function(data) {
-    this.options.dataCallback(data);
-  };
-
-  SerialPort.prototype.pause = function() {
-    this.paused = true;
-  };
-
-  SerialPort.prototype.resume = function() {
-    this.paused = false;
-
-    if (this.buffer) {
-      var buffer = this.buffer;
-      this.buffer = null;
-      this._emitData(buffer);
-    }
-
-    // No longer open?
-    if (!this.isOpen()) {
-      return;
-    }
-
-    this._read();
-  };
-} // if !'win32'
-
-SerialPort.prototype._disconnected = function(err) {
-  this.paused = true;
-  this.emit('disconnect', err);
-  if (this.closing) {
-    return;
-  }
-
-  if (this.fd === null) {
-    return;
-  }
-
-  this.closing = true;
-  if (process.platform !== 'win32') {
-    this.readable = false;
-    this.serialPoller.close();
-  }
-
-  SerialPortBinding.close(this.fd, function(err) {
-    this.closing = false;
-    if (err) {
-      debug('Disconnect close completed with error: ', err);
-    }
-    this.fd = null;
-    this.emit('close');
-  }.bind(this));
-};
-
-SerialPort.prototype.close = function(callback) {
-  this.paused = true;
-
-  if (this.closing) {
-    debug('close attempted, but port is already closing');
-    return this._error(new Error('Port is not open'), callback);
-  }
-
-  if (!this.isOpen()) {
-    debug('close attempted, but port is not open');
-    return this._error(new Error('Port is not open'), callback);
-  }
-
-  this.closing = true;
-
-  // Stop polling before closing the port.
-  if (process.platform !== 'win32') {
-    this.readable = false;
-    this.serialPoller.close();
-  }
-  SerialPortBinding.close(this.fd, function(err) {
-    this.closing = false;
-    if (err) {
-      debug('SerialPortBinding.close had an error', err);
-      return this._error(err, callback);
-    }
-
-    this.fd = null;
-    this.emit('close');
-    if (callback) { callback.call(this, null) }
-  }.bind(this));
-};
-
-SerialPort.prototype.flush = function(callback) {
-  if (!this.isOpen()) {
-    debug('flush attempted, but port is not open');
-    return this._error(new Error('Port is not open'), callback);
-  }
-
-  SerialPortBinding.flush(this.fd, function(err, result) {
-    if (err) {
-      debug('SerialPortBinding.flush had an error', err);
-      return this._error(err, callback);
-    }
-    if (callback) { callback.call(this, null, result) }
-  }.bind(this));
-};
-
-SerialPort.prototype.set = function(options, callback) {
-  if (!this.isOpen()) {
-    debug('set attempted, but port is not open');
-    return this._error(new Error('Port is not open'), callback);
-  }
-
-  options = options || {};
-  if (!callback && typeof options === 'function') {
-    callback = options;
-    options = {};
-  }
-
-  var settings = {};
-  for (var i = SET_OPTIONS.length - 1; i >= 0; i--) {
-    var flag = SET_OPTIONS[i];
-    if (options[flag] !== undefined) {
-      settings[flag] = options[flag];
-    } else {
-      settings[flag] = defaultSetFlags[flag];
-    }
-  }
-
-  SerialPortBinding.set(this.fd, settings, function(err) {
-    if (err) {
-      debug('SerialPortBinding.set had an error', err);
-      return this._error(err, callback);
-    }
-    if (callback) { callback.call(this, null) }
-  }.bind(this));
-};
-
-SerialPort.prototype.drain = function(callback) {
-  if (!this.isOpen()) {
-    debug('drain attempted, but port is not open');
-    return this._error(new Error('Port is not open'), callback);
-  }
-
-  SerialPortBinding.drain(this.fd, function(err) {
-    if (err) {
-      debug('SerialPortBinding.drain had an error', err);
-      return this._error(err, callback);
-    }
-    if (callback) { callback.call(this, null) }
-  }.bind(this));
-};
-
-SerialPort.parsers = parsers;
-SerialPort.list = SerialPortBinding.list;
-
-// Write a depreciation warning once
-Object.defineProperty(SerialPort, 'SerialPort', {
-  get: function() {
-    console.warn('DEPRECATION: Please use `require(\'serialport\')` instead of `require(\'serialport\').SerialPort`');
-    Object.defineProperty(SerialPort, 'SerialPort', {
-      value: SerialPort
-    });
-    return SerialPort;
-  },
-  configurable: true
-});
-
-module.exports = SerialPort;
diff --git a/js/node_modules/serialport/node_modules/.bin/node-pre-gyp b/js/node_modules/serialport/node_modules/.bin/node-pre-gyp
deleted file mode 120000
index 47a90a512d7f8ece927eadb0020938d2558b95ae..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/.bin/node-pre-gyp
+++ /dev/null
@@ -1 +0,0 @@
-../node-pre-gyp/bin/node-pre-gyp
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/CHANGELOG.md
deleted file mode 100644
index 17e467c10b13044f5029328765c77e24b45268c3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/CHANGELOG.md
+++ /dev/null
@@ -1,323 +0,0 @@
-# node-pre-gyp changelog
-
-## 0.6.29
-
- - Add known node versions for v0.10.45, v0.12.14, v4.4.4, v5.11.1, and v6.1.0
-
-## 0.6.28
-
- - Now more verbose when remote binaries are not available. This is needed since npm is increasingly more quiet by default
-   and users need to know why builds are falling back to source compiles that might then error out.
-
-## 0.6.27
-
- - Add known node version for node v6
- - Stopped bundling dependencies
- - Documented method for module authors to avoid bundling node-pre-gyp
-   - See https://github.com/mapbox/node-pre-gyp/tree/master#configuring for details
-
-## 0.6.26
-
- - Skip validation for nw runtime (https://github.com/mapbox/node-pre-gyp/pull/181) via @fleg
-
-## 0.6.25
-
- - Improved support for auto-detection of electron runtime in `node-pre-gyp.find()`
-   - Pull request from @enlight - https://github.com/mapbox/node-pre-gyp/pull/187
- - Add known node version for 4.4.1 and 5.9.1
-
-## 0.6.24
-
- - Add known node version for 5.8.0, 5.9.0, and 4.4.0.
-
-## 0.6.23
-
- - Add known node version for 0.10.43, 0.12.11, 4.3.2, and 5.7.1.
-
-## 0.6.22
-
- - Add known node version for 4.3.1, and 5.7.0.
-
-## 0.6.21
-
- - Add known node version for 0.10.42, 0.12.10, 4.3.0, and 5.6.0.
-
-## 0.6.20
-
- - Add known node version for 4.2.5, 4.2.6, 5.4.0, 5.4.1,and 5.5.0.
-
-## 0.6.19
-
- - Add known node version for 4.2.4
-
-## 0.6.18
-
- - Add new known node versions for 0.10.x, 0.12.x, 4.x, and 5.x
-
-## 0.6.17
-
- - Re-tagged to fix packaging problem of `Error: Cannot find module 'isarray'`
-
-## 0.6.16
-
- - Added known version in crosswalk for 5.1.0.
-
-## 0.6.15
-
- - Upgraded tar-pack (https://github.com/mapbox/node-pre-gyp/issues/182)
- - Support custom binary hosting mirror (https://github.com/mapbox/node-pre-gyp/pull/170)
- - Added known version in crosswalk for 4.2.2.
-
-## 0.6.14
-
- - Added node 5.x version
-
-## 0.6.13
-
- - Added more known node 4.x versions
-
-## 0.6.12
-
- - Added support for [Electron](http://electron.atom.io/). Just pass the `--runtime=electron` flag when building/installing. Thanks @zcbenz
-
-## 0.6.11
-
- - Added known node and io.js versions including more 3.x and 4.x versions
-
-## 0.6.10
-
- - Added known node and io.js versions including 3.x and 4.x versions
- - Upgraded `tar` dep
-
-## 0.6.9
-
- - Upgraded `rc` dep
- - Updated known io.js version: v2.4.0
-
-## 0.6.8
-
- - Upgraded `semver` and `rimraf` deps
- - Updated known node and io.js versions
-
-## 0.6.7
-
- - Fixed `node_abi` versions for io.js 1.1.x -> 1.8.x (should be 43, but was stored as 42) (refs https://github.com/iojs/build/issues/94)
-
-## 0.6.6
-
- - Updated with known io.js 2.0.0 version
-
-## 0.6.5
-
- - Now respecting `npm_config_node_gyp` (https://github.com/npm/npm/pull/4887)
- - Updated to semver@4.3.2
- - Updated known node v0.12.x versions and io.js 1.x versions.
-
-## 0.6.4
-
- - Improved support for `io.js` (@fengmk2)
- - Test coverage improvements (@mikemorris)
- - Fixed support for `--dist-url` that regressed in 0.6.3
-
-## 0.6.3
-
- - Added support for passing raw options to node-gyp using `--` separator. Flags passed after
-   the `--` to `node-pre-gyp configure` will be passed directly to gyp while flags passed
-   after the `--` will be passed directly to make/visual studio.
- - Added `node-pre-gyp configure` command to be able to call `node-gyp configure` directly
- - Fix issue with require validation not working on windows 7 (@edgarsilva)
-
-## 0.6.2
-
- - Support for io.js >= v1.0.2
- - Deferred require of `request` and `tar` to help speed up command line usage of `node-pre-gyp`.
-
-## 0.6.1
-
- - Fixed bundled `tar` version
-
-## 0.6.0
-
- - BREAKING: node odd releases like v0.11.x now use `major.minor.patch` for `{node_abi}` instead of `NODE_MODULE_VERSION` (#124)
- - Added support for `toolset` option in versioning. By default is an empty string but `--toolset` can be passed to publish or install to select alternative binaries that target a custom toolset like C++11. For example to target Visual Studio 2014 modules like node-sqlite3 use `--toolset=v140`.
- - Added support for `--no-rollback` option to request that a failed binary test does not remove the binary module leaves it in place.
- - Added support for `--update-binary` option to request an existing binary be re-installed and the check for a valid local module be skipped.
- - Added support for passing build options from `npm` through `node-pre-gyp` to `node-gyp`: `--nodedir`, `--disturl`, `--python`, and `--msvs_version`
-
-## 0.5.31
-
- - Added support for deducing node_abi for node.js runtime from previous release if the series is even
- - Added support for --target=0.10.33
-
-## 0.5.30
-
- - Repackaged with latest bundled deps
-
-## 0.5.29
-
- - Added support for semver `build`.
- - Fixed support for downloading from urls that include `+`.
-
-## 0.5.28
-
- - Now reporting unix style paths only in reveal command
-
-## 0.5.27
-
- - Fixed support for auto-detecting s3 bucket name when it contains `.` - @taavo 
- - Fixed support for installing when path contains a `'` - @halfdan
- - Ported tests to mocha
-
-## 0.5.26
-
- - Fix node-webkit support when `--target` option is not provided
-
-## 0.5.25
-
- - Fix bundling of deps
-
-## 0.5.24
-
- - Updated ABI crosswalk to incldue node v0.10.30 and v0.10.31
-
-## 0.5.23
-
- - Added `reveal` command. Pass no options to get all versioning data as json. Pass a second arg to grab a single versioned property value
- - Added support for `--silent` (shortcut for `--loglevel=silent`)
-
-## 0.5.22
-
- - Fixed node-webkit versioning name (NOTE: node-webkit support still experimental)
-
-## 0.5.21
-
- - New package to fix `shasum check failed` error with v0.5.20
-
-## 0.5.20
-
- - Now versioning node-webkit binaries based on major.minor.patch - assuming no compatible ABI across versions (#90)
-
-## 0.5.19
-
- - Updated to know about more node-webkit releases
-
-## 0.5.18
-
- - Updated to know about more node-webkit releases
-
-## 0.5.17
-
- - Updated to know about node v0.10.29 release
-
-## 0.5.16
-
- - Now supporting all aws-sdk configuration parameters (http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html) (#86)
-
-## 0.5.15
-
- - Fixed installation of windows packages sub directories on unix systems (#84)
-
-## 0.5.14
-
- - Finished support for cross building using `--target_platform` option (#82)
- - Now skipping binary validation on install if target arch/platform do not match the host.
- - Removed multi-arch validing for OS X since it required a FAT node.js binary
-
-## 0.5.13
-
- - Fix problem in 0.5.12 whereby the wrong versions of mkdirp and semver where bundled.
-
-## 0.5.12
-
- - Improved support for node-webkit (@Mithgol)
-
-## 0.5.11
-
- - Updated target versions listing
-
-## 0.5.10
-
- - Fixed handling of `-debug` flag passed directory to node-pre-gyp (#72)
- - Added optional second arg to `node_pre_gyp.find` to customize the default versioning options used to locate the runtime binary
- - Failed install due to `testbinary` check failure no longer leaves behind binary (#70)
-
-## 0.5.9
-
- - Fixed regression in `testbinary` command causing installs to fail on windows with 0.5.7 (#60)
-
-## 0.5.8
-
- - Started bundling deps
-
-## 0.5.7
-
- - Fixed the `testbinary` check, which is used to determine whether to re-download or source compile, to work even in complex dependency situations (#63)
- - Exposed the internal `testbinary` command in node-pre-gyp command line tool
- - Fixed minor bug so that `fallback_to_build` option is always respected
-
-## 0.5.6
-
- - Added support for versioning on the `name` value in `package.json` (#57).
- - Moved to using streams for reading tarball when publishing (#52)
-
-## 0.5.5
-
- - Improved binary validation that also now works with node-webkit (@Mithgol)
- - Upgraded test apps to work with node v0.11.x
- - Improved test coverage
-
-## 0.5.4
-
- - No longer depends on external install of node-gyp for compiling builds.
-
-## 0.5.3
-
- - Reverted fix for debian/nodejs since it broke windows (#45)
-
-## 0.5.2
-
- - Support for debian systems where the node binary is named `nodejs` (#45)
- - Added `bin/node-pre-gyp.cmd` to be able to run command on windows locally (npm creates an .npm automatically when globally installed)
- - Updated abi-crosswalk with node v0.10.26 entry.
-
-## 0.5.1
-
- - Various minor bug fixes, several improving windows support for publishing.
-
-## 0.5.0
-
- - Changed property names in `binary` object: now required are `module_name`, `module_path`, and `host`.
- - Now `module_path` supports versioning, which allows developers to opt-in to using a versioned install path (#18).
- - Added `remote_path` which also supports versioning.
- - Changed `remote_uri` to `host`.
-
-## 0.4.2
-
- - Added support for `--target` flag to request cross-compile against a specific node/node-webkit version.
- - Added preliminary support for node-webkit
- - Fixed support for `--target_arch` option being respected in all cases.
-
-## 0.4.1
-
- - Fixed exception when only stderr is available in binary test (@bendi / #31) 
-
-## 0.4.0
-
- - Enforce only `https:` based remote publishing access.
- - Added `node-pre-gyp info` command to display listing of published binaries
- - Added support for changing the directory node-pre-gyp should build in with the `-C/--directory` option.
- - Added support for S3 prefixes.
-
-## 0.3.1
-
- - Added `unpublish` command.
- - Fixed module path construction in tests.
- - Added ability to disable falling back to build behavior via `npm install --fallback-to-build=false` which overrides setting in a depedencies package.json `install` target.
-
-## 0.3.0
-
- - Support for packaging all files in `module_path` directory - see `app4` for example
- - Added `testpackage` command.
- - Changed `clean` command to only delete `.node` not entire `build` directory since node-gyp will handle that.
- - `.node` modules must be in a folder of there own since tar-pack will remove everything when it unpacks.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/LICENSE
deleted file mode 100644
index 8f5fce91b088d51838d0641f46f4666bb2b096d9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c), Mapbox
-
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-    * Redistributions of source code must retain the above copyright notice,
-      this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright notice,
-      this list of conditions and the following disclaimer in the documentation
-      and/or other materials provided with the distribution.
-    * Neither the name of node-pre-gyp nor the names of its contributors
-      may be used to endorse or promote products derived from this software
-      without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/appveyor.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/appveyor.yml
deleted file mode 100644
index bdfaaafb331fe6e7bc8436484cfacda4bb61e803..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/appveyor.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-environment:
-  matrix:
-    - nodejs_version: 0.10.36
-    - nodejs_version: 4
-    - nodejs_version: 5
-
-platform:
-  - x64
-  - x86
-
-shallow_clone: true
-
-install:
-  - ps: Install-Product node $env:nodejs_version $env:Platform
-  - node --version
-  - npm --version
-  - SET PATH=%APPDATA%\npm;%PATH%
-  - npm update -g npm
-  - npm --version
-  - node -e "console.log(process.arch);"
-  - SET PATH=C:\Program Files (x86)\MSBuild\12.0\bin\;%PATH%
-  - if "%PLATFORM%" == "x64" set PATH=C:\Python27-x64;%PATH%
-  - if "%PLATFORM%" == "x86" SET PATH=C:\python27;%PATH%
-  - npm install
-  - npm test
-  - .\scripts\test.bat
-
-build: off
-test: off
-deploy: off
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/bin/node-pre-gyp b/js/node_modules/serialport/node_modules/node-pre-gyp/bin/node-pre-gyp
deleted file mode 100755
index 4f0e1d0b68156811d192e5822ad7d14216b71116..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/bin/node-pre-gyp
+++ /dev/null
@@ -1,131 +0,0 @@
-#!/usr/bin/env node
-
-"use strict";
-
-/**
- * Set the title.
- */
-
-process.title = 'node-pre-gyp';
-
-/**
- * Module dependencies.
- */
-
-var node_pre_gyp = require('../');
-var log = require('npmlog');
-
-/**
- * Process and execute the selected commands.
- */
-
-var prog = new node_pre_gyp.Run();
-var completed = false;
-prog.parseArgv(process.argv);
-
-if (prog.todo.length === 0) {
-  if (~process.argv.indexOf('-v') || ~process.argv.indexOf('--version')) {
-    console.log('v%s', prog.version);
-  } else {
-    console.log('%s', prog.usage());
-  }
-  return process.exit(0);
-}
-
-// if --no-color is passed
-if (prog.opts && prog.opts.hasOwnProperty('color') && !prog.opts.color) {
-  log.disableColor();
-}
-
-log.info('it worked if it ends with', 'ok');
-log.verbose('cli', process.argv);
-log.info('using', process.title + '@%s', prog.version);
-log.info('using', 'node@%s | %s | %s', process.versions.node, process.platform, process.arch);
-
-
-/**
- * Change dir if -C/--directory was passed.
- */
-
-var dir = prog.opts.directory;
-if (dir) {
-  var fs = require('fs');
-  try {
-    var stat = fs.statSync(dir);
-    if (stat.isDirectory()) {
-      log.info('chdir', dir);
-      process.chdir(dir);
-    } else {
-      log.warn('chdir', dir + ' is not a directory');
-    }
-  } catch (e) {
-    if (e.code === 'ENOENT') {
-      log.warn('chdir', dir + ' is not a directory');
-    } else {
-      log.warn('chdir', 'error during chdir() "%s"', e.message);
-    }
-  }
-}
-
-function run () {
-  var command = prog.todo.shift();
-  if (!command) {
-    // done!
-    completed = true;
-    log.info('ok');
-    return;
-  }
-
-  prog.commands[command.name](command.args, function (err) {
-    if (err) {
-      log.error(command.name + ' error');
-      log.error('stack', err.stack);
-      errorMessage();
-      log.error('not ok');
-      console.log(err.message);
-      return process.exit(1);
-    }
-    var args_array = [].slice.call(arguments, 1);
-    if (args_array.length) {
-      console.log.apply(console, args_array);
-    }
-    // now run the next command in the queue
-    process.nextTick(run);
-  });
-}
-
-process.on('exit', function (code) {
-  if (!completed && !code) {
-    log.error('Completion callback never invoked!');
-    issueMessage();
-    process.exit(6);
-  }
-});
-
-process.on('uncaughtException', function (err) {
-  log.error('UNCAUGHT EXCEPTION');
-  log.error('stack', err.stack);
-  issueMessage();
-  process.exit(7);
-});
-
-function errorMessage () {
-  // copied from npm's lib/util/error-handler.js
-  var os = require('os');
-  log.error('System', os.type() + ' ' + os.release());
-  log.error('command', process.argv.map(JSON.stringify).join(' '));
-  log.error('cwd', process.cwd());
-  log.error('node -v', process.version);
-  log.error(process.title+' -v', 'v' + prog.package.version);
-}
-
-function issueMessage () {
-  errorMessage();
-  log.error('', [ 'This is a bug in `'+process.title+'`.',
-                  'Try to update '+process.title+' and file an issue if it does not help:',
-                  '    <https://github.com/mapbox/'+process.title+'/issues>',
-                ].join('\n'));
-}
-
-// start running the given commands!
-run();
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/bin/node-pre-gyp.cmd b/js/node_modules/serialport/node_modules/node-pre-gyp/bin/node-pre-gyp.cmd
deleted file mode 100644
index 46e14b541726f45f166871591d42f81aacfa7edf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/bin/node-pre-gyp.cmd
+++ /dev/null
@@ -1,2 +0,0 @@
-@echo off
-node  "%~dp0\node-pre-gyp" %*
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/build.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/build.js
deleted file mode 100644
index 1074fa3b5a70d04bd0a85b346b9f54d0a3b67761..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/build.js
+++ /dev/null
@@ -1,43 +0,0 @@
-"use strict";
-
-module.exports = exports = build;
-
-exports.usage = 'Attempts to compile the module by dispatching to node-gyp or nw-gyp';
-
-var compile = require('./util/compile.js');
-var handle_gyp_opts = require('./util/handle_gyp_opts.js');
-var configure = require('./configure.js');
-
-function do_build(gyp,argv,callback) {
-    handle_gyp_opts(gyp,argv,function(err,result) {
-        var final_args = ['build'].concat(result.gyp).concat(result.pre);
-        if (result.unparsed.length > 0) {
-            final_args = final_args.
-                          concat(['--']).
-                          concat(result.unparsed);
-        }
-        compile.run_gyp(final_args,result.opts,function(err) {
-            return callback(err);
-        });
-    });
-}
-
-function build(gyp, argv, callback) {
-
-    // Form up commands to pass to node-gyp:
-    // We map `node-pre-gyp build` to `node-gyp configure build` so that we do not
-    // trigger a clean and therefore do not pay the penalty of a full recompile
-    if (argv.length && (argv.indexOf('rebuild') > -1)) {
-        // here we map `node-pre-gyp rebuild` to `node-gyp rebuild` which internally means
-        // "clean + configure + build" and triggers a full recompile
-        compile.run_gyp(['clean'],{},function(err) {
-            if (err) return callback(err);
-            configure(gyp,argv,function(err) {
-                if (err) return callback(err);
-                return do_build(gyp,argv,callback);
-            });
-        });
-    } else {
-        return do_build(gyp,argv,callback);        
-    }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/clean.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/clean.js
deleted file mode 100644
index a1289f68a19cfc3c3f22c64c3e968f38c794cc08..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/clean.js
+++ /dev/null
@@ -1,23 +0,0 @@
-"use strict";
-
-module.exports = exports = clean;
-
-exports.usage = 'Removes the entire folder containing the compiled .node module';
-
-var fs = require('fs');
-var rm = require('rimraf');
-var exists = require('fs').exists || require('path').exists;
-var versioning = require('./util/versioning.js');
-
-function clean (gyp, argv, callback) {
-    var package_json = JSON.parse(fs.readFileSync('./package.json'));
-    var opts = versioning.evaluate(package_json, gyp.opts);
-    var to_delete = opts.module_path;
-    exists(to_delete, function(found) {
-        if (found) {
-            if (!gyp.opts.silent_clean) console.log('['+package_json.name+'] Removing "%s"', to_delete);
-            return rm(to_delete, callback);
-        }
-        return callback();
-    });
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/configure.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/configure.js
deleted file mode 100644
index 1ea56642b66f2e1ede8b4004711e3bec0df13289..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/configure.js
+++ /dev/null
@@ -1,48 +0,0 @@
-"use strict";
-
-module.exports = exports = configure;
-
-exports.usage = 'Attempts to configure node-gyp or nw-gyp build';
-
-var compile = require('./util/compile.js');
-var handle_gyp_opts = require('./util/handle_gyp_opts.js');
-
-function configure(gyp, argv, callback) {
-    handle_gyp_opts(gyp,argv,function(err,result) {
-        var final_args = result.gyp.concat(result.pre);
-        // pull select node-gyp configure options out of the npm environ
-        var known_gyp_args = ['dist-url','python','nodedir','msvs_version'];
-        known_gyp_args.forEach(function(key) {
-            var val = gyp.opts[key] || gyp.opts[key.replace('-','_')];
-            if (val) {
-               final_args.push('--'+key+'='+val);
-            }
-        });
-        // --ensure=false tell node-gyp to re-install node development headers
-        // but it is only respected by node-gyp install, so we have to call install
-        // as a separate step if the user passes it
-        if (gyp.opts.ensure === false) {
-            var install_args = final_args.concat(['install','--ensure=false']);
-            compile.run_gyp(install_args,result.opts,function(err) {
-                if (err) return callback(err);
-                if (result.unparsed.length > 0) {
-                    final_args = final_args.
-                                  concat(['--']).
-                                  concat(result.unparsed);
-                }
-                compile.run_gyp(['configure'].concat(final_args),result.opts,function(err) {
-                    return callback(err);
-                });
-            });
-        } else {
-            if (result.unparsed.length > 0) {
-                final_args = final_args.
-                              concat(['--']).
-                              concat(result.unparsed);
-            }
-            compile.run_gyp(['configure'].concat(final_args),result.opts,function(err) {
-                return callback(err);
-            });
-        }
-    });
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/info.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/info.js
deleted file mode 100644
index aff9bf8327e6eba92e177066225673c5c74de300..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/info.js
+++ /dev/null
@@ -1,40 +0,0 @@
-"use strict";
-
-module.exports = exports = unpublish;
-
-exports.usage = 'Lists all published binaries (requires aws-sdk)';
-
-var fs = require('fs');
-var log = require('npmlog');
-var versioning = require('./util/versioning.js');
-var s3_setup = require('./util/s3_setup.js');
-var config = require('rc')("node_pre_gyp",{acl:"public-read"});
-
-function unpublish(gyp, argv, callback) {
-    var AWS = require("aws-sdk");
-    var package_json = JSON.parse(fs.readFileSync('./package.json'));
-    var opts = versioning.evaluate(package_json, gyp.opts);
-    s3_setup.detect(opts.hosted_path,config);
-    AWS.config.update(config);
-    var s3 =  new AWS.S3();
-    var s3_opts = {  Bucket: config.bucket,
-                     Prefix: config.prefix
-                  };
-    s3.listObjects(s3_opts, function(err, meta){
-        if (err && err.code == 'NotFound') {
-            return callback(new Error('['+package_json.name+'] Not found: https://' + s3_opts.Bucket + '.s3.amazonaws.com/'+config.prefix));
-        } else if(err) {
-            return callback(err);
-        } else {
-            log.verbose(JSON.stringify(meta,null,1));
-            if (meta && meta.Contents) {
-                meta.Contents.forEach(function(obj) {
-                    console.log(obj.Key);
-                });
-            } else {
-                console.error('['+package_json.name+'] No objects found at https://' + s3_opts.Bucket + '.s3.amazonaws.com/'+config.prefix );
-            }
-            return callback();
-        }
-    });
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/install.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/install.js
deleted file mode 100644
index ce2d56ffc6a58830316e4354bd7675faa11a5020..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/install.js
+++ /dev/null
@@ -1,215 +0,0 @@
-"use strict";
-
-module.exports = exports = install;
-
-exports.usage = 'Attempts to install pre-built binary for module';
-
-var fs = require('fs');
-var path = require('path');
-var zlib = require('zlib');
-var log = require('npmlog');
-var existsAsync = fs.exists || path.exists;
-var versioning = require('./util/versioning.js');
-var testbinary = require('./testbinary.js');
-var clean = require('./clean.js');
-
-function download(uri,opts,callback) {
-    log.http('GET', uri);
-
-    var req = null;
-    var requestOpts = {
-        uri: uri.replace('+','%2B'),
-        headers: {
-          'User-Agent': 'node-pre-gyp (node ' + process.version + ')'
-        }
-    };
-
-    var proxyUrl = opts.proxy ||
-                    process.env.http_proxy ||
-                    process.env.HTTP_PROXY ||
-                    process.env.npm_config_proxy;
-    if (proxyUrl) {
-      if (/^https?:\/\//i.test(proxyUrl)) {
-        log.verbose('download', 'using proxy url: "%s"', proxyUrl);
-        requestOpts.proxy = proxyUrl;
-      } else {
-        log.warn('download', 'ignoring invalid "proxy" config setting: "%s"', proxyUrl);
-      }
-    }
-    try {
-        req = require('request')(requestOpts);
-    } catch (e) {
-        return callback(e);
-    }
-    if (req) {
-      req.on('response', function (res) {
-        log.http(res.statusCode, uri);
-      });
-    }
-    return callback(null,req);
-}
-
-function place_binary(from,to,opts,callback) {
-    download(from,opts,function(err,req) {
-        if (err) return callback(err);
-        if (!req) return callback(new Error("empty req"));
-        var badDownload = false;
-        var extractCount = 0;
-        var gunzip = zlib.createGunzip();
-        var extracter = require('tar').Extract({ path: to, strip: 1});
-
-        function afterTarball(err) {
-            if (err) return callback(err);
-            if (badDownload) return callback(new Error("bad download"));
-            if (extractCount === 0) {
-                return callback(new Error('There was a fatal problem while downloading/extracting the tarball'));
-            }
-            log.info('tarball', 'done parsing tarball');
-            callback();
-        }
-
-        function filter_func(entry) {
-            // ensure directories are +x
-            // https://github.com/mapnik/node-mapnik/issues/262
-            entry.props.mode |= (entry.props.mode >>> 2) & parseInt('0111',8);
-            log.info('install','unpacking ' + entry.path);
-            extractCount++;
-        }
-
-        gunzip.on('error', callback);
-        extracter.on('entry', filter_func);
-        extracter.on('error', callback);
-        extracter.on('end', afterTarball);
-
-        req.on('error', function(err) {
-            badDownload = true;
-            return callback(err);
-        });
-
-        req.on('close', function () {
-            if (extractCount === 0) {
-                return callback(new Error('Connection closed while downloading tarball file'));
-            }
-        });
-
-        req.on('response', function(res) {
-            if (res.statusCode !== 200) {
-                badDownload = true;
-                if (res.statusCode == 404) {
-                    return callback(new Error('Pre-built binary not available for your system, looked for ' + from));
-                } else {
-                    return callback(new Error(res.statusCode + ' status code downloading tarball ' + from));
-                }
-            }
-            // start unzipping and untaring
-            req.pipe(gunzip).pipe(extracter);
-        });
-    });
-}
-
-function do_build(gyp,argv,callback) {
-  gyp.todo.push( { name: 'build', args: ['rebuild'] } );
-  process.nextTick(callback);
-}
-
-function print_fallback_error(err,opts,package_json) {
-    var fallback_message = ' (falling back to source compile with node-gyp)';
-    var full_message = "Pre-built binaries not found for " + package_json.name + "@" + package_json.version;
-    full_message += " and " + opts.runtime + "@" + (opts.target || process.versions.node) + " (" + opts.node_abi + " ABI)";
-    full_message += fallback_message;
-    log.error("Tried to download: " + opts.hosted_tarball);
-    log.error(full_message);
-    log.http(err.message);
-}
-
-function install(gyp, argv, callback) {
-    var package_json = JSON.parse(fs.readFileSync('./package.json'));
-    var source_build = gyp.opts['build-from-source'] || gyp.opts.build_from_source;
-    var update_binary = gyp.opts['update-binary'] || gyp.opts.update_binary;
-    var should_do_source_build = source_build === package_json.name || (source_build === true || source_build === 'true');
-    var no_rollback = gyp.opts.hasOwnProperty('rollback') && gyp.opts.rollback === false;
-    if (should_do_source_build) {
-        log.info('build','requesting source compile');
-        return do_build(gyp,argv,callback);
-    } else {
-        var fallback_to_build = gyp.opts['fallback-to-build'] || gyp.opts.fallback_to_build;
-        var should_do_fallback_build = fallback_to_build === package_json.name || (fallback_to_build === true || fallback_to_build === 'true');
-        // but allow override from npm
-        if (process.env.npm_config_argv) {
-            var cooked = JSON.parse(process.env.npm_config_argv).cooked;
-            var match = cooked.indexOf("--fallback-to-build");
-            if (match > -1 && cooked.length > match && cooked[match+1] == "false") {
-                should_do_fallback_build = false;
-                log.info('install','Build fallback disabled via npm flag: --fallback-to-build=false');
-            }
-        }
-        var opts;
-        try {
-            opts = versioning.evaluate(package_json, gyp.opts);
-        } catch (err) {
-            return callback(err);
-        }
-        var from = opts.hosted_tarball;
-        var to = opts.module_path;
-        var binary_module = path.join(to,opts.module_name + '.node');
-        if (existsAsync(binary_module,function(found) {
-            if (found && !update_binary) {
-                testbinary(gyp, argv, function(err) {
-                    if (err) {
-                        console.error('['+package_json.name+'] ' + err.message);
-                        log.error("Testing local pre-built binary failed, attempting to re-download");
-                        place_binary(from,to,opts,function(err) {
-                            if (err) {
-                                if (should_do_fallback_build) {
-                                    print_fallback_error(err,opts,package_json);
-                                    return do_build(gyp,argv,callback);
-                                } else {
-                                    return callback(err);
-                                }
-                            } else {
-                                console.log('['+package_json.name+'] Success: "' + binary_module + '" is reinstalled via remote');
-                                return callback();
-                            }
-                        });
-                    } else {
-                        console.log('['+package_json.name+'] Success: "' + binary_module + '" already installed');
-                        console.log('Pass --update-binary to reinstall or --build-from-source to recompile');
-                        return callback();
-                    }
-                });
-            } else {
-                if (!update_binary) log.info('check','checked for "' + binary_module + '" (not found)');
-                place_binary(from,to,opts,function(err) {
-                    if (err && should_do_fallback_build) {
-                        print_fallback_error(err,opts,package_json);
-                        return do_build(gyp,argv,callback);
-                    } else if (err) {
-                        return callback(err);
-                    } else {
-                        testbinary(gyp, argv, function(err) {
-                            if (err) {
-                                if (no_rollback) {
-                                    return callback(err);
-                                }
-                                gyp.opts.silent_clean = true;
-                                clean(gyp, argv, function(error) {
-                                    if (error) console.log(error);
-                                    if (should_do_fallback_build) {
-                                        console.error('['+package_json.name+'] ' + err.message);
-                                        log.error("Testing pre-built binary failed, attempting to source compile");
-                                        return do_build(gyp,argv,callback);
-                                    } else {
-                                        return callback(err);
-                                    }
-                                });
-                            } else {
-                                console.log('['+package_json.name+'] Success: "' + binary_module + '" is installed via remote');
-                                return callback();
-                            }
-                        });
-                    }
-                });
-            }
-        }));
-    }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/node-pre-gyp.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/node-pre-gyp.js
deleted file mode 100644
index f0fff781c2ee1b6efc1f29ced293d7fe8529fcf0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/node-pre-gyp.js
+++ /dev/null
@@ -1,192 +0,0 @@
-"use strict";
-
-/**
- * Module exports.
- */
-
-module.exports = exports;
-
-/**
- * Module dependencies.
- */
-
-var path = require('path');
-var nopt = require('nopt');
-var log = require('npmlog');
-var EE = require('events').EventEmitter;
-var inherits = require('util').inherits;
-var commands = [
-      'clean',
-      'install',
-      'reinstall',
-      'build',
-      'rebuild',
-      'package',
-      'testpackage',
-      'publish',
-      'unpublish',
-      'info',
-      'testbinary',
-      'reveal',
-      'configure'
-    ];
-var aliases = {};
-
-// differentiate node-pre-gyp's logs from npm's
-log.heading = 'node-pre-gyp';
-
-exports.find = require('./pre-binding').find;
-
-function Run() {
-  var self = this;
-
-  this.commands = {};
-
-  commands.forEach(function (command) {
-    self.commands[command] = function (argv, callback) {
-      log.verbose('command', command, argv);
-      return require('./' + command)(self, argv, callback);
-    };
-  });
-}
-inherits(Run, EE);
-exports.Run = Run;
-var proto = Run.prototype;
-
-/**
- * Export the contents of the package.json.
- */
-
-proto.package = require('../package');
-
-/**
- * nopt configuration definitions
- */
-
-proto.configDefs = {
-    help: Boolean,     // everywhere
-    arch: String,      // 'configure'
-    debug: Boolean,    // 'build'
-    directory: String, // bin
-    proxy: String,     // 'install'
-    loglevel: String,  // everywhere
-};
-
-/**
- * nopt shorthands
- */
-
-proto.shorthands = {
-    release: '--no-debug',
-    C: '--directory',
-    debug: '--debug',
-    j: '--jobs',
-    silent: '--loglevel=silent',
-    silly: '--loglevel=silly',
-    verbose: '--loglevel=verbose',
-};
-
-/**
- * expose the command aliases for the bin file to use.
- */
-
-proto.aliases = aliases;
-
-/**
- * Parses the given argv array and sets the 'opts',
- * 'argv' and 'command' properties.
- */
-
-proto.parseArgv = function parseOpts (argv) {
-  this.opts = nopt(this.configDefs, this.shorthands, argv);
-  this.argv = this.opts.argv.remain.slice();
-  var commands = this.todo = [];
-
-  // create a copy of the argv array with aliases mapped
-  argv = this.argv.map(function (arg) {
-    // is this an alias?
-    if (arg in this.aliases) {
-      arg = this.aliases[arg];
-    }
-    return arg;
-  }, this);
-
-  // process the mapped args into "command" objects ("name" and "args" props)
-  argv.slice().forEach(function (arg) {
-    if (arg in this.commands) {
-      var args = argv.splice(0, argv.indexOf(arg));
-      argv.shift();
-      if (commands.length > 0) {
-        commands[commands.length - 1].args = args;
-      }
-      commands.push({ name: arg, args: [] });
-    }
-  }, this);
-  if (commands.length > 0) {
-    commands[commands.length - 1].args = argv.splice(0);
-  }
-
-  // support for inheriting config env variables from npm
-  var npm_config_prefix = 'npm_config_';
-  Object.keys(process.env).forEach(function (name) {
-    if (name.indexOf(npm_config_prefix) !== 0) return;
-    var val = process.env[name];
-    if (name === npm_config_prefix + 'loglevel') {
-      log.level = val;
-    } else {
-      // add the user-defined options to the config
-      name = name.substring(npm_config_prefix.length);
-      // avoid npm argv clobber already present args
-      // which avoids problem of 'npm test' calling
-      // script that runs unique npm install commands
-      if (name === 'argv') {
-         if (this.opts.argv &&
-             this.opts.argv.remain &&
-             this.opts.argv.remain.length) {
-            // do nothing
-         } else {
-            this.opts[name] = val;
-         }
-      } else {
-        this.opts[name] = val;
-      }
-    }
-  }, this);
-
-  if (this.opts.loglevel) {
-    log.level = this.opts.loglevel;
-  }
-  log.resume();
-};
-
-/**
- * Returns the usage instructions for node-pre-gyp.
- */
-
-proto.usage = function usage () {
-  var str = [
-      '',
-      '  Usage: node-pre-gyp <command> [options]',
-      '',
-      '  where <command> is one of:',
-      commands.map(function (c) {
-        return '    - ' + c + ' - ' + require('./' + c).usage;
-      }).join('\n'),
-      '',
-      'node-pre-gyp@' + this.version + '  ' + path.resolve(__dirname, '..'),
-      'node@' + process.versions.node
-  ].join('\n');
-  return str;
-};
-
-/**
- * Version number getter.
- */
-
-Object.defineProperty(proto, 'version', {
-    get: function () {
-      return this.package.version;
-    },
-    enumerable: true
-});
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/package.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/package.js
deleted file mode 100644
index 3a35f653151b464c39ed8e07d120e48397259227..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/package.js
+++ /dev/null
@@ -1,46 +0,0 @@
-"use strict";
-
-module.exports = exports = _package;
-
-exports.usage = 'Packs binary (and enclosing directory) into locally staged tarball';
-
-var fs = require('fs');
-var path = require('path');
-var log = require('npmlog');
-var versioning = require('./util/versioning.js');
-var write = require('fs').createWriteStream;
-var existsAsync = fs.exists || path.exists;
-var mkdirp = require('mkdirp');
-
-function _package(gyp, argv, callback) {
-    var pack = require('tar-pack').pack;
-    var package_json = JSON.parse(fs.readFileSync('./package.json'));
-    var opts = versioning.evaluate(package_json, gyp.opts);
-    var from = opts.module_path;
-    var binary_module = path.join(from,opts.module_name + '.node');
-    existsAsync(binary_module,function(found) {
-        if (!found) {
-            return callback(new Error("Cannot package because " + binary_module + " missing: run `node-pre-gyp rebuild` first"));
-        }
-        var tarball = opts.staged_tarball;
-        var filter_func = function(entry) {
-            // ensure directories are +x
-            // https://github.com/mapnik/node-mapnik/issues/262
-            log.info('package','packing ' + entry.path);
-            return true;
-        };
-        mkdirp(path.dirname(tarball),function(err) {
-            if (err) throw err;
-            pack(from, { filter: filter_func })
-             .pipe(write(tarball))
-             .on('error', function(err) {
-                if (err)  console.error('['+package_json.name+'] ' + err.message);
-                return callback(err);
-             })
-             .on('close', function() {
-                log.info('package','Binary staged at "' + tarball + '"');
-                return callback();
-             });
-        });
-    });
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/pre-binding.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/pre-binding.js
deleted file mode 100644
index 326a486c9aede1270e8294ee37fc1f839816b244..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/pre-binding.js
+++ /dev/null
@@ -1,25 +0,0 @@
-"use strict";
-
-var versioning = require('../lib/util/versioning.js');
-var existsSync = require('fs').existsSync || require('path').existsSync;
-var path = require('path');
-
-module.exports = exports;
-
-exports.usage = 'Finds the require path for the node-pre-gyp installed module';
-
-exports.validate = function(package_json) {
-    versioning.validate_config(package_json);
-};
-
-exports.find = function(package_json_path,opts) {
-   if (!existsSync(package_json_path)) {
-        throw new Error("package.json does not exist at " + package_json_path);
-   }
-   var package_json = require(package_json_path);
-   versioning.validate_config(package_json);
-   opts = opts || {};
-   if (!opts.module_root) opts.module_root = path.dirname(package_json_path);
-   var meta = versioning.evaluate(package_json,opts);
-   return meta.module;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/publish.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/publish.js
deleted file mode 100644
index d666b01317d8d5e0e1ebce0324c1612f273f504e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/publish.js
+++ /dev/null
@@ -1,77 +0,0 @@
-"use strict";
-
-module.exports = exports = publish;
-
-exports.usage = 'Publishes pre-built binary (requires aws-sdk)';
-
-var fs = require('fs');
-var path = require('path');
-var log = require('npmlog');
-var versioning = require('./util/versioning.js');
-var s3_setup = require('./util/s3_setup.js');
-var existsAsync = fs.exists || path.exists;
-var url = require('url');
-var config = require('rc')("node_pre_gyp",{acl:"public-read"});
-
-function publish(gyp, argv, callback) {
-    var AWS = require("aws-sdk");
-    var package_json = JSON.parse(fs.readFileSync('./package.json'));
-    var opts = versioning.evaluate(package_json, gyp.opts);
-    var tarball = opts.staged_tarball;
-    existsAsync(tarball,function(found) {
-        if (!found) {
-            return callback(new Error("Cannot publish because " + tarball + " missing: run `node-pre-gyp package` first"));
-        }
-        log.info('publish', 'Detecting s3 credentials');
-        s3_setup.detect(opts.hosted_path,config);
-        var key_name = url.resolve(config.prefix,opts.package_name);
-        log.info('publish', 'Authenticating with s3');
-        AWS.config.update(config);
-        var s3 =  new AWS.S3();
-        var s3_opts = {  Bucket: config.bucket,
-                         Key: key_name
-                      };
-        var remote_package = 'https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + s3_opts.Key;
-        log.info('publish', 'Checking for existing binary at ' + remote_package);
-        s3.headObject(s3_opts, function(err, meta){
-            if (meta) log.info('publish', JSON.stringify(meta));
-            if (err && err.code == 'NotFound') {
-                // we are safe to publish because
-                // the object does not already exist
-                log.info('publish', 'Preparing to put object');
-                var s3_put = new AWS.S3();
-                var s3_put_opts = {  ACL: config.acl,
-                                     Body: fs.createReadStream(tarball),
-                                     Bucket: config.bucket,
-                                     Key: key_name
-                                  };
-                log.info('publish', 'Putting object');
-                try {
-                    s3_put.putObject(s3_put_opts, function(err, resp){
-                        log.info('publish', 'returned from putting object');
-                        if(err) {
-                           log.info('publish', 's3 putObject error: "' + err + '"');
-                           return callback(err);
-                        }
-                        if (resp) log.info('publish', 's3 putObject response: "' + JSON.stringify(resp) + '"');
-                        log.info('publish', 'successfully put object');
-                        console.log('['+package_json.name+'] published to ' + remote_package);
-                        return callback();
-                    });
-              } catch (err) {
-                   log.info('publish', 's3 putObject error: "' + err + '"');
-                   return callback(err);
-              }
-            } else if (err) {
-                log.info('publish', 's3 headObject error: "' + err + '"');
-                return callback(err);
-            } else {
-                log.error('publish','Cannot publish over existing version');
-                log.error('publish',"Update the 'version' field in package.json and try again");
-                log.error('publish','If the previous version was published in error see:');
-                log.error('publish','\t node-pre-gyp unpublish');
-                return callback(new Error('Failed publishing to ' + remote_package));
-            }
-        });
-    });
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/rebuild.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/rebuild.js
deleted file mode 100644
index 48a7b74b470165331c1bf8efdabca069da17b7dc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/rebuild.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-module.exports = exports = rebuild;
-
-exports.usage = 'Runs "clean" and "build" at once';
-
-function rebuild (gyp, argv, callback) {
-  gyp.todo.unshift(
-      { name: 'clean', args: [] },
-      { name: 'build', args: ['rebuild'] }
-  );
-  process.nextTick(callback);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/reinstall.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/reinstall.js
deleted file mode 100644
index ed65d54e03ca2829e3d12de24ec4c8c5e7b98e54..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/reinstall.js
+++ /dev/null
@@ -1,13 +0,0 @@
-"use strict";
-
-module.exports = exports = rebuild;
-
-exports.usage = 'Runs "clean" and "install" at once';
-
-function rebuild (gyp, argv, callback) {
-  gyp.todo.unshift(
-      { name: 'clean', args: [] },
-      { name: 'install', args: [] }
-  );
-  process.nextTick(callback);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/reveal.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/reveal.js
deleted file mode 100644
index e6d00eb34b7efc9654e6e9f1bab238353aecacc2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/reveal.js
+++ /dev/null
@@ -1,31 +0,0 @@
-"use strict";
-
-module.exports = exports = reveal;
-
-exports.usage = 'Reveals data on the versioned binary';
-
-var fs = require('fs');
-var versioning = require('./util/versioning.js');
-
-function unix_paths(key, val) {
-    return val && val.replace ? val.replace(/\\/g, '/') : val;
-}
-
-function reveal(gyp, argv, callback) {
-    var package_json = JSON.parse(fs.readFileSync('./package.json'));
-    var opts = versioning.evaluate(package_json, gyp.opts);
-    var hit = false;
-    // if a second arg is passed look to see
-    // if it is a known option
-    //console.log(JSON.stringify(gyp.opts,null,1))
-    var remain = gyp.opts.argv.remain.pop();
-    if (remain && opts.hasOwnProperty(remain)) {
-        console.log(opts[remain].replace(/\\/g, '/'));
-        hit = true;
-    }
-    // otherwise return all options as json
-    if (!hit) {
-        console.log(JSON.stringify(opts,unix_paths,2));
-    }
-    return callback();
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/testbinary.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/testbinary.js
deleted file mode 100644
index fbdfca4d2d7e5b337e867cad939546f7561b7103..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/testbinary.js
+++ /dev/null
@@ -1,73 +0,0 @@
-"use strict";
-
-module.exports = exports = testbinary;
-
-exports.usage = 'Tests that the binary.node can be required';
-
-var fs = require('fs');
-var path = require('path');
-var log = require('npmlog');
-var cp = require('child_process');
-var versioning = require('./util/versioning.js');
-var path = require('path');
-
-function testbinary(gyp, argv, callback) {
-    var args = [];
-    var options = {};
-    var shell_cmd = process.execPath;
-    var package_json = JSON.parse(fs.readFileSync('./package.json'));
-    var opts = versioning.evaluate(package_json, gyp.opts);
-    // ensure on windows that / are used for require path
-    var binary_module = opts.module.replace(/\\/g, '/');
-    var nw = (opts.runtime && opts.runtime === 'node-webkit');
-    if ((process.arch != opts.target_arch) ||
-        (process.platform != opts.target_platform)) {
-        var msg = "skipping validation since host platform/arch (";
-        msg += process.platform+'/'+process.arch+")";
-        msg += " does not match target (";
-        msg += opts.target_platform+'/'+opts.target_arch+")";
-        log.info('validate', msg);
-        return callback();
-    }
-    if (nw) {
-        options.timeout = 5000;
-        if (process.platform === 'darwin') {
-            shell_cmd = 'node-webkit';
-        } else if (process.platform === 'win32') {
-            shell_cmd = 'nw.exe';
-        } else {
-            shell_cmd = 'nw';
-        }
-        var modulePath = path.resolve(binary_module);
-        var appDir = path.join(__dirname, 'util', 'nw-pre-gyp');
-        args.push(appDir);
-        args.push(modulePath);
-        log.info("validate","Running test command: '" + shell_cmd + ' ' + args.join(' ') + "'");
-        cp.execFile(shell_cmd, args, options, function(err, stdout, stderr) {
-            // check for normal timeout for node-webkit
-            if (err) {
-                if (err.killed === true && err.signal && err.signal.indexOf('SIG') > -1) {
-                    return callback();
-                }
-                var stderrLog = stderr.toString();
-                log.info('stderr', stderrLog);
-                if( /^\s*Xlib:\s*extension\s*"RANDR"\s*missing\s*on\s*display\s*":\d+\.\d+"\.\s*$/.test(stderrLog) ){
-                    log.info('RANDR', 'stderr contains only RANDR error, ignored');
-                    return callback();
-                }
-                return callback(err);
-            }
-            return callback();
-        });
-        return;
-    }
-    args.push('--eval');
-    args.push("'require(\\'" + binary_module.replace(/\'/g, '\\\'') +"\\')'");
-    log.info("validate","Running test command: '" + shell_cmd + ' ' + args.join(' ') + "'");
-    cp.execFile(shell_cmd, args, options, function(err, stdout, stderr) {
-        if (err) {
-            return callback(err, { stdout:stdout, stderr:stderr});
-        }
-        return callback();
-    });
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/testpackage.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/testpackage.js
deleted file mode 100644
index 1d4cc607f98644ca768e0825b76281a291a490ae..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/testpackage.js
+++ /dev/null
@@ -1,49 +0,0 @@
-"use strict";
-
-module.exports = exports = testpackage;
-
-exports.usage = 'Tests that the staged package is valid';
-
-var fs = require('fs');
-var path = require('path');
-var log = require('npmlog');
-var existsAsync = fs.exists || path.exists;
-var versioning = require('./util/versioning.js');
-var testbinary = require('./testbinary.js');
-var read = require('fs').createReadStream;
-var zlib = require('zlib');
-
-function testpackage(gyp, argv, callback) {
-    var package_json = JSON.parse(fs.readFileSync('./package.json'));
-    var opts = versioning.evaluate(package_json, gyp.opts);
-    var tarball = opts.staged_tarball;
-    existsAsync(tarball, function(found) {
-        if (!found) {
-            return callback(new Error("Cannot test package because " + tarball + " missing: run `node-pre-gyp package` first"));
-        }
-        var to = opts.module_path;
-        var gunzip = zlib.createGunzip();
-        var extracter = require('tar').Extract({ path: to, strip: 1 });
-        function filter_func(entry) {
-            // ensure directories are +x
-            // https://github.com/mapnik/node-mapnik/issues/262
-            entry.props.mode |= (entry.props.mode >>> 2) & parseInt('0111',8);
-            log.info('install','unpacking ' + entry.path);
-        }
-        gunzip.on('error', callback);
-        extracter.on('error', callback);
-        extracter.on('entry', filter_func);
-        extracter.on('end', function(err) {
-            if (err) return callback(err);
-            testbinary(gyp,argv,function(err) {
-                if (err) {
-                    return callback(err);
-                } else {
-                    console.log('['+package_json.name+'] Package appears valid');
-                    return callback();
-                }
-            });
-        });
-        read(tarball).pipe(gunzip).pipe(extracter);
-    });
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/unpublish.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/unpublish.js
deleted file mode 100644
index 43f8e66d2971d41755ee08e16baee963e5b279d8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/unpublish.js
+++ /dev/null
@@ -1,41 +0,0 @@
-"use strict";
-
-module.exports = exports = unpublish;
-
-exports.usage = 'Unpublishes pre-built binary (requires aws-sdk)';
-
-var fs = require('fs');
-var log = require('npmlog');
-var versioning = require('./util/versioning.js');
-var s3_setup = require('./util/s3_setup.js');
-var url = require('url');
-var config = require('rc')("node_pre_gyp",{acl:"public-read"});
-
-function unpublish(gyp, argv, callback) {
-    var AWS = require("aws-sdk");
-    var package_json = JSON.parse(fs.readFileSync('./package.json'));
-    var opts = versioning.evaluate(package_json, gyp.opts);
-    s3_setup.detect(opts.hosted_path,config);
-    AWS.config.update(config);
-    var key_name = url.resolve(config.prefix,opts.package_name);
-    var s3 =  new AWS.S3();
-    var s3_opts = {  Bucket: config.bucket,
-                     Key: key_name
-                  };
-    s3.headObject(s3_opts, function(err, meta) {
-        if (err && err.code == 'NotFound') {
-            console.log('['+package_json.name+'] Not found: https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + s3_opts.Key);
-            return callback();
-        } else if(err) {
-            return callback(err);
-        } else {
-            log.info('unpublish', JSON.stringify(meta));
-            s3.deleteObject(s3_opts, function(err, resp) {
-                if (err) return callback(err);
-                log.info(JSON.stringify(resp));
-                console.log('['+package_json.name+'] Success: removed https://' + s3_opts.Bucket + '.s3.amazonaws.com/' + s3_opts.Key);
-                return callback();
-            });
-        }
-    });
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/abi_crosswalk.json b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/abi_crosswalk.json
deleted file mode 100644
index e1f84e543af1ea8d4eb85cce47e390464643e0a8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/abi_crosswalk.json
+++ /dev/null
@@ -1,1274 +0,0 @@
-{
-  "0.1.14": {
-    "node_abi": null,
-    "v8": "1.3"
-  },
-  "0.1.15": {
-    "node_abi": null,
-    "v8": "1.3"
-  },
-  "0.1.16": {
-    "node_abi": null,
-    "v8": "1.3"
-  },
-  "0.1.17": {
-    "node_abi": null,
-    "v8": "1.3"
-  },
-  "0.1.18": {
-    "node_abi": null,
-    "v8": "1.3"
-  },
-  "0.1.19": {
-    "node_abi": null,
-    "v8": "2.0"
-  },
-  "0.1.20": {
-    "node_abi": null,
-    "v8": "2.0"
-  },
-  "0.1.21": {
-    "node_abi": null,
-    "v8": "2.0"
-  },
-  "0.1.22": {
-    "node_abi": null,
-    "v8": "2.0"
-  },
-  "0.1.23": {
-    "node_abi": null,
-    "v8": "2.0"
-  },
-  "0.1.24": {
-    "node_abi": null,
-    "v8": "2.0"
-  },
-  "0.1.25": {
-    "node_abi": null,
-    "v8": "2.0"
-  },
-  "0.1.26": {
-    "node_abi": null,
-    "v8": "2.0"
-  },
-  "0.1.27": {
-    "node_abi": null,
-    "v8": "2.1"
-  },
-  "0.1.28": {
-    "node_abi": null,
-    "v8": "2.1"
-  },
-  "0.1.29": {
-    "node_abi": null,
-    "v8": "2.1"
-  },
-  "0.1.30": {
-    "node_abi": null,
-    "v8": "2.1"
-  },
-  "0.1.31": {
-    "node_abi": null,
-    "v8": "2.1"
-  },
-  "0.1.32": {
-    "node_abi": null,
-    "v8": "2.1"
-  },
-  "0.1.33": {
-    "node_abi": null,
-    "v8": "2.1"
-  },
-  "0.1.90": {
-    "node_abi": null,
-    "v8": "2.2"
-  },
-  "0.1.91": {
-    "node_abi": null,
-    "v8": "2.2"
-  },
-  "0.1.92": {
-    "node_abi": null,
-    "v8": "2.2"
-  },
-  "0.1.93": {
-    "node_abi": null,
-    "v8": "2.2"
-  },
-  "0.1.94": {
-    "node_abi": null,
-    "v8": "2.2"
-  },
-  "0.1.95": {
-    "node_abi": null,
-    "v8": "2.2"
-  },
-  "0.1.96": {
-    "node_abi": null,
-    "v8": "2.2"
-  },
-  "0.1.97": {
-    "node_abi": null,
-    "v8": "2.2"
-  },
-  "0.1.98": {
-    "node_abi": null,
-    "v8": "2.2"
-  },
-  "0.1.99": {
-    "node_abi": null,
-    "v8": "2.2"
-  },
-  "0.1.100": {
-    "node_abi": null,
-    "v8": "2.2"
-  },
-  "0.1.101": {
-    "node_abi": null,
-    "v8": "2.3"
-  },
-  "0.1.102": {
-    "node_abi": null,
-    "v8": "2.3"
-  },
-  "0.1.103": {
-    "node_abi": null,
-    "v8": "2.3"
-  },
-  "0.1.104": {
-    "node_abi": null,
-    "v8": "2.3"
-  },
-  "0.2.0": {
-    "node_abi": 1,
-    "v8": "2.3"
-  },
-  "0.2.1": {
-    "node_abi": 1,
-    "v8": "2.3"
-  },
-  "0.2.2": {
-    "node_abi": 1,
-    "v8": "2.3"
-  },
-  "0.2.3": {
-    "node_abi": 1,
-    "v8": "2.3"
-  },
-  "0.2.4": {
-    "node_abi": 1,
-    "v8": "2.3"
-  },
-  "0.2.5": {
-    "node_abi": 1,
-    "v8": "2.3"
-  },
-  "0.2.6": {
-    "node_abi": 1,
-    "v8": "2.3"
-  },
-  "0.3.0": {
-    "node_abi": 1,
-    "v8": "2.5"
-  },
-  "0.3.1": {
-    "node_abi": 1,
-    "v8": "2.5"
-  },
-  "0.3.2": {
-    "node_abi": 1,
-    "v8": "3.0"
-  },
-  "0.3.3": {
-    "node_abi": 1,
-    "v8": "3.0"
-  },
-  "0.3.4": {
-    "node_abi": 1,
-    "v8": "3.0"
-  },
-  "0.3.5": {
-    "node_abi": 1,
-    "v8": "3.0"
-  },
-  "0.3.6": {
-    "node_abi": 1,
-    "v8": "3.0"
-  },
-  "0.3.7": {
-    "node_abi": 1,
-    "v8": "3.0"
-  },
-  "0.3.8": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.0": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.1": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.2": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.3": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.4": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.5": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.6": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.7": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.8": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.9": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.10": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.11": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.4.12": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.5.0": {
-    "node_abi": 1,
-    "v8": "3.1"
-  },
-  "0.5.1": {
-    "node_abi": 1,
-    "v8": "3.4"
-  },
-  "0.5.2": {
-    "node_abi": 1,
-    "v8": "3.4"
-  },
-  "0.5.3": {
-    "node_abi": 1,
-    "v8": "3.4"
-  },
-  "0.5.4": {
-    "node_abi": 1,
-    "v8": "3.5"
-  },
-  "0.5.5": {
-    "node_abi": 1,
-    "v8": "3.5"
-  },
-  "0.5.6": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.5.7": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.5.8": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.5.9": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.5.10": {
-    "node_abi": 1,
-    "v8": "3.7"
-  },
-  "0.6.0": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.1": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.2": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.3": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.4": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.5": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.6": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.7": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.8": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.9": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.10": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.11": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.12": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.13": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.14": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.15": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.16": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.17": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.18": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.19": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.20": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.6.21": {
-    "node_abi": 1,
-    "v8": "3.6"
-  },
-  "0.7.0": {
-    "node_abi": 1,
-    "v8": "3.8"
-  },
-  "0.7.1": {
-    "node_abi": 1,
-    "v8": "3.8"
-  },
-  "0.7.2": {
-    "node_abi": 1,
-    "v8": "3.8"
-  },
-  "0.7.3": {
-    "node_abi": 1,
-    "v8": "3.9"
-  },
-  "0.7.4": {
-    "node_abi": 1,
-    "v8": "3.9"
-  },
-  "0.7.5": {
-    "node_abi": 1,
-    "v8": "3.9"
-  },
-  "0.7.6": {
-    "node_abi": 1,
-    "v8": "3.9"
-  },
-  "0.7.7": {
-    "node_abi": 1,
-    "v8": "3.9"
-  },
-  "0.7.8": {
-    "node_abi": 1,
-    "v8": "3.9"
-  },
-  "0.7.9": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.7.10": {
-    "node_abi": 1,
-    "v8": "3.9"
-  },
-  "0.7.11": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.7.12": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.0": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.1": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.2": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.3": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.4": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.5": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.6": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.7": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.8": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.9": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.10": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.11": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.12": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.13": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.14": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.15": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.16": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.17": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.18": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.19": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.20": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.21": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.22": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.23": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.24": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.25": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.26": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.27": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.8.28": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.9.0": {
-    "node_abi": 1,
-    "v8": "3.11"
-  },
-  "0.9.1": {
-    "node_abi": 10,
-    "v8": "3.11"
-  },
-  "0.9.2": {
-    "node_abi": 10,
-    "v8": "3.11"
-  },
-  "0.9.3": {
-    "node_abi": 10,
-    "v8": "3.13"
-  },
-  "0.9.4": {
-    "node_abi": 10,
-    "v8": "3.13"
-  },
-  "0.9.5": {
-    "node_abi": 10,
-    "v8": "3.13"
-  },
-  "0.9.6": {
-    "node_abi": 10,
-    "v8": "3.15"
-  },
-  "0.9.7": {
-    "node_abi": 10,
-    "v8": "3.15"
-  },
-  "0.9.8": {
-    "node_abi": 10,
-    "v8": "3.15"
-  },
-  "0.9.9": {
-    "node_abi": 11,
-    "v8": "3.15"
-  },
-  "0.9.10": {
-    "node_abi": 11,
-    "v8": "3.15"
-  },
-  "0.9.11": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.9.12": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.0": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.1": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.2": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.3": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.4": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.5": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.6": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.7": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.8": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.9": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.10": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.11": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.12": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.13": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.14": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.15": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.16": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.17": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.18": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.19": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.20": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.21": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.22": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.23": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.24": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.25": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.26": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.27": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.28": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.29": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.30": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.31": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.32": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.33": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.34": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.35": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.36": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.37": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.38": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.39": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.40": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.41": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.42": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.43": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.44": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.45": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.10.46": {
-    "node_abi": 11,
-    "v8": "3.14"
-  },
-  "0.11.0": {
-    "node_abi": 12,
-    "v8": "3.17"
-  },
-  "0.11.1": {
-    "node_abi": 12,
-    "v8": "3.18"
-  },
-  "0.11.2": {
-    "node_abi": 12,
-    "v8": "3.19"
-  },
-  "0.11.3": {
-    "node_abi": 12,
-    "v8": "3.19"
-  },
-  "0.11.4": {
-    "node_abi": 12,
-    "v8": "3.20"
-  },
-  "0.11.5": {
-    "node_abi": 12,
-    "v8": "3.20"
-  },
-  "0.11.6": {
-    "node_abi": 12,
-    "v8": "3.20"
-  },
-  "0.11.7": {
-    "node_abi": 12,
-    "v8": "3.20"
-  },
-  "0.11.8": {
-    "node_abi": 13,
-    "v8": "3.21"
-  },
-  "0.11.9": {
-    "node_abi": 13,
-    "v8": "3.22"
-  },
-  "0.11.10": {
-    "node_abi": 13,
-    "v8": "3.22"
-  },
-  "0.11.11": {
-    "node_abi": 14,
-    "v8": "3.22"
-  },
-  "0.11.12": {
-    "node_abi": 14,
-    "v8": "3.22"
-  },
-  "0.11.13": {
-    "node_abi": 14,
-    "v8": "3.25"
-  },
-  "0.11.14": {
-    "node_abi": 14,
-    "v8": "3.26"
-  },
-  "0.11.15": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.11.16": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.0": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.1": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.2": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.3": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.4": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.5": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.6": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.7": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.8": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.9": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.10": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.11": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.12": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.13": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.14": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "0.12.15": {
-    "node_abi": 14,
-    "v8": "3.28"
-  },
-  "1.0.0": {
-    "node_abi": 42,
-    "v8": "3.31"
-  },
-  "1.0.1": {
-    "node_abi": 42,
-    "v8": "3.31"
-  },
-  "1.0.2": {
-    "node_abi": 42,
-    "v8": "3.31"
-  },
-  "1.0.3": {
-    "node_abi": 42,
-    "v8": "4.1"
-  },
-  "1.0.4": {
-    "node_abi": 42,
-    "v8": "4.1"
-  },
-  "1.1.0": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.2.0": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.3.0": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.4.1": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.4.2": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.4.3": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.5.0": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.5.1": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.6.0": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.6.1": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.6.2": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.6.3": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.6.4": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.7.1": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.8.1": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.8.2": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.8.3": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "1.8.4": {
-    "node_abi": 43,
-    "v8": "4.1"
-  },
-  "2.0.0": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.0.1": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.0.2": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.1.0": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.2.0": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.2.1": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.3.0": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.3.1": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.3.2": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.3.3": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.3.4": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.4.0": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "2.5.0": {
-    "node_abi": 44,
-    "v8": "4.2"
-  },
-  "3.0.0": {
-    "node_abi": 45,
-    "v8": "4.4"
-  },
-  "3.1.0": {
-    "node_abi": 45,
-    "v8": "4.4"
-  },
-  "3.2.0": {
-    "node_abi": 45,
-    "v8": "4.4"
-  },
-  "3.3.0": {
-    "node_abi": 45,
-    "v8": "4.4"
-  },
-  "3.3.1": {
-    "node_abi": 45,
-    "v8": "4.4"
-  },
-  "4.0.0": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.1.0": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.1.1": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.1.2": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.2.0": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.2.1": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.2.2": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.2.3": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.2.4": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.2.5": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.2.6": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.3.0": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.3.1": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.3.2": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.4.0": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.4.1": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.4.2": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.4.3": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.4.4": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.4.5": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "4.4.6": {
-    "node_abi": 46,
-    "v8": "4.5"
-  },
-  "5.0.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.1.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.1.1": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.2.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.3.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.4.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.4.1": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.5.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.6.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.7.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.7.1": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.8.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.9.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.9.1": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.10.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.10.1": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.11.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.11.1": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "5.12.0": {
-    "node_abi": 47,
-    "v8": "4.6"
-  },
-  "6.0.0": {
-    "node_abi": 48,
-    "v8": "5.0"
-  },
-  "6.1.0": {
-    "node_abi": 48,
-    "v8": "5.0"
-  },
-  "6.2.0": {
-    "node_abi": 48,
-    "v8": "5.0"
-  },
-  "6.2.1": {
-    "node_abi": 48,
-    "v8": "5.0"
-  },
-  "6.2.2": {
-    "node_abi": 48,
-    "v8": "5.0"
-  }
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/compile.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/compile.js
deleted file mode 100644
index 0dc460cbf46d5e9b387090daaccaeb1dc4f125fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/compile.js
+++ /dev/null
@@ -1,87 +0,0 @@
-"use strict";
-
-module.exports = exports;
-
-var fs = require('fs');
-var path = require('path');
-var win = process.platform == 'win32';
-var existsSync = fs.existsSync || path.existsSync;
-var cp = require('child_process');
-
-// try to build up the complete path to node-gyp
-/* priority:
-  - node-gyp on ENV:npm_config_node_gyp (https://github.com/npm/npm/pull/4887)
-  - node-gyp on NODE_PATH
-  - node-gyp inside npm on NODE_PATH (ignore on iojs)
-  - node-gyp inside npm beside node exe
-*/
-function which_node_gyp() {
-    var node_gyp_bin;
-    if (process.env.npm_config_node_gyp) {
-      try {
-          node_gyp_bin = process.env.npm_config_node_gyp;
-          if (existsSync(node_gyp_bin)) {
-              return node_gyp_bin;
-          }
-      } catch (err) { }
-    }
-    try {
-        var node_gyp_main = require.resolve('node-gyp');
-        node_gyp_bin = path.join(path.dirname(
-                                     path.dirname(node_gyp_main)),
-                                     'bin/node-gyp.js');
-        if (existsSync(node_gyp_bin)) {
-            return node_gyp_bin;
-        }
-    } catch (err) { }
-    if (process.execPath.indexOf('iojs') === -1) {
-        try {
-            var npm_main = require.resolve('npm');
-            node_gyp_bin = path.join(path.dirname(
-                                         path.dirname(npm_main)),
-                                         'node_modules/node-gyp/bin/node-gyp.js');
-            if (existsSync(node_gyp_bin)) {
-                return node_gyp_bin;
-            }
-        } catch (err) { }
-    }
-    var npm_base = path.join(path.dirname(
-                             path.dirname(process.execPath)),
-                             'lib/node_modules/npm/');
-    node_gyp_bin = path.join(npm_base, 'node_modules/node-gyp/bin/node-gyp.js');
-    if (existsSync(node_gyp_bin)) {
-        return node_gyp_bin;
-    }
-}
-
-module.exports.run_gyp = function(args,opts,callback) {
-    var shell_cmd = '';
-    var cmd_args = [];
-    if (opts.runtime && opts.runtime == 'node-webkit') {
-        shell_cmd = 'nw-gyp';
-        if (win) shell_cmd += '.cmd';
-    } else {
-        var node_gyp_path = which_node_gyp();
-        if (node_gyp_path) {
-            shell_cmd = process.execPath;
-            cmd_args.push(node_gyp_path);
-        } else {
-            shell_cmd = 'node-gyp';
-            if (win) shell_cmd += '.cmd';
-        }
-    }
-    var final_args = cmd_args.concat(args);
-    var cmd = cp.spawn(shell_cmd, final_args, {cwd: undefined, env: process.env, stdio: [ 0, 1, 2]});
-    cmd.on('error', function (err) {
-        if (err) {
-            return callback(new Error("Failed to execute '" + shell_cmd + ' ' + final_args.join(' ') + "' (" + err + ")"));
-        }
-        callback(null,opts);
-    });
-    cmd.on('close', function (code) {
-        if (code && code !== 0) {
-            return callback(new Error("Failed to execute '" + shell_cmd + ' ' + final_args.join(' ') + "' (" + code + ")"));
-        }
-        callback(null,opts);
-    });
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/handle_gyp_opts.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/handle_gyp_opts.js
deleted file mode 100644
index 39fe1a28e0999be1f2364e7a6b985a08c4460d36..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/handle_gyp_opts.js
+++ /dev/null
@@ -1,94 +0,0 @@
-"use strict";
-
-module.exports = exports = handle_gyp_opts;
-
-var fs = require('fs');
-var versioning = require('./versioning.js');
-
-/*
-
-Here we gather node-pre-gyp generated options (from versioning) and pass them along to node-gyp.
-
-We massage the args and options slightly to account for differences in what commands mean between
-node-pre-gyp and node-gyp (e.g. see the difference between "build" and "rebuild" below)
-
-Keep in mind: the values inside `argv` and `gyp.opts` below are different depending on whether
-node-pre-gyp is called directory, or if it is called in a `run-script` phase of npm.
-
-We also try to preserve any command line options that might have been passed to npm or node-pre-gyp.
-But this is fairly difficult without passing way to much through. For example `gyp.opts` contains all
-the process.env and npm pushes a lot of variables into process.env which node-pre-gyp inherits. So we have
-to be very selective about what we pass through.
-
-For example:
-
-`npm install --build-from-source` will give:
-
-argv == [ 'rebuild' ]
-gyp.opts.argv == { remain: [ 'install' ],
-  cooked: [ 'install', '--fallback-to-build' ],
-  original: [ 'install', '--fallback-to-build' ] }
-
-`./bin/node-pre-gyp build` will give:
-
-argv == []
-gyp.opts.argv == { remain: [ 'build' ],
-  cooked: [ 'build' ],
-  original: [ '-C', 'test/app1', 'build' ] }
-
-*/
-
-// select set of node-pre-gyp versioning info
-// to share with node-gyp
-var share_with_node_gyp = [
-  'module',
-  'module_name',
-  'module_path',
-];
-
-function handle_gyp_opts(gyp, argv, callback) {
-
-    // Collect node-pre-gyp specific variables to pass to node-gyp
-    var node_pre_gyp_options = [];
-    // generate custom node-pre-gyp versioning info
-    var opts = versioning.evaluate(JSON.parse(fs.readFileSync('./package.json')), gyp.opts);
-    share_with_node_gyp.forEach(function(key) {
-        var val = opts[key];
-        if (val) {
-            node_pre_gyp_options.push('--' + key + '=' + val);
-        } else {
-            return callback(new Error("Option " + key + " required but not found by node-pre-gyp"));
-        }
-    });
-
-    // Collect options that follow the special -- which disables nopt parsing
-    var unparsed_options = [];
-    var double_hyphen_found = false;
-    gyp.opts.argv.original.forEach(function(opt) {
-        if (double_hyphen_found) {
-            unparsed_options.push(opt);
-        }
-        if (opt == '--') {
-            double_hyphen_found = true;
-        }
-    });
-
-    // We try respect and pass through remaining command
-    // line options (like --foo=bar) to node-gyp
-    var cooked = gyp.opts.argv.cooked;
-    var node_gyp_options = [];
-    cooked.forEach(function(value) {
-        if (value.length > 2 && value.slice(0,2) == '--') {
-            var key = value.slice(2);
-            var val = cooked[cooked.indexOf(value)+1];
-            if (val && val.indexOf('--') === -1) { // handle '--foo=bar' or ['--foo','bar']
-                node_gyp_options.push('--' + key + '=' + val);
-            } else { // pass through --foo
-                node_gyp_options.push(value);
-            }
-        }
-    });
-
-    var result = {'opts':opts,'gyp':node_gyp_options,'pre':node_pre_gyp_options,'unparsed':unparsed_options};
-    return callback(null,result);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/index.html b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/index.html
deleted file mode 100644
index 244466c4c5067c99fb4da2b44ca08b93b2785105..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/index.html
+++ /dev/null
@@ -1,26 +0,0 @@
-<!doctype html>
-<html>
-<head>
-<meta charset="utf-8">
-<title>Node-webkit-based module test</title>
-<script>
-function nwModuleTest(){
-   var util = require('util');
-   var moduleFolder = require('nw.gui').App.argv[0];
-   try {
-      require(moduleFolder);
-   } catch(e) {
-      if( process.platform !== 'win32' ){
-         util.log('nw-pre-gyp error:');
-         util.log(e.stack);
-      }
-      process.exit(1);
-   }
-   process.exit(0);
-}
-</script>
-</head>
-<body onload="nwModuleTest()">
-<h1>Node-webkit-based module test</h1>
-</body>
-</html>
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/package.json
deleted file mode 100644
index 71d03f8226c1a7d3f59ae4e9667f7e4214184a34..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/nw-pre-gyp/package.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-"main": "index.html",
-"name": "nw-pre-gyp-module-test",
-"description": "Node-webkit-based module test.",
-"version": "0.0.1",
-"window": {
-   "show": false
-}
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/s3_setup.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/s3_setup.js
deleted file mode 100644
index 5bc42e96cbff83bd045724578fb1663514247ce3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/s3_setup.js
+++ /dev/null
@@ -1,27 +0,0 @@
-"use strict";
-
-module.exports = exports;
-
-var url = require('url');
-
-var URI_REGEX="^(.*)\.(s3(?:-.*)?)\.amazonaws\.com$";
-
-module.exports.detect = function(to,config) {
-    var uri = url.parse(to);
-    var hostname_matches = uri.hostname.match(URI_REGEX);
-    config.prefix = (!uri.pathname || uri.pathname == '/') ? '' : uri.pathname.replace('/','');
-    if(!hostname_matches) {
-        return;
-    }
-    if (!config.bucket) {
-        config.bucket = hostname_matches[1];
-    }
-    if (!config.region) {
-        var s3_domain = hostname_matches[2];
-        if (s3_domain.slice(0,3) == 's3-' &&
-            s3_domain.length >= 3) {
-            // it appears the region is explicit in the url
-            config.region = s3_domain.replace('s3-','');
-        }
-    }
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/versioning.js b/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/versioning.js
deleted file mode 100644
index 8ebbe3a361d4f16ff7624ca8652d15657f1f9c45..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/lib/util/versioning.js
+++ /dev/null
@@ -1,308 +0,0 @@
-"use strict";
-
-module.exports = exports;
-
-var path = require('path');
-var semver = require('semver');
-var url = require('url');
-
-var abi_crosswalk;
-
-// This is used for unit testing to provide a fake
-// ABI crosswalk that emulates one that is not updated
-// for the current version
-if (process.env.NODE_PRE_GYP_ABI_CROSSWALK) {
-    abi_crosswalk = require(process.env.NODE_PRE_GYP_ABI_CROSSWALK);
-} else {
-    abi_crosswalk = require('./abi_crosswalk.json');
-}
-
-function get_electron_abi(runtime, target_version) {
-    if (!runtime) {
-        throw new Error("get_electron_abi requires valid runtime arg");
-    }
-    if (typeof target_version === 'undefined') {
-        // erroneous CLI call
-        throw new Error("Empty target version is not supported if electron is the target.");
-    }
-    // Electron guarantees that patch version update won't break native modules.
-    var sem_ver = semver.parse(target_version);
-    return runtime + '-v' + sem_ver.major + '.' + sem_ver.minor;
-}
-module.exports.get_electron_abi = get_electron_abi;
-
-function get_node_webkit_abi(runtime, target_version) {
-    if (!runtime) {
-        throw new Error("get_node_webkit_abi requires valid runtime arg");
-    }
-    if (typeof target_version === 'undefined') {
-        // erroneous CLI call
-        throw new Error("Empty target version is not supported if node-webkit is the target.");
-    }
-    return runtime + '-v' + target_version;
-}
-module.exports.get_node_webkit_abi = get_node_webkit_abi;
-
-function get_node_abi(runtime, versions) {
-    if (!runtime) {
-        throw new Error("get_node_abi requires valid runtime arg");
-    }
-    if (!versions) {
-        throw new Error("get_node_abi requires valid process.versions object");
-    }
-    var sem_ver = semver.parse(versions.node);
-    if (sem_ver.major === 0 && sem_ver.minor % 2) { // odd series
-        // https://github.com/mapbox/node-pre-gyp/issues/124
-        return runtime+'-v'+versions.node;
-    } else {
-        // process.versions.modules added in >= v0.10.4 and v0.11.7
-        // https://github.com/joyent/node/commit/ccabd4a6fa8a6eb79d29bc3bbe9fe2b6531c2d8e
-        return versions.modules ? runtime+'-v' + (+versions.modules) :
-            'v8-' + versions.v8.split('.').slice(0,2).join('.');
-    }
-}
-module.exports.get_node_abi = get_node_abi;
-
-function get_runtime_abi(runtime, target_version) {
-    if (!runtime) {
-        throw new Error("get_runtime_abi requires valid runtime arg");
-    }
-    if (runtime === 'node-webkit') {
-        return get_node_webkit_abi(runtime, target_version || process.versions['node-webkit']);
-    } else if (runtime === 'electron') {
-        return get_electron_abi(runtime, target_version || process.versions.electron);
-    } else {
-        if (runtime != 'node') {
-            throw new Error("Unknown Runtime: '" + runtime + "'");
-        }
-        if (!target_version) {
-            return get_node_abi(runtime,process.versions);
-        } else {
-            var cross_obj;
-            // abi_crosswalk generated with ./scripts/abi_crosswalk.js
-            if (abi_crosswalk[target_version]) {
-                cross_obj = abi_crosswalk[target_version];
-            } else {
-                var target_parts = target_version.split('.').map(function(i) { return +i; });
-                if (target_parts.length != 3) { // parse failed
-                    throw new Error("Unknown target version: " + target_version);
-                }
-                /*
-                    The below code tries to infer the last known ABI compatible version
-                    that we have recorded in the abi_crosswalk.json when an exact match
-                    is not possible. The reasons for this to exist are complicated:
-
-                       - We support passing --target to be able to allow developers to package binaries for versions of node
-                         that are not the same one as they are running. This might also be used in combination with the
-                         --target_arch or --target_platform flags to also package binaries for alternative platforms
-                       - When --target is passed we can't therefore determine the ABI (process.versions.modules) from the node
-                         version that is running in memory
-                       - So, therefore node-pre-gyp keeps an "ABI crosswalk" (lib/util/abi_crosswalk.json) to be able to look
-                         this info up for all versions
-                       - But we cannot easily predict what the future ABI will be for released versions
-                       - And node-pre-gyp needs to be a `bundledDependency` in apps that depend on it in order to work correctly
-                         by being fully available at install time.
-                       - So, the speed of node releases and the bundled nature of node-pre-gyp mean that a new node-pre-gyp release
-                         need to happen for every node.js/io.js/node-webkit/nw.js/atom-shell/etc release that might come online if
-                         you want the `--target` flag to keep working for the latest version
-                       - Which is impractical ^^
-                       - Hence the below code guesses about future ABI to make the need to update node-pre-gyp less demanding.
-
-                    In practice then you can have a dependency of your app like `node-sqlite3` that bundles a `node-pre-gyp` that
-                    only knows about node v0.10.33 in the `abi_crosswalk.json` but target node v0.10.34 (which is assumed to be
-                    ABI compatible with v0.10.33).
-
-                    TODO: use semver module instead of custom version parsing
-                */
-                var major = target_parts[0];
-                var minor = target_parts[1];
-                var patch = target_parts[2];
-                // io.js: yeah if node.js ever releases 1.x this will break
-                // but that is unlikely to happen: https://github.com/iojs/io.js/pull/253#issuecomment-69432616
-                if (major === 1) {
-                    // look for last release that is the same major version
-                    // e.g. we assume io.js 1.x is ABI compatible with >= 1.0.0
-                    while (true) {
-                        if (minor > 0) --minor;
-                        if (patch > 0) --patch;
-                        var new_iojs_target = '' + major + '.' + minor + '.' + patch;
-                        if (abi_crosswalk[new_iojs_target]) {
-                            cross_obj = abi_crosswalk[new_iojs_target];
-                            console.log('Warning: node-pre-gyp could not find exact match for ' + target_version);
-                            console.log('Warning: but node-pre-gyp successfully choose ' + new_iojs_target + ' as ABI compatible target');
-                            break;
-                        }
-                        if (minor === 0 && patch === 0) {
-                            break;
-                        }
-                    }
-                } else if (major === 0) { // node.js
-                    if (target_parts[1] % 2 === 0) { // for stable/even node.js series
-                        // look for the last release that is the same minor release
-                        // e.g. we assume node 0.10.x is ABI compatible with >= 0.10.0
-                        while (--patch > 0) {
-                            var new_node_target = '' + major + '.' + minor + '.' + patch;
-                            if (abi_crosswalk[new_node_target]) {
-                                cross_obj = abi_crosswalk[new_node_target];
-                                console.log('Warning: node-pre-gyp could not find exact match for ' + target_version);
-                                console.log('Warning: but node-pre-gyp successfully choose ' + new_node_target + ' as ABI compatible target');
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-            if (!cross_obj) {
-                throw new Error("Unsupported target version: " + target_version);
-            }
-            // emulate process.versions
-            var versions_obj = {
-                node: target_version,
-                v8: cross_obj.v8+'.0',
-                // abi_crosswalk uses 1 for node versions lacking process.versions.modules
-                // process.versions.modules added in >= v0.10.4 and v0.11.7
-                modules: cross_obj.node_abi > 1 ? cross_obj.node_abi : undefined
-            };
-            return get_node_abi(runtime, versions_obj);
-        }
-    }
-}
-module.exports.get_runtime_abi = get_runtime_abi;
-
-var required_parameters = [
-    'module_name',
-    'module_path',
-    'host'
-];
-
-function validate_config(package_json) {
-    var msg = package_json.name + ' package.json is not node-pre-gyp ready:\n';
-    var missing = [];
-    if (!package_json.main) {
-        missing.push('main');
-    }
-    if (!package_json.version) {
-        missing.push('version');
-    }
-    if (!package_json.name) {
-        missing.push('name');
-    }
-    if (!package_json.binary) {
-        missing.push('binary');
-    }
-    var o = package_json.binary;
-    required_parameters.forEach(function(p) {
-        if (missing.indexOf('binary') > -1) {
-            missing.pop('binary');
-        }
-        if (!o || o[p] === undefined) {
-            missing.push('binary.' + p);
-        }
-    });
-    if (missing.length >= 1) {
-        throw new Error(msg+"package.json must declare these properties: \n" + missing.join('\n'));
-    }
-    if (o) {
-        // enforce https over http
-        var protocol = url.parse(o.host).protocol;
-        if (protocol === 'http:') {
-            throw new Error("'host' protocol ("+protocol+") is invalid - only 'https:' is accepted");
-        }
-    }
-}
-
-module.exports.validate_config = validate_config;
-
-function eval_template(template,opts) {
-    Object.keys(opts).forEach(function(key) {
-        var pattern = '{'+key+'}';
-        while (template.indexOf(pattern) > -1) {
-            template = template.replace(pattern,opts[key]);
-        }
-    });
-    return template;
-}
-
-// url.resolve needs single trailing slash
-// to behave correctly, otherwise a double slash
-// may end up in the url which breaks requests
-// and a lacking slash may not lead to proper joining
-function fix_slashes(pathname) {
-    if (pathname.slice(-1) != '/') {
-        return pathname + '/';
-    }
-    return pathname;
-}
-
-// remove double slashes
-// note: path.normalize will not work because
-// it will convert forward to back slashes
-function drop_double_slashes(pathname) {
-    return pathname.replace(/\/\//g,'/');
-}
-
-function get_process_runtime(versions) {
-    var runtime = 'node';
-    if (versions['node-webkit']) {
-        runtime = 'node-webkit';
-    } else if (versions.electron) {
-        runtime = 'electron';
-    }
-    return runtime;
-}
-
-module.exports.get_process_runtime = get_process_runtime;
-
-var default_package_name = '{module_name}-v{version}-{node_abi}-{platform}-{arch}.tar.gz';
-var default_remote_path = '';
-
-module.exports.evaluate = function(package_json,options) {
-    options = options || {};
-    validate_config(package_json);
-    var v = package_json.version;
-    var module_version = semver.parse(v);
-    var runtime = options.runtime || get_process_runtime(process.versions);
-    var opts = {
-        name: package_json.name,
-        configuration: Boolean(options.debug) ? 'Debug' : 'Release',
-        debug: options.debug,
-        module_name: package_json.binary.module_name,
-        version: module_version.version,
-        prerelease: module_version.prerelease.length ? module_version.prerelease.join('.') : '',
-        build: module_version.build.length ? module_version.build.join('.') : '',
-        major: module_version.major,
-        minor: module_version.minor,
-        patch: module_version.patch,
-        runtime: runtime,
-        node_abi: get_runtime_abi(runtime,options.target),
-        target: options.target || '',
-        platform: options.target_platform || process.platform,
-        target_platform: options.target_platform || process.platform,
-        arch: options.target_arch || process.arch,
-        target_arch: options.target_arch || process.arch,
-        module_main: package_json.main,
-        toolset : options.toolset || '' // address https://github.com/mapbox/node-pre-gyp/issues/119
-    };
-    // support host mirror with npm config `--{module_name}_binary_host_mirror`
-    // e.g.: https://github.com/node-inspector/v8-profiler/blob/master/package.json#L25
-    // > npm install v8-profiler --profiler_binary_host_mirror=https://npm.taobao.org/mirrors/node-inspector/
-    var host = process.env['npm_config_' + opts.module_name + '_binary_host_mirror'] || package_json.binary.host;
-    opts.host = fix_slashes(eval_template(host,opts));
-    opts.module_path = eval_template(package_json.binary.module_path,opts);
-    // now we resolve the module_path to ensure it is absolute so that binding.gyp variables work predictably
-    if (options.module_root) {
-        // resolve relative to known module root: works for pre-binding require
-        opts.module_path = path.join(options.module_root,opts.module_path);
-    } else {
-        // resolve relative to current working directory: works for node-pre-gyp commands
-        opts.module_path = path.resolve(opts.module_path);
-    }
-    opts.module = path.join(opts.module_path,opts.module_name + '.node');
-    opts.remote_path = package_json.binary.remote_path ? drop_double_slashes(fix_slashes(eval_template(package_json.binary.remote_path,opts))) : default_remote_path;
-    var package_name = package_json.binary.package_name ? package_json.binary.package_name : default_package_name;
-    opts.package_name = eval_template(package_name,opts);
-    opts.staged_tarball = path.join('build/stage',opts.remote_path,opts.package_name);
-    opts.hosted_path = url.resolve(opts.host,opts.remote_path);
-    opts.hosted_tarball = url.resolve(opts.hosted_path,opts.package_name);
-    return opts;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/mkdirp b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/mkdirp
deleted file mode 120000
index 017896cebb14168f03f019eb2ca3acb3cac65afb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/mkdirp
+++ /dev/null
@@ -1 +0,0 @@
-../mkdirp/bin/cmd.js
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/nopt b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/nopt
deleted file mode 120000
index 6b6566ea7febba5ef6355fb774abeeba134ca1cb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/nopt
+++ /dev/null
@@ -1 +0,0 @@
-../nopt/bin/nopt.js
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/rc b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/rc
deleted file mode 120000
index a3f6fc7f1551b93ba35a5487e59ff916c45e1afe..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/rc
+++ /dev/null
@@ -1 +0,0 @@
-../rc/index.js
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/rimraf b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/rimraf
deleted file mode 120000
index 4cd49a49ddfc17a0c038a9c11d3abbb8181dc025..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/rimraf
+++ /dev/null
@@ -1 +0,0 @@
-../rimraf/bin.js
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/semver b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/semver
deleted file mode 120000
index 317eb293d8e125968256d4819f26caf2343475c4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/.bin/semver
+++ /dev/null
@@ -1 +0,0 @@
-../semver/bin/semver
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/.travis.yml
deleted file mode 100644
index 74c57bf15e23917bbae91364bf06534930d0fbf6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
-  - "0.12"
-  - "iojs"
-before_install:
-  - npm install -g npm@~1.4.6
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/LICENSE
deleted file mode 100644
index 432d1aeb01df666910230893f78e0d1ee7635a61..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-Copyright 2010 James Halliday (mail@substack.net)
-
-This project is free software released under the MIT/X11 license:
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/bin/cmd.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/bin/cmd.js
deleted file mode 100755
index d95de15ae9743fc3b9e901d6fa6e8e1876c630cf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/bin/cmd.js
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/usr/bin/env node
-
-var mkdirp = require('../');
-var minimist = require('minimist');
-var fs = require('fs');
-
-var argv = minimist(process.argv.slice(2), {
-    alias: { m: 'mode', h: 'help' },
-    string: [ 'mode' ]
-});
-if (argv.help) {
-    fs.createReadStream(__dirname + '/usage.txt').pipe(process.stdout);
-    return;
-}
-
-var paths = argv._.slice();
-var mode = argv.mode ? parseInt(argv.mode, 8) : undefined;
-
-(function next () {
-    if (paths.length === 0) return;
-    var p = paths.shift();
-    
-    if (mode === undefined) mkdirp(p, cb)
-    else mkdirp(p, mode, cb)
-    
-    function cb (err) {
-        if (err) {
-            console.error(err.message);
-            process.exit(1);
-        }
-        else next();
-    }
-})();
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/bin/usage.txt b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/bin/usage.txt
deleted file mode 100644
index f952aa2c7a979e7ccb2ef81b7b5010b26b6b9e53..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/bin/usage.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-usage: mkdirp [DIR1,DIR2..] {OPTIONS}
-
-  Create each supplied directory including any necessary parent directories that
-  don't yet exist.
-  
-  If the directory already exists, do nothing.
-
-OPTIONS are:
-
-  -m, --mode   If a directory needs to be created, set the mode as an octal
-               permission string.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/examples/pow.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/examples/pow.js
deleted file mode 100644
index e6924212e6a244ea46c330d1866087b98d16e66f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/examples/pow.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var mkdirp = require('mkdirp');
-
-mkdirp('/tmp/foo/bar/baz', function (err) {
-    if (err) console.error(err)
-    else console.log('pow!')
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/index.js
deleted file mode 100644
index 6ce241b58c100f718d59901eac3d4892abb8c360..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/index.js
+++ /dev/null
@@ -1,98 +0,0 @@
-var path = require('path');
-var fs = require('fs');
-var _0777 = parseInt('0777', 8);
-
-module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;
-
-function mkdirP (p, opts, f, made) {
-    if (typeof opts === 'function') {
-        f = opts;
-        opts = {};
-    }
-    else if (!opts || typeof opts !== 'object') {
-        opts = { mode: opts };
-    }
-    
-    var mode = opts.mode;
-    var xfs = opts.fs || fs;
-    
-    if (mode === undefined) {
-        mode = _0777 & (~process.umask());
-    }
-    if (!made) made = null;
-    
-    var cb = f || function () {};
-    p = path.resolve(p);
-    
-    xfs.mkdir(p, mode, function (er) {
-        if (!er) {
-            made = made || p;
-            return cb(null, made);
-        }
-        switch (er.code) {
-            case 'ENOENT':
-                mkdirP(path.dirname(p), opts, function (er, made) {
-                    if (er) cb(er, made);
-                    else mkdirP(p, opts, cb, made);
-                });
-                break;
-
-            // In the case of any other error, just see if there's a dir
-            // there already.  If so, then hooray!  If not, then something
-            // is borked.
-            default:
-                xfs.stat(p, function (er2, stat) {
-                    // if the stat fails, then that's super weird.
-                    // let the original error be the failure reason.
-                    if (er2 || !stat.isDirectory()) cb(er, made)
-                    else cb(null, made);
-                });
-                break;
-        }
-    });
-}
-
-mkdirP.sync = function sync (p, opts, made) {
-    if (!opts || typeof opts !== 'object') {
-        opts = { mode: opts };
-    }
-    
-    var mode = opts.mode;
-    var xfs = opts.fs || fs;
-    
-    if (mode === undefined) {
-        mode = _0777 & (~process.umask());
-    }
-    if (!made) made = null;
-
-    p = path.resolve(p);
-
-    try {
-        xfs.mkdirSync(p, mode);
-        made = made || p;
-    }
-    catch (err0) {
-        switch (err0.code) {
-            case 'ENOENT' :
-                made = sync(path.dirname(p), opts, made);
-                sync(p, opts, made);
-                break;
-
-            // In the case of any other error, just see if there's a dir
-            // there already.  If so, then hooray!  If not, then something
-            // is borked.
-            default:
-                var stat;
-                try {
-                    stat = xfs.statSync(p);
-                }
-                catch (err1) {
-                    throw err0;
-                }
-                if (!stat.isDirectory()) throw err0;
-                break;
-        }
-    }
-
-    return made;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/.travis.yml
deleted file mode 100644
index cc4dba29d959a2da7b97f9edd3c7c91384b2ee5b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/LICENSE
deleted file mode 100644
index ee27ba4b4412b0e4a05af5e3d8a005bc6681fdf3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-This software is released under the MIT license:
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/example/parse.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/example/parse.js
deleted file mode 100644
index abff3e8ee8f5ef2ae2be753252ca8382a42a38f1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/example/parse.js
+++ /dev/null
@@ -1,2 +0,0 @@
-var argv = require('../')(process.argv.slice(2));
-console.dir(argv);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/index.js
deleted file mode 100644
index 584f551a6da7343249fbb9bd2fe9082298e7c119..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/index.js
+++ /dev/null
@@ -1,187 +0,0 @@
-module.exports = function (args, opts) {
-    if (!opts) opts = {};
-    
-    var flags = { bools : {}, strings : {} };
-    
-    [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
-        flags.bools[key] = true;
-    });
-    
-    [].concat(opts.string).filter(Boolean).forEach(function (key) {
-        flags.strings[key] = true;
-    });
-    
-    var aliases = {};
-    Object.keys(opts.alias || {}).forEach(function (key) {
-        aliases[key] = [].concat(opts.alias[key]);
-        aliases[key].forEach(function (x) {
-            aliases[x] = [key].concat(aliases[key].filter(function (y) {
-                return x !== y;
-            }));
-        });
-    });
-    
-    var defaults = opts['default'] || {};
-    
-    var argv = { _ : [] };
-    Object.keys(flags.bools).forEach(function (key) {
-        setArg(key, defaults[key] === undefined ? false : defaults[key]);
-    });
-    
-    var notFlags = [];
-
-    if (args.indexOf('--') !== -1) {
-        notFlags = args.slice(args.indexOf('--')+1);
-        args = args.slice(0, args.indexOf('--'));
-    }
-
-    function setArg (key, val) {
-        var value = !flags.strings[key] && isNumber(val)
-            ? Number(val) : val
-        ;
-        setKey(argv, key.split('.'), value);
-        
-        (aliases[key] || []).forEach(function (x) {
-            setKey(argv, x.split('.'), value);
-        });
-    }
-    
-    for (var i = 0; i < args.length; i++) {
-        var arg = args[i];
-        
-        if (/^--.+=/.test(arg)) {
-            // Using [\s\S] instead of . because js doesn't support the
-            // 'dotall' regex modifier. See:
-            // http://stackoverflow.com/a/1068308/13216
-            var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
-            setArg(m[1], m[2]);
-        }
-        else if (/^--no-.+/.test(arg)) {
-            var key = arg.match(/^--no-(.+)/)[1];
-            setArg(key, false);
-        }
-        else if (/^--.+/.test(arg)) {
-            var key = arg.match(/^--(.+)/)[1];
-            var next = args[i + 1];
-            if (next !== undefined && !/^-/.test(next)
-            && !flags.bools[key]
-            && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
-                setArg(key, next);
-                i++;
-            }
-            else if (/^(true|false)$/.test(next)) {
-                setArg(key, next === 'true');
-                i++;
-            }
-            else {
-                setArg(key, flags.strings[key] ? '' : true);
-            }
-        }
-        else if (/^-[^-]+/.test(arg)) {
-            var letters = arg.slice(1,-1).split('');
-            
-            var broken = false;
-            for (var j = 0; j < letters.length; j++) {
-                var next = arg.slice(j+2);
-                
-                if (next === '-') {
-                    setArg(letters[j], next)
-                    continue;
-                }
-                
-                if (/[A-Za-z]/.test(letters[j])
-                && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
-                    setArg(letters[j], next);
-                    broken = true;
-                    break;
-                }
-                
-                if (letters[j+1] && letters[j+1].match(/\W/)) {
-                    setArg(letters[j], arg.slice(j+2));
-                    broken = true;
-                    break;
-                }
-                else {
-                    setArg(letters[j], flags.strings[letters[j]] ? '' : true);
-                }
-            }
-            
-            var key = arg.slice(-1)[0];
-            if (!broken && key !== '-') {
-                if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
-                && !flags.bools[key]
-                && (aliases[key] ? !flags.bools[aliases[key]] : true)) {
-                    setArg(key, args[i+1]);
-                    i++;
-                }
-                else if (args[i+1] && /true|false/.test(args[i+1])) {
-                    setArg(key, args[i+1] === 'true');
-                    i++;
-                }
-                else {
-                    setArg(key, flags.strings[key] ? '' : true);
-                }
-            }
-        }
-        else {
-            argv._.push(
-                flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
-            );
-        }
-    }
-    
-    Object.keys(defaults).forEach(function (key) {
-        if (!hasKey(argv, key.split('.'))) {
-            setKey(argv, key.split('.'), defaults[key]);
-            
-            (aliases[key] || []).forEach(function (x) {
-                setKey(argv, x.split('.'), defaults[key]);
-            });
-        }
-    });
-    
-    notFlags.forEach(function(key) {
-        argv._.push(key);
-    });
-
-    return argv;
-};
-
-function hasKey (obj, keys) {
-    var o = obj;
-    keys.slice(0,-1).forEach(function (key) {
-        o = (o[key] || {});
-    });
-
-    var key = keys[keys.length - 1];
-    return key in o;
-}
-
-function setKey (obj, keys, value) {
-    var o = obj;
-    keys.slice(0,-1).forEach(function (key) {
-        if (o[key] === undefined) o[key] = {};
-        o = o[key];
-    });
-    
-    var key = keys[keys.length - 1];
-    if (o[key] === undefined || typeof o[key] === 'boolean') {
-        o[key] = value;
-    }
-    else if (Array.isArray(o[key])) {
-        o[key].push(value);
-    }
-    else {
-        o[key] = [ o[key], value ];
-    }
-}
-
-function isNumber (x) {
-    if (typeof x === 'number') return true;
-    if (/^0x[0-9a-f]+$/i.test(x)) return true;
-    return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
-}
-
-function longest (xs) {
-    return Math.max.apply(null, xs.map(function (x) { return x.length }));
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/package.json
deleted file mode 100644
index a07e8ab8883107c3c11e2ab13db1f42fb0201254..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/package.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "_from": "minimist@0.0.8",
-  "_id": "minimist@0.0.8",
-  "_location": "/serialport/node-pre-gyp/mkdirp/minimist",
-  "_npmUser": {
-    "email": "mail@substack.net",
-    "name": "substack"
-  },
-  "_npmVersion": "1.4.3",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/mkdirp"
-  ],
-  "_resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-  "_shasum": "857fcabfc3397d2625b8228262e86aa7a011b05d",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@substack.net",
-    "name": "James Halliday",
-    "url": "http://substack.net"
-  },
-  "bugs": {
-    "url": "https://github.com/substack/minimist/issues"
-  },
-  "dependencies": {},
-  "description": "parse argument options",
-  "devDependencies": {
-    "tap": "~0.4.0",
-    "tape": "~1.0.4"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "857fcabfc3397d2625b8228262e86aa7a011b05d",
-    "tarball": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz"
-  },
-  "homepage": "https://github.com/substack/minimist",
-  "keywords": [
-    "argv",
-    "getopt",
-    "optimist",
-    "parser"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "substack",
-      "email": "mail@substack.net"
-    }
-  ],
-  "name": "minimist",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/substack/minimist.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "testling": {
-    "browsers": [
-      "chrome/10",
-      "chrome/latest",
-      "ff/5",
-      "firefox/latest",
-      "ie/6..latest",
-      "opera/12",
-      "safari/5.1",
-      "safari/latest"
-    ],
-    "files": "test/*.js"
-  },
-  "version": "0.0.8"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/readme.markdown b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/readme.markdown
deleted file mode 100644
index c25635323e1661a52657843dae31fedcb2457cbe..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/readme.markdown
+++ /dev/null
@@ -1,73 +0,0 @@
-# minimist
-
-parse argument options
-
-This module is the guts of optimist's argument parser without all the
-fanciful decoration.
-
-[![browser support](https://ci.testling.com/substack/minimist.png)](http://ci.testling.com/substack/minimist)
-
-[![build status](https://secure.travis-ci.org/substack/minimist.png)](http://travis-ci.org/substack/minimist)
-
-# example
-
-``` js
-var argv = require('minimist')(process.argv.slice(2));
-console.dir(argv);
-```
-
-```
-$ node example/parse.js -a beep -b boop
-{ _: [], a: 'beep', b: 'boop' }
-```
-
-```
-$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
-{ _: [ 'foo', 'bar', 'baz' ],
-  x: 3,
-  y: 4,
-  n: 5,
-  a: true,
-  b: true,
-  c: true,
-  beep: 'boop' }
-```
-
-# methods
-
-``` js
-var parseArgs = require('minimist')
-```
-
-## var argv = parseArgs(args, opts={})
-
-Return an argument object `argv` populated with the array arguments from `args`.
-
-`argv._` contains all the arguments that didn't have an option associated with
-them.
-
-Numeric-looking arguments will be returned as numbers unless `opts.string` or
-`opts.boolean` is set for that argument name.
-
-Any arguments after `'--'` will not be parsed and will end up in `argv._`.
-
-options can be:
-
-* `opts.string` - a string or array of strings argument names to always treat as
-strings
-* `opts.boolean` - a string or array of strings to always treat as booleans
-* `opts.alias` - an object mapping string names to strings or arrays of string
-argument names to use as aliases
-* `opts.default` - an object mapping string argument names to default values
-
-# install
-
-With [npm](https://npmjs.org) do:
-
-```
-npm install minimist
-```
-
-# license
-
-MIT
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dash.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dash.js
deleted file mode 100644
index 8b034b99a9eace163a76e61e091345678026cd13..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dash.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('-', function (t) {
-    t.plan(5);
-    t.deepEqual(parse([ '-n', '-' ]), { n: '-', _: [] });
-    t.deepEqual(parse([ '-' ]), { _: [ '-' ] });
-    t.deepEqual(parse([ '-f-' ]), { f: '-', _: [] });
-    t.deepEqual(
-        parse([ '-b', '-' ], { boolean: 'b' }),
-        { b: true, _: [ '-' ] }
-    );
-    t.deepEqual(
-        parse([ '-s', '-' ], { string: 's' }),
-        { s: '-', _: [] }
-    );
-});
-
-test('-a -- b', function (t) {
-    t.plan(3);
-    t.deepEqual(parse([ '-a', '--', 'b' ]), { a: true, _: [ 'b' ] });
-    t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
-    t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/default_bool.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/default_bool.js
deleted file mode 100644
index f0041ee40cd05fbd643d8c3f9ce16e7f99389c35..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/default_bool.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var test = require('tape');
-var parse = require('../');
-
-test('boolean default true', function (t) {
-    var argv = parse([], {
-        boolean: 'sometrue',
-        default: { sometrue: true }
-    });
-    t.equal(argv.sometrue, true);
-    t.end();
-});
-
-test('boolean default false', function (t) {
-    var argv = parse([], {
-        boolean: 'somefalse',
-        default: { somefalse: false }
-    });
-    t.equal(argv.somefalse, false);
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dotted.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dotted.js
deleted file mode 100644
index ef0ae349bf3bf5335bf5ef721c90fa73e32dc192..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/dotted.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('dotted alias', function (t) {
-    var argv = parse(['--a.b', '22'], {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
-    t.equal(argv.a.b, 22);
-    t.equal(argv.aa.bb, 22);
-    t.end();
-});
-
-test('dotted default', function (t) {
-    var argv = parse('', {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
-    t.equal(argv.a.b, 11);
-    t.equal(argv.aa.bb, 11);
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/long.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/long.js
deleted file mode 100644
index 5d3a1e09d3b64ca2f00ce89e5d3447b4bcafb34e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/long.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var test = require('tape');
-var parse = require('../');
-
-test('long opts', function (t) {
-    t.deepEqual(
-        parse([ '--bool' ]),
-        { bool : true, _ : [] },
-        'long boolean'
-    );
-    t.deepEqual(
-        parse([ '--pow', 'xixxle' ]),
-        { pow : 'xixxle', _ : [] },
-        'long capture sp'
-    );
-    t.deepEqual(
-        parse([ '--pow=xixxle' ]),
-        { pow : 'xixxle', _ : [] },
-        'long capture eq'
-    );
-    t.deepEqual(
-        parse([ '--host', 'localhost', '--port', '555' ]),
-        { host : 'localhost', port : 555, _ : [] },
-        'long captures sp'
-    );
-    t.deepEqual(
-        parse([ '--host=localhost', '--port=555' ]),
-        { host : 'localhost', port : 555, _ : [] },
-        'long captures eq'
-    );
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse.js
deleted file mode 100644
index 8a90646696628e01e1785afdd241c9a2732d0555..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse.js
+++ /dev/null
@@ -1,318 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('parse args', function (t) {
-    t.deepEqual(
-        parse([ '--no-moo' ]),
-        { moo : false, _ : [] },
-        'no'
-    );
-    t.deepEqual(
-        parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]),
-        { v : ['a','b','c'], _ : [] },
-        'multi'
-    );
-    t.end();
-});
- 
-test('comprehensive', function (t) {
-    t.deepEqual(
-        parse([
-            '--name=meowmers', 'bare', '-cats', 'woo',
-            '-h', 'awesome', '--multi=quux',
-            '--key', 'value',
-            '-b', '--bool', '--no-meep', '--multi=baz',
-            '--', '--not-a-flag', 'eek'
-        ]),
-        {
-            c : true,
-            a : true,
-            t : true,
-            s : 'woo',
-            h : 'awesome',
-            b : true,
-            bool : true,
-            key : 'value',
-            multi : [ 'quux', 'baz' ],
-            meep : false,
-            name : 'meowmers',
-            _ : [ 'bare', '--not-a-flag', 'eek' ]
-        }
-    );
-    t.end();
-});
-
-test('nums', function (t) {
-    var argv = parse([
-        '-x', '1234',
-        '-y', '5.67',
-        '-z', '1e7',
-        '-w', '10f',
-        '--hex', '0xdeadbeef',
-        '789'
-    ]);
-    t.deepEqual(argv, {
-        x : 1234,
-        y : 5.67,
-        z : 1e7,
-        w : '10f',
-        hex : 0xdeadbeef,
-        _ : [ 789 ]
-    });
-    t.deepEqual(typeof argv.x, 'number');
-    t.deepEqual(typeof argv.y, 'number');
-    t.deepEqual(typeof argv.z, 'number');
-    t.deepEqual(typeof argv.w, 'string');
-    t.deepEqual(typeof argv.hex, 'number');
-    t.deepEqual(typeof argv._[0], 'number');
-    t.end();
-});
-
-test('flag boolean', function (t) {
-    var argv = parse([ '-t', 'moo' ], { boolean: 't' });
-    t.deepEqual(argv, { t : true, _ : [ 'moo' ] });
-    t.deepEqual(typeof argv.t, 'boolean');
-    t.end();
-});
-
-test('flag boolean value', function (t) {
-    var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], {
-        boolean: [ 't', 'verbose' ],
-        default: { verbose: true }
-    });
-    
-    t.deepEqual(argv, {
-        verbose: false,
-        t: true,
-        _: ['moo']
-    });
-    
-    t.deepEqual(typeof argv.verbose, 'boolean');
-    t.deepEqual(typeof argv.t, 'boolean');
-    t.end();
-});
-
-test('flag boolean default false', function (t) {
-    var argv = parse(['moo'], {
-        boolean: ['t', 'verbose'],
-        default: { verbose: false, t: false }
-    });
-    
-    t.deepEqual(argv, {
-        verbose: false,
-        t: false,
-        _: ['moo']
-    });
-    
-    t.deepEqual(typeof argv.verbose, 'boolean');
-    t.deepEqual(typeof argv.t, 'boolean');
-    t.end();
-
-});
-
-test('boolean groups', function (t) {
-    var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], {
-        boolean: ['x','y','z']
-    });
-    
-    t.deepEqual(argv, {
-        x : true,
-        y : false,
-        z : true,
-        _ : [ 'one', 'two', 'three' ]
-    });
-    
-    t.deepEqual(typeof argv.x, 'boolean');
-    t.deepEqual(typeof argv.y, 'boolean');
-    t.deepEqual(typeof argv.z, 'boolean');
-    t.end();
-});
-
-test('newlines in params' , function (t) {
-    var args = parse([ '-s', "X\nX" ])
-    t.deepEqual(args, { _ : [], s : "X\nX" });
-    
-    // reproduce in bash:
-    // VALUE="new
-    // line"
-    // node program.js --s="$VALUE"
-    args = parse([ "--s=X\nX" ])
-    t.deepEqual(args, { _ : [], s : "X\nX" });
-    t.end();
-});
-
-test('strings' , function (t) {
-    var s = parse([ '-s', '0001234' ], { string: 's' }).s;
-    t.equal(s, '0001234');
-    t.equal(typeof s, 'string');
-    
-    var x = parse([ '-x', '56' ], { string: 'x' }).x;
-    t.equal(x, '56');
-    t.equal(typeof x, 'string');
-    t.end();
-});
-
-test('stringArgs', function (t) {
-    var s = parse([ '  ', '  ' ], { string: '_' })._;
-    t.same(s.length, 2);
-    t.same(typeof s[0], 'string');
-    t.same(s[0], '  ');
-    t.same(typeof s[1], 'string');
-    t.same(s[1], '  ');
-    t.end();
-});
-
-test('empty strings', function(t) {
-    var s = parse([ '-s' ], { string: 's' }).s;
-    t.equal(s, '');
-    t.equal(typeof s, 'string');
-
-    var str = parse([ '--str' ], { string: 'str' }).str;
-    t.equal(str, '');
-    t.equal(typeof str, 'string');
-
-    var letters = parse([ '-art' ], {
-        string: [ 'a', 't' ]
-    });
-
-    t.equal(letters.a, '');
-    t.equal(letters.r, true);
-    t.equal(letters.t, '');
-
-    t.end();
-});
-
-
-test('slashBreak', function (t) {
-    t.same(
-        parse([ '-I/foo/bar/baz' ]),
-        { I : '/foo/bar/baz', _ : [] }
-    );
-    t.same(
-        parse([ '-xyz/foo/bar/baz' ]),
-        { x : true, y : true, z : '/foo/bar/baz', _ : [] }
-    );
-    t.end();
-});
-
-test('alias', function (t) {
-    var argv = parse([ '-f', '11', '--zoom', '55' ], {
-        alias: { z: 'zoom' }
-    });
-    t.equal(argv.zoom, 55);
-    t.equal(argv.z, argv.zoom);
-    t.equal(argv.f, 11);
-    t.end();
-});
-
-test('multiAlias', function (t) {
-    var argv = parse([ '-f', '11', '--zoom', '55' ], {
-        alias: { z: [ 'zm', 'zoom' ] }
-    });
-    t.equal(argv.zoom, 55);
-    t.equal(argv.z, argv.zoom);
-    t.equal(argv.z, argv.zm);
-    t.equal(argv.f, 11);
-    t.end();
-});
-
-test('nested dotted objects', function (t) {
-    var argv = parse([
-        '--foo.bar', '3', '--foo.baz', '4',
-        '--foo.quux.quibble', '5', '--foo.quux.o_O',
-        '--beep.boop'
-    ]);
-    
-    t.same(argv.foo, {
-        bar : 3,
-        baz : 4,
-        quux : {
-            quibble : 5,
-            o_O : true
-        }
-    });
-    t.same(argv.beep, { boop : true });
-    t.end();
-});
-
-test('boolean and alias with chainable api', function (t) {
-    var aliased = [ '-h', 'derp' ];
-    var regular = [ '--herp',  'derp' ];
-    var opts = {
-        herp: { alias: 'h', boolean: true }
-    };
-    var aliasedArgv = parse(aliased, {
-        boolean: 'herp',
-        alias: { h: 'herp' }
-    });
-    var propertyArgv = parse(regular, {
-        boolean: 'herp',
-        alias: { h: 'herp' }
-    });
-    var expected = {
-        herp: true,
-        h: true,
-        '_': [ 'derp' ]
-    };
-    
-    t.same(aliasedArgv, expected);
-    t.same(propertyArgv, expected); 
-    t.end();
-});
-
-test('boolean and alias with options hash', function (t) {
-    var aliased = [ '-h', 'derp' ];
-    var regular = [ '--herp', 'derp' ];
-    var opts = {
-        alias: { 'h': 'herp' },
-        boolean: 'herp'
-    };
-    var aliasedArgv = parse(aliased, opts);
-    var propertyArgv = parse(regular, opts);
-    var expected = {
-        herp: true,
-        h: true,
-        '_': [ 'derp' ]
-    };
-    t.same(aliasedArgv, expected);
-    t.same(propertyArgv, expected);
-    t.end();
-});
-
-test('boolean and alias using explicit true', function (t) {
-    var aliased = [ '-h', 'true' ];
-    var regular = [ '--herp',  'true' ];
-    var opts = {
-        alias: { h: 'herp' },
-        boolean: 'h'
-    };
-    var aliasedArgv = parse(aliased, opts);
-    var propertyArgv = parse(regular, opts);
-    var expected = {
-        herp: true,
-        h: true,
-        '_': [ ]
-    };
-
-    t.same(aliasedArgv, expected);
-    t.same(propertyArgv, expected); 
-    t.end();
-});
-
-// regression, see https://github.com/substack/node-optimist/issues/71
-test('boolean and --x=true', function(t) {
-    var parsed = parse(['--boool', '--other=true'], {
-        boolean: 'boool'
-    });
-
-    t.same(parsed.boool, true);
-    t.same(parsed.other, 'true');
-
-    parsed = parse(['--boool', '--other=false'], {
-        boolean: 'boool'
-    });
-    
-    t.same(parsed.boool, true);
-    t.same(parsed.other, 'false');
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse_modified.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse_modified.js
deleted file mode 100644
index 21851b036ee6d92453f3820bb2d5442d75aecc6d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/parse_modified.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('parse with modifier functions' , function (t) {
-    t.plan(1);
-    
-    var argv = parse([ '-b', '123' ], { boolean: 'b' });
-    t.deepEqual(argv, { b: true, _: ['123'] });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/short.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/short.js
deleted file mode 100644
index d513a1c2529095aba51bff9413cfe2942d3f2d09..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/short.js
+++ /dev/null
@@ -1,67 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('numeric short args', function (t) {
-    t.plan(2);
-    t.deepEqual(parse([ '-n123' ]), { n: 123, _: [] });
-    t.deepEqual(
-        parse([ '-123', '456' ]),
-        { 1: true, 2: true, 3: 456, _: [] }
-    );
-});
-
-test('short', function (t) {
-    t.deepEqual(
-        parse([ '-b' ]),
-        { b : true, _ : [] },
-        'short boolean'
-    );
-    t.deepEqual(
-        parse([ 'foo', 'bar', 'baz' ]),
-        { _ : [ 'foo', 'bar', 'baz' ] },
-        'bare'
-    );
-    t.deepEqual(
-        parse([ '-cats' ]),
-        { c : true, a : true, t : true, s : true, _ : [] },
-        'group'
-    );
-    t.deepEqual(
-        parse([ '-cats', 'meow' ]),
-        { c : true, a : true, t : true, s : 'meow', _ : [] },
-        'short group next'
-    );
-    t.deepEqual(
-        parse([ '-h', 'localhost' ]),
-        { h : 'localhost', _ : [] },
-        'short capture'
-    );
-    t.deepEqual(
-        parse([ '-h', 'localhost', '-p', '555' ]),
-        { h : 'localhost', p : 555, _ : [] },
-        'short captures'
-    );
-    t.end();
-});
- 
-test('mixed short bool and capture', function (t) {
-    t.same(
-        parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
-        {
-            f : true, p : 555, h : 'localhost',
-            _ : [ 'script.js' ]
-        }
-    );
-    t.end();
-});
- 
-test('short and long', function (t) {
-    t.deepEqual(
-        parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
-        {
-            f : true, p : 555, h : 'localhost',
-            _ : [ 'script.js' ]
-        }
-    );
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/whitespace.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/whitespace.js
deleted file mode 100644
index 8a52a58cecfd7adea084403f6250fe09e7873eba..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/node_modules/minimist/test/whitespace.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('whitespace should be whitespace' , function (t) {
-    t.plan(1);
-    var x = parse([ '-x', '\t' ]).x;
-    t.equal(x, '\t');
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/package.json
deleted file mode 100644
index 5fabe52a936a856c2677718541505bdf326f19a5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/package.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-  "_from": "mkdirp@>=0.5.0 <0.6.0",
-  "_id": "mkdirp@0.5.1",
-  "_location": "/serialport/node-pre-gyp/mkdirp",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp",
-    "/serialport/node-pre-gyp/tar-pack/fstream",
-    "/serialport/node-pre-gyp/tar/fstream"
-  ],
-  "_resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-  "_shasum": "30057438eac6cf7f8c4767f38648d6697d75c903",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@substack.net",
-    "name": "James Halliday",
-    "url": "http://substack.net"
-  },
-  "bin": {
-    "mkdirp": "bin/cmd.js"
-  },
-  "bugs": {
-    "url": "https://github.com/substack/node-mkdirp/issues"
-  },
-  "dependencies": {
-    "minimist": "0.0.8"
-  },
-  "description": "Recursively mkdir, like `mkdir -p`",
-  "devDependencies": {
-    "mock-fs": "2 >=2.7.0",
-    "tap": "1"
-  },
-  "homepage": "https://github.com/substack/node-mkdirp#readme",
-  "keywords": [
-    "directory",
-    "mkdir"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "mkdirp",
-  "optionalDependencies": {},
-  "readme": "# mkdirp\n\nLike `mkdir -p`, but in node.js!\n\n[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)\n\n# example\n\n## pow.js\n\n```js\nvar mkdirp = require('mkdirp');\n    \nmkdirp('/tmp/foo/bar/baz', function (err) {\n    if (err) console.error(err)\n    else console.log('pow!')\n});\n```\n\nOutput\n\n```\npow!\n```\n\nAnd now /tmp/foo/bar/baz exists, huzzah!\n\n# methods\n\n```js\nvar mkdirp = require('mkdirp');\n```\n\n## mkdirp(dir, opts, cb)\n\nCreate a new directory and any necessary subdirectories at `dir` with octal\npermission string `opts.mode`. If `opts` is a non-object, it will be treated as\nthe `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\n`cb(err, made)` fires with the error or the first directory `made`\nthat had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdir(path, mode, cb)` and\n`opts.fs.stat(path, cb)`.\n\n## mkdirp.sync(dir, opts)\n\nSynchronously create a new directory and any necessary subdirectories at `dir`\nwith octal permission string `opts.mode`. If `opts` is a non-object, it will be\ntreated as the `opts.mode`.\n\nIf `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`.\n\nReturns the first directory that had to be created, if any.\n\nYou can optionally pass in an alternate `fs` implementation by passing in\n`opts.fs`. Your implementation should have `opts.fs.mkdirSync(path, mode)` and\n`opts.fs.statSync(path)`.\n\n# usage\n\nThis package also ships with a `mkdirp` command.\n\n```\nusage: mkdirp [DIR1,DIR2..] {OPTIONS}\n\n  Create each supplied directory including any necessary parent directories that\n  don't yet exist.\n  \n  If the directory already exists, do nothing.\n\nOPTIONS are:\n\n  -m, --mode   If a directory needs to be created, set the mode as an octal\n               permission string.\n\n```\n\n# install\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install mkdirp\n```\n\nto get the library, or\n\n```\nnpm install -g mkdirp\n```\n\nto get the command.\n\n# license\n\nMIT\n",
-  "readmeFilename": "readme.markdown",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/substack/node-mkdirp.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "0.5.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/readme.markdown b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/readme.markdown
deleted file mode 100644
index 3cc131538511624fec5500796fb7fd0e2a40c625..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/readme.markdown
+++ /dev/null
@@ -1,100 +0,0 @@
-# mkdirp
-
-Like `mkdir -p`, but in node.js!
-
-[![build status](https://secure.travis-ci.org/substack/node-mkdirp.png)](http://travis-ci.org/substack/node-mkdirp)
-
-# example
-
-## pow.js
-
-```js
-var mkdirp = require('mkdirp');
-    
-mkdirp('/tmp/foo/bar/baz', function (err) {
-    if (err) console.error(err)
-    else console.log('pow!')
-});
-```
-
-Output
-
-```
-pow!
-```
-
-And now /tmp/foo/bar/baz exists, huzzah!
-
-# methods
-
-```js
-var mkdirp = require('mkdirp');
-```
-
-## mkdirp(dir, opts, cb)
-
-Create a new directory and any necessary subdirectories at `dir` with octal
-permission string `opts.mode`. If `opts` is a non-object, it will be treated as
-the `opts.mode`.
-
-If `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`.
-
-`cb(err, made)` fires with the error or the first directory `made`
-that had to be created, if any.
-
-You can optionally pass in an alternate `fs` implementation by passing in
-`opts.fs`. Your implementation should have `opts.fs.mkdir(path, mode, cb)` and
-`opts.fs.stat(path, cb)`.
-
-## mkdirp.sync(dir, opts)
-
-Synchronously create a new directory and any necessary subdirectories at `dir`
-with octal permission string `opts.mode`. If `opts` is a non-object, it will be
-treated as the `opts.mode`.
-
-If `opts.mode` isn't specified, it defaults to `0777 & (~process.umask())`.
-
-Returns the first directory that had to be created, if any.
-
-You can optionally pass in an alternate `fs` implementation by passing in
-`opts.fs`. Your implementation should have `opts.fs.mkdirSync(path, mode)` and
-`opts.fs.statSync(path)`.
-
-# usage
-
-This package also ships with a `mkdirp` command.
-
-```
-usage: mkdirp [DIR1,DIR2..] {OPTIONS}
-
-  Create each supplied directory including any necessary parent directories that
-  don't yet exist.
-  
-  If the directory already exists, do nothing.
-
-OPTIONS are:
-
-  -m, --mode   If a directory needs to be created, set the mode as an octal
-               permission string.
-
-```
-
-# install
-
-With [npm](http://npmjs.org) do:
-
-```
-npm install mkdirp
-```
-
-to get the library, or
-
-```
-npm install -g mkdirp
-```
-
-to get the command.
-
-# license
-
-MIT
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/chmod.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/chmod.js
deleted file mode 100644
index 6a404b932f941f25047fa17254dc0eeb2f07e639..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/chmod.js
+++ /dev/null
@@ -1,41 +0,0 @@
-var mkdirp = require('../').mkdirp;
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-var _0777 = parseInt('0777', 8);
-var _0755 = parseInt('0755', 8);
-var _0744 = parseInt('0744', 8);
-
-var ps = [ '', 'tmp' ];
-
-for (var i = 0; i < 25; i++) {
-    var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    ps.push(dir);
-}
-
-var file = ps.join('/');
-
-test('chmod-pre', function (t) {
-    var mode = _0744
-    mkdirp(file, mode, function (er) {
-        t.ifError(er, 'should not error');
-        fs.stat(file, function (er, stat) {
-            t.ifError(er, 'should exist');
-            t.ok(stat && stat.isDirectory(), 'should be directory');
-            t.equal(stat && stat.mode & _0777, mode, 'should be 0744');
-            t.end();
-        });
-    });
-});
-
-test('chmod', function (t) {
-    var mode = _0755
-    mkdirp(file, mode, function (er) {
-        t.ifError(er, 'should not error');
-        fs.stat(file, function (er, stat) {
-            t.ifError(er, 'should exist');
-            t.ok(stat && stat.isDirectory(), 'should be directory');
-            t.end();
-        });
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/clobber.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/clobber.js
deleted file mode 100644
index 2433b9ad548557a7b5c8ece8dbd32ad68ff3ffb0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/clobber.js
+++ /dev/null
@@ -1,38 +0,0 @@
-var mkdirp = require('../').mkdirp;
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-var _0755 = parseInt('0755', 8);
-
-var ps = [ '', 'tmp' ];
-
-for (var i = 0; i < 25; i++) {
-    var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    ps.push(dir);
-}
-
-var file = ps.join('/');
-
-// a file in the way
-var itw = ps.slice(0, 3).join('/');
-
-
-test('clobber-pre', function (t) {
-    console.error("about to write to "+itw)
-    fs.writeFileSync(itw, 'I AM IN THE WAY, THE TRUTH, AND THE LIGHT.');
-
-    fs.stat(itw, function (er, stat) {
-        t.ifError(er)
-        t.ok(stat && stat.isFile(), 'should be file')
-        t.end()
-    })
-})
-
-test('clobber', function (t) {
-    t.plan(2);
-    mkdirp(file, _0755, function (err) {
-        t.ok(err);
-        t.equal(err.code, 'ENOTDIR');
-        t.end();
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/mkdirp.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/mkdirp.js
deleted file mode 100644
index eaa8921c7f1488e2fbd310b002c2687224495f29..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/mkdirp.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var exists = fs.exists || path.exists;
-var test = require('tap').test;
-var _0777 = parseInt('0777', 8);
-var _0755 = parseInt('0755', 8);
-
-test('woo', function (t) {
-    t.plan(5);
-    var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    
-    var file = '/tmp/' + [x,y,z].join('/');
-    
-    mkdirp(file, _0755, function (err) {
-        t.ifError(err);
-        exists(file, function (ex) {
-            t.ok(ex, 'file created');
-            fs.stat(file, function (err, stat) {
-                t.ifError(err);
-                t.equal(stat.mode & _0777, _0755);
-                t.ok(stat.isDirectory(), 'target not a directory');
-            })
-        })
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs.js
deleted file mode 100644
index 97186b62e0bb902dc78334c45e8c187180a3fe8c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var test = require('tap').test;
-var mockfs = require('mock-fs');
-var _0777 = parseInt('0777', 8);
-var _0755 = parseInt('0755', 8);
-
-test('opts.fs', function (t) {
-    t.plan(5);
-    
-    var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    
-    var file = '/beep/boop/' + [x,y,z].join('/');
-    var xfs = mockfs.fs();
-    
-    mkdirp(file, { fs: xfs, mode: _0755 }, function (err) {
-        t.ifError(err);
-        xfs.exists(file, function (ex) {
-            t.ok(ex, 'created file');
-            xfs.stat(file, function (err, stat) {
-                t.ifError(err);
-                t.equal(stat.mode & _0777, _0755);
-                t.ok(stat.isDirectory(), 'target not a directory');
-            });
-        });
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs_sync.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs_sync.js
deleted file mode 100644
index 6c370aa6e93a20ae8f940056d61e8e7b82d588d9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/opts_fs_sync.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var test = require('tap').test;
-var mockfs = require('mock-fs');
-var _0777 = parseInt('0777', 8);
-var _0755 = parseInt('0755', 8);
-
-test('opts.fs sync', function (t) {
-    t.plan(4);
-    
-    var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    
-    var file = '/beep/boop/' + [x,y,z].join('/');
-    var xfs = mockfs.fs();
-    
-    mkdirp.sync(file, { fs: xfs, mode: _0755 });
-    xfs.exists(file, function (ex) {
-        t.ok(ex, 'created file');
-        xfs.stat(file, function (err, stat) {
-            t.ifError(err);
-            t.equal(stat.mode & _0777, _0755);
-            t.ok(stat.isDirectory(), 'target not a directory');
-        });
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm.js
deleted file mode 100644
index fbce44b82bafee4c707eb041b5c2c667effd2e6d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var exists = fs.exists || path.exists;
-var test = require('tap').test;
-var _0777 = parseInt('0777', 8);
-var _0755 = parseInt('0755', 8);
-
-test('async perm', function (t) {
-    t.plan(5);
-    var file = '/tmp/' + (Math.random() * (1<<30)).toString(16);
-    
-    mkdirp(file, _0755, function (err) {
-        t.ifError(err);
-        exists(file, function (ex) {
-            t.ok(ex, 'file created');
-            fs.stat(file, function (err, stat) {
-                t.ifError(err);
-                t.equal(stat.mode & _0777, _0755);
-                t.ok(stat.isDirectory(), 'target not a directory');
-            })
-        })
-    });
-});
-
-test('async root perm', function (t) {
-    mkdirp('/tmp', _0755, function (err) {
-        if (err) t.fail(err);
-        t.end();
-    });
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm_sync.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm_sync.js
deleted file mode 100644
index 398229fe54ab04bf368bc5b70360a68ee40d5fda..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/perm_sync.js
+++ /dev/null
@@ -1,36 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var exists = fs.exists || path.exists;
-var test = require('tap').test;
-var _0777 = parseInt('0777', 8);
-var _0755 = parseInt('0755', 8);
-
-test('sync perm', function (t) {
-    t.plan(4);
-    var file = '/tmp/' + (Math.random() * (1<<30)).toString(16) + '.json';
-    
-    mkdirp.sync(file, _0755);
-    exists(file, function (ex) {
-        t.ok(ex, 'file created');
-        fs.stat(file, function (err, stat) {
-            t.ifError(err);
-            t.equal(stat.mode & _0777, _0755);
-            t.ok(stat.isDirectory(), 'target not a directory');
-        });
-    });
-});
-
-test('sync root perm', function (t) {
-    t.plan(3);
-    
-    var file = '/tmp';
-    mkdirp.sync(file, _0755);
-    exists(file, function (ex) {
-        t.ok(ex, 'file created');
-        fs.stat(file, function (err, stat) {
-            t.ifError(err);
-            t.ok(stat.isDirectory(), 'target not a directory');
-        })
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/race.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/race.js
deleted file mode 100644
index b0b9e183c902fbbceb8120260253000276215687..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/race.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var mkdirp = require('../').mkdirp;
-var path = require('path');
-var fs = require('fs');
-var exists = fs.exists || path.exists;
-var test = require('tap').test;
-var _0777 = parseInt('0777', 8);
-var _0755 = parseInt('0755', 8);
-
-test('race', function (t) {
-    t.plan(10);
-    var ps = [ '', 'tmp' ];
-    
-    for (var i = 0; i < 25; i++) {
-        var dir = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-        ps.push(dir);
-    }
-    var file = ps.join('/');
-    
-    var res = 2;
-    mk(file);
-    
-    mk(file);
-    
-    function mk (file, cb) {
-        mkdirp(file, _0755, function (err) {
-            t.ifError(err);
-            exists(file, function (ex) {
-                t.ok(ex, 'file created');
-                fs.stat(file, function (err, stat) {
-                    t.ifError(err);
-                    t.equal(stat.mode & _0777, _0755);
-                    t.ok(stat.isDirectory(), 'target not a directory');
-                });
-            })
-        });
-    }
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/rel.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/rel.js
deleted file mode 100644
index 4ddb34276a72a2a06b0290e2f1c136280bd95cdf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/rel.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var exists = fs.exists || path.exists;
-var test = require('tap').test;
-var _0777 = parseInt('0777', 8);
-var _0755 = parseInt('0755', 8);
-
-test('rel', function (t) {
-    t.plan(5);
-    var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    
-    var cwd = process.cwd();
-    process.chdir('/tmp');
-    
-    var file = [x,y,z].join('/');
-    
-    mkdirp(file, _0755, function (err) {
-        t.ifError(err);
-        exists(file, function (ex) {
-            t.ok(ex, 'file created');
-            fs.stat(file, function (err, stat) {
-                t.ifError(err);
-                process.chdir(cwd);
-                t.equal(stat.mode & _0777, _0755);
-                t.ok(stat.isDirectory(), 'target not a directory');
-            })
-        })
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/return.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/return.js
deleted file mode 100644
index bce68e5613e3f94f28a697e688c5d2bde06a2f40..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/return.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-test('return value', function (t) {
-    t.plan(4);
-    var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-
-    var file = '/tmp/' + [x,y,z].join('/');
-
-    // should return the first dir created.
-    // By this point, it would be profoundly surprising if /tmp didn't
-    // already exist, since every other test makes things in there.
-    mkdirp(file, function (err, made) {
-        t.ifError(err);
-        t.equal(made, '/tmp/' + x);
-        mkdirp(file, function (err, made) {
-          t.ifError(err);
-          t.equal(made, null);
-        });
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/return_sync.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/return_sync.js
deleted file mode 100644
index 7c222d3558d6f00d87502331abf9c3c32aec2a72..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/return_sync.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-
-test('return value', function (t) {
-    t.plan(2);
-    var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-
-    var file = '/tmp/' + [x,y,z].join('/');
-
-    // should return the first dir created.
-    // By this point, it would be profoundly surprising if /tmp didn't
-    // already exist, since every other test makes things in there.
-    // Note that this will throw on failure, which will fail the test.
-    var made = mkdirp.sync(file);
-    t.equal(made, '/tmp/' + x);
-
-    // making the same file again should have no effect.
-    made = mkdirp.sync(file);
-    t.equal(made, null);
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/root.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/root.js
deleted file mode 100644
index 9e7d079d9fc75799d4d594948ffe0ad4567f4379..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/root.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var test = require('tap').test;
-var _0755 = parseInt('0755', 8);
-
-test('root', function (t) {
-    // '/' on unix, 'c:/' on windows.
-    var file = path.resolve('/');
-
-    mkdirp(file, _0755, function (err) {
-        if (err) throw err
-        fs.stat(file, function (er, stat) {
-            if (er) throw er
-            t.ok(stat.isDirectory(), 'target is a directory');
-            t.end();
-        })
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/sync.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/sync.js
deleted file mode 100644
index 8c8dc938c8b4a89683791570e429ab2be305e3d2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/sync.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var exists = fs.exists || path.exists;
-var test = require('tap').test;
-var _0777 = parseInt('0777', 8);
-var _0755 = parseInt('0755', 8);
-
-test('sync', function (t) {
-    t.plan(4);
-    var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-
-    var file = '/tmp/' + [x,y,z].join('/');
-
-    try {
-        mkdirp.sync(file, _0755);
-    } catch (err) {
-        t.fail(err);
-        return t.end();
-    }
-
-    exists(file, function (ex) {
-        t.ok(ex, 'file created');
-        fs.stat(file, function (err, stat) {
-            t.ifError(err);
-            t.equal(stat.mode & _0777, _0755);
-            t.ok(stat.isDirectory(), 'target not a directory');
-        });
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask.js
deleted file mode 100644
index 2033c63a414efa8318ad72324ec34c6797f2d046..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask.js
+++ /dev/null
@@ -1,28 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var exists = fs.exists || path.exists;
-var test = require('tap').test;
-var _0777 = parseInt('0777', 8);
-var _0755 = parseInt('0755', 8);
-
-test('implicit mode from umask', function (t) {
-    t.plan(5);
-    var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    
-    var file = '/tmp/' + [x,y,z].join('/');
-    
-    mkdirp(file, function (err) {
-        t.ifError(err);
-        exists(file, function (ex) {
-            t.ok(ex, 'file created');
-            fs.stat(file, function (err, stat) {
-                t.ifError(err);
-                t.equal(stat.mode & _0777, _0777 & (~process.umask()));
-                t.ok(stat.isDirectory(), 'target not a directory');
-            });
-        })
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask_sync.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask_sync.js
deleted file mode 100644
index 11a76147496a523147c15ee35d767753779004f2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/mkdirp/test/umask_sync.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var mkdirp = require('../');
-var path = require('path');
-var fs = require('fs');
-var exists = fs.exists || path.exists;
-var test = require('tap').test;
-var _0777 = parseInt('0777', 8);
-var _0755 = parseInt('0755', 8);
-
-test('umask sync modes', function (t) {
-    t.plan(4);
-    var x = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var y = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-    var z = Math.floor(Math.random() * Math.pow(16,4)).toString(16);
-
-    var file = '/tmp/' + [x,y,z].join('/');
-
-    try {
-        mkdirp.sync(file);
-    } catch (err) {
-        t.fail(err);
-        return t.end();
-    }
-
-    exists(file, function (ex) {
-        t.ok(ex, 'file created');
-        fs.stat(file, function (err, stat) {
-            t.ifError(err);
-            t.equal(stat.mode & _0777, (_0777 & (~process.umask())));
-            t.ok(stat.isDirectory(), 'target not a directory');
-        });
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/.npmignore
deleted file mode 100644
index 3c3629e647f5ddf82548912e337bea9826b434af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/.travis.yml
deleted file mode 100644
index 99f2bbf5068a8c1282c8ca00966326bdfc941030..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: node_js
-language: node_js
-node_js:
-  - '0.8'
-  - '0.10'
-  - '0.12'
-  - 'iojs'
-before_install:
-  - npm install -g npm@latest
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/README.md
deleted file mode 100644
index f21a4b31c5d482f3d9e08940dcbef5f9b87b5ee0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/README.md
+++ /dev/null
@@ -1,211 +0,0 @@
-If you want to write an option parser, and have it be good, there are
-two ways to do it.  The Right Way, and the Wrong Way.
-
-The Wrong Way is to sit down and write an option parser.  We've all done
-that.
-
-The Right Way is to write some complex configurable program with so many
-options that you hit the limit of your frustration just trying to
-manage them all, and defer it with duct-tape solutions until you see
-exactly to the core of the problem, and finally snap and write an
-awesome option parser.
-
-If you want to write an option parser, don't write an option parser.
-Write a package manager, or a source control system, or a service
-restarter, or an operating system.  You probably won't end up with a
-good one of those, but if you don't give up, and you are relentless and
-diligent enough in your procrastination, you may just end up with a very
-nice option parser.
-
-## USAGE
-
-    // my-program.js
-    var nopt = require("nopt")
-      , Stream = require("stream").Stream
-      , path = require("path")
-      , knownOpts = { "foo" : [String, null]
-                    , "bar" : [Stream, Number]
-                    , "baz" : path
-                    , "bloo" : [ "big", "medium", "small" ]
-                    , "flag" : Boolean
-                    , "pick" : Boolean
-                    , "many1" : [String, Array]
-                    , "many2" : [path]
-                    }
-      , shortHands = { "foofoo" : ["--foo", "Mr. Foo"]
-                     , "b7" : ["--bar", "7"]
-                     , "m" : ["--bloo", "medium"]
-                     , "p" : ["--pick"]
-                     , "f" : ["--flag"]
-                     }
-                 // everything is optional.
-                 // knownOpts and shorthands default to {}
-                 // arg list defaults to process.argv
-                 // slice defaults to 2
-      , parsed = nopt(knownOpts, shortHands, process.argv, 2)
-    console.log(parsed)
-
-This would give you support for any of the following:
-
-```bash
-$ node my-program.js --foo "blerp" --no-flag
-{ "foo" : "blerp", "flag" : false }
-
-$ node my-program.js ---bar 7 --foo "Mr. Hand" --flag
-{ bar: 7, foo: "Mr. Hand", flag: true }
-
-$ node my-program.js --foo "blerp" -f -----p
-{ foo: "blerp", flag: true, pick: true }
-
-$ node my-program.js -fp --foofoo
-{ foo: "Mr. Foo", flag: true, pick: true }
-
-$ node my-program.js --foofoo -- -fp  # -- stops the flag parsing.
-{ foo: "Mr. Foo", argv: { remain: ["-fp"] } }
-
-$ node my-program.js --blatzk -fp # unknown opts are ok.
-{ blatzk: true, flag: true, pick: true }
-
-$ node my-program.js --blatzk=1000 -fp # but you need to use = if they have a value
-{ blatzk: 1000, flag: true, pick: true }
-
-$ node my-program.js --no-blatzk -fp # unless they start with "no-"
-{ blatzk: false, flag: true, pick: true }
-
-$ node my-program.js --baz b/a/z # known paths are resolved.
-{ baz: "/Users/isaacs/b/a/z" }
-
-# if Array is one of the types, then it can take many
-# values, and will always be an array.  The other types provided
-# specify what types are allowed in the list.
-
-$ node my-program.js --many1 5 --many1 null --many1 foo
-{ many1: ["5", "null", "foo"] }
-
-$ node my-program.js --many2 foo --many2 bar
-{ many2: ["/path/to/foo", "path/to/bar"] }
-```
-
-Read the tests at the bottom of `lib/nopt.js` for more examples of
-what this puppy can do.
-
-## Types
-
-The following types are supported, and defined on `nopt.typeDefs`
-
-* String: A normal string.  No parsing is done.
-* path: A file system path.  Gets resolved against cwd if not absolute.
-* url: A url.  If it doesn't parse, it isn't accepted.
-* Number: Must be numeric.
-* Date: Must parse as a date. If it does, and `Date` is one of the options,
-  then it will return a Date object, not a string.
-* Boolean: Must be either `true` or `false`.  If an option is a boolean,
-  then it does not need a value, and its presence will imply `true` as
-  the value.  To negate boolean flags, do `--no-whatever` or `--whatever
-  false`
-* NaN: Means that the option is strictly not allowed.  Any value will
-  fail.
-* Stream: An object matching the "Stream" class in node.  Valuable
-  for use when validating programmatically.  (npm uses this to let you
-  supply any WriteStream on the `outfd` and `logfd` config options.)
-* Array: If `Array` is specified as one of the types, then the value
-  will be parsed as a list of options.  This means that multiple values
-  can be specified, and that the value will always be an array.
-
-If a type is an array of values not on this list, then those are
-considered valid values.  For instance, in the example above, the
-`--bloo` option can only be one of `"big"`, `"medium"`, or `"small"`,
-and any other value will be rejected.
-
-When parsing unknown fields, `"true"`, `"false"`, and `"null"` will be
-interpreted as their JavaScript equivalents.
-
-You can also mix types and values, or multiple types, in a list.  For
-instance `{ blah: [Number, null] }` would allow a value to be set to
-either a Number or null.  When types are ordered, this implies a
-preference, and the first type that can be used to properly interpret
-the value will be used.
-
-To define a new type, add it to `nopt.typeDefs`.  Each item in that
-hash is an object with a `type` member and a `validate` method.  The
-`type` member is an object that matches what goes in the type list.  The
-`validate` method is a function that gets called with `validate(data,
-key, val)`.  Validate methods should assign `data[key]` to the valid
-value of `val` if it can be handled properly, or return boolean
-`false` if it cannot.
-
-You can also call `nopt.clean(data, types, typeDefs)` to clean up a
-config object and remove its invalid properties.
-
-## Error Handling
-
-By default, nopt outputs a warning to standard error when invalid values for
-known options are found.  You can change this behavior by assigning a method
-to `nopt.invalidHandler`.  This method will be called with
-the offending `nopt.invalidHandler(key, val, types)`.
-
-If no `nopt.invalidHandler` is assigned, then it will console.error
-its whining.  If it is assigned to boolean `false` then the warning is
-suppressed.
-
-## Abbreviations
-
-Yes, they are supported.  If you define options like this:
-
-```javascript
-{ "foolhardyelephants" : Boolean
-, "pileofmonkeys" : Boolean }
-```
-
-Then this will work:
-
-```bash
-node program.js --foolhar --pil
-node program.js --no-f --pileofmon
-# etc.
-```
-
-## Shorthands
-
-Shorthands are a hash of shorter option names to a snippet of args that
-they expand to.
-
-If multiple one-character shorthands are all combined, and the
-combination does not unambiguously match any other option or shorthand,
-then they will be broken up into their constituent parts.  For example:
-
-```json
-{ "s" : ["--loglevel", "silent"]
-, "g" : "--global"
-, "f" : "--force"
-, "p" : "--parseable"
-, "l" : "--long"
-}
-```
-
-```bash
-npm ls -sgflp
-# just like doing this:
-npm ls --loglevel silent --global --force --long --parseable
-```
-
-## The Rest of the args
-
-The config object returned by nopt is given a special member called
-`argv`, which is an object with the following fields:
-
-* `remain`: The remaining args after all the parsing has occurred.
-* `original`: The args as they originally appeared.
-* `cooked`: The args after flags and shorthands are expanded.
-
-## Slicing
-
-Node programs are called with more or less the exact argv as it appears
-in C land, after the v8 and node-specific options have been plucked off.
-As such, `argv[0]` is always `node` and `argv[1]` is always the
-JavaScript program being run.
-
-That's usually not very useful to you.  So they're sliced off by
-default.  If you want them, then you can pass in `0` as the last
-argument, or any other number that you'd like to slice off the start of
-the list.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/bin/nopt.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/bin/nopt.js
deleted file mode 100755
index 3232d4c570fdcbc4c82e6be2c793067326b9ca1e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/bin/nopt.js
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env node
-var nopt = require("../lib/nopt")
-  , path = require("path")
-  , types = { num: Number
-            , bool: Boolean
-            , help: Boolean
-            , list: Array
-            , "num-list": [Number, Array]
-            , "str-list": [String, Array]
-            , "bool-list": [Boolean, Array]
-            , str: String
-            , clear: Boolean
-            , config: Boolean
-            , length: Number
-            , file: path
-            }
-  , shorthands = { s: [ "--str", "astring" ]
-                 , b: [ "--bool" ]
-                 , nb: [ "--no-bool" ]
-                 , tft: [ "--bool-list", "--no-bool-list", "--bool-list", "true" ]
-                 , "?": ["--help"]
-                 , h: ["--help"]
-                 , H: ["--help"]
-                 , n: [ "--num", "125" ]
-                 , c: ["--config"]
-                 , l: ["--length"]
-                 , f: ["--file"]
-                 }
-  , parsed = nopt( types
-                 , shorthands
-                 , process.argv
-                 , 2 )
-
-console.log("parsed", parsed)
-
-if (parsed.help) {
-  console.log("")
-  console.log("nopt cli tester")
-  console.log("")
-  console.log("types")
-  console.log(Object.keys(types).map(function M (t) {
-    var type = types[t]
-    if (Array.isArray(type)) {
-      return [t, type.map(function (type) { return type.name })]
-    }
-    return [t, type && type.name]
-  }).reduce(function (s, i) {
-    s[i[0]] = i[1]
-    return s
-  }, {}))
-  console.log("")
-  console.log("shorthands")
-  console.log(shorthands)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/examples/my-program.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/examples/my-program.js
deleted file mode 100755
index 142447e18e756c77f39d98fc577b7a24c73f11ce..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/examples/my-program.js
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/usr/bin/env node
-
-//process.env.DEBUG_NOPT = 1
-
-// my-program.js
-var nopt = require("../lib/nopt")
-  , Stream = require("stream").Stream
-  , path = require("path")
-  , knownOpts = { "foo" : [String, null]
-                , "bar" : [Stream, Number]
-                , "baz" : path
-                , "bloo" : [ "big", "medium", "small" ]
-                , "flag" : Boolean
-                , "pick" : Boolean
-                }
-  , shortHands = { "foofoo" : ["--foo", "Mr. Foo"]
-                 , "b7" : ["--bar", "7"]
-                 , "m" : ["--bloo", "medium"]
-                 , "p" : ["--pick"]
-                 , "f" : ["--flag", "true"]
-                 , "g" : ["--flag"]
-                 , "s" : "--flag"
-                 }
-             // everything is optional.
-             // knownOpts and shorthands default to {}
-             // arg list defaults to process.argv
-             // slice defaults to 2
-  , parsed = nopt(knownOpts, shortHands, process.argv, 2)
-
-console.log("parsed =\n"+ require("util").inspect(parsed))
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/lib/nopt.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/lib/nopt.js
deleted file mode 100644
index 97707e784243bc85866199cc90951db6565dc09c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/lib/nopt.js
+++ /dev/null
@@ -1,415 +0,0 @@
-// info about each config option.
-
-var debug = process.env.DEBUG_NOPT || process.env.NOPT_DEBUG
-  ? function () { console.error.apply(console, arguments) }
-  : function () {}
-
-var url = require("url")
-  , path = require("path")
-  , Stream = require("stream").Stream
-  , abbrev = require("abbrev")
-
-module.exports = exports = nopt
-exports.clean = clean
-
-exports.typeDefs =
-  { String  : { type: String,  validate: validateString  }
-  , Boolean : { type: Boolean, validate: validateBoolean }
-  , url     : { type: url,     validate: validateUrl     }
-  , Number  : { type: Number,  validate: validateNumber  }
-  , path    : { type: path,    validate: validatePath    }
-  , Stream  : { type: Stream,  validate: validateStream  }
-  , Date    : { type: Date,    validate: validateDate    }
-  }
-
-function nopt (types, shorthands, args, slice) {
-  args = args || process.argv
-  types = types || {}
-  shorthands = shorthands || {}
-  if (typeof slice !== "number") slice = 2
-
-  debug(types, shorthands, args, slice)
-
-  args = args.slice(slice)
-  var data = {}
-    , key
-    , remain = []
-    , cooked = args
-    , original = args.slice(0)
-
-  parse(args, data, remain, types, shorthands)
-  // now data is full
-  clean(data, types, exports.typeDefs)
-  data.argv = {remain:remain,cooked:cooked,original:original}
-  Object.defineProperty(data.argv, 'toString', { value: function () {
-    return this.original.map(JSON.stringify).join(" ")
-  }, enumerable: false })
-  return data
-}
-
-function clean (data, types, typeDefs) {
-  typeDefs = typeDefs || exports.typeDefs
-  var remove = {}
-    , typeDefault = [false, true, null, String, Array]
-
-  Object.keys(data).forEach(function (k) {
-    if (k === "argv") return
-    var val = data[k]
-      , isArray = Array.isArray(val)
-      , type = types[k]
-    if (!isArray) val = [val]
-    if (!type) type = typeDefault
-    if (type === Array) type = typeDefault.concat(Array)
-    if (!Array.isArray(type)) type = [type]
-
-    debug("val=%j", val)
-    debug("types=", type)
-    val = val.map(function (val) {
-      // if it's an unknown value, then parse false/true/null/numbers/dates
-      if (typeof val === "string") {
-        debug("string %j", val)
-        val = val.trim()
-        if ((val === "null" && ~type.indexOf(null))
-            || (val === "true" &&
-               (~type.indexOf(true) || ~type.indexOf(Boolean)))
-            || (val === "false" &&
-               (~type.indexOf(false) || ~type.indexOf(Boolean)))) {
-          val = JSON.parse(val)
-          debug("jsonable %j", val)
-        } else if (~type.indexOf(Number) && !isNaN(val)) {
-          debug("convert to number", val)
-          val = +val
-        } else if (~type.indexOf(Date) && !isNaN(Date.parse(val))) {
-          debug("convert to date", val)
-          val = new Date(val)
-        }
-      }
-
-      if (!types.hasOwnProperty(k)) {
-        return val
-      }
-
-      // allow `--no-blah` to set 'blah' to null if null is allowed
-      if (val === false && ~type.indexOf(null) &&
-          !(~type.indexOf(false) || ~type.indexOf(Boolean))) {
-        val = null
-      }
-
-      var d = {}
-      d[k] = val
-      debug("prevalidated val", d, val, types[k])
-      if (!validate(d, k, val, types[k], typeDefs)) {
-        if (exports.invalidHandler) {
-          exports.invalidHandler(k, val, types[k], data)
-        } else if (exports.invalidHandler !== false) {
-          debug("invalid: "+k+"="+val, types[k])
-        }
-        return remove
-      }
-      debug("validated val", d, val, types[k])
-      return d[k]
-    }).filter(function (val) { return val !== remove })
-
-    if (!val.length) delete data[k]
-    else if (isArray) {
-      debug(isArray, data[k], val)
-      data[k] = val
-    } else data[k] = val[0]
-
-    debug("k=%s val=%j", k, val, data[k])
-  })
-}
-
-function validateString (data, k, val) {
-  data[k] = String(val)
-}
-
-function validatePath (data, k, val) {
-  if (val === true) return false
-  if (val === null) return true
-
-  val = String(val)
-  var homePattern = process.platform === 'win32' ? /^~(\/|\\)/ : /^~\//
-  if (val.match(homePattern) && process.env.HOME) {
-    val = path.resolve(process.env.HOME, val.substr(2))
-  }
-  data[k] = path.resolve(String(val))
-  return true
-}
-
-function validateNumber (data, k, val) {
-  debug("validate Number %j %j %j", k, val, isNaN(val))
-  if (isNaN(val)) return false
-  data[k] = +val
-}
-
-function validateDate (data, k, val) {
-  debug("validate Date %j %j %j", k, val, Date.parse(val))
-  var s = Date.parse(val)
-  if (isNaN(s)) return false
-  data[k] = new Date(val)
-}
-
-function validateBoolean (data, k, val) {
-  if (val instanceof Boolean) val = val.valueOf()
-  else if (typeof val === "string") {
-    if (!isNaN(val)) val = !!(+val)
-    else if (val === "null" || val === "false") val = false
-    else val = true
-  } else val = !!val
-  data[k] = val
-}
-
-function validateUrl (data, k, val) {
-  val = url.parse(String(val))
-  if (!val.host) return false
-  data[k] = val.href
-}
-
-function validateStream (data, k, val) {
-  if (!(val instanceof Stream)) return false
-  data[k] = val
-}
-
-function validate (data, k, val, type, typeDefs) {
-  // arrays are lists of types.
-  if (Array.isArray(type)) {
-    for (var i = 0, l = type.length; i < l; i ++) {
-      if (type[i] === Array) continue
-      if (validate(data, k, val, type[i], typeDefs)) return true
-    }
-    delete data[k]
-    return false
-  }
-
-  // an array of anything?
-  if (type === Array) return true
-
-  // NaN is poisonous.  Means that something is not allowed.
-  if (type !== type) {
-    debug("Poison NaN", k, val, type)
-    delete data[k]
-    return false
-  }
-
-  // explicit list of values
-  if (val === type) {
-    debug("Explicitly allowed %j", val)
-    // if (isArray) (data[k] = data[k] || []).push(val)
-    // else data[k] = val
-    data[k] = val
-    return true
-  }
-
-  // now go through the list of typeDefs, validate against each one.
-  var ok = false
-    , types = Object.keys(typeDefs)
-  for (var i = 0, l = types.length; i < l; i ++) {
-    debug("test type %j %j %j", k, val, types[i])
-    var t = typeDefs[types[i]]
-    if (t &&
-      ((type && type.name && t.type && t.type.name) ? (type.name === t.type.name) : (type === t.type))) {
-      var d = {}
-      ok = false !== t.validate(d, k, val)
-      val = d[k]
-      if (ok) {
-        // if (isArray) (data[k] = data[k] || []).push(val)
-        // else data[k] = val
-        data[k] = val
-        break
-      }
-    }
-  }
-  debug("OK? %j (%j %j %j)", ok, k, val, types[i])
-
-  if (!ok) delete data[k]
-  return ok
-}
-
-function parse (args, data, remain, types, shorthands) {
-  debug("parse", args, data, remain)
-
-  var key = null
-    , abbrevs = abbrev(Object.keys(types))
-    , shortAbbr = abbrev(Object.keys(shorthands))
-
-  for (var i = 0; i < args.length; i ++) {
-    var arg = args[i]
-    debug("arg", arg)
-
-    if (arg.match(/^-{2,}$/)) {
-      // done with keys.
-      // the rest are args.
-      remain.push.apply(remain, args.slice(i + 1))
-      args[i] = "--"
-      break
-    }
-    var hadEq = false
-    if (arg.charAt(0) === "-" && arg.length > 1) {
-      if (arg.indexOf("=") !== -1) {
-        hadEq = true
-        var v = arg.split("=")
-        arg = v.shift()
-        v = v.join("=")
-        args.splice.apply(args, [i, 1].concat([arg, v]))
-      }
-
-      // see if it's a shorthand
-      // if so, splice and back up to re-parse it.
-      var shRes = resolveShort(arg, shorthands, shortAbbr, abbrevs)
-      debug("arg=%j shRes=%j", arg, shRes)
-      if (shRes) {
-        debug(arg, shRes)
-        args.splice.apply(args, [i, 1].concat(shRes))
-        if (arg !== shRes[0]) {
-          i --
-          continue
-        }
-      }
-      arg = arg.replace(/^-+/, "")
-      var no = null
-      while (arg.toLowerCase().indexOf("no-") === 0) {
-        no = !no
-        arg = arg.substr(3)
-      }
-
-      if (abbrevs[arg]) arg = abbrevs[arg]
-
-      var isArray = types[arg] === Array ||
-        Array.isArray(types[arg]) && types[arg].indexOf(Array) !== -1
-
-      // allow unknown things to be arrays if specified multiple times.
-      if (!types.hasOwnProperty(arg) && data.hasOwnProperty(arg)) {
-        if (!Array.isArray(data[arg]))
-          data[arg] = [data[arg]]
-        isArray = true
-      }
-
-      var val
-        , la = args[i + 1]
-
-      var isBool = typeof no === 'boolean' ||
-        types[arg] === Boolean ||
-        Array.isArray(types[arg]) && types[arg].indexOf(Boolean) !== -1 ||
-        (typeof types[arg] === 'undefined' && !hadEq) ||
-        (la === "false" &&
-         (types[arg] === null ||
-          Array.isArray(types[arg]) && ~types[arg].indexOf(null)))
-
-      if (isBool) {
-        // just set and move along
-        val = !no
-        // however, also support --bool true or --bool false
-        if (la === "true" || la === "false") {
-          val = JSON.parse(la)
-          la = null
-          if (no) val = !val
-          i ++
-        }
-
-        // also support "foo":[Boolean, "bar"] and "--foo bar"
-        if (Array.isArray(types[arg]) && la) {
-          if (~types[arg].indexOf(la)) {
-            // an explicit type
-            val = la
-            i ++
-          } else if ( la === "null" && ~types[arg].indexOf(null) ) {
-            // null allowed
-            val = null
-            i ++
-          } else if ( !la.match(/^-{2,}[^-]/) &&
-                      !isNaN(la) &&
-                      ~types[arg].indexOf(Number) ) {
-            // number
-            val = +la
-            i ++
-          } else if ( !la.match(/^-[^-]/) && ~types[arg].indexOf(String) ) {
-            // string
-            val = la
-            i ++
-          }
-        }
-
-        if (isArray) (data[arg] = data[arg] || []).push(val)
-        else data[arg] = val
-
-        continue
-      }
-
-      if (types[arg] === String && la === undefined)
-        la = ""
-
-      if (la && la.match(/^-{2,}$/)) {
-        la = undefined
-        i --
-      }
-
-      val = la === undefined ? true : la
-      if (isArray) (data[arg] = data[arg] || []).push(val)
-      else data[arg] = val
-
-      i ++
-      continue
-    }
-    remain.push(arg)
-  }
-}
-
-function resolveShort (arg, shorthands, shortAbbr, abbrevs) {
-  // handle single-char shorthands glommed together, like
-  // npm ls -glp, but only if there is one dash, and only if
-  // all of the chars are single-char shorthands, and it's
-  // not a match to some other abbrev.
-  arg = arg.replace(/^-+/, '')
-
-  // if it's an exact known option, then don't go any further
-  if (abbrevs[arg] === arg)
-    return null
-
-  // if it's an exact known shortopt, same deal
-  if (shorthands[arg]) {
-    // make it an array, if it's a list of words
-    if (shorthands[arg] && !Array.isArray(shorthands[arg]))
-      shorthands[arg] = shorthands[arg].split(/\s+/)
-
-    return shorthands[arg]
-  }
-
-  // first check to see if this arg is a set of single-char shorthands
-  var singles = shorthands.___singles
-  if (!singles) {
-    singles = Object.keys(shorthands).filter(function (s) {
-      return s.length === 1
-    }).reduce(function (l,r) {
-      l[r] = true
-      return l
-    }, {})
-    shorthands.___singles = singles
-    debug('shorthand singles', singles)
-  }
-
-  var chrs = arg.split("").filter(function (c) {
-    return singles[c]
-  })
-
-  if (chrs.join("") === arg) return chrs.map(function (c) {
-    return shorthands[c]
-  }).reduce(function (l, r) {
-    return l.concat(r)
-  }, [])
-
-
-  // if it's an arg abbrev, and not a literal shorthand, then prefer the arg
-  if (abbrevs[arg] && !shorthands[arg])
-    return null
-
-  // if it's an abbr for a shorthand, then use that
-  if (shortAbbr[arg])
-    arg = shortAbbr[arg]
-
-  // make it an array, if it's a list of words
-  if (shorthands[arg] && !Array.isArray(shorthands[arg]))
-    shorthands[arg] = shorthands[arg].split(/\s+/)
-
-  return shorthands[arg]
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/README.md
deleted file mode 100644
index 99746fe67c4620f767749290e0a0863721861447..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# abbrev-js
-
-Just like [ruby's Abbrev](http://apidock.com/ruby/Abbrev).
-
-Usage:
-
-    var abbrev = require("abbrev");
-    abbrev("foo", "fool", "folding", "flop");
-    
-    // returns:
-    { fl: 'flop'
-    , flo: 'flop'
-    , flop: 'flop'
-    , fol: 'folding'
-    , fold: 'folding'
-    , foldi: 'folding'
-    , foldin: 'folding'
-    , folding: 'folding'
-    , foo: 'foo'
-    , fool: 'fool'
-    }
-
-This is handy for command-line scripts, or other cases where you want to be able to accept shorthands.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/abbrev.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/abbrev.js
deleted file mode 100644
index 69cfeac5218b7388ce6e5cbe28b30f8123841066..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/abbrev.js
+++ /dev/null
@@ -1,62 +0,0 @@
-
-module.exports = exports = abbrev.abbrev = abbrev
-
-abbrev.monkeyPatch = monkeyPatch
-
-function monkeyPatch () {
-  Object.defineProperty(Array.prototype, 'abbrev', {
-    value: function () { return abbrev(this) },
-    enumerable: false, configurable: true, writable: true
-  })
-
-  Object.defineProperty(Object.prototype, 'abbrev', {
-    value: function () { return abbrev(Object.keys(this)) },
-    enumerable: false, configurable: true, writable: true
-  })
-}
-
-function abbrev (list) {
-  if (arguments.length !== 1 || !Array.isArray(list)) {
-    list = Array.prototype.slice.call(arguments, 0)
-  }
-  for (var i = 0, l = list.length, args = [] ; i < l ; i ++) {
-    args[i] = typeof list[i] === "string" ? list[i] : String(list[i])
-  }
-
-  // sort them lexicographically, so that they're next to their nearest kin
-  args = args.sort(lexSort)
-
-  // walk through each, seeing how much it has in common with the next and previous
-  var abbrevs = {}
-    , prev = ""
-  for (var i = 0, l = args.length ; i < l ; i ++) {
-    var current = args[i]
-      , next = args[i + 1] || ""
-      , nextMatches = true
-      , prevMatches = true
-    if (current === next) continue
-    for (var j = 0, cl = current.length ; j < cl ; j ++) {
-      var curChar = current.charAt(j)
-      nextMatches = nextMatches && curChar === next.charAt(j)
-      prevMatches = prevMatches && curChar === prev.charAt(j)
-      if (!nextMatches && !prevMatches) {
-        j ++
-        break
-      }
-    }
-    prev = current
-    if (j === cl) {
-      abbrevs[current] = current
-      continue
-    }
-    for (var a = current.substr(0, j) ; j <= cl ; j ++) {
-      abbrevs[a] = current
-      a += current.charAt(j)
-    }
-  }
-  return abbrevs
-}
-
-function lexSort (a, b) {
-  return a === b ? 0 : a > b ? 1 : -1
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/package.json
deleted file mode 100644
index aca33b43eeffad00d5d863fb467adfb63571a26a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/node_modules/abbrev/package.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "_from": "abbrev@>=1.0.0 <2.0.0",
-  "_id": "abbrev@1.0.9",
-  "_location": "/serialport/node-pre-gyp/nopt/abbrev",
-  "_nodeVersion": "4.4.4",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/abbrev-1.0.9.tgz_1466016055839_0.7825860097073019"
-  },
-  "_npmUser": {
-    "email": "i@izs.me",
-    "name": "isaacs"
-  },
-  "_npmVersion": "3.9.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/nopt"
-  ],
-  "_resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz",
-  "_shasum": "91b4792588a7738c25f35dd6f63752a2f8776135",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/abbrev-js/issues"
-  },
-  "dependencies": {},
-  "description": "Like ruby's abbrev module, but in js",
-  "devDependencies": {
-    "tap": "^5.7.2"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "91b4792588a7738c25f35dd6f63752a2f8776135",
-    "tarball": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz"
-  },
-  "files": [
-    "abbrev.js"
-  ],
-  "gitHead": "c386cd9dbb1d8d7581718c54d4ba944cc9298d6f",
-  "homepage": "https://github.com/isaacs/abbrev-js#readme",
-  "license": "ISC",
-  "main": "abbrev.js",
-  "maintainers": [
-    {
-      "name": "isaacs",
-      "email": "i@izs.me"
-    }
-  ],
-  "name": "abbrev",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+ssh://git@github.com/isaacs/abbrev-js.git"
-  },
-  "scripts": {
-    "test": "tap test.js --cov"
-  },
-  "version": "1.0.9"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/package.json
deleted file mode 100644
index 346dc4499bd3652d2d66a5fcfc02db9a3e7c3b93..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "_from": "nopt@>=3.0.6 <3.1.0",
-  "_id": "nopt@3.0.6",
-  "_location": "/serialport/node-pre-gyp/nopt",
-  "_nodeVersion": "4.2.1",
-  "_npmUser": {
-    "email": "ogd@aoaioxxysz.net",
-    "name": "othiym23"
-  },
-  "_npmVersion": "2.14.10",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp"
-  ],
-  "_resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz",
-  "_shasum": "c6465dbf08abcd4db359317f79ac68a646b28ff9",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bin": {
-    "nopt": "./bin/nopt.js"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/nopt/issues"
-  },
-  "dependencies": {
-    "abbrev": "1"
-  },
-  "description": "Option parsing for Node, supporting types, shorthands, etc. Used by npm.",
-  "devDependencies": {
-    "tap": "^1.2.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "c6465dbf08abcd4db359317f79ac68a646b28ff9",
-    "tarball": "http://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz"
-  },
-  "gitHead": "10a750c9bb99c1950160353459e733ac2aa18cb6",
-  "homepage": "https://github.com/npm/nopt#readme",
-  "license": "ISC",
-  "main": "lib/nopt.js",
-  "maintainers": [
-    {
-      "name": "isaacs",
-      "email": "i@izs.me"
-    },
-    {
-      "name": "othiym23",
-      "email": "ogd@aoaioxxysz.net"
-    },
-    {
-      "name": "zkat",
-      "email": "kat@sykosomatic.org"
-    }
-  ],
-  "name": "nopt",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/nopt.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "3.0.6"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/test/basic.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/test/basic.js
deleted file mode 100644
index d399de9209932c4a09b1f4302c94e81046f16bde..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/nopt/test/basic.js
+++ /dev/null
@@ -1,273 +0,0 @@
-var nopt = require("../")
-  , test = require('tap').test
-
-
-test("passing a string results in a string", function (t) {
-  var parsed = nopt({ key: String }, {}, ["--key", "myvalue"], 0)
-  t.same(parsed.key, "myvalue")
-  t.end()
-})
-
-// https://github.com/npm/nopt/issues/31
-test("Empty String results in empty string, not true", function (t) {
-  var parsed = nopt({ empty: String }, {}, ["--empty"], 0)
-  t.same(parsed.empty, "")
-  t.end()
-})
-
-test("~ path is resolved to $HOME", function (t) {
-  var path = require("path")
-  if (!process.env.HOME) process.env.HOME = "/tmp"
-  var parsed = nopt({key: path}, {}, ["--key=~/val"], 0)
-  t.same(parsed.key, path.resolve(process.env.HOME, "val"))
-  t.end()
-})
-
-// https://github.com/npm/nopt/issues/24
-test("Unknown options are not parsed as numbers", function (t) {
-    var parsed = nopt({"parse-me": Number}, null, ['--leave-as-is=1.20', '--parse-me=1.20'], 0)
-    t.equal(parsed['leave-as-is'], '1.20')
-    t.equal(parsed['parse-me'], 1.2)
-    t.end()
-});
-
-// https://github.com/npm/nopt/issues/48
-test("Check types based on name of type", function (t) {
-  var parsed = nopt({"parse-me": {name: "Number"}}, null, ['--parse-me=1.20'], 0)
-  t.equal(parsed['parse-me'], 1.2)
-  t.end()
-})
-
-
-test("Missing types are not parsed", function (t) {
-  var parsed = nopt({"parse-me": {}}, null, ['--parse-me=1.20'], 0)
-  //should only contain argv
-  t.equal(Object.keys(parsed).length, 1)
-  t.end()
-})
-
-test("Types passed without a name are not parsed", function (t) {
-  var parsed = nopt({"parse-me": {}}, {}, ['--parse-me=1.20'], 0)
-  //should only contain argv
-  t.equal(Object.keys(parsed).length, 1)
-  t.end()
-})
-
-test("other tests", function (t) {
-
-  var util = require("util")
-    , Stream = require("stream")
-    , path = require("path")
-    , url = require("url")
-
-    , shorthands =
-      { s : ["--loglevel", "silent"]
-      , d : ["--loglevel", "info"]
-      , dd : ["--loglevel", "verbose"]
-      , ddd : ["--loglevel", "silly"]
-      , noreg : ["--no-registry"]
-      , reg : ["--registry"]
-      , "no-reg" : ["--no-registry"]
-      , silent : ["--loglevel", "silent"]
-      , verbose : ["--loglevel", "verbose"]
-      , h : ["--usage"]
-      , H : ["--usage"]
-      , "?" : ["--usage"]
-      , help : ["--usage"]
-      , v : ["--version"]
-      , f : ["--force"]
-      , desc : ["--description"]
-      , "no-desc" : ["--no-description"]
-      , "local" : ["--no-global"]
-      , l : ["--long"]
-      , p : ["--parseable"]
-      , porcelain : ["--parseable"]
-      , g : ["--global"]
-      }
-
-    , types =
-      { aoa: Array
-      , nullstream: [null, Stream]
-      , date: Date
-      , str: String
-      , browser : String
-      , cache : path
-      , color : ["always", Boolean]
-      , depth : Number
-      , description : Boolean
-      , dev : Boolean
-      , editor : path
-      , force : Boolean
-      , global : Boolean
-      , globalconfig : path
-      , group : [String, Number]
-      , gzipbin : String
-      , logfd : [Number, Stream]
-      , loglevel : ["silent","win","error","warn","info","verbose","silly"]
-      , long : Boolean
-      , "node-version" : [false, String]
-      , npaturl : url
-      , npat : Boolean
-      , "onload-script" : [false, String]
-      , outfd : [Number, Stream]
-      , parseable : Boolean
-      , pre: Boolean
-      , prefix: path
-      , proxy : url
-      , "rebuild-bundle" : Boolean
-      , registry : url
-      , searchopts : String
-      , searchexclude: [null, String]
-      , shell : path
-      , t: [Array, String]
-      , tag : String
-      , tar : String
-      , tmp : path
-      , "unsafe-perm" : Boolean
-      , usage : Boolean
-      , user : String
-      , username : String
-      , userconfig : path
-      , version : Boolean
-      , viewer: path
-      , _exit : Boolean
-      , path: path
-      }
-
-  ; [["-v", {version:true}, []]
-    ,["---v", {version:true}, []]
-    ,["ls -s --no-reg connect -d",
-      {loglevel:"info",registry:null},["ls","connect"]]
-    ,["ls ---s foo",{loglevel:"silent"},["ls","foo"]]
-    ,["ls --registry blargle", {}, ["ls"]]
-    ,["--no-registry", {registry:null}, []]
-    ,["--no-color true", {color:false}, []]
-    ,["--no-color false", {color:true}, []]
-    ,["--no-color", {color:false}, []]
-    ,["--color false", {color:false}, []]
-    ,["--color --logfd 7", {logfd:7,color:true}, []]
-    ,["--color=true", {color:true}, []]
-    ,["--logfd=10", {logfd:10}, []]
-    ,["--tmp=/tmp -tar=gtar",{tmp:"/tmp",tar:"gtar"},[]]
-    ,["--tmp=tmp -tar=gtar",
-      {tmp:path.resolve(process.cwd(), "tmp"),tar:"gtar"},[]]
-    ,["--logfd x", {}, []]
-    ,["a -true -- -no-false", {true:true},["a","-no-false"]]
-    ,["a -no-false", {false:false},["a"]]
-    ,["a -no-no-true", {true:true}, ["a"]]
-    ,["a -no-no-no-false", {false:false}, ["a"]]
-    ,["---NO-no-No-no-no-no-nO-no-no"+
-      "-No-no-no-no-no-no-no-no-no"+
-      "-no-no-no-no-NO-NO-no-no-no-no-no-no"+
-      "-no-body-can-do-the-boogaloo-like-I-do"
-     ,{"body-can-do-the-boogaloo-like-I-do":false}, []]
-    ,["we are -no-strangers-to-love "+
-      "--you-know=the-rules --and=so-do-i "+
-      "---im-thinking-of=a-full-commitment "+
-      "--no-you-would-get-this-from-any-other-guy "+
-      "--no-gonna-give-you-up "+
-      "-no-gonna-let-you-down=true "+
-      "--no-no-gonna-run-around false "+
-      "--desert-you=false "+
-      "--make-you-cry false "+
-      "--no-tell-a-lie "+
-      "--no-no-and-hurt-you false"
-     ,{"strangers-to-love":false
-      ,"you-know":"the-rules"
-      ,"and":"so-do-i"
-      ,"you-would-get-this-from-any-other-guy":false
-      ,"gonna-give-you-up":false
-      ,"gonna-let-you-down":false
-      ,"gonna-run-around":false
-      ,"desert-you":false
-      ,"make-you-cry":false
-      ,"tell-a-lie":false
-      ,"and-hurt-you":false
-      },["we", "are"]]
-    ,["-t one -t two -t three"
-     ,{t: ["one", "two", "three"]}
-     ,[]]
-    ,["-t one -t null -t three four five null"
-     ,{t: ["one", "null", "three"]}
-     ,["four", "five", "null"]]
-    ,["-t foo"
-     ,{t:["foo"]}
-     ,[]]
-    ,["--no-t"
-     ,{t:["false"]}
-     ,[]]
-    ,["-no-no-t"
-     ,{t:["true"]}
-     ,[]]
-    ,["-aoa one -aoa null -aoa 100"
-     ,{aoa:["one", null, '100']}
-     ,[]]
-    ,["-str 100"
-     ,{str:"100"}
-     ,[]]
-    ,["--color always"
-     ,{color:"always"}
-     ,[]]
-    ,["--no-nullstream"
-     ,{nullstream:null}
-     ,[]]
-    ,["--nullstream false"
-     ,{nullstream:null}
-     ,[]]
-    ,["--notadate=2011-01-25"
-     ,{notadate: "2011-01-25"}
-     ,[]]
-    ,["--date 2011-01-25"
-     ,{date: new Date("2011-01-25")}
-     ,[]]
-    ,["-cl 1"
-     ,{config: true, length: 1}
-     ,[]
-     ,{config: Boolean, length: Number, clear: Boolean}
-     ,{c: "--config", l: "--length"}]
-    ,["--acount bla"
-     ,{"acount":true}
-     ,["bla"]
-     ,{account: Boolean, credentials: Boolean, options: String}
-     ,{a:"--account", c:"--credentials",o:"--options"}]
-    ,["--clear"
-     ,{clear:true}
-     ,[]
-     ,{clear:Boolean,con:Boolean,len:Boolean,exp:Boolean,add:Boolean,rep:Boolean}
-     ,{c:"--con",l:"--len",e:"--exp",a:"--add",r:"--rep"}]
-    ,["--file -"
-     ,{"file":"-"}
-     ,[]
-     ,{file:String}
-     ,{}]
-    ,["--file -"
-     ,{"file":true}
-     ,["-"]
-     ,{file:Boolean}
-     ,{}]
-    ,["--path"
-     ,{"path":null}
-     ,[]]
-    ,["--path ."
-     ,{"path":process.cwd()}
-     ,[]]
-    ].forEach(function (test) {
-      var argv = test[0].split(/\s+/)
-        , opts = test[1]
-        , rem = test[2]
-        , actual = nopt(test[3] || types, test[4] || shorthands, argv, 0)
-        , parsed = actual.argv
-      delete actual.argv
-      for (var i in opts) {
-        var e = JSON.stringify(opts[i])
-          , a = JSON.stringify(actual[i] === undefined ? null : actual[i])
-        if (e && typeof e === "object") {
-          t.deepEqual(e, a)
-        } else {
-          t.equal(e, a)
-        }
-      }
-      t.deepEqual(rem, parsed.remain)
-    })
-  t.end()
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/CHANGELOG.md
deleted file mode 100644
index f549a1f3de81e3f21c0970938e608c6bcef0cff7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/CHANGELOG.md
+++ /dev/null
@@ -1,36 +0,0 @@
-### v3.1.2
-
-* Update to `gauge@1.6.0` adding support for default values for template
-  items.
-
-### v3.1.1
-
-* Update to `gauge@1.5.3` to fix to `1.x` compatibility when it comes to
-  when a progress bar is enabled.  In `1.x` if you didn't have a TTY the
-  progress bar was never shown.  In `2.x` it merely defaults to disabled,
-  but you can enable it explicitly if you still want progress updates.
-
-### v3.1.0
-
-* Update to `gauge@2.5.2`:
-  * Updates the `signal-exit` dependency which fixes an incompatibility with
-    the node profiler.
-  * Uses externalizes its ansi code generation in `console-control-strings`
-* Make the default progress bar include the last line printed, colored as it
-  would be when printing to a tty.
-
-### v3.0.0
-
-* Switch to `gauge@2.0.0`, for better performance, better look.
-* Set stderr/stdout blocking if they're tty's, so that we can hide a
-  progress bar going to stderr and then safely print to stdout.  Without
-  this the two can end up overlapping producing confusing and sometimes
-  corrupted output.
-
-### v2.0.0
-
-* Make the `error` event non-fatal so that folks can use it as a prefix.
-
-### v1.0.0
-
-* Add progress bar with `gauge@1.1.0`
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/CHANGELOG.md~ b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/CHANGELOG.md~
deleted file mode 100644
index a373c6a8eee5a4c92111f87a2267ecacae57c2bd..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/CHANGELOG.md~
+++ /dev/null
@@ -1,31 +0,0 @@
-### v3.1.1
-
-* Update to `gauge@1.5.3` to fix to `1.x` compatibility when it comes to
-  when a progress bar is enabled.  In `1.x` if you didn't have a TTY the
-  progress bar was never shown.  In `2.x` it merely defaults to disabled,
-  but you can enable it explicitly if you still want progress updates.
-
-### v3.1.0
-
-* Update to `gauge@2.5.2`:
-  * Updates the `signal-exit` dependency which fixes an incompatibility with
-    the node profiler.
-  * Uses externalizes its ansi code generation in `console-control-strings`
-* Make the default progress bar include the last line printed, colored as it
-  would be when printing to a tty.
-
-### v3.0.0
-
-* Switch to `gauge@2.0.0`, for better performance, better look.
-* Set stderr/stdout blocking if they're tty's, so that we can hide a
-  progress bar going to stderr and then safely print to stdout.  Without
-  this the two can end up overlapping producing confusing and sometimes
-  corrupted output.
-
-### v2.0.0
-
-* Make the `error` event non-fatal so that folks can use it as a prefix.
-
-### v1.0.0
-
-* Add progress bar with `gauge@1.1.0`
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/README.md
deleted file mode 100644
index dba35501614e911ec66a252663cd44ccdfa77be1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/README.md
+++ /dev/null
@@ -1,210 +0,0 @@
-# npmlog
-
-The logger util that npm uses.
-
-This logger is very basic.  It does the logging for npm.  It supports
-custom levels and colored output.
-
-By default, logs are written to stderr.  If you want to send log messages
-to outputs other than streams, then you can change the `log.stream`
-member, or you can just listen to the events that it emits, and do
-whatever you want with them.
-
-# Basic Usage
-
-```
-var log = require('npmlog')
-
-// additional stuff ---------------------------+
-// message ----------+                         |
-// prefix ----+      |                         |
-// level -+   |      |                         |
-//        v   v      v                         v
-    log.info('fyi', 'I have a kitty cat: %j', myKittyCat)
-```
-
-## log.level
-
-* {String}
-
-The level to display logs at.  Any logs at or above this level will be
-displayed.  The special level `silent` will prevent anything from being
-displayed ever.
-
-## log.record
-
-* {Array}
-
-An array of all the log messages that have been entered.
-
-## log.maxRecordSize
-
-* {Number}
-
-The maximum number of records to keep.  If log.record gets bigger than
-10% over this value, then it is sliced down to 90% of this value.
-
-The reason for the 10% window is so that it doesn't have to resize a
-large array on every log entry.
-
-## log.prefixStyle
-
-* {Object}
-
-A style object that specifies how prefixes are styled.  (See below)
-
-## log.headingStyle
-
-* {Object}
-
-A style object that specifies how the heading is styled.  (See below)
-
-## log.heading
-
-* {String} Default: ""
-
-If set, a heading that is printed at the start of every line.
-
-## log.stream
-
-* {Stream} Default: `process.stderr`
-
-The stream where output is written.
-
-## log.enableColor()
-
-Force colors to be used on all messages, regardless of the output
-stream.
-
-## log.disableColor()
-
-Disable colors on all messages.
-
-## log.enableProgress()
-
-Enable the display of log activity spinner and progress bar
-
-## log.disableProgress()
-
-Disable the display of a progress bar
-
-## log.enableUnicode()
-
-Force the unicode theme to be used for the progress bar.
-
-## log.disableUnicode()
-
-Disable the use of unicode in the progress bar.
-
-## log.setGaugeTemplate(template)
-
-Set a template for outputting the progress bar. See the [gauge documentation] for details.
-
-[gauge documentation]: https://npmjs.com/package/gauge
-
-## log.setGaugeThemeset(themes)
-
-Select a themeset to pick themes from for the progress bar. See the [gauge documentation] for details.
-
-## log.pause()
-
-Stop emitting messages to the stream, but do not drop them.
-
-## log.resume()
-
-Emit all buffered messages that were written while paused.
-
-## log.log(level, prefix, message, ...)
-
-* `level` {String} The level to emit the message at
-* `prefix` {String} A string prefix.  Set to "" to skip.
-* `message...` Arguments to `util.format`
-
-Emit a log message at the specified level.
-
-## log\[level](prefix, message, ...)
-
-For example,
-
-* log.silly(prefix, message, ...)
-* log.verbose(prefix, message, ...)
-* log.info(prefix, message, ...)
-* log.http(prefix, message, ...)
-* log.warn(prefix, message, ...)
-* log.error(prefix, message, ...)
-
-Like `log.log(level, prefix, message, ...)`.  In this way, each level is
-given a shorthand, so you can do `log.info(prefix, message)`.
-
-## log.addLevel(level, n, style, disp)
-
-* `level` {String} Level indicator
-* `n` {Number} The numeric level
-* `style` {Object} Object with fg, bg, inverse, etc.
-* `disp` {String} Optional replacement for `level` in the output.
-
-Sets up a new level with a shorthand function and so forth.
-
-Note that if the number is `Infinity`, then setting the level to that
-will cause all log messages to be suppressed.  If the number is
-`-Infinity`, then the only way to show it is to enable all log messages.
-
-## log.newItem(name, todo, weight)
-
-* `name` {String} Optional; progress item name.
-* `todo` {Number} Optional; total amount of work to be done. Default 0.
-* `weight` {Number} Optional; the weight of this item relative to others. Default 1.
-
-This adds a new `are-we-there-yet` item tracker to the progress tracker. The
-object returned has the `log[level]` methods but is otherwise an
-`are-we-there-yet` `Tracker` object.
-
-## log.newStream(name, todo, weight)
-
-This adds a new `are-we-there-yet` stream tracker to the progress tracker. The
-object returned has the `log[level]` methods but is otherwise an
-`are-we-there-yet` `TrackerStream` object.
-
-## log.newGroup(name, weight)
-
-This adds a new `are-we-there-yet` tracker group to the progress tracker. The
-object returned has the `log[level]` methods but is otherwise an
-`are-we-there-yet` `TrackerGroup` object.
-
-# Events
-
-Events are all emitted with the message object.
-
-* `log` Emitted for all messages
-* `log.<level>` Emitted for all messages with the `<level>` level.
-* `<prefix>` Messages with prefixes also emit their prefix as an event.
-
-# Style Objects
-
-Style objects can have the following fields:
-
-* `fg` {String} Color for the foreground text
-* `bg` {String} Color for the background
-* `bold`, `inverse`, `underline` {Boolean} Set the associated property
-* `bell` {Boolean} Make a noise (This is pretty annoying, probably.)
-
-# Message Objects
-
-Every log event is emitted with a message object, and the `log.record`
-list contains all of them that have been created.  They have the
-following fields:
-
-* `id` {Number}
-* `level` {String}
-* `prefix` {String}
-* `message` {String} Result of `util.format()`
-* `messageRaw` {Array} Arguments to `util.format()`
-
-# Blocking TTYs
-
-We use [`set-blocking`](https://npmjs.com/package/set-blocking) to set
-stderr and stdout blocking if they are tty's and have the setBlocking call.
-This is a work around for an issue in early versions of Node.js 6.x, which
-made stderr and stdout non-blocking on OSX. (They are always blocking
-Windows and were never blocking on Linux.) `npmlog` needs them to be blocking
-so that it can allow output to stdout and stderr to be interlaced.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/log.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/log.js
deleted file mode 100644
index e5b70f1f80b743bd271e7662d344b01ffb8a3643..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/log.js
+++ /dev/null
@@ -1,298 +0,0 @@
-'use strict'
-var Progress = require('are-we-there-yet')
-var Gauge = require('gauge')
-var EE = require('events').EventEmitter
-var log = exports = module.exports = new EE()
-var util = require('util')
-
-var setBlocking = require('set-blocking')
-var consoleControl = require('console-control-strings')
-
-setBlocking(true)
-var stream = process.stderr
-Object.defineProperty(log, 'stream', {
-  set: function (newStream) {
-    stream = newStream
-    if (this.gauge) this.gauge.setWriteTo(stream, stream)
-  },
-  get: function () {
-    return stream
-  }
-})
-
-// by default, decide based on tty-ness.
-var colorEnabled
-log.useColor = function () {
-  return colorEnabled != null ? colorEnabled : stream.isTTY
-}
-
-log.enableColor = function () {
-  colorEnabled = true
-  this.gauge.setTheme({hasColor: colorEnabled, hasUnicode: unicodeEnabled})
-}
-log.disableColor = function () {
-  colorEnabled = false
-  this.gauge.setTheme({hasColor: colorEnabled, hasUnicode: unicodeEnabled})
-}
-
-// default level
-log.level = 'info'
-
-log.gauge = new Gauge(stream, {
-  theme: {hasColor: log.useColor()},
-  template: [
-    {type: 'progressbar', length: 20},
-    {type: 'activityIndicator', kerning: 1, length: 1},
-    {type: 'section', default: ''},
-    ':',
-    {type: 'logline', kerning: 1, default: ''}
-  ]
-})
-
-log.tracker = new Progress.TrackerGroup()
-
-// no progress bars unless asked
-log.progressEnabled = false
-
-var unicodeEnabled
-
-log.enableUnicode = function () {
-  unicodeEnabled = true
-  this.gauge.setTheme({hasColor: this.useColor(), hasUnicode: unicodeEnabled})
-}
-
-log.disableUnicode = function () {
-  unicodeEnabled = false
-  this.gauge.setTheme({hasColor: this.useColor(), hasUnicode: unicodeEnabled})
-}
-
-log.setGaugeThemeset = function (themes) {
-  this.gauge.setThemeset(themes)
-}
-
-log.setGaugeTemplate = function (template) {
-  this.gauge.setTemplate(template)
-}
-
-log.enableProgress = function () {
-  if (this.progressEnabled) return
-  this.progressEnabled = true
-  if (this._pause) return
-  this.tracker.on('change', this.showProgress)
-  this.gauge.enable()
-  this.showProgress()
-}
-
-log.disableProgress = function () {
-  if (!this.progressEnabled) return
-  this.clearProgress()
-  this.progressEnabled = false
-  this.tracker.removeListener('change', this.showProgress)
-  this.gauge.disable()
-}
-
-var trackerConstructors = ['newGroup', 'newItem', 'newStream']
-
-var mixinLog = function (tracker) {
-  // mixin the public methods from log into the tracker
-  // (except: conflicts and one's we handle specially)
-  Object.keys(log).forEach(function (P) {
-    if (P[0] === '_') return
-    if (trackerConstructors.filter(function (C) { return C === P }).length) return
-    if (tracker[P]) return
-    if (typeof log[P] !== 'function') return
-    var func = log[P]
-    tracker[P] = function () {
-      return func.apply(log, arguments)
-    }
-  })
-  // if the new tracker is a group, make sure any subtrackers get
-  // mixed in too
-  if (tracker instanceof Progress.TrackerGroup) {
-    trackerConstructors.forEach(function (C) {
-      var func = tracker[C]
-      tracker[C] = function () { return mixinLog(func.apply(tracker, arguments)) }
-    })
-  }
-  return tracker
-}
-
-// Add tracker constructors to the top level log object
-trackerConstructors.forEach(function (C) {
-  log[C] = function () { return mixinLog(this.tracker[C].apply(this.tracker, arguments)) }
-})
-
-log.clearProgress = function (cb) {
-  if (!this.progressEnabled) return cb && process.nextTick(cb)
-  this.gauge.hide(cb)
-}
-
-log.showProgress = function (name, completed) {
-  if (!this.progressEnabled) return
-  var values = {}
-  if (name) values.section = name
-  var last = log.record[log.record.length - 1]
-  if (last) {
-    values.subsection = last.prefix
-    var disp = log.disp[last.level] || last.level
-    var logline = this._format(disp, log.style[last.level])
-    if (last.prefix) logline += ' ' + this._format(last.prefix, this.prefixStyle)
-    logline += ' ' + last.message.split(/\r?\n/)[0]
-    values.logline = logline
-  }
-  values.completed = completed || this.tracker.completed()
-  this.gauge.show(values)
-}.bind(log) // bind for use in tracker's on-change listener
-
-// temporarily stop emitting, but don't drop
-log.pause = function () {
-  this._paused = true
-}
-
-log.resume = function () {
-  if (!this._paused) return
-  this._paused = false
-
-  var b = this._buffer
-  this._buffer = []
-  b.forEach(function (m) {
-    this.emitLog(m)
-  }, this)
-  if (this.progressEnabled) this.enableProgress()
-}
-
-log._buffer = []
-
-var id = 0
-log.record = []
-log.maxRecordSize = 10000
-log.log = function (lvl, prefix, message) {
-  var l = this.levels[lvl]
-  if (l === undefined) {
-    return this.emit('error', new Error(util.format(
-      'Undefined log level: %j', lvl)))
-  }
-
-  var a = new Array(arguments.length - 2)
-  var stack = null
-  for (var i = 2; i < arguments.length; i++) {
-    var arg = a[i - 2] = arguments[i]
-
-    // resolve stack traces to a plain string.
-    if (typeof arg === 'object' && arg &&
-        (arg instanceof Error) && arg.stack) {
-      arg.stack = stack = arg.stack + ''
-    }
-  }
-  if (stack) a.unshift(stack + '\n')
-  message = util.format.apply(util, a)
-
-  var m = { id: id++,
-            level: lvl,
-            prefix: String(prefix || ''),
-            message: message,
-            messageRaw: a }
-
-  this.emit('log', m)
-  this.emit('log.' + lvl, m)
-  if (m.prefix) this.emit(m.prefix, m)
-
-  this.record.push(m)
-  var mrs = this.maxRecordSize
-  var n = this.record.length - mrs
-  if (n > mrs / 10) {
-    var newSize = Math.floor(mrs * 0.9)
-    this.record = this.record.slice(-1 * newSize)
-  }
-
-  this.emitLog(m)
-}.bind(log)
-
-log.emitLog = function (m) {
-  if (this._paused) {
-    this._buffer.push(m)
-    return
-  }
-  if (this.progressEnabled) this.gauge.pulse(m.prefix)
-  var l = this.levels[m.level]
-  if (l === undefined) return
-  if (l < this.levels[this.level]) return
-  if (l > 0 && !isFinite(l)) return
-
-  var disp = log.disp[m.level] || m.level
-  this.clearProgress()
-  m.message.split(/\r?\n/).forEach(function (line) {
-    if (this.heading) {
-      this.write(this.heading, this.headingStyle)
-      this.write(' ')
-    }
-    this.write(disp, log.style[m.level])
-    var p = m.prefix || ''
-    if (p) this.write(' ')
-    this.write(p, this.prefixStyle)
-    this.write(' ' + line + '\n')
-  }, this)
-  this.showProgress()
-}
-
-log._format = function (msg, style) {
-  if (!stream) return
-
-  var output = ''
-  if (this.useColor()) {
-    style = style || {}
-    var settings = []
-    if (style.fg) settings.push(style.fg)
-    if (style.bg) settings.push('bg' + style.bg[0].toUpperCase() + style.bg.slice(1))
-    if (style.bold) settings.push('bold')
-    if (style.underline) settings.push('underline')
-    if (style.inverse) settings.push('inverse')
-    if (settings.length) output += consoleControl.color(settings)
-    if (style.beep) output += consoleControl.beep()
-  }
-  output += msg
-  if (this.useColor()) {
-    output += consoleControl.color('reset')
-  }
-  return output
-}
-
-log.write = function (msg, style) {
-  if (!stream) return
-
-  stream.write(this._format(msg, style))
-}
-
-log.addLevel = function (lvl, n, style, disp) {
-  if (!disp) disp = lvl
-  this.levels[lvl] = n
-  this.style[lvl] = style
-  if (!this[lvl]) {
-    this[lvl] = function () {
-      var a = new Array(arguments.length + 1)
-      a[0] = lvl
-      for (var i = 0; i < arguments.length; i++) {
-        a[i + 1] = arguments[i]
-      }
-      return this.log.apply(this, a)
-    }.bind(this)
-  }
-  this.disp[lvl] = disp
-}
-
-log.prefixStyle = { fg: 'magenta' }
-log.headingStyle = { fg: 'white', bg: 'black' }
-
-log.style = {}
-log.levels = {}
-log.disp = {}
-log.addLevel('silly', -Infinity, { inverse: true }, 'sill')
-log.addLevel('verbose', 1000, { fg: 'blue', bg: 'black' }, 'verb')
-log.addLevel('info', 2000, { fg: 'green' })
-log.addLevel('http', 3000, { fg: 'green', bg: 'black' })
-log.addLevel('warn', 4000, { fg: 'black', bg: 'yellow' }, 'WARN')
-log.addLevel('error', 5000, { fg: 'red', bg: 'black' }, 'ERR!')
-log.addLevel('silent', Infinity)
-
-// allow 'error' prefix
-log.on('error', function () {})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/.npmignore
deleted file mode 100644
index bc818974f8633f0678a488b02c1efd2bf2e67ba4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-*~
-.#*
-node_modules
-coverage
-.nyc_output
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/CHANGES.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/CHANGES.md
deleted file mode 100644
index e990b86ddfb416a439ec36580674092f5926ba5b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/CHANGES.md
+++ /dev/null
@@ -1,19 +0,0 @@
-Hi, figured we could actually use a changelog now:
-
-## 1.1.1 2016-01-29
-
-* Fix a typo in stream completion tracker
-
-## 1.1.0 2016-01-29
-
-* Rewrote completion percent computation to be low impact– no more walking a
-  tree of completion groups every time we need this info.  Previously, with
-  medium sized tree of completion groups, even a relatively modest number of
-  calls to the top level `completed()` method would result in absurd numbers
-  of calls overall as it walked down the tree. We now, instead, keep track as
-  we bubble up changes, so the computation is limited to when data changes and
-  to the depth of that one branch, instead of _every_ node. (Plus, we were already
-  incurring _this_ cost, since we already bubbled out changes.)
-* Moved different tracker types out to their own files.
-* Made tests test for TOO MANY events too.
-* Standarized the source code formatting
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/LICENSE
deleted file mode 100644
index af4588069db82d09339ce56d27225f37975f8744..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/LICENSE
+++ /dev/null
@@ -1,5 +0,0 @@
-Copyright (c) 2015, Rebecca Turner
-
-Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/README.md
deleted file mode 100644
index c41d39229244d292c32c97daea6f6eba63b02b4b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/README.md
+++ /dev/null
@@ -1,194 +0,0 @@
-are-we-there-yet
-----------------
-
-Track complex hiearchies of asynchronous task completion statuses.  This is
-intended to give you a way of recording and reporting the progress of the big
-recursive fan-out and gather type workflows that are so common in async.
-
-What you do with this completion data is up to you, but the most common use case is to
-feed it to one of the many progress bar modules.
-
-Most progress bar modules include a rudamentary version of this, but my
-needs were more complex.
-
-Usage
-=====
-
-```javascript
-var TrackerGroup = require("are-we-there-yet").TrackerGroup
-
-var top = new TrackerGroup("program")
-
-var single = top.newItem("one thing", 100)
-single.completeWork(20)
-
-console.log(top.completed()) // 0.2
-
-fs.stat("file", function(er, stat) {
-  if (er) throw er  
-  var stream = top.newStream("file", stat.size)
-  console.log(top.completed()) // now 0.1 as single is 50% of the job and is 20% complete
-                              // and 50% * 20% == 10%
-  fs.createReadStream("file").pipe(stream).on("data", function (chunk) {
-    // do stuff with chunk
-  })
-  top.on("change", function (name) {
-    // called each time a chunk is read from "file"
-    // top.completed() will start at 0.1 and fill up to 0.6 as the file is read
-  })
-})
-```
-
-Shared Methods
-==============
-
-All tracker objects described below have the following methods, they, along
-with the event comprise the interface for consumers of tracker objects.
-
-* var completed = tracker.completed()
-
-Returns the ratio of completed work to work to be done. Range of 0 to 1.
-
-* tracker.finish()
-
-Marks the tracker as completed. With a TrackerGroup this marks all of its
-components as completed.
-
-Marks all of the components of this tracker as finished, which in turn means
-that `tracker.completed()` for this will now be 1.
-
-This will result in one or more `change` events being emitted.
-
-Events
-======
-
-All tracker objects emit `change` events with the following arguments:
-
-```
-function (name, completed, tracker)
-```
-
-`name` is the name of the tracker that originally emitted the event,
-or if it didn't have one, the first containing tracker group that had one.
-
-`completed` is the percent complete (as returned by `tracker.completed()` method).
-
-`tracker` is the tracker object that you are listening for events on.
-
-TrackerGroup
-============
-
-* var tracker = new TrackerGroup(**name**)
-
-  * **name** *(optional)* - The name of this tracker group, used in change
-    notifications if the component updating didn't have a name. Defaults to undefined.
-
-Creates a new empty tracker aggregation group. These are trackers whose
-completion status is determined by the completion status of other trackers.
-
-* tracker.addUnit(**otherTracker**, **weight**)
-
-  * **otherTracker** - Any of the other are-we-there-yet tracker objects
-  * **weight** *(optional)* - The weight to give the tracker, defaults to 1.
-
-Adds the **otherTracker** to this aggregation group. The weight determines
-how long you expect this tracker to take to complete in proportion to other
-units.  So for instance, if you add one tracker with a weight of 1 and
-another with a weight of 2, you're saying the second will take twice as long
-to complete as the first.  As such, the first will account for 33% of the
-completion of this tracker and the second will account for the other 67%.
-
-Returns **otherTracker**.
-
-* var subGroup = tracker.newGroup(**name**, **weight**)
-
-The above is exactly equivalent to:
-
-```javascript
-  var subGroup = tracker.addUnit(new TrackerGroup(name), weight)
-```
-
-* var subItem = tracker.newItem(**name**, **todo**, **weight**)
-
-The above is exactly equivalent to:
-
-```javascript
-  var subItem = tracker.addUnit(new Tracker(name, todo), weight)
-```
-
-* var subStream = tracker.newStream(**name**, **todo**, **weight**)
-
-The above is exactly equivalent to:
-
-```javascript
-  var subStream = tracker.addUnit(new TrackerStream(name, todo), weight)
-```
-
-* console.log( tracker.debug() )
-
-Returns a tree showing the completion of this tracker group and all of its
-children, including recursively entering all of the children.
-
-Tracker
-=======
-
-* var tracker = new Tracker(**name**, **todo**)
-
-  * **name** *(optional)* The name of this counter to report in change
-    events.  Defaults to undefined.
-  * **todo** *(optional)* The amount of work todo (a number). Defaults to 0.
-
-Ordinarily these are constructed as a part of a tracker group (via
-`newItem`).
-
-* var completed = tracker.completed()
-
-Returns the ratio of completed work to work to be done. Range of 0 to 1. If
-total work to be done is 0 then it will return 0.
-
-* tracker.addWork(**todo**)
-
-  * **todo** A number to add to the amount of work to be done.
-
-Increases the amount of work to be done, thus decreasing the completion
-percentage.  Triggers a `change` event.
-
-* tracker.completeWork(**completed**)
-
-  * **completed** A number to add to the work complete
-
-Increase the amount of work complete, thus increasing the completion percentage.
-Will never increase the work completed past the amount of work todo. That is,
-percentages > 100% are not allowed. Triggers a `change` event.
-
-* tracker.finish()
-
-Marks this tracker as finished, tracker.completed() will now be 1. Triggers
-a `change` event.
-
-TrackerStream
-=============
-
-* var tracker = new TrackerStream(**name**, **size**, **options**)
-
-  * **name** *(optional)* The name of this counter to report in change
-    events.  Defaults to undefined.
-  * **size** *(optional)* The number of bytes being sent through this stream.
-  * **options** *(optional)* A hash of stream options
-
-The tracker stream object is a pass through stream that updates an internal
-tracker object each time a block passes through.  It's intended to track
-downloads, file extraction and other related activities. You use it by piping
-your data source into it and then using it as your data source.
-
-If your data has a length attribute then that's used as the amount of work
-completed when the chunk is passed through.  If it does not (eg, object
-streams) then each chunk counts as completing 1 unit of work, so your size
-should be the total number of objects being streamed.
-
-* tracker.addWork(**todo**)
-
-  * **todo** Increase the expected overall size by **todo** bytes.
-
-Increases the amount of work to be done, thus decreasing the completion
-percentage.  Triggers a `change` event.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/index.js
deleted file mode 100644
index 57d8743fdad177f63d0429517e786a883254ef0b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-'use strict'
-exports.TrackerGroup = require('./tracker-group.js')
-exports.Tracker = require('./tracker.js')
-exports.TrackerStream = require('./tracker-stream.js')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/.npmignore
deleted file mode 100644
index c2658d7d1b31848c3b71960543cb0368e56cd4c7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/History.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/History.md
deleted file mode 100644
index 25959eab67b84045121cd96fe759c8cc0d7006fe..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/History.md
+++ /dev/null
@@ -1,22 +0,0 @@
-
-1.0.0 / 2015-12-14
-==================
-
-  * Merge pull request #12 from kasicka/master
-  * Add license text
-
-0.1.0 / 2014-10-17
-==================
-
- * adds `.fluent()` to api
-
-0.0.3 / 2014-01-13
-==================
-
- * fix receiver for .method()
-
-0.0.2 / 2014-01-13
-==================
-
- * Object.defineProperty() sucks
- * Initial commit
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/License b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/License
deleted file mode 100644
index 60de60addbe7e972ae71c0dca26d4ae8ffd29c57..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/License
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2015 TJ Holowaychuk <tj@vision-media.ca>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/Makefile b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/Makefile
deleted file mode 100644
index a9dcfd50dbdb227343ca0ca3193d78d135e4298d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/Makefile
+++ /dev/null
@@ -1,8 +0,0 @@
-
-test:
-	@./node_modules/.bin/mocha \
-		--require should \
-		--reporter spec \
-		--bail
-
-.PHONY: test
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/Readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/Readme.md
deleted file mode 100644
index ab8cf4ace159397f4da368ef7b3455e017c25659..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/Readme.md
+++ /dev/null
@@ -1,94 +0,0 @@
-
-# delegates
-
-  Node method and accessor delegation utilty.
-
-## Installation
-
-```
-$ npm install delegates
-```
-
-## Example
-
-```js
-var delegate = require('delegates');
-
-...
-
-delegate(proto, 'request')
-  .method('acceptsLanguages')
-  .method('acceptsEncodings')
-  .method('acceptsCharsets')
-  .method('accepts')
-  .method('is')
-  .access('querystring')
-  .access('idempotent')
-  .access('socket')
-  .access('length')
-  .access('query')
-  .access('search')
-  .access('status')
-  .access('method')
-  .access('path')
-  .access('body')
-  .access('host')
-  .access('url')
-  .getter('subdomains')
-  .getter('protocol')
-  .getter('header')
-  .getter('stale')
-  .getter('fresh')
-  .getter('secure')
-  .getter('ips')
-  .getter('ip')
-```
-
-# API
-
-## Delegate(proto, prop)
-
-Creates a delegator instance used to configure using the `prop` on the given
-`proto` object. (which is usually a prototype)
-
-## Delegate#method(name)
-
-Allows the given method `name` to be accessed on the host.
-
-## Delegate#getter(name)
-
-Creates a "getter" for the property with the given `name` on the delegated
-object.
-
-## Delegate#setter(name)
-
-Creates a "setter" for the property with the given `name` on the delegated
-object.
-
-## Delegate#access(name)
-
-Creates an "accessor" (ie: both getter *and* setter) for the property with the
-given `name` on the delegated object.
-
-## Delegate#fluent(name)
-
-A unique type of "accessor" that works for a "fluent" API. When called as a
-getter, the method returns the expected value. However, if the method is called
-with a value, it will return itself so it can be chained. For example:
-
-```js
-delegate(proto, 'request')
-  .fluent('query')
-
-// getter
-var q = request.query();
-
-// setter (chainable)
-request
-  .query({ a: 1 })
-  .query({ b: 2 });
-```
-
-# License
-
-  MIT
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/index.js
deleted file mode 100644
index 17c222d52935c696a859a32f35dc070a113be1e7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/index.js
+++ /dev/null
@@ -1,121 +0,0 @@
-
-/**
- * Expose `Delegator`.
- */
-
-module.exports = Delegator;
-
-/**
- * Initialize a delegator.
- *
- * @param {Object} proto
- * @param {String} target
- * @api public
- */
-
-function Delegator(proto, target) {
-  if (!(this instanceof Delegator)) return new Delegator(proto, target);
-  this.proto = proto;
-  this.target = target;
-  this.methods = [];
-  this.getters = [];
-  this.setters = [];
-  this.fluents = [];
-}
-
-/**
- * Delegate method `name`.
- *
- * @param {String} name
- * @return {Delegator} self
- * @api public
- */
-
-Delegator.prototype.method = function(name){
-  var proto = this.proto;
-  var target = this.target;
-  this.methods.push(name);
-
-  proto[name] = function(){
-    return this[target][name].apply(this[target], arguments);
-  };
-
-  return this;
-};
-
-/**
- * Delegator accessor `name`.
- *
- * @param {String} name
- * @return {Delegator} self
- * @api public
- */
-
-Delegator.prototype.access = function(name){
-  return this.getter(name).setter(name);
-};
-
-/**
- * Delegator getter `name`.
- *
- * @param {String} name
- * @return {Delegator} self
- * @api public
- */
-
-Delegator.prototype.getter = function(name){
-  var proto = this.proto;
-  var target = this.target;
-  this.getters.push(name);
-
-  proto.__defineGetter__(name, function(){
-    return this[target][name];
-  });
-
-  return this;
-};
-
-/**
- * Delegator setter `name`.
- *
- * @param {String} name
- * @return {Delegator} self
- * @api public
- */
-
-Delegator.prototype.setter = function(name){
-  var proto = this.proto;
-  var target = this.target;
-  this.setters.push(name);
-
-  proto.__defineSetter__(name, function(val){
-    return this[target][name] = val;
-  });
-
-  return this;
-};
-
-/**
- * Delegator fluent accessor
- *
- * @param {String} name
- * @return {Delegator} self
- * @api public
- */
-
-Delegator.prototype.fluent = function (name) {
-  var proto = this.proto;
-  var target = this.target;
-  this.fluents.push(name);
-
-  proto[name] = function(val){
-    if ('undefined' != typeof val) {
-      this[target][name] = val;
-      return this;
-    } else {
-      return this[target][name];
-    }
-  };
-
-  return this;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/package.json
deleted file mode 100644
index e2e149eeb3333aed114c9fd374dbb79d53864674..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/package.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
-  "_from": "delegates@>=1.0.0 <2.0.0",
-  "_id": "delegates@1.0.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/are-we-there-yet/delegates",
-  "_nodeVersion": "4.2.1",
-  "_npmUser": {
-    "email": "tj@vision-media.ca",
-    "name": "tjholowaychuk"
-  },
-  "_npmVersion": "3.3.12",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/are-we-there-yet"
-  ],
-  "_resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-  "_shasum": "84c6e159b81904fdca59a0ef44cd870d31250f9a",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/visionmedia/node-delegates/issues"
-  },
-  "dependencies": {},
-  "description": "delegate methods and accessors to another property",
-  "devDependencies": {
-    "mocha": "*",
-    "should": "*"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "84c6e159b81904fdca59a0ef44cd870d31250f9a",
-    "tarball": "http://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz"
-  },
-  "gitHead": "c4dc07ef1ed51c2b2a63f3585e5ef949ee577a49",
-  "homepage": "https://github.com/visionmedia/node-delegates#readme",
-  "keywords": [
-    "delegate",
-    "delegation"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "tjholowaychuk",
-      "email": "tj@vision-media.ca"
-    },
-    {
-      "name": "dominicbarnes",
-      "email": "dominic@dbarnes.info"
-    }
-  ],
-  "name": "delegates",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/visionmedia/node-delegates.git"
-  },
-  "scripts": {},
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/test/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/test/index.js
deleted file mode 100644
index 7b6e3d4df19d908a6eb3f577cc25445d1b479f58..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/delegates/test/index.js
+++ /dev/null
@@ -1,94 +0,0 @@
-
-var assert = require('assert');
-var delegate = require('..');
-
-describe('.method(name)', function(){
-  it('should delegate methods', function(){
-    var obj = {};
-
-    obj.request = {
-      foo: function(bar){
-        assert(this == obj.request);
-        return bar;
-      }
-    };
-
-    delegate(obj, 'request').method('foo');
-
-    obj.foo('something').should.equal('something');
-  })
-})
-
-describe('.getter(name)', function(){
-  it('should delegate getters', function(){
-    var obj = {};
-
-    obj.request = {
-      get type() {
-        return 'text/html';
-      }
-    }
-
-    delegate(obj, 'request').getter('type');
-
-    obj.type.should.equal('text/html');
-  })
-})
-
-describe('.setter(name)', function(){
-  it('should delegate setters', function(){
-    var obj = {};
-
-    obj.request = {
-      get type() {
-        return this._type.toUpperCase();
-      },
-
-      set type(val) {
-        this._type = val;
-      }
-    }
-
-    delegate(obj, 'request').setter('type');
-
-    obj.type = 'hey';
-    obj.request.type.should.equal('HEY');
-  })
-})
-
-describe('.access(name)', function(){
-  it('should delegate getters and setters', function(){
-    var obj = {};
-
-    obj.request = {
-      get type() {
-        return this._type.toUpperCase();
-      },
-
-      set type(val) {
-        this._type = val;
-      }
-    }
-
-    delegate(obj, 'request').access('type');
-
-    obj.type = 'hey';
-    obj.type.should.equal('HEY');
-  })
-})
-
-describe('.fluent(name)', function () {
-  it('should delegate in a fluent fashion', function () {
-    var obj = {
-      settings: {
-        env: 'development'
-      }
-    };
-
-    delegate(obj, 'settings').fluent('env');
-
-    obj.env().should.equal('development');
-    obj.env('production').should.equal(obj);
-    obj.settings.env.should.equal('production');
-  })
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/.npmignore
deleted file mode 100644
index 265ff739e071cd0a408e3a202d495492751de884..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/.npmignore
+++ /dev/null
@@ -1,8 +0,0 @@
-build/
-test/
-examples/
-fs.js
-zlib.js
-.zuul.yml
-.nyc_output
-coverage
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/.travis.yml
deleted file mode 100644
index ae0156a9bbb156ef5d51377dca1af30c7a935866..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/.travis.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-sudo: false
-language: node_js
-before_install:
-  - npm install -g npm@2
-  - npm install -g npm
-notifications:
-  email: false
-matrix:
-  fast_finish: true
-  allow_failures:
-    - env: TASK=browser BROWSER_NAME=ipad BROWSER_VERSION="6.0..latest"
-    - env: TASK=browser BROWSER_NAME=iphone BROWSER_VERSION="6.0..latest"
-  include:
-  - node_js: '0.8'
-    env: TASK=test
-  - node_js: '0.10'
-    env: TASK=test
-  - node_js: '0.11'
-    env: TASK=test
-  - node_js: '0.12'
-    env: TASK=test
-  - node_js: 1
-    env: TASK=test
-  - node_js: 2
-    env: TASK=test
-  - node_js: 3
-    env: TASK=test
-  - node_js: 4
-    env: TASK=test
-  - node_js: 5
-    env: TASK=test
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=android BROWSER_VERSION="4.0..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=ie BROWSER_VERSION="9..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=opera BROWSER_VERSION="11..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=chrome BROWSER_VERSION="-3..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=firefox BROWSER_VERSION="-3..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=ipad BROWSER_VERSION="6.0..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=iphone BROWSER_VERSION="6.0..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=safari BROWSER_VERSION="5..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=microsoftedge BROWSER_VERSION=latest
-script: "npm run $TASK"
-env:
-  global:
-  - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc=
-  - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI=
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/LICENSE
deleted file mode 100644
index e3d4e695a4cff2bf9c1da6c69841ca22bc9f0224..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright Joyent, Inc. and other Node contributors. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/README.md
deleted file mode 100644
index 2233732a9bac14e6260f62cb06dfbc671e584335..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# readable-stream
-
-***Node-core v6.1.0 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream)
-
-
-[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)
-[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)
-
-
-[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream)
-
-```bash
-npm install --save readable-stream
-```
-
-***Node-core streams for userland***
-
-This package is a mirror of the Streams2 and Streams3 implementations in
-Node-core, including [documentation](doc/stream.md).
-
-If you want to guarantee a stable streams base, regardless of what version of
-Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).
-
-As of version 2.0.0 **readable-stream** uses semantic versioning.  
-
-# Streams WG Team Members
-
-* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) &lt;christopher.s.dickinson@gmail.com&gt;
-  - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B
-* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) &lt;calvin.metcalf@gmail.com&gt;
-  - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242
-* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) &lt;rod@vagg.org&gt;
-  - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D
-* **Sam Newman** ([@sonewman](https://github.com/sonewman)) &lt;newmansam@outlook.com&gt;
-* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) &lt;mathiasbuus@gmail.com&gt;
-* **Domenic Denicola** ([@domenic](https://github.com/domenic)) &lt;d@domenic.me&gt;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/doc/stream.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/doc/stream.md
deleted file mode 100644
index c907ca0e7b726a8dbd0398c34372f4edd797e50b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/doc/stream.md
+++ /dev/null
@@ -1,1772 +0,0 @@
-# Stream
-
-    Stability: 2 - Stable
-
-A stream is an abstract interface implemented by various objects in
-Node.js. For example a [request to an HTTP server][http-incoming-message] is a
-stream, as is [`process.stdout`][]. Streams are readable, writable, or both. All
-streams are instances of [`EventEmitter`][].
-
-You can load the Stream base classes by doing `require('stream')`.
-There are base classes provided for [Readable][] streams, [Writable][]
-streams, [Duplex][] streams, and [Transform][] streams.
-
-This document is split up into 3 sections:
-
-1. The first section explains the parts of the API that you need to be
-   aware of to use streams in your programs.
-2. The second section explains the parts of the API that you need to
-   use if you implement your own custom streams yourself. The API is designed to
-   make this easy for you to do.
-3. The third section goes into more depth about how streams work,
-   including some of the internal mechanisms and functions that you
-   should probably not modify unless you definitely know what you are
-   doing.
-
-
-## API for Stream Consumers
-
-<!--type=misc-->
-
-Streams can be either [Readable][], [Writable][], or both ([Duplex][]).
-
-All streams are EventEmitters, but they also have other custom methods
-and properties depending on whether they are Readable, Writable, or
-Duplex.
-
-If a stream is both Readable and Writable, then it implements all of
-the methods and events. So, a [Duplex][] or [Transform][] stream is
-fully described by this API, though their implementation may be
-somewhat different.
-
-It is not necessary to implement Stream interfaces in order to consume
-streams in your programs. If you **are** implementing streaming
-interfaces in your own program, please also refer to
-[API for Stream Implementors][].
-
-Almost all Node.js programs, no matter how simple, use Streams in some
-way. Here is an example of using Streams in an Node.js program:
-
-```js
-const http = require('http');
-
-var server = http.createServer( (req, res) => {
-  // req is an http.IncomingMessage, which is a Readable Stream
-  // res is an http.ServerResponse, which is a Writable Stream
-
-  var body = '';
-  // we want to get the data as utf8 strings
-  // If you don't set an encoding, then you'll get Buffer objects
-  req.setEncoding('utf8');
-
-  // Readable streams emit 'data' events once a listener is added
-  req.on('data', (chunk) => {
-    body += chunk;
-  });
-
-  // the end event tells you that you have entire body
-  req.on('end', () => {
-    try {
-      var data = JSON.parse(body);
-    } catch (er) {
-      // uh oh!  bad json!
-      res.statusCode = 400;
-      return res.end(`error: ${er.message}`);
-    }
-
-    // write back something interesting to the user:
-    res.write(typeof data);
-    res.end();
-  });
-});
-
-server.listen(1337);
-
-// $ curl localhost:1337 -d '{}'
-// object
-// $ curl localhost:1337 -d '"foo"'
-// string
-// $ curl localhost:1337 -d 'not json'
-// error: Unexpected token o
-```
-
-### Class: stream.Duplex
-
-Duplex streams are streams that implement both the [Readable][] and
-[Writable][] interfaces.
-
-Examples of Duplex streams include:
-
-* [TCP sockets][]
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-
-### Class: stream.Readable
-
-<!--type=class-->
-
-The Readable stream interface is the abstraction for a *source* of
-data that you are reading from. In other words, data comes *out* of a
-Readable stream.
-
-A Readable stream will not start emitting data until you indicate that
-you are ready to receive it.
-
-Readable streams have two "modes": a **flowing mode** and a **paused
-mode**. When in flowing mode, data is read from the underlying system
-and provided to your program as fast as possible. In paused mode, you
-must explicitly call [`stream.read()`][stream-read] to get chunks of data out.
-Streams start out in paused mode.
-
-**Note**: If no data event handlers are attached, and there are no
-[`stream.pipe()`][] destinations, and the stream is switched into flowing
-mode, then data will be lost.
-
-You can switch to flowing mode by doing any of the following:
-
-* Adding a [`'data'`][] event handler to listen for data.
-* Calling the [`stream.resume()`][stream-resume] method to explicitly open the
-  flow.
-* Calling the [`stream.pipe()`][] method to send the data to a [Writable][].
-
-You can switch back to paused mode by doing either of the following:
-
-* If there are no pipe destinations, by calling the
-  [`stream.pause()`][stream-pause] method.
-* If there are pipe destinations, by removing any [`'data'`][] event
-  handlers, and removing all pipe destinations by calling the
-  [`stream.unpipe()`][] method.
-
-Note that, for backwards compatibility reasons, removing [`'data'`][]
-event handlers will **not** automatically pause the stream. Also, if
-there are piped destinations, then calling [`stream.pause()`][stream-pause] will
-not guarantee that the stream will *remain* paused once those
-destinations drain and ask for more data.
-
-Examples of readable streams include:
-
-* [HTTP responses, on the client][http-incoming-message]
-* [HTTP requests, on the server][http-incoming-message]
-* [fs read streams][]
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-* [TCP sockets][]
-* [child process stdout and stderr][]
-* [`process.stdin`][]
-
-#### Event: 'close'
-
-Emitted when the stream and any of its underlying resources (a file
-descriptor, for example) have been closed. The event indicates that
-no more events will be emitted, and no further computation will occur.
-
-Not all streams will emit the `'close'` event as the `'close'` event is
-optional.
-
-#### Event: 'data'
-
-* `chunk` {Buffer|String} The chunk of data.
-
-Attaching a `'data'` event listener to a stream that has not been
-explicitly paused will switch the stream into flowing mode. Data will
-then be passed as soon as it is available.
-
-If you just want to get all the data out of the stream as fast as
-possible, this is the best way to do so.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('data', (chunk) => {
-  console.log('got %d bytes of data', chunk.length);
-});
-```
-
-#### Event: 'end'
-
-This event fires when there will be no more data to read.
-
-Note that the `'end'` event **will not fire** unless the data is
-completely consumed. This can be done by switching into flowing mode,
-or by calling [`stream.read()`][stream-read] repeatedly until you get to the
-end.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('data', (chunk) => {
-  console.log('got %d bytes of data', chunk.length);
-});
-readable.on('end', () => {
-  console.log('there will be no more data.');
-});
-```
-
-#### Event: 'error'
-
-* {Error}
-
-Emitted if there was an error receiving data.
-
-#### Event: 'readable'
-
-When a chunk of data can be read from the stream, it will emit a
-`'readable'` event.
-
-In some cases, listening for a `'readable'` event will cause some data
-to be read into the internal buffer from the underlying system, if it
-hadn't already.
-
-```javascript
-var readable = getReadableStreamSomehow();
-readable.on('readable', () => {
-  // there is some data to read now
-});
-```
-
-Once the internal buffer is drained, a `'readable'` event will fire
-again when more data is available.
-
-The `'readable'` event is not emitted in the "flowing" mode with the
-sole exception of the last one, on end-of-stream.
-
-The `'readable'` event indicates that the stream has new information:
-either new data is available or the end of the stream has been reached.
-In the former case, [`stream.read()`][stream-read] will return that data. In the
-latter case, [`stream.read()`][stream-read] will return null. For instance, in
-the following example, `foo.txt` is an empty file:
-
-```js
-const fs = require('fs');
-var rr = fs.createReadStream('foo.txt');
-rr.on('readable', () => {
-  console.log('readable:', rr.read());
-});
-rr.on('end', () => {
-  console.log('end');
-});
-```
-
-The output of running this script is:
-
-```
-$ node test.js
-readable: null
-end
-```
-
-#### readable.isPaused()
-
-* Return: {Boolean}
-
-This method returns whether or not the `readable` has been **explicitly**
-paused by client code (using [`stream.pause()`][stream-pause] without a
-corresponding [`stream.resume()`][stream-resume]).
-
-```js
-var readable = new stream.Readable
-
-readable.isPaused() // === false
-readable.pause()
-readable.isPaused() // === true
-readable.resume()
-readable.isPaused() // === false
-```
-
-#### readable.pause()
-
-* Return: `this`
-
-This method will cause a stream in flowing mode to stop emitting
-[`'data'`][] events, switching out of flowing mode. Any data that becomes
-available will remain in the internal buffer.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('data', (chunk) => {
-  console.log('got %d bytes of data', chunk.length);
-  readable.pause();
-  console.log('there will be no more data for 1 second');
-  setTimeout(() => {
-    console.log('now data will start flowing again');
-    readable.resume();
-  }, 1000);
-});
-```
-
-#### readable.pipe(destination[, options])
-
-* `destination` {stream.Writable} The destination for writing data
-* `options` {Object} Pipe options
-  * `end` {Boolean} End the writer when the reader ends. Default = `true`
-
-This method pulls all the data out of a readable stream, and writes it
-to the supplied destination, automatically managing the flow so that
-the destination is not overwhelmed by a fast readable stream.
-
-Multiple destinations can be piped to safely.
-
-```js
-var readable = getReadableStreamSomehow();
-var writable = fs.createWriteStream('file.txt');
-// All the data from readable goes into 'file.txt'
-readable.pipe(writable);
-```
-
-This function returns the destination stream, so you can set up pipe
-chains like so:
-
-```js
-var r = fs.createReadStream('file.txt');
-var z = zlib.createGzip();
-var w = fs.createWriteStream('file.txt.gz');
-r.pipe(z).pipe(w);
-```
-
-For example, emulating the Unix `cat` command:
-
-```js
-process.stdin.pipe(process.stdout);
-```
-
-By default [`stream.end()`][stream-end] is called on the destination when the
-source stream emits [`'end'`][], so that `destination` is no longer writable.
-Pass `{ end: false }` as `options` to keep the destination stream open.
-
-This keeps `writer` open so that "Goodbye" can be written at the
-end.
-
-```js
-reader.pipe(writer, { end: false });
-reader.on('end', () => {
-  writer.end('Goodbye\n');
-});
-```
-
-Note that [`process.stderr`][] and [`process.stdout`][] are never closed until
-the process exits, regardless of the specified options.
-
-#### readable.read([size])
-
-* `size` {Number} Optional argument to specify how much data to read.
-* Return {String|Buffer|Null}
-
-The `read()` method pulls some data out of the internal buffer and
-returns it. If there is no data available, then it will return
-`null`.
-
-If you pass in a `size` argument, then it will return that many
-bytes. If `size` bytes are not available, then it will return `null`,
-unless we've ended, in which case it will return the data remaining
-in the buffer.
-
-If you do not specify a `size` argument, then it will return all the
-data in the internal buffer.
-
-This method should only be called in paused mode. In flowing mode,
-this method is called automatically until the internal buffer is
-drained.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('readable', () => {
-  var chunk;
-  while (null !== (chunk = readable.read())) {
-    console.log('got %d bytes of data', chunk.length);
-  }
-});
-```
-
-If this method returns a data chunk, then it will also trigger the
-emission of a [`'data'`][] event.
-
-Note that calling [`stream.read([size])`][stream-read] after the [`'end'`][]
-event has been triggered will return `null`. No runtime error will be raised.
-
-#### readable.resume()
-
-* Return: `this`
-
-This method will cause the readable stream to resume emitting [`'data'`][]
-events.
-
-This method will switch the stream into flowing mode. If you do *not*
-want to consume the data from a stream, but you *do* want to get to
-its [`'end'`][] event, you can call [`stream.resume()`][stream-resume] to open
-the flow of data.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.resume();
-readable.on('end', () => {
-  console.log('got to the end, but did not read anything');
-});
-```
-
-#### readable.setEncoding(encoding)
-
-* `encoding` {String} The encoding to use.
-* Return: `this`
-
-Call this function to cause the stream to return strings of the specified
-encoding instead of Buffer objects. For example, if you do
-`readable.setEncoding('utf8')`, then the output data will be interpreted as
-UTF-8 data, and returned as strings. If you do `readable.setEncoding('hex')`,
-then the data will be encoded in hexadecimal string format.
-
-This properly handles multi-byte characters that would otherwise be
-potentially mangled if you simply pulled the Buffers directly and
-called [`buf.toString(encoding)`][] on them. If you want to read the data
-as strings, always use this method.
-
-Also you can disable any encoding at all with `readable.setEncoding(null)`.
-This approach is very useful if you deal with binary data or with large
-multi-byte strings spread out over multiple chunks.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.setEncoding('utf8');
-readable.on('data', (chunk) => {
-  assert.equal(typeof chunk, 'string');
-  console.log('got %d characters of string data', chunk.length);
-});
-```
-
-#### readable.unpipe([destination])
-
-* `destination` {stream.Writable} Optional specific stream to unpipe
-
-This method will remove the hooks set up for a previous [`stream.pipe()`][]
-call.
-
-If the destination is not specified, then all pipes are removed.
-
-If the destination is specified, but no pipe is set up for it, then
-this is a no-op.
-
-```js
-var readable = getReadableStreamSomehow();
-var writable = fs.createWriteStream('file.txt');
-// All the data from readable goes into 'file.txt',
-// but only for the first second
-readable.pipe(writable);
-setTimeout(() => {
-  console.log('stop writing to file.txt');
-  readable.unpipe(writable);
-  console.log('manually close the file stream');
-  writable.end();
-}, 1000);
-```
-
-#### readable.unshift(chunk)
-
-* `chunk` {Buffer|String} Chunk of data to unshift onto the read queue
-
-This is useful in certain cases where a stream is being consumed by a
-parser, which needs to "un-consume" some data that it has
-optimistically pulled out of the source, so that the stream can be
-passed on to some other party.
-
-Note that `stream.unshift(chunk)` cannot be called after the [`'end'`][] event
-has been triggered; a runtime error will be raised.
-
-If you find that you must often call `stream.unshift(chunk)` in your
-programs, consider implementing a [Transform][] stream instead. (See [API
-for Stream Implementors][].)
-
-```js
-// Pull off a header delimited by \n\n
-// use unshift() if we get too much
-// Call the callback with (error, header, stream)
-const StringDecoder = require('string_decoder').StringDecoder;
-function parseHeader(stream, callback) {
-  stream.on('error', callback);
-  stream.on('readable', onReadable);
-  var decoder = new StringDecoder('utf8');
-  var header = '';
-  function onReadable() {
-    var chunk;
-    while (null !== (chunk = stream.read())) {
-      var str = decoder.write(chunk);
-      if (str.match(/\n\n/)) {
-        // found the header boundary
-        var split = str.split(/\n\n/);
-        header += split.shift();
-        var remaining = split.join('\n\n');
-        var buf = Buffer.from(remaining, 'utf8');
-        if (buf.length)
-          stream.unshift(buf);
-        stream.removeListener('error', callback);
-        stream.removeListener('readable', onReadable);
-        // now the body of the message can be read from the stream.
-        callback(null, header, stream);
-      } else {
-        // still reading the header.
-        header += str;
-      }
-    }
-  }
-}
-```
-
-Note that, unlike [`stream.push(chunk)`][stream-push], `stream.unshift(chunk)`
-will not end the reading process by resetting the internal reading state of the
-stream. This can cause unexpected results if `unshift()` is called during a
-read (i.e. from within a [`stream._read()`][stream-_read] implementation on a
-custom stream). Following the call to `unshift()` with an immediate
-[`stream.push('')`][stream-push] will reset the reading state appropriately,
-however it is best to simply avoid calling `unshift()` while in the process of
-performing a read.
-
-#### readable.wrap(stream)
-
-* `stream` {Stream} An "old style" readable stream
-
-Versions of Node.js prior to v0.10 had streams that did not implement the
-entire Streams API as it is today. (See [Compatibility][] for
-more information.)
-
-If you are using an older Node.js library that emits [`'data'`][] events and
-has a [`stream.pause()`][stream-pause] method that is advisory only, then you
-can use the `wrap()` method to create a [Readable][] stream that uses the old
-stream as its data source.
-
-You will very rarely ever need to call this function, but it exists
-as a convenience for interacting with old Node.js programs and libraries.
-
-For example:
-
-```js
-const OldReader = require('./old-api-module.js').OldReader;
-const Readable = require('stream').Readable;
-const oreader = new OldReader;
-const myReader = new Readable().wrap(oreader);
-
-myReader.on('readable', () => {
-  myReader.read(); // etc.
-});
-```
-
-### Class: stream.Transform
-
-Transform streams are [Duplex][] streams where the output is in some way
-computed from the input. They implement both the [Readable][] and
-[Writable][] interfaces.
-
-Examples of Transform streams include:
-
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-
-### Class: stream.Writable
-
-<!--type=class-->
-
-The Writable stream interface is an abstraction for a *destination*
-that you are writing data *to*.
-
-Examples of writable streams include:
-
-* [HTTP requests, on the client][]
-* [HTTP responses, on the server][]
-* [fs write streams][]
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-* [TCP sockets][]
-* [child process stdin][]
-* [`process.stdout`][], [`process.stderr`][]
-
-#### Event: 'close'
-
-Emitted when the stream and any of its underlying resources (a file descriptor,
-for example) have been closed. The event indicates that no more events will be
-emitted, and no further computation will occur.
-
-Not all streams will emit the `'close'` event as the `'close'` event is
-optional.
-
-#### Event: 'drain'
-
-If a [`stream.write(chunk)`][stream-write] call returns `false`, then the
-`'drain'` event will indicate when it is appropriate to begin writing more data
-to the stream.
-
-```js
-// Write the data to the supplied writable stream one million times.
-// Be attentive to back-pressure.
-function writeOneMillionTimes(writer, data, encoding, callback) {
-  var i = 1000000;
-  write();
-  function write() {
-    var ok = true;
-    do {
-      i -= 1;
-      if (i === 0) {
-        // last time!
-        writer.write(data, encoding, callback);
-      } else {
-        // see if we should continue, or wait
-        // don't pass the callback, because we're not done yet.
-        ok = writer.write(data, encoding);
-      }
-    } while (i > 0 && ok);
-    if (i > 0) {
-      // had to stop early!
-      // write some more once it drains
-      writer.once('drain', write);
-    }
-  }
-}
-```
-
-#### Event: 'error'
-
-* {Error}
-
-Emitted if there was an error when writing or piping data.
-
-#### Event: 'finish'
-
-When the [`stream.end()`][stream-end] method has been called, and all data has
-been flushed to the underlying system, this event is emitted.
-
-```javascript
-var writer = getWritableStreamSomehow();
-for (var i = 0; i < 100; i ++) {
-  writer.write('hello, #${i}!\n');
-}
-writer.end('this is the end\n');
-writer.on('finish', () => {
-  console.error('all writes are now complete.');
-});
-```
-
-#### Event: 'pipe'
-
-* `src` {stream.Readable} source stream that is piping to this writable
-
-This is emitted whenever the [`stream.pipe()`][] method is called on a readable
-stream, adding this writable to its set of destinations.
-
-```js
-var writer = getWritableStreamSomehow();
-var reader = getReadableStreamSomehow();
-writer.on('pipe', (src) => {
-  console.error('something is piping into the writer');
-  assert.equal(src, reader);
-});
-reader.pipe(writer);
-```
-
-#### Event: 'unpipe'
-
-* `src` {[Readable][] Stream} The source stream that
-  [unpiped][`stream.unpipe()`] this writable
-
-This is emitted whenever the [`stream.unpipe()`][] method is called on a
-readable stream, removing this writable from its set of destinations.
-
-```js
-var writer = getWritableStreamSomehow();
-var reader = getReadableStreamSomehow();
-writer.on('unpipe', (src) => {
-  console.error('something has stopped piping into the writer');
-  assert.equal(src, reader);
-});
-reader.pipe(writer);
-reader.unpipe(writer);
-```
-
-#### writable.cork()
-
-Forces buffering of all writes.
-
-Buffered data will be flushed either at [`stream.uncork()`][] or at
-[`stream.end()`][stream-end] call.
-
-#### writable.end([chunk][, encoding][, callback])
-
-* `chunk` {String|Buffer} Optional data to write
-* `encoding` {String} The encoding, if `chunk` is a String
-* `callback` {Function} Optional callback for when the stream is finished
-
-Call this method when no more data will be written to the stream. If supplied,
-the callback is attached as a listener on the [`'finish'`][] event.
-
-Calling [`stream.write()`][stream-write] after calling
-[`stream.end()`][stream-end] will raise an error.
-
-```js
-// write 'hello, ' and then end with 'world!'
-var file = fs.createWriteStream('example.txt');
-file.write('hello, ');
-file.end('world!');
-// writing more now is not allowed!
-```
-
-#### writable.setDefaultEncoding(encoding)
-
-* `encoding` {String} The new default encoding
-* Return: `this`
-
-Sets the default encoding for a writable stream.
-
-#### writable.uncork()
-
-Flush all data, buffered since [`stream.cork()`][] call.
-
-#### writable.write(chunk[, encoding][, callback])
-
-* `chunk` {String|Buffer} The data to write
-* `encoding` {String} The encoding, if `chunk` is a String
-* `callback` {Function} Callback for when this chunk of data is flushed
-* Returns: {Boolean} `true` if the data was handled completely.
-
-This method writes some data to the underlying system, and calls the
-supplied callback once the data has been fully handled.  If an error
-occurs, the callback may or may not be called with the error as its
-first argument.  To detect write errors, listen for the `'error'` event.
-
-The return value indicates if you should continue writing right now.
-If the data had to be buffered internally, then it will return
-`false`. Otherwise, it will return `true`.
-
-This return value is strictly advisory. You MAY continue to write,
-even if it returns `false`. However, writes will be buffered in
-memory, so it is best not to do this excessively. Instead, wait for
-the [`'drain'`][] event before writing more data.
-
-
-## API for Stream Implementors
-
-<!--type=misc-->
-
-To implement any sort of stream, the pattern is the same:
-
-1. Extend the appropriate parent class in your own subclass. (The
-   [`util.inherits()`][] method is particularly helpful for this.)
-2. Call the appropriate parent class constructor in your constructor,
-   to be sure that the internal mechanisms are set up properly.
-3. Implement one or more specific methods, as detailed below.
-
-The class to extend and the method(s) to implement depend on the sort
-of stream class you are writing:
-
-<table>
-  <thead>
-    <tr>
-      <th>
-        <p>Use-case</p>
-      </th>
-      <th>
-        <p>Class</p>
-      </th>
-      <th>
-        <p>Method(s) to implement</p>
-      </th>
-    </tr>
-  </thead>
-  <tr>
-    <td>
-      <p>Reading only</p>
-    </td>
-    <td>
-      <p>[Readable](#stream_class_stream_readable_1)</p>
-    </td>
-    <td>
-      <p><code>[_read][stream-_read]</code></p>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <p>Writing only</p>
-    </td>
-    <td>
-      <p>[Writable](#stream_class_stream_writable_1)</p>
-    </td>
-    <td>
-      <p><code>[_write][stream-_write]</code>, <code>[_writev][stream-_writev]</code></p>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <p>Reading and writing</p>
-    </td>
-    <td>
-      <p>[Duplex](#stream_class_stream_duplex_1)</p>
-    </td>
-    <td>
-      <p><code>[_read][stream-_read]</code>, <code>[_write][stream-_write]</code>, <code>[_writev][stream-_writev]</code></p>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <p>Operate on written data, then read the result</p>
-    </td>
-    <td>
-      <p>[Transform](#stream_class_stream_transform_1)</p>
-    </td>
-    <td>
-      <p><code>[_transform][stream-_transform]</code>, <code>[_flush][stream-_flush]</code></p>
-    </td>
-  </tr>
-</table>
-
-In your implementation code, it is very important to never call the methods
-described in [API for Stream Consumers][]. Otherwise, you can potentially cause
-adverse side effects in programs that consume your streaming interfaces.
-
-### Class: stream.Duplex
-
-<!--type=class-->
-
-A "duplex" stream is one that is both Readable and Writable, such as a TCP
-socket connection.
-
-Note that `stream.Duplex` is an abstract class designed to be extended
-with an underlying implementation of the [`stream._read(size)`][stream-_read]
-and [`stream._write(chunk, encoding, callback)`][stream-_write] methods as you
-would with a Readable or Writable stream class.
-
-Since JavaScript doesn't have multiple prototypal inheritance, this class
-prototypally inherits from Readable, and then parasitically from Writable. It is
-thus up to the user to implement both the low-level
-[`stream._read(n)`][stream-_read] method as well as the low-level
-[`stream._write(chunk, encoding, callback)`][stream-_write] method on extension
-duplex classes.
-
-#### new stream.Duplex(options)
-
-* `options` {Object} Passed to both Writable and Readable
-  constructors. Also has the following fields:
-  * `allowHalfOpen` {Boolean} Default = `true`. If set to `false`, then
-    the stream will automatically end the readable side when the
-    writable side ends and vice versa.
-  * `readableObjectMode` {Boolean} Default = `false`. Sets `objectMode`
-    for readable side of the stream. Has no effect if `objectMode`
-    is `true`.
-  * `writableObjectMode` {Boolean} Default = `false`. Sets `objectMode`
-    for writable side of the stream. Has no effect if `objectMode`
-    is `true`.
-
-In classes that extend the Duplex class, make sure to call the
-constructor so that the buffering settings can be properly
-initialized.
-
-### Class: stream.PassThrough
-
-This is a trivial implementation of a [Transform][] stream that simply
-passes the input bytes across to the output. Its purpose is mainly
-for examples and testing, but there are occasionally use cases where
-it can come in handy as a building block for novel sorts of streams.
-
-### Class: stream.Readable
-
-<!--type=class-->
-
-`stream.Readable` is an abstract class designed to be extended with an
-underlying implementation of the [`stream._read(size)`][stream-_read] method.
-
-Please see [API for Stream Consumers][] for how to consume
-streams in your programs. What follows is an explanation of how to
-implement Readable streams in your programs.
-
-#### new stream.Readable([options])
-
-* `options` {Object}
-  * `highWaterMark` {Number} The maximum number of bytes to store in
-    the internal buffer before ceasing to read from the underlying
-    resource. Default = `16384` (16kb), or `16` for `objectMode` streams
-  * `encoding` {String} If specified, then buffers will be decoded to
-    strings using the specified encoding. Default = `null`
-  * `objectMode` {Boolean} Whether this stream should behave
-    as a stream of objects. Meaning that [`stream.read(n)`][stream-read] returns
-    a single value instead of a Buffer of size n. Default = `false`
-  * `read` {Function} Implementation for the [`stream._read()`][stream-_read]
-    method.
-
-In classes that extend the Readable class, make sure to call the
-Readable constructor so that the buffering settings can be properly
-initialized.
-
-#### readable.\_read(size)
-
-* `size` {Number} Number of bytes to read asynchronously
-
-Note: **Implement this method, but do NOT call it directly.**
-
-This method is prefixed with an underscore because it is internal to the
-class that defines it and should only be called by the internal Readable
-class methods. All Readable stream implementations must provide a \_read
-method to fetch data from the underlying resource.
-
-When `_read()` is called, if data is available from the resource, the `_read()`
-implementation should start pushing that data into the read queue by calling
-[`this.push(dataChunk)`][stream-push]. `_read()` should continue reading from
-the resource and pushing data until push returns `false`, at which point it
-should stop reading from the resource. Only when `_read()` is called again after
-it has stopped should it start reading more data from the resource and pushing
-that data onto the queue.
-
-Note: once the `_read()` method is called, it will not be called again until
-the [`stream.push()`][stream-push] method is called.
-
-The `size` argument is advisory. Implementations where a "read" is a
-single call that returns data can use this to know how much data to
-fetch. Implementations where that is not relevant, such as TCP or
-TLS, may ignore this argument, and simply provide data whenever it
-becomes available. There is no need, for example to "wait" until
-`size` bytes are available before calling [`stream.push(chunk)`][stream-push].
-
-#### readable.push(chunk[, encoding])
-
-
-* `chunk` {Buffer|Null|String} Chunk of data to push into the read queue
-* `encoding` {String} Encoding of String chunks.  Must be a valid
-  Buffer encoding, such as `'utf8'` or `'ascii'`
-* return {Boolean} Whether or not more pushes should be performed
-
-Note: **This method should be called by Readable implementors, NOT
-by consumers of Readable streams.**
-
-If a value other than null is passed, The `push()` method adds a chunk of data
-into the queue for subsequent stream processors to consume. If `null` is
-passed, it signals the end of the stream (EOF), after which no more data
-can be written.
-
-The data added with `push()` can be pulled out by calling the
-[`stream.read()`][stream-read] method when the [`'readable'`][] event fires.
-
-This API is designed to be as flexible as possible. For example,
-you may be wrapping a lower-level source which has some sort of
-pause/resume mechanism, and a data callback. In those cases, you
-could wrap the low-level source object by doing something like this:
-
-```js
-// source is an object with readStop() and readStart() methods,
-// and an `ondata` member that gets called when it has data, and
-// an `onend` member that gets called when the data is over.
-
-util.inherits(SourceWrapper, Readable);
-
-function SourceWrapper(options) {
-  Readable.call(this, options);
-
-  this._source = getLowlevelSourceObject();
-
-  // Every time there's data, we push it into the internal buffer.
-  this._source.ondata = (chunk) => {
-    // if push() returns false, then we need to stop reading from source
-    if (!this.push(chunk))
-      this._source.readStop();
-  };
-
-  // When the source ends, we push the EOF-signaling `null` chunk
-  this._source.onend = () => {
-    this.push(null);
-  };
-}
-
-// _read will be called when the stream wants to pull more data in
-// the advisory size argument is ignored in this case.
-SourceWrapper.prototype._read = function(size) {
-  this._source.readStart();
-};
-```
-
-#### Example: A Counting Stream
-
-<!--type=example-->
-
-This is a basic example of a Readable stream. It emits the numerals
-from 1 to 1,000,000 in ascending order, and then ends.
-
-```js
-const Readable = require('stream').Readable;
-const util = require('util');
-util.inherits(Counter, Readable);
-
-function Counter(opt) {
-  Readable.call(this, opt);
-  this._max = 1000000;
-  this._index = 1;
-}
-
-Counter.prototype._read = function() {
-  var i = this._index++;
-  if (i > this._max)
-    this.push(null);
-  else {
-    var str = '' + i;
-    var buf = Buffer.from(str, 'ascii');
-    this.push(buf);
-  }
-};
-```
-
-#### Example: SimpleProtocol v1 (Sub-optimal)
-
-This is similar to the `parseHeader` function described
-[here](#stream_readable_unshift_chunk), but implemented as a custom stream.
-Also, note that this implementation does not convert the incoming data to a
-string.
-
-However, this would be better implemented as a [Transform][] stream. See
-[SimpleProtocol v2][] for a better implementation.
-
-```js
-// A parser for a simple data protocol.
-// The "header" is a JSON object, followed by 2 \n characters, and
-// then a message body.
-//
-// NOTE: This can be done more simply as a Transform stream!
-// Using Readable directly for this is sub-optimal. See the
-// alternative example below under the Transform section.
-
-const Readable = require('stream').Readable;
-const util = require('util');
-
-util.inherits(SimpleProtocol, Readable);
-
-function SimpleProtocol(source, options) {
-  if (!(this instanceof SimpleProtocol))
-    return new SimpleProtocol(source, options);
-
-  Readable.call(this, options);
-  this._inBody = false;
-  this._sawFirstCr = false;
-
-  // source is a readable stream, such as a socket or file
-  this._source = source;
-
-  source.on('end', () => {
-    this.push(null);
-  });
-
-  // give it a kick whenever the source is readable
-  // read(0) will not consume any bytes
-  source.on('readable', () => {
-    this.read(0);
-  });
-
-  this._rawHeader = [];
-  this.header = null;
-}
-
-SimpleProtocol.prototype._read = function(n) {
-  if (!this._inBody) {
-    var chunk = this._source.read();
-
-    // if the source doesn't have data, we don't have data yet.
-    if (chunk === null)
-      return this.push('');
-
-    // check if the chunk has a \n\n
-    var split = -1;
-    for (var i = 0; i < chunk.length; i++) {
-      if (chunk[i] === 10) { // '\n'
-        if (this._sawFirstCr) {
-          split = i;
-          break;
-        } else {
-          this._sawFirstCr = true;
-        }
-      } else {
-        this._sawFirstCr = false;
-      }
-    }
-
-    if (split === -1) {
-      // still waiting for the \n\n
-      // stash the chunk, and try again.
-      this._rawHeader.push(chunk);
-      this.push('');
-    } else {
-      this._inBody = true;
-      var h = chunk.slice(0, split);
-      this._rawHeader.push(h);
-      var header = Buffer.concat(this._rawHeader).toString();
-      try {
-        this.header = JSON.parse(header);
-      } catch (er) {
-        this.emit('error', new Error('invalid simple protocol data'));
-        return;
-      }
-      // now, because we got some extra data, unshift the rest
-      // back into the read queue so that our consumer will see it.
-      var b = chunk.slice(split);
-      this.unshift(b);
-      // calling unshift by itself does not reset the reading state
-      // of the stream; since we're inside _read, doing an additional
-      // push('') will reset the state appropriately.
-      this.push('');
-
-      // and let them know that we are done parsing the header.
-      this.emit('header', this.header);
-    }
-  } else {
-    // from there on, just provide the data to our consumer.
-    // careful not to push(null), since that would indicate EOF.
-    var chunk = this._source.read();
-    if (chunk) this.push(chunk);
-  }
-};
-
-// Usage:
-// var parser = new SimpleProtocol(source);
-// Now parser is a readable stream that will emit 'header'
-// with the parsed header data.
-```
-
-### Class: stream.Transform
-
-A "transform" stream is a duplex stream where the output is causally
-connected in some way to the input, such as a [zlib][] stream or a
-[crypto][] stream.
-
-There is no requirement that the output be the same size as the input,
-the same number of chunks, or arrive at the same time. For example, a
-Hash stream will only ever have a single chunk of output which is
-provided when the input is ended. A zlib stream will produce output
-that is either much smaller or much larger than its input.
-
-Rather than implement the [`stream._read()`][stream-_read] and
-[`stream._write()`][stream-_write] methods, Transform classes must implement the
-[`stream._transform()`][stream-_transform] method, and may optionally
-also implement the [`stream._flush()`][stream-_flush] method. (See below.)
-
-#### new stream.Transform([options])
-
-* `options` {Object} Passed to both Writable and Readable
-  constructors. Also has the following fields:
-  * `transform` {Function} Implementation for the
-    [`stream._transform()`][stream-_transform] method.
-  * `flush` {Function} Implementation for the [`stream._flush()`][stream-_flush]
-    method.
-
-In classes that extend the Transform class, make sure to call the
-constructor so that the buffering settings can be properly
-initialized.
-
-#### Events: 'finish' and 'end'
-
-The [`'finish'`][] and [`'end'`][] events are from the parent Writable
-and Readable classes respectively. The `'finish'` event is fired after
-[`stream.end()`][stream-end] is called and all chunks have been processed by
-[`stream._transform()`][stream-_transform], `'end'` is fired after all data has
-been output which is after the callback in [`stream._flush()`][stream-_flush]
-has been called.
-
-#### transform.\_flush(callback)
-
-* `callback` {Function} Call this function (optionally with an error
-  argument) when you are done flushing any remaining data.
-
-Note: **This function MUST NOT be called directly.**  It MAY be implemented
-by child classes, and if so, will be called by the internal Transform
-class methods only.
-
-In some cases, your transform operation may need to emit a bit more
-data at the end of the stream. For example, a `Zlib` compression
-stream will store up some internal state so that it can optimally
-compress the output. At the end, however, it needs to do the best it
-can with what is left, so that the data will be complete.
-
-In those cases, you can implement a `_flush()` method, which will be
-called at the very end, after all the written data is consumed, but
-before emitting [`'end'`][] to signal the end of the readable side. Just
-like with [`stream._transform()`][stream-_transform], call
-`transform.push(chunk)` zero or more times, as appropriate, and call `callback`
-when the flush operation is complete.
-
-This method is prefixed with an underscore because it is internal to
-the class that defines it, and should not be called directly by user
-programs. However, you **are** expected to override this method in
-your own extension classes.
-
-#### transform.\_transform(chunk, encoding, callback)
-
-* `chunk` {Buffer|String} The chunk to be transformed. Will **always**
-  be a buffer unless the `decodeStrings` option was set to `false`.
-* `encoding` {String} If the chunk is a string, then this is the
-  encoding type. If chunk is a buffer, then this is the special
-  value - 'buffer', ignore it in this case.
-* `callback` {Function} Call this function (optionally with an error
-  argument and data) when you are done processing the supplied chunk.
-
-Note: **This function MUST NOT be called directly.**  It should be
-implemented by child classes, and called by the internal Transform
-class methods only.
-
-All Transform stream implementations must provide a `_transform()`
-method to accept input and produce output.
-
-`_transform()` should do whatever has to be done in this specific
-Transform class, to handle the bytes being written, and pass them off
-to the readable portion of the interface. Do asynchronous I/O,
-process things, and so on.
-
-Call `transform.push(outputChunk)` 0 or more times to generate output
-from this input chunk, depending on how much data you want to output
-as a result of this chunk.
-
-Call the callback function only when the current chunk is completely
-consumed. Note that there may or may not be output as a result of any
-particular input chunk. If you supply a second argument to the callback
-it will be passed to the push method. In other words the following are
-equivalent:
-
-```js
-transform.prototype._transform = function (data, encoding, callback) {
-  this.push(data);
-  callback();
-};
-
-transform.prototype._transform = function (data, encoding, callback) {
-  callback(null, data);
-};
-```
-
-This method is prefixed with an underscore because it is internal to
-the class that defines it, and should not be called directly by user
-programs. However, you **are** expected to override this method in
-your own extension classes.
-
-#### Example: `SimpleProtocol` parser v2
-
-The example [here](#stream_example_simpleprotocol_v1_sub_optimal) of a simple
-protocol parser can be implemented simply by using the higher level
-[Transform][] stream class, similar to the `parseHeader` and `SimpleProtocol
-v1` examples.
-
-In this example, rather than providing the input as an argument, it
-would be piped into the parser, which is a more idiomatic Node.js stream
-approach.
-
-```javascript
-const util = require('util');
-const Transform = require('stream').Transform;
-util.inherits(SimpleProtocol, Transform);
-
-function SimpleProtocol(options) {
-  if (!(this instanceof SimpleProtocol))
-    return new SimpleProtocol(options);
-
-  Transform.call(this, options);
-  this._inBody = false;
-  this._sawFirstCr = false;
-  this._rawHeader = [];
-  this.header = null;
-}
-
-SimpleProtocol.prototype._transform = function(chunk, encoding, done) {
-  if (!this._inBody) {
-    // check if the chunk has a \n\n
-    var split = -1;
-    for (var i = 0; i < chunk.length; i++) {
-      if (chunk[i] === 10) { // '\n'
-        if (this._sawFirstCr) {
-          split = i;
-          break;
-        } else {
-          this._sawFirstCr = true;
-        }
-      } else {
-        this._sawFirstCr = false;
-      }
-    }
-
-    if (split === -1) {
-      // still waiting for the \n\n
-      // stash the chunk, and try again.
-      this._rawHeader.push(chunk);
-    } else {
-      this._inBody = true;
-      var h = chunk.slice(0, split);
-      this._rawHeader.push(h);
-      var header = Buffer.concat(this._rawHeader).toString();
-      try {
-        this.header = JSON.parse(header);
-      } catch (er) {
-        this.emit('error', new Error('invalid simple protocol data'));
-        return;
-      }
-      // and let them know that we are done parsing the header.
-      this.emit('header', this.header);
-
-      // now, because we got some extra data, emit this first.
-      this.push(chunk.slice(split));
-    }
-  } else {
-    // from there on, just provide the data to our consumer as-is.
-    this.push(chunk);
-  }
-  done();
-};
-
-// Usage:
-// var parser = new SimpleProtocol();
-// source.pipe(parser)
-// Now parser is a readable stream that will emit 'header'
-// with the parsed header data.
-```
-
-### Class: stream.Writable
-
-<!--type=class-->
-
-`stream.Writable` is an abstract class designed to be extended with an
-underlying implementation of the
-[`stream._write(chunk, encoding, callback)`][stream-_write] method.
-
-Please see [API for Stream Consumers][] for how to consume
-writable streams in your programs. What follows is an explanation of
-how to implement Writable streams in your programs.
-
-#### new stream.Writable([options])
-
-* `options` {Object}
-  * `highWaterMark` {Number} Buffer level when
-    [`stream.write()`][stream-write] starts returning `false`. Default = `16384`
-    (16kb), or `16` for `objectMode` streams.
-  * `decodeStrings` {Boolean} Whether or not to decode strings into
-    Buffers before passing them to [`stream._write()`][stream-_write].
-    Default = `true`
-  * `objectMode` {Boolean} Whether or not the
-    [`stream.write(anyObj)`][stream-write] is a valid operation. If set you can
-    write arbitrary data instead of only `Buffer` / `String` data.
-    Default = `false`
-  * `write` {Function} Implementation for the
-    [`stream._write()`][stream-_write] method.
-  * `writev` {Function} Implementation for the
-    [`stream._writev()`][stream-_writev] method.
-
-In classes that extend the Writable class, make sure to call the
-constructor so that the buffering settings can be properly
-initialized.
-
-#### writable.\_write(chunk, encoding, callback)
-
-* `chunk` {Buffer|String} The chunk to be written. Will **always**
-  be a buffer unless the `decodeStrings` option was set to `false`.
-* `encoding` {String} If the chunk is a string, then this is the
-  encoding type. If chunk is a buffer, then this is the special
-  value - 'buffer', ignore it in this case.
-* `callback` {Function} Call this function (optionally with an error
-  argument) when you are done processing the supplied chunk.
-
-All Writable stream implementations must provide a
-[`stream._write()`][stream-_write] method to send data to the underlying
-resource.
-
-Note: **This function MUST NOT be called directly.**  It should be
-implemented by child classes, and called by the internal Writable
-class methods only.
-
-Call the callback using the standard `callback(error)` pattern to
-signal that the write completed successfully or with an error.
-
-If the `decodeStrings` flag is set in the constructor options, then
-`chunk` may be a string rather than a Buffer, and `encoding` will
-indicate the sort of string that it is. This is to support
-implementations that have an optimized handling for certain string
-data encodings. If you do not explicitly set the `decodeStrings`
-option to `false`, then you can safely ignore the `encoding` argument,
-and assume that `chunk` will always be a Buffer.
-
-This method is prefixed with an underscore because it is internal to
-the class that defines it, and should not be called directly by user
-programs. However, you **are** expected to override this method in
-your own extension classes.
-
-#### writable.\_writev(chunks, callback)
-
-* `chunks` {Array} The chunks to be written. Each chunk has following
-  format: `{ chunk: ..., encoding: ... }`.
-* `callback` {Function} Call this function (optionally with an error
-  argument) when you are done processing the supplied chunks.
-
-Note: **This function MUST NOT be called directly.**  It may be
-implemented by child classes, and called by the internal Writable
-class methods only.
-
-This function is completely optional to implement. In most cases it is
-unnecessary. If implemented, it will be called with all the chunks
-that are buffered in the write queue.
-
-
-## Simplified Constructor API
-
-<!--type=misc-->
-
-In simple cases there is now the added benefit of being able to construct a
-stream without inheritance.
-
-This can be done by passing the appropriate methods as constructor options:
-
-Examples:
-
-### Duplex
-
-```js
-var duplex = new stream.Duplex({
-  read: function(n) {
-    // sets this._read under the hood
-
-    // push data onto the read queue, passing null
-    // will signal the end of the stream (EOF)
-    this.push(chunk);
-  },
-  write: function(chunk, encoding, next) {
-    // sets this._write under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-
-// or
-
-var duplex = new stream.Duplex({
-  read: function(n) {
-    // sets this._read under the hood
-
-    // push data onto the read queue, passing null
-    // will signal the end of the stream (EOF)
-    this.push(chunk);
-  },
-  writev: function(chunks, next) {
-    // sets this._writev under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-```
-
-### Readable
-
-```js
-var readable = new stream.Readable({
-  read: function(n) {
-    // sets this._read under the hood
-
-    // push data onto the read queue, passing null
-    // will signal the end of the stream (EOF)
-    this.push(chunk);
-  }
-});
-```
-
-### Transform
-
-```js
-var transform = new stream.Transform({
-  transform: function(chunk, encoding, next) {
-    // sets this._transform under the hood
-
-    // generate output as many times as needed
-    // this.push(chunk);
-
-    // call when the current chunk is consumed
-    next();
-  },
-  flush: function(done) {
-    // sets this._flush under the hood
-
-    // generate output as many times as needed
-    // this.push(chunk);
-
-    done();
-  }
-});
-```
-
-### Writable
-
-```js
-var writable = new stream.Writable({
-  write: function(chunk, encoding, next) {
-    // sets this._write under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-
-// or
-
-var writable = new stream.Writable({
-  writev: function(chunks, next) {
-    // sets this._writev under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-```
-
-## Streams: Under the Hood
-
-<!--type=misc-->
-
-### Buffering
-
-<!--type=misc-->
-
-Both Writable and Readable streams will buffer data on an internal
-object which can be retrieved from `_writableState.getBuffer()` or
-`_readableState.buffer`, respectively.
-
-The amount of data that will potentially be buffered depends on the
-`highWaterMark` option which is passed into the constructor.
-
-Buffering in Readable streams happens when the implementation calls
-[`stream.push(chunk)`][stream-push]. If the consumer of the Stream does not
-call [`stream.read()`][stream-read], then the data will sit in the internal
-queue until it is consumed.
-
-Buffering in Writable streams happens when the user calls
-[`stream.write(chunk)`][stream-write] repeatedly, even when it returns `false`.
-
-The purpose of streams, especially with the [`stream.pipe()`][] method, is to
-limit the buffering of data to acceptable levels, so that sources and
-destinations of varying speed will not overwhelm the available memory.
-
-### Compatibility with Older Node.js Versions
-
-<!--type=misc-->
-
-In versions of Node.js prior to v0.10, the Readable stream interface was
-simpler, but also less powerful and less useful.
-
-* Rather than waiting for you to call the [`stream.read()`][stream-read] method,
-  [`'data'`][] events would start emitting immediately. If you needed to do
-  some I/O to decide how to handle data, then you had to store the chunks
-  in some kind of buffer so that they would not be lost.
-* The [`stream.pause()`][stream-pause] method was advisory, rather than
-  guaranteed. This meant that you still had to be prepared to receive
-  [`'data'`][] events even when the stream was in a paused state.
-
-In Node.js v0.10, the [Readable][] class was added.
-For backwards compatibility with older Node.js programs, Readable streams
-switch into "flowing mode" when a [`'data'`][] event handler is added, or
-when the [`stream.resume()`][stream-resume] method is called. The effect is
-that, even if you are not using the new [`stream.read()`][stream-read] method
-and [`'readable'`][] event, you no longer have to worry about losing
-[`'data'`][] chunks.
-
-Most programs will continue to function normally. However, this
-introduces an edge case in the following conditions:
-
-* No [`'data'`][] event handler is added.
-* The [`stream.resume()`][stream-resume] method is never called.
-* The stream is not piped to any writable destination.
-
-For example, consider the following code:
-
-```js
-// WARNING!  BROKEN!
-net.createServer((socket) => {
-
-  // we add an 'end' method, but never consume the data
-  socket.on('end', () => {
-    // It will never get here.
-    socket.end('I got your message (but didnt read it)\n');
-  });
-
-}).listen(1337);
-```
-
-In versions of Node.js prior to v0.10, the incoming message data would be
-simply discarded. However, in Node.js v0.10 and beyond,
-the socket will remain paused forever.
-
-The workaround in this situation is to call the
-[`stream.resume()`][stream-resume] method to start the flow of data:
-
-```js
-// Workaround
-net.createServer((socket) => {
-
-  socket.on('end', () => {
-    socket.end('I got your message (but didnt read it)\n');
-  });
-
-  // start the flow of data, discarding it.
-  socket.resume();
-
-}).listen(1337);
-```
-
-In addition to new Readable streams switching into flowing mode,
-pre-v0.10 style streams can be wrapped in a Readable class using the
-[`stream.wrap()`][] method.
-
-
-### Object Mode
-
-<!--type=misc-->
-
-Normally, Streams operate on Strings and Buffers exclusively.
-
-Streams that are in **object mode** can emit generic JavaScript values
-other than Buffers and Strings.
-
-A Readable stream in object mode will always return a single item from
-a call to [`stream.read(size)`][stream-read], regardless of what the size
-argument is.
-
-A Writable stream in object mode will always ignore the `encoding`
-argument to [`stream.write(data, encoding)`][stream-write].
-
-The special value `null` still retains its special value for object
-mode streams. That is, for object mode readable streams, `null` as a
-return value from [`stream.read()`][stream-read] indicates that there is no more
-data, and [`stream.push(null)`][stream-push] will signal the end of stream data
-(`EOF`).
-
-No streams in Node.js core are object mode streams. This pattern is only
-used by userland streaming libraries.
-
-You should set `objectMode` in your stream child class constructor on
-the options object. Setting `objectMode` mid-stream is not safe.
-
-For Duplex streams `objectMode` can be set exclusively for readable or
-writable side with `readableObjectMode` and `writableObjectMode`
-respectively. These options can be used to implement parsers and
-serializers with Transform streams.
-
-```js
-const util = require('util');
-const StringDecoder = require('string_decoder').StringDecoder;
-const Transform = require('stream').Transform;
-util.inherits(JSONParseStream, Transform);
-
-// Gets \n-delimited JSON string data, and emits the parsed objects
-function JSONParseStream() {
-  if (!(this instanceof JSONParseStream))
-    return new JSONParseStream();
-
-  Transform.call(this, { readableObjectMode : true });
-
-  this._buffer = '';
-  this._decoder = new StringDecoder('utf8');
-}
-
-JSONParseStream.prototype._transform = function(chunk, encoding, cb) {
-  this._buffer += this._decoder.write(chunk);
-  // split on newlines
-  var lines = this._buffer.split(/\r?\n/);
-  // keep the last partial line buffered
-  this._buffer = lines.pop();
-  for (var l = 0; l < lines.length; l++) {
-    var line = lines[l];
-    try {
-      var obj = JSON.parse(line);
-    } catch (er) {
-      this.emit('error', er);
-      return;
-    }
-    // push the parsed object out to the readable consumer
-    this.push(obj);
-  }
-  cb();
-};
-
-JSONParseStream.prototype._flush = function(cb) {
-  // Just handle any leftover
-  var rem = this._buffer.trim();
-  if (rem) {
-    try {
-      var obj = JSON.parse(rem);
-    } catch (er) {
-      this.emit('error', er);
-      return;
-    }
-    // push the parsed object out to the readable consumer
-    this.push(obj);
-  }
-  cb();
-};
-```
-
-### `stream.read(0)`
-
-There are some cases where you want to trigger a refresh of the
-underlying readable stream mechanisms, without actually consuming any
-data. In that case, you can call `stream.read(0)`, which will always
-return null.
-
-If the internal read buffer is below the `highWaterMark`, and the
-stream is not currently reading, then calling `stream.read(0)` will trigger
-a low-level [`stream._read()`][stream-_read] call.
-
-There is almost never a need to do this. However, you will see some
-cases in Node.js's internals where this is done, particularly in the
-Readable stream class internals.
-
-### `stream.push('')`
-
-Pushing a zero-byte string or Buffer (when not in [Object mode][]) has an
-interesting side effect. Because it *is* a call to
-[`stream.push()`][stream-push], it will end the `reading` process. However, it
-does *not* add any data to the readable buffer, so there's nothing for
-a user to consume.
-
-Very rarely, there are cases where you have no data to provide now,
-but the consumer of your stream (or, perhaps, another bit of your own
-code) will know when to check again, by calling [`stream.read(0)`][stream-read].
-In those cases, you *may* call `stream.push('')`.
-
-So far, the only use case for this functionality is in the
-[`tls.CryptoStream`][] class, which is deprecated in Node.js/io.js v1.0. If you
-find that you have to use `stream.push('')`, please consider another
-approach, because it almost certainly indicates that something is
-horribly wrong.
-
-[`'data'`]: #stream_event_data
-[`'drain'`]: #stream_event_drain
-[`'end'`]: #stream_event_end
-[`'finish'`]: #stream_event_finish
-[`'readable'`]: #stream_event_readable
-[`buf.toString(encoding)`]: https://nodejs.org/docs/v6.1.0/api/buffer.html#buffer_buf_tostring_encoding_start_end
-[`EventEmitter`]: https://nodejs.org/docs/v6.1.0/api/events.html#events_class_eventemitter
-[`process.stderr`]: https://nodejs.org/docs/v6.1.0/api/process.html#process_process_stderr
-[`process.stdin`]: https://nodejs.org/docs/v6.1.0/api/process.html#process_process_stdin
-[`process.stdout`]: https://nodejs.org/docs/v6.1.0/api/process.html#process_process_stdout
-[`stream.cork()`]: #stream_writable_cork
-[`stream.pipe()`]: #stream_readable_pipe_destination_options
-[`stream.uncork()`]: #stream_writable_uncork
-[`stream.unpipe()`]: #stream_readable_unpipe_destination
-[`stream.wrap()`]: #stream_readable_wrap_stream
-[`tls.CryptoStream`]: https://nodejs.org/docs/v6.1.0/api/tls.html#tls_class_cryptostream
-[`util.inherits()`]: https://nodejs.org/docs/v6.1.0/api/util.html#util_util_inherits_constructor_superconstructor
-[API for Stream Consumers]: #stream_api_for_stream_consumers
-[API for Stream Implementors]: #stream_api_for_stream_implementors
-[child process stdin]: https://nodejs.org/docs/v6.1.0/api/child_process.html#child_process_child_stdin
-[child process stdout and stderr]: https://nodejs.org/docs/v6.1.0/api/child_process.html#child_process_child_stdout
-[Compatibility]: #stream_compatibility_with_older_node_js_versions
-[crypto]: crypto.html
-[Duplex]: #stream_class_stream_duplex
-[fs read streams]: https://nodejs.org/docs/v6.1.0/api/fs.html#fs_class_fs_readstream
-[fs write streams]: https://nodejs.org/docs/v6.1.0/api/fs.html#fs_class_fs_writestream
-[HTTP requests, on the client]: https://nodejs.org/docs/v6.1.0/api/http.html#http_class_http_clientrequest
-[HTTP responses, on the server]: https://nodejs.org/docs/v6.1.0/api/http.html#http_class_http_serverresponse
-[http-incoming-message]: https://nodejs.org/docs/v6.1.0/api/http.html#http_class_http_incomingmessage
-[Object mode]: #stream_object_mode
-[Readable]: #stream_class_stream_readable
-[SimpleProtocol v2]: #stream_example_simpleprotocol_parser_v2
-[stream-_flush]: #stream_transform_flush_callback
-[stream-_read]: #stream_readable_read_size_1
-[stream-_transform]: #stream_transform_transform_chunk_encoding_callback
-[stream-_write]: #stream_writable_write_chunk_encoding_callback_1
-[stream-_writev]: #stream_writable_writev_chunks_callback
-[stream-end]: #stream_writable_end_chunk_encoding_callback
-[stream-pause]: #stream_readable_pause
-[stream-push]: #stream_readable_push_chunk_encoding
-[stream-read]: #stream_readable_read_size
-[stream-resume]: #stream_readable_resume
-[stream-write]: #stream_writable_write_chunk_encoding_callback
-[TCP sockets]: https://nodejs.org/docs/v6.1.0/api/net.html#net_class_net_socket
-[Transform]: #stream_class_stream_transform
-[Writable]: #stream_class_stream_writable
-[zlib]: zlib.html
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md
deleted file mode 100644
index 83275f192e4077d32942525aaf510fa449a7c417..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# streams WG Meeting 2015-01-30
-
-## Links
-
-* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg
-* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106
-* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/
-
-## Agenda
-
-Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting.
-
-* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105)
-* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101)
-* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102)
-* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99)
-
-## Minutes
-
-### adopt a charter
-
-* group: +1's all around
-
-### What versioning scheme should be adopted?
-* group: +1’s 3.0.0
-* domenic+group: pulling in patches from other sources where appropriate
-* mikeal: version independently, suggesting versions for io.js
-* mikeal+domenic: work with TC to notify in advance of changes
-simpler stream creation
-
-### streamline creation of streams
-* sam: streamline creation of streams
-* domenic: nice simple solution posted
-  but, we lose the opportunity to change the model
-  may not be backwards incompatible (double check keys)
-
-  **action item:** domenic will check
-
-### remove implicit flowing of streams on(‘data’)
-* add isFlowing / isPaused
-* mikeal: worrying that we’re documenting polyfill methods – confuses users
-* domenic: more reflective API is probably good, with warning labels for users
-* new section for mad scientists (reflective stream access)
-* calvin: name the “third state”
-* mikeal: maybe borrow the name from whatwg?
-* domenic: we’re missing the “third state”
-* consensus: kind of difficult to name the third state
-* mikeal: figure out differences in states / compat
-* mathias: always flow on data – eliminates third state
-  * explore what it breaks
-
-**action items:**
-* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream)
-* ask rod/build for infrastructure
-* **chris**: explore the “flow on data” approach
-* add isPaused/isFlowing
-* add new docs section
-* move isPaused to that section
-
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/duplex.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/duplex.js
deleted file mode 100644
index ca807af87620dd789b4f72984b813618fc1a76ff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/duplex.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_duplex.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_duplex.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_duplex.js
deleted file mode 100644
index 736693b8400fed16544db29d1eecd42233dc71c9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_duplex.js
+++ /dev/null
@@ -1,75 +0,0 @@
-// a duplex stream is just a stream that is both readable and writable.
-// Since JS doesn't have multiple prototypal inheritance, this class
-// prototypally inherits from Readable, and then parasitically from
-// Writable.
-
-'use strict';
-
-/*<replacement>*/
-
-var objectKeys = Object.keys || function (obj) {
-  var keys = [];
-  for (var key in obj) {
-    keys.push(key);
-  }return keys;
-};
-/*</replacement>*/
-
-module.exports = Duplex;
-
-/*<replacement>*/
-var processNextTick = require('process-nextick-args');
-/*</replacement>*/
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-var Readable = require('./_stream_readable');
-var Writable = require('./_stream_writable');
-
-util.inherits(Duplex, Readable);
-
-var keys = objectKeys(Writable.prototype);
-for (var v = 0; v < keys.length; v++) {
-  var method = keys[v];
-  if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
-}
-
-function Duplex(options) {
-  if (!(this instanceof Duplex)) return new Duplex(options);
-
-  Readable.call(this, options);
-  Writable.call(this, options);
-
-  if (options && options.readable === false) this.readable = false;
-
-  if (options && options.writable === false) this.writable = false;
-
-  this.allowHalfOpen = true;
-  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
-
-  this.once('end', onend);
-}
-
-// the no-half-open enforcer
-function onend() {
-  // if we allow half-open state, or if the writable side ended,
-  // then we're ok.
-  if (this.allowHalfOpen || this._writableState.ended) return;
-
-  // no more data can be written.
-  // But allow more writes to happen in this tick.
-  processNextTick(onEndNT, this);
-}
-
-function onEndNT(self) {
-  self.end();
-}
-
-function forEach(xs, f) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    f(xs[i], i);
-  }
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_passthrough.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_passthrough.js
deleted file mode 100644
index d06f71f1868d77a4111e894550798c977a091182..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_passthrough.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// a passthrough stream.
-// basically just the most minimal sort of Transform stream.
-// Every written chunk gets output as-is.
-
-'use strict';
-
-module.exports = PassThrough;
-
-var Transform = require('./_stream_transform');
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-util.inherits(PassThrough, Transform);
-
-function PassThrough(options) {
-  if (!(this instanceof PassThrough)) return new PassThrough(options);
-
-  Transform.call(this, options);
-}
-
-PassThrough.prototype._transform = function (chunk, encoding, cb) {
-  cb(null, chunk);
-};
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_readable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_readable.js
deleted file mode 100644
index 79914fa684cbb1f3e0847624b6f671a61846c35f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_readable.js
+++ /dev/null
@@ -1,893 +0,0 @@
-'use strict';
-
-module.exports = Readable;
-
-/*<replacement>*/
-var processNextTick = require('process-nextick-args');
-/*</replacement>*/
-
-/*<replacement>*/
-var isArray = require('isarray');
-/*</replacement>*/
-
-Readable.ReadableState = ReadableState;
-
-/*<replacement>*/
-var EE = require('events').EventEmitter;
-
-var EElistenerCount = function (emitter, type) {
-  return emitter.listeners(type).length;
-};
-/*</replacement>*/
-
-/*<replacement>*/
-var Stream;
-(function () {
-  try {
-    Stream = require('st' + 'ream');
-  } catch (_) {} finally {
-    if (!Stream) Stream = require('events').EventEmitter;
-  }
-})();
-/*</replacement>*/
-
-var Buffer = require('buffer').Buffer;
-/*<replacement>*/
-var bufferShim = require('buffer-shims');
-/*</replacement>*/
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-/*<replacement>*/
-var debugUtil = require('util');
-var debug = void 0;
-if (debugUtil && debugUtil.debuglog) {
-  debug = debugUtil.debuglog('stream');
-} else {
-  debug = function () {};
-}
-/*</replacement>*/
-
-var StringDecoder;
-
-util.inherits(Readable, Stream);
-
-var hasPrependListener = typeof EE.prototype.prependListener === 'function';
-
-function prependListener(emitter, event, fn) {
-  if (hasPrependListener) return emitter.prependListener(event, fn);
-
-  // This is a brutally ugly hack to make sure that our error handler
-  // is attached before any userland ones.  NEVER DO THIS. This is here
-  // only because this code needs to continue to work with older versions
-  // of Node.js that do not include the prependListener() method. The goal
-  // is to eventually remove this hack.
-  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
-}
-
-var Duplex;
-function ReadableState(options, stream) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  options = options || {};
-
-  // object stream flag. Used to make read(n) ignore n and to
-  // make all the buffer merging and length checks go away
-  this.objectMode = !!options.objectMode;
-
-  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
-
-  // the point at which it stops calling _read() to fill the buffer
-  // Note: 0 is a valid value, means "don't call _read preemptively ever"
-  var hwm = options.highWaterMark;
-  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
-  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
-
-  // cast to ints.
-  this.highWaterMark = ~ ~this.highWaterMark;
-
-  this.buffer = [];
-  this.length = 0;
-  this.pipes = null;
-  this.pipesCount = 0;
-  this.flowing = null;
-  this.ended = false;
-  this.endEmitted = false;
-  this.reading = false;
-
-  // a flag to be able to tell if the onwrite cb is called immediately,
-  // or on a later tick.  We set this to true at first, because any
-  // actions that shouldn't happen until "later" should generally also
-  // not happen before the first write call.
-  this.sync = true;
-
-  // whenever we return null, then we set a flag to say
-  // that we're awaiting a 'readable' event emission.
-  this.needReadable = false;
-  this.emittedReadable = false;
-  this.readableListening = false;
-  this.resumeScheduled = false;
-
-  // Crypto is kind of old and crusty.  Historically, its default string
-  // encoding is 'binary' so we have to make this configurable.
-  // Everything else in the universe uses 'utf8', though.
-  this.defaultEncoding = options.defaultEncoding || 'utf8';
-
-  // when piping, we only care about 'readable' events that happen
-  // after read()ing all the bytes and not getting any pushback.
-  this.ranOut = false;
-
-  // the number of writers that are awaiting a drain event in .pipe()s
-  this.awaitDrain = 0;
-
-  // if true, a maybeReadMore has been scheduled
-  this.readingMore = false;
-
-  this.decoder = null;
-  this.encoding = null;
-  if (options.encoding) {
-    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
-    this.decoder = new StringDecoder(options.encoding);
-    this.encoding = options.encoding;
-  }
-}
-
-var Duplex;
-function Readable(options) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  if (!(this instanceof Readable)) return new Readable(options);
-
-  this._readableState = new ReadableState(options, this);
-
-  // legacy
-  this.readable = true;
-
-  if (options && typeof options.read === 'function') this._read = options.read;
-
-  Stream.call(this);
-}
-
-// Manually shove something into the read() buffer.
-// This returns true if the highWaterMark has not been hit yet,
-// similar to how Writable.write() returns true if you should
-// write() some more.
-Readable.prototype.push = function (chunk, encoding) {
-  var state = this._readableState;
-
-  if (!state.objectMode && typeof chunk === 'string') {
-    encoding = encoding || state.defaultEncoding;
-    if (encoding !== state.encoding) {
-      chunk = bufferShim.from(chunk, encoding);
-      encoding = '';
-    }
-  }
-
-  return readableAddChunk(this, state, chunk, encoding, false);
-};
-
-// Unshift should *always* be something directly out of read()
-Readable.prototype.unshift = function (chunk) {
-  var state = this._readableState;
-  return readableAddChunk(this, state, chunk, '', true);
-};
-
-Readable.prototype.isPaused = function () {
-  return this._readableState.flowing === false;
-};
-
-function readableAddChunk(stream, state, chunk, encoding, addToFront) {
-  var er = chunkInvalid(state, chunk);
-  if (er) {
-    stream.emit('error', er);
-  } else if (chunk === null) {
-    state.reading = false;
-    onEofChunk(stream, state);
-  } else if (state.objectMode || chunk && chunk.length > 0) {
-    if (state.ended && !addToFront) {
-      var e = new Error('stream.push() after EOF');
-      stream.emit('error', e);
-    } else if (state.endEmitted && addToFront) {
-      var _e = new Error('stream.unshift() after end event');
-      stream.emit('error', _e);
-    } else {
-      var skipAdd;
-      if (state.decoder && !addToFront && !encoding) {
-        chunk = state.decoder.write(chunk);
-        skipAdd = !state.objectMode && chunk.length === 0;
-      }
-
-      if (!addToFront) state.reading = false;
-
-      // Don't add to the buffer if we've decoded to an empty string chunk and
-      // we're not in object mode
-      if (!skipAdd) {
-        // if we want the data now, just emit it.
-        if (state.flowing && state.length === 0 && !state.sync) {
-          stream.emit('data', chunk);
-          stream.read(0);
-        } else {
-          // update the buffer info.
-          state.length += state.objectMode ? 1 : chunk.length;
-          if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
-
-          if (state.needReadable) emitReadable(stream);
-        }
-      }
-
-      maybeReadMore(stream, state);
-    }
-  } else if (!addToFront) {
-    state.reading = false;
-  }
-
-  return needMoreData(state);
-}
-
-// if it's past the high water mark, we can push in some more.
-// Also, if we have no data yet, we can stand some
-// more bytes.  This is to work around cases where hwm=0,
-// such as the repl.  Also, if the push() triggered a
-// readable event, and the user called read(largeNumber) such that
-// needReadable was set, then we ought to push more, so that another
-// 'readable' event will be triggered.
-function needMoreData(state) {
-  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
-}
-
-// backwards compatibility.
-Readable.prototype.setEncoding = function (enc) {
-  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
-  this._readableState.decoder = new StringDecoder(enc);
-  this._readableState.encoding = enc;
-  return this;
-};
-
-// Don't raise the hwm > 8MB
-var MAX_HWM = 0x800000;
-function computeNewHighWaterMark(n) {
-  if (n >= MAX_HWM) {
-    n = MAX_HWM;
-  } else {
-    // Get the next highest power of 2
-    n--;
-    n |= n >>> 1;
-    n |= n >>> 2;
-    n |= n >>> 4;
-    n |= n >>> 8;
-    n |= n >>> 16;
-    n++;
-  }
-  return n;
-}
-
-function howMuchToRead(n, state) {
-  if (state.length === 0 && state.ended) return 0;
-
-  if (state.objectMode) return n === 0 ? 0 : 1;
-
-  if (n === null || isNaN(n)) {
-    // only flow one buffer at a time
-    if (state.flowing && state.buffer.length) return state.buffer[0].length;else return state.length;
-  }
-
-  if (n <= 0) return 0;
-
-  // If we're asking for more than the target buffer level,
-  // then raise the water mark.  Bump up to the next highest
-  // power of 2, to prevent increasing it excessively in tiny
-  // amounts.
-  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
-
-  // don't have that much.  return null, unless we've ended.
-  if (n > state.length) {
-    if (!state.ended) {
-      state.needReadable = true;
-      return 0;
-    } else {
-      return state.length;
-    }
-  }
-
-  return n;
-}
-
-// you can override either this method, or the async _read(n) below.
-Readable.prototype.read = function (n) {
-  debug('read', n);
-  var state = this._readableState;
-  var nOrig = n;
-
-  if (typeof n !== 'number' || n > 0) state.emittedReadable = false;
-
-  // if we're doing read(0) to trigger a readable event, but we
-  // already have a bunch of data in the buffer, then just trigger
-  // the 'readable' event and move on.
-  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
-    debug('read: emitReadable', state.length, state.ended);
-    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
-    return null;
-  }
-
-  n = howMuchToRead(n, state);
-
-  // if we've ended, and we're now clear, then finish it up.
-  if (n === 0 && state.ended) {
-    if (state.length === 0) endReadable(this);
-    return null;
-  }
-
-  // All the actual chunk generation logic needs to be
-  // *below* the call to _read.  The reason is that in certain
-  // synthetic stream cases, such as passthrough streams, _read
-  // may be a completely synchronous operation which may change
-  // the state of the read buffer, providing enough data when
-  // before there was *not* enough.
-  //
-  // So, the steps are:
-  // 1. Figure out what the state of things will be after we do
-  // a read from the buffer.
-  //
-  // 2. If that resulting state will trigger a _read, then call _read.
-  // Note that this may be asynchronous, or synchronous.  Yes, it is
-  // deeply ugly to write APIs this way, but that still doesn't mean
-  // that the Readable class should behave improperly, as streams are
-  // designed to be sync/async agnostic.
-  // Take note if the _read call is sync or async (ie, if the read call
-  // has returned yet), so that we know whether or not it's safe to emit
-  // 'readable' etc.
-  //
-  // 3. Actually pull the requested chunks out of the buffer and return.
-
-  // if we need a readable event, then we need to do some reading.
-  var doRead = state.needReadable;
-  debug('need readable', doRead);
-
-  // if we currently have less than the highWaterMark, then also read some
-  if (state.length === 0 || state.length - n < state.highWaterMark) {
-    doRead = true;
-    debug('length less than watermark', doRead);
-  }
-
-  // however, if we've ended, then there's no point, and if we're already
-  // reading, then it's unnecessary.
-  if (state.ended || state.reading) {
-    doRead = false;
-    debug('reading or ended', doRead);
-  }
-
-  if (doRead) {
-    debug('do read');
-    state.reading = true;
-    state.sync = true;
-    // if the length is currently zero, then we *need* a readable event.
-    if (state.length === 0) state.needReadable = true;
-    // call internal read method
-    this._read(state.highWaterMark);
-    state.sync = false;
-  }
-
-  // If _read pushed data synchronously, then `reading` will be false,
-  // and we need to re-evaluate how much data we can return to the user.
-  if (doRead && !state.reading) n = howMuchToRead(nOrig, state);
-
-  var ret;
-  if (n > 0) ret = fromList(n, state);else ret = null;
-
-  if (ret === null) {
-    state.needReadable = true;
-    n = 0;
-  }
-
-  state.length -= n;
-
-  // If we have nothing in the buffer, then we want to know
-  // as soon as we *do* get something into the buffer.
-  if (state.length === 0 && !state.ended) state.needReadable = true;
-
-  // If we tried to read() past the EOF, then emit end on the next tick.
-  if (nOrig !== n && state.ended && state.length === 0) endReadable(this);
-
-  if (ret !== null) this.emit('data', ret);
-
-  return ret;
-};
-
-function chunkInvalid(state, chunk) {
-  var er = null;
-  if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {
-    er = new TypeError('Invalid non-string/buffer chunk');
-  }
-  return er;
-}
-
-function onEofChunk(stream, state) {
-  if (state.ended) return;
-  if (state.decoder) {
-    var chunk = state.decoder.end();
-    if (chunk && chunk.length) {
-      state.buffer.push(chunk);
-      state.length += state.objectMode ? 1 : chunk.length;
-    }
-  }
-  state.ended = true;
-
-  // emit 'readable' now to make sure it gets picked up.
-  emitReadable(stream);
-}
-
-// Don't emit readable right away in sync mode, because this can trigger
-// another read() call => stack overflow.  This way, it might trigger
-// a nextTick recursion warning, but that's not so bad.
-function emitReadable(stream) {
-  var state = stream._readableState;
-  state.needReadable = false;
-  if (!state.emittedReadable) {
-    debug('emitReadable', state.flowing);
-    state.emittedReadable = true;
-    if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);
-  }
-}
-
-function emitReadable_(stream) {
-  debug('emit readable');
-  stream.emit('readable');
-  flow(stream);
-}
-
-// at this point, the user has presumably seen the 'readable' event,
-// and called read() to consume some data.  that may have triggered
-// in turn another _read(n) call, in which case reading = true if
-// it's in progress.
-// However, if we're not ended, or reading, and the length < hwm,
-// then go ahead and try to read some more preemptively.
-function maybeReadMore(stream, state) {
-  if (!state.readingMore) {
-    state.readingMore = true;
-    processNextTick(maybeReadMore_, stream, state);
-  }
-}
-
-function maybeReadMore_(stream, state) {
-  var len = state.length;
-  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
-    debug('maybeReadMore read 0');
-    stream.read(0);
-    if (len === state.length)
-      // didn't get any data, stop spinning.
-      break;else len = state.length;
-  }
-  state.readingMore = false;
-}
-
-// abstract method.  to be overridden in specific implementation classes.
-// call cb(er, data) where data is <= n in length.
-// for virtual (non-string, non-buffer) streams, "length" is somewhat
-// arbitrary, and perhaps not very meaningful.
-Readable.prototype._read = function (n) {
-  this.emit('error', new Error('not implemented'));
-};
-
-Readable.prototype.pipe = function (dest, pipeOpts) {
-  var src = this;
-  var state = this._readableState;
-
-  switch (state.pipesCount) {
-    case 0:
-      state.pipes = dest;
-      break;
-    case 1:
-      state.pipes = [state.pipes, dest];
-      break;
-    default:
-      state.pipes.push(dest);
-      break;
-  }
-  state.pipesCount += 1;
-  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
-
-  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
-
-  var endFn = doEnd ? onend : cleanup;
-  if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);
-
-  dest.on('unpipe', onunpipe);
-  function onunpipe(readable) {
-    debug('onunpipe');
-    if (readable === src) {
-      cleanup();
-    }
-  }
-
-  function onend() {
-    debug('onend');
-    dest.end();
-  }
-
-  // when the dest drains, it reduces the awaitDrain counter
-  // on the source.  This would be more elegant with a .once()
-  // handler in flow(), but adding and removing repeatedly is
-  // too slow.
-  var ondrain = pipeOnDrain(src);
-  dest.on('drain', ondrain);
-
-  var cleanedUp = false;
-  function cleanup() {
-    debug('cleanup');
-    // cleanup event handlers once the pipe is broken
-    dest.removeListener('close', onclose);
-    dest.removeListener('finish', onfinish);
-    dest.removeListener('drain', ondrain);
-    dest.removeListener('error', onerror);
-    dest.removeListener('unpipe', onunpipe);
-    src.removeListener('end', onend);
-    src.removeListener('end', cleanup);
-    src.removeListener('data', ondata);
-
-    cleanedUp = true;
-
-    // if the reader is waiting for a drain event from this
-    // specific writer, then it would cause it to never start
-    // flowing again.
-    // So, if this is awaiting a drain, then we just call it now.
-    // If we don't know, then assume that we are waiting for one.
-    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
-  }
-
-  src.on('data', ondata);
-  function ondata(chunk) {
-    debug('ondata');
-    var ret = dest.write(chunk);
-    if (false === ret) {
-      // If the user unpiped during `dest.write()`, it is possible
-      // to get stuck in a permanently paused state if that write
-      // also returned false.
-      // => Check whether `dest` is still a piping destination.
-      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
-        debug('false write response, pause', src._readableState.awaitDrain);
-        src._readableState.awaitDrain++;
-      }
-      src.pause();
-    }
-  }
-
-  // if the dest has an error, then stop piping into it.
-  // however, don't suppress the throwing behavior for this.
-  function onerror(er) {
-    debug('onerror', er);
-    unpipe();
-    dest.removeListener('error', onerror);
-    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
-  }
-
-  // Make sure our error handler is attached before userland ones.
-  prependListener(dest, 'error', onerror);
-
-  // Both close and finish should trigger unpipe, but only once.
-  function onclose() {
-    dest.removeListener('finish', onfinish);
-    unpipe();
-  }
-  dest.once('close', onclose);
-  function onfinish() {
-    debug('onfinish');
-    dest.removeListener('close', onclose);
-    unpipe();
-  }
-  dest.once('finish', onfinish);
-
-  function unpipe() {
-    debug('unpipe');
-    src.unpipe(dest);
-  }
-
-  // tell the dest that it's being piped to
-  dest.emit('pipe', src);
-
-  // start the flow if it hasn't been started already.
-  if (!state.flowing) {
-    debug('pipe resume');
-    src.resume();
-  }
-
-  return dest;
-};
-
-function pipeOnDrain(src) {
-  return function () {
-    var state = src._readableState;
-    debug('pipeOnDrain', state.awaitDrain);
-    if (state.awaitDrain) state.awaitDrain--;
-    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
-      state.flowing = true;
-      flow(src);
-    }
-  };
-}
-
-Readable.prototype.unpipe = function (dest) {
-  var state = this._readableState;
-
-  // if we're not piping anywhere, then do nothing.
-  if (state.pipesCount === 0) return this;
-
-  // just one destination.  most common case.
-  if (state.pipesCount === 1) {
-    // passed in one, but it's not the right one.
-    if (dest && dest !== state.pipes) return this;
-
-    if (!dest) dest = state.pipes;
-
-    // got a match.
-    state.pipes = null;
-    state.pipesCount = 0;
-    state.flowing = false;
-    if (dest) dest.emit('unpipe', this);
-    return this;
-  }
-
-  // slow case. multiple pipe destinations.
-
-  if (!dest) {
-    // remove all.
-    var dests = state.pipes;
-    var len = state.pipesCount;
-    state.pipes = null;
-    state.pipesCount = 0;
-    state.flowing = false;
-
-    for (var _i = 0; _i < len; _i++) {
-      dests[_i].emit('unpipe', this);
-    }return this;
-  }
-
-  // try to find the right one.
-  var i = indexOf(state.pipes, dest);
-  if (i === -1) return this;
-
-  state.pipes.splice(i, 1);
-  state.pipesCount -= 1;
-  if (state.pipesCount === 1) state.pipes = state.pipes[0];
-
-  dest.emit('unpipe', this);
-
-  return this;
-};
-
-// set up data events if they are asked for
-// Ensure readable listeners eventually get something
-Readable.prototype.on = function (ev, fn) {
-  var res = Stream.prototype.on.call(this, ev, fn);
-
-  // If listening to data, and it has not explicitly been paused,
-  // then call resume to start the flow of data on the next tick.
-  if (ev === 'data' && false !== this._readableState.flowing) {
-    this.resume();
-  }
-
-  if (ev === 'readable' && !this._readableState.endEmitted) {
-    var state = this._readableState;
-    if (!state.readableListening) {
-      state.readableListening = true;
-      state.emittedReadable = false;
-      state.needReadable = true;
-      if (!state.reading) {
-        processNextTick(nReadingNextTick, this);
-      } else if (state.length) {
-        emitReadable(this, state);
-      }
-    }
-  }
-
-  return res;
-};
-Readable.prototype.addListener = Readable.prototype.on;
-
-function nReadingNextTick(self) {
-  debug('readable nexttick read 0');
-  self.read(0);
-}
-
-// pause() and resume() are remnants of the legacy readable stream API
-// If the user uses them, then switch into old mode.
-Readable.prototype.resume = function () {
-  var state = this._readableState;
-  if (!state.flowing) {
-    debug('resume');
-    state.flowing = true;
-    resume(this, state);
-  }
-  return this;
-};
-
-function resume(stream, state) {
-  if (!state.resumeScheduled) {
-    state.resumeScheduled = true;
-    processNextTick(resume_, stream, state);
-  }
-}
-
-function resume_(stream, state) {
-  if (!state.reading) {
-    debug('resume read 0');
-    stream.read(0);
-  }
-
-  state.resumeScheduled = false;
-  stream.emit('resume');
-  flow(stream);
-  if (state.flowing && !state.reading) stream.read(0);
-}
-
-Readable.prototype.pause = function () {
-  debug('call pause flowing=%j', this._readableState.flowing);
-  if (false !== this._readableState.flowing) {
-    debug('pause');
-    this._readableState.flowing = false;
-    this.emit('pause');
-  }
-  return this;
-};
-
-function flow(stream) {
-  var state = stream._readableState;
-  debug('flow', state.flowing);
-  if (state.flowing) {
-    do {
-      var chunk = stream.read();
-    } while (null !== chunk && state.flowing);
-  }
-}
-
-// wrap an old-style stream as the async data source.
-// This is *not* part of the readable stream interface.
-// It is an ugly unfortunate mess of history.
-Readable.prototype.wrap = function (stream) {
-  var state = this._readableState;
-  var paused = false;
-
-  var self = this;
-  stream.on('end', function () {
-    debug('wrapped end');
-    if (state.decoder && !state.ended) {
-      var chunk = state.decoder.end();
-      if (chunk && chunk.length) self.push(chunk);
-    }
-
-    self.push(null);
-  });
-
-  stream.on('data', function (chunk) {
-    debug('wrapped data');
-    if (state.decoder) chunk = state.decoder.write(chunk);
-
-    // don't skip over falsy values in objectMode
-    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
-
-    var ret = self.push(chunk);
-    if (!ret) {
-      paused = true;
-      stream.pause();
-    }
-  });
-
-  // proxy all the other methods.
-  // important when wrapping filters and duplexes.
-  for (var i in stream) {
-    if (this[i] === undefined && typeof stream[i] === 'function') {
-      this[i] = function (method) {
-        return function () {
-          return stream[method].apply(stream, arguments);
-        };
-      }(i);
-    }
-  }
-
-  // proxy certain important events.
-  var events = ['error', 'close', 'destroy', 'pause', 'resume'];
-  forEach(events, function (ev) {
-    stream.on(ev, self.emit.bind(self, ev));
-  });
-
-  // when we try to consume some more bytes, simply unpause the
-  // underlying stream.
-  self._read = function (n) {
-    debug('wrapped _read', n);
-    if (paused) {
-      paused = false;
-      stream.resume();
-    }
-  };
-
-  return self;
-};
-
-// exposed for testing purposes only.
-Readable._fromList = fromList;
-
-// Pluck off n bytes from an array of buffers.
-// Length is the combined lengths of all the buffers in the list.
-function fromList(n, state) {
-  var list = state.buffer;
-  var length = state.length;
-  var stringMode = !!state.decoder;
-  var objectMode = !!state.objectMode;
-  var ret;
-
-  // nothing in the list, definitely empty.
-  if (list.length === 0) return null;
-
-  if (length === 0) ret = null;else if (objectMode) ret = list.shift();else if (!n || n >= length) {
-    // read it all, truncate the array.
-    if (stringMode) ret = list.join('');else if (list.length === 1) ret = list[0];else ret = Buffer.concat(list, length);
-    list.length = 0;
-  } else {
-    // read just some of it.
-    if (n < list[0].length) {
-      // just take a part of the first list item.
-      // slice is the same for buffers and strings.
-      var buf = list[0];
-      ret = buf.slice(0, n);
-      list[0] = buf.slice(n);
-    } else if (n === list[0].length) {
-      // first list is a perfect match
-      ret = list.shift();
-    } else {
-      // complex case.
-      // we have enough to cover it, but it spans past the first buffer.
-      if (stringMode) ret = '';else ret = bufferShim.allocUnsafe(n);
-
-      var c = 0;
-      for (var i = 0, l = list.length; i < l && c < n; i++) {
-        var _buf = list[0];
-        var cpy = Math.min(n - c, _buf.length);
-
-        if (stringMode) ret += _buf.slice(0, cpy);else _buf.copy(ret, c, 0, cpy);
-
-        if (cpy < _buf.length) list[0] = _buf.slice(cpy);else list.shift();
-
-        c += cpy;
-      }
-    }
-  }
-
-  return ret;
-}
-
-function endReadable(stream) {
-  var state = stream._readableState;
-
-  // If we get here before consuming all the bytes, then that is a
-  // bug in node.  Should never happen.
-  if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
-
-  if (!state.endEmitted) {
-    state.ended = true;
-    processNextTick(endReadableNT, state, stream);
-  }
-}
-
-function endReadableNT(state, stream) {
-  // Check that we didn't get one last unshift.
-  if (!state.endEmitted && state.length === 0) {
-    state.endEmitted = true;
-    stream.readable = false;
-    stream.emit('end');
-  }
-}
-
-function forEach(xs, f) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    f(xs[i], i);
-  }
-}
-
-function indexOf(xs, x) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    if (xs[i] === x) return i;
-  }
-  return -1;
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_transform.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_transform.js
deleted file mode 100644
index dbc996ede62363a062917c897b13749b2501e871..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_transform.js
+++ /dev/null
@@ -1,180 +0,0 @@
-// a transform stream is a readable/writable stream where you do
-// something with the data.  Sometimes it's called a "filter",
-// but that's not a great name for it, since that implies a thing where
-// some bits pass through, and others are simply ignored.  (That would
-// be a valid example of a transform, of course.)
-//
-// While the output is causally related to the input, it's not a
-// necessarily symmetric or synchronous transformation.  For example,
-// a zlib stream might take multiple plain-text writes(), and then
-// emit a single compressed chunk some time in the future.
-//
-// Here's how this works:
-//
-// The Transform stream has all the aspects of the readable and writable
-// stream classes.  When you write(chunk), that calls _write(chunk,cb)
-// internally, and returns false if there's a lot of pending writes
-// buffered up.  When you call read(), that calls _read(n) until
-// there's enough pending readable data buffered up.
-//
-// In a transform stream, the written data is placed in a buffer.  When
-// _read(n) is called, it transforms the queued up data, calling the
-// buffered _write cb's as it consumes chunks.  If consuming a single
-// written chunk would result in multiple output chunks, then the first
-// outputted bit calls the readcb, and subsequent chunks just go into
-// the read buffer, and will cause it to emit 'readable' if necessary.
-//
-// This way, back-pressure is actually determined by the reading side,
-// since _read has to be called to start processing a new chunk.  However,
-// a pathological inflate type of transform can cause excessive buffering
-// here.  For example, imagine a stream where every byte of input is
-// interpreted as an integer from 0-255, and then results in that many
-// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
-// 1kb of data being output.  In this case, you could write a very small
-// amount of input, and end up with a very large amount of output.  In
-// such a pathological inflating mechanism, there'd be no way to tell
-// the system to stop doing the transform.  A single 4MB write could
-// cause the system to run out of memory.
-//
-// However, even in such a pathological case, only a single written chunk
-// would be consumed, and then the rest would wait (un-transformed) until
-// the results of the previous transformed chunk were consumed.
-
-'use strict';
-
-module.exports = Transform;
-
-var Duplex = require('./_stream_duplex');
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-util.inherits(Transform, Duplex);
-
-function TransformState(stream) {
-  this.afterTransform = function (er, data) {
-    return afterTransform(stream, er, data);
-  };
-
-  this.needTransform = false;
-  this.transforming = false;
-  this.writecb = null;
-  this.writechunk = null;
-  this.writeencoding = null;
-}
-
-function afterTransform(stream, er, data) {
-  var ts = stream._transformState;
-  ts.transforming = false;
-
-  var cb = ts.writecb;
-
-  if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));
-
-  ts.writechunk = null;
-  ts.writecb = null;
-
-  if (data !== null && data !== undefined) stream.push(data);
-
-  cb(er);
-
-  var rs = stream._readableState;
-  rs.reading = false;
-  if (rs.needReadable || rs.length < rs.highWaterMark) {
-    stream._read(rs.highWaterMark);
-  }
-}
-
-function Transform(options) {
-  if (!(this instanceof Transform)) return new Transform(options);
-
-  Duplex.call(this, options);
-
-  this._transformState = new TransformState(this);
-
-  // when the writable side finishes, then flush out anything remaining.
-  var stream = this;
-
-  // start out asking for a readable event once data is transformed.
-  this._readableState.needReadable = true;
-
-  // we have implemented the _read method, and done the other things
-  // that Readable wants before the first _read call, so unset the
-  // sync guard flag.
-  this._readableState.sync = false;
-
-  if (options) {
-    if (typeof options.transform === 'function') this._transform = options.transform;
-
-    if (typeof options.flush === 'function') this._flush = options.flush;
-  }
-
-  this.once('prefinish', function () {
-    if (typeof this._flush === 'function') this._flush(function (er) {
-      done(stream, er);
-    });else done(stream);
-  });
-}
-
-Transform.prototype.push = function (chunk, encoding) {
-  this._transformState.needTransform = false;
-  return Duplex.prototype.push.call(this, chunk, encoding);
-};
-
-// This is the part where you do stuff!
-// override this function in implementation classes.
-// 'chunk' is an input chunk.
-//
-// Call `push(newChunk)` to pass along transformed output
-// to the readable side.  You may call 'push' zero or more times.
-//
-// Call `cb(err)` when you are done with this chunk.  If you pass
-// an error, then that'll put the hurt on the whole operation.  If you
-// never call cb(), then you'll never get another chunk.
-Transform.prototype._transform = function (chunk, encoding, cb) {
-  throw new Error('Not implemented');
-};
-
-Transform.prototype._write = function (chunk, encoding, cb) {
-  var ts = this._transformState;
-  ts.writecb = cb;
-  ts.writechunk = chunk;
-  ts.writeencoding = encoding;
-  if (!ts.transforming) {
-    var rs = this._readableState;
-    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
-  }
-};
-
-// Doesn't matter what the args are here.
-// _transform does all the work.
-// That we got here means that the readable side wants more data.
-Transform.prototype._read = function (n) {
-  var ts = this._transformState;
-
-  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
-    ts.transforming = true;
-    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
-  } else {
-    // mark that we need a transform, so that any data that comes in
-    // will get processed, now that we've asked for it.
-    ts.needTransform = true;
-  }
-};
-
-function done(stream, er) {
-  if (er) return stream.emit('error', er);
-
-  // if there's nothing in the write buffer, then that means
-  // that nothing more will ever be provided
-  var ws = stream._writableState;
-  var ts = stream._transformState;
-
-  if (ws.length) throw new Error('Calling transform done when ws.length != 0');
-
-  if (ts.transforming) throw new Error('Calling transform done when still transforming');
-
-  return stream.push(null);
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_writable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_writable.js
deleted file mode 100644
index ed5efcbd203208af0aa0cb1ef0cc9d4c45f8bbf4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/lib/_stream_writable.js
+++ /dev/null
@@ -1,526 +0,0 @@
-// A bit simpler than readable streams.
-// Implement an async ._write(chunk, encoding, cb), and it'll handle all
-// the drain event emission and buffering.
-
-'use strict';
-
-module.exports = Writable;
-
-/*<replacement>*/
-var processNextTick = require('process-nextick-args');
-/*</replacement>*/
-
-/*<replacement>*/
-var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;
-/*</replacement>*/
-
-Writable.WritableState = WritableState;
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-/*<replacement>*/
-var internalUtil = {
-  deprecate: require('util-deprecate')
-};
-/*</replacement>*/
-
-/*<replacement>*/
-var Stream;
-(function () {
-  try {
-    Stream = require('st' + 'ream');
-  } catch (_) {} finally {
-    if (!Stream) Stream = require('events').EventEmitter;
-  }
-})();
-/*</replacement>*/
-
-var Buffer = require('buffer').Buffer;
-/*<replacement>*/
-var bufferShim = require('buffer-shims');
-/*</replacement>*/
-
-util.inherits(Writable, Stream);
-
-function nop() {}
-
-function WriteReq(chunk, encoding, cb) {
-  this.chunk = chunk;
-  this.encoding = encoding;
-  this.callback = cb;
-  this.next = null;
-}
-
-var Duplex;
-function WritableState(options, stream) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  options = options || {};
-
-  // object stream flag to indicate whether or not this stream
-  // contains buffers or objects.
-  this.objectMode = !!options.objectMode;
-
-  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
-
-  // the point at which write() starts returning false
-  // Note: 0 is a valid value, means that we always return false if
-  // the entire buffer is not flushed immediately on write()
-  var hwm = options.highWaterMark;
-  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
-  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
-
-  // cast to ints.
-  this.highWaterMark = ~ ~this.highWaterMark;
-
-  this.needDrain = false;
-  // at the start of calling end()
-  this.ending = false;
-  // when end() has been called, and returned
-  this.ended = false;
-  // when 'finish' is emitted
-  this.finished = false;
-
-  // should we decode strings into buffers before passing to _write?
-  // this is here so that some node-core streams can optimize string
-  // handling at a lower level.
-  var noDecode = options.decodeStrings === false;
-  this.decodeStrings = !noDecode;
-
-  // Crypto is kind of old and crusty.  Historically, its default string
-  // encoding is 'binary' so we have to make this configurable.
-  // Everything else in the universe uses 'utf8', though.
-  this.defaultEncoding = options.defaultEncoding || 'utf8';
-
-  // not an actual buffer we keep track of, but a measurement
-  // of how much we're waiting to get pushed to some underlying
-  // socket or file.
-  this.length = 0;
-
-  // a flag to see when we're in the middle of a write.
-  this.writing = false;
-
-  // when true all writes will be buffered until .uncork() call
-  this.corked = 0;
-
-  // a flag to be able to tell if the onwrite cb is called immediately,
-  // or on a later tick.  We set this to true at first, because any
-  // actions that shouldn't happen until "later" should generally also
-  // not happen before the first write call.
-  this.sync = true;
-
-  // a flag to know if we're processing previously buffered items, which
-  // may call the _write() callback in the same tick, so that we don't
-  // end up in an overlapped onwrite situation.
-  this.bufferProcessing = false;
-
-  // the callback that's passed to _write(chunk,cb)
-  this.onwrite = function (er) {
-    onwrite(stream, er);
-  };
-
-  // the callback that the user supplies to write(chunk,encoding,cb)
-  this.writecb = null;
-
-  // the amount that is being written when _write is called.
-  this.writelen = 0;
-
-  this.bufferedRequest = null;
-  this.lastBufferedRequest = null;
-
-  // number of pending user-supplied write callbacks
-  // this must be 0 before 'finish' can be emitted
-  this.pendingcb = 0;
-
-  // emit prefinish if the only thing we're waiting for is _write cbs
-  // This is relevant for synchronous Transform streams
-  this.prefinished = false;
-
-  // True if the error was already emitted and should not be thrown again
-  this.errorEmitted = false;
-
-  // count buffered requests
-  this.bufferedRequestCount = 0;
-
-  // allocate the first CorkedRequest, there is always
-  // one allocated and free to use, and we maintain at most two
-  this.corkedRequestsFree = new CorkedRequest(this);
-}
-
-WritableState.prototype.getBuffer = function writableStateGetBuffer() {
-  var current = this.bufferedRequest;
-  var out = [];
-  while (current) {
-    out.push(current);
-    current = current.next;
-  }
-  return out;
-};
-
-(function () {
-  try {
-    Object.defineProperty(WritableState.prototype, 'buffer', {
-      get: internalUtil.deprecate(function () {
-        return this.getBuffer();
-      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')
-    });
-  } catch (_) {}
-})();
-
-var Duplex;
-function Writable(options) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  // Writable ctor is applied to Duplexes, though they're not
-  // instanceof Writable, they're instanceof Readable.
-  if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options);
-
-  this._writableState = new WritableState(options, this);
-
-  // legacy.
-  this.writable = true;
-
-  if (options) {
-    if (typeof options.write === 'function') this._write = options.write;
-
-    if (typeof options.writev === 'function') this._writev = options.writev;
-  }
-
-  Stream.call(this);
-}
-
-// Otherwise people can pipe Writable streams, which is just wrong.
-Writable.prototype.pipe = function () {
-  this.emit('error', new Error('Cannot pipe, not readable'));
-};
-
-function writeAfterEnd(stream, cb) {
-  var er = new Error('write after end');
-  // TODO: defer error events consistently everywhere, not just the cb
-  stream.emit('error', er);
-  processNextTick(cb, er);
-}
-
-// If we get something that is not a buffer, string, null, or undefined,
-// and we're not in objectMode, then that's an error.
-// Otherwise stream chunks are all considered to be of length=1, and the
-// watermarks determine how many objects to keep in the buffer, rather than
-// how many bytes or characters.
-function validChunk(stream, state, chunk, cb) {
-  var valid = true;
-  var er = false;
-  // Always throw error if a null is written
-  // if we are not in object mode then throw
-  // if it is not a buffer, string, or undefined.
-  if (chunk === null) {
-    er = new TypeError('May not write null values to stream');
-  } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
-    er = new TypeError('Invalid non-string/buffer chunk');
-  }
-  if (er) {
-    stream.emit('error', er);
-    processNextTick(cb, er);
-    valid = false;
-  }
-  return valid;
-}
-
-Writable.prototype.write = function (chunk, encoding, cb) {
-  var state = this._writableState;
-  var ret = false;
-
-  if (typeof encoding === 'function') {
-    cb = encoding;
-    encoding = null;
-  }
-
-  if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
-
-  if (typeof cb !== 'function') cb = nop;
-
-  if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) {
-    state.pendingcb++;
-    ret = writeOrBuffer(this, state, chunk, encoding, cb);
-  }
-
-  return ret;
-};
-
-Writable.prototype.cork = function () {
-  var state = this._writableState;
-
-  state.corked++;
-};
-
-Writable.prototype.uncork = function () {
-  var state = this._writableState;
-
-  if (state.corked) {
-    state.corked--;
-
-    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
-  }
-};
-
-Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
-  // node::ParseEncoding() requires lower case.
-  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
-  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
-  this._writableState.defaultEncoding = encoding;
-  return this;
-};
-
-function decodeChunk(state, chunk, encoding) {
-  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
-    chunk = bufferShim.from(chunk, encoding);
-  }
-  return chunk;
-}
-
-// if we're already writing something, then just put this
-// in the queue, and wait our turn.  Otherwise, call _write
-// If we return false, then we need a drain event, so set that flag.
-function writeOrBuffer(stream, state, chunk, encoding, cb) {
-  chunk = decodeChunk(state, chunk, encoding);
-
-  if (Buffer.isBuffer(chunk)) encoding = 'buffer';
-  var len = state.objectMode ? 1 : chunk.length;
-
-  state.length += len;
-
-  var ret = state.length < state.highWaterMark;
-  // we must ensure that previous needDrain will not be reset to false.
-  if (!ret) state.needDrain = true;
-
-  if (state.writing || state.corked) {
-    var last = state.lastBufferedRequest;
-    state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);
-    if (last) {
-      last.next = state.lastBufferedRequest;
-    } else {
-      state.bufferedRequest = state.lastBufferedRequest;
-    }
-    state.bufferedRequestCount += 1;
-  } else {
-    doWrite(stream, state, false, len, chunk, encoding, cb);
-  }
-
-  return ret;
-}
-
-function doWrite(stream, state, writev, len, chunk, encoding, cb) {
-  state.writelen = len;
-  state.writecb = cb;
-  state.writing = true;
-  state.sync = true;
-  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
-  state.sync = false;
-}
-
-function onwriteError(stream, state, sync, er, cb) {
-  --state.pendingcb;
-  if (sync) processNextTick(cb, er);else cb(er);
-
-  stream._writableState.errorEmitted = true;
-  stream.emit('error', er);
-}
-
-function onwriteStateUpdate(state) {
-  state.writing = false;
-  state.writecb = null;
-  state.length -= state.writelen;
-  state.writelen = 0;
-}
-
-function onwrite(stream, er) {
-  var state = stream._writableState;
-  var sync = state.sync;
-  var cb = state.writecb;
-
-  onwriteStateUpdate(state);
-
-  if (er) onwriteError(stream, state, sync, er, cb);else {
-    // Check if we're actually ready to finish, but don't emit yet
-    var finished = needFinish(state);
-
-    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
-      clearBuffer(stream, state);
-    }
-
-    if (sync) {
-      /*<replacement>*/
-      asyncWrite(afterWrite, stream, state, finished, cb);
-      /*</replacement>*/
-    } else {
-        afterWrite(stream, state, finished, cb);
-      }
-  }
-}
-
-function afterWrite(stream, state, finished, cb) {
-  if (!finished) onwriteDrain(stream, state);
-  state.pendingcb--;
-  cb();
-  finishMaybe(stream, state);
-}
-
-// Must force callback to be called on nextTick, so that we don't
-// emit 'drain' before the write() consumer gets the 'false' return
-// value, and has a chance to attach a 'drain' listener.
-function onwriteDrain(stream, state) {
-  if (state.length === 0 && state.needDrain) {
-    state.needDrain = false;
-    stream.emit('drain');
-  }
-}
-
-// if there's something in the buffer waiting, then process it
-function clearBuffer(stream, state) {
-  state.bufferProcessing = true;
-  var entry = state.bufferedRequest;
-
-  if (stream._writev && entry && entry.next) {
-    // Fast case, write everything using _writev()
-    var l = state.bufferedRequestCount;
-    var buffer = new Array(l);
-    var holder = state.corkedRequestsFree;
-    holder.entry = entry;
-
-    var count = 0;
-    while (entry) {
-      buffer[count] = entry;
-      entry = entry.next;
-      count += 1;
-    }
-
-    doWrite(stream, state, true, state.length, buffer, '', holder.finish);
-
-    // doWrite is almost always async, defer these to save a bit of time
-    // as the hot path ends with doWrite
-    state.pendingcb++;
-    state.lastBufferedRequest = null;
-    if (holder.next) {
-      state.corkedRequestsFree = holder.next;
-      holder.next = null;
-    } else {
-      state.corkedRequestsFree = new CorkedRequest(state);
-    }
-  } else {
-    // Slow case, write chunks one-by-one
-    while (entry) {
-      var chunk = entry.chunk;
-      var encoding = entry.encoding;
-      var cb = entry.callback;
-      var len = state.objectMode ? 1 : chunk.length;
-
-      doWrite(stream, state, false, len, chunk, encoding, cb);
-      entry = entry.next;
-      // if we didn't call the onwrite immediately, then
-      // it means that we need to wait until it does.
-      // also, that means that the chunk and cb are currently
-      // being processed, so move the buffer counter past them.
-      if (state.writing) {
-        break;
-      }
-    }
-
-    if (entry === null) state.lastBufferedRequest = null;
-  }
-
-  state.bufferedRequestCount = 0;
-  state.bufferedRequest = entry;
-  state.bufferProcessing = false;
-}
-
-Writable.prototype._write = function (chunk, encoding, cb) {
-  cb(new Error('not implemented'));
-};
-
-Writable.prototype._writev = null;
-
-Writable.prototype.end = function (chunk, encoding, cb) {
-  var state = this._writableState;
-
-  if (typeof chunk === 'function') {
-    cb = chunk;
-    chunk = null;
-    encoding = null;
-  } else if (typeof encoding === 'function') {
-    cb = encoding;
-    encoding = null;
-  }
-
-  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
-
-  // .end() fully uncorks
-  if (state.corked) {
-    state.corked = 1;
-    this.uncork();
-  }
-
-  // ignore unnecessary end() calls.
-  if (!state.ending && !state.finished) endWritable(this, state, cb);
-};
-
-function needFinish(state) {
-  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
-}
-
-function prefinish(stream, state) {
-  if (!state.prefinished) {
-    state.prefinished = true;
-    stream.emit('prefinish');
-  }
-}
-
-function finishMaybe(stream, state) {
-  var need = needFinish(state);
-  if (need) {
-    if (state.pendingcb === 0) {
-      prefinish(stream, state);
-      state.finished = true;
-      stream.emit('finish');
-    } else {
-      prefinish(stream, state);
-    }
-  }
-  return need;
-}
-
-function endWritable(stream, state, cb) {
-  state.ending = true;
-  finishMaybe(stream, state);
-  if (cb) {
-    if (state.finished) processNextTick(cb);else stream.once('finish', cb);
-  }
-  state.ended = true;
-  stream.writable = false;
-}
-
-// It seems a linked list but it is not
-// there will be only 2 of these for each stream
-function CorkedRequest(state) {
-  var _this = this;
-
-  this.next = null;
-  this.entry = null;
-
-  this.finish = function (err) {
-    var entry = _this.entry;
-    _this.entry = null;
-    while (entry) {
-      var cb = entry.callback;
-      state.pendingcb--;
-      cb(err);
-      entry = entry.next;
-    }
-    if (state.corkedRequestsFree) {
-      state.corkedRequestsFree.next = _this;
-    } else {
-      state.corkedRequestsFree = _this;
-    }
-  };
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/index.js
deleted file mode 100644
index 1cab4c05e1ac2aee65e3985f162efb880c2ae439..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/index.js
+++ /dev/null
@@ -1,108 +0,0 @@
-'use strict';
-
-var buffer = require('buffer');
-var Buffer = buffer.Buffer;
-var SlowBuffer = buffer.SlowBuffer;
-var MAX_LEN = buffer.kMaxLength || 2147483647;
-exports.alloc = function alloc(size, fill, encoding) {
-  if (typeof Buffer.alloc === 'function') {
-    return Buffer.alloc(size, fill, encoding);
-  }
-  if (typeof encoding === 'number') {
-    throw new TypeError('encoding must not be number');
-  }
-  if (typeof size !== 'number') {
-    throw new TypeError('size must be a number');
-  }
-  if (size > MAX_LEN) {
-    throw new RangeError('size is too large');
-  }
-  var enc = encoding;
-  var _fill = fill;
-  if (_fill === undefined) {
-    enc = undefined;
-    _fill = 0;
-  }
-  var buf = new Buffer(size);
-  if (typeof _fill === 'string') {
-    var fillBuf = new Buffer(_fill, enc);
-    var flen = fillBuf.length;
-    var i = -1;
-    while (++i < size) {
-      buf[i] = fillBuf[i % flen];
-    }
-  } else {
-    buf.fill(_fill);
-  }
-  return buf;
-}
-exports.allocUnsafe = function allocUnsafe(size) {
-  if (typeof Buffer.allocUnsafe === 'function') {
-    return Buffer.allocUnsafe(size);
-  }
-  if (typeof size !== 'number') {
-    throw new TypeError('size must be a number');
-  }
-  if (size > MAX_LEN) {
-    throw new RangeError('size is too large');
-  }
-  return new Buffer(size);
-}
-exports.from = function from(value, encodingOrOffset, length) {
-  if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) {
-    return Buffer.from(value, encodingOrOffset, length);
-  }
-  if (typeof value === 'number') {
-    throw new TypeError('"value" argument must not be a number');
-  }
-  if (typeof value === 'string') {
-    return new Buffer(value, encodingOrOffset);
-  }
-  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
-    var offset = encodingOrOffset;
-    if (arguments.length === 1) {
-      return new Buffer(value);
-    }
-    if (typeof offset === 'undefined') {
-      offset = 0;
-    }
-    var len = length;
-    if (typeof len === 'undefined') {
-      len = value.byteLength - offset;
-    }
-    if (offset >= value.byteLength) {
-      throw new RangeError('\'offset\' is out of bounds');
-    }
-    if (len > value.byteLength - offset) {
-      throw new RangeError('\'length\' is out of bounds');
-    }
-    return new Buffer(value.slice(offset, offset + len));
-  }
-  if (Buffer.isBuffer(value)) {
-    var out = new Buffer(value.length);
-    value.copy(out, 0, 0, value.length);
-    return out;
-  }
-  if (value) {
-    if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) {
-      return new Buffer(value);
-    }
-    if (value.type === 'Buffer' && Array.isArray(value.data)) {
-      return new Buffer(value.data);
-    }
-  }
-
-  throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.');
-}
-exports.allocUnsafeSlow = function allocUnsafeSlow(size) {
-  if (typeof Buffer.allocUnsafeSlow === 'function') {
-    return Buffer.allocUnsafeSlow(size);
-  }
-  if (typeof size !== 'number') {
-    throw new TypeError('size must be a number');
-  }
-  if (size >= MAX_LEN) {
-    throw new RangeError('size is too large');
-  }
-  return new SlowBuffer(size);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/license.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/license.md
deleted file mode 100644
index 01cfaefe2fcaff52c01ea4a5898de7c9fbdf73d0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/license.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (c) 2016 Calvin Metcalf
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.**
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/package.json
deleted file mode 100644
index ea93df59c538fef2d90a47c53496f3225c2eb588..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/package.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "_from": "buffer-shims@>=1.0.0 <2.0.0",
-  "_id": "buffer-shims@1.0.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream/buffer-shims",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
-  "_shasum": "9978ce317388c649ad8793028c3477ef044a8b51",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/calvinmetcalf/buffer-shims/issues"
-  },
-  "dependencies": {},
-  "description": "some shims for node buffers",
-  "devDependencies": {
-    "tape": "^4.5.1"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/calvinmetcalf/buffer-shims#readme",
-  "license": "MIT",
-  "main": "index.js",
-  "name": "buffer-shims",
-  "optionalDependencies": {},
-  "readme": "buffer-shims\n===\n\nfunctions to make sure the new buffer methods work in older browsers.\n\n```js\nvar bufferShim = require('buffer-shims');\nbufferShim.from('foo');\nbufferShim.alloc(9, 'cafeface', 'hex');\nbufferShim.allocUnsafe(15);\nbufferShim.allocUnsafeSlow(21);\n```\n\nshould just use the original  in newer nodes and on older nodes uses fallbacks.\n\nKnown Issues\n===\n- this does not patch the buffer object, only the constructor stuff\n- it's actually a polyfill\n\n![](https://i.imgur.com/zxII3jJ.gif)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+ssh://git@github.com/calvinmetcalf/buffer-shims.git"
-  },
-  "scripts": {
-    "test": "tape test/*.js"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/readme.md
deleted file mode 100644
index 7ea6475e284e8eddd5c7ffff5757b3d05061c586..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/buffer-shims/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-buffer-shims
-===
-
-functions to make sure the new buffer methods work in older browsers.
-
-```js
-var bufferShim = require('buffer-shims');
-bufferShim.from('foo');
-bufferShim.alloc(9, 'cafeface', 'hex');
-bufferShim.allocUnsafe(15);
-bufferShim.allocUnsafeSlow(21);
-```
-
-should just use the original  in newer nodes and on older nodes uses fallbacks.
-
-Known Issues
-===
-- this does not patch the buffer object, only the constructor stuff
-- it's actually a polyfill
-
-![](https://i.imgur.com/zxII3jJ.gif)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/LICENSE
deleted file mode 100644
index d8d7f9437dbf5ad54701a187f05988bcf0006fd8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright Node.js contributors. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/README.md
deleted file mode 100644
index 5a76b4149c5eb5077c09578e349820bccbbd266e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# core-util-is
-
-The `util.is*` functions introduced in Node v0.12.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/float.patch b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/float.patch
deleted file mode 100644
index a06d5c05f75fd5617f8849b43a88e0e3d8d824e9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/float.patch
+++ /dev/null
@@ -1,604 +0,0 @@
-diff --git a/lib/util.js b/lib/util.js
-index a03e874..9074e8e 100644
---- a/lib/util.js
-+++ b/lib/util.js
-@@ -19,430 +19,6 @@
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
-
--var formatRegExp = /%[sdj%]/g;
--exports.format = function(f) {
--  if (!isString(f)) {
--    var objects = [];
--    for (var i = 0; i < arguments.length; i++) {
--      objects.push(inspect(arguments[i]));
--    }
--    return objects.join(' ');
--  }
--
--  var i = 1;
--  var args = arguments;
--  var len = args.length;
--  var str = String(f).replace(formatRegExp, function(x) {
--    if (x === '%%') return '%';
--    if (i >= len) return x;
--    switch (x) {
--      case '%s': return String(args[i++]);
--      case '%d': return Number(args[i++]);
--      case '%j':
--        try {
--          return JSON.stringify(args[i++]);
--        } catch (_) {
--          return '[Circular]';
--        }
--      default:
--        return x;
--    }
--  });
--  for (var x = args[i]; i < len; x = args[++i]) {
--    if (isNull(x) || !isObject(x)) {
--      str += ' ' + x;
--    } else {
--      str += ' ' + inspect(x);
--    }
--  }
--  return str;
--};
--
--
--// Mark that a method should not be used.
--// Returns a modified function which warns once by default.
--// If --no-deprecation is set, then it is a no-op.
--exports.deprecate = function(fn, msg) {
--  // Allow for deprecating things in the process of starting up.
--  if (isUndefined(global.process)) {
--    return function() {
--      return exports.deprecate(fn, msg).apply(this, arguments);
--    };
--  }
--
--  if (process.noDeprecation === true) {
--    return fn;
--  }
--
--  var warned = false;
--  function deprecated() {
--    if (!warned) {
--      if (process.throwDeprecation) {
--        throw new Error(msg);
--      } else if (process.traceDeprecation) {
--        console.trace(msg);
--      } else {
--        console.error(msg);
--      }
--      warned = true;
--    }
--    return fn.apply(this, arguments);
--  }
--
--  return deprecated;
--};
--
--
--var debugs = {};
--var debugEnviron;
--exports.debuglog = function(set) {
--  if (isUndefined(debugEnviron))
--    debugEnviron = process.env.NODE_DEBUG || '';
--  set = set.toUpperCase();
--  if (!debugs[set]) {
--    if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
--      var pid = process.pid;
--      debugs[set] = function() {
--        var msg = exports.format.apply(exports, arguments);
--        console.error('%s %d: %s', set, pid, msg);
--      };
--    } else {
--      debugs[set] = function() {};
--    }
--  }
--  return debugs[set];
--};
--
--
--/**
-- * Echos the value of a value. Trys to print the value out
-- * in the best way possible given the different types.
-- *
-- * @param {Object} obj The object to print out.
-- * @param {Object} opts Optional options object that alters the output.
-- */
--/* legacy: obj, showHidden, depth, colors*/
--function inspect(obj, opts) {
--  // default options
--  var ctx = {
--    seen: [],
--    stylize: stylizeNoColor
--  };
--  // legacy...
--  if (arguments.length >= 3) ctx.depth = arguments[2];
--  if (arguments.length >= 4) ctx.colors = arguments[3];
--  if (isBoolean(opts)) {
--    // legacy...
--    ctx.showHidden = opts;
--  } else if (opts) {
--    // got an "options" object
--    exports._extend(ctx, opts);
--  }
--  // set default options
--  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
--  if (isUndefined(ctx.depth)) ctx.depth = 2;
--  if (isUndefined(ctx.colors)) ctx.colors = false;
--  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
--  if (ctx.colors) ctx.stylize = stylizeWithColor;
--  return formatValue(ctx, obj, ctx.depth);
--}
--exports.inspect = inspect;
--
--
--// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
--inspect.colors = {
--  'bold' : [1, 22],
--  'italic' : [3, 23],
--  'underline' : [4, 24],
--  'inverse' : [7, 27],
--  'white' : [37, 39],
--  'grey' : [90, 39],
--  'black' : [30, 39],
--  'blue' : [34, 39],
--  'cyan' : [36, 39],
--  'green' : [32, 39],
--  'magenta' : [35, 39],
--  'red' : [31, 39],
--  'yellow' : [33, 39]
--};
--
--// Don't use 'blue' not visible on cmd.exe
--inspect.styles = {
--  'special': 'cyan',
--  'number': 'yellow',
--  'boolean': 'yellow',
--  'undefined': 'grey',
--  'null': 'bold',
--  'string': 'green',
--  'date': 'magenta',
--  // "name": intentionally not styling
--  'regexp': 'red'
--};
--
--
--function stylizeWithColor(str, styleType) {
--  var style = inspect.styles[styleType];
--
--  if (style) {
--    return '\u001b[' + inspect.colors[style][0] + 'm' + str +
--           '\u001b[' + inspect.colors[style][1] + 'm';
--  } else {
--    return str;
--  }
--}
--
--
--function stylizeNoColor(str, styleType) {
--  return str;
--}
--
--
--function arrayToHash(array) {
--  var hash = {};
--
--  array.forEach(function(val, idx) {
--    hash[val] = true;
--  });
--
--  return hash;
--}
--
--
--function formatValue(ctx, value, recurseTimes) {
--  // Provide a hook for user-specified inspect functions.
--  // Check that value is an object with an inspect function on it
--  if (ctx.customInspect &&
--      value &&
--      isFunction(value.inspect) &&
--      // Filter out the util module, it's inspect function is special
--      value.inspect !== exports.inspect &&
--      // Also filter out any prototype objects using the circular check.
--      !(value.constructor && value.constructor.prototype === value)) {
--    var ret = value.inspect(recurseTimes, ctx);
--    if (!isString(ret)) {
--      ret = formatValue(ctx, ret, recurseTimes);
--    }
--    return ret;
--  }
--
--  // Primitive types cannot have properties
--  var primitive = formatPrimitive(ctx, value);
--  if (primitive) {
--    return primitive;
--  }
--
--  // Look up the keys of the object.
--  var keys = Object.keys(value);
--  var visibleKeys = arrayToHash(keys);
--
--  if (ctx.showHidden) {
--    keys = Object.getOwnPropertyNames(value);
--  }
--
--  // Some type of object without properties can be shortcutted.
--  if (keys.length === 0) {
--    if (isFunction(value)) {
--      var name = value.name ? ': ' + value.name : '';
--      return ctx.stylize('[Function' + name + ']', 'special');
--    }
--    if (isRegExp(value)) {
--      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
--    }
--    if (isDate(value)) {
--      return ctx.stylize(Date.prototype.toString.call(value), 'date');
--    }
--    if (isError(value)) {
--      return formatError(value);
--    }
--  }
--
--  var base = '', array = false, braces = ['{', '}'];
--
--  // Make Array say that they are Array
--  if (isArray(value)) {
--    array = true;
--    braces = ['[', ']'];
--  }
--
--  // Make functions say that they are functions
--  if (isFunction(value)) {
--    var n = value.name ? ': ' + value.name : '';
--    base = ' [Function' + n + ']';
--  }
--
--  // Make RegExps say that they are RegExps
--  if (isRegExp(value)) {
--    base = ' ' + RegExp.prototype.toString.call(value);
--  }
--
--  // Make dates with properties first say the date
--  if (isDate(value)) {
--    base = ' ' + Date.prototype.toUTCString.call(value);
--  }
--
--  // Make error with message first say the error
--  if (isError(value)) {
--    base = ' ' + formatError(value);
--  }
--
--  if (keys.length === 0 && (!array || value.length == 0)) {
--    return braces[0] + base + braces[1];
--  }
--
--  if (recurseTimes < 0) {
--    if (isRegExp(value)) {
--      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
--    } else {
--      return ctx.stylize('[Object]', 'special');
--    }
--  }
--
--  ctx.seen.push(value);
--
--  var output;
--  if (array) {
--    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
--  } else {
--    output = keys.map(function(key) {
--      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
--    });
--  }
--
--  ctx.seen.pop();
--
--  return reduceToSingleString(output, base, braces);
--}
--
--
--function formatPrimitive(ctx, value) {
--  if (isUndefined(value))
--    return ctx.stylize('undefined', 'undefined');
--  if (isString(value)) {
--    var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
--                                             .replace(/'/g, "\\'")
--                                             .replace(/\\"/g, '"') + '\'';
--    return ctx.stylize(simple, 'string');
--  }
--  if (isNumber(value)) {
--    // Format -0 as '-0'. Strict equality won't distinguish 0 from -0,
--    // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 .
--    if (value === 0 && 1 / value < 0)
--      return ctx.stylize('-0', 'number');
--    return ctx.stylize('' + value, 'number');
--  }
--  if (isBoolean(value))
--    return ctx.stylize('' + value, 'boolean');
--  // For some reason typeof null is "object", so special case here.
--  if (isNull(value))
--    return ctx.stylize('null', 'null');
--}
--
--
--function formatError(value) {
--  return '[' + Error.prototype.toString.call(value) + ']';
--}
--
--
--function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
--  var output = [];
--  for (var i = 0, l = value.length; i < l; ++i) {
--    if (hasOwnProperty(value, String(i))) {
--      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
--          String(i), true));
--    } else {
--      output.push('');
--    }
--  }
--  keys.forEach(function(key) {
--    if (!key.match(/^\d+$/)) {
--      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
--          key, true));
--    }
--  });
--  return output;
--}
--
--
--function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
--  var name, str, desc;
--  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
--  if (desc.get) {
--    if (desc.set) {
--      str = ctx.stylize('[Getter/Setter]', 'special');
--    } else {
--      str = ctx.stylize('[Getter]', 'special');
--    }
--  } else {
--    if (desc.set) {
--      str = ctx.stylize('[Setter]', 'special');
--    }
--  }
--  if (!hasOwnProperty(visibleKeys, key)) {
--    name = '[' + key + ']';
--  }
--  if (!str) {
--    if (ctx.seen.indexOf(desc.value) < 0) {
--      if (isNull(recurseTimes)) {
--        str = formatValue(ctx, desc.value, null);
--      } else {
--        str = formatValue(ctx, desc.value, recurseTimes - 1);
--      }
--      if (str.indexOf('\n') > -1) {
--        if (array) {
--          str = str.split('\n').map(function(line) {
--            return '  ' + line;
--          }).join('\n').substr(2);
--        } else {
--          str = '\n' + str.split('\n').map(function(line) {
--            return '   ' + line;
--          }).join('\n');
--        }
--      }
--    } else {
--      str = ctx.stylize('[Circular]', 'special');
--    }
--  }
--  if (isUndefined(name)) {
--    if (array && key.match(/^\d+$/)) {
--      return str;
--    }
--    name = JSON.stringify('' + key);
--    if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
--      name = name.substr(1, name.length - 2);
--      name = ctx.stylize(name, 'name');
--    } else {
--      name = name.replace(/'/g, "\\'")
--                 .replace(/\\"/g, '"')
--                 .replace(/(^"|"$)/g, "'");
--      name = ctx.stylize(name, 'string');
--    }
--  }
--
--  return name + ': ' + str;
--}
--
--
--function reduceToSingleString(output, base, braces) {
--  var numLinesEst = 0;
--  var length = output.reduce(function(prev, cur) {
--    numLinesEst++;
--    if (cur.indexOf('\n') >= 0) numLinesEst++;
--    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
--  }, 0);
--
--  if (length > 60) {
--    return braces[0] +
--           (base === '' ? '' : base + '\n ') +
--           ' ' +
--           output.join(',\n  ') +
--           ' ' +
--           braces[1];
--  }
--
--  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
--}
--
--
- // NOTE: These type checking functions intentionally don't use `instanceof`
- // because it is fragile and can be easily faked with `Object.create()`.
- function isArray(ar) {
-@@ -522,166 +98,10 @@ function isPrimitive(arg) {
- exports.isPrimitive = isPrimitive;
-
- function isBuffer(arg) {
--  return arg instanceof Buffer;
-+  return Buffer.isBuffer(arg);
- }
- exports.isBuffer = isBuffer;
-
- function objectToString(o) {
-   return Object.prototype.toString.call(o);
--}
--
--
--function pad(n) {
--  return n < 10 ? '0' + n.toString(10) : n.toString(10);
--}
--
--
--var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
--              'Oct', 'Nov', 'Dec'];
--
--// 26 Feb 16:19:34
--function timestamp() {
--  var d = new Date();
--  var time = [pad(d.getHours()),
--              pad(d.getMinutes()),
--              pad(d.getSeconds())].join(':');
--  return [d.getDate(), months[d.getMonth()], time].join(' ');
--}
--
--
--// log is just a thin wrapper to console.log that prepends a timestamp
--exports.log = function() {
--  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
--};
--
--
--/**
-- * Inherit the prototype methods from one constructor into another.
-- *
-- * The Function.prototype.inherits from lang.js rewritten as a standalone
-- * function (not on Function.prototype). NOTE: If this file is to be loaded
-- * during bootstrapping this function needs to be rewritten using some native
-- * functions as prototype setup using normal JavaScript does not work as
-- * expected during bootstrapping (see mirror.js in r114903).
-- *
-- * @param {function} ctor Constructor function which needs to inherit the
-- *     prototype.
-- * @param {function} superCtor Constructor function to inherit prototype from.
-- */
--exports.inherits = function(ctor, superCtor) {
--  ctor.super_ = superCtor;
--  ctor.prototype = Object.create(superCtor.prototype, {
--    constructor: {
--      value: ctor,
--      enumerable: false,
--      writable: true,
--      configurable: true
--    }
--  });
--};
--
--exports._extend = function(origin, add) {
--  // Don't do anything if add isn't an object
--  if (!add || !isObject(add)) return origin;
--
--  var keys = Object.keys(add);
--  var i = keys.length;
--  while (i--) {
--    origin[keys[i]] = add[keys[i]];
--  }
--  return origin;
--};
--
--function hasOwnProperty(obj, prop) {
--  return Object.prototype.hasOwnProperty.call(obj, prop);
--}
--
--
--// Deprecated old stuff.
--
--exports.p = exports.deprecate(function() {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    console.error(exports.inspect(arguments[i]));
--  }
--}, 'util.p: Use console.error() instead');
--
--
--exports.exec = exports.deprecate(function() {
--  return require('child_process').exec.apply(this, arguments);
--}, 'util.exec is now called `child_process.exec`.');
--
--
--exports.print = exports.deprecate(function() {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    process.stdout.write(String(arguments[i]));
--  }
--}, 'util.print: Use console.log instead');
--
--
--exports.puts = exports.deprecate(function() {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    process.stdout.write(arguments[i] + '\n');
--  }
--}, 'util.puts: Use console.log instead');
--
--
--exports.debug = exports.deprecate(function(x) {
--  process.stderr.write('DEBUG: ' + x + '\n');
--}, 'util.debug: Use console.error instead');
--
--
--exports.error = exports.deprecate(function(x) {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    process.stderr.write(arguments[i] + '\n');
--  }
--}, 'util.error: Use console.error instead');
--
--
--exports.pump = exports.deprecate(function(readStream, writeStream, callback) {
--  var callbackCalled = false;
--
--  function call(a, b, c) {
--    if (callback && !callbackCalled) {
--      callback(a, b, c);
--      callbackCalled = true;
--    }
--  }
--
--  readStream.addListener('data', function(chunk) {
--    if (writeStream.write(chunk) === false) readStream.pause();
--  });
--
--  writeStream.addListener('drain', function() {
--    readStream.resume();
--  });
--
--  readStream.addListener('end', function() {
--    writeStream.end();
--  });
--
--  readStream.addListener('close', function() {
--    call();
--  });
--
--  readStream.addListener('error', function(err) {
--    writeStream.end();
--    call(err);
--  });
--
--  writeStream.addListener('error', function(err) {
--    readStream.destroy();
--    call(err);
--  });
--}, 'util.pump(): Use readableStream.pipe() instead');
--
--
--var uv;
--exports._errnoException = function(err, syscall) {
--  if (isUndefined(uv)) uv = process.binding('uv');
--  var errname = uv.errname(err);
--  var e = new Error(syscall + ' ' + errname);
--  e.code = errname;
--  e.errno = errname;
--  e.syscall = syscall;
--  return e;
--};
-+}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/lib/util.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/lib/util.js
deleted file mode 100644
index ff4c851c075a2f0fd1654419178eceb22a836100..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/lib/util.js
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// NOTE: These type checking functions intentionally don't use `instanceof`
-// because it is fragile and can be easily faked with `Object.create()`.
-
-function isArray(arg) {
-  if (Array.isArray) {
-    return Array.isArray(arg);
-  }
-  return objectToString(arg) === '[object Array]';
-}
-exports.isArray = isArray;
-
-function isBoolean(arg) {
-  return typeof arg === 'boolean';
-}
-exports.isBoolean = isBoolean;
-
-function isNull(arg) {
-  return arg === null;
-}
-exports.isNull = isNull;
-
-function isNullOrUndefined(arg) {
-  return arg == null;
-}
-exports.isNullOrUndefined = isNullOrUndefined;
-
-function isNumber(arg) {
-  return typeof arg === 'number';
-}
-exports.isNumber = isNumber;
-
-function isString(arg) {
-  return typeof arg === 'string';
-}
-exports.isString = isString;
-
-function isSymbol(arg) {
-  return typeof arg === 'symbol';
-}
-exports.isSymbol = isSymbol;
-
-function isUndefined(arg) {
-  return arg === void 0;
-}
-exports.isUndefined = isUndefined;
-
-function isRegExp(re) {
-  return objectToString(re) === '[object RegExp]';
-}
-exports.isRegExp = isRegExp;
-
-function isObject(arg) {
-  return typeof arg === 'object' && arg !== null;
-}
-exports.isObject = isObject;
-
-function isDate(d) {
-  return objectToString(d) === '[object Date]';
-}
-exports.isDate = isDate;
-
-function isError(e) {
-  return (objectToString(e) === '[object Error]' || e instanceof Error);
-}
-exports.isError = isError;
-
-function isFunction(arg) {
-  return typeof arg === 'function';
-}
-exports.isFunction = isFunction;
-
-function isPrimitive(arg) {
-  return arg === null ||
-         typeof arg === 'boolean' ||
-         typeof arg === 'number' ||
-         typeof arg === 'string' ||
-         typeof arg === 'symbol' ||  // ES6 symbol
-         typeof arg === 'undefined';
-}
-exports.isPrimitive = isPrimitive;
-
-exports.isBuffer = Buffer.isBuffer;
-
-function objectToString(o) {
-  return Object.prototype.toString.call(o);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/package.json
deleted file mode 100644
index bb37707bcc7217274dabb59da7e464545c8af926..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/package.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-  "_from": "core-util-is@>=1.0.0 <1.1.0",
-  "_id": "core-util-is@1.0.2",
-  "_location": "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream/core-util-is",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-  "_shasum": "b5fd54220aa2bc5ab57aab7140c940754503c1a7",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/core-util-is/issues"
-  },
-  "dependencies": {},
-  "description": "The `util.is*` functions introduced in Node v0.12.",
-  "devDependencies": {
-    "tap": "^2.3.0"
-  },
-  "homepage": "https://github.com/isaacs/core-util-is#readme",
-  "keywords": [
-    "isArray",
-    "isBuffer",
-    "isNumber",
-    "isRegExp",
-    "isString",
-    "isThat",
-    "isThis",
-    "polyfill",
-    "util"
-  ],
-  "license": "MIT",
-  "main": "lib/util.js",
-  "name": "core-util-is",
-  "optionalDependencies": {},
-  "readme": "# core-util-is\n\nThe `util.is*` functions introduced in Node v0.12.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/core-util-is.git"
-  },
-  "scripts": {
-    "test": "tap test.js"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/test.js
deleted file mode 100644
index 1a490c65ac8b5df16357c0e90de3825e150d1164..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/core-util-is/test.js
+++ /dev/null
@@ -1,68 +0,0 @@
-var assert = require('tap');
-
-var t = require('./lib/util');
-
-assert.equal(t.isArray([]), true);
-assert.equal(t.isArray({}), false);
-
-assert.equal(t.isBoolean(null), false);
-assert.equal(t.isBoolean(true), true);
-assert.equal(t.isBoolean(false), true);
-
-assert.equal(t.isNull(null), true);
-assert.equal(t.isNull(undefined), false);
-assert.equal(t.isNull(false), false);
-assert.equal(t.isNull(), false);
-
-assert.equal(t.isNullOrUndefined(null), true);
-assert.equal(t.isNullOrUndefined(undefined), true);
-assert.equal(t.isNullOrUndefined(false), false);
-assert.equal(t.isNullOrUndefined(), true);
-
-assert.equal(t.isNumber(null), false);
-assert.equal(t.isNumber('1'), false);
-assert.equal(t.isNumber(1), true);
-
-assert.equal(t.isString(null), false);
-assert.equal(t.isString('1'), true);
-assert.equal(t.isString(1), false);
-
-assert.equal(t.isSymbol(null), false);
-assert.equal(t.isSymbol('1'), false);
-assert.equal(t.isSymbol(1), false);
-assert.equal(t.isSymbol(Symbol()), true);
-
-assert.equal(t.isUndefined(null), false);
-assert.equal(t.isUndefined(undefined), true);
-assert.equal(t.isUndefined(false), false);
-assert.equal(t.isUndefined(), true);
-
-assert.equal(t.isRegExp(null), false);
-assert.equal(t.isRegExp('1'), false);
-assert.equal(t.isRegExp(new RegExp()), true);
-
-assert.equal(t.isObject({}), true);
-assert.equal(t.isObject([]), true);
-assert.equal(t.isObject(new RegExp()), true);
-assert.equal(t.isObject(new Date()), true);
-
-assert.equal(t.isDate(null), false);
-assert.equal(t.isDate('1'), false);
-assert.equal(t.isDate(new Date()), true);
-
-assert.equal(t.isError(null), false);
-assert.equal(t.isError({ err: true }), false);
-assert.equal(t.isError(new Error()), true);
-
-assert.equal(t.isFunction(null), false);
-assert.equal(t.isFunction({ }), false);
-assert.equal(t.isFunction(function() {}), true);
-
-assert.equal(t.isPrimitive(null), true);
-assert.equal(t.isPrimitive(''), true);
-assert.equal(t.isPrimitive(0), true);
-assert.equal(t.isPrimitive(new Date()), false);
-
-assert.equal(t.isBuffer(null), false);
-assert.equal(t.isBuffer({}), false);
-assert.equal(t.isBuffer(new Buffer(0)), true);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/LICENSE
deleted file mode 100644
index dea3013d6710ee273f49ac606a65d5211d480c88..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/LICENSE
+++ /dev/null
@@ -1,16 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/README.md
deleted file mode 100644
index b1c56658557b8162aa9f5ba8610ed03a5e558d9d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-Browser-friendly inheritance fully compatible with standard node.js
-[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
-
-This package exports standard `inherits` from node.js `util` module in
-node environment, but also provides alternative browser-friendly
-implementation through [browser
-field](https://gist.github.com/shtylman/4339901). Alternative
-implementation is a literal copy of standard one located in standalone
-module to avoid requiring of `util`. It also has a shim for old
-browsers with no `Object.create` support.
-
-While keeping you sure you are using standard `inherits`
-implementation in node.js environment, it allows bundlers such as
-[browserify](https://github.com/substack/node-browserify) to not
-include full `util` package to your client code if all you need is
-just `inherits` function. It worth, because browser shim for `util`
-package is large and `inherits` is often the single function you need
-from it.
-
-It's recommended to use this package instead of
-`require('util').inherits` for any code that has chances to be used
-not only in node.js but in browser too.
-
-## usage
-
-```js
-var inherits = require('inherits');
-// then use exactly as the standard one
-```
-
-## note on version ~1.0
-
-Version ~1.0 had completely different motivation and is not compatible
-neither with 2.0 nor with standard node.js `inherits`.
-
-If you are using version ~1.0 and planning to switch to ~2.0, be
-careful:
-
-* new version uses `super_` instead of `super` for referencing
-  superclass
-* new version overwrites current prototype while old one preserves any
-  existing fields on it
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/inherits.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/inherits.js
deleted file mode 100644
index 29f5e24f57b5aacb9f199dea05a57fcbf4918bc1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/inherits.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('util').inherits
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/inherits_browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/inherits_browser.js
deleted file mode 100644
index c1e78a75e6b52b7434e7e8aa0d64d8abd593763b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/inherits_browser.js
+++ /dev/null
@@ -1,23 +0,0 @@
-if (typeof Object.create === 'function') {
-  // implementation from standard node.js 'util' module
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    ctor.prototype = Object.create(superCtor.prototype, {
-      constructor: {
-        value: ctor,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-  };
-} else {
-  // old school shim for old browsers
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    var TempCtor = function () {}
-    TempCtor.prototype = superCtor.prototype
-    ctor.prototype = new TempCtor()
-    ctor.prototype.constructor = ctor
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/package.json
deleted file mode 100644
index ccb0b1bd57f4d9c6a56fe28c55fde9ba5b0941b9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "_from": "inherits@>=2.0.1 <2.1.0",
-  "_id": "inherits@2.0.1",
-  "_location": "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream/inherits",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-  "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1",
-  "_shrinkwrap": null,
-  "browser": "./inherits_browser.js",
-  "bugs": {
-    "url": "https://github.com/isaacs/inherits/issues"
-  },
-  "dependencies": {},
-  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
-  "devDependencies": {},
-  "homepage": "https://github.com/isaacs/inherits#readme",
-  "keywords": [
-    "browser",
-    "browserify",
-    "class",
-    "inheritance",
-    "inherits",
-    "klass",
-    "object-oriented",
-    "oop"
-  ],
-  "license": "ISC",
-  "main": "./inherits.js",
-  "name": "inherits",
-  "optionalDependencies": {},
-  "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n  superclass\n* new version overwrites current prototype while old one preserves any\n  existing fields on it\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/inherits.git"
-  },
-  "scripts": {
-    "test": "node test"
-  },
-  "version": "2.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/test.js
deleted file mode 100644
index fc53012d31c0cde4f4bca408e7470e35a06f88fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/inherits/test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var inherits = require('./inherits.js')
-var assert = require('assert')
-
-function test(c) {
-  assert(c.constructor === Child)
-  assert(c.constructor.super_ === Parent)
-  assert(Object.getPrototypeOf(c) === Child.prototype)
-  assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype)
-  assert(c instanceof Child)
-  assert(c instanceof Parent)
-}
-
-function Child() {
-  Parent.call(this)
-  test(this)
-}
-
-function Parent() {}
-
-inherits(Child, Parent)
-
-var c = new Child
-test(c)
-
-console.log('ok')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/.npmignore
deleted file mode 100644
index 3c3629e647f5ddf82548912e337bea9826b434af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/.travis.yml
deleted file mode 100644
index cc4dba29d959a2da7b97f9edd3c7c91384b2ee5b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/Makefile b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/Makefile
deleted file mode 100644
index 787d56e1e982e48588bc199f36f0d50cb4724066..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-
-test:
-	@node_modules/.bin/tape test.js
-
-.PHONY: test
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/README.md
deleted file mode 100644
index 16d2c59c6195f9a1ac9af37cb9d75f1a6b85ab01..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/README.md
+++ /dev/null
@@ -1,60 +0,0 @@
-
-# isarray
-
-`Array#isArray` for older browsers.
-
-[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray)
-[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray)
-
-[![browser support](https://ci.testling.com/juliangruber/isarray.png)
-](https://ci.testling.com/juliangruber/isarray)
-
-## Usage
-
-```js
-var isArray = require('isarray');
-
-console.log(isArray([])); // => true
-console.log(isArray({})); // => false
-```
-
-## Installation
-
-With [npm](http://npmjs.org) do
-
-```bash
-$ npm install isarray
-```
-
-Then bundle for the browser with
-[browserify](https://github.com/substack/browserify).
-
-With [component](http://component.io) do
-
-```bash
-$ component install juliangruber/isarray
-```
-
-## License
-
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/component.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/component.json
deleted file mode 100644
index 9e31b6838890159e397063bdd2ea7de80b4e4a42..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/component.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name" : "isarray",
-  "description" : "Array#isArray for older browsers",
-  "version" : "0.0.1",
-  "repository" : "juliangruber/isarray",
-  "homepage": "https://github.com/juliangruber/isarray",
-  "main" : "index.js",
-  "scripts" : [
-    "index.js"
-  ],
-  "dependencies" : {},
-  "keywords": ["browser","isarray","array"],
-  "author": {
-    "name": "Julian Gruber",
-    "email": "mail@juliangruber.com",
-    "url": "http://juliangruber.com"
-  },
-  "license": "MIT"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/index.js
deleted file mode 100644
index a57f63495943a07b3b08d17e0f9ef6793548c801..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var toString = {}.toString;
-
-module.exports = Array.isArray || function (arr) {
-  return toString.call(arr) == '[object Array]';
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/package.json
deleted file mode 100644
index 3816d01e742833bb3fb79d29ac78e5cc21592142..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "_from": "isarray@>=1.0.0 <1.1.0",
-  "_id": "isarray@1.0.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream/isarray",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-  "_shasum": "bb935d48582cba168c06834957a54a3e07124f11",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@juliangruber.com",
-    "name": "Julian Gruber",
-    "url": "http://juliangruber.com"
-  },
-  "bugs": {
-    "url": "https://github.com/juliangruber/isarray/issues"
-  },
-  "dependencies": {},
-  "description": "Array#isArray for older browsers",
-  "devDependencies": {
-    "tape": "~2.13.4"
-  },
-  "homepage": "https://github.com/juliangruber/isarray",
-  "keywords": [
-    "array",
-    "browser",
-    "isarray"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "isarray",
-  "optionalDependencies": {},
-  "readme": "\n# isarray\n\n`Array#isArray` for older browsers.\n\n[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray)\n[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray)\n\n[![browser support](https://ci.testling.com/juliangruber/isarray.png)\n](https://ci.testling.com/juliangruber/isarray)\n\n## Usage\n\n```js\nvar isArray = require('isarray');\n\nconsole.log(isArray([])); // => true\nconsole.log(isArray({})); // => false\n```\n\n## Installation\n\nWith [npm](http://npmjs.org) do\n\n```bash\n$ npm install isarray\n```\n\nThen bundle for the browser with\n[browserify](https://github.com/substack/browserify).\n\nWith [component](http://component.io) do\n\n```bash\n$ component install juliangruber/isarray\n```\n\n## License\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/isarray.git"
-  },
-  "scripts": {
-    "test": "tape test.js"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2..latest",
-      "chrome/22..latest",
-      "chrome/canary",
-      "firefox/17..latest",
-      "firefox/nightly",
-      "ie/8..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest"
-    ],
-    "files": "test.js"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/test.js
deleted file mode 100644
index e0c3444d85d5c799bd70b2ee9df62ef56d9763ea..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/isarray/test.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var isArray = require('./');
-var test = require('tape');
-
-test('is array', function(t){
-  t.ok(isArray([]));
-  t.notOk(isArray({}));
-  t.notOk(isArray(null));
-  t.notOk(isArray(false));
-
-  var obj = {};
-  obj[0] = true;
-  t.notOk(isArray(obj));
-
-  var arr = [];
-  arr.foo = 'bar';
-  t.ok(isArray(arr));
-
-  t.end();
-});
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/.travis.yml
deleted file mode 100644
index 36201b10017a5e0533961815850e393d54ceecb8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
-  - "0.11"
-  - "0.12"
-  - "1.7.1"
-  - 1
-  - 2
-  - 3
-  - 4
-  - 5
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/index.js
deleted file mode 100644
index a4f40f845faa65905ec20c08c254fcac474e2c8f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/index.js
+++ /dev/null
@@ -1,43 +0,0 @@
-'use strict';
-
-if (!process.version ||
-    process.version.indexOf('v0.') === 0 ||
-    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
-  module.exports = nextTick;
-} else {
-  module.exports = process.nextTick;
-}
-
-function nextTick(fn, arg1, arg2, arg3) {
-  if (typeof fn !== 'function') {
-    throw new TypeError('"callback" argument must be a function');
-  }
-  var len = arguments.length;
-  var args, i;
-  switch (len) {
-  case 0:
-  case 1:
-    return process.nextTick(fn);
-  case 2:
-    return process.nextTick(function afterTickOne() {
-      fn.call(null, arg1);
-    });
-  case 3:
-    return process.nextTick(function afterTickTwo() {
-      fn.call(null, arg1, arg2);
-    });
-  case 4:
-    return process.nextTick(function afterTickThree() {
-      fn.call(null, arg1, arg2, arg3);
-    });
-  default:
-    args = new Array(len - 1);
-    i = 0;
-    while (i < args.length) {
-      args[i++] = arguments[i];
-    }
-    return process.nextTick(function afterTick() {
-      fn.apply(null, args);
-    });
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/license.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/license.md
deleted file mode 100644
index c67e3532b542455fad8c4004ef297534d7f480b2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/license.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (c) 2015 Calvin Metcalf
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.**
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/package.json
deleted file mode 100644
index f4880f1d32beee2a38590a8dd66b4a6ace9a897d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "_from": "process-nextick-args@>=1.0.6 <1.1.0",
-  "_id": "process-nextick-args@1.0.7",
-  "_location": "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream/process-nextick-args",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
-  "_shasum": "150e20b756590ad3f91093f25a4f2ad8bff30ba3",
-  "_shrinkwrap": null,
-  "author": "",
-  "bugs": {
-    "url": "https://github.com/calvinmetcalf/process-nextick-args/issues"
-  },
-  "dependencies": {},
-  "description": "process.nextTick but always with args",
-  "devDependencies": {
-    "tap": "~0.2.6"
-  },
-  "homepage": "https://github.com/calvinmetcalf/process-nextick-args",
-  "license": "MIT",
-  "main": "index.js",
-  "name": "process-nextick-args",
-  "optionalDependencies": {},
-  "readme": "process-nextick-args\n=====\n\n[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args)\n\n```bash\nnpm install --save process-nextick-args\n```\n\nAlways be able to pass arguments to process.nextTick, no matter the platform\n\n```js\nvar nextTick = require('process-nextick-args');\n\nnextTick(function (a, b, c) {\n  console.log(a, b, c);\n}, 'step', 3,  'profit');\n```\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/calvinmetcalf/process-nextick-args.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "1.0.7"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/readme.md
deleted file mode 100644
index 78e7cfaeb7acdef0248b6820e5ec48302eebf1a0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/readme.md
+++ /dev/null
@@ -1,18 +0,0 @@
-process-nextick-args
-=====
-
-[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args)
-
-```bash
-npm install --save process-nextick-args
-```
-
-Always be able to pass arguments to process.nextTick, no matter the platform
-
-```js
-var nextTick = require('process-nextick-args');
-
-nextTick(function (a, b, c) {
-  console.log(a, b, c);
-}, 'step', 3,  'profit');
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/test.js
deleted file mode 100644
index ef15721584ac9973198e407f6ce3beadf95d5fff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/process-nextick-args/test.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var test = require("tap").test;
-var nextTick = require('./');
-
-test('should work', function (t) {
-  t.plan(5);
-  nextTick(function (a) {
-    t.ok(a);
-    nextTick(function (thing) {
-      t.equals(thing, 7);
-    }, 7);
-  }, true);
-  nextTick(function (a, b, c) {
-    t.equals(a, 'step');
-    t.equals(b, 3);
-    t.equals(c, 'profit');
-  }, 'step', 3,  'profit');
-});
-
-test('correct number of arguments', function (t) {
-  t.plan(1);
-  nextTick(function () {
-    t.equals(2, arguments.length, 'correct number');
-  }, 1, 2);
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/.npmignore
deleted file mode 100644
index 206320cc1d21b9cc9e3e0e8a303896045453c524..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build
-test
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/LICENSE
deleted file mode 100644
index 6de584a48f5c897d27bfe9922f976297c07cae02..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright Joyent, Inc. and other Node contributors.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to permit
-persons to whom the Software is furnished to do so, subject to the
-following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/README.md
deleted file mode 100644
index 4d2aa001501107cd2792f385ad62237dc3757521..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-**string_decoder.js** (`require('string_decoder')`) from Node.js core
-
-Copyright Joyent, Inc. and other Node contributors. See LICENCE file for details.
-
-Version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. **Prefer the stable version over the unstable.**
-
-The *build/* directory contains a build script that will scrape the source from the [joyent/node](https://github.com/joyent/node) repo given a specific Node version.
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/index.js
deleted file mode 100644
index b00e54fb7909827a02b6fa96ef55bd4dd85a3fe7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/index.js
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Buffer = require('buffer').Buffer;
-
-var isBufferEncoding = Buffer.isEncoding
-  || function(encoding) {
-       switch (encoding && encoding.toLowerCase()) {
-         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;
-         default: return false;
-       }
-     }
-
-
-function assertEncoding(encoding) {
-  if (encoding && !isBufferEncoding(encoding)) {
-    throw new Error('Unknown encoding: ' + encoding);
-  }
-}
-
-// StringDecoder provides an interface for efficiently splitting a series of
-// buffers into a series of JS strings without breaking apart multi-byte
-// characters. CESU-8 is handled as part of the UTF-8 encoding.
-//
-// @TODO Handling all encodings inside a single object makes it very difficult
-// to reason about this code, so it should be split up in the future.
-// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
-// points as used by CESU-8.
-var StringDecoder = exports.StringDecoder = function(encoding) {
-  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
-  assertEncoding(encoding);
-  switch (this.encoding) {
-    case 'utf8':
-      // CESU-8 represents each of Surrogate Pair by 3-bytes
-      this.surrogateSize = 3;
-      break;
-    case 'ucs2':
-    case 'utf16le':
-      // UTF-16 represents each of Surrogate Pair by 2-bytes
-      this.surrogateSize = 2;
-      this.detectIncompleteChar = utf16DetectIncompleteChar;
-      break;
-    case 'base64':
-      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
-      this.surrogateSize = 3;
-      this.detectIncompleteChar = base64DetectIncompleteChar;
-      break;
-    default:
-      this.write = passThroughWrite;
-      return;
-  }
-
-  // Enough space to store all bytes of a single character. UTF-8 needs 4
-  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
-  this.charBuffer = new Buffer(6);
-  // Number of bytes received for the current incomplete multi-byte character.
-  this.charReceived = 0;
-  // Number of bytes expected for the current incomplete multi-byte character.
-  this.charLength = 0;
-};
-
-
-// write decodes the given buffer and returns it as JS string that is
-// guaranteed to not contain any partial multi-byte characters. Any partial
-// character found at the end of the buffer is buffered up, and will be
-// returned when calling write again with the remaining bytes.
-//
-// Note: Converting a Buffer containing an orphan surrogate to a String
-// currently works, but converting a String to a Buffer (via `new Buffer`, or
-// Buffer#write) will replace incomplete surrogates with the unicode
-// replacement character. See https://codereview.chromium.org/121173009/ .
-StringDecoder.prototype.write = function(buffer) {
-  var charStr = '';
-  // if our last write ended with an incomplete multibyte character
-  while (this.charLength) {
-    // determine how many remaining bytes this buffer has to offer for this char
-    var available = (buffer.length >= this.charLength - this.charReceived) ?
-        this.charLength - this.charReceived :
-        buffer.length;
-
-    // add the new bytes to the char buffer
-    buffer.copy(this.charBuffer, this.charReceived, 0, available);
-    this.charReceived += available;
-
-    if (this.charReceived < this.charLength) {
-      // still not enough chars in this buffer? wait for more ...
-      return '';
-    }
-
-    // remove bytes belonging to the current character from the buffer
-    buffer = buffer.slice(available, buffer.length);
-
-    // get the character that was split
-    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
-
-    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
-    var charCode = charStr.charCodeAt(charStr.length - 1);
-    if (charCode >= 0xD800 && charCode <= 0xDBFF) {
-      this.charLength += this.surrogateSize;
-      charStr = '';
-      continue;
-    }
-    this.charReceived = this.charLength = 0;
-
-    // if there are no more bytes in this buffer, just emit our char
-    if (buffer.length === 0) {
-      return charStr;
-    }
-    break;
-  }
-
-  // determine and set charLength / charReceived
-  this.detectIncompleteChar(buffer);
-
-  var end = buffer.length;
-  if (this.charLength) {
-    // buffer the incomplete character bytes we got
-    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
-    end -= this.charReceived;
-  }
-
-  charStr += buffer.toString(this.encoding, 0, end);
-
-  var end = charStr.length - 1;
-  var charCode = charStr.charCodeAt(end);
-  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
-  if (charCode >= 0xD800 && charCode <= 0xDBFF) {
-    var size = this.surrogateSize;
-    this.charLength += size;
-    this.charReceived += size;
-    this.charBuffer.copy(this.charBuffer, size, 0, size);
-    buffer.copy(this.charBuffer, 0, 0, size);
-    return charStr.substring(0, end);
-  }
-
-  // or just emit the charStr
-  return charStr;
-};
-
-// detectIncompleteChar determines if there is an incomplete UTF-8 character at
-// the end of the given buffer. If so, it sets this.charLength to the byte
-// length that character, and sets this.charReceived to the number of bytes
-// that are available for this character.
-StringDecoder.prototype.detectIncompleteChar = function(buffer) {
-  // determine how many bytes we have to check at the end of this buffer
-  var i = (buffer.length >= 3) ? 3 : buffer.length;
-
-  // Figure out if one of the last i bytes of our buffer announces an
-  // incomplete char.
-  for (; i > 0; i--) {
-    var c = buffer[buffer.length - i];
-
-    // See http://en.wikipedia.org/wiki/UTF-8#Description
-
-    // 110XXXXX
-    if (i == 1 && c >> 5 == 0x06) {
-      this.charLength = 2;
-      break;
-    }
-
-    // 1110XXXX
-    if (i <= 2 && c >> 4 == 0x0E) {
-      this.charLength = 3;
-      break;
-    }
-
-    // 11110XXX
-    if (i <= 3 && c >> 3 == 0x1E) {
-      this.charLength = 4;
-      break;
-    }
-  }
-  this.charReceived = i;
-};
-
-StringDecoder.prototype.end = function(buffer) {
-  var res = '';
-  if (buffer && buffer.length)
-    res = this.write(buffer);
-
-  if (this.charReceived) {
-    var cr = this.charReceived;
-    var buf = this.charBuffer;
-    var enc = this.encoding;
-    res += buf.slice(0, cr).toString(enc);
-  }
-
-  return res;
-};
-
-function passThroughWrite(buffer) {
-  return buffer.toString(this.encoding);
-}
-
-function utf16DetectIncompleteChar(buffer) {
-  this.charReceived = buffer.length % 2;
-  this.charLength = this.charReceived ? 2 : 0;
-}
-
-function base64DetectIncompleteChar(buffer) {
-  this.charReceived = buffer.length % 3;
-  this.charLength = this.charReceived ? 3 : 0;
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/package.json
deleted file mode 100644
index 13e61eacf493082792ba781dd0185c2c438d6126..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/string_decoder/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "_from": "string_decoder@>=0.10.0 <0.11.0",
-  "_id": "string_decoder@0.10.31",
-  "_location": "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream/string_decoder",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-  "_shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/rvagg/string_decoder/issues"
-  },
-  "dependencies": {},
-  "description": "The string_decoder module from Node core",
-  "devDependencies": {
-    "tap": "~0.4.8"
-  },
-  "homepage": "https://github.com/rvagg/string_decoder",
-  "keywords": [
-    "browser",
-    "browserify",
-    "decoder",
-    "string"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "string_decoder",
-  "optionalDependencies": {},
-  "readme": "**string_decoder.js** (`require('string_decoder')`) from Node.js core\n\nCopyright Joyent, Inc. and other Node contributors. See LICENCE file for details.\n\nVersion numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. **Prefer the stable version over the unstable.**\n\nThe *build/* directory contains a build script that will scrape the source from the [joyent/node](https://github.com/joyent/node) repo given a specific Node version.",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/rvagg/string_decoder.git"
-  },
-  "scripts": {
-    "test": "tap test/simple/*.js"
-  },
-  "version": "0.10.31"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/History.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/History.md
deleted file mode 100644
index acc8675372e980824723cfcfec09c0ba43a3195a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/History.md
+++ /dev/null
@@ -1,16 +0,0 @@
-
-1.0.2 / 2015-10-07
-==================
-
-  * use try/catch when checking `localStorage` (#3, @kumavis)
-
-1.0.1 / 2014-11-25
-==================
-
-  * browser: use `console.warn()` for deprecation calls
-  * browser: more jsdocs
-
-1.0.0 / 2014-04-30
-==================
-
-  * initial commit
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/LICENSE
deleted file mode 100644
index 6a60e8c225c9baca25907f87c74b428e5d85de0c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/README.md
deleted file mode 100644
index 75622fa7c250a6605f4778d9dffe97bf60291d17..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-util-deprecate
-==============
-### The Node.js `util.deprecate()` function with browser support
-
-In Node.js, this module simply re-exports the `util.deprecate()` function.
-
-In the web browser (i.e. via browserify), a browser-specific implementation
-of the `util.deprecate()` function is used.
-
-
-## API
-
-A `deprecate()` function is the only thing exposed by this module.
-
-``` javascript
-// setup:
-exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead');
-
-
-// users see:
-foo();
-// foo() is deprecated, use bar() instead
-foo();
-foo();
-```
-
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/browser.js
deleted file mode 100644
index 549ae2f065ea5add2c4b3667e412a9d0e7d2b1af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/browser.js
+++ /dev/null
@@ -1,67 +0,0 @@
-
-/**
- * Module exports.
- */
-
-module.exports = deprecate;
-
-/**
- * Mark that a method should not be used.
- * Returns a modified function which warns once by default.
- *
- * If `localStorage.noDeprecation = true` is set, then it is a no-op.
- *
- * If `localStorage.throwDeprecation = true` is set, then deprecated functions
- * will throw an Error when invoked.
- *
- * If `localStorage.traceDeprecation = true` is set, then deprecated functions
- * will invoke `console.trace()` instead of `console.error()`.
- *
- * @param {Function} fn - the function to deprecate
- * @param {String} msg - the string to print to the console when `fn` is invoked
- * @returns {Function} a new "deprecated" version of `fn`
- * @api public
- */
-
-function deprecate (fn, msg) {
-  if (config('noDeprecation')) {
-    return fn;
-  }
-
-  var warned = false;
-  function deprecated() {
-    if (!warned) {
-      if (config('throwDeprecation')) {
-        throw new Error(msg);
-      } else if (config('traceDeprecation')) {
-        console.trace(msg);
-      } else {
-        console.warn(msg);
-      }
-      warned = true;
-    }
-    return fn.apply(this, arguments);
-  }
-
-  return deprecated;
-}
-
-/**
- * Checks `localStorage` for boolean values for the given `name`.
- *
- * @param {String} name
- * @returns {Boolean}
- * @api private
- */
-
-function config (name) {
-  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
-  try {
-    if (!global.localStorage) return false;
-  } catch (_) {
-    return false;
-  }
-  var val = global.localStorage[name];
-  if (null == val) return false;
-  return String(val).toLowerCase() === 'true';
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/node.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/node.js
deleted file mode 100644
index 5e6fcff5ddd3fbf8bdda6310c224114d30b7509e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/node.js
+++ /dev/null
@@ -1,6 +0,0 @@
-
-/**
- * For Node.js, simply re-export the core `util.deprecate` function.
- */
-
-module.exports = require('util').deprecate;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/package.json
deleted file mode 100644
index 5599a0b695aa79b997e5db598062385eacf6350a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/node_modules/util-deprecate/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "_from": "util-deprecate@>=1.0.1 <1.1.0",
-  "_id": "util-deprecate@1.0.2",
-  "_location": "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream/util-deprecate",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-  "_shasum": "450d4dc9fa70de732762fbd2d4a28981419a0ccf",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "nathan@tootallnate.net",
-    "name": "Nathan Rajlich",
-    "url": "http://n8.io/"
-  },
-  "browser": "browser.js",
-  "bugs": {
-    "url": "https://github.com/TooTallNate/util-deprecate/issues"
-  },
-  "dependencies": {},
-  "description": "The Node.js `util.deprecate()` function with browser support",
-  "devDependencies": {},
-  "homepage": "https://github.com/TooTallNate/util-deprecate",
-  "keywords": [
-    "browser",
-    "browserify",
-    "deprecate",
-    "node",
-    "util"
-  ],
-  "license": "MIT",
-  "main": "node.js",
-  "name": "util-deprecate",
-  "optionalDependencies": {},
-  "readme": "util-deprecate\n==============\n### The Node.js `util.deprecate()` function with browser support\n\nIn Node.js, this module simply re-exports the `util.deprecate()` function.\n\nIn the web browser (i.e. via browserify), a browser-specific implementation\nof the `util.deprecate()` function is used.\n\n\n## API\n\nA `deprecate()` function is the only thing exposed by this module.\n\n``` javascript\n// setup:\nexports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead');\n\n\n// users see:\nfoo();\n// foo() is deprecated, use bar() instead\nfoo();\nfoo();\n```\n\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/TooTallNate/util-deprecate.git"
-  },
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/package.json
deleted file mode 100644
index c36edfed333032416491e8d58a053b5a2ea54794..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/package.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
-  "_from": "readable-stream@>=2.1.4 <2.2.0",
-  "_id": "readable-stream@2.1.4",
-  "_location": "/serialport/node-pre-gyp/npmlog/are-we-there-yet/readable-stream",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/are-we-there-yet"
-  ],
-  "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz",
-  "_shasum": "70b9791c6fcb8480db44bd155a0f6bb58f172468",
-  "_shrinkwrap": null,
-  "browser": {
-    "util": false
-  },
-  "bugs": {
-    "url": "https://github.com/nodejs/readable-stream/issues"
-  },
-  "dependencies": {
-    "buffer-shims": "^1.0.0",
-    "core-util-is": "~1.0.0",
-    "inherits": "~2.0.1",
-    "isarray": "~1.0.0",
-    "process-nextick-args": "~1.0.6",
-    "string_decoder": "~0.10.x",
-    "util-deprecate": "~1.0.1"
-  },
-  "description": "Streams3, a user-land copy of the stream library from Node.js",
-  "devDependencies": {
-    "assert": "~1.4.0",
-    "nyc": "^6.4.0",
-    "tap": "~0.7.1",
-    "tape": "~4.5.1",
-    "zuul": "~3.9.0",
-    "zuul-ngrok": "^4.0.0"
-  },
-  "homepage": "https://github.com/nodejs/readable-stream#readme",
-  "keywords": [
-    "pipe",
-    "readable",
-    "stream"
-  ],
-  "license": "MIT",
-  "main": "readable.js",
-  "name": "readable-stream",
-  "nyc": {
-    "include": [
-      "lib/**.js"
-    ]
-  },
-  "optionalDependencies": {},
-  "readme": "# readable-stream\n\n***Node-core v6.1.0 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream)\n\n\n[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)\n[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)\n\n\n[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream)\n\n```bash\nnpm install --save readable-stream\n```\n\n***Node-core streams for userland***\n\nThis package is a mirror of the Streams2 and Streams3 implementations in\nNode-core, including [documentation](doc/stream.md).\n\nIf you want to guarantee a stable streams base, regardless of what version of\nNode you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *\"stream\"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).\n\nAs of version 2.0.0 **readable-stream** uses semantic versioning.  \n\n# Streams WG Team Members\n\n* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) &lt;christopher.s.dickinson@gmail.com&gt;\n  - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B\n* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) &lt;calvin.metcalf@gmail.com&gt;\n  - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242\n* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) &lt;rod@vagg.org&gt;\n  - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D\n* **Sam Newman** ([@sonewman](https://github.com/sonewman)) &lt;newmansam@outlook.com&gt;\n* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) &lt;mathiasbuus@gmail.com&gt;\n* **Domenic Denicola** ([@domenic](https://github.com/domenic)) &lt;d@domenic.me&gt;\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/nodejs/readable-stream.git"
-  },
-  "scripts": {
-    "browser": "npm run write-zuul && zuul -- test/browser.js",
-    "cover": "nyc npm test",
-    "local": "zuul --local -- test/browser.js",
-    "report": "nyc report --reporter=lcov",
-    "test": "tap test/parallel/*.js test/ours/*.js",
-    "write-zuul": "printf \"ui: tape\ntunnel: ngrok\nbrowsers:\n  - name: $BROWSER_NAME\n    version: $BROWSER_VERSION\n\">.zuul.yml"
-  },
-  "version": "2.1.4"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/passthrough.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/passthrough.js
deleted file mode 100644
index 27e8d8a55165f9d1d7d1d1905d8d70e9c5a24f6e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/passthrough.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_passthrough.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/readable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/readable.js
deleted file mode 100644
index be2688a071dd1856afdfe1e9e5c205eabcd83008..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/readable.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var Stream = (function (){
-  try {
-    return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify
-  } catch(_){}
-}());
-exports = module.exports = require('./lib/_stream_readable.js');
-exports.Stream = Stream || exports;
-exports.Readable = exports;
-exports.Writable = require('./lib/_stream_writable.js');
-exports.Duplex = require('./lib/_stream_duplex.js');
-exports.Transform = require('./lib/_stream_transform.js');
-exports.PassThrough = require('./lib/_stream_passthrough.js');
-
-if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) {
-  module.exports = Stream;
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/transform.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/transform.js
deleted file mode 100644
index 5d482f0780e9934896cd693414fee2b9b425778f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/transform.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_transform.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/writable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/writable.js
deleted file mode 100644
index e1e9efdf3c12e938a4fd0659f2af60dbe65bf240..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/node_modules/readable-stream/writable.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_writable.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/package.json
deleted file mode 100644
index 2e368f5c8b0d31db4bf669ce28a49fb5ecf8d488..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/package.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "_from": "are-we-there-yet@>=1.1.2 <1.2.0",
-  "_id": "are-we-there-yet@1.1.2",
-  "_location": "/serialport/node-pre-gyp/npmlog/are-we-there-yet",
-  "_nodeVersion": "4.2.2",
-  "_npmOperationalInternal": {
-    "host": "packages-13-west.internal.npmjs.com",
-    "tmp": "tmp/are-we-there-yet-1.1.2.tgz_1458084397358_0.15847722673788667"
-  },
-  "_npmUser": {
-    "email": "me@re-becca.org",
-    "name": "iarna"
-  },
-  "_npmVersion": "3.8.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog"
-  ],
-  "_resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz",
-  "_shasum": "80e470e95a084794fe1899262c5667c6e88de1b3",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "Rebecca Turner",
-    "url": "http://re-becca.org"
-  },
-  "bugs": {
-    "url": "https://github.com/iarna/are-we-there-yet/issues"
-  },
-  "dependencies": {
-    "delegates": "^1.0.0",
-    "readable-stream": "^2.0.0 || ^1.1.13"
-  },
-  "description": "Keep track of the overall completion of many dispirate processes",
-  "devDependencies": {
-    "standard": "^6.0.8",
-    "tap": "^5.7.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "80e470e95a084794fe1899262c5667c6e88de1b3",
-    "tarball": "http://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz"
-  },
-  "gitHead": "dd5706e2204cb681e78031d0ffe156ed4cc75823",
-  "homepage": "https://github.com/iarna/are-we-there-yet",
-  "license": "ISC",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "iarna",
-      "email": "me@re-becca.org"
-    }
-  ],
-  "name": "are-we-there-yet",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/iarna/are-we-there-yet.git"
-  },
-  "scripts": {
-    "test": "standard && tap test/*.js"
-  },
-  "version": "1.1.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/lib/test-event.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/lib/test-event.js
deleted file mode 100644
index 2aa7c05c5864fa2ab6cc0ed56f9efa48cea7f498..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/lib/test-event.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict'
-var util = require('util')
-
-module.exports = function (obj, event, next) {
-  var timeout = setTimeout(gotTimeout, 10)
-  obj.once(event, gotResult)
-
-  function gotTimeout () {
-    obj.removeListener(event, gotResult)
-    next(new Error('Timeout listening for ' + event))
-  }
-  var result = []
-  function gotResult () {
-    result = Array.prototype.slice.call(arguments)
-    clearTimeout(timeout)
-    timeout = setTimeout(gotNoMoreResults, 10)
-    obj.once(event, gotTooManyResults)
-  }
-  function gotNoMoreResults () {
-    obj.removeListener(event, gotTooManyResults)
-    var args = [null].concat(result)
-    next.apply(null, args)
-  }
-  function gotTooManyResults () {
-    var secondResult = Array.prototype.slice.call(arguments)
-    clearTimeout(timeout)
-    next(new Error('Got too many results, first ' + util.inspect(result) + ' and then ' + util.inspect(secondResult)))
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/tracker.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/tracker.js
deleted file mode 100644
index 374c7739d0c01159b169ff1b4e241c44bf033885..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/tracker.js
+++ /dev/null
@@ -1,57 +0,0 @@
-'use strict'
-var test = require('tap').test
-var Tracker = require('../index.js').Tracker
-
-var testEvent = require('./lib/test-event.js')
-
-var name = 'test'
-
-test('initialization', function (t) {
-  var simple = new Tracker(name)
-
-  t.is(simple.completed(), 0, 'Nothing todo is 0 completion')
-  t.done()
-})
-
-var track
-var todo = 100
-test('completion', function (t) {
-  track = new Tracker(name, todo)
-  t.is(track.completed(), 0, 'Nothing done is 0 completion')
-
-  testEvent(track, 'change', afterCompleteWork)
-
-  track.completeWork(todo)
-  t.is(track.completed(), 1, 'completeWork: 100% completed')
-
-  function afterCompleteWork (er, onChangeName) {
-    t.is(er, null, 'completeWork: on change event fired')
-    t.is(onChangeName, name, 'completeWork: on change emits the correct name')
-    t.done()
-  }
-})
-
-test('add more work', function (t) {
-  testEvent(track, 'change', afterAddWork)
-  track.addWork(todo)
-  t.is(track.completed(), 0.5, 'addWork: 50% completed')
-  function afterAddWork (er, onChangeName) {
-    t.is(er, null, 'addWork: on change event fired')
-    t.is(onChangeName, name, 'addWork: on change emits the correct name')
-    t.done()
-  }
-})
-
-test('complete more work', function (t) {
-  track.completeWork(200)
-  t.is(track.completed(), 1, 'completeWork: Over completion is still only 100% complete')
-  t.done()
-})
-
-test('finish is always 100%', function (t) {
-  var finishtest = new Tracker(name, todo)
-  finishtest.completeWork(50)
-  finishtest.finish()
-  t.is(finishtest.completed(), 1, 'finish: Explicitly finishing moves to 100%')
-  t.done()
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/trackergroup.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/trackergroup.js
deleted file mode 100644
index 799a7670b65934474ac877eea8645a5c0e6ce28a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/trackergroup.js
+++ /dev/null
@@ -1,96 +0,0 @@
-'use strict'
-var test = require('tap').test
-var TrackerGroup = require('../index.js').TrackerGroup
-var testEvent = require('./lib/test-event.js')
-
-test('TrackerGroup', function (t) {
-  var name = 'test'
-
-  var track = new TrackerGroup(name)
-  t.is(track.completed(), 0, 'Nothing todo is 0 completion')
-  testEvent(track, 'change', afterFinishEmpty)
-  track.finish()
-  var a, b
-  function afterFinishEmpty (er, onChangeName, completion) {
-    t.is(er, null, 'finishEmpty: on change event fired')
-    t.is(onChangeName, name, 'finishEmpty: on change emits the correct name')
-    t.is(completion, 1, 'finishEmpty: passed through completion was correct')
-    t.is(track.completed(), 1, 'finishEmpty: Finishing an empty group actually finishes it')
-
-    track = new TrackerGroup(name)
-    a = track.newItem('a', 10, 1)
-    b = track.newItem('b', 10, 1)
-    t.is(track.completed(), 0, 'Initially empty')
-    testEvent(track, 'change', afterCompleteWork)
-    a.completeWork(5)
-  }
-  function afterCompleteWork (er, onChangeName, completion) {
-    t.is(er, null, 'on change event fired')
-    t.is(onChangeName, 'a', 'on change emits the correct name')
-    t.is(completion, 0.25, 'Complete half of one is a quarter overall')
-    t.is(track.completed(), 0.25, 'Complete half of one is a quarter overall')
-    testEvent(track, 'change', afterFinishAll)
-    track.finish()
-  }
-  function afterFinishAll (er, onChangeName, completion) {
-    t.is(er, null, 'finishAll: on change event fired')
-    t.is(onChangeName, name, 'finishAll: on change emits the correct name')
-    t.is(completion, 1, 'Finishing everything ')
-    t.is(track.completed(), 1, 'Finishing everything ')
-
-    track = new TrackerGroup(name)
-    a = track.newItem('a', 10, 2)
-    b = track.newItem('b', 10, 1)
-    t.is(track.completed(), 0, 'weighted: Initially empty')
-    testEvent(track, 'change', afterWeightedCompleteWork)
-    a.completeWork(5)
-  }
-  function afterWeightedCompleteWork (er, onChangeName, completion) {
-    t.is(er, null, 'weighted: on change event fired')
-    t.is(onChangeName, 'a', 'weighted: on change emits the correct name')
-    t.is(Math.floor(completion * 100), 33, 'weighted: Complete half of double weighted')
-    t.is(Math.floor(track.completed() * 100), 33, 'weighted: Complete half of double weighted')
-    testEvent(track, 'change', afterWeightedFinishAll)
-    track.finish()
-  }
-  function afterWeightedFinishAll (er, onChangeName, completion) {
-    t.is(er, null, 'weightedFinishAll: on change event fired')
-    t.is(onChangeName, name, 'weightedFinishAll: on change emits the correct name')
-    t.is(completion, 1, 'weightedFinishaAll: Finishing everything ')
-    t.is(track.completed(), 1, 'weightedFinishaAll: Finishing everything ')
-
-    track = new TrackerGroup(name)
-    a = track.newGroup('a', 10)
-    b = track.newGroup('b', 10)
-    var a1 = a.newItem('a.1', 10)
-    a1.completeWork(5)
-    t.is(track.completed(), 0.25, 'nested: Initially quarter done')
-    testEvent(track, 'change', afterNestedComplete)
-    b.finish()
-  }
-  function afterNestedComplete (er, onChangeName, completion) {
-    t.is(er, null, 'nestedComplete: on change event fired')
-    t.is(onChangeName, 'b', 'nestedComplete: on change emits the correct name')
-    t.is(completion, 0.75, 'nestedComplete: Finishing everything ')
-    t.is(track.completed(), 0.75, 'nestedComplete: Finishing everything ')
-    t.end()
-  }
-})
-
-test('cycles', function (t) {
-  var track = new TrackerGroup('top')
-  testCycle(track, track)
-  var layer1 = track.newGroup('layer1')
-  testCycle(layer1, track)
-  t.end()
-
-  function testCycle (addTo, toAdd) {
-    try {
-      addTo.addUnit(toAdd)
-      t.fail(toAdd.name)
-    } catch (ex) {
-      console.log(ex)
-      t.pass(toAdd.name)
-    }
-  }
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/trackerstream.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/trackerstream.js
deleted file mode 100644
index 65f04b0376919084d227da4891825e320c68b471..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/test/trackerstream.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict'
-var test = require('tap').test
-var util = require('util')
-var stream = require('readable-stream')
-var TrackerStream = require('../index.js').TrackerStream
-var testEvent = require('./lib/test-event.js')
-
-var Sink = function () {
-  stream.Writable.apply(this, arguments)
-}
-util.inherits(Sink, stream.Writable)
-Sink.prototype._write = function (data, encoding, cb) {
-  cb()
-}
-
-test('TrackerStream', function (t) {
-  t.plan(9)
-
-  var name = 'test'
-  var track = new TrackerStream(name)
-
-  t.is(track.completed(), 0, 'Nothing todo is 0 completion')
-
-  var todo = 10
-  track = new TrackerStream(name, todo)
-  t.is(track.completed(), 0, 'Nothing done is 0 completion')
-
-  track.pipe(new Sink())
-
-  testEvent(track, 'change', afterCompleteWork)
-  track.write('0123456789')
-  function afterCompleteWork (er, onChangeName) {
-    t.is(er, null, 'write: on change event fired')
-    t.is(onChangeName, name, 'write: on change emits the correct name')
-    t.is(track.completed(), 1, 'write: 100% completed')
-
-    testEvent(track, 'change', afterAddWork)
-    track.addWork(10)
-  }
-  function afterAddWork (er, onChangeName) {
-    t.is(er, null, 'addWork: on change event fired')
-    t.is(track.completed(), 0.5, 'addWork: 50% completed')
-
-    testEvent(track, 'change', afterAllWork)
-    track.write('ABCDEFGHIJKLMNOPQRST')
-  }
-  function afterAllWork (er) {
-    t.is(er, null, 'allWork: on change event fired')
-    t.is(track.completed(), 1, 'allWork: 100% completed')
-  }
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker-base.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker-base.js
deleted file mode 100644
index 6f436875578a7a1ac1591b4358cc6d4b6f9a6cf5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker-base.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict'
-var EventEmitter = require('events').EventEmitter
-var util = require('util')
-
-var trackerId = 0
-var TrackerBase = module.exports = function (name) {
-  EventEmitter.call(this)
-  this.id = ++trackerId
-  this.name = name
-}
-util.inherits(TrackerBase, EventEmitter)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker-group.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker-group.js
deleted file mode 100644
index 9759e1226db0462c945455685499fa4fd3967a4d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker-group.js
+++ /dev/null
@@ -1,107 +0,0 @@
-'use strict'
-var util = require('util')
-var TrackerBase = require('./tracker-base.js')
-var Tracker = require('./tracker.js')
-var TrackerStream = require('./tracker-stream.js')
-
-var TrackerGroup = module.exports = function (name) {
-  TrackerBase.call(this, name)
-  this.parentGroup = null
-  this.trackers = []
-  this.completion = {}
-  this.weight = {}
-  this.totalWeight = 0
-  this.finished = false
-  this.bubbleChange = bubbleChange(this)
-}
-util.inherits(TrackerGroup, TrackerBase)
-
-function bubbleChange (trackerGroup) {
-  return function (name, completed, tracker) {
-    trackerGroup.completion[tracker.id] = completed
-    if (trackerGroup.finished) return
-    trackerGroup.emit('change', name || trackerGroup.name, trackerGroup.completed(), trackerGroup)
-  }
-}
-
-TrackerGroup.prototype.nameInTree = function () {
-  var names = []
-  var from = this
-  while (from) {
-    names.unshift(from.name)
-    from = from.parentGroup
-  }
-  return names.join('/')
-}
-
-TrackerGroup.prototype.addUnit = function (unit, weight) {
-  if (unit.addUnit) {
-    var toTest = this
-    while (toTest) {
-      if (unit === toTest) {
-        throw new Error(
-          'Attempted to add tracker group ' +
-          unit.name + ' to tree that already includes it ' +
-          this.nameInTree(this))
-      }
-      toTest = toTest.parentGroup
-    }
-    unit.parentGroup = this
-  }
-  this.weight[unit.id] = weight || 1
-  this.totalWeight += this.weight[unit.id]
-  this.trackers.push(unit)
-  this.completion[unit.id] = unit.completed()
-  unit.on('change', this.bubbleChange)
-  if (!this.finished) this.emit('change', unit.name, this.completion[unit.id], unit)
-  return unit
-}
-
-TrackerGroup.prototype.completed = function () {
-  if (this.trackers.length === 0) return 0
-  var valPerWeight = 1 / this.totalWeight
-  var completed = 0
-  for (var ii = 0; ii < this.trackers.length; ii++) {
-    var trackerId = this.trackers[ii].id
-    completed += valPerWeight * this.weight[trackerId] * this.completion[trackerId]
-  }
-  return completed
-}
-
-TrackerGroup.prototype.newGroup = function (name, weight) {
-  return this.addUnit(new TrackerGroup(name), weight)
-}
-
-TrackerGroup.prototype.newItem = function (name, todo, weight) {
-  return this.addUnit(new Tracker(name, todo), weight)
-}
-
-TrackerGroup.prototype.newStream = function (name, todo, weight) {
-  return this.addUnit(new TrackerStream(name, todo), weight)
-}
-
-TrackerGroup.prototype.finish = function () {
-  this.finished = true
-  if (!this.trackers.length) this.addUnit(new Tracker(), 1, true)
-  for (var ii = 0; ii < this.trackers.length; ii++) {
-    var tracker = this.trackers[ii]
-    tracker.finish()
-    tracker.removeListener('change', this.bubbleChange)
-  }
-  this.emit('change', this.name, 1, this)
-}
-
-var buffer = '                                  '
-TrackerGroup.prototype.debug = function (depth) {
-  depth = depth || 0
-  var indent = depth ? buffer.substr(0, depth) : ''
-  var output = indent + (this.name || 'top') + ': ' + this.completed() + '\n'
-  this.trackers.forEach(function (tracker) {
-    if (tracker instanceof TrackerGroup) {
-      output += tracker.debug(depth + 1)
-    } else {
-      output += indent + ' ' + tracker.name + ': ' + tracker.completed() + '\n'
-    }
-  })
-  return output
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker-stream.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker-stream.js
deleted file mode 100644
index fb9598ed4e9c31742bac7fca92e2379a2bce4ed5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker-stream.js
+++ /dev/null
@@ -1,35 +0,0 @@
-'use strict'
-var util = require('util')
-var stream = require('readable-stream')
-var delegate = require('delegates')
-var Tracker = require('./tracker.js')
-
-var TrackerStream = module.exports = function (name, size, options) {
-  stream.Transform.call(this, options)
-  this.tracker = new Tracker(name, size)
-  this.name = name
-  this.id = this.tracker.id
-  this.tracker.on('change', delegateChange(this))
-}
-util.inherits(TrackerStream, stream.Transform)
-
-function delegateChange (trackerStream) {
-  return function (name, completion, tracker) {
-    trackerStream.emit('change', name, completion, trackerStream)
-  }
-}
-
-TrackerStream.prototype._transform = function (data, encoding, cb) {
-  this.tracker.completeWork(data.length ? data.length : 1)
-  this.push(data)
-  cb()
-}
-
-TrackerStream.prototype._flush = function (cb) {
-  this.tracker.finish()
-  cb()
-}
-
-delegate(TrackerStream.prototype, 'tracker')
-  .method('completed')
-  .method('addWork')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker.js
deleted file mode 100644
index 68c2339b45409a828054bb6b0d0905913a8f1a9b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/are-we-there-yet/tracker.js
+++ /dev/null
@@ -1,30 +0,0 @@
-'use strict'
-var util = require('util')
-var TrackerBase = require('./tracker-base.js')
-
-var Tracker = module.exports = function (name, todo) {
-  TrackerBase.call(this, name)
-  this.workDone = 0
-  this.workTodo = todo || 0
-}
-util.inherits(Tracker, TrackerBase)
-
-Tracker.prototype.completed = function () {
-  return this.workTodo === 0 ? 0 : this.workDone / this.workTodo
-}
-
-Tracker.prototype.addWork = function (work) {
-  this.workTodo += work
-  this.emit('change', this.name, this.completed(), this)
-}
-
-Tracker.prototype.completeWork = function (work) {
-  this.workDone += work
-  if (this.workDone > this.workTodo) this.workDone = this.workTodo
-  this.emit('change', this.name, this.completed(), this)
-}
-
-Tracker.prototype.finish = function () {
-  this.workTodo = this.workDone = 1
-  this.emit('change', this.name, 1, this)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/LICENSE
deleted file mode 100644
index e756052969b780422bfa99d0bbc6fe2ece45bb74..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/LICENSE
+++ /dev/null
@@ -1,13 +0,0 @@
-Copyright (c) 2014, Rebecca Turner <me@re-becca.org>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/README.md
deleted file mode 100644
index f58cc8d8925060c1408da88318eaf5c1ab99abd3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/README.md
+++ /dev/null
@@ -1,145 +0,0 @@
-# Console Control Strings
-
-A library of cross-platform tested terminal/console command strings for
-doing things like color and cursor positioning.  This is a subset of both
-ansi and vt100.  All control codes included work on both Windows & Unix-like
-OSes, except where noted.
-
-## Usage
-
-```js
-var consoleControl = require('console-control-strings')
-
-console.log(consoleControl.color('blue','bgRed', 'bold') + 'hi there' + consoleControl.color('reset'))
-process.stdout.write(consoleControl.goto(75, 10))
-```
-
-## Why Another?
-
-There are tons of libraries similar to this one.  I wanted one that was:
-
-1. Very clear about compatibility goals.
-2. Could emit, for instance, a start color code without an end one.
-3. Returned strings w/o writing to streams.
-4. Was not weighed down with other unrelated baggage.
-
-## Functions
-
-### var code = consoleControl.up(_num = 1_)
-
-Returns the escape sequence to move _num_ lines up.
-
-### var code = consoleControl.down(_num = 1_)
-
-Returns the escape sequence to move _num_ lines down.
-
-### var code = consoleControl.forward(_num = 1_)
-
-Returns the escape sequence to move _num_ lines righ.
-
-### var code = consoleControl.back(_num = 1_)
-
-Returns the escape sequence to move _num_ lines left.
-
-### var code = consoleControl.nextLine(_num = 1_)
-
-Returns the escape sequence to move _num_ lines down and to the beginning of
-the line.
-
-### var code = consoleControl.previousLine(_num = 1_)
-
-Returns the escape sequence to move _num_ lines up and to the beginning of
-the line.
-
-### var code = consoleControl.eraseData()
-
-Returns the escape sequence to erase everything from the current cursor
-position to the bottom right of the screen.  This is line based, so it
-erases the remainder of the current line and all following lines.
-
-### var code = consoleControl.eraseLine()
-
-Returns the escape sequence to erase to the end of the current line.
-
-### var code = consoleControl.goto(_x_, _y_)
-
-Returns the escape sequence to move the cursor to the designated position. 
-Note that the origin is _1, 1_ not _0, 0_.
-
-### var code = consoleControl.gotoSOL()
-
-Returns the escape sequence to move the cursor to the beginning of the
-current line. (That is, it returns a carriage return, `\r`.)
-
-### var code = consoleControl.beep()
-
-Returns the escape sequence to cause the termianl to beep.  (That is, it
-returns unicode character `\x0007`, a Control-G.)
-
-### var code = consoleControl.hideCursor()
-
-Returns the escape sequence to hide the cursor.
-
-### var code = consoleControl.showCursor()
-
-Returns the escape sequence to show the cursor.
-
-### var code = consoleControl.color(_colors = []_)
-
-### var code = consoleControl.color(_color1_, _color2_, _…_, _colorn_)
-
-Returns the escape sequence to set the current terminal display attributes
-(mostly colors).  Arguments can either be a list of attributes or an array
-of attributes.  The difference between passing in an array or list of colors
-and calling `.color` separately for each one, is that in the former case a
-single escape sequence will be produced where as in the latter each change
-will have its own distinct escape sequence.  Each attribute can be one of:
-
-* Reset:
-  * **reset** – Reset all attributes to the terminal default.
-* Styles:
-  * **bold** – Display text as bold.  In some terminals this means using a
-    bold font, in others this means changing the color.  In some it means
-    both.
-  * **italic** – Display text as italic. This is not available in most Windows terminals.
-  * **underline** – Underline text. This is not available in most Windows Terminals.
-  * **inverse** – Invert the foreground and background colors.
-  * **stopBold** – Do not display text as bold.
-  * **stopItalic** – Do not display text as italic.
-  * **stopUnderline** – Do not underline text.
-  * **stopInverse** – Do not invert foreground and background.
-* Colors:
-  * **white**
-  * **black**
-  * **blue**
-  * **cyan**
-  * **green**
-  * **magenta**
-  * **red**
-  * **yellow**
-  * **grey** / **brightBlack**
-  * **brightRed**
-  * **brightGreen**
-  * **brightYellow**
-  * **brightBlue**
-  * **brightMagenta**
-  * **brightCyan**
-  * **brightWhite**
-* Background Colors:
-  * **bgWhite**
-  * **bgBlack**
-  * **bgBlue**
-  * **bgCyan**
-  * **bgGreen**
-  * **bgMagenta**
-  * **bgRed**
-  * **bgYellow**
-  * **bgGrey** / **bgBrightBlack**
-  * **bgBrightRed**
-  * **bgBrightGreen**
-  * **bgBrightYellow**
-  * **bgBrightBlue**
-  * **bgBrightMagenta**
-  * **bgBrightCyan**
-  * **bgBrightWhite**
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/README.md~ b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/README.md~
deleted file mode 100644
index 6eb34e89d17de0d13bc03e7d42d3d96eb90593b4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/README.md~
+++ /dev/null
@@ -1,140 +0,0 @@
-# Console Control Strings
-
-A library of cross-platform tested terminal/console command strings for
-doing things like color and cursor positioning.  This is a subset of both
-ansi and vt100.  All control codes included work on both Windows & Unix-like
-OSes, except where noted.
-
-## Usage
-
-```js
-var consoleControl = require('console-control-strings')
-
-console.log(consoleControl.color('blue','bgRed', 'bold') + 'hi there' + consoleControl.color('reset'))
-process.stdout.write(consoleControl.goto(75, 10))
-```
-
-## Why Another?
-
-There are tons of libraries similar to this one.  I wanted one that was:
-
-1. Very clear about compatibility goals.
-2. Could emit, for instance, a start color code without an end one.
-3. Returned strings w/o writing to streams.
-4. Was not weighed down with other unrelated baggage.
-
-## Functions
-
-### var code = consoleControl.up(_num = 1_)
-
-Returns the escape sequence to move _num_ lines up.
-
-### var code = consoleControl.down(_num = 1_)
-
-Returns the escape sequence to move _num_ lines down.
-
-### var code = consoleControl.forward(_num = 1_)
-
-Returns the escape sequence to move _num_ lines righ.
-
-### var code = consoleControl.back(_num = 1_)
-
-Returns the escape sequence to move _num_ lines left.
-
-### var code = consoleControl.nextLine(_num = 1_)
-
-Returns the escape sequence to move _num_ lines down and to the beginning of
-the line.
-
-### var code = consoleControl.previousLine(_num = 1_)
-
-Returns the escape sequence to move _num_ lines up and to the beginning of
-the line.
-
-### var code = consoleControl.eraseData()
-
-Returns the escape sequence to erase everything from the current cursor
-position to the bottom right of the screen.  This is line based, so it
-erases the remainder of the current line and all following lines.
-
-### var code = consoleControl.eraseLine()
-
-Returns the escape sequence to erase to the end of the current line.
-
-### var code = consoleControl.goto(_x_, _y_)
-
-Returns the escape sequence to move the cursor to the designated position. 
-Note that the origin is _1, 1_ not _0, 0_.
-
-### var code = consoleControl.gotoSOL()
-
-Returns the escape sequence to move the cursor to the beginning of the
-current line. (That is, it returns a carriage return, `\r`.)
-
-### var code = consoleControl.hideCursor()
-
-Returns the escape sequence to hide the cursor.
-
-### var code = consoleControl.showCursor()
-
-Returns the escape sequence to show the cursor.
-
-### var code = consoleControl.color(_colors = []_)
-
-### var code = consoleControl.color(_color1_, _color2_, _…_, _colorn_)
-
-Returns the escape sequence to set the current terminal display attributes
-(mostly colors).  Arguments can either be a list of attributes or an array
-of attributes.  The difference between passing in an array or list of colors
-and calling `.color` separately for each one, is that in the former case a
-single escape sequence will be produced where as in the latter each change
-will have its own distinct escape sequence.  Each attribute can be one of:
-
-* Reset:
-  * **reset** – Reset all attributes to the terminal default.
-* Styles:
-  * **bold** – Display text as bold.  In some terminals this means using a
-    bold font, in others this means changing the color.  In some it means
-    both.
-  * **italic** – Display text as italic. This is not available in most Windows terminals.
-  * **underline** – Underline text. This is not available in most Windows Terminals.
-  * **inverse** – Invert the foreground and background colors.
-  * **stopBold** – Do not display text as bold.
-  * **stopItalic** – Do not display text as italic.
-  * **stopUnderline** – Do not underline text.
-  * **stopInverse** – Do not invert foreground and background.
-* Colors:
-  * **white**
-  * **black**
-  * **blue**
-  * **cyan**
-  * **green**
-  * **magenta**
-  * **red**
-  * **yellow**
-  * **grey** / **brightBlack**
-  * **brightRed**
-  * **brightGreen**
-  * **brightYellow**
-  * **brightBlue**
-  * **brightMagenta**
-  * **brightCyan**
-  * **brightWhite**
-* Background Colors:
-  * **bgWhite**
-  * **bgBlack**
-  * **bgBlue**
-  * **bgCyan**
-  * **bgGreen**
-  * **bgMagenta**
-  * **bgRed**
-  * **bgYellow**
-  * **bgGrey** / **bgBrightBlack**
-  * **bgBrightRed**
-  * **bgBrightGreen**
-  * **bgBrightYellow**
-  * **bgBrightBlue**
-  * **bgBrightMagenta**
-  * **bgBrightCyan**
-  * **bgBrightWhite**
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/index.js
deleted file mode 100644
index bf890348ec6e35c1fc56df0df9bcdd0fe01fa3d5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/index.js
+++ /dev/null
@@ -1,125 +0,0 @@
-'use strict'
-
-// These tables borrowed from `ansi`
-
-var prefix = '\x1b['
-
-exports.up = function up (num) {
-  return prefix + (num || '') + 'A'
-}
-
-exports.down = function down (num) {
-  return prefix + (num || '') + 'B'
-}
-
-exports.forward = function forward (num) {
-  return prefix + (num || '') + 'C'
-}
-
-exports.back = function back (num) {
-  return prefix + (num || '') + 'D'
-}
-
-exports.nextLine = function nextLine (num) {
-  return prefix + (num || '') + 'E'
-}
-
-exports.previousLine = function previousLine (num) {
-  return prefix + (num || '') + 'F'
-}
-
-exports.horizontalAbsolute = function horizontalAbsolute (num) {
-  if (num == null) throw new Error('horizontalAboslute requires a column to position to')
-  return prefix + num + 'G'
-}
-
-exports.eraseData = function eraseData () {
-  return prefix + 'J'
-}
-
-exports.eraseLine = function eraseLine () {
-  return prefix + 'K'
-}
-
-exports.goto = function (x, y) {
-  return prefix + y + ';' + x + 'H'
-}
-
-exports.gotoSOL = function () {
-  return '\r'
-}
-
-exports.beep = function () {
-  return '\x07'
-}
-
-exports.hideCursor = function hideCursor () {
-  return prefix + '?25l'
-}
-
-exports.showCursor = function showCursor () {
-  return prefix + '?25h'
-}
-
-var colors = {
-  reset: 0,
-// styles
-  bold: 1,
-  italic: 3,
-  underline: 4,
-  inverse: 7,
-// resets
-  stopBold: 22,
-  stopItalic: 23,
-  stopUnderline: 24,
-  stopInverse: 27,
-// colors
-  white: 37,
-  black: 30,
-  blue: 34,
-  cyan: 36,
-  green: 32,
-  magenta: 35,
-  red: 31,
-  yellow: 33,
-  bgWhite: 47,
-  bgBlack: 40,
-  bgBlue: 44,
-  bgCyan: 46,
-  bgGreen: 42,
-  bgMagenta: 45,
-  bgRed: 41,
-  bgYellow: 43,
-
-  grey: 90,
-  brightBlack: 90,
-  brightRed: 91,
-  brightGreen: 92,
-  brightYellow: 93,
-  brightBlue: 94,
-  brightMagenta: 95,
-  brightCyan: 96,
-  brightWhite: 97,
-
-  bgGrey: 100,
-  bgBrightBlack: 100,
-  bgBrightRed: 101,
-  bgBrightGreen: 102,
-  bgBrightYellow: 103,
-  bgBrightBlue: 104,
-  bgBrightMagenta: 105,
-  bgBrightCyan: 106,
-  bgBrightWhite: 107
-}
-
-exports.color = function color (colorWith) {
-  if (arguments.length !== 1 || !Array.isArray(colorWith)) {
-    colorWith = Array.prototype.slice.call(arguments)
-  }
-  return prefix + colorWith.map(colorNameToCode).join(';') + 'm'
-}
-
-function colorNameToCode (color) {
-  if (colors[color] != null) return colors[color]
-  throw new Error('Unknown color or style name: ' + color)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/package.json
deleted file mode 100644
index aa445fd8b1bd122c1bced39c14bdfedb48855979..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/console-control-strings/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "_from": "console-control-strings@>=1.1.0 <1.2.0",
-  "_id": "console-control-strings@1.1.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/console-control-strings",
-  "_nodeVersion": "4.4.0",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/console-control-strings-1.1.0.tgz_1466033396831_0.9470485949423164"
-  },
-  "_npmUser": {
-    "email": "me@re-becca.org",
-    "name": "iarna"
-  },
-  "_npmVersion": "3.9.2",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog",
-    "/serialport/node-pre-gyp/npmlog/gauge"
-  ],
-  "_resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-  "_shasum": "3d7cf4464db6446ea644bf4b39507f9851008e8e",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "me@re-becca.org",
-    "name": "Rebecca Turner",
-    "url": "http://re-becca.org/"
-  },
-  "bugs": {
-    "url": "https://github.com/iarna/console-control-strings/issues"
-  },
-  "dependencies": {},
-  "description": "A library of cross-platform tested terminal/console command strings for doing things like color and cursor positioning.  This is a subset of both ansi and vt100.  All control codes included work on both Windows & Unix-like OSes, except where noted.",
-  "devDependencies": {
-    "standard": "^7.1.2",
-    "tap": "^5.7.2"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "dist": {
-    "shasum": "3d7cf4464db6446ea644bf4b39507f9851008e8e",
-    "tarball": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz"
-  },
-  "files": [
-    "LICENSE",
-    "index.js"
-  ],
-  "gitHead": "722439b4998d2964ac3d3f9ec175c008aa9b7b4b",
-  "homepage": "https://github.com/iarna/console-control-strings#readme",
-  "keywords": [],
-  "license": "ISC",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "iarna",
-      "email": "me@re-becca.org"
-    }
-  ],
-  "name": "console-control-strings",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/iarna/console-control-strings.git"
-  },
-  "scripts": {
-    "test": "standard && tap test/*.js"
-  },
-  "version": "1.1.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/CHANGELOG.md
deleted file mode 100644
index efd08fc7c19dd763e13f5abddfbc9770aa0452c7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/CHANGELOG.md
+++ /dev/null
@@ -1,131 +0,0 @@
-### v2.6.0
-
-* Bug fix: Don't run the code associated with `enable`/`disable` if the gauge
-  is already enabled or disabled respectively.  This prevents leaking event
-  listeners, amongst other weirdness.
-* New feature: Template items can have default values that will be used if no
-  value was otherwise passed in.
-
-### v2.5.3
-
-* Default to `enabled` only if we have a tty.  Users can always override
-  this by passing in the `enabled` option explicitly or by calling calling
-  `gauge.enable()`.
-
-### v2.5.2
-
-* Externalized `./console-strings.js` into `console-control-strings`.
-
-### v2.5.1
-
-* Update to `signal-exit@3.0.0`, which fixes a compatibility bug with the
-  node profiler.
-* [#39](https://github.com/iarna/gauge/pull/39) Fix tests on 0.10 and add
-  a missing devDependency. ([@helloyou2012](https://github.com/helloyou2012))
-
-### v2.5.0
-
-* Add way to programmatically fetch a list of theme names in a themeset
-  (`Themeset.getThemeNames`).
-
-### v2.4.0
-
-* Add support for setting themesets on existing gauge objects.
-* Add post-IO callback to `gauge.hide()` as it is somtetimes necessary when
-  your terminal is interleaving output from multiple filehandles (ie, stdout
-  & stderr).
-
-### v2.3.1
-
-* Fix a refactor bug in setTheme where it wasn't accepting the various types
-  of args it should.
-
-### v2.3.0
-
-#### FEATURES
-
-* Add setTemplate & setTheme back in.
-* Add support for named themes, you can now ask for things like 'colorASCII'
-  and 'brailleSpinner'.  Of course, you can still pass in theme objects.
-  Additionally you can now pass in an object with `hasUnicode`, `hasColor` and
-  `platform` keys in order to override our guesses as to those values when
-  selecting a default theme from the themeset.
-* Make the output stream optional (it defaults to `process.stderr` now).
-* Add `setWriteTo(stream[, tty])` to change the output stream and,
-  optionally, tty.
-
-#### BUG FIXES & REFACTORING
-
-* Abort the display phase early if we're supposed to be hidden and we are.
-* Stop printing a bunch of spaces at the end of lines, since we're already
-  using an erase-to-end-of-line code anyway.
-* The unicode themes were missing the subsection separator.
-
-### v2.2.1
-
-* Fix image in readme
-
-### v2.2.0
-
-* All new themes API– reference themes by name and pass in custom themes and
-  themesets (themesets get platform support autodetection done on them to
-  select the best theme).  Theme mixins let you add features to all existing
-  themes.
-* Much, much improved test coverage.
-
-### v2.1.0
-
-* Got rid of ░ in the default platform, noUnicode, hasColor theme.  Thanks
-  to @yongtw123 for pointing out this had snuck in.
-* Fiddled with the demo output to make it easier to see the spinner spin. Also
-  added prints before each platforms test output.
-* I forgot to include `signal-exit` in our deps.  <.< Thank you @KenanY for
-  finding this. Then I was lazy and made a new commit instead of using his
-  PR. Again, thank you for your patience @KenenY.
-* Drastically speed up travis testing.
-* Add a small javascript demo (demo.js) for showing off the various themes
-  (and testing them on diff platforms).
-* Change: The subsection separator from ⁄ and / (different chars) to >.
-* Fix crasher: A show or pulse without a label would cause the template renderer
-  to complain about a missing value.
-* New feature: Add the ability to disable the clean-up-on-exit behavior.
-  Not something I expect to be widely desirable, but important if you have
-  multiple distinct gauge instances in your app.
-* Use our own color support detection.
-  The `has-color` module proved too magic for my needs, making assumptions
-  as to which stream we write to and reading command line arguments.
-
-### v2.0.0
-
-This is a major rewrite of the internals.  Externally there are fewer
-changes:
-
-* On node>0.8 gauge object now prints updates at a fixed rate.  This means
-  that when you call `show` it may wate up to `updateInterval` ms before it
-  actually prints an update.  You override this behavior with the
-  `fixedFramerate` option.
-* The gauge object now keeps the cursor hidden as long as it's enabled and
-  shown.
-* The constructor's arguments have changed, now it takes a mandatory output
-  stream and an optional options object.  The stream no longer needs to be
-  an `ansi`ified stream, although it can be if you want (but we won't make
-  use of its special features).
-* Previously the gauge was disabled by default if `process.stdout` wasn't a
-  tty.  Now it always defaults to enabled.  If you want the previous
-  behavior set the `enabled` option to `process.stdout.isTTY`.
-* The constructor's options have changed– see the docs for details.
-* Themes are entirely different.  If you were using a custom theme, or
-  referring to one directly (eg via `Gauge.unicode` or `Gauge.ascii`) then
-  you'll need to change your code.  You can get the equivalent of the latter
-  with:
-  ```
-  var themes = require('gauge/themes')
-  var unicodeTheme = themes(true, true) // returns the color unicode theme for your platform
-  ```
-  The default themes no longer use any ambiguous width characters, so even
-  if you choose to display those as wide your progress bar should still
-  display correctly.
-* Templates are entirely different and if you were using a custom one, you
-  should consult the documentation to learn how to recreate it.  If you were
-  using the default, be aware that it has changed and the result looks quite
-  a bit different.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/CHANGELOG.md~ b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/CHANGELOG.md~
deleted file mode 100644
index a4c875660840a0bb761063a51c2e7e4f5b2c3d60..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/CHANGELOG.md~
+++ /dev/null
@@ -1,123 +0,0 @@
-### v2.5.3
-
-* Default to `enabled` only if we have a tty.  Users can always override
-  this by passing in the `enabled` option explicitly or by calling calling
-  `gauge.enable()`.
-
-### v2.5.2
-
-* Externalized `./console-strings.js` into `console-control-strings`.
-
-### v2.5.1
-
-* Update to `signal-exit@3.0.0`, which fixes a compatibility bug with the
-  node profiler.
-* [#39](https://github.com/iarna/gauge/pull/39) Fix tests on 0.10 and add
-  a missing devDependency. ([@helloyou2012](https://github.com/helloyou2012))
-
-### v2.5.0
-
-* Add way to programmatically fetch a list of theme names in a themeset
-  (`Themeset.getThemeNames`).
-
-### v2.4.0
-
-* Add support for setting themesets on existing gauge objects.
-* Add post-IO callback to `gauge.hide()` as it is somtetimes necessary when
-  your terminal is interleaving output from multiple filehandles (ie, stdout
-  & stderr).
-
-### v2.3.1
-
-* Fix a refactor bug in setTheme where it wasn't accepting the various types
-  of args it should.
-
-### v2.3.0
-
-#### FEATURES
-
-* Add setTemplate & setTheme back in.
-* Add support for named themes, you can now ask for things like 'colorASCII'
-  and 'brailleSpinner'.  Of course, you can still pass in theme objects.
-  Additionally you can now pass in an object with `hasUnicode`, `hasColor` and
-  `platform` keys in order to override our guesses as to those values when
-  selecting a default theme from the themeset.
-* Make the output stream optional (it defaults to `process.stderr` now).
-* Add `setWriteTo(stream[, tty])` to change the output stream and,
-  optionally, tty.
-
-#### BUG FIXES & REFACTORING
-
-* Abort the display phase early if we're supposed to be hidden and we are.
-* Stop printing a bunch of spaces at the end of lines, since we're already
-  using an erase-to-end-of-line code anyway.
-* The unicode themes were missing the subsection separator.
-
-### v2.2.1
-
-* Fix image in readme
-
-### v2.2.0
-
-* All new themes API– reference themes by name and pass in custom themes and
-  themesets (themesets get platform support autodetection done on them to
-  select the best theme).  Theme mixins let you add features to all existing
-  themes.
-* Much, much improved test coverage.
-
-### v2.1.0
-
-* Got rid of ░ in the default platform, noUnicode, hasColor theme.  Thanks
-  to @yongtw123 for pointing out this had snuck in.
-* Fiddled with the demo output to make it easier to see the spinner spin. Also
-  added prints before each platforms test output.
-* I forgot to include `signal-exit` in our deps.  <.< Thank you @KenanY for
-  finding this. Then I was lazy and made a new commit instead of using his
-  PR. Again, thank you for your patience @KenenY.
-* Drastically speed up travis testing.
-* Add a small javascript demo (demo.js) for showing off the various themes
-  (and testing them on diff platforms).
-* Change: The subsection separator from ⁄ and / (different chars) to >.
-* Fix crasher: A show or pulse without a label would cause the template renderer
-  to complain about a missing value.
-* New feature: Add the ability to disable the clean-up-on-exit behavior.
-  Not something I expect to be widely desirable, but important if you have
-  multiple distinct gauge instances in your app.
-* Use our own color support detection.
-  The `has-color` module proved too magic for my needs, making assumptions
-  as to which stream we write to and reading command line arguments.
-
-### v2.0.0
-
-This is a major rewrite of the internals.  Externally there are fewer
-changes:
-
-* On node>0.8 gauge object now prints updates at a fixed rate.  This means
-  that when you call `show` it may wate up to `updateInterval` ms before it
-  actually prints an update.  You override this behavior with the
-  `fixedFramerate` option.
-* The gauge object now keeps the cursor hidden as long as it's enabled and
-  shown.
-* The constructor's arguments have changed, now it takes a mandatory output
-  stream and an optional options object.  The stream no longer needs to be
-  an `ansi`ified stream, although it can be if you want (but we won't make
-  use of its special features).
-* Previously the gauge was disabled by default if `process.stdout` wasn't a
-  tty.  Now it always defaults to enabled.  If you want the previous
-  behavior set the `enabled` option to `process.stdout.isTTY`.
-* The constructor's options have changed– see the docs for details.
-* Themes are entirely different.  If you were using a custom theme, or
-  referring to one directly (eg via `Gauge.unicode` or `Gauge.ascii`) then
-  you'll need to change your code.  You can get the equivalent of the latter
-  with:
-  ```
-  var themes = require('gauge/themes')
-  var unicodeTheme = themes(true, true) // returns the color unicode theme for your platform
-  ```
-  The default themes no longer use any ambiguous width characters, so even
-  if you choose to display those as wide your progress bar should still
-  display correctly.
-* Templates are entirely different and if you were using a custom one, you
-  should consult the documentation to learn how to recreate it.  If you were
-  using the default, be aware that it has changed and the result looks quite
-  a bit different.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/LICENSE
deleted file mode 100644
index e756052969b780422bfa99d0bbc6fe2ece45bb74..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/LICENSE
+++ /dev/null
@@ -1,13 +0,0 @@
-Copyright (c) 2014, Rebecca Turner <me@re-becca.org>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/README.md
deleted file mode 100644
index bf87d189f1b5c12d0eb82fa61bf4ef528c639cf9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/README.md
+++ /dev/null
@@ -1,395 +0,0 @@
-gauge
-=====
-
-A nearly stateless terminal based horizontal gauge / progress bar.
-
-```javascript
-var Gauge = require("gauge")
-
-var gauge = new Gauge()
-
-gauge.show("test", 0.20)
-
-gauge.pulse("this")
-
-gauge.hide()
-```
-
-![](gauge-demo.gif)
-
-
-### CHANGES FROM 1.x
-
-Gauge 2.x is breaking release, please see the [changelog] for details on
-what's changed if you were previously a user of this module.
-
-[changelog]: CHANGELOG.md
-
-### THE GAUGE CLASS
-
-This is the typical interface to the module– it provides a pretty
-fire-and-forget interface to displaying your status information.
-
-```
-var Gauge = require("gauge")
-
-var gauge = new Gauge([stream], [options])
-```
-
-* **stream** – *(optional, default STDERR)* A stream that progress bar
-  updates are to be written to.  Gauge honors backpressure and will pause
-  most writing if it is indicated.
-* **options** – *(optional)* An option object.
-
-Constructs a new gauge. Gauges are drawn on a single line, and are not drawn
-if **stream** isn't a tty and a tty isn't explicitly provided.
-
-If **stream** is a terminal or if you pass in **tty** to **options** then we
-will detect terminal resizes and redraw to fit.  We do this by watching for
-`resize` events on the tty.  (To work around a bug in verisons of Node prior
-to 2.5.0, we watch for them on stdout if the tty is stderr.) Resizes to
-larger window sizes will be clean, but shrinking the window will always
-result in some cruft.
-
-**IMPORTANT:** If you prevously were passing in a non-tty stream but you still
-want output (for example, a stream wrapped by the `ansi` module) then you
-need to pass in the **tty** option below, as `gauge` needs access to
-the underlying tty in order to do things like terminal resizes and terminal
-width detection.
-
-The **options** object can have the following properties, all of which are
-optional:
-
-* **updateInterval**: How often gauge updates should be drawn, in miliseconds.
-* **fixedFramerate**: Defaults to false on node 0.8, true on everything
-  else.  When this is true a timer is created to trigger once every
-  `updateInterval` ms, when false, updates are printed as soon as they come
-  in but updates more often than `updateInterval` are ignored.  The reason
-  0.8 doesn't have this set to true is that it can't `unref` its timer and
-  so it would stop your program from exiting– if you want to use this
-  feature with 0.8 just make sure you call `gauge.disable()` before you
-  expect your program to exit.
-* **themes**: A themeset to use when selecting the theme to use. Defaults
-  to `gauge/themes`, see the [themes] documentation for details.
-* **theme**: Select a theme for use, it can be a:
-  * Theme object, in which case the **themes** is not used.
-  * The name of a theme, which will be looked up in the current *themes*
-    object.
-  * A configuration object with any of `hasUnicode`, `hasColor` or
-    `platform` keys, which if wlll be used to override our guesses when making
-    a default theme selection.
-
-  If no theme is selected then a default is picked using a combination of our
-  best guesses at your OS, color support and unicode support.
-* **template**: Describes what you want your gauge to look like.  The
-  default is what npm uses.  Detailed [documentation] is later in this
-  document.
-* **hideCursor**: Defaults to true.  If true, then the cursor will be hidden
-  while the gauge is displayed.
-* **tty**: The tty that you're ultimately writing to.  Defaults to the same
-  as **stream**.  This is used for detecting the width of the terminal and
-  resizes. The width used is `tty.columns - 1`. If no tty is available then
-  a width of `79` is assumed.
-* **enabled**: Defaults to true if `tty` is a TTY, false otherwise.  If true
-  the gauge starts enabled.  If disabled then all update commands are
-  ignored and no gauge will be printed until you call `.enable()`.
-* **Plumbing**: The class to use to actually generate the gauge for
-  printing.  This defaults to `require('gauge/plumbing')` and ordinarly you
-  shouldn't need to override this.
-* **cleanupOnExit**: Defaults to true. Ordinarily we register an exit
-  handler to make sure your cursor is turned back on and the progress bar
-  erased when your process exits, even if you Ctrl-C out or otherwise exit
-  unexpectedly. You can disable this and it won't register the exit handler.
-
-[has-unicode]: https://www.npmjs.com/package/has-unicode
-[themes]: #themes
-[documentation]: #templates
-
-#### `gauge.show(section | status, [completed])`
-
-The first argument is either the section, the name of the current thing
-contributing to progress, or an object with keys like **section**,
-**subsection** & **completed** (or any others you have types for in a custom
-template).  If you don't want to update or set any of these you can pass
-`null` and it will be ignored.
-
-The second argument is the percent completed as a value between 0 and 1.
-Without it, completion is just not updated. You'll also note that completion
-can be passed in as part of a status object as the first argument. If both
-it and the completed argument are passed in, the completed argument wins.
-
-#### `gauge.hide([cb])`
-
-Removes the gauge from the terminal.  Optionally, callback `cb` after IO has
-had an opportunity to happen (currently this just means after `setImmediate`
-has called back.)
-
-It turns out this is important when you're pausing the progress bar on one
-filehandle and printing to another– otherwise (with a big enough print) node
-can end up printing the "end progress bar" bits to the progress bar filehandle
-while other stuff is printing to another filehandle. These getting interleaved
-can cause corruption in some terminals.
-
-#### `gauge.pulse([subsection])`
-
-* **subsection** – *(optional)* The specific thing that triggered this pulse
-
-Spins the spinner in the gauge to show output.  If **subsection** is
-included then it will be combined with the last name passed to `gauge.show`.
-
-#### `gauge.disable()`
-
-Hides the gauge and ignores further calls to `show` or `pulse`.
-
-#### `gauge.enable()`
-
-Shows the gauge and resumes updating when `show` or `pulse` is called.
-
-#### `gauge.setThemeset(themes)`
-
-Change the themeset to select a theme from. The same as the `themes` option
-used in the constructor. The theme will be reselected from this themeset.
-
-#### `gauge.setTheme(theme)`
-
-Change the active theme, will be displayed with the next show or pulse. This can be:
-
-* Theme object, in which case the **themes** is not used.
-* The name of a theme, which will be looked up in the current *themes*
-  object.
-* A configuration object with any of `hasUnicode`, `hasColor` or
-  `platform` keys, which if wlll be used to override our guesses when making
-  a default theme selection.
-
-If no theme is selected then a default is picked using a combination of our
-best guesses at your OS, color support and unicode support.
-
-#### `gauge.setTemplate(template)`
-
-Change the active template, will be displayed with the next show or pulse
-
-### Tracking Completion
-
-If you have more than one thing going on that you want to track completion
-of, you may find the related [are-we-there-yet] helpful.  It's `change`
-event can be wired up to the `show` method to get a more traditional
-progress bar interface.
-
-[are-we-there-yet]: https://www.npmjs.com/package/are-we-there-yet
-
-### THEMES
-
-```
-var themes = require('gauge/themes')
-
-// fetch the default color unicode theme for this platform
-var ourTheme = themes({hasUnicode: true, hasColor: true})
-
-// fetch the default non-color unicode theme for osx
-var ourTheme = themes({hasUnicode: true, hasColor: false, platform: 'darwin'})
-
-// create a new theme based on the color ascii theme for this platform
-// that brackets the progress bar with arrows
-var ourTheme = themes.newTheme(theme(hasUnicode: false, hasColor: true}), {
-  preProgressbar: '→',
-  postProgressbar: '←'
-})
-```
-
-The object returned by `gauge/themes` is an instance of the `ThemeSet` class.
-
-```
-var ThemeSet = require('gauge/theme-set')
-var themes = new ThemeSet()
-// or
-var themes = require('gauge/themes')
-var mythemes = themes.newThemeset() // creates a new themeset based on the default themes
-```
-
-#### themes(opts)
-#### themes.getDefault(opts)
-
-Theme objects are a function that fetches the default theme based on
-platform, unicode and color support.
-
-Options is an object with the following properties:
-
-* **hasUnicode** - If true, fetch a unicode theme, if no unicode theme is
-  available then a non-unicode theme will be used.
-* **hasColor** - If true, fetch a color theme, if no color theme is
-  available a non-color theme will be used.
-* **platform** (optional) - Defaults to `process.platform`.  If no
-  platform match is available then `fallback` is used instead.
-
-If no compatible theme can be found then an error will be thrown with a
-`code` of `EMISSINGTHEME`.
-
-#### themes.addTheme(themeName, themeObj)
-#### themes.addTheme(themeName, [parentTheme], newTheme)
-
-Adds a named theme to the themeset.  You can pass in either a theme object,
-as returned by `themes.newTheme` or the arguments you'd pass to
-`themes.newTheme`.
-
-#### themes.getThemeNames()
-
-Return a list of all of the names of the themes in this themeset. Suitable
-for use in `themes.getTheme(…)`.
-
-#### themes.getTheme(name)
-
-Returns the theme object from this theme set named `name`.
-
-If `name` does not exist in this themeset an error will be thrown with
-a `code` of `EMISSINGTHEME`.
-
-#### themes.setDefault([opts], themeName)
-
-`opts` is an object with the following properties.
-
-* **platform** - Defaults to `'fallback'`.  If your theme is platform
-  specific, specify that here with the platform from `process.platform`, eg,
-  `win32`, `darwin`, etc.
-* **hasUnicode** - Defaults to `false`. If your theme uses unicode you
-  should set this to true.
-* **hasColor** - Defaults to `false`.  If your theme uses color you should
-  set this to true.
-
-`themeName` is the name of the theme (as given to `addTheme`) to use for
-this set of `opts`.
-
-#### themes.newTheme([parentTheme,] newTheme)
-
-Create a new theme object based on `parentTheme`.  If no `parentTheme` is
-provided then a minimal parentTheme that defines functions for rendering the
-activity indicator (spinner) and progress bar will be defined. (This
-fallback parent is defined in `gauge/base-theme`.)
-
-newTheme should be a bare object– we'll start by discussing the properties
-defined by the default themes:
-
-* **preProgressbar** - displayed prior to the progress bar, if the progress
-  bar is displayed.
-* **postProgressbar** - displayed after the progress bar, if the progress bar
-  is displayed.
-* **progressBarTheme** - The subtheme passed through to the progress bar
-  renderer, it's an object with `complete` and `remaining` properties
-  that are the strings you want repeated for those sections of the progress
-  bar.
-* **activityIndicatorTheme** - The theme for the activity indicator (spinner),
-  this can either be a string, in which each character is a different step, or
-  an array of strings.
-* **preSubsection** - Displayed as a separator between the `section` and
-  `subsection` when the latter is printed.
-
-More generally, themes can have any value that would be a valid value when rendering
-templates. The properties in the theme are used when their name matches a type in
-the template. Their values can be:
-
-* **strings & numbers** - They'll be included as is
-* **function (values, theme, width)** - Should return what you want in your output.
-  *values* is an object with values provided via `gauge.show`,
-  *theme* is the theme specific to this item (see below) or this theme object,
-  and *width* is the number of characters wide your result should be.
-
-There are a couple of special prefixes:
-
-* **pre** - Is shown prior to the property, if its displayed.
-* **post** - Is shown after the property, if its displayed.
-
-And one special suffix:
-
-* **Theme** - Its value is passed to a function-type item as the theme.
-
-#### themes.addToAllThemes(theme)
-
-This *mixes-in* `theme` into all themes currently defined. It also adds it
-to the default parent theme for this themeset, so future themes added to
-this themeset will get the values from `theme` by default.
-
-#### themes.newThemeset()
-
-Copy the current themeset into a new one.  This allows you to easily inherit
-one themeset from another.
-
-### TEMPLATES
-
-A template is an array of objects and strings that, after being evaluated,
-will be turned into the gauge line.  The default template is:
-
-```javascript
-[
-    {type: 'progressbar', length: 20},
-    {type: 'activityIndicator', kerning: 1, length: 1},
-    {type: 'section', kerning: 1, default: ''},
-    {type: 'subsection', kerning: 1, default: ''}
-]
-```
-
-The various template elements can either be **plain strings**, in which case they will
-be be included verbatum in the output, or objects with the following properties:
-
-* *type* can be any of the following plus any keys you pass into `gauge.show` plus
-  any keys you have on a custom theme.
-  * `section` – What big thing you're working on now.
-  * `subsection` – What component of that thing is currently working.
-  * `activityIndicator` – Shows a spinner using the `activityIndicatorTheme`
-    from your active theme.
-  * `progressbar` – A progress bar representing your current `completed`
-    using the `progressbarTheme` from your active theme.
-* *kerning* – Number of spaces that must be between this item and other
-  items, if this item is displayed at all.
-* *maxLength* – The maximum length for this element. If its value is longer it
-  will be truncated.
-* *minLength* – The minimum length for this element. If its value is shorter it
-  will be padded according to the *align* value.
-* *align* – (Default: left) Possible values "left", "right" and "center". Works
-  as you'd expect from word processors.
-* *length* – Provides a single value for both *minLength* and *maxLength*. If both
-  *length* and *minLength or *maxLength* are specifed then the latter take precedence.
-* *value* – A literal value to use for this template item.
-* *default* – A default value to use for this template item if a value
-  wasn't otherwise passed in.
-
-### PLUMBING
-
-This is the super simple, assume nothing, do no magic internals used by gauge to
-implement its ordinary interface.
-
-```
-var Plumbing = require('gauge/plumbing')
-var gauge = new Plumbing(theme, template, width)
-```
-
-* **theme**: The theme to use.
-* **template**: The template to use.
-* **width**: How wide your gauge should be
-
-#### `gauge.setTheme(theme)`
-
-Change the active theme.
-
-#### `gauge.setTemplate(template)`
-
-Change the active template.
-
-#### `gauge.setWidth(width)`
-
-Change the width to render at.
-
-#### `gauge.hide()`
-
-Return the string necessary to hide the progress bar
-
-#### `gauge.hideCursor()`
-
-Return a string to hide the cursor.
-
-#### `gauge.showCursor()`
-
-Return a string to show the cursor.
-
-#### `gauge.show(status)`
-
-Using `status` for values, render the provided template with the theme and return
-a string that is suitable for printing to update the gauge.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/README.md~ b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/README.md~
deleted file mode 100644
index 171e337babbd372464318769e09469acea8a002c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/README.md~
+++ /dev/null
@@ -1,393 +0,0 @@
-gauge
-=====
-
-A nearly stateless terminal based horizontal gauge / progress bar.
-
-```javascript
-var Gauge = require("gauge")
-
-var gauge = new Gauge()
-
-gauge.show("test", 0.20)
-
-gauge.pulse("this")
-
-gauge.hide()
-```
-
-![](gauge-demo.gif)
-
-
-### CHANGES FROM 1.x
-
-Gauge 2.x is breaking release, please see the [changelog] for details on
-what's changed if you were previously a user of this module.
-
-[changelog]: CHANGELOG.md
-
-### THE GAUGE CLASS
-
-This is the typical interface to the module– it provides a pretty
-fire-and-forget interface to displaying your status information.
-
-```
-var Gauge = require("gauge")
-
-var gauge = new Gauge([stream], [options])
-```
-
-* **stream** – *(optional, default STDERR)* A stream that progress bar
-  updates are to be written to.  Gauge honors backpressure and will pause
-  most writing if it is indicated.
-* **options** – *(optional)* An option object.
-
-Constructs a new gauge. Gauges are drawn on a single line, and are not drawn
-if **stream** isn't a tty and a tty isn't explicitly provided.
-
-If **stream** is a terminal or if you pass in **tty** to **options** then we
-will detect terminal resizes and redraw to fit.  We do this by watching for
-`resize` events on the tty.  (To work around a bug in verisons of Node prior
-to 2.5.0, we watch for them on stdout if the tty is stderr.) Resizes to
-larger window sizes will be clean, but shrinking the window will always
-result in some cruft.
-
-**IMPORTANT:** If you prevously were passing in a non-tty stream but you still
-want output (for example, a stream wrapped by the `ansi` module) then you
-need to pass in the **tty** option below, as `gauge` needs access to
-the underlying tty in order to do things like terminal resizes and terminal
-width detection.
-
-The **options** object can have the following properties, all of which are
-optional:
-
-* **updateInterval**: How often gauge updates should be drawn, in miliseconds.
-* **fixedFramerate**: Defaults to false on node 0.8, true on everything
-  else.  When this is true a timer is created to trigger once every
-  `updateInterval` ms, when false, updates are printed as soon as they come
-  in but updates more often than `updateInterval` are ignored.  The reason
-  0.8 doesn't have this set to true is that it can't `unref` its timer and
-  so it would stop your program from exiting– if you want to use this
-  feature with 0.8 just make sure you call `gauge.disable()` before you
-  expect your program to exit.
-* **themes**: A themeset to use when selecting the theme to use. Defaults
-  to `gauge/themes`, see the [themes] documentation for details.
-* **theme**: Select a theme for use, it can be a:
-  * Theme object, in which case the **themes** is not used.
-  * The name of a theme, which will be looked up in the current *themes*
-    object.
-  * A configuration object with any of `hasUnicode`, `hasColor` or
-    `platform` keys, which if wlll be used to override our guesses when making
-    a default theme selection.
-
-  If no theme is selected then a default is picked using a combination of our
-  best guesses at your OS, color support and unicode support.
-* **template**: Describes what you want your gauge to look like.  The
-  default is what npm uses.  Detailed [documentation] is later in this
-  document.
-* **hideCursor**: Defaults to true.  If true, then the cursor will be hidden
-  while the gauge is displayed.
-* **tty**: The tty that you're ultimately writing to.  Defaults to the same
-  as **stream**.  This is used for detecting the width of the terminal and
-  resizes. The width used is `tty.columns - 1`. If no tty is available then
-  a width of `79` is assumed.
-* **enabled**: Defaults to true if `tty` is a TTY, false otherwise.  If true
-  the gauge starts enabled.  If disabled then all update commands are
-  ignored and no gauge will be printed until you call `.enable()`.
-* **Plumbing**: The class to use to actually generate the gauge for
-  printing.  This defaults to `require('gauge/plumbing')` and ordinarly you
-  shouldn't need to override this.
-* **cleanupOnExit**: Defaults to true. Ordinarily we register an exit
-  handler to make sure your cursor is turned back on and the progress bar
-  erased when your process exits, even if you Ctrl-C out or otherwise exit
-  unexpectedly. You can disable this and it won't register the exit handler.
-
-[has-unicode]: https://www.npmjs.com/package/has-unicode
-[themes]: #themes
-[documentation]: #templates
-
-#### `gauge.show(section | status, [completed])`
-
-The first argument is either the section, the name of the current thing
-contributing to progress, or an object with keys like **section**,
-**subsection** & **completed** (or any others you have types for in a custom
-template).  If you don't want to update or set any of these you can pass
-`null` and it will be ignored.
-
-The second argument is the percent completed as a value between 0 and 1.
-Without it, completion is just not updated. You'll also note that completion
-can be passed in as part of a status object as the first argument. If both
-it and the completed argument are passed in, the completed argument wins.
-
-#### `gauge.hide([cb])`
-
-Removes the gauge from the terminal.  Optionally, callback `cb` after IO has
-had an opportunity to happen (currently this just means after `setImmediate`
-has called back.)
-
-It turns out this is important when you're pausing the progress bar on one
-filehandle and printing to another– otherwise (with a big enough print) node
-can end up printing the "end progress bar" bits to the progress bar filehandle
-while other stuff is printing to another filehandle. These getting interleaved
-can cause corruption in some terminals.
-
-#### `gauge.pulse([subsection])`
-
-* **subsection** – *(optional)* The specific thing that triggered this pulse
-
-Spins the spinner in the gauge to show output.  If **subsection** is
-included then it will be combined with the last name passed to `gauge.show`.
-
-#### `gauge.disable()`
-
-Hides the gauge and ignores further calls to `show` or `pulse`.
-
-#### `gauge.enable()`
-
-Shows the gauge and resumes updating when `show` or `pulse` is called.
-
-#### `gauge.setThemeset(themes)`
-
-Change the themeset to select a theme from. The same as the `themes` option
-used in the constructor. The theme will be reselected from this themeset.
-
-#### `gauge.setTheme(theme)`
-
-Change the active theme, will be displayed with the next show or pulse. This can be:
-
-* Theme object, in which case the **themes** is not used.
-* The name of a theme, which will be looked up in the current *themes*
-  object.
-* A configuration object with any of `hasUnicode`, `hasColor` or
-  `platform` keys, which if wlll be used to override our guesses when making
-  a default theme selection.
-
-If no theme is selected then a default is picked using a combination of our
-best guesses at your OS, color support and unicode support.
-
-#### `gauge.setTemplate(template)`
-
-Change the active template, will be displayed with the next show or pulse
-
-### Tracking Completion
-
-If you have more than one thing going on that you want to track completion
-of, you may find the related [are-we-there-yet] helpful.  It's `change`
-event can be wired up to the `show` method to get a more traditional
-progress bar interface.
-
-[are-we-there-yet]: https://www.npmjs.com/package/are-we-there-yet
-
-### THEMES
-
-```
-var themes = require('gauge/themes')
-
-// fetch the default color unicode theme for this platform
-var ourTheme = themes({hasUnicode: true, hasColor: true})
-
-// fetch the default non-color unicode theme for osx
-var ourTheme = themes({hasUnicode: true, hasColor: false, platform: 'darwin'})
-
-// create a new theme based on the color ascii theme for this platform
-// that brackets the progress bar with arrows
-var ourTheme = themes.newTheme(theme(hasUnicode: false, hasColor: true}), {
-  preProgressbar: '→',
-  postProgressbar: '←'
-})
-```
-
-The object returned by `gauge/themes` is an instance of the `ThemeSet` class.
-
-```
-var ThemeSet = require('gauge/theme-set')
-var themes = new ThemeSet()
-// or
-var themes = require('gauge/themes')
-var mythemes = themes.newThemeset() // creates a new themeset based on the default themes
-```
-
-#### themes(opts)
-#### themes.getDefault(opts)
-
-Theme objects are a function that fetches the default theme based on
-platform, unicode and color support.
-
-Options is an object with the following properties:
-
-* **hasUnicode** - If true, fetch a unicode theme, if no unicode theme is
-  available then a non-unicode theme will be used.
-* **hasColor** - If true, fetch a color theme, if no color theme is
-  available a non-color theme will be used.
-* **platform** (optional) - Defaults to `process.platform`.  If no
-  platform match is available then `fallback` is used instead.
-
-If no compatible theme can be found then an error will be thrown with a
-`code` of `EMISSINGTHEME`.
-
-#### themes.addTheme(themeName, themeObj)
-#### themes.addTheme(themeName, [parentTheme], newTheme)
-
-Adds a named theme to the themeset.  You can pass in either a theme object,
-as returned by `themes.newTheme` or the arguments you'd pass to
-`themes.newTheme`.
-
-#### themes.getThemeNames()
-
-Return a list of all of the names of the themes in this themeset. Suitable
-for use in `themes.getTheme(…)`.
-
-#### themes.getTheme(name)
-
-Returns the theme object from this theme set named `name`.
-
-If `name` does not exist in this themeset an error will be thrown with
-a `code` of `EMISSINGTHEME`.
-
-#### themes.setDefault([opts], themeName)
-
-`opts` is an object with the following properties.
-
-* **platform** - Defaults to `'fallback'`.  If your theme is platform
-  specific, specify that here with the platform from `process.platform`, eg,
-  `win32`, `darwin`, etc.
-* **hasUnicode** - Defaults to `false`. If your theme uses unicode you
-  should set this to true.
-* **hasColor** - Defaults to `false`.  If your theme uses color you should
-  set this to true.
-
-`themeName` is the name of the theme (as given to `addTheme`) to use for
-this set of `opts`.
-
-#### themes.newTheme([parentTheme,] newTheme)
-
-Create a new theme object based on `parentTheme`.  If no `parentTheme` is
-provided then a minimal parentTheme that defines functions for rendering the
-activity indicator (spinner) and progress bar will be defined. (This
-fallback parent is defined in `gauge/base-theme`.)
-
-newTheme should be a bare object– we'll start by discussing the properties
-defined by the default themes:
-
-* **preProgressbar** - displayed prior to the progress bar, if the progress
-  bar is displayed.
-* **postProgressbar** - displayed after the progress bar, if the progress bar
-  is displayed.
-* **progressBarTheme** - The subtheme passed through to the progress bar
-  renderer, it's an object with `complete` and `remaining` properties
-  that are the strings you want repeated for those sections of the progress
-  bar.
-* **activityIndicatorTheme** - The theme for the activity indicator (spinner),
-  this can either be a string, in which each character is a different step, or
-  an array of strings.
-* **preSubsection** - Displayed as a separator between the `section` and
-  `subsection` when the latter is printed.
-
-More generally, themes can have any value that would be a valid value when rendering
-templates. The properties in the theme are used when their name matches a type in
-the template. Their values can be:
-
-* **strings & numbers** - They'll be included as is
-* **function (values, theme, width)** - Should return what you want in your output.
-  *values* is an object with values provided via `gauge.show`,
-  *theme* is the theme specific to this item (see below) or this theme object,
-  and *width* is the number of characters wide your result should be.
-
-There are a couple of special prefixes:
-
-* **pre** - Is shown prior to the property, if its displayed.
-* **post** - Is shown after the property, if its displayed.
-
-And one special suffix:
-
-* **Theme** - Its value is passed to a function-type item as the theme.
-
-#### themes.addToAllThemes(theme)
-
-This *mixes-in* `theme` into all themes currently defined. It also adds it
-to the default parent theme for this themeset, so future themes added to
-this themeset will get the values from `theme` by default.
-
-#### themes.newThemeset()
-
-Copy the current themeset into a new one.  This allows you to easily inherit
-one themeset from another.
-
-### TEMPLATES
-
-A template is an array of objects and strings that, after being evaluated,
-will be turned into the gauge line.  The default template is:
-
-```javascript
-[
-    {type: 'progressbar', length: 20},
-    {type: 'activityIndicator', kerning: 1, length: 1},
-    {type: 'section', kerning: 1},
-    {type: 'subsection', kerning: 1}
-]
-```
-
-The various template elements can either be **plain strings**, in which case they will
-be be included verbatum in the output, or objects with the following properties:
-
-* *type* can be any of the following plus any keys you pass into `gauge.show` plus
-  any keys you have on a custom theme.
-  * `section` – What big thing you're working on now.
-  * `subsection` – What component of that thing is currently working.
-  * `activityIndicator` – Shows a spinner using the `activityIndicatorTheme`
-    from your active theme.
-  * `progressbar` – A progress bar representing your current `completed`
-    using the `progressbarTheme` from your active theme.
-* *kerning* – Number of spaces that must be between this item and other
-  items, if this item is displayed at all.
-* *maxLength* – The maximum length for this element. If its value is longer it
-  will be truncated.
-* *minLength* – The minimum length for this element. If its value is shorter it
-  will be padded according to the *align* value.
-* *align* – (Default: left) Possible values "left", "right" and "center". Works
-  as you'd expect from word processors.
-* *length* – Provides a single value for both *minLength* and *maxLength*. If both
-  *length* and *minLength or *maxLength* are specifed then the latter take precedence.
-* *value* – A literal value to use for this template item.
-
-### PLUMBING
-
-This is the super simple, assume nothing, do no magic internals used by gauge to
-implement its ordinary interface.
-
-```
-var Plumbing = require('gauge/plumbing')
-var gauge = new Plumbing(theme, template, width)
-```
-
-* **theme**: The theme to use.
-* **template**: The template to use.
-* **width**: How wide your gauge should be
-
-#### `gauge.setTheme(theme)`
-
-Change the active theme.
-
-#### `gauge.setTemplate(template)`
-
-Change the active template.
-
-#### `gauge.setWidth(width)`
-
-Change the width to render at.
-
-#### `gauge.hide()`
-
-Return the string necessary to hide the progress bar
-
-#### `gauge.hideCursor()`
-
-Return a string to hide the cursor.
-
-#### `gauge.showCursor()`
-
-Return a string to show the cursor.
-
-#### `gauge.show(status)`
-
-Using `status` for values, render the provided template with the theme and return
-a string that is suitable for printing to update the gauge.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/base-theme.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/base-theme.js
deleted file mode 100644
index 0b67638e0211d05275fd481458f12eaa8dc121a9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/base-theme.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict'
-var spin = require('./spin.js')
-var progressBar = require('./progress-bar.js')
-
-module.exports = {
-  activityIndicator: function (values, theme, width) {
-    if (values.spun == null) return
-    return spin(theme, values.spun)
-  },
-  progressbar: function (values, theme, width) {
-    if (values.completed == null) return
-    return progressBar(theme, width, values.completed)
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/error.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/error.js
deleted file mode 100644
index d9914ba5335d25b9841439cb52b6fe82cabbd22a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/error.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict'
-var util = require('util')
-
-var User = exports.User = function User (msg) {
-  var err = new Error(msg)
-  Error.captureStackTrace(err, User)
-  err.code = 'EGAUGE'
-  return err
-}
-
-exports.MissingTemplateValue = function MissingTemplateValue (item, values) {
-  var err = new User(util.format('Missing template value "%s"', item.type))
-  Error.captureStackTrace(err, MissingTemplateValue)
-  err.template = item
-  err.values = values
-  return err
-}
-
-exports.Internal = function Internal (msg) {
-  var err = new Error(msg)
-  Error.captureStackTrace(err, Internal)
-  err.code = 'EGAUGEINTERNAL'
-  return err
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/has-color.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/has-color.js
deleted file mode 100644
index e283a256f26b74fc5d01af07ea40fc89b4a8d40d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/has-color.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict'
-
-module.exports = isWin32() || isColorTerm()
-
-function isWin32 () {
-  return process.platform === 'win32'
-}
-
-function isColorTerm () {
-  var termHasColor = /^screen|^xterm|^vt100|color|ansi|cygwin|linux/i
-  return !!process.env.COLORTERM || termHasColor.test(process.env.TERM)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/index.js
deleted file mode 100644
index 7eefb9507bb47e90d39150e82815df4183b8330a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/index.js
+++ /dev/null
@@ -1,226 +0,0 @@
-'use strict'
-var Plumbing = require('./plumbing.js')
-var hasUnicode = require('has-unicode')
-var hasColor = require('./has-color.js')
-var onExit = require('signal-exit')
-var defaultThemes = require('./themes')
-var setInterval = require('./set-interval.js')
-var process = require('./process.js')
-var setImmediate = require('./set-immediate')
-
-module.exports = Gauge
-
-function callWith (obj, method) {
-  return function () {
-    return method.call(obj)
-  }
-}
-
-function Gauge (arg1, arg2) {
-  var options, writeTo
-  if (arg1 && arg1.write) {
-    writeTo = arg1
-    options = arg2 || {}
-  } else if (arg2 && arg2.write) {
-    writeTo = arg2
-    options = arg1 || {}
-  } else {
-    writeTo = process.stderr
-    options = arg1 || arg2 || {}
-  }
-
-  this._status = {
-    spun: 0,
-    section: '',
-    subsection: ''
-  }
-  this._paused = false // are we paused for back pressure?
-  this._disabled = true // are all progress bar updates disabled?
-  this._showing = false // do we WANT the progress bar on screen
-  this._onScreen = false // IS the progress bar on screen
-  this._needsRedraw = false // should we print something at next tick?
-  this._hideCursor = options.hideCursor == null ? true : options.hideCursor
-  this._fixedFramerate = options.fixedFramerate == null
-    ? !(/^v0\.8\./.test(process.version))
-    : options.fixedFramerate
-  this._lastUpdateAt = null
-  this._updateInterval = options.updateInterval == null ? 50 : options.updateInterval
-
-  this._themes = options.themes || defaultThemes
-  this._theme = options.theme
-  var theme = this._computeTheme(options.theme)
-  var template = options.template || [
-    {type: 'progressbar', length: 20},
-    {type: 'activityIndicator', kerning: 1, length: 1},
-    {type: 'section', kerning: 1, default: ''},
-    {type: 'subsection', kerning: 1, default: ''}
-  ]
-  this.setWriteTo(writeTo, options.tty)
-  var PlumbingClass = options.Plumbing || Plumbing
-  this._gauge = new PlumbingClass(theme, template, this.getWidth())
-
-  this._$$doRedraw = callWith(this, this._doRedraw)
-  this._$$handleSizeChange = callWith(this, this._handleSizeChange)
-
-  if (options.cleanupOnExit == null || options.cleanupOnExit) {
-    onExit(callWith(this, this.disable))
-  }
-
-  if (options.enabled || (options.enabled == null && this._tty && this._tty.isTTY)) {
-    this.enable()
-  } else {
-    this.disable()
-  }
-}
-Gauge.prototype = {}
-
-Gauge.prototype.setTemplate = function (template) {
-  this._gauge.setTemplate(template)
-  if (this._showing) this._requestRedraw()
-}
-
-Gauge.prototype._computeTheme = function (theme) {
-  if (!theme) theme = {}
-  if (theme && (Object.keys(theme).length === 0 || theme.hasUnicode != null || theme.hasColor != null)) {
-    var useUnicode = theme.hasUnicode == null ? hasUnicode() : theme.hasUnicode
-    var useColor = theme.hasColor == null ? hasColor : theme.hasColor
-    theme = this._themes.getDefault({hasUnicode: useUnicode, hasColor: useColor, platform: theme.platform})
-  } else if (typeof theme === 'string') {
-    theme = this._themes.getTheme(theme)
-  }
-  return theme
-}
-
-Gauge.prototype.setThemeset = function (themes) {
-  this._themes = themes
-  this.setTheme(this._theme)
-}
-
-Gauge.prototype.setTheme = function (theme) {
-  this._gauge.setTheme(this._computeTheme(theme))
-  if (this._showing) this._requestRedraw()
-  this._theme = theme
-}
-
-Gauge.prototype._requestRedraw = function () {
-  this._needsRedraw = true
-  if (!this._fixedFramerate) this._doRedraw()
-}
-
-Gauge.prototype.getWidth = function () {
-  return ((this._tty && this._tty.columns) || 80) - 1
-}
-
-Gauge.prototype.setWriteTo = function (writeTo, tty) {
-  var enabled = !this._disabled
-  if (enabled) this.disable()
-  this._writeTo = writeTo
-  this._tty = tty ||
-    (writeTo === process.stderr && process.stdout.isTTY && process.stdout) ||
-    (writeTo.isTTY && writeTo) ||
-    this._tty
-  if (this._gauge) this._gauge.setWidth(this.getWidth())
-  if (enabled) this.enable()
-}
-
-Gauge.prototype.enable = function () {
-  if (!this._disabled) return
-  this._disabled = false
-  if (this._tty) this._enableEvents()
-  if (this._showing) this.show()
-}
-
-Gauge.prototype.disable = function () {
-  if (this._disabled) return
-  if (this._showing) {
-    this._lastUpdateAt = null
-    this._showing = false
-    this._doRedraw()
-    this._showing = true
-  }
-  this._disabled = true
-  if (this._tty) this._disableEvents()
-}
-
-Gauge.prototype._enableEvents = function () {
-  this._tty.on('resize', this._$$handleSizeChange)
-  if (this._fixedFramerate) {
-    this.redrawTracker = setInterval(this._$$doRedraw, this._updateInterval)
-    if (this.redrawTracker.unref) this.redrawTracker.unref()
-  }
-}
-
-Gauge.prototype._disableEvents = function () {
-  this._tty.removeListener('resize', this._$$handleSizeChange)
-  if (this._fixedFramerate) clearInterval(this.redrawTracker)
-}
-
-Gauge.prototype.hide = function (cb) {
-  if (this._disabled) return cb && process.nextTick(cb)
-  if (!this._showing) return cb && process.nextTick(cb)
-  this._showing = false
-  this._doRedraw()
-  cb && setImmediate(cb)
-}
-
-Gauge.prototype.show = function (section, completed) {
-  if (this._disabled) return
-  this._showing = true
-  if (typeof section === 'string') {
-    this._status.section = section
-  } else if (typeof section === 'object') {
-    var sectionKeys = Object.keys(section)
-    for (var ii = 0; ii < sectionKeys.length; ++ii) {
-      var key = sectionKeys[ii]
-      this._status[key] = section[key]
-    }
-  }
-  if (completed != null) this._status.completed = completed
-  this._requestRedraw()
-}
-
-Gauge.prototype.pulse = function (subsection) {
-  if (this._disabled) return
-  if (!this._showing) return
-  this._status.subsection = subsection || ''
-  this._status.spun ++
-  this._requestRedraw()
-}
-
-Gauge.prototype._handleSizeChange = function () {
-  this._gauge.setWidth(this._tty.columns - 1)
-  this._requestRedraw()
-}
-
-Gauge.prototype._doRedraw = function () {
-  if (this._disabled || this._paused) return
-  if (!this._fixedFramerate) {
-    var now = Date.now()
-    if (this._lastUpdateAt && now - this._lastUpdateAt < this._updateInterval) return
-    this._lastUpdateAt = now
-  }
-  if (!this._showing && this._onScreen) {
-    this._onScreen = false
-    var result = this._gauge.hide()
-    if (this._hideCursor) {
-      result += this._gauge.showCursor()
-    }
-    return this._writeTo.write(result)
-  }
-  if (!this._showing && !this._onScreen) return
-  if (this._showing && !this._onScreen) {
-    this._onScreen = true
-    this._needsRedraw = true
-    if (this._hideCursor) {
-      this._writeTo.write(this._gauge.hideCursor())
-    }
-  }
-  if (!this._needsRedraw) return
-  if (!this._writeTo.write(this._gauge.show(this._status))) {
-    this._paused = true
-    this._writeTo.on('drain', callWith(this, function () {
-      this._paused = false
-      this._doRedraw()
-    }))
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/LICENSE
deleted file mode 100644
index f4be44d881b2d93f8c9be06f52965244bc9b757d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-Copyright (c) 2015, Rebecca Turner <me@re-becca.org>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/README.md
deleted file mode 100644
index 8246a9cc6e1a4d9cc9d37ce5d435fe0c7f59f48a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/README.md
+++ /dev/null
@@ -1,59 +0,0 @@
-aproba
-======
-
-A ridiculously light-weight function argument validator
-
-```
-var validate = require("aproba")
-
-function myfunc(a, b, c) {
-  // `a` must be a string, `b` a number, `c` a function
-  validate('SNF', arguments) // [a,b,c] is also valid
-}
-
-myfunc('test', 23, function () {}) // ok
-myfunc(123, 23, function () {}) // type error
-myfunc('test', 23) // missing arg error
-myfunc('test', 23, function () {}, true) // too many args error
-
-```
-
-Valid types are:
-
-type | description
----- | -----------
-*    | matches any type
-A    | Array.isArray OR an arguments object
-S    | typeof == string
-N    | typeof == number
-F    | typeof == function
-O    | typeof == object and not type A and not type E
-B    | typeof == boolean
-E    | instanceof Error OR null
-
-Validation failures throw one of three exception types, distinguished by a
-`code` property of `EMISSINGARG`, `EINVALIDTYPE` or `ETOOMANYARGS`.
-
-If you pass in an invalid type then it will throw with a code of
-`EUNKNOWNTYPE`.
-
-If an error argument is found and is not null then the remaining arguments
-will not be validated.
-
-### Why this exists
-
-I wanted a very simple argument validator. It needed to do two things:
-
-1. Be more concise and easier to use than assertions
-
-2. Not encourage an infinite bikeshed of DSLs
-
-This is why types are specified by a single character and there's no such
-thing as an optional argument. 
-
-This is not intended to validate user data. This is specifically about
-asserting the interface of your functions.
-
-If you need greater validation, I encourage you to write them by hand or
-look elsewhere.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/index.js
deleted file mode 100644
index bb5ac3cda6d3e275ef6c9f21cfad4f4647f7ce69..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/index.js
+++ /dev/null
@@ -1,62 +0,0 @@
-'use strict'
-
-function isArguments (thingy) {
-  return typeof thingy === 'object' && thingy.hasOwnProperty('callee')
-}
-
-var types = {
-  '*': ['any', function () { return true }],
-  A: ['array', function (thingy) { return Array.isArray(thingy) || isArguments(thingy) }],
-  S: ['string', function (thingy) { return typeof thingy === 'string' }],
-  N: ['number', function (thingy) { return typeof thingy === 'number' }],
-  F: ['function', function (thingy) { return typeof thingy === 'function' }],
-  O: ['object', function (thingy) { return typeof thingy === 'object' && !types.A[1](thingy) && !types.E[1](thingy) }],
-  B: ['boolean', function (thingy) { return typeof thingy === 'boolean' }],
-  E: ['error', function (thingy) { return thingy instanceof Error }]
-}
-
-var validate = module.exports = function (schema, args) {
-  if (!schema) throw missingRequiredArg(0, 'schema')
-  if (!args) throw missingRequiredArg(1, 'args')
-  if (!types.S[1](schema)) throw invalidType(0, 'string', schema)
-  if (!types.A[1](args)) throw invalidType(1, 'array', args)
-  for (var ii = 0; ii < schema.length; ++ii) {
-    var type = schema[ii]
-    if (!types[type]) throw unknownType(ii, type)
-    var typeLabel = types[type][0]
-    var typeCheck = types[type][1]
-    if (type === 'E' && args[ii] == null) continue
-    if (args[ii] == null) throw missingRequiredArg(ii)
-    if (!typeCheck(args[ii])) throw invalidType(ii, typeLabel, args[ii])
-    if (type === 'E') return
-  }
-  if (schema.length < args.length) throw tooManyArgs(schema.length, args.length)
-}
-
-function missingRequiredArg (num) {
-  return newException('EMISSINGARG', 'Missing required argument #' + (num + 1))
-}
-
-function unknownType (num, type) {
-  return newException('EUNKNOWNTYPE', 'Unknown type ' + type + ' in argument #' + (num + 1))
-}
-
-function invalidType (num, expectedType, value) {
-  var valueType
-  Object.keys(types).forEach(function (typeCode) {
-    if (types[typeCode][1](value)) valueType = types[typeCode][0]
-  })
-  return newException('EINVALIDTYPE', 'Argument #' + (num + 1) + ': Expected ' +
-    expectedType + ' but got ' + valueType)
-}
-
-function tooManyArgs (expected, got) {
-  return newException('ETOOMANYARGS', 'Too many arguments, expected ' + expected + ' and got ' + got)
-}
-
-function newException (code, msg) {
-  var e = new Error(msg)
-  e.code = code
-  Error.captureStackTrace(e, validate)
-  return e
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/package.json
deleted file mode 100644
index 52ecb740b350f3efbcb8bab1bac23b986e239574..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/aproba/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "_from": "aproba@>=1.0.3 <2.0.0",
-  "_id": "aproba@1.0.4",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/aproba",
-  "_nodeVersion": "4.4.0",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/aproba-1.0.4.tgz_1466718885402_0.5348939662799239"
-  },
-  "_npmUser": {
-    "email": "me@re-becca.org",
-    "name": "iarna"
-  },
-  "_npmVersion": "3.10.2",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge"
-  ],
-  "_resolved": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz",
-  "_shasum": "2713680775e7614c8ba186c065d4e2e52d1072c0",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "me@re-becca.org",
-    "name": "Rebecca Turner"
-  },
-  "bugs": {
-    "url": "https://github.com/iarna/aproba/issues"
-  },
-  "dependencies": {},
-  "description": "A rediculously light-weight argument validator",
-  "devDependencies": {
-    "standard": "^7.1.2",
-    "tap": "^5.7.3"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "dist": {
-    "shasum": "2713680775e7614c8ba186c065d4e2e52d1072c0",
-    "tarball": "https://registry.npmjs.org/aproba/-/aproba-1.0.4.tgz"
-  },
-  "files": [
-    "index.js"
-  ],
-  "gitHead": "c6c8f82d519b9ec3816f20f23a9101083c022200",
-  "homepage": "https://github.com/iarna/aproba",
-  "keywords": [
-    "argument",
-    "validate"
-  ],
-  "license": "ISC",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "iarna",
-      "email": "me@re-becca.org"
-    }
-  ],
-  "name": "aproba",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/iarna/aproba.git"
-  },
-  "scripts": {
-    "test": "standard && tap test/*.js"
-  },
-  "version": "1.0.4"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-color/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-color/index.js
deleted file mode 100644
index 092d0baef6698e2c7f3275f739f1d94bbfd7272c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-color/index.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-module.exports = (function () {
-	if (process.argv.indexOf('--no-color') !== -1) {
-		return false;
-	}
-
-	if (process.argv.indexOf('--color') !== -1) {
-		return true;
-	}
-
-	if (process.stdout && !process.stdout.isTTY) {
-		return false;
-	}
-
-	if (process.platform === 'win32') {
-		return true;
-	}
-
-	if ('COLORTERM' in process.env) {
-		return true;
-	}
-
-	if (process.env.TERM === 'dumb') {
-		return false;
-	}
-
-	if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) {
-		return true;
-	}
-
-	return false;
-})();
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-color/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-color/package.json
deleted file mode 100644
index f4dfee4d413e3775301ea0f386d7adf971bf4b6d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-color/package.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
-  "_from": "has-color@>=0.1.7 <0.2.0",
-  "_id": "has-color@0.1.7",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/has-color",
-  "_npmUser": {
-    "email": "sindresorhus@gmail.com",
-    "name": "sindresorhus"
-  },
-  "_npmVersion": "1.4.6",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge"
-  ],
-  "_resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz",
-  "_shasum": "67144a5260c34fc3cca677d041daf52fe7b78b2f",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "http://sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/has-color/issues"
-  },
-  "dependencies": {},
-  "description": "Detect whether a terminal supports color",
-  "devDependencies": {
-    "mocha": "*"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "67144a5260c34fc3cca677d041daf52fe7b78b2f",
-    "tarball": "http://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/has-color",
-  "keywords": [
-    "256",
-    "ansi",
-    "capability",
-    "cli",
-    "color",
-    "colors",
-    "colour",
-    "command-line",
-    "console",
-    "detect",
-    "rgb",
-    "shell",
-    "styles",
-    "support",
-    "terminal",
-    "tty",
-    "xterm"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "sindresorhus",
-      "email": "sindresorhus@gmail.com"
-    }
-  ],
-  "name": "has-color",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/sindresorhus/has-color.git"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "version": "0.1.7"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-color/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-color/readme.md
deleted file mode 100644
index 37bbd8991a64235c55794f75cfbfae57257b6ee6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-color/readme.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# has-color [![Build Status](https://travis-ci.org/sindresorhus/has-color.svg?branch=master)](https://travis-ci.org/sindresorhus/has-color)
-
-> Detect whether a terminal supports color.
-
-Used in the terminal color module [chalk](https://github.com/sindresorhus/chalk).
-
-
-## Install
-
-```bash
-$ npm install --save has-color
-```
-
-
-## Usage
-
-```js
-var hasColor = require('has-color');
-
-if (hasColor) {
-	console.log('Terminal supports color.');
-}
-```
-
-It obeys the `--color` and `--no-color` CLI flags.
-
-
-## License
-
-[MIT](http://opensource.org/licenses/MIT) © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/LICENSE
deleted file mode 100644
index d42e25e95655bb0abefe88b7cc6a6ec5a44519aa..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-Copyright (c) 2014, Rebecca Turner <me@re-becca.org>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/README.md
deleted file mode 100644
index 5a03e5991c539ebfdca71d559a7596c24d2bdcff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/README.md
+++ /dev/null
@@ -1,43 +0,0 @@
-has-unicode
-===========
-
-Try to guess if your terminal supports unicode
-
-```javascript
-var hasUnicode = require("has-unicode")
-
-if (hasUnicode()) {
-  // the terminal probably has unicode support
-}
-```
-```javascript
-var hasUnicode = require("has-unicode").tryHarder
-hasUnicode(function(unicodeSupported) {
-  if (unicodeSupported) {
-    // the terminal probably has unicode support
-  }
-})
-```
-
-## Detecting Unicode
-
-What we actually detect is UTF-8 support, as that's what Node itself supports.
-If you have a UTF-16 locale then you won't be detected as unicode capable.
-
-### Windows
-
-Since at least Windows 7, `cmd` and `powershell` have been unicode capable,
-but unfortunately even then it's not guaranteed. In many localizations it
-still uses legacy code pages and there's no facility short of running
-programs or linking C++ that will let us detect this. As such, we
-report any Windows installation as NOT unicode capable, and recommend
-that you encourage your users to override this via config.
-
-### Unix Like Operating Systems
-
-We look at the environment variables `LC_ALL`, `LC_CTYPE`, and `LANG` in
-that order.  For `LC_ALL` and `LANG`, it looks for `.UTF-8` in the value. 
-For `LC_CTYPE` it looks to see if the value is `UTF-8`.  This is sufficient
-for most POSIX systems.  While locale data can be put in `/etc/locale.conf`
-as well, AFAIK it's always copied into the environment.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/index.js
deleted file mode 100644
index 9b0fe44540131165c1ff300478c6f1020710e518..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/index.js
+++ /dev/null
@@ -1,16 +0,0 @@
-"use strict"
-var os = require("os")
-
-var hasUnicode = module.exports = function () {
-  // Recent Win32 platforms (>XP) CAN support unicode in the console but
-  // don't have to, and in non-english locales often use traditional local
-  // code pages. There's no way, short of windows system calls or execing
-  // the chcp command line program to figure this out. As such, we default
-  // this to false and encourage your users to override it via config if
-  // appropriate.
-  if (os.type() == "Windows_NT") { return false }
-
-  var isUTF8 = /UTF-?8$/i
-  var ctype = process.env.LC_ALL || process.env.LC_CTYPE || process.env.LANG
-  return isUTF8.test(ctype)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/package.json
deleted file mode 100644
index 5e7e650a8442d719a326761ef0668abd13e513cc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/has-unicode/package.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-  "_from": "has-unicode@>=2.0.0 <3.0.0",
-  "_id": "has-unicode@2.0.1",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/has-unicode",
-  "_nodeVersion": "4.4.0",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/has-unicode-2.0.1.tgz_1466719828333_0.48896647873334587"
-  },
-  "_npmUser": {
-    "email": "me@re-becca.org",
-    "name": "iarna"
-  },
-  "_npmVersion": "3.10.2",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge"
-  ],
-  "_resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-  "_shasum": "e0e6fe6a28cf51138855e086d1691e771de2a8b9",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "me@re-becca.org",
-    "name": "Rebecca Turner"
-  },
-  "bugs": {
-    "url": "https://github.com/iarna/has-unicode/issues"
-  },
-  "dependencies": {},
-  "description": "Try to guess if your terminal supports unicode",
-  "devDependencies": {
-    "require-inject": "^1.3.0",
-    "tap": "^2.3.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "e0e6fe6a28cf51138855e086d1691e771de2a8b9",
-    "tarball": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz"
-  },
-  "files": [
-    "index.js"
-  ],
-  "gitHead": "0a05df154e8d89a7fb9798da60b68c78c2df6646",
-  "homepage": "https://github.com/iarna/has-unicode",
-  "keywords": [
-    "terminal",
-    "unicode"
-  ],
-  "license": "ISC",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "iarna",
-      "email": "me@re-becca.org"
-    }
-  ],
-  "name": "has-unicode",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/iarna/has-unicode.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "2.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/index.js
deleted file mode 100644
index 508504840dc61d5f821497e057e68e3000b21c41..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/index.js
+++ /dev/null
@@ -1,83 +0,0 @@
-'use strict';
-/* eslint-disable no-unused-vars */
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-var propIsEnumerable = Object.prototype.propertyIsEnumerable;
-
-function toObject(val) {
-	if (val === null || val === undefined) {
-		throw new TypeError('Object.assign cannot be called with null or undefined');
-	}
-
-	return Object(val);
-}
-
-function shouldUseNative() {
-	try {
-		if (!Object.assign) {
-			return false;
-		}
-
-		// Detect buggy property enumeration order in older V8 versions.
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=4118
-		var test1 = new String('abc');  // eslint-disable-line
-		test1[5] = 'de';
-		if (Object.getOwnPropertyNames(test1)[0] === '5') {
-			return false;
-		}
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
-		var test2 = {};
-		for (var i = 0; i < 10; i++) {
-			test2['_' + String.fromCharCode(i)] = i;
-		}
-		var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
-			return test2[n];
-		});
-		if (order2.join('') !== '0123456789') {
-			return false;
-		}
-
-		// https://bugs.chromium.org/p/v8/issues/detail?id=3056
-		var test3 = {};
-		'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
-			test3[letter] = letter;
-		});
-		if (Object.keys(Object.assign({}, test3)).join('') !==
-				'abcdefghijklmnopqrst') {
-			return false;
-		}
-
-		return true;
-	} catch (e) {
-		// We don't expect any of the above to throw, but better to be safe.
-		return false;
-	}
-}
-
-module.exports = shouldUseNative() ? Object.assign : function (target, source) {
-	var from;
-	var to = toObject(target);
-	var symbols;
-
-	for (var s = 1; s < arguments.length; s++) {
-		from = Object(arguments[s]);
-
-		for (var key in from) {
-			if (hasOwnProperty.call(from, key)) {
-				to[key] = from[key];
-			}
-		}
-
-		if (Object.getOwnPropertySymbols) {
-			symbols = Object.getOwnPropertySymbols(from);
-			for (var i = 0; i < symbols.length; i++) {
-				if (propIsEnumerable.call(from, symbols[i])) {
-					to[symbols[i]] = from[symbols[i]];
-				}
-			}
-		}
-	}
-
-	return to;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/package.json
deleted file mode 100644
index b9a9c20214eeb11e20eaf66d644df74f50579a09..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/package.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "_from": "object-assign@>=4.1.0 <5.0.0",
-  "_id": "object-assign@4.1.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/object-assign",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge"
-  ],
-  "_resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz",
-  "_shasum": "7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/object-assign/issues"
-  },
-  "dependencies": {},
-  "description": "ES2015 Object.assign() ponyfill",
-  "devDependencies": {
-    "lodash": "^4.8.2",
-    "matcha": "^0.7.0",
-    "mocha": "*",
-    "xo": "*"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/object-assign#readme",
-  "keywords": [
-    "assign",
-    "browser",
-    "ecmascript",
-    "es2015",
-    "extend",
-    "harmony",
-    "object",
-    "polyfill",
-    "ponyfill",
-    "prollyfill",
-    "properties",
-    "shim"
-  ],
-  "license": "MIT",
-  "name": "object-assign",
-  "optionalDependencies": {},
-  "readme": "# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign)\n\n> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) ponyfill\n\n> Ponyfill: A polyfill that doesn't overwrite the native method\n\n\n## Install\n\n```\n$ npm install --save object-assign\n```\n\n\n## Usage\n\n```js\nconst objectAssign = require('object-assign');\n\nobjectAssign({foo: 0}, {bar: 1});\n//=> {foo: 0, bar: 1}\n\n// multiple sources\nobjectAssign({foo: 0}, {bar: 1}, {baz: 2});\n//=> {foo: 0, bar: 1, baz: 2}\n\n// overwrites equal keys\nobjectAssign({foo: 0}, {foo: 1}, {foo: 2});\n//=> {foo: 2}\n\n// ignores null and undefined sources\nobjectAssign({foo: 0}, null, {bar: 1}, undefined);\n//=> {foo: 0, bar: 1}\n```\n\n\n## API\n\n### objectAssign(target, source, [source, ...])\n\nAssigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones.\n\n\n## Resources\n\n- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign)\n\n\n## Related\n\n- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()`\n\n\n## License\n\nMIT © [Sindre Sorhus](https://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/object-assign.git"
-  },
-  "scripts": {
-    "bench": "matcha bench.js",
-    "test": "xo && mocha"
-  },
-  "version": "4.1.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/readme.md
deleted file mode 100644
index 13c097734cfd18fcc07587940321aa7cb8ef3b20..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/object-assign/readme.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# object-assign [![Build Status](https://travis-ci.org/sindresorhus/object-assign.svg?branch=master)](https://travis-ci.org/sindresorhus/object-assign)
-
-> ES2015 [`Object.assign()`](http://www.2ality.com/2014/01/object-assign.html) ponyfill
-
-> Ponyfill: A polyfill that doesn't overwrite the native method
-
-
-## Install
-
-```
-$ npm install --save object-assign
-```
-
-
-## Usage
-
-```js
-const objectAssign = require('object-assign');
-
-objectAssign({foo: 0}, {bar: 1});
-//=> {foo: 0, bar: 1}
-
-// multiple sources
-objectAssign({foo: 0}, {bar: 1}, {baz: 2});
-//=> {foo: 0, bar: 1, baz: 2}
-
-// overwrites equal keys
-objectAssign({foo: 0}, {foo: 1}, {foo: 2});
-//=> {foo: 2}
-
-// ignores null and undefined sources
-objectAssign({foo: 0}, null, {bar: 1}, undefined);
-//=> {foo: 0, bar: 1}
-```
-
-
-## API
-
-### objectAssign(target, source, [source, ...])
-
-Assigns enumerable own properties of `source` objects to the `target` object and returns the `target` object. Additional `source` objects will overwrite previous ones.
-
-
-## Resources
-
-- [ES2015 spec - Object.assign](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-object.assign)
-
-
-## Related
-
-- [deep-assign](https://github.com/sindresorhus/deep-assign) - Recursive `Object.assign()`
-
-
-## License
-
-MIT © [Sindre Sorhus](https://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/CHANGELOG.md
deleted file mode 100644
index c12f8340c8d6c65bfb9529c626c500411785d85d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/CHANGELOG.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
-
-<a name="3.0.0"></a>
-# [3.0.0](https://github.com/tapjs/signal-exit/compare/v2.1.2...v3.0.0) (2016-06-13)
-
-
-### Bug Fixes
-
-* get our test suite running on Windows ([#23](https://github.com/tapjs/signal-exit/issues/23)) ([6f3eda8](https://github.com/tapjs/signal-exit/commit/6f3eda8))
-* hooking SIGPROF was interfering with profilers see [#21](https://github.com/tapjs/signal-exit/issues/21) ([#24](https://github.com/tapjs/signal-exit/issues/24)) ([1248a4c](https://github.com/tapjs/signal-exit/commit/1248a4c))
-
-
-### BREAKING CHANGES
-
-* signal-exit no longer wires into SIGPROF
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/LICENSE.txt b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/LICENSE.txt
deleted file mode 100644
index c7e27478a3eff8862ca150f10d1b93a5ac866af2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/LICENSE.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Copyright (c) 2015, Contributors
-
-Permission to use, copy, modify, and/or distribute this software
-for any purpose with or without fee is hereby granted, provided
-that the above copyright notice and this permission notice
-appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
-LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
-OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/README.md
deleted file mode 100644
index 8ebccabecaea4cb612727e7e0ac7aab8a99f23cb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/README.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# signal-exit
-
-[![Build Status](https://travis-ci.org/tapjs/signal-exit.png)](https://travis-ci.org/tapjs/signal-exit)
-[![Coverage](https://coveralls.io/repos/tapjs/signal-exit/badge.svg?branch=master)](https://coveralls.io/r/tapjs/signal-exit?branch=master)
-[![NPM version](https://img.shields.io/npm/v/signal-exit.svg)](https://www.npmjs.com/package/signal-exit)
-[![Windows Tests](https://img.shields.io/appveyor/ci/bcoe/signal-exit/master.svg?label=Windows%20Tests)](https://ci.appveyor.com/project/bcoe/signal-exit)
-[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version)
-
-When you want to fire an event no matter how a process exits:
-
-* reaching the end of execution.
-* explicitly having `process.exit(code)` called.
-* having `process.kill(pid, sig)` called.
-* receiving a fatal signal from outside the process
-
-Use `signal-exit`.
-
-```js
-var onExit = require('signal-exit')
-
-onExit(function (code, signal) {
-  console.log('process exited!')
-})
-```
-
-## API
-
-`var remove = onExit(function (code, signal) {}, options)`
-
-The return value of the function is a function that will remove the
-handler.
-
-Note that the function *only* fires for signals if the signal would
-cause the proces to exit.  That is, there are no other listeners, and
-it is a fatal signal.
-
-## Options
-
-* `alwaysLast`: Run this handler after any other signal or exit
-  handlers.  This causes `process.emit` to be monkeypatched.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/index.js
deleted file mode 100644
index 7dd8d917dc507bb47af188586e88823952e8ee00..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/index.js
+++ /dev/null
@@ -1,148 +0,0 @@
-// Note: since nyc uses this module to output coverage, any lines
-// that are in the direct sync flow of nyc's outputCoverage are
-// ignored, since we can never get coverage for them.
-var assert = require('assert')
-var signals = require('./signals.js')
-
-var EE = require('events')
-/* istanbul ignore if */
-if (typeof EE !== 'function') {
-  EE = EE.EventEmitter
-}
-
-var emitter
-if (process.__signal_exit_emitter__) {
-  emitter = process.__signal_exit_emitter__
-} else {
-  emitter = process.__signal_exit_emitter__ = new EE()
-  emitter.count = 0
-  emitter.emitted = {}
-}
-
-module.exports = function (cb, opts) {
-  assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')
-
-  if (loaded === false) {
-    load()
-  }
-
-  var ev = 'exit'
-  if (opts && opts.alwaysLast) {
-    ev = 'afterexit'
-  }
-
-  var remove = function () {
-    emitter.removeListener(ev, cb)
-    if (emitter.listeners('exit').length === 0 &&
-        emitter.listeners('afterexit').length === 0) {
-      unload()
-    }
-  }
-  emitter.on(ev, cb)
-
-  return remove
-}
-
-module.exports.unload = unload
-function unload () {
-  if (!loaded) {
-    return
-  }
-  loaded = false
-
-  signals.forEach(function (sig) {
-    try {
-      process.removeListener(sig, sigListeners[sig])
-    } catch (er) {}
-  })
-  process.emit = originalProcessEmit
-  process.reallyExit = originalProcessReallyExit
-  emitter.count -= 1
-}
-
-function emit (event, code, signal) {
-  if (emitter.emitted[event]) {
-    return
-  }
-  emitter.emitted[event] = true
-  emitter.emit(event, code, signal)
-}
-
-// { <signal>: <listener fn>, ... }
-var sigListeners = {}
-signals.forEach(function (sig) {
-  sigListeners[sig] = function listener () {
-    // If there are no other listeners, an exit is coming!
-    // Simplest way: remove us and then re-send the signal.
-    // We know that this will kill the process, so we can
-    // safely emit now.
-    var listeners = process.listeners(sig)
-    if (listeners.length === emitter.count) {
-      unload()
-      emit('exit', null, sig)
-      /* istanbul ignore next */
-      emit('afterexit', null, sig)
-      /* istanbul ignore next */
-      process.kill(process.pid, sig)
-    }
-  }
-})
-
-module.exports.signals = function () {
-  return signals
-}
-
-module.exports.load = load
-
-var loaded = false
-
-function load () {
-  if (loaded) {
-    return
-  }
-  loaded = true
-
-  // This is the number of onSignalExit's that are in play.
-  // It's important so that we can count the correct number of
-  // listeners on signals, and don't wait for the other one to
-  // handle it instead of us.
-  emitter.count += 1
-
-  signals = signals.filter(function (sig) {
-    try {
-      process.on(sig, sigListeners[sig])
-      return true
-    } catch (er) {
-      return false
-    }
-  })
-
-  process.emit = processEmit
-  process.reallyExit = processReallyExit
-}
-
-var originalProcessReallyExit = process.reallyExit
-function processReallyExit (code) {
-  process.exitCode = code || 0
-  emit('exit', process.exitCode, null)
-  /* istanbul ignore next */
-  emit('afterexit', process.exitCode, null)
-  /* istanbul ignore next */
-  originalProcessReallyExit.call(process, process.exitCode)
-}
-
-var originalProcessEmit = process.emit
-function processEmit (ev, arg) {
-  if (ev === 'exit') {
-    if (arg !== undefined) {
-      process.exitCode = arg
-    }
-    var ret = originalProcessEmit.apply(this, arguments)
-    emit('exit', process.exitCode, null)
-    /* istanbul ignore next */
-    emit('afterexit', process.exitCode, null)
-    return ret
-  } else {
-    return originalProcessEmit.apply(this, arguments)
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/package.json
deleted file mode 100644
index 9254e44a7104e41b43a13a2f508d9511c21bca77..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/package.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
-  "_from": "signal-exit@>=3.0.0 <4.0.0",
-  "_id": "signal-exit@3.0.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/signal-exit",
-  "_nodeVersion": "5.1.0",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/signal-exit-3.0.0.tgz_1465857346813_0.7961636525578797"
-  },
-  "_npmUser": {
-    "email": "ben@npmjs.com",
-    "name": "bcoe"
-  },
-  "_npmVersion": "3.3.12",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge"
-  ],
-  "_resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz",
-  "_shasum": "3c0543b65d7b4fbc60b6cd94593d9bf436739be8",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "ben@npmjs.com",
-    "name": "Ben Coe"
-  },
-  "bugs": {
-    "url": "https://github.com/tapjs/signal-exit/issues"
-  },
-  "dependencies": {},
-  "description": "when you want to fire an event no matter how a process exits.",
-  "devDependencies": {
-    "chai": "^3.5.0",
-    "coveralls": "^2.11.2",
-    "nyc": "^6.4.4",
-    "standard": "^7.1.2",
-    "standard-version": "^2.3.0",
-    "tap": "^5.7.2"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "3c0543b65d7b4fbc60b6cd94593d9bf436739be8",
-    "tarball": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.0.tgz"
-  },
-  "files": [
-    "index.js",
-    "signals.js"
-  ],
-  "gitHead": "2bbec4e5d9f9cf1f7529b1c923d1b058e69ccf7f",
-  "homepage": "https://github.com/tapjs/signal-exit",
-  "keywords": [
-    "exit",
-    "signal"
-  ],
-  "license": "ISC",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "bcoe",
-      "email": "ben@npmjs.com"
-    },
-    {
-      "name": "isaacs",
-      "email": "isaacs@npmjs.com"
-    }
-  ],
-  "name": "signal-exit",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/tapjs/signal-exit.git"
-  },
-  "scripts": {
-    "coverage": "nyc report --reporter=text-lcov | coveralls",
-    "pretest": "standard",
-    "release": "standard-version",
-    "test": "tap --timeout=240 ./test/*.js --cov"
-  },
-  "version": "3.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/signals.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/signals.js
deleted file mode 100644
index bc6f97ee606954136ca971398e6304eb56e144da..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/signal-exit/signals.js
+++ /dev/null
@@ -1,52 +0,0 @@
-// This is not the set of all possible signals.
-//
-// It IS, however, the set of all signals that trigger
-// an exit on either Linux or BSD systems.  Linux is a
-// superset of the signal names supported on BSD, and
-// the unknown signals just fail to register, so we can
-// catch that easily enough.
-//
-// Don't bother with SIGKILL.  It's uncatchable, which
-// means that we can't fire any callbacks anyway.
-//
-// If a user does happen to register a handler on a non-
-// fatal signal like SIGWINCH or something, and then
-// exit, it'll end up firing `process.emit('exit')`, so
-// the handler will be fired anyway.
-module.exports = [
-  'SIGABRT',
-  'SIGALRM',
-  'SIGBUS',
-  'SIGFPE',
-  'SIGHUP',
-  'SIGILL',
-  'SIGINT',
-  'SIGSEGV',
-  'SIGTERM'
-]
-
-if (process.platform !== 'win32') {
-  module.exports.push(
-    'SIGVTALRM',
-    'SIGXCPU',
-    'SIGXFSZ',
-    'SIGUSR2',
-    'SIGTRAP',
-    'SIGSYS',
-    'SIGQUIT',
-    'SIGIOT'
-    // should detect profiler and enable/disable accordingly.
-    // see #21
-    // 'SIGPROF'
-  )
-}
-
-if (process.platform === 'linux') {
-  module.exports.push(
-    'SIGIO',
-    'SIGPOLL',
-    'SIGPWR',
-    'SIGSTKFLT',
-    'SIGUNUSED'
-  )
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/index.js
deleted file mode 100644
index aa2f839b6dd2ce147124986222829aaccd303139..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/index.js
+++ /dev/null
@@ -1,32 +0,0 @@
-'use strict';
-var stripAnsi = require('strip-ansi');
-var codePointAt = require('code-point-at');
-var isFullwidthCodePoint = require('is-fullwidth-code-point');
-
-// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1345
-module.exports = function (str) {
-	if (typeof str !== 'string' || str.length === 0) {
-		return 0;
-	}
-
-	var width = 0;
-
-	str = stripAnsi(str);
-
-	for (var i = 0; i < str.length; i++) {
-		var code = codePointAt(str, i);
-
-		// surrogates
-		if (code >= 0x10000) {
-			i++;
-		}
-
-		if (isFullwidthCodePoint(code)) {
-			width += 2;
-		} else {
-			width++;
-		}
-	}
-
-	return width;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/index.js
deleted file mode 100644
index 0335117977237f52cebfef3a46bc99f4f73d027c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/index.js
+++ /dev/null
@@ -1,33 +0,0 @@
-'use strict';
-var numberIsNan = require('number-is-nan');
-
-module.exports = function (str, pos) {
-	if (str === null || str === undefined) {
-		throw TypeError();
-	}
-
-	str = String(str);
-
-	var size = str.length;
-	var i = pos ? Number(pos) : 0;
-
-	if (numberIsNan(i)) {
-		i = 0;
-	}
-
-	if (i < 0 || i >= size) {
-		return undefined;
-	}
-
-	var first = str.charCodeAt(i);
-
-	if (first >= 0xD800 && first <= 0xDBFF && size > i + 1) {
-		var second = str.charCodeAt(i + 1);
-
-		if (second >= 0xDC00 && second <= 0xDFFF) {
-			return (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
-		}
-	}
-
-	return first;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/index.js
deleted file mode 100644
index 79be4b9cb8c3bceb6eb08cfca105221d8cee0db1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-'use strict';
-module.exports = Number.isNaN || function (x) {
-	return x !== x;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/package.json
deleted file mode 100644
index 1391a880c2411eef9a37215a836f0d02458c29a8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/package.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
-  "_from": "number-is-nan@>=1.0.0 <2.0.0",
-  "_id": "number-is-nan@1.0.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/string-width/code-point-at/number-is-nan",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge/string-width/code-point-at"
-  ],
-  "_resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz",
-  "_shasum": "c020f529c5282adfdd233d91d4b181c3d686dc4b",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/number-is-nan/issues"
-  },
-  "dependencies": {},
-  "description": "ES6 Number.isNaN() ponyfill",
-  "devDependencies": {
-    "ava": "0.0.4"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/number-is-nan#readme",
-  "keywords": [
-    "ecmascript",
-    "es2015",
-    "es6",
-    "harmony",
-    "is",
-    "nan",
-    "not",
-    "number",
-    "polyfill",
-    "ponyfill",
-    "shim"
-  ],
-  "license": "MIT",
-  "name": "number-is-nan",
-  "optionalDependencies": {},
-  "readme": "# number-is-nan [![Build Status](https://travis-ci.org/sindresorhus/number-is-nan.svg?branch=master)](https://travis-ci.org/sindresorhus/number-is-nan)\n\n> ES6 [`Number.isNaN()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN) ponyfill\n\n> Ponyfill: A polyfill that doesn't overwrite the native method\n\n\n## Install\n\n```\n$ npm install --save number-is-nan\n```\n\n\n## Usage\n\n```js\nvar numberIsNan = require('number-is-nan');\n\nnumberIsNan(NaN);\n//=> true\n\nnumberIsNan('unicorn');\n//=> false\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/number-is-nan.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/readme.md
deleted file mode 100644
index 93d851a14f1ac575ba1633ac6e497f36699f5368..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/node_modules/number-is-nan/readme.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# number-is-nan [![Build Status](https://travis-ci.org/sindresorhus/number-is-nan.svg?branch=master)](https://travis-ci.org/sindresorhus/number-is-nan)
-
-> ES6 [`Number.isNaN()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN) ponyfill
-
-> Ponyfill: A polyfill that doesn't overwrite the native method
-
-
-## Install
-
-```
-$ npm install --save number-is-nan
-```
-
-
-## Usage
-
-```js
-var numberIsNan = require('number-is-nan');
-
-numberIsNan(NaN);
-//=> true
-
-numberIsNan('unicorn');
-//=> false
-```
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/package.json
deleted file mode 100644
index 816e857083eaf5668abb89c4c4602bc9f72470a4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "_from": "code-point-at@>=1.0.0 <2.0.0",
-  "_id": "code-point-at@1.0.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/string-width/code-point-at",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge/string-width"
-  ],
-  "_resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz",
-  "_shasum": "f69b192d3f7d91e382e4b71bddb77878619ab0c6",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/code-point-at/issues"
-  },
-  "dependencies": {
-    "number-is-nan": "^1.0.0"
-  },
-  "description": "ES2015 String#codePointAt() ponyfill",
-  "devDependencies": {
-    "ava": "0.0.4"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/code-point-at#readme",
-  "keywords": [
-    "at",
-    "code",
-    "codepoint",
-    "es2015",
-    "es6",
-    "point",
-    "polyfill",
-    "ponyfill",
-    "shim",
-    "str",
-    "string",
-    "unicode"
-  ],
-  "license": "MIT",
-  "name": "code-point-at",
-  "optionalDependencies": {},
-  "readme": "# code-point-at [![Build Status](https://travis-ci.org/sindresorhus/code-point-at.svg?branch=master)](https://travis-ci.org/sindresorhus/code-point-at)\n\n> ES2015 [`String#codePointAt()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) ponyfill\n\n> Ponyfill: A polyfill that doesn't overwrite the native method\n\n\n## Install\n\n```\n$ npm install --save code-point-at\n```\n\n\n## Usage\n\n```js\nvar codePointAt = require('code-point-at');\n\ncodePointAt('🐴');\n//=> 128052\n\ncodePointAt('abc', 2);\n//=> 99\n```\n\n## API\n\n### codePointAt(input, [position])\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/code-point-at.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/readme.md
deleted file mode 100644
index 71e7d0931b8b0cb9bbdc76b1549b966865f34a6e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/code-point-at/readme.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# code-point-at [![Build Status](https://travis-ci.org/sindresorhus/code-point-at.svg?branch=master)](https://travis-ci.org/sindresorhus/code-point-at)
-
-> ES2015 [`String#codePointAt()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/codePointAt) ponyfill
-
-> Ponyfill: A polyfill that doesn't overwrite the native method
-
-
-## Install
-
-```
-$ npm install --save code-point-at
-```
-
-
-## Usage
-
-```js
-var codePointAt = require('code-point-at');
-
-codePointAt('🐴');
-//=> 128052
-
-codePointAt('abc', 2);
-//=> 99
-```
-
-## API
-
-### codePointAt(input, [position])
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/index.js
deleted file mode 100644
index a7d3e3855f1c24c1df6a01be3232c71b203b3173..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/index.js
+++ /dev/null
@@ -1,46 +0,0 @@
-'use strict';
-var numberIsNan = require('number-is-nan');
-
-module.exports = function (x) {
-	if (numberIsNan(x)) {
-		return false;
-	}
-
-	// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1369
-
-	// code points are derived from:
-	// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt
-	if (x >= 0x1100 && (
-		x <= 0x115f ||  // Hangul Jamo
-		0x2329 === x || // LEFT-POINTING ANGLE BRACKET
-		0x232a === x || // RIGHT-POINTING ANGLE BRACKET
-		// CJK Radicals Supplement .. Enclosed CJK Letters and Months
-		(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||
-		// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A
-		0x3250 <= x && x <= 0x4dbf ||
-		// CJK Unified Ideographs .. Yi Radicals
-		0x4e00 <= x && x <= 0xa4c6 ||
-		// Hangul Jamo Extended-A
-		0xa960 <= x && x <= 0xa97c ||
-		// Hangul Syllables
-		0xac00 <= x && x <= 0xd7a3 ||
-		// CJK Compatibility Ideographs
-		0xf900 <= x && x <= 0xfaff ||
-		// Vertical Forms
-		0xfe10 <= x && x <= 0xfe19 ||
-		// CJK Compatibility Forms .. Small Form Variants
-		0xfe30 <= x && x <= 0xfe6b ||
-		// Halfwidth and Fullwidth Forms
-		0xff01 <= x && x <= 0xff60 ||
-		0xffe0 <= x && x <= 0xffe6 ||
-		// Kana Supplement
-		0x1b000 <= x && x <= 0x1b001 ||
-		// Enclosed Ideographic Supplement
-		0x1f200 <= x && x <= 0x1f251 ||
-		// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane
-		0x20000 <= x && x <= 0x3fffd)) {
-		return true;
-	}
-
-	return false;
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/index.js
deleted file mode 100644
index 79be4b9cb8c3bceb6eb08cfca105221d8cee0db1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-'use strict';
-module.exports = Number.isNaN || function (x) {
-	return x !== x;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/package.json
deleted file mode 100644
index be51c086d8524cae67b46e9c39211d4747aa8237..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/package.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
-  "_from": "number-is-nan@>=1.0.0 <2.0.0",
-  "_id": "number-is-nan@1.0.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/string-width/is-fullwidth-code-point/number-is-nan",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge/string-width/is-fullwidth-code-point"
-  ],
-  "_resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz",
-  "_shasum": "c020f529c5282adfdd233d91d4b181c3d686dc4b",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/number-is-nan/issues"
-  },
-  "dependencies": {},
-  "description": "ES6 Number.isNaN() ponyfill",
-  "devDependencies": {
-    "ava": "0.0.4"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/number-is-nan#readme",
-  "keywords": [
-    "ecmascript",
-    "es2015",
-    "es6",
-    "harmony",
-    "is",
-    "nan",
-    "not",
-    "number",
-    "polyfill",
-    "ponyfill",
-    "shim"
-  ],
-  "license": "MIT",
-  "name": "number-is-nan",
-  "optionalDependencies": {},
-  "readme": "# number-is-nan [![Build Status](https://travis-ci.org/sindresorhus/number-is-nan.svg?branch=master)](https://travis-ci.org/sindresorhus/number-is-nan)\n\n> ES6 [`Number.isNaN()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN) ponyfill\n\n> Ponyfill: A polyfill that doesn't overwrite the native method\n\n\n## Install\n\n```\n$ npm install --save number-is-nan\n```\n\n\n## Usage\n\n```js\nvar numberIsNan = require('number-is-nan');\n\nnumberIsNan(NaN);\n//=> true\n\nnumberIsNan('unicorn');\n//=> false\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/number-is-nan.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/readme.md
deleted file mode 100644
index 93d851a14f1ac575ba1633ac6e497f36699f5368..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/node_modules/number-is-nan/readme.md
+++ /dev/null
@@ -1,30 +0,0 @@
-# number-is-nan [![Build Status](https://travis-ci.org/sindresorhus/number-is-nan.svg?branch=master)](https://travis-ci.org/sindresorhus/number-is-nan)
-
-> ES6 [`Number.isNaN()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN) ponyfill
-
-> Ponyfill: A polyfill that doesn't overwrite the native method
-
-
-## Install
-
-```
-$ npm install --save number-is-nan
-```
-
-
-## Usage
-
-```js
-var numberIsNan = require('number-is-nan');
-
-numberIsNan(NaN);
-//=> true
-
-numberIsNan('unicorn');
-//=> false
-```
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/package.json
deleted file mode 100644
index c4ff0afbf74744bc597687424526962313bce03b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/package.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
-  "_from": "is-fullwidth-code-point@>=1.0.0 <2.0.0",
-  "_id": "is-fullwidth-code-point@1.0.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/string-width/is-fullwidth-code-point",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge/string-width"
-  ],
-  "_resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-  "_shasum": "ef9e31386f031a7f0d643af82fde50c457ef00cb",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/is-fullwidth-code-point/issues"
-  },
-  "dependencies": {
-    "number-is-nan": "^1.0.0"
-  },
-  "description": "Check if the character represented by a given Unicode code point is fullwidth",
-  "devDependencies": {
-    "ava": "0.0.4",
-    "code-point-at": "^1.0.0"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/is-fullwidth-code-point#readme",
-  "keywords": [
-    "char",
-    "character",
-    "check",
-    "code",
-    "codepoint",
-    "detect",
-    "full",
-    "full-width",
-    "fullwidth",
-    "is",
-    "point",
-    "str",
-    "string",
-    "unicode",
-    "width"
-  ],
-  "license": "MIT",
-  "name": "is-fullwidth-code-point",
-  "optionalDependencies": {},
-  "readme": "# is-fullwidth-code-point [![Build Status](https://travis-ci.org/sindresorhus/is-fullwidth-code-point.svg?branch=master)](https://travis-ci.org/sindresorhus/is-fullwidth-code-point)\n\n> Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms)\n\n\n## Install\n\n```\n$ npm install --save is-fullwidth-code-point\n```\n\n\n## Usage\n\n```js\nvar isFullwidthCodePoint = require('is-fullwidth-code-point');\n\nisFullwidthCodePoint('谢'.codePointAt());\n//=> true\n\nisFullwidthCodePoint('a'.codePointAt());\n//=> false\n```\n\n\n## API\n\n### isFullwidthCodePoint(input)\n\n#### input\n\nType: `number`\n\n[Code point](https://en.wikipedia.org/wiki/Code_point) of a character.\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/is-fullwidth-code-point.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md
deleted file mode 100644
index 4936464b1b4155e74b2c8261fd92376e1bd9b0f9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/node_modules/is-fullwidth-code-point/readme.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# is-fullwidth-code-point [![Build Status](https://travis-ci.org/sindresorhus/is-fullwidth-code-point.svg?branch=master)](https://travis-ci.org/sindresorhus/is-fullwidth-code-point)
-
-> Check if the character represented by a given [Unicode code point](https://en.wikipedia.org/wiki/Code_point) is [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms)
-
-
-## Install
-
-```
-$ npm install --save is-fullwidth-code-point
-```
-
-
-## Usage
-
-```js
-var isFullwidthCodePoint = require('is-fullwidth-code-point');
-
-isFullwidthCodePoint('谢'.codePointAt());
-//=> true
-
-isFullwidthCodePoint('a'.codePointAt());
-//=> false
-```
-
-
-## API
-
-### isFullwidthCodePoint(input)
-
-#### input
-
-Type: `number`
-
-[Code point](https://en.wikipedia.org/wiki/Code_point) of a character.
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/package.json
deleted file mode 100644
index 875026d4c0029c3d1ddb56d8db0db67201d4db8e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/package.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "_from": "string-width@>=1.0.1 <2.0.0",
-  "_id": "string-width@1.0.1",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/string-width",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge",
-    "/serialport/node-pre-gyp/npmlog/gauge/wide-align"
-  ],
-  "_resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz",
-  "_shasum": "c92129b6f1d7f52acf9af424a26e3864a05ceb0a",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/string-width/issues"
-  },
-  "dependencies": {
-    "code-point-at": "^1.0.0",
-    "is-fullwidth-code-point": "^1.0.0",
-    "strip-ansi": "^3.0.0"
-  },
-  "description": "Get the visual width of a string - the number of columns required to display it",
-  "devDependencies": {
-    "ava": "0.0.4"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/string-width#readme",
-  "keywords": [
-    "ansi",
-    "char",
-    "character",
-    "chinese",
-    "cjk",
-    "cli",
-    "codes",
-    "column",
-    "columns",
-    "command-line",
-    "console",
-    "escape",
-    "fixed-width",
-    "full",
-    "full-width",
-    "fullwidth",
-    "japanese",
-    "korean",
-    "str",
-    "string",
-    "terminal",
-    "unicode",
-    "visual",
-    "width"
-  ],
-  "license": "MIT",
-  "name": "string-width",
-  "optionalDependencies": {},
-  "readme": "# string-width [![Build Status](https://travis-ci.org/sindresorhus/string-width.svg?branch=master)](https://travis-ci.org/sindresorhus/string-width)\n\n> Get the visual width of a string - the number of columns required to display it\n\nSome Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width.\n\nUseful to be able to measure the actual width of command-line output.\n\n\n## Install\n\n```\n$ npm install --save string-width\n```\n\n\n## Usage\n\n```js\nvar stringWidth = require('string-width');\n\nstringWidth('古');\n//=> 2\n\nstringWidth('\\u001b[1m古\\u001b[22m');\n//=> 2\n\nstringWidth('a');\n//=> 1\n```\n\n\n## Related\n\n- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module\n- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/string-width.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "1.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/readme.md
deleted file mode 100644
index a7737a986c573603e402a93f1a527fc4ef61bbb2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/string-width/readme.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# string-width [![Build Status](https://travis-ci.org/sindresorhus/string-width.svg?branch=master)](https://travis-ci.org/sindresorhus/string-width)
-
-> Get the visual width of a string - the number of columns required to display it
-
-Some Unicode characters are [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) and use double the normal width.
-
-Useful to be able to measure the actual width of command-line output.
-
-
-## Install
-
-```
-$ npm install --save string-width
-```
-
-
-## Usage
-
-```js
-var stringWidth = require('string-width');
-
-stringWidth('古');
-//=> 2
-
-stringWidth('\u001b[1m古\u001b[22m');
-//=> 2
-
-stringWidth('a');
-//=> 1
-```
-
-
-## Related
-
-- [string-width-cli](https://github.com/sindresorhus/string-width-cli) - CLI for this module
-- [string-length](https://github.com/sindresorhus/string-length) - Get the real length of a string
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/index.js
deleted file mode 100644
index 099480fbfc54cb238d6d190fda653408fbf1ef7f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-'use strict';
-var ansiRegex = require('ansi-regex')();
-
-module.exports = function (str) {
-	return typeof str === 'string' ? str.replace(ansiRegex, '') : str;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/index.js
deleted file mode 100644
index 4906755bc93573e0e3d86d6e4df78c2dcd511649..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-'use strict';
-module.exports = function () {
-	return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/package.json
deleted file mode 100644
index 32bb6bf9cbbd2cdb185802c6ec749bd6aba7868a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/package.json
+++ /dev/null
@@ -1,85 +0,0 @@
-{
-  "_from": "ansi-regex@>=2.0.0 <3.0.0",
-  "_id": "ansi-regex@2.0.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/strip-ansi/ansi-regex",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge/strip-ansi"
-  ],
-  "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz",
-  "_shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/ansi-regex/issues"
-  },
-  "dependencies": {},
-  "description": "Regular expression for matching ANSI escape codes",
-  "devDependencies": {
-    "mocha": "*"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/ansi-regex#readme",
-  "keywords": [
-    "256",
-    "ansi",
-    "cli",
-    "color",
-    "colors",
-    "colour",
-    "command-line",
-    "console",
-    "escape",
-    "find",
-    "formatting",
-    "match",
-    "pattern",
-    "re",
-    "regex",
-    "regexp",
-    "rgb",
-    "shell",
-    "string",
-    "styles",
-    "terminal",
-    "test",
-    "text",
-    "tty",
-    "xterm"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "Sindre Sorhus",
-      "email": "sindresorhus@gmail.com",
-      "url": "sindresorhus.com"
-    },
-    {
-      "name": "Joshua Appelman",
-      "email": "jappelman@xebia.com",
-      "url": "jbnicolai.com"
-    }
-  ],
-  "name": "ansi-regex",
-  "optionalDependencies": {},
-  "readme": "# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)\n\n> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```\n$ npm install --save ansi-regex\n```\n\n\n## Usage\n\n```js\nvar ansiRegex = require('ansi-regex');\n\nansiRegex().test('\\u001b[4mcake\\u001b[0m');\n//=> true\n\nansiRegex().test('cake');\n//=> false\n\n'\\u001b[4mcake\\u001b[0m'.match(ansiRegex());\n//=> ['\\u001b[4m', '\\u001b[0m']\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/ansi-regex.git"
-  },
-  "scripts": {
-    "test": "mocha test/test.js",
-    "view-supported": "node test/viewCodes.js"
-  },
-  "version": "2.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/readme.md
deleted file mode 100644
index 1a4894ec1110e3ce2fbfd7824bcf91181a374aeb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/node_modules/ansi-regex/readme.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)
-
-> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
-
-
-## Install
-
-```
-$ npm install --save ansi-regex
-```
-
-
-## Usage
-
-```js
-var ansiRegex = require('ansi-regex');
-
-ansiRegex().test('\u001b[4mcake\u001b[0m');
-//=> true
-
-ansiRegex().test('cake');
-//=> false
-
-'\u001b[4mcake\u001b[0m'.match(ansiRegex());
-//=> ['\u001b[4m', '\u001b[0m']
-```
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/package.json
deleted file mode 100644
index 1468ca39287af34340f17c4039b0d0c9a02dd629..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/package.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
-  "_from": "strip-ansi@>=3.0.1 <4.0.0",
-  "_id": "strip-ansi@3.0.1",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/strip-ansi",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge",
-    "/serialport/node-pre-gyp/npmlog/gauge/string-width"
-  ],
-  "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-  "_shasum": "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/chalk/strip-ansi/issues"
-  },
-  "dependencies": {
-    "ansi-regex": "^2.0.0"
-  },
-  "description": "Strip ANSI escape codes",
-  "devDependencies": {
-    "ava": "*",
-    "xo": "*"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/chalk/strip-ansi#readme",
-  "keywords": [
-    "256",
-    "ansi",
-    "color",
-    "colors",
-    "colour",
-    "command-line",
-    "console",
-    "escape",
-    "formatting",
-    "log",
-    "logging",
-    "remove",
-    "rgb",
-    "shell",
-    "string",
-    "strip",
-    "styles",
-    "terminal",
-    "text",
-    "trim",
-    "tty",
-    "xterm"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "Sindre Sorhus",
-      "email": "sindresorhus@gmail.com",
-      "url": "sindresorhus.com"
-    },
-    {
-      "name": "Joshua Boy Nicolai Appelman",
-      "email": "joshua@jbna.nl",
-      "url": "jbna.nl"
-    },
-    {
-      "name": "JD Ballard",
-      "email": "i.am.qix@gmail.com",
-      "url": "github.com/qix-"
-    }
-  ],
-  "name": "strip-ansi",
-  "optionalDependencies": {},
-  "readme": "# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi)\n\n> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```\n$ npm install --save strip-ansi\n```\n\n\n## Usage\n\n```js\nvar stripAnsi = require('strip-ansi');\n\nstripAnsi('\\u001b[4mcake\\u001b[0m');\n//=> 'cake'\n```\n\n\n## Related\n\n- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module\n- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes\n- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes\n- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/chalk/strip-ansi.git"
-  },
-  "scripts": {
-    "test": "xo && ava"
-  },
-  "version": "3.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/readme.md
deleted file mode 100644
index cb7d9ff7ee403d6cd7827beaed0629b9eb9af83f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/strip-ansi/readme.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi)
-
-> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
-
-
-## Install
-
-```
-$ npm install --save strip-ansi
-```
-
-
-## Usage
-
-```js
-var stripAnsi = require('strip-ansi');
-
-stripAnsi('\u001b[4mcake\u001b[0m');
-//=> 'cake'
-```
-
-
-## Related
-
-- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module
-- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes
-- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes
-- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/.npmignore
deleted file mode 100644
index d1a6b0054bc8f3310bbe0baa2b1ac77e6fd9a0eb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-*~
-/node_modules
-.#*
-/.nyc_output
-/coverage
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/LICENSE
deleted file mode 100644
index f4be44d881b2d93f8c9be06f52965244bc9b757d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/LICENSE
+++ /dev/null
@@ -1,14 +0,0 @@
-Copyright (c) 2015, Rebecca Turner <me@re-becca.org>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/README.md
deleted file mode 100644
index 32f1be04f097761d8d37286e36665300844ca812..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/README.md
+++ /dev/null
@@ -1,47 +0,0 @@
-wide-align
-----------
-
-A wide-character aware text alignment function for use in terminals / on the
-console.
-
-### Usage
-
-```
-var align = require('wide-align')
-
-// Note that if you view this on a unicode console, all of the slashes are
-// aligned. This is because on a console, all narrow characters are
-// an en wide and all wide characters are an em. In browsers, this isn't
-// held to and wide characters like "古" can be less than two narrow
-// characters even with a fixed width font.
-
-console.log(align.center('abc', 10))     // '   abc    '
-console.log(align.center('古古古', 10))  // '  古古古  '
-console.log(align.left('abc', 10))       // 'abc       '
-console.log(align.left('古古古', 10))    // '古古古    '
-console.log(align.right('abc', 10))      // '       abc'
-console.log(align.right('古古古', 10))   // '    古古古'
-```
-
-### Functions
-
-#### `align.center(str, length)` → `str`
-
-Returns *str* with spaces added to both sides such that that it is *length*
-chars long and centered in the spaces.
-
-#### `align.left(str, length)` → `str`
-
-Returns *str* with spaces to the right such that it is *length* chars long.
-
-### `align.right(str, length)` → `str`
-
-Returns *str* with spaces to the left such that it is *length* chars long.
-
-### Origins
-
-These functions were originally taken from 
-[cliui](https://npmjs.com/package/cliui). Changes include switching to the
-MUCH faster pad generation function from
-[lodash](https://npmjs.com/package/lodash), making center alignment pad
-both sides and adding left alignment.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/align.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/align.js
deleted file mode 100644
index 4f94ca4cde19b582cd280265d5f775184b0dea6f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/align.js
+++ /dev/null
@@ -1,65 +0,0 @@
-'use strict'
-var stringWidth = require('string-width')
-
-exports.center = alignCenter
-exports.left = alignLeft
-exports.right = alignRight
-
-// lodash's way of generating pad characters.
-
-function createPadding (width) {
-  var result = ''
-  var string = ' '
-  var n = width
-  do {
-    if (n % 2) {
-      result += string;
-    }
-    n = Math.floor(n / 2);
-    string += string;
-  } while (n);
-
-  return result;
-}
-
-function alignLeft (str, width) {
-  var trimmed = str.trimRight()
-  if (trimmed.length === 0 && str.length >= width) return str
-  var padding = ''
-  var strWidth = stringWidth(trimmed)
-
-  if (strWidth < width) {
-    padding = createPadding(width - strWidth)
-  }
-
-  return trimmed + padding
-}
-
-function alignRight (str, width) {
-  var trimmed = str.trimLeft()
-  if (trimmed.length === 0 && str.length >= width) return str
-  var padding = ''
-  var strWidth = stringWidth(trimmed)
-
-  if (strWidth < width) {
-    padding = createPadding(width - strWidth)
-  }
-
-  return padding + trimmed
-}
-
-function alignCenter (str, width) {
-  var trimmed = str.trim()
-  if (trimmed.length === 0 && str.length >= width) return str
-  var padLeft = ''
-  var padRight = ''
-  var strWidth = stringWidth(trimmed)
-
-  if (strWidth < width) {
-    var padLeftBy = parseInt((width - strWidth) / 2, 10) 
-    padLeft = createPadding(padLeftBy)
-    padRight = createPadding(width - (strWidth + padLeftBy))
-  }
-
-  return padLeft + trimmed + padRight
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/package.json
deleted file mode 100644
index ea316ba7771d10854f17a22f734c75a0e174bb52..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/package.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
-  "_from": "wide-align@>=1.1.0 <2.0.0",
-  "_id": "wide-align@1.1.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge/wide-align",
-  "_nodeVersion": "4.2.2",
-  "_npmUser": {
-    "email": "me@re-becca.org",
-    "name": "iarna"
-  },
-  "_npmVersion": "3.5.3",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog/gauge"
-  ],
-  "_resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz",
-  "_shasum": "40edde802a71fea1f070da3e62dcda2e7add96ad",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "me@re-becca.org",
-    "name": "Rebecca Turner",
-    "url": "http://re-becca.org/"
-  },
-  "bugs": {
-    "url": "https://github.com/iarna/wide-align/issues"
-  },
-  "dependencies": {
-    "string-width": "^1.0.1"
-  },
-  "description": "A wide-character aware text alignment function for use on the console or with fixed width fonts.",
-  "devDependencies": {
-    "tap": "^2.3.2"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "40edde802a71fea1f070da3e62dcda2e7add96ad",
-    "tarball": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.0.tgz"
-  },
-  "gitHead": "fe3f7f210650913d5bee702d7e19938f6977bc8a",
-  "homepage": "https://github.com/iarna/wide-align#readme",
-  "keywords": [
-    "align",
-    "cjkv",
-    "double",
-    "pad",
-    "unicode",
-    "wide"
-  ],
-  "license": "ISC",
-  "main": "align.js",
-  "maintainers": [
-    {
-      "name": "iarna",
-      "email": "me@re-becca.org"
-    }
-  ],
-  "name": "wide-align",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/iarna/wide-align.git"
-  },
-  "scripts": {
-    "test": "tap --coverage test/*.js"
-  },
-  "version": "1.1.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/test/align.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/test/align.js
deleted file mode 100644
index 64e9f9dbda4697882bfb52ca5d128177df34d60c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/node_modules/wide-align/test/align.js
+++ /dev/null
@@ -1,37 +0,0 @@
-'use strict'
-var test = require('tap').test
-var align = require('..')
-
-test('align', function (t) {
-  t.is(align.center('abc', 10), '   abc    ', 'center narrow')
-  t.is(align.center('古古古', 10), '  古古古  ', 'center wide')
-  t.is(align.left('abc', 10), 'abc       ', 'left narrow')
-  t.is(align.left('古古古', 10), '古古古    ', 'left wide')
-  t.is(align.right('abc', 10), '       abc', 'right narrow')
-  t.is(align.right('古古古', 10), '    古古古', 'right wide')
-
-  t.is(align.center('abc', 2), 'abc', 'center narrow overflow')
-  t.is(align.center('古古古', 4), '古古古', 'center wide overflow')
-  t.is(align.left('abc', 2), 'abc', 'left narrow overflow')
-  t.is(align.left('古古古', 4), '古古古', 'left wide overflow')
-  t.is(align.right('abc', 2), 'abc', 'right narrow overflow')
-  t.is(align.right('古古古', 4), '古古古', 'right wide overflow')
-
-  t.is(align.left('', 5), '     ', 'left align nothing')
-  t.is(align.center('', 5), '     ', 'center align nothing')
-  t.is(align.right('', 5), '     ', 'right align nothing')
-
-  t.is(align.left('   ', 5), '     ', 'left align whitespace')
-  t.is(align.center('   ', 5), '     ', 'center align whitespace')
-  t.is(align.right('   ', 5), '     ', 'right align whitespace')
-
-  t.is(align.left('   ', 2), '   ', 'left align whitespace overflow')
-  t.is(align.center('   ', 2), '   ', 'center align whitespace overflow')
-  t.is(align.right('   ', 2), '   ', 'right align whitespace overflow')
-
-  t.is(align.left('x         ', 10), 'x         ', 'left align whitespace mix')
-  t.is(align.center('x         ', 10), '    x     ', 'center align whitespace mix')
-  t.is(align.right('x         ', 10), '         x', 'right align whitespace mix')
-
-  t.end()
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/package.json
deleted file mode 100644
index 498be389bbc13e7c32bb43aca0914192b6c3338c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/package.json
+++ /dev/null
@@ -1,100 +0,0 @@
-{
-  "_from": "gauge@>=2.6.0 <2.7.0",
-  "_id": "gauge@2.6.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/gauge",
-  "_nodeVersion": "4.4.0",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/gauge-2.6.0.tgz_1466067371972_0.20705468393862247"
-  },
-  "_npmUser": {
-    "email": "me@re-becca.org",
-    "name": "iarna"
-  },
-  "_npmVersion": "3.9.2",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog"
-  ],
-  "_resolved": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz",
-  "_shasum": "d35301ad18e96902b4751dcbbe40f4218b942a46",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "me@re-becca.org",
-    "name": "Rebecca Turner"
-  },
-  "bugs": {
-    "url": "https://github.com/iarna/gauge/issues"
-  },
-  "dependencies": {
-    "aproba": "^1.0.3",
-    "console-control-strings": "^1.0.0",
-    "has-color": "^0.1.7",
-    "has-unicode": "^2.0.0",
-    "object-assign": "^4.1.0",
-    "signal-exit": "^3.0.0",
-    "string-width": "^1.0.1",
-    "strip-ansi": "^3.0.1",
-    "wide-align": "^1.1.0"
-  },
-  "description": "A terminal based horizontal guage",
-  "devDependencies": {
-    "readable-stream": "^2.0.6",
-    "require-inject": "^1.4.0",
-    "standard": "^7.1.2",
-    "tap": "^5.7.2",
-    "through2": "^2.0.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "d35301ad18e96902b4751dcbbe40f4218b942a46",
-    "tarball": "https://registry.npmjs.org/gauge/-/gauge-2.6.0.tgz"
-  },
-  "files": [
-    "CHANGELOG.md",
-    "LICENSE",
-    "README.md",
-    "base-theme.js",
-    "error.js",
-    "has-color.js",
-    "index.js",
-    "package.json",
-    "plumbing.js",
-    "process.js",
-    "progress-bar.js",
-    "render-template.js",
-    "set-immediate.js",
-    "set-interval.js",
-    "spin.js",
-    "template-item.js",
-    "theme-set.js",
-    "themes.js",
-    "wide-truncate.js"
-  ],
-  "gitHead": "d51040a71c269432c16cc542143f403a831630e6",
-  "homepage": "https://github.com/iarna/gauge",
-  "keywords": [
-    "gauge",
-    "progress",
-    "progressbar"
-  ],
-  "license": "ISC",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "iarna",
-      "email": "me@re-becca.org"
-    }
-  ],
-  "name": "gauge",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/iarna/gauge.git"
-  },
-  "scripts": {
-    "test": "standard && tap test/*.js --coverage"
-  },
-  "version": "2.6.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/plumbing.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/plumbing.js
deleted file mode 100644
index 589a9c92878ebf72911b6a997c2c476685e7b045..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/plumbing.js
+++ /dev/null
@@ -1,47 +0,0 @@
-'use strict'
-var consoleControl = require('console-control-strings')
-var renderTemplate = require('./render-template.js')
-var validate = require('aproba')
-
-var Plumbing = module.exports = function (theme, template, width) {
-  if (!width) width = 80
-  validate('OAN', [theme, template, width])
-  this.showing = false
-  this.theme = theme
-  this.width = width
-  this.template = template
-}
-Plumbing.prototype = {}
-
-Plumbing.prototype.setTheme = function (theme) {
-  validate('O', [theme])
-  this.theme = theme
-}
-
-Plumbing.prototype.setTemplate = function (template) {
-  validate('A', [template])
-  this.template = template
-}
-
-Plumbing.prototype.setWidth = function (width) {
-  validate('N', [width])
-  this.width = width
-}
-
-Plumbing.prototype.hide = function () {
-  return consoleControl.gotoSOL() + consoleControl.eraseLine()
-}
-
-Plumbing.prototype.hideCursor = consoleControl.hideCursor
-
-Plumbing.prototype.showCursor = consoleControl.showCursor
-
-Plumbing.prototype.show = function (status) {
-  var values = Object.create(this.theme)
-  for (var key in status) {
-    values[key] = status[key]
-  }
-
-  return renderTemplate(this.width, this.template, values).trim() +
-         consoleControl.eraseLine() + consoleControl.gotoSOL()
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/process.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/process.js
deleted file mode 100644
index 05e85694d755b61c38a648cb949964a4a5b9758d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/process.js
+++ /dev/null
@@ -1,3 +0,0 @@
-'use strict'
-// this exists so we can replace it during testing
-module.exports = process
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/progress-bar.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/progress-bar.js
deleted file mode 100644
index 7f8dd68be24cf0ec9debf275acbdad3251c60f7c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/progress-bar.js
+++ /dev/null
@@ -1,35 +0,0 @@
-'use strict'
-var validate = require('aproba')
-var renderTemplate = require('./render-template.js')
-var wideTruncate = require('./wide-truncate')
-var stringWidth = require('string-width')
-
-module.exports = function (theme, width, completed) {
-  validate('ONN', [theme, width, completed])
-  if (completed < 0) completed = 0
-  if (completed > 1) completed = 1
-  if (width <= 0) return ''
-  var sofar = Math.round(width * completed)
-  var rest = width - sofar
-  var template = [
-    {type: 'complete', value: repeat(theme.complete, sofar), length: sofar},
-    {type: 'remaining', value: repeat(theme.remaining, rest), length: rest}
-  ]
-  return renderTemplate(width, template, theme)
-}
-
-// lodash's way of repeating
-function repeat (string, width) {
-  var result = ''
-  var n = width
-  do {
-    if (n % 2) {
-      result += string
-    }
-    n = Math.floor(n / 2)
-    /*eslint no-self-assign: 0*/
-    string += string
-  } while (n && stringWidth(result) < width)
-
-  return wideTruncate(result, width)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/render-template.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/render-template.js
deleted file mode 100644
index 3261bfbe6f4be52ac6df342470113371482db48a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/render-template.js
+++ /dev/null
@@ -1,181 +0,0 @@
-'use strict'
-var align = require('wide-align')
-var validate = require('aproba')
-var objectAssign = require('object-assign')
-var wideTruncate = require('./wide-truncate')
-var error = require('./error')
-var TemplateItem = require('./template-item')
-
-function renderValueWithValues (values) {
-  return function (item) {
-    return renderValue(item, values)
-  }
-}
-
-var renderTemplate = module.exports = function (width, template, values) {
-  var items = prepareItems(width, template, values)
-  var rendered = items.map(renderValueWithValues(values)).join('')
-  return align.left(wideTruncate(rendered, width), width)
-}
-
-function preType (item) {
-  var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
-  return 'pre' + cappedTypeName
-}
-
-function postType (item) {
-  var cappedTypeName = item.type[0].toUpperCase() + item.type.slice(1)
-  return 'post' + cappedTypeName
-}
-
-function hasPreOrPost (item, values) {
-  if (!item.type) return
-  return values[preType(item)] || values[postType(item)]
-}
-
-function generatePreAndPost (baseItem, parentValues) {
-  var item = objectAssign({}, baseItem)
-  var values = Object.create(parentValues)
-  var template = []
-  var pre = preType(item)
-  var post = postType(item)
-  if (values[pre]) {
-    template.push({value: values[pre]})
-    values[pre] = null
-  }
-  item.minLength = null
-  item.length = null
-  item.maxLength = null
-  template.push(item)
-  values[item.type] = values[item.type]
-  if (values[post]) {
-    template.push({value: values[post]})
-    values[post] = null
-  }
-  return function ($1, $2, length) {
-    return renderTemplate(length, template, values)
-  }
-}
-
-function prepareItems (width, template, values) {
-  function cloneAndObjectify (item, index, arr) {
-    var cloned = new TemplateItem(item, width)
-    var type = cloned.type
-    if (cloned.value == null) {
-      if (!(type in values)) {
-        if (cloned.default == null) {
-          throw new error.MissingTemplateValue(cloned, values)
-        } else {
-          cloned.value = cloned.default
-        }
-      } else {
-        cloned.value = values[type]
-      }
-    }
-    if (cloned.value == null || cloned.value === '') return null
-    cloned.index = index
-    cloned.first = index === 0
-    cloned.last = index === arr.length - 1
-    if (hasPreOrPost(cloned, values)) cloned.value = generatePreAndPost(cloned, values)
-    return cloned
-  }
-
-  var output = template.map(cloneAndObjectify).filter(function (item) { return item != null })
-
-  var outputLength = 0
-  var remainingSpace = width
-  var variableCount = output.length
-
-  function consumeSpace (length) {
-    if (length > remainingSpace) length = remainingSpace
-    outputLength += length
-    remainingSpace -= length
-  }
-
-  function finishSizing (item, length) {
-    if (item.finished) throw new error.Internal('Tried to finish template item that was already finished')
-    if (length === Infinity) throw new error.Internal('Length of template item cannot be infinity')
-    if (length != null) item.length = length
-    item.minLength = null
-    item.maxLength = null
-    --variableCount
-    item.finished = true
-    if (item.length == null) item.length = item.getBaseLength()
-    if (item.length == null) throw new error.Internal('Finished template items must have a length')
-    consumeSpace(item.getLength())
-  }
-
-  output.forEach(function (item) {
-    if (!item.kerning) return
-    var prevPadRight = item.first ? 0 : output[item.index - 1].padRight
-    if (!item.first && prevPadRight < item.kerning) item.padLeft = item.kerning - prevPadRight
-    if (!item.last) item.padRight = item.kerning
-  })
-
-  // Finish any that have a fixed (literal or intuited) length
-  output.forEach(function (item) {
-    if (item.getBaseLength() == null) return
-    finishSizing(item)
-  })
-
-  var resized = 0
-  var resizing
-  var hunkSize
-  do {
-    resizing = false
-    hunkSize = Math.round(remainingSpace / variableCount)
-    output.forEach(function (item) {
-      if (item.finished) return
-      if (!item.maxLength) return
-      if (item.getMaxLength() < hunkSize) {
-        finishSizing(item, item.maxLength)
-        resizing = true
-      }
-    })
-  } while (resizing && resized++ < output.length)
-  if (resizing) throw new error.Internal('Resize loop iterated too many times while determining maxLength')
-
-  resized = 0
-  do {
-    resizing = false
-    hunkSize = Math.round(remainingSpace / variableCount)
-    output.forEach(function (item) {
-      if (item.finished) return
-      if (!item.minLength) return
-      if (item.getMinLength() >= hunkSize) {
-        finishSizing(item, item.minLength)
-        resizing = true
-      }
-    })
-  } while (resizing && resized++ < output.length)
-  if (resizing) throw new error.Internal('Resize loop iterated too many times while determining minLength')
-
-  hunkSize = Math.round(remainingSpace / variableCount)
-  output.forEach(function (item) {
-    if (item.finished) return
-    finishSizing(item, hunkSize)
-  })
-
-  return output
-}
-
-function renderFunction (item, values, length) {
-  validate('OON', arguments)
-  if (item.type) {
-    return item.value(values, values[item.type + 'Theme'] || {}, length)
-  } else {
-    return item.value(values, {}, length)
-  }
-}
-
-function renderValue (item, values) {
-  var length = item.getBaseLength()
-  var value = typeof item.value === 'function' ? renderFunction(item, values, length) : item.value
-  if (value == null || value === '') return ''
-  var alignWith = align[item.align] || align.left
-  var leftPadding = item.padLeft ? align.left('', item.padLeft) : ''
-  var rightPadding = item.padRight ? align.right('', item.padRight) : ''
-  var truncated = wideTruncate(String(value), length)
-  var aligned = alignWith(truncated, length)
-  return leftPadding + aligned + rightPadding
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/set-immediate.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/set-immediate.js
deleted file mode 100644
index 6650a485c4993391e1eac2fa87c650f53fd41a77..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/set-immediate.js
+++ /dev/null
@@ -1,7 +0,0 @@
-'use strict'
-var process = require('./process')
-try {
-  module.exports = setImmediate
-} catch (ex) {
-  module.exports = process.nextTick
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/set-interval.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/set-interval.js
deleted file mode 100644
index 576198793c55045d32d58fa60fda723d0872033a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/set-interval.js
+++ /dev/null
@@ -1,3 +0,0 @@
-'use strict'
-// this exists so we can replace it during testing
-module.exports = setInterval
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/spin.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/spin.js
deleted file mode 100644
index 34142ee31acc7c1b0c3b122a27166aae0ed8f7ae..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/spin.js
+++ /dev/null
@@ -1,5 +0,0 @@
-'use strict'
-
-module.exports = function spin (spinstr, spun) {
-  return spinstr[spun % spinstr.length]
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/template-item.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/template-item.js
deleted file mode 100644
index e46f447c941d3825eb5dddd23006d9873ec1c373..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/template-item.js
+++ /dev/null
@@ -1,73 +0,0 @@
-'use strict'
-var stringWidth = require('string-width')
-
-module.exports = TemplateItem
-
-function isPercent (num) {
-  if (typeof num !== 'string') return false
-  return num.slice(-1) === '%'
-}
-
-function percent (num) {
-  return Number(num.slice(0, -1)) / 100
-}
-
-function TemplateItem (values, outputLength) {
-  this.overallOutputLength = outputLength
-  this.finished = false
-  this.type = null
-  this.value = null
-  this.length = null
-  this.maxLength = null
-  this.minLength = null
-  this.kerning = null
-  this.align = 'left'
-  this.padLeft = 0
-  this.padRight = 0
-  this.index = null
-  this.first = null
-  this.last = null
-  if (typeof values === 'string') {
-    this.value = values
-  } else {
-    for (var prop in values) this[prop] = values[prop]
-  }
-  // Realize percents
-  if (isPercent(this.length)) {
-    this.length = Math.round(this.overallOutputLength * percent(this.length))
-  }
-  if (isPercent(this.minLength)) {
-    this.minLength = Math.round(this.overallOutputLength * percent(this.minLength))
-  }
-  if (isPercent(this.maxLength)) {
-    this.maxLength = Math.round(this.overallOutputLength * percent(this.maxLength))
-  }
-  return this
-}
-
-TemplateItem.prototype = {}
-
-TemplateItem.prototype.getBaseLength = function () {
-  var length = this.length
-  if (length == null && typeof this.value === 'string' && this.maxLength == null && this.minLength == null) {
-    length = stringWidth(this.value)
-  }
-  return length
-}
-
-TemplateItem.prototype.getLength = function () {
-  var length = this.getBaseLength()
-  if (length == null) return null
-  return length + this.padLeft + this.padRight
-}
-
-TemplateItem.prototype.getMaxLength = function () {
-  if (this.maxLength == null) return null
-  return this.maxLength + this.padLeft + this.padRight
-}
-
-TemplateItem.prototype.getMinLength = function () {
-  if (this.minLength == null) return null
-  return this.minLength + this.padLeft + this.padRight
-}
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/theme-set.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/theme-set.js
deleted file mode 100644
index 68971d5d231b077716c95f3916dd12e7b2d359e0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/theme-set.js
+++ /dev/null
@@ -1,115 +0,0 @@
-'use strict'
-var objectAssign = require('object-assign')
-
-module.exports = function () {
-  return ThemeSetProto.newThemeSet()
-}
-
-var ThemeSetProto = {}
-
-ThemeSetProto.baseTheme = require('./base-theme.js')
-
-ThemeSetProto.newTheme = function (parent, theme) {
-  if (!theme) {
-    theme = parent
-    parent = this.baseTheme
-  }
-  return objectAssign({}, parent, theme)
-}
-
-ThemeSetProto.getThemeNames = function () {
-  return Object.keys(this.themes)
-}
-
-ThemeSetProto.addTheme = function (name, parent, theme) {
-  this.themes[name] = this.newTheme(parent, theme)
-}
-
-ThemeSetProto.addToAllThemes = function (theme) {
-  var themes = this.themes
-  Object.keys(themes).forEach(function (name) {
-    objectAssign(themes[name], theme)
-  })
-  objectAssign(this.baseTheme, theme)
-}
-
-ThemeSetProto.getTheme = function (name) {
-  if (!this.themes[name]) throw this.newMissingThemeError(name)
-  return this.themes[name]
-}
-
-ThemeSetProto.setDefault = function (opts, name) {
-  if (name == null) {
-    name = opts
-    opts = {}
-  }
-  var platform = opts.platform == null ? 'fallback' : opts.platform
-  var hasUnicode = !!opts.hasUnicode
-  var hasColor = !!opts.hasColor
-  if (!this.defaults[platform]) this.defaults[platform] = {true: {}, false: {}}
-  this.defaults[platform][hasUnicode][hasColor] = name
-}
-
-ThemeSetProto.getDefault = function (opts) {
-  if (!opts) opts = {}
-  var platformName = opts.platform || process.platform
-  var platform = this.defaults[platformName] || this.defaults.fallback
-  var hasUnicode = !!opts.hasUnicode
-  var hasColor = !!opts.hasColor
-  if (!platform) throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
-  if (!platform[hasUnicode][hasColor]) {
-    if (hasUnicode && hasColor && platform[!hasUnicode][hasColor]) {
-      hasUnicode = false
-    } else if (hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
-      hasColor = false
-    } else if (hasUnicode && hasColor && platform[!hasUnicode][!hasColor]) {
-      hasUnicode = false
-      hasColor = false
-    } else if (hasUnicode && !hasColor && platform[!hasUnicode][hasColor]) {
-      hasUnicode = false
-    } else if (!hasUnicode && hasColor && platform[hasUnicode][!hasColor]) {
-      hasColor = false
-    } else if (platform === this.defaults.fallback) {
-      throw this.newMissingDefaultThemeError(platformName, hasUnicode, hasColor)
-    }
-  }
-  if (platform[hasUnicode][hasColor]) {
-    return this.getTheme(platform[hasUnicode][hasColor])
-  } else {
-    return this.getDefault(objectAssign({}, opts, {platform: 'fallback'}))
-  }
-}
-
-ThemeSetProto.newMissingThemeError = function newMissingThemeError (name) {
-  var err = new Error('Could not find a gauge theme named "' + name + '"')
-  Error.captureStackTrace.call(err, newMissingThemeError)
-  err.theme = name
-  err.code = 'EMISSINGTHEME'
-  return err
-}
-
-ThemeSetProto.newMissingDefaultThemeError = function newMissingDefaultThemeError (platformName, hasUnicode, hasColor) {
-  var err = new Error(
-    'Could not find a gauge theme for your platform/unicode/color use combo:\n' +
-    '    platform = ' + platformName + '\n' +
-    '    hasUnicode = ' + hasUnicode + '\n' +
-    '    hasColor = ' + hasColor)
-  Error.captureStackTrace.call(err, newMissingDefaultThemeError)
-  err.platform = platformName
-  err.hasUnicode = hasUnicode
-  err.hasColor = hasColor
-  err.code = 'EMISSINGTHEME'
-  return err
-}
-
-ThemeSetProto.newThemeSet = function () {
-  var themeset = function (opts) {
-    return themeset.getDefault(opts)
-  }
-  return objectAssign(themeset, ThemeSetProto, {
-    themes: objectAssign({}, this.themes),
-    baseTheme: objectAssign({}, this.baseTheme),
-    defaults: JSON.parse(JSON.stringify(this.defaults || {}))
-  })
-}
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/themes.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/themes.js
deleted file mode 100644
index eb5a4f5b5e1034dfd6634e9ffc049d094325b582..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/themes.js
+++ /dev/null
@@ -1,54 +0,0 @@
-'use strict'
-var consoleControl = require('console-control-strings')
-var ThemeSet = require('./theme-set.js')
-
-var themes = module.exports = new ThemeSet()
-
-themes.addTheme('ASCII', {
-  preProgressbar: '[',
-  postProgressbar: ']',
-  progressbarTheme: {
-    complete: '#',
-    remaining: '.'
-  },
-  activityIndicatorTheme: '-\\|/',
-  preSubsection: '>'
-})
-
-themes.addTheme('colorASCII', themes.getTheme('ASCII'), {
-  progressbarTheme: {
-    preComplete: consoleControl.color('inverse'),
-    complete: ' ',
-    postComplete: consoleControl.color('stopInverse'),
-    preRemaining: consoleControl.color('brightBlack'),
-    remaining: '.',
-    postRemaining: consoleControl.color('reset')
-  }
-})
-
-themes.addTheme('brailleSpinner', {
-  preProgressbar: '⸨',
-  postProgressbar: '⸩',
-  progressbarTheme: {
-    complete: '░',
-    remaining: '⠂'
-  },
-  activityIndicatorTheme: '⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏',
-  preSubsection: '>'
-})
-
-themes.addTheme('colorBrailleSpinner', themes.getTheme('brailleSpinner'), {
-  progressbarTheme: {
-    preComplete: consoleControl.color('inverse'),
-    complete: ' ',
-    postComplete: consoleControl.color('stopInverse'),
-    preRemaining: consoleControl.color('brightBlack'),
-    remaining: '░',
-    postRemaining: consoleControl.color('reset')
-  }
-})
-
-themes.setDefault({}, 'ASCII')
-themes.setDefault({hasColor: true}, 'colorASCII')
-themes.setDefault({platform: 'darwin', hasUnicode: true}, 'brailleSpinner')
-themes.setDefault({platform: 'darwin', hasUnicode: true, hasColor: true}, 'colorBrailleSpinner')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/wide-truncate.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/wide-truncate.js
deleted file mode 100644
index c531bc491fbb58c0f3c1e44e173625d1f77f94bd..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/gauge/wide-truncate.js
+++ /dev/null
@@ -1,25 +0,0 @@
-'use strict'
-var stringWidth = require('string-width')
-var stripAnsi = require('strip-ansi')
-
-module.exports = wideTruncate
-
-function wideTruncate (str, target) {
-  if (stringWidth(str) === 0) return str
-  if (target <= 0) return ''
-  if (stringWidth(str) <= target) return str
-
-  // We compute the number of bytes of ansi sequences here and add
-  // that to our initial truncation to ensure that we don't slice one
-  // that we want to keep in half.
-  var noAnsi = stripAnsi(str)
-  var ansiSize = str.length + noAnsi.length
-  var truncated = str.slice(0, target + ansiSize)
-
-  // we have to shrink the result to account for our ansi sequence buffer
-  // (if an ansi sequence was truncated) and double width characters.
-  while (stringWidth(truncated) > target) {
-    truncated = truncated.slice(0, -1)
-  }
-  return truncated
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/CHANGELOG.md
deleted file mode 100644
index 03bf591923d78279cb887b3ea6a576e5cdc531bc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/CHANGELOG.md
+++ /dev/null
@@ -1,26 +0,0 @@
-# Change Log
-
-All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
-
-<a name="2.0.0"></a>
-# [2.0.0](https://github.com/yargs/set-blocking/compare/v1.0.0...v2.0.0) (2016-05-17)
-
-
-### Features
-
-* add an isTTY check ([#3](https://github.com/yargs/set-blocking/issues/3)) ([66ce277](https://github.com/yargs/set-blocking/commit/66ce277))
-
-
-### BREAKING CHANGES
-
-* stdio/stderr will not be set to blocking if isTTY === false
-
-
-
-<a name="1.0.0"></a>
-# 1.0.0 (2016-05-14)
-
-
-### Features
-
-* implemented shim for stream._handle.setBlocking ([6bde0c0](https://github.com/yargs/set-blocking/commit/6bde0c0))
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/LICENSE.txt b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/LICENSE.txt
deleted file mode 100644
index 836440bef7cf14841c05b0f8635e580c91327fc4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/LICENSE.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Copyright (c) 2016, Contributors
-
-Permission to use, copy, modify, and/or distribute this software
-for any purpose with or without fee is hereby granted, provided
-that the above copyright notice and this permission notice
-appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
-OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE
-LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
-OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/README.md
deleted file mode 100644
index e93b4202b59d65f5a5b67937fd18a3c45c479594..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/README.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# set-blocking
-
-[![Build Status](https://travis-ci.org/yargs/set-blocking.svg)](https://travis-ci.org/yargs/set-blocking)
-[![NPM version](https://img.shields.io/npm/v/set-blocking.svg)](https://www.npmjs.com/package/set-blocking)
-[![Coverage Status](https://coveralls.io/repos/yargs/set-blocking/badge.svg?branch=)](https://coveralls.io/r/yargs/set-blocking?branch=master)
-[![Standard Version](https://img.shields.io/badge/release-standard%20version-brightgreen.svg)](https://github.com/conventional-changelog/standard-version)
-
-set blocking `stdio` and `stderr` ensuring that terminal output does not truncate.
-
-```js
-const setBlocking = require('set-blocking')
-setBlocking(true)
-console.log(someLargeStringToOutput)
-```
-
-## Historical Context/Word of Warning
-
-This was created as a shim to address the bug discussed in [node #6456](https://github.com/nodejs/node/issues/6456). This bug crops up on
-newer versions of Node.js (`0.12+`), truncating terminal output.
-
-You should be mindful of the side-effects caused by using `set-blocking`:
-
-* if your module sets blocking to `true`, it will effect other modules
-  consuming your library. In [yargs](https://github.com/yargs/yargs/blob/master/yargs.js#L653) we only call
-  `setBlocking(true)` once we already know we are about to call `process.exit(code)`.
-* this patch will not apply to subprocesses spawned with `isTTY = true`, this is
-  the [default `spawn()` behavior](https://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options).
-
-## License
-
-ISC
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/index.js
deleted file mode 100644
index 6f78774bb63ee6d0558e6726446a73b3ac7c7144..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/index.js
+++ /dev/null
@@ -1,7 +0,0 @@
-module.exports = function (blocking) {
-  [process.stdout, process.stderr].forEach(function (stream) {
-    if (stream._handle && stream.isTTY && typeof stream._handle.setBlocking === 'function') {
-      stream._handle.setBlocking(blocking)
-    }
-  })
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/package.json
deleted file mode 100644
index 5a6fa09740204ec0d436784e8c111d325e96426e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/node_modules/set-blocking/package.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
-  "_from": "set-blocking@>=2.0.0 <2.1.0",
-  "_id": "set-blocking@2.0.0",
-  "_location": "/serialport/node-pre-gyp/npmlog/set-blocking",
-  "_nodeVersion": "0.12.7",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/set-blocking-2.0.0.tgz_1463525966987_0.5456729622092098"
-  },
-  "_npmUser": {
-    "email": "ben@npmjs.com",
-    "name": "bcoe"
-  },
-  "_npmVersion": "2.11.3",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/npmlog"
-  ],
-  "_resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-  "_shasum": "045f9782d011ae9a6803ddd382b24392b3d890f7",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "ben@npmjs.com",
-    "name": "Ben Coe"
-  },
-  "bugs": {
-    "url": "https://github.com/yargs/set-blocking/issues"
-  },
-  "dependencies": {},
-  "description": "set blocking stdio and stderr ensuring that terminal output does not truncate",
-  "devDependencies": {
-    "chai": "^3.5.0",
-    "coveralls": "^2.11.9",
-    "mocha": "^2.4.5",
-    "nyc": "^6.4.4",
-    "standard": "^7.0.1",
-    "standard-version": "^2.2.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "045f9782d011ae9a6803ddd382b24392b3d890f7",
-    "tarball": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"
-  },
-  "files": [
-    "LICENSE.txt",
-    "index.js"
-  ],
-  "gitHead": "7eec10577b5fff264de477ba3b9d07f404946eff",
-  "homepage": "https://github.com/yargs/set-blocking#readme",
-  "keywords": [
-    "blocking",
-    "flush",
-    "shim",
-    "stderr",
-    "stdio",
-    "terminal"
-  ],
-  "license": "ISC",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "bcoe",
-      "email": "ben@npmjs.com"
-    }
-  ],
-  "name": "set-blocking",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/yargs/set-blocking.git"
-  },
-  "scripts": {
-    "coverage": "nyc report --reporter=text-lcov | coveralls",
-    "pretest": "standard",
-    "test": "nyc mocha ./test/*.js",
-    "version": "standard-version"
-  },
-  "version": "2.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/package.json
deleted file mode 100644
index be3109f29fff12867b0462c571e04cac0e9756c8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/npmlog/package.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
-  "_from": "npmlog@>=3.1.2 <3.2.0",
-  "_id": "npmlog@3.1.2",
-  "_location": "/serialport/node-pre-gyp/npmlog",
-  "_nodeVersion": "4.4.0",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/npmlog-3.1.2.tgz_1466073052641_0.36111341998912394"
-  },
-  "_npmUser": {
-    "email": "me@re-becca.org",
-    "name": "iarna"
-  },
-  "_npmVersion": "3.9.6",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp"
-  ],
-  "_resolved": "https://registry.npmjs.org/npmlog/-/npmlog-3.1.2.tgz",
-  "_shasum": "2d46fa874337af9498a2f12bb43d8d0be4a36873",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/npmlog/issues"
-  },
-  "dependencies": {
-    "are-we-there-yet": "~1.1.2",
-    "console-control-strings": "~1.1.0",
-    "gauge": "~2.6.0",
-    "set-blocking": "~2.0.0"
-  },
-  "description": "logger for npm",
-  "devDependencies": {
-    "standard": "~7.1.2",
-    "tap": "~5.7.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "2d46fa874337af9498a2f12bb43d8d0be4a36873",
-    "tarball": "https://registry.npmjs.org/npmlog/-/npmlog-3.1.2.tgz"
-  },
-  "files": [
-    "log.js"
-  ],
-  "gitHead": "444e237743fa1339cb91bea2d3f16f710be56984",
-  "homepage": "https://github.com/npm/npmlog#readme",
-  "license": "ISC",
-  "main": "log.js",
-  "maintainers": [
-    {
-      "name": "iarna",
-      "email": "me@re-becca.org"
-    },
-    {
-      "name": "isaacs",
-      "email": "i@izs.me"
-    },
-    {
-      "name": "othiym23",
-      "email": "ogd@aoaioxxysz.net"
-    },
-    {
-      "name": "zkat",
-      "email": "kat@sykosomatic.org"
-    }
-  ],
-  "name": "npmlog",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/npmlog.git"
-  },
-  "scripts": {
-    "test": "standard && tap test/*.js"
-  },
-  "version": "3.1.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/.npmignore
deleted file mode 100644
index 13abef4f588987b2681ffc5f79b38aacd880aca1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules
-node_modules/*
-npm_debug.log
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/LICENSE.APACHE2 b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/LICENSE.APACHE2
deleted file mode 100644
index 6366c04716fb9e88262da7cf0b5cdfa69dbd2c65..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/LICENSE.APACHE2
+++ /dev/null
@@ -1,15 +0,0 @@
-Apache License, Version 2.0
-
-Copyright (c) 2011 Dominic Tarr
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-    http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/LICENSE.BSD b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/LICENSE.BSD
deleted file mode 100644
index 96bb796aa5f2d2bba855ba963ccb4326e29ba3d6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/LICENSE.BSD
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright (c) 2013, Dominic Tarr
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met: 
-
-1. Redistributions of source code must retain the above copyright notice, this
-   list of conditions and the following disclaimer. 
-2. Redistributions in binary form must reproduce the above copyright notice,
-   this list of conditions and the following disclaimer in the documentation
-   and/or other materials provided with the distribution. 
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-The views and conclusions contained in the software and documentation are those
-of the authors and should not be interpreted as representing official policies, 
-either expressed or implied, of the FreeBSD Project.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/LICENSE.MIT b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/LICENSE.MIT
deleted file mode 100644
index 6eafbd734a6e062459ba4b3b4a99f8aeb7178664..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/LICENSE.MIT
+++ /dev/null
@@ -1,24 +0,0 @@
-The MIT License
-
-Copyright (c) 2011 Dominic Tarr
-
-Permission is hereby granted, free of charge, 
-to any person obtaining a copy of this software and 
-associated documentation files (the "Software"), to 
-deal in the Software without restriction, including 
-without limitation the rights to use, copy, modify, 
-merge, publish, distribute, sublicense, and/or sell 
-copies of the Software, and to permit persons to whom 
-the Software is furnished to do so, 
-subject to the following conditions:
-
-The above copyright notice and this permission notice 
-shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR 
-ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/README.md
deleted file mode 100644
index 65a5f0687cc0139f60388c2edf6e551e053728fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/README.md
+++ /dev/null
@@ -1,149 +0,0 @@
-# rc
-
-The non-configurable configuration loader for lazy people.
-
-## Usage
-
-The only option is to pass rc the name of your app, and your default configuration.
-
-```javascript
-var conf = require('rc')(appname, {
-  //defaults go here.
-  port: 2468,
-
-  //defaults which are objects will be merged, not replaced
-  views: {
-    engine: 'jade'
-  }
-});
-```
-
-`rc` will return your configuration options merged with the defaults you specify.
-If you pass in a predefined defaults object, it will be mutated:
-
-```javascript
-var conf = {};
-require('rc')(appname, conf);
-```
-
-If `rc` finds any config files for your app, the returned config object will have
-a `configs` array containing their paths:
-
-```javascript
-var appCfg = require('rc')(appname, conf);
-appCfg.configs[0] // /etc/appnamerc
-appCfg.configs[1] // /home/dominictarr/.config/appname
-appCfg.config // same as appCfg.configs[appCfg.configs.length - 1]
-```
-
-## Standards
-
-Given your application name (`appname`), rc will look in all the obvious places for configuration.
-
-  * command line arguments (parsed by minimist)
-  * environment variables prefixed with `${appname}_`
-    * or use "\_\_" to indicate nested properties <br/> _(e.g. `appname_foo__bar__baz` => `foo.bar.baz`)_
-  * if you passed an option `--config file` then from that file
-  * a local `.${appname}rc` or the first found looking in `./ ../ ../../ ../../../` etc.
-  * `$HOME/.${appname}rc`
-  * `$HOME/.${appname}/config`
-  * `$HOME/.config/${appname}`
-  * `$HOME/.config/${appname}/config`
-  * `/etc/${appname}rc`
-  * `/etc/${appname}/config`
-  * the defaults object you passed in.
-
-All configuration sources that were found will be flattened into one object,
-so that sources **earlier** in this list override later ones.
-
-
-## Configuration File Formats
-
-Configuration files (e.g. `.appnamerc`) may be in either [json](http://json.org/example) or [ini](http://en.wikipedia.org/wiki/INI_file) format. The example configurations below are equivalent:
-
-
-#### Formatted as `ini`
-
-```
-; You can include comments in `ini` format if you want.
-
-dependsOn=0.10.0
-
-
-; `rc` has built-in support for ini sections, see?
-
-[commands]
-  www     = ./commands/www
-  console = ./commands/repl
-
-
-; You can even do nested sections
-
-[generators.options]
-  engine  = ejs
-
-[generators.modules]
-  new     = generate-new
-  engine  = generate-backend
-
-```
-
-#### Formatted as `json`
-
-```javascript
-{
-  // You can even comment your JSON, if you want
-  "dependsOn": "0.10.0",
-  "commands": {
-    "www": "./commands/www",
-    "console": "./commands/repl"
-  },
-  "generators": {
-    "options": {
-      "engine": "ejs"
-    },
-    "modules": {
-      "new": "generate-new",
-      "backend": "generate-backend"
-    }
-  }
-}
-```
-
-Comments are stripped from JSON config via [strip-json-comments](https://github.com/sindresorhus/strip-json-comments).
-
-> Since ini, and env variables do not have a standard for types, your application needs be prepared for strings.
-
-
-
-## Advanced Usage
-
-#### Pass in your own `argv`
-
-You may pass in your own `argv` as the third argument to `rc`.  This is in case you want to [use your own command-line opts parser](https://github.com/dominictarr/rc/pull/12).
-
-```javascript
-require('rc')(appname, defaults, customArgvParser);
-```
-
-## Pass in your own parser
-
-If you have a special need to use a non-standard parser,
-you can do so by passing in the parser as the 4th argument.
-(leave the 3rd as null to get the default args parser)
-
-```javascript
-require('rc')(appname, defaults, null, parser);
-```
-
-This may also be used to force a more strict format,
-such as strict, valid JSON only.
-
-## Note on Performance
-
-`rc` is running `fs.statSync`-- so make sure you don't use it in a hot code path (e.g. a request handler) 
-
-
-## License
-
-Multi-licensed under the two-clause BSD License, MIT License, or Apache License, version 2.0
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/browser.js
deleted file mode 100644
index 8c230c5cd2d397f79e30a278debc314256d15256..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/browser.js
+++ /dev/null
@@ -1,7 +0,0 @@
-
-// when this is loaded into the browser, 
-// just use the defaults...
-
-module.exports = function (name, defaults) {
-  return defaults
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/index.js
deleted file mode 100755
index 6f8f1139d7f19c26d4d4e70009bf280c9d690a57..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/index.js
+++ /dev/null
@@ -1,60 +0,0 @@
-#! /usr/bin/env node
-var cc   = require('./lib/utils')
-var join = require('path').join
-var deepExtend = require('deep-extend')
-var etc = '/etc'
-var win = process.platform === "win32"
-var home = win
-           ? process.env.USERPROFILE
-           : process.env.HOME
-
-module.exports = function (name, defaults, argv, parse) {
-  if('string' !== typeof name)
-    throw new Error('rc(name): name *must* be string')
-  if(!argv)
-    argv = require('minimist')(process.argv.slice(2))
-  defaults = (
-      'string' === typeof defaults
-    ? cc.json(defaults) : defaults
-    ) || {}
-
-  parse = parse || cc.parse
-
-  var env = cc.env(name + '_')
-
-  var configs = [defaults]
-  var configFiles = []
-  function addConfigFile (file) {
-    if (configFiles.indexOf(file) >= 0) return
-    var fileConfig = cc.file(file)
-    if (fileConfig) {
-      configs.push(parse(fileConfig))
-      configFiles.push(file)
-    }
-  }
-
-  // which files do we look at?
-  if (!win)
-   [join(etc, name, 'config'),
-    join(etc, name + 'rc')].forEach(addConfigFile)
-  if (home)
-   [join(home, '.config', name, 'config'),
-    join(home, '.config', name),
-    join(home, '.' + name, 'config'),
-    join(home, '.' + name + 'rc')].forEach(addConfigFile)
-  addConfigFile(cc.find('.'+name+'rc'))
-  if (env.config) addConfigFile(env.config)
-  if (argv.config) addConfigFile(argv.config)
-
-  return deepExtend.apply(null, configs.concat([
-    env,
-    argv,
-    configFiles.length ? {configs: configFiles, config: configFiles[configFiles.length - 1]} : undefined,
-  ]))
-}
-
-if(!module.parent) {
-  console.log(
-    JSON.stringify(module.exports(process.argv[2]), false, 2)
-  )
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/lib/utils.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/lib/utils.js
deleted file mode 100644
index ae6dec0ba70be208f8e062f2ca5352f77838fdad..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/lib/utils.js
+++ /dev/null
@@ -1,103 +0,0 @@
-'use strict';
-var fs   = require('fs')
-var ini  = require('ini')
-var path = require('path')
-var stripJsonComments = require('strip-json-comments')
-
-var parse = exports.parse = function (content) {
-
-  //if it ends in .json or starts with { then it must be json.
-  //must be done this way, because ini accepts everything.
-  //can't just try and parse it and let it throw if it's not ini.
-  //everything is ini. even json with a syntax error.
-
-  if(/^\s*{/.test(content))
-    return JSON.parse(stripJsonComments(content))
-  return ini.parse(content)
-
-}
-
-var file = exports.file = function () {
-  var args = [].slice.call(arguments).filter(function (arg) { return arg != null })
-
-  //path.join breaks if it's a not a string, so just skip this.
-  for(var i in args)
-    if('string' !== typeof args[i])
-      return
-
-  var file = path.join.apply(null, args)
-  var content
-  try {
-    return fs.readFileSync(file,'utf-8')
-  } catch (err) {
-    return
-  }
-}
-
-var json = exports.json = function () {
-  var content = file.apply(null, arguments)
-  return content ? parse(content) : null
-}
-
-var env = exports.env = function (prefix, env) {
-  env = env || process.env
-  var obj = {}
-  var l = prefix.length
-  for(var k in env) {
-    if((k.indexOf(prefix)) === 0) {
-
-      var keypath = k.substring(l).split('__')
-
-      // Trim empty strings from keypath array
-      var _emptyStringIndex
-      while ((_emptyStringIndex=keypath.indexOf('')) > -1) {
-        keypath.splice(_emptyStringIndex, 1)
-      }
-
-      var cursor = obj
-      keypath.forEach(function _buildSubObj(_subkey,i){
-
-        // (check for _subkey first so we ignore empty strings)
-        // (check for cursor to avoid assignment to primitive objects)
-        if (!_subkey || typeof cursor !== 'object')
-          return
-
-        // If this is the last key, just stuff the value in there
-        // Assigns actual value from env variable to final key
-        // (unless it's just an empty string- in that case use the last valid key)
-        if (i === keypath.length-1)
-          cursor[_subkey] = env[k]
-
-
-        // Build sub-object if nothing already exists at the keypath
-        if (cursor[_subkey] === undefined)
-          cursor[_subkey] = {}
-
-        // Increment cursor used to track the object at the current depth
-        cursor = cursor[_subkey]
-
-      })
-
-    }
-
-  }
-
-  return obj
-}
-
-var find = exports.find = function () {
-  var rel = path.join.apply(null, [].slice.call(arguments))
-
-  function find(start, rel) {
-    var file = path.join(start, rel)
-    try {
-      fs.statSync(file)
-      return file
-    } catch (err) {
-      if(path.dirname(start) !== start) // root
-        return find(path.dirname(start), rel)
-    }
-  }
-  return find(process.cwd(), rel)
-}
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/.bin/strip-json-comments b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/.bin/strip-json-comments
deleted file mode 120000
index 63d549f96f3b2f7dd633f29cbf853f5470e52fa4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/.bin/strip-json-comments
+++ /dev/null
@@ -1 +0,0 @@
-../strip-json-comments/cli.js
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/CHANGELOG.md
deleted file mode 100644
index f3efe0b22202cd3d1bf31219c4b79d6a5e4bef5f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/CHANGELOG.md
+++ /dev/null
@@ -1,21 +0,0 @@
-Changelog
-=========
-
-v0.4.1
-------
-
-- Removed test code from <b>npm</b> package
-  ([see pull request #21](https://github.com/unclechu/node-deep-extend/pull/21));
-- Increased minimal version of Node from 0.4.0 to 0.12.0
-  (because can't run tests on lesser version anyway).
-
-v0.4.0
-------
-
-Broken backward compatibility with v0.3.x
-
-- Fixed bug with extending arrays instead of cloning;
-- Deep cloning for arrays;
-- Check for own property;
-- Fixed some documentation issues;
-- Strict JS mode.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/LICENSE
deleted file mode 100644
index acc4662ea40702c950a8d7543e2b7cd3d2cf8b11..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2013-2015, Viacheslav Lotsmanov
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/README.md
deleted file mode 100644
index cc17c9cd04509ddaa36e6c41b2acc05ee19ac2de..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/README.md
+++ /dev/null
@@ -1,90 +0,0 @@
-Deep Extend
-===========
-
-Recursive object extending.
-
-[![NPM](https://nodei.co/npm/deep-extend.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/deep-extend/)
-[![NPM](https://nodei.co/npm-dl/deep-extend.png?height=3)](https://nodei.co/npm/deep-extend/)
-
-Install
--------
-
-```bash
-$ npm install deep-extend
-```
-
-Usage
------
-
-```javascript
-var deepExtend = require('deep-extend');
-var obj1 = {
-  a: 1,
-  b: 2,
-  d: {
-    a: 1,
-    b: [],
-    c: { test1: 123, test2: 321 }
-  },
-  f: 5,
-  g: 123,
-  i: 321,
-  j: [1, 2]
-};
-var obj2 = {
-  b: 3,
-  c: 5,
-  d: {
-    b: { first: 'one', second: 'two' },
-    c: { test2: 222 }
-  },
-  e: { one: 1, two: 2 },
-  f: [],
-  g: (void 0),
-  h: /abc/g,
-  i: null,
-  j: [3, 4]
-};
-
-deepExtend(obj1, obj2);
-
-console.log(obj1);
-/*
-{ a: 1,
-  b: 3,
-  d:
-   { a: 1,
-     b: { first: 'one', second: 'two' },
-     c: { test1: 123, test2: 222 } },
-  f: null,
-  g: undefined,
-  c: 5,
-  e: { one: 1, two: 2 },
-  h: /abc/g,
-  i: null,
-  j: [3, 4] }
-*/
-```
-
-Unit testing
-------------
-
-```bash
-$ npm test
-```
-
-Changelog
----------
-
-[CHANGELOG.md](./CHANGELOG.md)
-
-Any issues?
------------
-
-Please, report about issues
-[here](https://github.com/unclechu/node-deep-extend/issues).
-
-License
--------
-
-[MIT](./LICENSE)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/index.js
deleted file mode 100644
index 762d81e954e161b33e4937a1b6676f28f1cc360a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib/deep-extend');
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/lib/deep-extend.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/lib/deep-extend.js
deleted file mode 100644
index 522461d4d9180ec3079e502725d322da25a33e50..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/lib/deep-extend.js
+++ /dev/null
@@ -1,144 +0,0 @@
-/*!
- * @description Recursive object extending
- * @author Viacheslav Lotsmanov <lotsmanov89@gmail.com>
- * @license MIT
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2013-2015 Viacheslav Lotsmanov
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
- * the Software, and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
- * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
- * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
- * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-'use strict';
-
-function isSpecificValue(val) {
-	return (
-		val instanceof Buffer
-		|| val instanceof Date
-		|| val instanceof RegExp
-	) ? true : false;
-}
-
-function cloneSpecificValue(val) {
-	if (val instanceof Buffer) {
-		var x = new Buffer(val.length);
-		val.copy(x);
-		return x;
-	} else if (val instanceof Date) {
-		return new Date(val.getTime());
-	} else if (val instanceof RegExp) {
-		return new RegExp(val);
-	} else {
-		throw new Error('Unexpected situation');
-	}
-}
-
-/**
- * Recursive cloning array.
- */
-function deepCloneArray(arr) {
-	var clone = [];
-	arr.forEach(function (item, index) {
-		if (typeof item === 'object' && item !== null) {
-			if (Array.isArray(item)) {
-				clone[index] = deepCloneArray(item);
-			} else if (isSpecificValue(item)) {
-				clone[index] = cloneSpecificValue(item);
-			} else {
-				clone[index] = deepExtend({}, item);
-			}
-		} else {
-			clone[index] = item;
-		}
-	});
-	return clone;
-}
-
-/**
- * Extening object that entered in first argument.
- *
- * Returns extended object or false if have no target object or incorrect type.
- *
- * If you wish to clone source object (without modify it), just use empty new
- * object as first argument, like this:
- *   deepExtend({}, yourObj_1, [yourObj_N]);
- */
-var deepExtend = module.exports = function (/*obj_1, [obj_2], [obj_N]*/) {
-	if (arguments.length < 1 || typeof arguments[0] !== 'object') {
-		return false;
-	}
-
-	if (arguments.length < 2) {
-		return arguments[0];
-	}
-
-	var target = arguments[0];
-
-	// convert arguments to array and cut off target object
-	var args = Array.prototype.slice.call(arguments, 1);
-
-	var val, src, clone;
-
-	args.forEach(function (obj) {
-		// skip argument if it is array or isn't object
-		if (typeof obj !== 'object' || Array.isArray(obj)) {
-			return;
-		}
-
-		Object.keys(obj).forEach(function (key) {
-			src = target[key]; // source value
-			val = obj[key]; // new value
-
-			// recursion prevention
-			if (val === target) {
-				return;
-
-			/**
-			 * if new value isn't object then just overwrite by new value
-			 * instead of extending.
-			 */
-			} else if (typeof val !== 'object' || val === null) {
-				target[key] = val;
-				return;
-
-			// just clone arrays (and recursive clone objects inside)
-			} else if (Array.isArray(val)) {
-				target[key] = deepCloneArray(val);
-				return;
-
-			// custom cloning and overwrite for specific objects
-			} else if (isSpecificValue(val)) {
-				target[key] = cloneSpecificValue(val);
-				return;
-
-			// overwrite by new value if source isn't object or array
-			} else if (typeof src !== 'object' || src === null || Array.isArray(src)) {
-				target[key] = deepExtend({}, val);
-				return;
-
-			// source value and new value is objects both, extending...
-			} else {
-				target[key] = deepExtend(src, val);
-				return;
-			}
-		});
-	});
-
-	return target;
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/package.json
deleted file mode 100644
index ea30cd603bf1696fd6a15ca63a29d431ac701169..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/deep-extend/package.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
-  "_from": "deep-extend@>=0.4.0 <0.5.0",
-  "_id": "deep-extend@0.4.1",
-  "_location": "/serialport/node-pre-gyp/rc/deep-extend",
-  "_nodeVersion": "0.12.0",
-  "_npmUser": {
-    "email": "lotsmanov89@gmail.com",
-    "name": "unclechu"
-  },
-  "_npmVersion": "2.5.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rc"
-  ],
-  "_resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz",
-  "_shasum": "efe4113d08085f4e6f9687759810f807469e2253",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "lotsmanov89@gmail.com",
-    "name": "Viacheslav Lotsmanov"
-  },
-  "bugs": {
-    "url": "https://github.com/unclechu/node-deep-extend/issues"
-  },
-  "contributors": [
-    {
-      "name": "Romain Prieto",
-      "url": "https://github.com/rprieto"
-    },
-    {
-      "name": "Max Maximov",
-      "url": "https://github.com/maxmaximov"
-    }
-  ],
-  "dependencies": {},
-  "description": "Recursive object extending",
-  "devDependencies": {
-    "mocha": "^2.2.1",
-    "should": "^5.2.0"
-  },
-  "directories": {
-    "lib": "./lib/",
-    "test": "./test/"
-  },
-  "dist": {
-    "shasum": "efe4113d08085f4e6f9687759810f807469e2253",
-    "tarball": "http://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz"
-  },
-  "engines": {
-    "iojs": ">=1.0.0",
-    "node": ">=0.12.0"
-  },
-  "files": [
-    "index.js",
-    "lib/deep-extend.js"
-  ],
-  "gitHead": "08e39356bba769744c669eb219a31fee07decd19",
-  "homepage": "https://github.com/unclechu/node-deep-extend",
-  "keywords": [
-    "clone",
-    "deep",
-    "deep-extend",
-    "extend",
-    "json",
-    "merge",
-    "recursive",
-    "xtend"
-  ],
-  "license": "MIT",
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "https://raw.githubusercontent.com/unclechu/node-deep-extend/master/LICENSE"
-    }
-  ],
-  "main": "lib/deep-extend.js",
-  "maintainers": [
-    {
-      "name": "unclechu",
-      "email": "lotsmanov89@gmail.com"
-    }
-  ],
-  "name": "deep-extend",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/unclechu/node-deep-extend.git"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "version": "0.4.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/README.md
deleted file mode 100644
index 33df258297db7f8d9ee8fa27899e5e617a270d03..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/README.md
+++ /dev/null
@@ -1,102 +0,0 @@
-An ini format parser and serializer for node.
-
-Sections are treated as nested objects.  Items before the first
-heading are saved on the object directly.
-
-## Usage
-
-Consider an ini-file `config.ini` that looks like this:
-
-    ; this comment is being ignored
-    scope = global
-
-    [database]
-    user = dbuser
-    password = dbpassword
-    database = use_this_database
-
-    [paths.default]
-    datadir = /var/lib/data
-    array[] = first value
-    array[] = second value
-    array[] = third value
-
-You can read, manipulate and write the ini-file like so:
-
-    var fs = require('fs')
-      , ini = require('ini')
-
-    var config = ini.parse(fs.readFileSync('./config.ini', 'utf-8'))
-
-    config.scope = 'local'
-    config.database.database = 'use_another_database'
-    config.paths.default.tmpdir = '/tmp'
-    delete config.paths.default.datadir
-    config.paths.default.array.push('fourth value')
-
-    fs.writeFileSync('./config_modified.ini', ini.stringify(config, { section: 'section' }))
-
-This will result in a file called `config_modified.ini` being written
-to the filesystem with the following content:
-
-    [section]
-    scope=local
-    [section.database]
-    user=dbuser
-    password=dbpassword
-    database=use_another_database
-    [section.paths.default]
-    tmpdir=/tmp
-    array[]=first value
-    array[]=second value
-    array[]=third value
-    array[]=fourth value
-
-
-## API
-
-### decode(inistring)
-
-Decode the ini-style formatted `inistring` into a nested object.
-
-### parse(inistring)
-
-Alias for `decode(inistring)`
-
-### encode(object, [options])
-
-Encode the object `object` into an ini-style formatted string. If the
-optional parameter `section` is given, then all top-level properties
-of the object are put into this section and the `section`-string is
-prepended to all sub-sections, see the usage example above.
-
-The `options` object may contain the following:
-
-* `section` A string which will be the first `section` in the encoded
-  ini data.  Defaults to none.
-* `whitespace` Boolean to specify whether to put whitespace around the
-  `=` character.  By default, whitespace is omitted, to be friendly to
-  some persnickety old parsers that don't tolerate it well.  But some
-  find that it's more human-readable and pretty with the whitespace.
-
-For backwards compatibility reasons, if a `string` options is passed
-in, then it is assumed to be the `section` value.
-
-### stringify(object, [options])
-
-Alias for `encode(object, [options])`
-
-### safe(val)
-
-Escapes the string `val` such that it is safe to be used as a key or
-value in an ini-file. Basically escapes quotes. For example
-
-    ini.safe('"unsafe string"')
-
-would result in
-
-    "\"unsafe string\""
-
-### unsafe(val)
-
-Unescapes the string `val`
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/ini.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/ini.js
deleted file mode 100644
index ddf5bd9cc6baeddb57cc0b765614c120c0f0a521..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/ini.js
+++ /dev/null
@@ -1,190 +0,0 @@
-
-exports.parse = exports.decode = decode
-exports.stringify = exports.encode = encode
-
-exports.safe = safe
-exports.unsafe = unsafe
-
-var eol = process.platform === "win32" ? "\r\n" : "\n"
-
-function encode (obj, opt) {
-  var children = []
-    , out = ""
-
-  if (typeof opt === "string") {
-    opt = {
-      section: opt,
-      whitespace: false
-    }
-  } else {
-    opt = opt || {}
-    opt.whitespace = opt.whitespace === true
-  }
-
-  var separator = opt.whitespace ? " = " : "="
-
-  Object.keys(obj).forEach(function (k, _, __) {
-    var val = obj[k]
-    if (val && Array.isArray(val)) {
-        val.forEach(function(item) {
-            out += safe(k + "[]") + separator + safe(item) + "\n"
-        })
-    }
-    else if (val && typeof val === "object") {
-      children.push(k)
-    } else {
-      out += safe(k) + separator + safe(val) + eol
-    }
-  })
-
-  if (opt.section && out.length) {
-    out = "[" + safe(opt.section) + "]" + eol + out
-  }
-
-  children.forEach(function (k, _, __) {
-    var nk = dotSplit(k).join('\\.')
-    var section = (opt.section ? opt.section + "." : "") + nk
-    var child = encode(obj[k], {
-      section: section,
-      whitespace: opt.whitespace
-    })
-    if (out.length && child.length) {
-      out += eol
-    }
-    out += child
-  })
-
-  return out
-}
-
-function dotSplit (str) {
-  return str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002')
-         .replace(/\\\./g, '\u0001')
-         .split(/\./).map(function (part) {
-           return part.replace(/\1/g, '\\.')
-                  .replace(/\2LITERAL\\1LITERAL\2/g, '\u0001')
-        })
-}
-
-function decode (str) {
-  var out = {}
-    , p = out
-    , section = null
-    , state = "START"
-           // section     |key = value
-    , re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i
-    , lines = str.split(/[\r\n]+/g)
-    , section = null
-
-  lines.forEach(function (line, _, __) {
-    if (!line || line.match(/^\s*[;#]/)) return
-    var match = line.match(re)
-    if (!match) return
-    if (match[1] !== undefined) {
-      section = unsafe(match[1])
-      p = out[section] = out[section] || {}
-      return
-    }
-    var key = unsafe(match[2])
-      , value = match[3] ? unsafe((match[4] || "")) : true
-    switch (value) {
-      case 'true':
-      case 'false':
-      case 'null': value = JSON.parse(value)
-    }
-
-    // Convert keys with '[]' suffix to an array
-    if (key.length > 2 && key.slice(-2) === "[]") {
-        key = key.substring(0, key.length - 2)
-        if (!p[key]) {
-          p[key] = []
-        }
-        else if (!Array.isArray(p[key])) {
-          p[key] = [p[key]]
-        }
-    }
-
-    // safeguard against resetting a previously defined
-    // array by accidentally forgetting the brackets
-    if (Array.isArray(p[key])) {
-      p[key].push(value)
-    }
-    else {
-      p[key] = value
-    }
-  })
-
-  // {a:{y:1},"a.b":{x:2}} --> {a:{y:1,b:{x:2}}}
-  // use a filter to return the keys that have to be deleted.
-  Object.keys(out).filter(function (k, _, __) {
-    if (!out[k] || typeof out[k] !== "object" || Array.isArray(out[k])) return false
-    // see if the parent section is also an object.
-    // if so, add it to that, and mark this one for deletion
-    var parts = dotSplit(k)
-      , p = out
-      , l = parts.pop()
-      , nl = l.replace(/\\\./g, '.')
-    parts.forEach(function (part, _, __) {
-      if (!p[part] || typeof p[part] !== "object") p[part] = {}
-      p = p[part]
-    })
-    if (p === out && nl === l) return false
-    p[nl] = out[k]
-    return true
-  }).forEach(function (del, _, __) {
-    delete out[del]
-  })
-
-  return out
-}
-
-function isQuoted (val) {
-  return (val.charAt(0) === "\"" && val.slice(-1) === "\"")
-         || (val.charAt(0) === "'" && val.slice(-1) === "'")
-}
-
-function safe (val) {
-  return ( typeof val !== "string"
-         || val.match(/[=\r\n]/)
-         || val.match(/^\[/)
-         || (val.length > 1
-             && isQuoted(val))
-         || val !== val.trim() )
-         ? JSON.stringify(val)
-         : val.replace(/;/g, '\\;').replace(/#/g, "\\#")
-}
-
-function unsafe (val, doUnesc) {
-  val = (val || "").trim()
-  if (isQuoted(val)) {
-    // remove the single quotes before calling JSON.parse
-    if (val.charAt(0) === "'") {
-      val = val.substr(1, val.length - 2);
-    }
-    try { val = JSON.parse(val) } catch (_) {}
-  } else {
-    // walk the val to find the first not-escaped ; character
-    var esc = false
-    var unesc = "";
-    for (var i = 0, l = val.length; i < l; i++) {
-      var c = val.charAt(i)
-      if (esc) {
-        if ("\\;#".indexOf(c) !== -1)
-          unesc += c
-        else
-          unesc += "\\" + c
-        esc = false
-      } else if (";#".indexOf(c) !== -1) {
-        break
-      } else if (c === "\\") {
-        esc = true
-      } else {
-        unesc += c
-      }
-    }
-    if (esc)
-      unesc += "\\"
-    return unesc
-  }
-  return val
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/package.json
deleted file mode 100644
index 2c1cd3e0f7928bf063fb3b57311b485dcd945f7e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/ini/package.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "_from": "ini@>=1.3.0 <1.4.0",
-  "_id": "ini@1.3.4",
-  "_location": "/serialport/node-pre-gyp/rc/ini",
-  "_nodeVersion": "2.0.1",
-  "_npmUser": {
-    "email": "isaacs@npmjs.com",
-    "name": "isaacs"
-  },
-  "_npmVersion": "2.10.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rc"
-  ],
-  "_resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
-  "_shasum": "0537cb79daf59b59a1a517dff706c86ec039162e",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/ini/issues"
-  },
-  "dependencies": {},
-  "description": "An ini encoder/decoder for node",
-  "devDependencies": {
-    "tap": "^1.2.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "0537cb79daf59b59a1a517dff706c86ec039162e",
-    "tarball": "http://registry.npmjs.org/ini/-/ini-1.3.4.tgz"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "files": [
-    "ini.js"
-  ],
-  "gitHead": "4a3001abc4c608e51add9f1d2b2cadf02b8e6dea",
-  "homepage": "https://github.com/isaacs/ini#readme",
-  "license": "ISC",
-  "main": "ini.js",
-  "maintainers": [
-    {
-      "name": "isaacs",
-      "email": "i@izs.me"
-    }
-  ],
-  "name": "ini",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/ini.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "1.3.4"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/.travis.yml
deleted file mode 100644
index 74c57bf15e23917bbae91364bf06534930d0fbf6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
-  - "0.12"
-  - "iojs"
-before_install:
-  - npm install -g npm@~1.4.6
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/LICENSE
deleted file mode 100644
index ee27ba4b4412b0e4a05af5e3d8a005bc6681fdf3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-This software is released under the MIT license:
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/example/parse.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/example/parse.js
deleted file mode 100644
index abff3e8ee8f5ef2ae2be753252ca8382a42a38f1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/example/parse.js
+++ /dev/null
@@ -1,2 +0,0 @@
-var argv = require('../')(process.argv.slice(2));
-console.dir(argv);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/index.js
deleted file mode 100644
index 6a0559d58133a8ad26660c333fd458ebe5ebbccf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/index.js
+++ /dev/null
@@ -1,236 +0,0 @@
-module.exports = function (args, opts) {
-    if (!opts) opts = {};
-    
-    var flags = { bools : {}, strings : {}, unknownFn: null };
-
-    if (typeof opts['unknown'] === 'function') {
-        flags.unknownFn = opts['unknown'];
-    }
-
-    if (typeof opts['boolean'] === 'boolean' && opts['boolean']) {
-      flags.allBools = true;
-    } else {
-      [].concat(opts['boolean']).filter(Boolean).forEach(function (key) {
-          flags.bools[key] = true;
-      });
-    }
-    
-    var aliases = {};
-    Object.keys(opts.alias || {}).forEach(function (key) {
-        aliases[key] = [].concat(opts.alias[key]);
-        aliases[key].forEach(function (x) {
-            aliases[x] = [key].concat(aliases[key].filter(function (y) {
-                return x !== y;
-            }));
-        });
-    });
-
-    [].concat(opts.string).filter(Boolean).forEach(function (key) {
-        flags.strings[key] = true;
-        if (aliases[key]) {
-            flags.strings[aliases[key]] = true;
-        }
-     });
-
-    var defaults = opts['default'] || {};
-    
-    var argv = { _ : [] };
-    Object.keys(flags.bools).forEach(function (key) {
-        setArg(key, defaults[key] === undefined ? false : defaults[key]);
-    });
-    
-    var notFlags = [];
-
-    if (args.indexOf('--') !== -1) {
-        notFlags = args.slice(args.indexOf('--')+1);
-        args = args.slice(0, args.indexOf('--'));
-    }
-
-    function argDefined(key, arg) {
-        return (flags.allBools && /^--[^=]+$/.test(arg)) ||
-            flags.strings[key] || flags.bools[key] || aliases[key];
-    }
-
-    function setArg (key, val, arg) {
-        if (arg && flags.unknownFn && !argDefined(key, arg)) {
-            if (flags.unknownFn(arg) === false) return;
-        }
-
-        var value = !flags.strings[key] && isNumber(val)
-            ? Number(val) : val
-        ;
-        setKey(argv, key.split('.'), value);
-        
-        (aliases[key] || []).forEach(function (x) {
-            setKey(argv, x.split('.'), value);
-        });
-    }
-
-    function setKey (obj, keys, value) {
-        var o = obj;
-        keys.slice(0,-1).forEach(function (key) {
-            if (o[key] === undefined) o[key] = {};
-            o = o[key];
-        });
-
-        var key = keys[keys.length - 1];
-        if (o[key] === undefined || flags.bools[key] || typeof o[key] === 'boolean') {
-            o[key] = value;
-        }
-        else if (Array.isArray(o[key])) {
-            o[key].push(value);
-        }
-        else {
-            o[key] = [ o[key], value ];
-        }
-    }
-    
-    function aliasIsBoolean(key) {
-      return aliases[key].some(function (x) {
-          return flags.bools[x];
-      });
-    }
-
-    for (var i = 0; i < args.length; i++) {
-        var arg = args[i];
-        
-        if (/^--.+=/.test(arg)) {
-            // Using [\s\S] instead of . because js doesn't support the
-            // 'dotall' regex modifier. See:
-            // http://stackoverflow.com/a/1068308/13216
-            var m = arg.match(/^--([^=]+)=([\s\S]*)$/);
-            var key = m[1];
-            var value = m[2];
-            if (flags.bools[key]) {
-                value = value !== 'false';
-            }
-            setArg(key, value, arg);
-        }
-        else if (/^--no-.+/.test(arg)) {
-            var key = arg.match(/^--no-(.+)/)[1];
-            setArg(key, false, arg);
-        }
-        else if (/^--.+/.test(arg)) {
-            var key = arg.match(/^--(.+)/)[1];
-            var next = args[i + 1];
-            if (next !== undefined && !/^-/.test(next)
-            && !flags.bools[key]
-            && !flags.allBools
-            && (aliases[key] ? !aliasIsBoolean(key) : true)) {
-                setArg(key, next, arg);
-                i++;
-            }
-            else if (/^(true|false)$/.test(next)) {
-                setArg(key, next === 'true', arg);
-                i++;
-            }
-            else {
-                setArg(key, flags.strings[key] ? '' : true, arg);
-            }
-        }
-        else if (/^-[^-]+/.test(arg)) {
-            var letters = arg.slice(1,-1).split('');
-            
-            var broken = false;
-            for (var j = 0; j < letters.length; j++) {
-                var next = arg.slice(j+2);
-                
-                if (next === '-') {
-                    setArg(letters[j], next, arg)
-                    continue;
-                }
-                
-                if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
-                    setArg(letters[j], next.split('=')[1], arg);
-                    broken = true;
-                    break;
-                }
-                
-                if (/[A-Za-z]/.test(letters[j])
-                && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
-                    setArg(letters[j], next, arg);
-                    broken = true;
-                    break;
-                }
-                
-                if (letters[j+1] && letters[j+1].match(/\W/)) {
-                    setArg(letters[j], arg.slice(j+2), arg);
-                    broken = true;
-                    break;
-                }
-                else {
-                    setArg(letters[j], flags.strings[letters[j]] ? '' : true, arg);
-                }
-            }
-            
-            var key = arg.slice(-1)[0];
-            if (!broken && key !== '-') {
-                if (args[i+1] && !/^(-|--)[^-]/.test(args[i+1])
-                && !flags.bools[key]
-                && (aliases[key] ? !aliasIsBoolean(key) : true)) {
-                    setArg(key, args[i+1], arg);
-                    i++;
-                }
-                else if (args[i+1] && /true|false/.test(args[i+1])) {
-                    setArg(key, args[i+1] === 'true', arg);
-                    i++;
-                }
-                else {
-                    setArg(key, flags.strings[key] ? '' : true, arg);
-                }
-            }
-        }
-        else {
-            if (!flags.unknownFn || flags.unknownFn(arg) !== false) {
-                argv._.push(
-                    flags.strings['_'] || !isNumber(arg) ? arg : Number(arg)
-                );
-            }
-            if (opts.stopEarly) {
-                argv._.push.apply(argv._, args.slice(i + 1));
-                break;
-            }
-        }
-    }
-    
-    Object.keys(defaults).forEach(function (key) {
-        if (!hasKey(argv, key.split('.'))) {
-            setKey(argv, key.split('.'), defaults[key]);
-            
-            (aliases[key] || []).forEach(function (x) {
-                setKey(argv, x.split('.'), defaults[key]);
-            });
-        }
-    });
-    
-    if (opts['--']) {
-        argv['--'] = new Array();
-        notFlags.forEach(function(key) {
-            argv['--'].push(key);
-        });
-    }
-    else {
-        notFlags.forEach(function(key) {
-            argv._.push(key);
-        });
-    }
-
-    return argv;
-};
-
-function hasKey (obj, keys) {
-    var o = obj;
-    keys.slice(0,-1).forEach(function (key) {
-        o = (o[key] || {});
-    });
-
-    var key = keys[keys.length - 1];
-    return key in o;
-}
-
-function isNumber (x) {
-    if (typeof x === 'number') return true;
-    if (/^0x[0-9a-f]+$/i.test(x)) return true;
-    return /^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(x);
-}
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/package.json
deleted file mode 100644
index b253b8dfa84294ff4988c285e5ac2dec7590b23c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/package.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
-  "_from": "minimist@>=1.2.0 <2.0.0",
-  "_id": "minimist@1.2.0",
-  "_location": "/serialport/node-pre-gyp/rc/minimist",
-  "_nodeVersion": "2.4.0",
-  "_npmUser": {
-    "email": "substack@gmail.com",
-    "name": "substack"
-  },
-  "_npmVersion": "3.2.2",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rc"
-  ],
-  "_resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-  "_shasum": "a35008b20f41383eec1fb914f4cd5df79a264284",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@substack.net",
-    "name": "James Halliday",
-    "url": "http://substack.net"
-  },
-  "bugs": {
-    "url": "https://github.com/substack/minimist/issues"
-  },
-  "dependencies": {},
-  "description": "parse argument options",
-  "devDependencies": {
-    "covert": "^1.0.0",
-    "tap": "~0.4.0",
-    "tape": "^3.5.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "a35008b20f41383eec1fb914f4cd5df79a264284",
-    "tarball": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz"
-  },
-  "gitHead": "dc624482fcfec5bc669c68cdb861f00573ed4e64",
-  "homepage": "https://github.com/substack/minimist",
-  "keywords": [
-    "argv",
-    "getopt",
-    "optimist",
-    "parser"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "substack",
-      "email": "mail@substack.net"
-    }
-  ],
-  "name": "minimist",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/substack/minimist.git"
-  },
-  "scripts": {
-    "coverage": "covert test/*.js",
-    "test": "tap test/*.js"
-  },
-  "testling": {
-    "browsers": [
-      "chrome/10",
-      "chrome/latest",
-      "ff/5",
-      "firefox/latest",
-      "ie/6..latest",
-      "opera/12",
-      "safari/5.1",
-      "safari/latest"
-    ],
-    "files": "test/*.js"
-  },
-  "version": "1.2.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/readme.markdown b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/readme.markdown
deleted file mode 100644
index 30a74cf8c158d7593c2c9b80de79d1e46f09c612..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/readme.markdown
+++ /dev/null
@@ -1,91 +0,0 @@
-# minimist
-
-parse argument options
-
-This module is the guts of optimist's argument parser without all the
-fanciful decoration.
-
-[![browser support](https://ci.testling.com/substack/minimist.png)](http://ci.testling.com/substack/minimist)
-
-[![build status](https://secure.travis-ci.org/substack/minimist.png)](http://travis-ci.org/substack/minimist)
-
-# example
-
-``` js
-var argv = require('minimist')(process.argv.slice(2));
-console.dir(argv);
-```
-
-```
-$ node example/parse.js -a beep -b boop
-{ _: [], a: 'beep', b: 'boop' }
-```
-
-```
-$ node example/parse.js -x 3 -y 4 -n5 -abc --beep=boop foo bar baz
-{ _: [ 'foo', 'bar', 'baz' ],
-  x: 3,
-  y: 4,
-  n: 5,
-  a: true,
-  b: true,
-  c: true,
-  beep: 'boop' }
-```
-
-# methods
-
-``` js
-var parseArgs = require('minimist')
-```
-
-## var argv = parseArgs(args, opts={})
-
-Return an argument object `argv` populated with the array arguments from `args`.
-
-`argv._` contains all the arguments that didn't have an option associated with
-them.
-
-Numeric-looking arguments will be returned as numbers unless `opts.string` or
-`opts.boolean` is set for that argument name.
-
-Any arguments after `'--'` will not be parsed and will end up in `argv._`.
-
-options can be:
-
-* `opts.string` - a string or array of strings argument names to always treat as
-strings
-* `opts.boolean` - a boolean, string or array of strings to always treat as
-booleans. if `true` will treat all double hyphenated arguments without equal signs
-as boolean (e.g. affects `--foo`, not `-f` or `--foo=bar`)
-* `opts.alias` - an object mapping string names to strings or arrays of string
-argument names to use as aliases
-* `opts.default` - an object mapping string argument names to default values
-* `opts.stopEarly` - when true, populate `argv._` with everything after the
-first non-option
-* `opts['--']` - when true, populate `argv._` with everything before the `--`
-and `argv['--']` with everything after the `--`. Here's an example:
-* `opts.unknown` - a function which is invoked with a command line parameter not
-defined in the `opts` configuration object. If the function returns `false`, the
-unknown option is not added to `argv`.
-
-```
-> require('./')('one two three -- four five --six'.split(' '), { '--': true })
-{ _: [ 'one', 'two', 'three' ],
-  '--': [ 'four', 'five', '--six' ] }
-```
-
-Note that with `opts['--']` set, parsing for arguments still stops after the
-`--`.
-
-# install
-
-With [npm](https://npmjs.org) do:
-
-```
-npm install minimist
-```
-
-# license
-
-MIT
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/all_bool.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/all_bool.js
deleted file mode 100644
index ac835483d9a659e7e08da5422ff3ad70bb627776..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/all_bool.js
+++ /dev/null
@@ -1,32 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('flag boolean true (default all --args to boolean)', function (t) {
-    var argv = parse(['moo', '--honk', 'cow'], {
-        boolean: true
-    });
-    
-    t.deepEqual(argv, {
-        honk: true,
-        _: ['moo', 'cow']
-    });
-    
-    t.deepEqual(typeof argv.honk, 'boolean');
-    t.end();
-});
-
-test('flag boolean true only affects double hyphen arguments without equals signs', function (t) {
-    var argv = parse(['moo', '--honk', 'cow', '-p', '55', '--tacos=good'], {
-        boolean: true
-    });
-    
-    t.deepEqual(argv, {
-        honk: true,
-        tacos: 'good',
-        p: 55,
-        _: ['moo', 'cow']
-    });
-    
-    t.deepEqual(typeof argv.honk, 'boolean');
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/bool.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/bool.js
deleted file mode 100644
index 14b0717cefd5e92ab018ea9104298163891ea264..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/bool.js
+++ /dev/null
@@ -1,166 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('flag boolean default false', function (t) {
-    var argv = parse(['moo'], {
-        boolean: ['t', 'verbose'],
-        default: { verbose: false, t: false }
-    });
-    
-    t.deepEqual(argv, {
-        verbose: false,
-        t: false,
-        _: ['moo']
-    });
-    
-    t.deepEqual(typeof argv.verbose, 'boolean');
-    t.deepEqual(typeof argv.t, 'boolean');
-    t.end();
-
-});
-
-test('boolean groups', function (t) {
-    var argv = parse([ '-x', '-z', 'one', 'two', 'three' ], {
-        boolean: ['x','y','z']
-    });
-    
-    t.deepEqual(argv, {
-        x : true,
-        y : false,
-        z : true,
-        _ : [ 'one', 'two', 'three' ]
-    });
-    
-    t.deepEqual(typeof argv.x, 'boolean');
-    t.deepEqual(typeof argv.y, 'boolean');
-    t.deepEqual(typeof argv.z, 'boolean');
-    t.end();
-});
-test('boolean and alias with chainable api', function (t) {
-    var aliased = [ '-h', 'derp' ];
-    var regular = [ '--herp',  'derp' ];
-    var opts = {
-        herp: { alias: 'h', boolean: true }
-    };
-    var aliasedArgv = parse(aliased, {
-        boolean: 'herp',
-        alias: { h: 'herp' }
-    });
-    var propertyArgv = parse(regular, {
-        boolean: 'herp',
-        alias: { h: 'herp' }
-    });
-    var expected = {
-        herp: true,
-        h: true,
-        '_': [ 'derp' ]
-    };
-    
-    t.same(aliasedArgv, expected);
-    t.same(propertyArgv, expected); 
-    t.end();
-});
-
-test('boolean and alias with options hash', function (t) {
-    var aliased = [ '-h', 'derp' ];
-    var regular = [ '--herp', 'derp' ];
-    var opts = {
-        alias: { 'h': 'herp' },
-        boolean: 'herp'
-    };
-    var aliasedArgv = parse(aliased, opts);
-    var propertyArgv = parse(regular, opts);
-    var expected = {
-        herp: true,
-        h: true,
-        '_': [ 'derp' ]
-    };
-    t.same(aliasedArgv, expected);
-    t.same(propertyArgv, expected);
-    t.end();
-});
-
-test('boolean and alias array with options hash', function (t) {
-    var aliased = [ '-h', 'derp' ];
-    var regular = [ '--herp', 'derp' ];
-    var alt = [ '--harp', 'derp' ];
-    var opts = {
-        alias: { 'h': ['herp', 'harp'] },
-        boolean: 'h'
-    };
-    var aliasedArgv = parse(aliased, opts);
-    var propertyArgv = parse(regular, opts);
-    var altPropertyArgv = parse(alt, opts);
-    var expected = {
-        harp: true,
-        herp: true,
-        h: true,
-        '_': [ 'derp' ]
-    };
-    t.same(aliasedArgv, expected);
-    t.same(propertyArgv, expected);
-    t.same(altPropertyArgv, expected);
-    t.end();
-});
-
-test('boolean and alias using explicit true', function (t) {
-    var aliased = [ '-h', 'true' ];
-    var regular = [ '--herp',  'true' ];
-    var opts = {
-        alias: { h: 'herp' },
-        boolean: 'h'
-    };
-    var aliasedArgv = parse(aliased, opts);
-    var propertyArgv = parse(regular, opts);
-    var expected = {
-        herp: true,
-        h: true,
-        '_': [ ]
-    };
-
-    t.same(aliasedArgv, expected);
-    t.same(propertyArgv, expected); 
-    t.end();
-});
-
-// regression, see https://github.com/substack/node-optimist/issues/71
-test('boolean and --x=true', function(t) {
-    var parsed = parse(['--boool', '--other=true'], {
-        boolean: 'boool'
-    });
-
-    t.same(parsed.boool, true);
-    t.same(parsed.other, 'true');
-
-    parsed = parse(['--boool', '--other=false'], {
-        boolean: 'boool'
-    });
-    
-    t.same(parsed.boool, true);
-    t.same(parsed.other, 'false');
-    t.end();
-});
-
-test('boolean --boool=true', function (t) {
-    var parsed = parse(['--boool=true'], {
-        default: {
-            boool: false
-        },
-        boolean: ['boool']
-    });
-
-    t.same(parsed.boool, true);
-    t.end();
-});
-
-test('boolean --boool=false', function (t) {
-    var parsed = parse(['--boool=false'], {
-        default: {
-          boool: true
-        },
-        boolean: ['boool']
-    });
-
-    t.same(parsed.boool, false);
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dash.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dash.js
deleted file mode 100644
index 5a4fa5be41859680bd14bd441d5c1e9651a09fee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dash.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('-', function (t) {
-    t.plan(5);
-    t.deepEqual(parse([ '-n', '-' ]), { n: '-', _: [] });
-    t.deepEqual(parse([ '-' ]), { _: [ '-' ] });
-    t.deepEqual(parse([ '-f-' ]), { f: '-', _: [] });
-    t.deepEqual(
-        parse([ '-b', '-' ], { boolean: 'b' }),
-        { b: true, _: [ '-' ] }
-    );
-    t.deepEqual(
-        parse([ '-s', '-' ], { string: 's' }),
-        { s: '-', _: [] }
-    );
-});
-
-test('-a -- b', function (t) {
-    t.plan(3);
-    t.deepEqual(parse([ '-a', '--', 'b' ]), { a: true, _: [ 'b' ] });
-    t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
-    t.deepEqual(parse([ '--a', '--', 'b' ]), { a: true, _: [ 'b' ] });
-});
-
-test('move arguments after the -- into their own `--` array', function(t) {
-    t.plan(1);
-    t.deepEqual(
-        parse([ '--name', 'John', 'before', '--', 'after' ], { '--': true }),
-        { name: 'John', _: [ 'before' ], '--': [ 'after' ] });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/default_bool.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/default_bool.js
deleted file mode 100644
index 780a311270fcda30fa3d654955b89be12bc3718b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/default_bool.js
+++ /dev/null
@@ -1,35 +0,0 @@
-var test = require('tape');
-var parse = require('../');
-
-test('boolean default true', function (t) {
-    var argv = parse([], {
-        boolean: 'sometrue',
-        default: { sometrue: true }
-    });
-    t.equal(argv.sometrue, true);
-    t.end();
-});
-
-test('boolean default false', function (t) {
-    var argv = parse([], {
-        boolean: 'somefalse',
-        default: { somefalse: false }
-    });
-    t.equal(argv.somefalse, false);
-    t.end();
-});
-
-test('boolean default to null', function (t) {
-    var argv = parse([], {
-        boolean: 'maybe',
-        default: { maybe: null }
-    });
-    t.equal(argv.maybe, null);
-    var argv = parse(['--maybe'], {
-        boolean: 'maybe',
-        default: { maybe: null }
-    });
-    t.equal(argv.maybe, true);
-    t.end();
-
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dotted.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dotted.js
deleted file mode 100644
index d8b3e856ec795fe4916eca6d0d0dd2648d103b52..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/dotted.js
+++ /dev/null
@@ -1,22 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('dotted alias', function (t) {
-    var argv = parse(['--a.b', '22'], {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
-    t.equal(argv.a.b, 22);
-    t.equal(argv.aa.bb, 22);
-    t.end();
-});
-
-test('dotted default', function (t) {
-    var argv = parse('', {default: {'a.b': 11}, alias: {'a.b': 'aa.bb'}});
-    t.equal(argv.a.b, 11);
-    t.equal(argv.aa.bb, 11);
-    t.end();
-});
-
-test('dotted default with no alias', function (t) {
-    var argv = parse('', {default: {'a.b': 11}});
-    t.equal(argv.a.b, 11);
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/kv_short.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/kv_short.js
deleted file mode 100644
index f813b305057b0a85fccfa97ecd4718254862e193..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/kv_short.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('short -k=v' , function (t) {
-    t.plan(1);
-    
-    var argv = parse([ '-b=123' ]);
-    t.deepEqual(argv, { b: 123, _: [] });
-});
-
-test('multi short -k=v' , function (t) {
-    t.plan(1);
-    
-    var argv = parse([ '-a=whatever', '-b=robots' ]);
-    t.deepEqual(argv, { a: 'whatever', b: 'robots', _: [] });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/long.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/long.js
deleted file mode 100644
index 5d3a1e09d3b64ca2f00ce89e5d3447b4bcafb34e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/long.js
+++ /dev/null
@@ -1,31 +0,0 @@
-var test = require('tape');
-var parse = require('../');
-
-test('long opts', function (t) {
-    t.deepEqual(
-        parse([ '--bool' ]),
-        { bool : true, _ : [] },
-        'long boolean'
-    );
-    t.deepEqual(
-        parse([ '--pow', 'xixxle' ]),
-        { pow : 'xixxle', _ : [] },
-        'long capture sp'
-    );
-    t.deepEqual(
-        parse([ '--pow=xixxle' ]),
-        { pow : 'xixxle', _ : [] },
-        'long capture eq'
-    );
-    t.deepEqual(
-        parse([ '--host', 'localhost', '--port', '555' ]),
-        { host : 'localhost', port : 555, _ : [] },
-        'long captures sp'
-    );
-    t.deepEqual(
-        parse([ '--host=localhost', '--port=555' ]),
-        { host : 'localhost', port : 555, _ : [] },
-        'long captures eq'
-    );
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/num.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/num.js
deleted file mode 100644
index 2cc77f4d62ffb2e050cfb114394f70d08c44522c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/num.js
+++ /dev/null
@@ -1,36 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('nums', function (t) {
-    var argv = parse([
-        '-x', '1234',
-        '-y', '5.67',
-        '-z', '1e7',
-        '-w', '10f',
-        '--hex', '0xdeadbeef',
-        '789'
-    ]);
-    t.deepEqual(argv, {
-        x : 1234,
-        y : 5.67,
-        z : 1e7,
-        w : '10f',
-        hex : 0xdeadbeef,
-        _ : [ 789 ]
-    });
-    t.deepEqual(typeof argv.x, 'number');
-    t.deepEqual(typeof argv.y, 'number');
-    t.deepEqual(typeof argv.z, 'number');
-    t.deepEqual(typeof argv.w, 'string');
-    t.deepEqual(typeof argv.hex, 'number');
-    t.deepEqual(typeof argv._[0], 'number');
-    t.end();
-});
-
-test('already a number', function (t) {
-    var argv = parse([ '-x', 1234, 789 ]);
-    t.deepEqual(argv, { x : 1234, _ : [ 789 ] });
-    t.deepEqual(typeof argv.x, 'number');
-    t.deepEqual(typeof argv._[0], 'number');
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse.js
deleted file mode 100644
index 7b4a2a17c0dda56c4aac7b0a5ba54bd3da8ef26b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse.js
+++ /dev/null
@@ -1,197 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('parse args', function (t) {
-    t.deepEqual(
-        parse([ '--no-moo' ]),
-        { moo : false, _ : [] },
-        'no'
-    );
-    t.deepEqual(
-        parse([ '-v', 'a', '-v', 'b', '-v', 'c' ]),
-        { v : ['a','b','c'], _ : [] },
-        'multi'
-    );
-    t.end();
-});
- 
-test('comprehensive', function (t) {
-    t.deepEqual(
-        parse([
-            '--name=meowmers', 'bare', '-cats', 'woo',
-            '-h', 'awesome', '--multi=quux',
-            '--key', 'value',
-            '-b', '--bool', '--no-meep', '--multi=baz',
-            '--', '--not-a-flag', 'eek'
-        ]),
-        {
-            c : true,
-            a : true,
-            t : true,
-            s : 'woo',
-            h : 'awesome',
-            b : true,
-            bool : true,
-            key : 'value',
-            multi : [ 'quux', 'baz' ],
-            meep : false,
-            name : 'meowmers',
-            _ : [ 'bare', '--not-a-flag', 'eek' ]
-        }
-    );
-    t.end();
-});
-
-test('flag boolean', function (t) {
-    var argv = parse([ '-t', 'moo' ], { boolean: 't' });
-    t.deepEqual(argv, { t : true, _ : [ 'moo' ] });
-    t.deepEqual(typeof argv.t, 'boolean');
-    t.end();
-});
-
-test('flag boolean value', function (t) {
-    var argv = parse(['--verbose', 'false', 'moo', '-t', 'true'], {
-        boolean: [ 't', 'verbose' ],
-        default: { verbose: true }
-    });
-    
-    t.deepEqual(argv, {
-        verbose: false,
-        t: true,
-        _: ['moo']
-    });
-    
-    t.deepEqual(typeof argv.verbose, 'boolean');
-    t.deepEqual(typeof argv.t, 'boolean');
-    t.end();
-});
-
-test('newlines in params' , function (t) {
-    var args = parse([ '-s', "X\nX" ])
-    t.deepEqual(args, { _ : [], s : "X\nX" });
-    
-    // reproduce in bash:
-    // VALUE="new
-    // line"
-    // node program.js --s="$VALUE"
-    args = parse([ "--s=X\nX" ])
-    t.deepEqual(args, { _ : [], s : "X\nX" });
-    t.end();
-});
-
-test('strings' , function (t) {
-    var s = parse([ '-s', '0001234' ], { string: 's' }).s;
-    t.equal(s, '0001234');
-    t.equal(typeof s, 'string');
-    
-    var x = parse([ '-x', '56' ], { string: 'x' }).x;
-    t.equal(x, '56');
-    t.equal(typeof x, 'string');
-    t.end();
-});
-
-test('stringArgs', function (t) {
-    var s = parse([ '  ', '  ' ], { string: '_' })._;
-    t.same(s.length, 2);
-    t.same(typeof s[0], 'string');
-    t.same(s[0], '  ');
-    t.same(typeof s[1], 'string');
-    t.same(s[1], '  ');
-    t.end();
-});
-
-test('empty strings', function(t) {
-    var s = parse([ '-s' ], { string: 's' }).s;
-    t.equal(s, '');
-    t.equal(typeof s, 'string');
-
-    var str = parse([ '--str' ], { string: 'str' }).str;
-    t.equal(str, '');
-    t.equal(typeof str, 'string');
-
-    var letters = parse([ '-art' ], {
-        string: [ 'a', 't' ]
-    });
-
-    t.equal(letters.a, '');
-    t.equal(letters.r, true);
-    t.equal(letters.t, '');
-
-    t.end();
-});
-
-
-test('string and alias', function(t) {
-    var x = parse([ '--str',  '000123' ], {
-        string: 's',
-        alias: { s: 'str' }
-    });
-
-    t.equal(x.str, '000123');
-    t.equal(typeof x.str, 'string');
-    t.equal(x.s, '000123');
-    t.equal(typeof x.s, 'string');
-
-    var y = parse([ '-s',  '000123' ], {
-        string: 'str',
-        alias: { str: 's' }
-    });
-
-    t.equal(y.str, '000123');
-    t.equal(typeof y.str, 'string');
-    t.equal(y.s, '000123');
-    t.equal(typeof y.s, 'string');
-    t.end();
-});
-
-test('slashBreak', function (t) {
-    t.same(
-        parse([ '-I/foo/bar/baz' ]),
-        { I : '/foo/bar/baz', _ : [] }
-    );
-    t.same(
-        parse([ '-xyz/foo/bar/baz' ]),
-        { x : true, y : true, z : '/foo/bar/baz', _ : [] }
-    );
-    t.end();
-});
-
-test('alias', function (t) {
-    var argv = parse([ '-f', '11', '--zoom', '55' ], {
-        alias: { z: 'zoom' }
-    });
-    t.equal(argv.zoom, 55);
-    t.equal(argv.z, argv.zoom);
-    t.equal(argv.f, 11);
-    t.end();
-});
-
-test('multiAlias', function (t) {
-    var argv = parse([ '-f', '11', '--zoom', '55' ], {
-        alias: { z: [ 'zm', 'zoom' ] }
-    });
-    t.equal(argv.zoom, 55);
-    t.equal(argv.z, argv.zoom);
-    t.equal(argv.z, argv.zm);
-    t.equal(argv.f, 11);
-    t.end();
-});
-
-test('nested dotted objects', function (t) {
-    var argv = parse([
-        '--foo.bar', '3', '--foo.baz', '4',
-        '--foo.quux.quibble', '5', '--foo.quux.o_O',
-        '--beep.boop'
-    ]);
-    
-    t.same(argv.foo, {
-        bar : 3,
-        baz : 4,
-        quux : {
-            quibble : 5,
-            o_O : true
-        }
-    });
-    t.same(argv.beep, { boop : true });
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse_modified.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse_modified.js
deleted file mode 100644
index ab620dc5e4dc398a8e7531b8913bfc0416ebcd4e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/parse_modified.js
+++ /dev/null
@@ -1,9 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('parse with modifier functions' , function (t) {
-    t.plan(1);
-    
-    var argv = parse([ '-b', '123' ], { boolean: 'b' });
-    t.deepEqual(argv, { b: true, _: [123] });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/short.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/short.js
deleted file mode 100644
index d513a1c2529095aba51bff9413cfe2942d3f2d09..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/short.js
+++ /dev/null
@@ -1,67 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('numeric short args', function (t) {
-    t.plan(2);
-    t.deepEqual(parse([ '-n123' ]), { n: 123, _: [] });
-    t.deepEqual(
-        parse([ '-123', '456' ]),
-        { 1: true, 2: true, 3: 456, _: [] }
-    );
-});
-
-test('short', function (t) {
-    t.deepEqual(
-        parse([ '-b' ]),
-        { b : true, _ : [] },
-        'short boolean'
-    );
-    t.deepEqual(
-        parse([ 'foo', 'bar', 'baz' ]),
-        { _ : [ 'foo', 'bar', 'baz' ] },
-        'bare'
-    );
-    t.deepEqual(
-        parse([ '-cats' ]),
-        { c : true, a : true, t : true, s : true, _ : [] },
-        'group'
-    );
-    t.deepEqual(
-        parse([ '-cats', 'meow' ]),
-        { c : true, a : true, t : true, s : 'meow', _ : [] },
-        'short group next'
-    );
-    t.deepEqual(
-        parse([ '-h', 'localhost' ]),
-        { h : 'localhost', _ : [] },
-        'short capture'
-    );
-    t.deepEqual(
-        parse([ '-h', 'localhost', '-p', '555' ]),
-        { h : 'localhost', p : 555, _ : [] },
-        'short captures'
-    );
-    t.end();
-});
- 
-test('mixed short bool and capture', function (t) {
-    t.same(
-        parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
-        {
-            f : true, p : 555, h : 'localhost',
-            _ : [ 'script.js' ]
-        }
-    );
-    t.end();
-});
- 
-test('short and long', function (t) {
-    t.deepEqual(
-        parse([ '-h', 'localhost', '-fp', '555', 'script.js' ]),
-        {
-            f : true, p : 555, h : 'localhost',
-            _ : [ 'script.js' ]
-        }
-    );
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/stop_early.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/stop_early.js
deleted file mode 100644
index bdf9fbcb0b57ab5cd4c31eb68a32c1952df2d7bc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/stop_early.js
+++ /dev/null
@@ -1,15 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('stops parsing on the first non-option when stopEarly is set', function (t) {
-    var argv = parse(['--aaa', 'bbb', 'ccc', '--ddd'], {
-        stopEarly: true
-    });
-
-    t.deepEqual(argv, {
-        aaa: 'bbb',
-        _: ['ccc', '--ddd']
-    });
-
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/unknown.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/unknown.js
deleted file mode 100644
index 462a36bdd7ec9f5ceca948ff6365a6479704457b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/unknown.js
+++ /dev/null
@@ -1,102 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('boolean and alias is not unknown', function (t) {
-    var unknown = [];
-    function unknownFn(arg) {
-        unknown.push(arg);
-        return false;
-    }
-    var aliased = [ '-h', 'true', '--derp', 'true' ];
-    var regular = [ '--herp',  'true', '-d', 'true' ];
-    var opts = {
-        alias: { h: 'herp' },
-        boolean: 'h',
-        unknown: unknownFn
-    };
-    var aliasedArgv = parse(aliased, opts);
-    var propertyArgv = parse(regular, opts);
-
-    t.same(unknown, ['--derp', '-d']);
-    t.end();
-});
-
-test('flag boolean true any double hyphen argument is not unknown', function (t) {
-    var unknown = [];
-    function unknownFn(arg) {
-        unknown.push(arg);
-        return false;
-    }
-    var argv = parse(['--honk', '--tacos=good', 'cow', '-p', '55'], {
-        boolean: true,
-        unknown: unknownFn
-    });
-    t.same(unknown, ['--tacos=good', 'cow', '-p']);
-    t.same(argv, {
-        honk: true,
-        _: []
-    });
-    t.end();
-});
-
-test('string and alias is not unknown', function (t) {
-    var unknown = [];
-    function unknownFn(arg) {
-        unknown.push(arg);
-        return false;
-    }
-    var aliased = [ '-h', 'hello', '--derp', 'goodbye' ];
-    var regular = [ '--herp',  'hello', '-d', 'moon' ];
-    var opts = {
-        alias: { h: 'herp' },
-        string: 'h',
-        unknown: unknownFn
-    };
-    var aliasedArgv = parse(aliased, opts);
-    var propertyArgv = parse(regular, opts);
-
-    t.same(unknown, ['--derp', '-d']);
-    t.end();
-});
-
-test('default and alias is not unknown', function (t) {
-    var unknown = [];
-    function unknownFn(arg) {
-        unknown.push(arg);
-        return false;
-    }
-    var aliased = [ '-h', 'hello' ];
-    var regular = [ '--herp',  'hello' ];
-    var opts = {
-        default: { 'h': 'bar' },
-        alias: { 'h': 'herp' },
-        unknown: unknownFn
-    };
-    var aliasedArgv = parse(aliased, opts);
-    var propertyArgv = parse(regular, opts);
-
-    t.same(unknown, []);
-    t.end();
-    unknownFn(); // exercise fn for 100% coverage
-});
-
-test('value following -- is not unknown', function (t) {
-    var unknown = [];
-    function unknownFn(arg) {
-        unknown.push(arg);
-        return false;
-    }
-    var aliased = [ '--bad', '--', 'good', 'arg' ];
-    var opts = {
-        '--': true,
-        unknown: unknownFn
-    };
-    var argv = parse(aliased, opts);
-
-    t.same(unknown, ['--bad']);
-    t.same(argv, {
-        '--': ['good', 'arg'],
-        '_': []
-    })
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/whitespace.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/whitespace.js
deleted file mode 100644
index 8a52a58cecfd7adea084403f6250fe09e7873eba..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/minimist/test/whitespace.js
+++ /dev/null
@@ -1,8 +0,0 @@
-var parse = require('../');
-var test = require('tape');
-
-test('whitespace should be whitespace' , function (t) {
-    t.plan(1);
-    var x = parse([ '-x', '\t' ]).x;
-    t.equal(x, '\t');
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/cli.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/cli.js
deleted file mode 100755
index aec5aa20e4a073a78f1988477f7ae9537e37b1d8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/cli.js
+++ /dev/null
@@ -1,41 +0,0 @@
-#!/usr/bin/env node
-'use strict';
-var fs = require('fs');
-var strip = require('./strip-json-comments');
-var input = process.argv[2];
-
-
-function getStdin(cb) {
-	var ret = '';
-
-	process.stdin.setEncoding('utf8');
-
-	process.stdin.on('data', function (data) {
-		ret += data;
-	});
-
-	process.stdin.on('end', function () {
-		cb(ret);
-	});
-}
-
-if (process.argv.indexOf('-h') !== -1 || process.argv.indexOf('--help') !== -1) {
-	console.log('strip-json-comments input-file > output-file');
-	console.log('or');
-	console.log('strip-json-comments < input-file > output-file');
-	return;
-}
-
-if (process.argv.indexOf('-v') !== -1 || process.argv.indexOf('--version') !== -1) {
-	console.log(require('./package').version);
-	return;
-}
-
-if (input) {
-	process.stdout.write(strip(fs.readFileSync(input, 'utf8')));
-	return;
-}
-
-getStdin(function (data) {
-	process.stdout.write(strip(data));
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/package.json
deleted file mode 100644
index 7d4f577ebf07860006b19a98305dbfd96e159ba8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/package.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "_from": "strip-json-comments@>=1.0.4 <1.1.0",
-  "_id": "strip-json-comments@1.0.4",
-  "_location": "/serialport/node-pre-gyp/rc/strip-json-comments",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rc"
-  ],
-  "_resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
-  "_shasum": "1e15fbcac97d3ee99bf2d73b4c656b082bbafb91",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bin": {
-    "strip-json-comments": "cli.js"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/strip-json-comments/issues"
-  },
-  "dependencies": {},
-  "description": "Strip comments from JSON. Lets you use comments in your JSON files!",
-  "devDependencies": {
-    "mocha": "*"
-  },
-  "engines": {
-    "node": ">=0.8.0"
-  },
-  "files": [
-    "cli.js",
-    "strip-json-comments.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/strip-json-comments#readme",
-  "keywords": [
-    "bin",
-    "cli",
-    "comments",
-    "conf",
-    "config",
-    "configuration",
-    "delete",
-    "env",
-    "environment",
-    "json",
-    "multiline",
-    "parse",
-    "remove",
-    "settings",
-    "strip",
-    "trim",
-    "util"
-  ],
-  "license": "MIT",
-  "main": "strip-json-comments",
-  "name": "strip-json-comments",
-  "optionalDependencies": {},
-  "readme": "# strip-json-comments [![Build Status](https://travis-ci.org/sindresorhus/strip-json-comments.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-json-comments)\n\n> Strip comments from JSON. Lets you use comments in your JSON files!\n\nThis is now possible:\n\n```js\n{\n\t// rainbows\n\t\"unicorn\": /* ❤ */ \"cake\"\n}\n```\n\nIt will remove single-line comments `//` and multi-line comments `/**/`.\n\nAlso available as a [gulp](https://github.com/sindresorhus/gulp-strip-json-comments)/[grunt](https://github.com/sindresorhus/grunt-strip-json-comments)/[broccoli](https://github.com/sindresorhus/broccoli-strip-json-comments) plugin.\n\n-\n\n*There's also [`json-comments`](https://npmjs.org/package/json-comments), but it's only for Node.js, inefficient, bloated as it also minifies, and comes with a `require` hook, which is :(*\n\n\n## Install\n\n```sh\n$ npm install --save strip-json-comments\n```\n\n```sh\n$ bower install --save strip-json-comments\n```\n\n```sh\n$ component install sindresorhus/strip-json-comments\n```\n\n\n## Usage\n\n```js\nvar json = '{/*rainbows*/\"unicorn\":\"cake\"}';\nJSON.parse(stripJsonComments(json));\n//=> {unicorn: 'cake'}\n```\n\n\n## API\n\n### stripJsonComments(input)\n\n#### input\n\nType: `string`\n\nAccepts a string with JSON and returns a string without comments.\n\n\n## CLI\n\n```sh\n$ npm install --global strip-json-comments\n```\n\n```sh\n$ strip-json-comments --help\n\nstrip-json-comments input-file > output-file\n# or\nstrip-json-comments < input-file > output-file\n```\n\n\n## Related\n\n- [`strip-css-comments`](https://github.com/sindresorhus/strip-css-comments)\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/strip-json-comments.git"
-  },
-  "scripts": {
-    "test": "mocha --ui tdd"
-  },
-  "version": "1.0.4"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/readme.md
deleted file mode 100644
index 63ce165b23809fc27f4369931a1ceffedad50b1c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/readme.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# strip-json-comments [![Build Status](https://travis-ci.org/sindresorhus/strip-json-comments.svg?branch=master)](https://travis-ci.org/sindresorhus/strip-json-comments)
-
-> Strip comments from JSON. Lets you use comments in your JSON files!
-
-This is now possible:
-
-```js
-{
-	// rainbows
-	"unicorn": /* ❤ */ "cake"
-}
-```
-
-It will remove single-line comments `//` and multi-line comments `/**/`.
-
-Also available as a [gulp](https://github.com/sindresorhus/gulp-strip-json-comments)/[grunt](https://github.com/sindresorhus/grunt-strip-json-comments)/[broccoli](https://github.com/sindresorhus/broccoli-strip-json-comments) plugin.
-
--
-
-*There's also [`json-comments`](https://npmjs.org/package/json-comments), but it's only for Node.js, inefficient, bloated as it also minifies, and comes with a `require` hook, which is :(*
-
-
-## Install
-
-```sh
-$ npm install --save strip-json-comments
-```
-
-```sh
-$ bower install --save strip-json-comments
-```
-
-```sh
-$ component install sindresorhus/strip-json-comments
-```
-
-
-## Usage
-
-```js
-var json = '{/*rainbows*/"unicorn":"cake"}';
-JSON.parse(stripJsonComments(json));
-//=> {unicorn: 'cake'}
-```
-
-
-## API
-
-### stripJsonComments(input)
-
-#### input
-
-Type: `string`
-
-Accepts a string with JSON and returns a string without comments.
-
-
-## CLI
-
-```sh
-$ npm install --global strip-json-comments
-```
-
-```sh
-$ strip-json-comments --help
-
-strip-json-comments input-file > output-file
-# or
-strip-json-comments < input-file > output-file
-```
-
-
-## Related
-
-- [`strip-css-comments`](https://github.com/sindresorhus/strip-css-comments)
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/strip-json-comments.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/strip-json-comments.js
deleted file mode 100644
index eb77ce7456b8e5697f39a898934c77b65dc2d272..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/node_modules/strip-json-comments/strip-json-comments.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/*!
-	strip-json-comments
-	Strip comments from JSON. Lets you use comments in your JSON files!
-	https://github.com/sindresorhus/strip-json-comments
-	by Sindre Sorhus
-	MIT License
-*/
-(function () {
-	'use strict';
-
-	var singleComment = 1;
-	var multiComment = 2;
-
-	function stripJsonComments(str) {
-		var currentChar;
-		var nextChar;
-		var insideString = false;
-		var insideComment = false;
-		var ret = '';
-
-		for (var i = 0; i < str.length; i++) {
-			currentChar = str[i];
-			nextChar = str[i + 1];
-
-			if (!insideComment && currentChar === '"') {
-				var escaped = str[i - 1] === '\\' && str[i - 2] !== '\\';
-				if (!insideComment && !escaped && currentChar === '"') {
-					insideString = !insideString;
-				}
-			}
-
-			if (insideString) {
-				ret += currentChar;
-				continue;
-			}
-
-			if (!insideComment && currentChar + nextChar === '//') {
-				insideComment = singleComment;
-				i++;
-			} else if (insideComment === singleComment && currentChar + nextChar === '\r\n') {
-				insideComment = false;
-				i++;
-				ret += currentChar;
-				ret += nextChar;
-				continue;
-			} else if (insideComment === singleComment && currentChar === '\n') {
-				insideComment = false;
-			} else if (!insideComment && currentChar + nextChar === '/*') {
-				insideComment = multiComment;
-				i++;
-				continue;
-			} else if (insideComment === multiComment && currentChar + nextChar === '*/') {
-				insideComment = false;
-				i++;
-				continue;
-			}
-
-			if (insideComment) {
-				continue;
-			}
-
-			ret += currentChar;
-		}
-
-		return ret;
-	}
-
-	if (typeof module !== 'undefined' && module.exports) {
-		module.exports = stripJsonComments;
-	} else {
-		window.stripJsonComments = stripJsonComments;
-	}
-})();
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/package.json
deleted file mode 100644
index 712c70f08b389b4fae42615c85ad34f2cb89b639..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "_from": "rc@>=1.1.0 <1.2.0",
-  "_id": "rc@1.1.6",
-  "_location": "/serialport/node-pre-gyp/rc",
-  "_nodeVersion": "4.2.3",
-  "_npmUser": {
-    "email": "dominic.tarr@gmail.com",
-    "name": "dominictarr"
-  },
-  "_npmVersion": "3.5.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp"
-  ],
-  "_resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz",
-  "_shasum": "43651b76b6ae53b5c802f1151fa3fc3b059969c9",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "dominic.tarr@gmail.com",
-    "name": "Dominic Tarr",
-    "url": "dominictarr.com"
-  },
-  "bin": {
-    "rc": "./index.js"
-  },
-  "browserify": "browser.js",
-  "bugs": {
-    "url": "https://github.com/dominictarr/rc/issues"
-  },
-  "dependencies": {
-    "deep-extend": "~0.4.0",
-    "ini": "~1.3.0",
-    "minimist": "^1.2.0",
-    "strip-json-comments": "~1.0.4"
-  },
-  "description": "hardwired configuration loader",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "43651b76b6ae53b5c802f1151fa3fc3b059969c9",
-    "tarball": "http://registry.npmjs.org/rc/-/rc-1.1.6.tgz"
-  },
-  "gitHead": "132062de0e61881a025cc4784d9a2798409c2bf1",
-  "homepage": "https://github.com/dominictarr/rc#readme",
-  "keywords": [
-    "config",
-    "defaults",
-    "rc",
-    "unix"
-  ],
-  "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "dominictarr",
-      "email": "dominic.tarr@gmail.com"
-    }
-  ],
-  "name": "rc",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/dominictarr/rc.git"
-  },
-  "scripts": {
-    "test": "set -e; node test/test.js; node test/ini.js; node test/nested-env-vars.js"
-  },
-  "version": "1.1.6"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/test/ini.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/test/ini.js
deleted file mode 100644
index e6857f8b382cf93c772418cc16a68acb83308629..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/test/ini.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var cc =require('../lib/utils')
-var INI = require('ini')
-var assert = require('assert')
-
-function test(obj) {
-
-  var _json, _ini
-  var json = cc.parse (_json = JSON.stringify(obj))
-  var ini = cc.parse (_ini = INI.stringify(obj))
-  console.log(_ini, _json)
-  assert.deepEqual(json, ini)
-}
-
-
-test({hello: true})
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/test/nested-env-vars.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/test/nested-env-vars.js
deleted file mode 100644
index f576fb153b90f4bdde85837a9c68f5fd58b313e5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/test/nested-env-vars.js
+++ /dev/null
@@ -1,40 +0,0 @@
-
-var n = 'rc'+Math.random()
-var assert = require('assert')
-
-
-// Basic usage
-process.env[n+'_someOpt__a'] = 42
-process.env[n+'_someOpt__x__'] = 99
-process.env[n+'_someOpt__a__b'] = 186
-process.env[n+'_someOpt__a__b__c'] = 243
-process.env[n+'_someOpt__x__y'] = 1862
-process.env[n+'_someOpt__z'] = 186577
-
-// Should ignore empty strings from orphaned '__'
-process.env[n+'_someOpt__z__x__'] = 18629
-process.env[n+'_someOpt__w__w__'] = 18629
-
-// Leading '__' should ignore everything up to 'z'
-process.env[n+'___z__i__'] = 9999
-
-var config = require('../')(n, {
-  option: true
-})
-
-console.log('\n\n------ nested-env-vars ------\n',config)
-
-assert.equal(config.option, true)
-assert.equal(config.someOpt.a, 42)
-assert.equal(config.someOpt.x, 99)
-// Should not override `a` once it's been set
-assert.equal(config.someOpt.a/*.b*/, 42)
-// Should not override `x` once it's been set
-assert.equal(config.someOpt.x/*.y*/, 99)
-assert.equal(config.someOpt.z, 186577)
-// Should not override `z` once it's been set
-assert.equal(config.someOpt.z/*.x*/, 186577)
-assert.equal(config.someOpt.w.w, 18629)
-assert.equal(config.z.i, 9999)
-
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/test/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/test/test.js
deleted file mode 100644
index 4f6335189b6f810739873ed4c6337949c08d70c7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rc/test/test.js
+++ /dev/null
@@ -1,59 +0,0 @@
-
-var n = 'rc'+Math.random()
-var assert = require('assert')
-
-process.env[n+'_envOption'] = 42
-
-var config = require('../')(n, {
-  option: true
-})
-
-console.log(config)
-
-assert.equal(config.option, true)
-assert.equal(config.envOption, 42)
-
-var customArgv = require('../')(n, {
-  option: true
-}, { // nopt-like argv
-  option: false,
-  envOption: 24,
-  argv: {
-    remain: [],
-    cooked: ['--no-option', '--envOption', '24'],
-    original: ['--no-option', '--envOption=24']
-  }
-})
-
-console.log(customArgv)
-
-assert.equal(customArgv.option, false)
-assert.equal(customArgv.envOption, 24)
-
-var fs = require('fs')
-var path = require('path')
-var jsonrc = path.resolve('.' + n + 'rc');
-
-fs.writeFileSync(jsonrc, [
-  '{',
-    '// json overrides default',
-    '"option": false,',
-    '/* env overrides json */',
-    '"envOption": 24',
-  '}'
-].join('\n'));
-
-var commentedJSON = require('../')(n, {
-  option: true
-})
-
-fs.unlinkSync(jsonrc);
-
-console.log(commentedJSON)
-
-assert.equal(commentedJSON.option, false)
-assert.equal(commentedJSON.envOption, 42)
-
-assert.equal(commentedJSON.config, jsonrc)
-assert.equal(commentedJSON.configs.length, 1)
-assert.equal(commentedJSON.configs[0], jsonrc)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/.eslintrc b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/.eslintrc
deleted file mode 100644
index 5a59481586a91700a635415e0003566e71a9b7ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/.eslintrc
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-  "env": {
-    "node": true
-  },
-  "rules": {
-    // 2-space indentation
-    "indent": [2, 2, {"SwitchCase": 1}],
-    // Disallow semi-colons, unless needed to disambiguate statement
-    "semi": [2, "never"],
-    // Require strings to use single quotes
-    "quotes": [2, "single"],
-    // Require curly braces for all control statements
-    "curly": 2,
-    // Disallow using variables and functions before they've been defined
-    "no-use-before-define": 2,
-    // Allow any case for variable naming
-    "camelcase": 0,
-    // Disallow unused variables, except as function arguments
-    "no-unused-vars": [2, {"args":"none"}],
-    // Allow leading underscores for method names
-    // REASON: we use underscores to denote private methods
-    "no-underscore-dangle": 0,
-    // Allow multi spaces around operators since they are
-    // used for alignment.  This is not consistent in the
-    // code.
-    "no-multi-spaces": 0,
-    // Style rule is: most objects use { beforeColon: false, afterColon: true }, unless aligning which uses:
-    //
-    // {
-    //   beforeColon : true,
-    //   afterColon  : true
-    // }
-    //
-    // eslint can't handle this, so the check is disabled.
-    "key-spacing": 0,
-    // Allow shadowing vars in outer scope (needs discussion)
-    "no-shadow": 0,
-    // Use if () { }
-    //       ^ space
-    "keyword-spacing": [2, {"after": true}],
-    // Use if () { }
-    //          ^ space
-    "space-before-blocks": [2, "always"]
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/.npmignore
deleted file mode 100644
index 67fe11cc0a77bbc36d0618804a1123f757470902..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/.npmignore
+++ /dev/null
@@ -1,6 +0,0 @@
-coverage
-tests
-node_modules
-examples
-release.sh
-disabled.appveyor.yml
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/.travis.yml
deleted file mode 100644
index 6f2d753b615f83a77aa370ce66783b0741ff6423..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/.travis.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-
-language: node_js
-
-node_js:
-  - node
-  - 4
-  - 0.12
-  - 0.10
-
-after_script:
-  - npm run test-cov
-  - codecov
-  - cat ./coverage/lcov.info | coveralls
-
-webhooks:
-  urls: https://webhooks.gitter.im/e/237280ed4796c19cc626
-  on_success: change  # options: [always|never|change] default: always
-  on_failure: always  # options: [always|never|change] default: always
-  on_start: false     # default: false
-
-sudo: false
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/CHANGELOG.md
deleted file mode 100644
index c7d684fa50e836423dce55d15303990db9dade77..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/CHANGELOG.md
+++ /dev/null
@@ -1,631 +0,0 @@
-## Change Log
-
-### v2.73.0 (2016/07/09)
-- [#2240](https://github.com/request/request/pull/2240) Remove connectionErrorHandler to fix #1903 (@zarenner)
-- [#2251](https://github.com/request/request/pull/2251) tape@4.6.0 breaks build 🚨 (@greenkeeperio-bot)
-- [#2225](https://github.com/request/request/pull/2225) Update docs (@ArtskydJ)
-- [#2203](https://github.com/request/request/pull/2203) Update browserify to version 13.0.1 🚀 (@greenkeeperio-bot)
-- [#2275](https://github.com/request/request/pull/2275) Update karma to version 1.1.1 🚀 (@greenkeeperio-bot)
-- [#2204](https://github.com/request/request/pull/2204) Add codecov.yml and disable PR comments (@simov)
-- [#2212](https://github.com/request/request/pull/2212) Fix link to http.IncomingMessage documentation (@nazieb)
-- [#2208](https://github.com/request/request/pull/2208) Update to form-data RC4 and pass null values to it (@simov)
-- [#2207](https://github.com/request/request/pull/2207) Move aws4 require statement to the top (@simov)
-- [#2199](https://github.com/request/request/pull/2199) Update karma-coverage to version 1.0.0 🚀 (@greenkeeperio-bot)
-- [#2206](https://github.com/request/request/pull/2206) Update qs to version 6.2.0 🚀 (@greenkeeperio-bot)
-- [#2205](https://github.com/request/request/pull/2205) Use server-destory to close hanging sockets in tests (@simov)
-- [#2200](https://github.com/request/request/pull/2200) Update karma-cli to version 1.0.0 🚀 (@greenkeeperio-bot)
-
-### v2.72.0 (2016/04/17)
-- [#2176](https://github.com/request/request/pull/2176) Do not try to pipe Gzip responses with no body (@simov)
-- [#2175](https://github.com/request/request/pull/2175) Add 'delete' alias for the 'del' API method (@simov, @MuhanZou)
-- [#2172](https://github.com/request/request/pull/2172) Add support for deflate content encoding (@czardoz)
-- [#2169](https://github.com/request/request/pull/2169) Add callback option (@simov)
-- [#2165](https://github.com/request/request/pull/2165) Check for self.req existence inside the write method (@simov)
-- [#2167](https://github.com/request/request/pull/2167) Fix TravisCI badge reference master branch (@a0viedo)
-
-### v2.71.0 (2016/04/12)
-- [#2164](https://github.com/request/request/pull/2164) Catch errors from the underlying http module (@simov)
-
-### v2.70.0 (2016/04/05)
-- [#2147](https://github.com/request/request/pull/2147) Update eslint to version 2.5.3 🚀 (@simov, @greenkeeperio-bot)
-- [#2009](https://github.com/request/request/pull/2009) Support JSON stringify replacer argument. (@elyobo)
-- [#2142](https://github.com/request/request/pull/2142) Update eslint to version 2.5.1 🚀 (@greenkeeperio-bot)
-- [#2128](https://github.com/request/request/pull/2128) Update browserify-istanbul to version 2.0.0 🚀 (@greenkeeperio-bot)
-- [#2115](https://github.com/request/request/pull/2115) Update eslint to version 2.3.0 🚀 (@simov, @greenkeeperio-bot)
-- [#2089](https://github.com/request/request/pull/2089) Fix badges (@simov)
-- [#2092](https://github.com/request/request/pull/2092) Update browserify-istanbul to version 1.0.0 🚀 (@greenkeeperio-bot)
-- [#2079](https://github.com/request/request/pull/2079) Accept read stream as body option (@simov)
-- [#2070](https://github.com/request/request/pull/2070) Update bl to version 1.1.2 🚀 (@greenkeeperio-bot)
-- [#2063](https://github.com/request/request/pull/2063) Up bluebird and oauth-sign (@simov)
-- [#2058](https://github.com/request/request/pull/2058) Karma fixes for latest versions (@eiriksm)
-- [#2057](https://github.com/request/request/pull/2057) Update contributing guidelines (@simov)
-- [#2054](https://github.com/request/request/pull/2054) Update qs to version 6.1.0 🚀 (@greenkeeperio-bot)
-
-### v2.69.0 (2016/01/27)
-- [#2041](https://github.com/request/request/pull/2041) restore aws4 as regular dependency (@rmg)
-
-### v2.68.0 (2016/01/27)
-- [#2036](https://github.com/request/request/pull/2036) Add AWS Signature Version 4 (@simov, @mirkods)
-- [#2022](https://github.com/request/request/pull/2022) Convert numeric multipart bodies to string (@simov, @feross)
-- [#2024](https://github.com/request/request/pull/2024) Update har-validator dependency for nsp advisory #76 (@TylerDixon)
-- [#2016](https://github.com/request/request/pull/2016) Update qs to version 6.0.2 🚀 (@greenkeeperio-bot)
-- [#2007](https://github.com/request/request/pull/2007) Use the `extend` module instead of util._extend (@simov)
-- [#2003](https://github.com/request/request/pull/2003) Update browserify to version 13.0.0 🚀 (@greenkeeperio-bot)
-- [#1989](https://github.com/request/request/pull/1989) Update buffer-equal to version 1.0.0 🚀 (@greenkeeperio-bot)
-- [#1956](https://github.com/request/request/pull/1956) Check form-data content-length value before setting up the header (@jongyoonlee)
-- [#1958](https://github.com/request/request/pull/1958) Use IncomingMessage.destroy method (@simov)
-- [#1952](https://github.com/request/request/pull/1952) Adds example for Tor proxy (@prometheansacrifice)
-- [#1943](https://github.com/request/request/pull/1943) Update eslint to version 1.10.3 🚀 (@simov, @greenkeeperio-bot)
-- [#1924](https://github.com/request/request/pull/1924) Update eslint to version 1.10.1 🚀 (@greenkeeperio-bot)
-- [#1915](https://github.com/request/request/pull/1915) Remove content-length and transfer-encoding headers from defaultProxyHeaderWhiteList (@yaxia)
-
-### v2.67.0 (2015/11/19)
-- [#1913](https://github.com/request/request/pull/1913) Update http-signature to version 1.1.0 🚀 (@greenkeeperio-bot)
-
-### v2.66.0 (2015/11/18)
-- [#1906](https://github.com/request/request/pull/1906) Update README URLs based on HTTP redirects (@ReadmeCritic)
-- [#1905](https://github.com/request/request/pull/1905) Convert typed arrays into regular buffers (@simov)
-- [#1902](https://github.com/request/request/pull/1902) node-uuid@1.4.7 breaks build 🚨 (@greenkeeperio-bot)
-- [#1894](https://github.com/request/request/pull/1894) Fix tunneling after redirection from https (Original: #1881) (@simov, @falms)
-- [#1893](https://github.com/request/request/pull/1893) Update eslint to version 1.9.0 🚀 (@greenkeeperio-bot)
-- [#1852](https://github.com/request/request/pull/1852) Update eslint to version 1.7.3 🚀 (@simov, @greenkeeperio-bot, @paulomcnally, @michelsalib, @arbaaz, @vladimirich, @LoicMahieu, @JoshWillik, @jzaefferer, @ryanwholey, @djchie, @thisconnect, @mgenereu, @acroca, @Sebmaster, @Bloutiouf)
-- [#1876](https://github.com/request/request/pull/1876) Implement loose matching for har mime types (@simov)
-- [#1875](https://github.com/request/request/pull/1875) Update bluebird to version 3.0.2 🚀 (@simov, @greenkeeperio-bot)
-- [#1871](https://github.com/request/request/pull/1871) Update browserify to version 12.0.1 🚀 (@greenkeeperio-bot)
-- [#1866](https://github.com/request/request/pull/1866) Add missing quotes on x-token property in README (@miguelmota)
-- [#1874](https://github.com/request/request/pull/1874) Fix typo in README.md (@gswalden)
-- [#1860](https://github.com/request/request/pull/1860) Improve referer header tests and docs (@simov)
-- [#1861](https://github.com/request/request/pull/1861) Remove redundant call to Stream constructor (@watson)
-- [#1857](https://github.com/request/request/pull/1857) Fix Referer header to point to the original host name (@simov)
-- [#1850](https://github.com/request/request/pull/1850) Update karma-coverage to version 0.5.3 🚀 (@greenkeeperio-bot)
-- [#1847](https://github.com/request/request/pull/1847) Use node's latest version when building (@simov)
-- [#1836](https://github.com/request/request/pull/1836) Tunnel: fix wrong property name (@Bloutiouf)
-- [#1820](https://github.com/request/request/pull/1820) Set href as request.js uses it (@mgenereu)
-- [#1840](https://github.com/request/request/pull/1840) Update http-signature to version 1.0.2 🚀 (@greenkeeperio-bot)
-- [#1845](https://github.com/request/request/pull/1845) Update istanbul to version 0.4.0 🚀 (@greenkeeperio-bot)
-
-### v2.65.0 (2015/10/11)
-- [#1833](https://github.com/request/request/pull/1833) Update aws-sign2 to version 0.6.0 🚀 (@greenkeeperio-bot)
-- [#1811](https://github.com/request/request/pull/1811) Enable loose cookie parsing in tough-cookie (@Sebmaster)
-- [#1830](https://github.com/request/request/pull/1830) Bring back tilde ranges for all dependencies (@simov)
-- [#1821](https://github.com/request/request/pull/1821) Implement support for RFC 2617 MD5-sess algorithm. (@BigDSK)
-- [#1828](https://github.com/request/request/pull/1828) Updated qs dependency to 5.2.0 (@acroca)
-- [#1818](https://github.com/request/request/pull/1818) Extract `readResponseBody` method out of `onRequestResponse` (@pvoisin)
-- [#1819](https://github.com/request/request/pull/1819) Run stringify once (@mgenereu)
-- [#1814](https://github.com/request/request/pull/1814) Updated har-validator to version 2.0.2 (@greenkeeperio-bot)
-- [#1807](https://github.com/request/request/pull/1807) Updated tough-cookie to version 2.1.0 (@greenkeeperio-bot)
-- [#1800](https://github.com/request/request/pull/1800) Add caret ranges for devDependencies, except eslint (@simov)
-- [#1799](https://github.com/request/request/pull/1799) Updated karma-browserify to version 4.4.0 (@greenkeeperio-bot)
-- [#1797](https://github.com/request/request/pull/1797) Updated tape to version 4.2.0 (@greenkeeperio-bot)
-- [#1788](https://github.com/request/request/pull/1788) Pinned all dependencies (@greenkeeperio-bot)
-
-### v2.64.0 (2015/09/25)
-- [#1787](https://github.com/request/request/pull/1787) npm ignore examples, release.sh and disabled.appveyor.yml (@thisconnect)
-- [#1775](https://github.com/request/request/pull/1775) Fix typo in README.md (@djchie)
-- [#1776](https://github.com/request/request/pull/1776) Changed word 'conjuction' to read 'conjunction' in README.md (@ryanwholey)
-- [#1785](https://github.com/request/request/pull/1785) Revert: Set default application/json content-type when using json option #1772 (@simov)
-
-### v2.63.0 (2015/09/21)
-- [#1772](https://github.com/request/request/pull/1772) Set default application/json content-type when using json option (@jzaefferer)
-
-### v2.62.0 (2015/09/15)
-- [#1768](https://github.com/request/request/pull/1768) Add node 4.0 to the list of build targets (@simov)
-- [#1767](https://github.com/request/request/pull/1767) Query strings now cooperate with unix sockets (@JoshWillik)
-- [#1750](https://github.com/request/request/pull/1750) Revert doc about installation of tough-cookie added in #884 (@LoicMahieu)
-- [#1746](https://github.com/request/request/pull/1746) Missed comma in Readme (@vladimirich)
-- [#1743](https://github.com/request/request/pull/1743) Fix options not being initialized in defaults method (@simov)
-
-### v2.61.0 (2015/08/19)
-- [#1721](https://github.com/request/request/pull/1721) Minor fix in README.md (@arbaaz)
-- [#1733](https://github.com/request/request/pull/1733) Avoid useless Buffer transformation (@michelsalib)
-- [#1726](https://github.com/request/request/pull/1726) Update README.md (@paulomcnally)
-- [#1715](https://github.com/request/request/pull/1715) Fix forever option in node > 0.10 #1709 (@calibr)
-- [#1716](https://github.com/request/request/pull/1716) Do not create Buffer from Object in setContentLength(iojs v3.0 issue) (@calibr)
-- [#1711](https://github.com/request/request/pull/1711) Add ability to detect connect timeouts (@kevinburke)
-- [#1712](https://github.com/request/request/pull/1712) Set certificate expiration to August 2, 2018 (@kevinburke)
-- [#1700](https://github.com/request/request/pull/1700) debug() when JSON.parse() on a response body fails (@phillipj)
-
-### v2.60.0 (2015/07/21)
-- [#1687](https://github.com/request/request/pull/1687) Fix caseless bug - content-type not being set for multipart/form-data (@simov, @garymathews)
-
-### v2.59.0 (2015/07/20)
-- [#1671](https://github.com/request/request/pull/1671) Add tests and docs for using the agent, agentClass, agentOptions and forever options.
 Forever option defaults to using http(s).Agent in node 0.12+ (@simov)
-- [#1679](https://github.com/request/request/pull/1679) Fix - do not remove OAuth param when using OAuth realm (@simov, @jhalickman)
-- [#1668](https://github.com/request/request/pull/1668) updated dependencies (@deamme)
-- [#1656](https://github.com/request/request/pull/1656) Fix form method (@simov)
-- [#1651](https://github.com/request/request/pull/1651) Preserve HEAD method when using followAllRedirects (@simov)
-- [#1652](https://github.com/request/request/pull/1652) Update `encoding` option documentation in README.md (@daniel347x)
-- [#1650](https://github.com/request/request/pull/1650) Allow content-type overriding when using the `form` option (@simov)
-- [#1646](https://github.com/request/request/pull/1646) Clarify the nature of setting `ca` in `agentOptions` (@jeffcharles)
-
-### v2.58.0 (2015/06/16)
-- [#1638](https://github.com/request/request/pull/1638) Use the `extend` module to deep extend in the defaults method (@simov)
-- [#1631](https://github.com/request/request/pull/1631) Move tunnel logic into separate module (@simov)
-- [#1634](https://github.com/request/request/pull/1634) Fix OAuth query transport_method (@simov)
-- [#1603](https://github.com/request/request/pull/1603) Add codecov (@simov)
-
-### v2.57.0 (2015/05/31)
-- [#1615](https://github.com/request/request/pull/1615) Replace '.client' with '.socket' as the former was deprecated in 2.2.0. (@ChALkeR)
-
-### v2.56.0 (2015/05/28)
-- [#1610](https://github.com/request/request/pull/1610) Bump module dependencies (@simov)
-- [#1600](https://github.com/request/request/pull/1600) Extract the querystring logic into separate module (@simov)
-- [#1607](https://github.com/request/request/pull/1607) Re-generate certificates (@simov)
-- [#1599](https://github.com/request/request/pull/1599) Move getProxyFromURI logic below the check for Invaild URI (#1595) (@simov)
-- [#1598](https://github.com/request/request/pull/1598) Fix the way http verbs are defined in order to please intellisense IDEs (@simov, @flannelJesus)
-- [#1591](https://github.com/request/request/pull/1591) A few minor fixes: (@simov)
-- [#1584](https://github.com/request/request/pull/1584) Refactor test-default tests (according to comments in #1430) (@simov)
-- [#1585](https://github.com/request/request/pull/1585) Fixing documentation regarding TLS options (#1583) (@mainakae)
-- [#1574](https://github.com/request/request/pull/1574) Refresh the oauth_nonce on redirect (#1573) (@simov)
-- [#1570](https://github.com/request/request/pull/1570) Discovered tests that weren't properly running (@seanstrom)
-- [#1569](https://github.com/request/request/pull/1569) Fix pause before response arrives (@kevinoid)
-- [#1558](https://github.com/request/request/pull/1558) Emit error instead of throw (@simov)
-- [#1568](https://github.com/request/request/pull/1568) Fix stall when piping gzipped response (@kevinoid)
-- [#1560](https://github.com/request/request/pull/1560) Update combined-stream (@apechimp)
-- [#1543](https://github.com/request/request/pull/1543) Initial support for oauth_body_hash on json payloads (@simov, @aesopwolf)
-- [#1541](https://github.com/request/request/pull/1541) Fix coveralls (@simov)
-- [#1540](https://github.com/request/request/pull/1540) Fix recursive defaults for convenience methods (@simov)
-- [#1536](https://github.com/request/request/pull/1536) More eslint style rules (@froatsnook)
-- [#1533](https://github.com/request/request/pull/1533) Adding dependency status bar to README.md (@YasharF)
-- [#1539](https://github.com/request/request/pull/1539) ensure the latest version of har-validator is included (@ahmadnassri)
-- [#1516](https://github.com/request/request/pull/1516) forever+pool test (@devTristan)
-
-### v2.55.0 (2015/04/05)
-- [#1520](https://github.com/request/request/pull/1520) Refactor defaults (@simov)
-- [#1525](https://github.com/request/request/pull/1525) Delete request headers with undefined value. (@froatsnook)
-- [#1521](https://github.com/request/request/pull/1521) Add promise tests (@simov)
-- [#1518](https://github.com/request/request/pull/1518) Fix defaults (@simov)
-- [#1515](https://github.com/request/request/pull/1515) Allow static invoking of convenience methods (@simov)
-- [#1505](https://github.com/request/request/pull/1505) Fix multipart boundary extraction regexp (@simov)
-- [#1510](https://github.com/request/request/pull/1510) Fix basic auth form data (@simov)
-
-### v2.54.0 (2015/03/24)
-- [#1501](https://github.com/request/request/pull/1501) HTTP Archive 1.2 support (@ahmadnassri)
-- [#1486](https://github.com/request/request/pull/1486) Add a test for the forever agent (@akshayp)
-- [#1500](https://github.com/request/request/pull/1500) Adding handling for no auth method and null bearer (@philberg)
-- [#1498](https://github.com/request/request/pull/1498) Add table of contents in readme (@simov)
-- [#1477](https://github.com/request/request/pull/1477) Add support for qs options via qsOptions key (@simov)
-- [#1496](https://github.com/request/request/pull/1496) Parameters encoded to base 64 should be decoded as UTF-8, not ASCII. (@albanm)
-- [#1494](https://github.com/request/request/pull/1494) Update eslint (@froatsnook)
-- [#1474](https://github.com/request/request/pull/1474) Require Colon in Basic Auth (@erykwalder)
-- [#1481](https://github.com/request/request/pull/1481) Fix baseUrl and redirections. (@burningtree)
-- [#1469](https://github.com/request/request/pull/1469) Feature/base url (@froatsnook)
-- [#1459](https://github.com/request/request/pull/1459) Add option to time request/response cycle (including rollup of redirects) (@aaron-em)
-- [#1468](https://github.com/request/request/pull/1468) Re-enable io.js/node 0.12 build (@simov, @mikeal, @BBB)
-- [#1442](https://github.com/request/request/pull/1442) Fixed the issue with strictSSL tests on  0.12 & io.js by explicitly setting a cipher that matches the cert. (@BBB, @nicolasmccurdy, @demohi, @simov, @0x4139)
-- [#1460](https://github.com/request/request/pull/1460) localAddress or proxy config is lost when redirecting (@simov, @0x4139)
-- [#1453](https://github.com/request/request/pull/1453) Test on Node.js 0.12 and io.js with allowed failures (@nicolasmccurdy, @demohi)
-- [#1426](https://github.com/request/request/pull/1426) Fixing tests to pass on io.js and node 0.12 (only test-https.js stiff failing) (@mikeal)
-- [#1446](https://github.com/request/request/pull/1446) Missing HTTP referer header with redirects Fixes #1038 (@simov, @guimon)
-- [#1428](https://github.com/request/request/pull/1428) Deprecate Node v0.8.x (@nylen)
-- [#1436](https://github.com/request/request/pull/1436) Add ability to set a requester without setting default options (@tikotzky)
-- [#1435](https://github.com/request/request/pull/1435) dry up verb methods (@sethpollack)
-- [#1423](https://github.com/request/request/pull/1423) Allow fully qualified multipart content-type header (@simov)
-- [#1430](https://github.com/request/request/pull/1430) Fix recursive requester (@tikotzky)
-- [#1429](https://github.com/request/request/pull/1429) Throw error when making HEAD request with a body (@tikotzky)
-- [#1419](https://github.com/request/request/pull/1419) Add note that the project is broken in 0.12.x (@nylen)
-- [#1413](https://github.com/request/request/pull/1413) Fix basic auth (@simov)
-- [#1397](https://github.com/request/request/pull/1397) Improve pipe-from-file tests (@nylen)
-
-### v2.53.0 (2015/02/02)
-- [#1396](https://github.com/request/request/pull/1396) Do not rfc3986 escape JSON bodies (@nylen, @simov)
-- [#1392](https://github.com/request/request/pull/1392) Improve `timeout` option description (@watson)
-
-### v2.52.0 (2015/02/02)
-- [#1383](https://github.com/request/request/pull/1383) Add missing HTTPS options that were not being passed to tunnel (@brichard19) (@nylen)
-- [#1388](https://github.com/request/request/pull/1388) Upgrade mime-types package version (@roderickhsiao)
-- [#1389](https://github.com/request/request/pull/1389) Revise Setup Tunnel Function (@seanstrom)
-- [#1374](https://github.com/request/request/pull/1374) Allow explicitly disabling tunneling for proxied https destinations (@nylen)
-- [#1376](https://github.com/request/request/pull/1376) Use karma-browserify for tests. Add browser test coverage reporter. (@eiriksm)
-- [#1366](https://github.com/request/request/pull/1366) Refactor OAuth into separate module (@simov)
-- [#1373](https://github.com/request/request/pull/1373) Rewrite tunnel test to be pure Node.js (@nylen)
-- [#1371](https://github.com/request/request/pull/1371) Upgrade test reporter (@nylen)
-- [#1360](https://github.com/request/request/pull/1360) Refactor basic, bearer, digest auth logic into separate class (@simov)
-- [#1354](https://github.com/request/request/pull/1354) Remove circular dependency from debugging code (@nylen)
-- [#1351](https://github.com/request/request/pull/1351) Move digest auth into private prototype method (@simov)
-- [#1352](https://github.com/request/request/pull/1352) Update hawk dependency to ~2.3.0 (@mridgway)
-- [#1353](https://github.com/request/request/pull/1353) Correct travis-ci badge (@dogancelik)
-- [#1349](https://github.com/request/request/pull/1349) Make sure we return on errored browser requests. (@eiriksm)
-- [#1346](https://github.com/request/request/pull/1346) getProxyFromURI Extraction Refactor (@seanstrom)
-- [#1337](https://github.com/request/request/pull/1337) Standardize test ports on 6767 (@nylen)
-- [#1341](https://github.com/request/request/pull/1341) Emit FormData error events as Request error events (@nylen, @rwky)
-- [#1343](https://github.com/request/request/pull/1343) Clean up readme badges, and add Travis and Coveralls badges (@nylen)
-- [#1345](https://github.com/request/request/pull/1345) Update README.md (@Aaron-Hartwig)
-- [#1338](https://github.com/request/request/pull/1338) Always wait for server.close() callback in tests (@nylen)
-- [#1342](https://github.com/request/request/pull/1342) Add mock https server and redo start of browser tests for this purpose. (@eiriksm)
-- [#1339](https://github.com/request/request/pull/1339) Improve auth docs (@nylen)
-- [#1335](https://github.com/request/request/pull/1335) Add support for OAuth plaintext signature method (@simov)
-- [#1332](https://github.com/request/request/pull/1332) Add clean script to remove test-browser.js after the tests run (@seanstrom)
-- [#1327](https://github.com/request/request/pull/1327) Fix errors generating coverage reports. (@nylen)
-- [#1330](https://github.com/request/request/pull/1330) Return empty buffer upon empty response body and encoding is set to null (@seanstrom)
-- [#1326](https://github.com/request/request/pull/1326) Use faster container-based infrastructure on Travis (@nylen)
-- [#1315](https://github.com/request/request/pull/1315) Implement rfc3986 option (@simov, @nylen, @apoco, @DullReferenceException, @mmalecki, @oliamb, @cliffcrosland, @LewisJEllis, @eiriksm, @poislagarde)
-- [#1314](https://github.com/request/request/pull/1314) Detect urlencoded form data header via regex (@simov)
-- [#1317](https://github.com/request/request/pull/1317) Improve OAuth1.0 server side flow example (@simov)
-
-### v2.51.0 (2014/12/10)
-- [#1310](https://github.com/request/request/pull/1310) Revert changes introduced in https://github.com/request/request/pull/1282 (@simov)
-
-### v2.50.0 (2014/12/09)
-- [#1308](https://github.com/request/request/pull/1308) Add browser test to keep track of browserify compability. (@eiriksm)
-- [#1299](https://github.com/request/request/pull/1299) Add optional support for jsonReviver (@poislagarde)
-- [#1277](https://github.com/request/request/pull/1277) Add Coveralls configuration (@simov)
-- [#1307](https://github.com/request/request/pull/1307) Upgrade form-data, add back browserify compability. Fixes #455. (@eiriksm)
-- [#1305](https://github.com/request/request/pull/1305) Fix typo in README.md (@LewisJEllis)
-- [#1288](https://github.com/request/request/pull/1288) Update README.md to explain custom file use case (@cliffcrosland)
-
-### v2.49.0 (2014/11/28)
-- [#1295](https://github.com/request/request/pull/1295) fix(proxy): no-proxy false positive (@oliamb)
-- [#1292](https://github.com/request/request/pull/1292) Upgrade `caseless` to 0.8.1 (@mmalecki)
-- [#1276](https://github.com/request/request/pull/1276) Set transfer encoding for multipart/related to chunked by default (@simov)
-- [#1275](https://github.com/request/request/pull/1275) Fix multipart content-type headers detection (@simov)
-- [#1269](https://github.com/request/request/pull/1269) adds streams example for review (@tbuchok)
-- [#1238](https://github.com/request/request/pull/1238) Add examples README.md (@simov)
-
-### v2.48.0 (2014/11/12)
-- [#1263](https://github.com/request/request/pull/1263) Fixed a syntax error / typo in README.md (@xna2)
-- [#1253](https://github.com/request/request/pull/1253) Add multipart chunked flag (@simov, @nylen)
-- [#1251](https://github.com/request/request/pull/1251) Clarify that defaults() does not modify global defaults (@nylen)
-- [#1250](https://github.com/request/request/pull/1250) Improve documentation for pool and maxSockets options (@nylen)
-- [#1237](https://github.com/request/request/pull/1237) Documenting error handling when using streams (@vmattos)
-- [#1244](https://github.com/request/request/pull/1244) Finalize changelog command (@nylen)
-- [#1241](https://github.com/request/request/pull/1241) Fix typo (@alexanderGugel)
-- [#1223](https://github.com/request/request/pull/1223) Show latest version number instead of "upcoming" in changelog (@nylen)
-- [#1236](https://github.com/request/request/pull/1236) Document how to use custom CA in README (#1229) (@hypesystem)
-- [#1228](https://github.com/request/request/pull/1228) Support for oauth with RSA-SHA1 signing (@nylen)
-- [#1216](https://github.com/request/request/pull/1216) Made json and multipart options coexist (@nylen, @simov)
-- [#1225](https://github.com/request/request/pull/1225) Allow header white/exclusive lists in any case. (@RReverser)
-
-### v2.47.0 (2014/10/26)
-- [#1222](https://github.com/request/request/pull/1222) Move from mikeal/request to request/request (@nylen)
-- [#1220](https://github.com/request/request/pull/1220) update qs dependency to 2.3.1 (@FredKSchott)
-- [#1212](https://github.com/request/request/pull/1212) Improve tests/test-timeout.js (@nylen)
-- [#1219](https://github.com/request/request/pull/1219) remove old globalAgent workaround for node 0.4 (@request)
-- [#1214](https://github.com/request/request/pull/1214) Remove cruft left over from optional dependencies (@nylen)
-- [#1215](https://github.com/request/request/pull/1215) Add proxyHeaderExclusiveList option for proxy-only headers. (@RReverser)
-- [#1211](https://github.com/request/request/pull/1211) Allow 'Host' header instead of 'host' and remember case across redirects (@nylen)
-- [#1208](https://github.com/request/request/pull/1208) Improve release script (@nylen)
-- [#1213](https://github.com/request/request/pull/1213) Support for custom cookie store (@nylen, @mitsuru)
-- [#1197](https://github.com/request/request/pull/1197) Clean up some code around setting the agent (@FredKSchott)
-- [#1209](https://github.com/request/request/pull/1209) Improve multipart form append test (@simov)
-- [#1207](https://github.com/request/request/pull/1207) Update changelog (@nylen)
-- [#1185](https://github.com/request/request/pull/1185) Stream multipart/related bodies (@simov)
-
-### v2.46.0 (2014/10/23)
-- [#1198](https://github.com/request/request/pull/1198) doc for TLS/SSL protocol options (@shawnzhu)
-- [#1200](https://github.com/request/request/pull/1200) Add a Gitter chat badge to README.md (@gitter-badger)
-- [#1196](https://github.com/request/request/pull/1196) Upgrade taper test reporter to v0.3.0 (@nylen)
-- [#1199](https://github.com/request/request/pull/1199) Fix lint error: undeclared var i (@nylen)
-- [#1191](https://github.com/request/request/pull/1191) Move self.proxy decision logic out of init and into a helper (@FredKSchott)
-- [#1190](https://github.com/request/request/pull/1190) Move _buildRequest() logic back into init (@FredKSchott)
-- [#1186](https://github.com/request/request/pull/1186) Support Smarter Unix URL Scheme (@FredKSchott)
-- [#1178](https://github.com/request/request/pull/1178) update form documentation for new usage (@FredKSchott)
-- [#1180](https://github.com/request/request/pull/1180) Enable no-mixed-requires linting rule (@nylen)
-- [#1184](https://github.com/request/request/pull/1184) Don't forward authorization header across redirects to different hosts (@nylen)
-- [#1183](https://github.com/request/request/pull/1183) Correct README about pre and postamble CRLF using multipart and not mult... (@netpoetica)
-- [#1179](https://github.com/request/request/pull/1179) Lint tests directory (@nylen)
-- [#1169](https://github.com/request/request/pull/1169) add metadata for form-data file field (@dotcypress)
-- [#1173](https://github.com/request/request/pull/1173) remove optional dependencies (@seanstrom)
-- [#1165](https://github.com/request/request/pull/1165) Cleanup event listeners and remove function creation from init (@FredKSchott)
-- [#1174](https://github.com/request/request/pull/1174) update the request.cookie docs to have a valid cookie example (@seanstrom)
-- [#1168](https://github.com/request/request/pull/1168) create a detach helper and use detach helper in replace of nextTick (@seanstrom)
-- [#1171](https://github.com/request/request/pull/1171) in post can send form data and use callback (@MiroRadenovic)
-- [#1159](https://github.com/request/request/pull/1159) accept charset for x-www-form-urlencoded content-type (@seanstrom)
-- [#1157](https://github.com/request/request/pull/1157) Update README.md: body with json=true (@Rob--W)
-- [#1164](https://github.com/request/request/pull/1164) Disable tests/test-timeout.js on Travis (@nylen)
-- [#1153](https://github.com/request/request/pull/1153) Document how to run a single test (@nylen)
-- [#1144](https://github.com/request/request/pull/1144) adds documentation for the "response" event within the streaming section (@tbuchok)
-- [#1162](https://github.com/request/request/pull/1162) Update eslintrc file to no longer allow past errors (@FredKSchott)
-- [#1155](https://github.com/request/request/pull/1155) Support/use self everywhere (@seanstrom)
-- [#1161](https://github.com/request/request/pull/1161) fix no-use-before-define lint warnings (@emkay)
-- [#1156](https://github.com/request/request/pull/1156) adding curly brackets to get rid of lint errors (@emkay)
-- [#1151](https://github.com/request/request/pull/1151) Fix localAddress test on OS X (@nylen)
-- [#1145](https://github.com/request/request/pull/1145) documentation: fix outdated reference to setCookieSync old name in README (@FredKSchott)
-- [#1131](https://github.com/request/request/pull/1131) Update pool documentation (@FredKSchott)
-- [#1143](https://github.com/request/request/pull/1143) Rewrite all tests to use tape (@nylen)
-- [#1137](https://github.com/request/request/pull/1137) Add ability to specifiy querystring lib in options. (@jgrund)
-- [#1138](https://github.com/request/request/pull/1138) allow hostname and port in place of host on uri (@slimelabs)
-- [#1134](https://github.com/request/request/pull/1134) Fix multiple redirects and `self.followRedirect` (@blakeembrey)
-- [#1130](https://github.com/request/request/pull/1130) documentation fix: add note about npm test for contributing (@FredKSchott)
-- [#1120](https://github.com/request/request/pull/1120) Support/refactor request setup tunnel (@seanstrom)
-- [#1129](https://github.com/request/request/pull/1129) linting fix: convert double quote strings to use single quotes (@FredKSchott)
-- [#1124](https://github.com/request/request/pull/1124) linting fix: remove unneccesary semi-colons (@FredKSchott)
-
-### v2.45.0 (2014/10/06)
-- [#1128](https://github.com/request/request/pull/1128) Add test for setCookie regression (@nylen)
-- [#1127](https://github.com/request/request/pull/1127) added tests around using objects as values in a query string (@bcoe)
-- [#1103](https://github.com/request/request/pull/1103) Support/refactor request constructor (@nylen, @seanstrom)
-- [#1119](https://github.com/request/request/pull/1119) add basic linting to request library (@FredKSchott)
-- [#1121](https://github.com/request/request/pull/1121) Revert "Explicitly use sync versions of cookie functions" (@nylen)
-- [#1118](https://github.com/request/request/pull/1118) linting fix: Restructure bad empty if statement (@FredKSchott)
-- [#1117](https://github.com/request/request/pull/1117) Fix a bad check for valid URIs (@FredKSchott)
-- [#1113](https://github.com/request/request/pull/1113) linting fix: space out operators (@FredKSchott)
-- [#1116](https://github.com/request/request/pull/1116) Fix typo in `noProxyHost` definition (@FredKSchott)
-- [#1114](https://github.com/request/request/pull/1114) linting fix: Added a `new` operator that was missing when creating and throwing a new error (@FredKSchott)
-- [#1096](https://github.com/request/request/pull/1096) No_proxy support (@samcday)
-- [#1107](https://github.com/request/request/pull/1107) linting-fix: remove unused variables (@FredKSchott)
-- [#1112](https://github.com/request/request/pull/1112) linting fix: Make return values consistent and more straitforward (@FredKSchott)
-- [#1111](https://github.com/request/request/pull/1111) linting fix: authPieces was getting redeclared (@FredKSchott)
-- [#1105](https://github.com/request/request/pull/1105) Use strict mode in request (@FredKSchott)
-- [#1110](https://github.com/request/request/pull/1110) linting fix: replace lazy '==' with more strict '===' (@FredKSchott)
-- [#1109](https://github.com/request/request/pull/1109) linting fix: remove function call from if-else conditional statement (@FredKSchott)
-- [#1102](https://github.com/request/request/pull/1102) Fix to allow setting a `requester` on recursive calls to `request.defaults` (@tikotzky)
-- [#1095](https://github.com/request/request/pull/1095) Tweaking engines in package.json (@pdehaan)
-- [#1082](https://github.com/request/request/pull/1082) Forward the socket event from the httpModule request (@seanstrom)
-- [#972](https://github.com/request/request/pull/972) Clarify gzip handling in the README (@kevinoid)
-- [#1089](https://github.com/request/request/pull/1089) Mention that encoding defaults to utf8, not Buffer (@stuartpb)
-- [#1088](https://github.com/request/request/pull/1088) Fix cookie example in README.md and make it more clear (@pipi32167)
-- [#1027](https://github.com/request/request/pull/1027) Add support for multipart form data in request options. (@crocket)
-- [#1076](https://github.com/request/request/pull/1076) use Request.abort() to abort the request when the request has timed-out (@seanstrom)
-- [#1068](https://github.com/request/request/pull/1068) add optional postamble required by .NET multipart requests (@netpoetica)
-
-### v2.43.0 (2014/09/18)
-- [#1057](https://github.com/request/request/pull/1057) Defaults should not overwrite defined options (@davidwood)
-- [#1046](https://github.com/request/request/pull/1046) Propagate datastream errors, useful in case gzip fails. (@ZJONSSON, @Janpot)
-- [#1063](https://github.com/request/request/pull/1063) copy the input headers object #1060 (@finnp)
-- [#1031](https://github.com/request/request/pull/1031) Explicitly use sync versions of cookie functions (@ZJONSSON)
-- [#1056](https://github.com/request/request/pull/1056) Fix redirects when passing url.parse(x) as URL to convenience method (@nylen)
-
-### v2.42.0 (2014/09/04)
-- [#1053](https://github.com/request/request/pull/1053) Fix #1051 Parse auth properly when using non-tunneling proxy (@isaacs)
-
-### v2.41.0 (2014/09/04)
-- [#1050](https://github.com/request/request/pull/1050) Pass whitelisted headers to tunneling proxy.  Organize all tunneling logic. (@isaacs, @Feldhacker)
-- [#1035](https://github.com/request/request/pull/1035) souped up nodei.co badge (@rvagg)
-- [#1048](https://github.com/request/request/pull/1048) Aws is now possible over a proxy (@steven-aerts)
-- [#1039](https://github.com/request/request/pull/1039) extract out helper functions to a helper file (@seanstrom)
-- [#1021](https://github.com/request/request/pull/1021) Support/refactor indexjs (@seanstrom)
-- [#1033](https://github.com/request/request/pull/1033) Improve and document debug options (@nylen)
-- [#1034](https://github.com/request/request/pull/1034) Fix readme headings (@nylen)
-- [#1030](https://github.com/request/request/pull/1030) Allow recursive request.defaults (@tikotzky)
-- [#1029](https://github.com/request/request/pull/1029) Fix a couple of typos (@nylen)
-- [#675](https://github.com/request/request/pull/675) Checking for SSL fault on connection before reading SSL properties (@VRMink)
-- [#989](https://github.com/request/request/pull/989) Added allowRedirect function. Should return true if redirect is allowed or false otherwise (@doronin)
-- [#1025](https://github.com/request/request/pull/1025) [fixes #1023] Set self._ended to true once response has ended (@mridgway)
-- [#1020](https://github.com/request/request/pull/1020) Add back removed debug metadata (@FredKSchott)
-- [#1008](https://github.com/request/request/pull/1008) Moving to  module instead of cutomer buffer concatenation. (@mikeal)
-- [#770](https://github.com/request/request/pull/770) Added dependency badge for README file; (@timgluz, @mafintosh, @lalitkapoor, @stash, @bobyrizov)
-- [#1016](https://github.com/request/request/pull/1016) toJSON no longer results in an infinite loop, returns simple objects (@FredKSchott)
-- [#1018](https://github.com/request/request/pull/1018) Remove pre-0.4.4 HTTPS fix (@mmalecki)
-- [#1006](https://github.com/request/request/pull/1006) Migrate to caseless, fixes #1001 (@mikeal)
-- [#995](https://github.com/request/request/pull/995) Fix parsing array of objects (@sjonnet19)
-- [#999](https://github.com/request/request/pull/999) Fix fallback for browserify for optional modules. (@eiriksm)
-- [#996](https://github.com/request/request/pull/996) Wrong oauth signature when multiple same param keys exist [updated] (@bengl, @hyjin)
-
-### v2.40.0 (2014/08/06)
-- [#992](https://github.com/request/request/pull/992) Fix security vulnerability. Update qs (@poeticninja)
-- [#988](https://github.com/request/request/pull/988) “--” -> “—” (@upisfree)
-- [#987](https://github.com/request/request/pull/987) Show optional modules as being loaded by the module that reqeusted them (@iarna)
-
-### v2.39.0 (2014/07/24)
-- [#976](https://github.com/request/request/pull/976) Update README.md (@pvoznenko)
-
-### v2.38.0 (2014/07/22)
-- [#952](https://github.com/request/request/pull/952) Adding support to client certificate with proxy use case (@ofirshaked)
-- [#884](https://github.com/request/request/pull/884) Documented tough-cookie installation. (@wbyoung)
-- [#935](https://github.com/request/request/pull/935) Correct repository url (@fritx)
-- [#963](https://github.com/request/request/pull/963) Update changelog (@nylen)
-- [#960](https://github.com/request/request/pull/960) Support gzip with encoding on node pre-v0.9.4 (@kevinoid)
-- [#953](https://github.com/request/request/pull/953) Add async Content-Length computation when using form-data (@LoicMahieu)
-- [#844](https://github.com/request/request/pull/844) Add support for HTTP[S]_PROXY environment variables.  Fixes #595. (@jvmccarthy)
-- [#946](https://github.com/request/request/pull/946) defaults: merge headers (@aj0strow)
-
-### v2.37.0 (2014/07/07)
-- [#957](https://github.com/request/request/pull/957) Silence EventEmitter memory leak warning #311 (@watson)
-- [#955](https://github.com/request/request/pull/955) check for content-length header before setting it in nextTick (@camilleanne)
-- [#951](https://github.com/request/request/pull/951) Add support for gzip content decoding (@kevinoid)
-- [#949](https://github.com/request/request/pull/949) Manually enter querystring in form option (@charlespwd)
-- [#944](https://github.com/request/request/pull/944) Make request work with browserify (@eiriksm)
-- [#943](https://github.com/request/request/pull/943) New mime module (@eiriksm)
-- [#927](https://github.com/request/request/pull/927) Bump version of hawk dep. (@samccone)
-- [#907](https://github.com/request/request/pull/907) append secureOptions to poolKey (@medovob)
-
-### v2.35.0 (2014/05/17)
-- [#901](https://github.com/request/request/pull/901) Fixes #555 (@pigulla)
-- [#897](https://github.com/request/request/pull/897) merge with default options (@vohof)
-- [#891](https://github.com/request/request/pull/891) fixes 857 - options object is mutated by calling request (@lalitkapoor)
-- [#869](https://github.com/request/request/pull/869) Pipefilter test (@tgohn)
-- [#866](https://github.com/request/request/pull/866) Fix typo (@dandv)
-- [#861](https://github.com/request/request/pull/861) Add support for RFC 6750 Bearer Tokens (@phedny)
-- [#809](https://github.com/request/request/pull/809) upgrade tunnel-proxy to 0.4.0 (@ksato9700)
-- [#850](https://github.com/request/request/pull/850) Fix word consistency in readme (@0xNobody)
-- [#810](https://github.com/request/request/pull/810) add some exposition to mpu example in README.md (@mikermcneil)
-- [#840](https://github.com/request/request/pull/840) improve error reporting for invalid protocols (@FND)
-- [#821](https://github.com/request/request/pull/821) added secureOptions back (@nw)
-- [#815](https://github.com/request/request/pull/815) Create changelog based on pull requests (@lalitkapoor)
-
-### v2.34.0 (2014/02/18)
-- [#516](https://github.com/request/request/pull/516) UNIX Socket URL Support (@lyuzashi)
-- [#801](https://github.com/request/request/pull/801) 794 ignore cookie parsing and domain errors (@lalitkapoor)
-- [#802](https://github.com/request/request/pull/802) Added the Apache license to the package.json. (@keskival)
-- [#793](https://github.com/request/request/pull/793) Adds content-length calculation when submitting forms using form-data li... (@Juul)
-- [#785](https://github.com/request/request/pull/785) Provide ability to override content-type when `json` option used (@vvo)
-- [#781](https://github.com/request/request/pull/781) simpler isReadStream function (@joaojeronimo)
-
-### v2.32.0 (2014/01/16)
-- [#767](https://github.com/request/request/pull/767) Use tough-cookie CookieJar sync API (@stash)
-- [#764](https://github.com/request/request/pull/764) Case-insensitive authentication scheme (@bobyrizov)
-- [#763](https://github.com/request/request/pull/763) Upgrade tough-cookie to 0.10.0 (@stash)
-- [#744](https://github.com/request/request/pull/744) Use Cookie.parse (@lalitkapoor)
-- [#757](https://github.com/request/request/pull/757) require aws-sign2 (@mafintosh)
-
-### v2.31.0 (2014/01/08)
-- [#645](https://github.com/request/request/pull/645) update twitter api url to v1.1 (@mick)
-- [#746](https://github.com/request/request/pull/746) README: Markdown code highlight (@weakish)
-- [#745](https://github.com/request/request/pull/745) updating setCookie example to make it clear that the callback is required (@emkay)
-- [#742](https://github.com/request/request/pull/742) Add note about JSON output body type (@iansltx)
-- [#741](https://github.com/request/request/pull/741) README example is using old cookie jar api (@emkay)
-- [#736](https://github.com/request/request/pull/736) Fix callback arguments documentation (@mmalecki)
-
-### v2.30.0 (2013/12/13)
-- [#732](https://github.com/request/request/pull/732) JSHINT: Creating global 'for' variable. Should be 'for (var ...'. (@Fritz-Lium)
-- [#730](https://github.com/request/request/pull/730) better HTTP DIGEST support (@dai-shi)
-- [#728](https://github.com/request/request/pull/728) Fix TypeError when calling request.cookie (@scarletmeow)
-
-### v2.29.0 (2013/12/06)
-- [#727](https://github.com/request/request/pull/727) fix requester bug (@jchris)
-
-### v2.28.0 (2013/12/04)
-- [#724](https://github.com/request/request/pull/724) README.md: add custom HTTP Headers example. (@tcort)
-- [#719](https://github.com/request/request/pull/719) Made a comment gender neutral. (@unsetbit)
-- [#715](https://github.com/request/request/pull/715) Request.multipart no longer crashes when header 'Content-type' present (@pastaclub)
-- [#710](https://github.com/request/request/pull/710) Fixing listing in callback part of docs. (@lukasz-zak)
-- [#696](https://github.com/request/request/pull/696) Edited README.md for formatting and clarity of phrasing (@Zearin)
-- [#694](https://github.com/request/request/pull/694) Typo in README (@VRMink)
-- [#690](https://github.com/request/request/pull/690) Handle blank password in basic auth. (@diversario)
-- [#682](https://github.com/request/request/pull/682) Optional dependencies (@Turbo87)
-- [#683](https://github.com/request/request/pull/683) Travis CI support (@Turbo87)
-- [#674](https://github.com/request/request/pull/674) change cookie module,to tough-cookie.please check it . (@sxyizhiren)
-- [#666](https://github.com/request/request/pull/666) make `ciphers` and `secureProtocol` to work in https request (@richarddong)
-- [#656](https://github.com/request/request/pull/656) Test case for #304. (@diversario)
-- [#662](https://github.com/request/request/pull/662) option.tunnel to explicitly disable tunneling (@seanmonstar)
-- [#659](https://github.com/request/request/pull/659) fix failure when running with NODE_DEBUG=request, and a test for that (@jrgm)
-- [#630](https://github.com/request/request/pull/630) Send random cnonce for HTTP Digest requests (@wprl)
-
-### v2.27.0 (2013/08/15)
-- [#619](https://github.com/request/request/pull/619) decouple things a bit (@joaojeronimo)
-
-### v2.26.0 (2013/08/07)
-- [#613](https://github.com/request/request/pull/613) Fixes #583, moved initialization of self.uri.pathname (@lexander)
-- [#605](https://github.com/request/request/pull/605) Only include ":" + pass in Basic Auth if it's defined (fixes #602) (@bendrucker)
-
-### v2.24.0 (2013/07/23)
-- [#596](https://github.com/request/request/pull/596) Global agent is being used when pool is specified (@Cauldrath)
-- [#594](https://github.com/request/request/pull/594) Emit complete event when there is no callback (@RomainLK)
-- [#601](https://github.com/request/request/pull/601) Fixed a small typo (@michalstanko)
-
-### v2.23.0 (2013/07/23)
-- [#589](https://github.com/request/request/pull/589) Prevent setting headers after they are sent (@geek)
-- [#587](https://github.com/request/request/pull/587) Global cookie jar disabled by default (@threepointone)
-- [#544](https://github.com/request/request/pull/544) Update http-signature version. (@davidlehn)
-- [#581](https://github.com/request/request/pull/581) Fix spelling of "ignoring." (@bigeasy)
-- [#568](https://github.com/request/request/pull/568) use agentOptions to create agent when specified in request (@SamPlacette)
-- [#564](https://github.com/request/request/pull/564) Fix redirections (@criloz)
-- [#541](https://github.com/request/request/pull/541) The exported request function doesn't have an auth method (@tschaub)
-- [#542](https://github.com/request/request/pull/542) Expose Request class (@regality)
-- [#536](https://github.com/request/request/pull/536) Allow explicitly empty user field for basic authentication. (@mikeando)
-- [#532](https://github.com/request/request/pull/532) fix typo (@fredericosilva)
-- [#497](https://github.com/request/request/pull/497) Added redirect event (@Cauldrath)
-- [#503](https://github.com/request/request/pull/503) Fix basic auth for passwords that contain colons (@tonistiigi)
-- [#521](https://github.com/request/request/pull/521) Improving test-localAddress.js (@noway421)
-- [#529](https://github.com/request/request/pull/529) dependencies versions bump (@jodaka)
-- [#523](https://github.com/request/request/pull/523) Updating dependencies (@noway421)
-- [#520](https://github.com/request/request/pull/520) Fixing test-tunnel.js (@noway421)
-- [#519](https://github.com/request/request/pull/519) Update internal path state on post-creation QS changes (@jblebrun)
-- [#510](https://github.com/request/request/pull/510) Add HTTP Signature support. (@davidlehn)
-- [#502](https://github.com/request/request/pull/502) Fix POST (and probably other) requests that are retried after 401 Unauthorized (@nylen)
-- [#508](https://github.com/request/request/pull/508) Honor the .strictSSL option when using proxies (tunnel-agent) (@jhs)
-- [#512](https://github.com/request/request/pull/512) Make password optional to support the format: http://username@hostname/ (@pajato1)
-- [#513](https://github.com/request/request/pull/513) add 'localAddress' support (@yyfrankyy)
-- [#498](https://github.com/request/request/pull/498) Moving response emit above setHeaders on destination streams (@kenperkins)
-- [#490](https://github.com/request/request/pull/490) Empty response body (3-rd argument) must be passed to callback as an empty string (@Olegas)
-- [#479](https://github.com/request/request/pull/479) Changing so if Accept header is explicitly set, sending json does not ov... (@RoryH)
-- [#475](https://github.com/request/request/pull/475) Use `unescape` from `querystring` (@shimaore)
-- [#473](https://github.com/request/request/pull/473) V0.10 compat (@isaacs)
-- [#471](https://github.com/request/request/pull/471) Using querystring library from visionmedia (@kbackowski)
-- [#461](https://github.com/request/request/pull/461) Strip the UTF8 BOM from a UTF encoded response (@kppullin)
-- [#460](https://github.com/request/request/pull/460) hawk 0.10.0 (@hueniverse)
-- [#462](https://github.com/request/request/pull/462) if query params are empty, then request path shouldn't end with a '?' (merges cleanly now) (@jaipandya)
-- [#456](https://github.com/request/request/pull/456) hawk 0.9.0 (@hueniverse)
-- [#429](https://github.com/request/request/pull/429) Copy options before adding callback. (@nrn, @nfriedly, @youurayy, @jplock, @kapetan, @landeiro, @othiym23, @mmalecki)
-- [#454](https://github.com/request/request/pull/454) Destroy the response if present when destroying the request (clean merge) (@mafintosh)
-- [#310](https://github.com/request/request/pull/310) Twitter Oauth Stuff Out of Date; Now Updated (@joemccann, @isaacs, @mscdex)
-- [#413](https://github.com/request/request/pull/413) rename googledoodle.png to .jpg (@nfriedly, @youurayy, @jplock, @kapetan, @landeiro, @othiym23, @mmalecki)
-- [#448](https://github.com/request/request/pull/448) Convenience method for PATCH (@mloar)
-- [#444](https://github.com/request/request/pull/444) protect against double callbacks on error path (@spollack)
-- [#433](https://github.com/request/request/pull/433) Added support for HTTPS cert & key (@mmalecki)
-- [#430](https://github.com/request/request/pull/430) Respect specified {Host,host} headers, not just {host} (@andrewschaaf)
-- [#415](https://github.com/request/request/pull/415) Fixed a typo. (@jerem)
-- [#338](https://github.com/request/request/pull/338) Add more auth options, including digest support (@nylen)
-- [#403](https://github.com/request/request/pull/403) Optimize environment lookup to happen once only (@mmalecki)
-- [#398](https://github.com/request/request/pull/398) Add more reporting to tests (@mmalecki)
-- [#388](https://github.com/request/request/pull/388) Ensure "safe" toJSON doesn't break EventEmitters (@othiym23)
-- [#381](https://github.com/request/request/pull/381) Resolving "Invalid signature. Expected signature base string: " (@landeiro)
-- [#380](https://github.com/request/request/pull/380) Fixes missing host header on retried request when using forever agent (@mac-)
-- [#376](https://github.com/request/request/pull/376) Headers lost on redirect (@kapetan)
-- [#375](https://github.com/request/request/pull/375) Fix for missing oauth_timestamp parameter (@jplock)
-- [#374](https://github.com/request/request/pull/374) Correct Host header for proxy tunnel CONNECT (@youurayy)
-- [#370](https://github.com/request/request/pull/370) Twitter reverse auth uses x_auth_mode not x_auth_type (@drudge)
-- [#369](https://github.com/request/request/pull/369) Don't remove x_auth_mode for Twitter reverse auth (@drudge)
-- [#344](https://github.com/request/request/pull/344) Make AWS auth signing find headers correctly (@nlf)
-- [#363](https://github.com/request/request/pull/363) rfc3986 on base_uri, now passes tests (@jeffmarshall)
-- [#362](https://github.com/request/request/pull/362) Running `rfc3986` on `base_uri` in `oauth.hmacsign` instead of just `encodeURIComponent` (@jeffmarshall)
-- [#361](https://github.com/request/request/pull/361) Don't create a Content-Length header if we already have it set (@danjenkins)
-- [#360](https://github.com/request/request/pull/360) Delete self._form along with everything else on redirect (@jgautier)
-- [#355](https://github.com/request/request/pull/355) stop sending erroneous headers on redirected requests (@azylman)
-- [#332](https://github.com/request/request/pull/332) Fix #296 - Only set Content-Type if body exists (@Marsup)
-- [#343](https://github.com/request/request/pull/343) Allow AWS to work in more situations, added a note in the README on its usage (@nlf)
-- [#320](https://github.com/request/request/pull/320) request.defaults() doesn't need to wrap jar() (@StuartHarris)
-- [#322](https://github.com/request/request/pull/322) Fix + test for piped into request bumped into redirect. #321 (@alexindigo)
-- [#326](https://github.com/request/request/pull/326) Do not try to remove listener from an undefined connection (@strk)
-- [#318](https://github.com/request/request/pull/318) Pass servername to tunneling secure socket creation (@isaacs)
-- [#317](https://github.com/request/request/pull/317) Workaround for #313 (@isaacs)
-- [#293](https://github.com/request/request/pull/293) Allow parser errors to bubble up to request (@mscdex)
-- [#290](https://github.com/request/request/pull/290) A test for #289 (@isaacs)
-- [#280](https://github.com/request/request/pull/280) Like in node.js print options if NODE_DEBUG contains the word request (@Filirom1)
-- [#207](https://github.com/request/request/pull/207) Fix #206 Change HTTP/HTTPS agent when redirecting between protocols (@isaacs)
-- [#214](https://github.com/request/request/pull/214) documenting additional behavior of json option (@jphaas)
-- [#272](https://github.com/request/request/pull/272) Boundary begins with CRLF? (@elspoono, @timshadel, @naholyr, @nanodocumet, @TehShrike)
-- [#284](https://github.com/request/request/pull/284) Remove stray `console.log()` call in multipart generator. (@bcherry)
-- [#241](https://github.com/request/request/pull/241) Composability updates suggested by issue #239 (@polotek)
-- [#282](https://github.com/request/request/pull/282) OAuth Authorization header contains non-"oauth_" parameters (@jplock)
-- [#279](https://github.com/request/request/pull/279) fix tests with boundary by injecting boundry from header (@benatkin)
-- [#273](https://github.com/request/request/pull/273) Pipe back pressure issue (@mafintosh)
-- [#268](https://github.com/request/request/pull/268) I'm not OCD seriously (@TehShrike)
-- [#263](https://github.com/request/request/pull/263) Bug in OAuth key generation for sha1 (@nanodocumet)
-- [#265](https://github.com/request/request/pull/265) uncaughtException when redirected to invalid URI (@naholyr)
-- [#262](https://github.com/request/request/pull/262) JSON test should check for equality (@timshadel)
-- [#261](https://github.com/request/request/pull/261) Setting 'pool' to 'false' does NOT disable Agent pooling (@timshadel)
-- [#249](https://github.com/request/request/pull/249) Fix for the fix of your (closed) issue #89 where self.headers[content-length] is set to 0 for all methods (@sethbridges, @polotek, @zephrax, @jeromegn)
-- [#255](https://github.com/request/request/pull/255) multipart allow body === '' ( the empty string ) (@Filirom1)
-- [#260](https://github.com/request/request/pull/260) fixed just another leak of 'i' (@sreuter)
-- [#246](https://github.com/request/request/pull/246) Fixing the set-cookie header (@jeromegn)
-- [#243](https://github.com/request/request/pull/243) Dynamic boundary (@zephrax)
-- [#240](https://github.com/request/request/pull/240) don't error when null is passed for options (@polotek)
-- [#211](https://github.com/request/request/pull/211) Replace all occurrences of special chars in RFC3986 (@chriso)
-- [#224](https://github.com/request/request/pull/224) Multipart content-type change (@janjongboom)
-- [#217](https://github.com/request/request/pull/217) need to use Authorization (titlecase) header with Tumblr OAuth (@visnup)
-- [#203](https://github.com/request/request/pull/203) Fix cookie and redirect bugs and add auth support for HTTPS tunnel (@milewise)
-- [#199](https://github.com/request/request/pull/199) Tunnel (@isaacs)
-- [#198](https://github.com/request/request/pull/198) Bugfix on forever usage of util.inherits (@isaacs)
-- [#197](https://github.com/request/request/pull/197) Make ForeverAgent work with HTTPS (@isaacs)
-- [#193](https://github.com/request/request/pull/193) Fixes GH-119 (@goatslacker)
-- [#188](https://github.com/request/request/pull/188) Add abort support to the returned request (@itay)
-- [#176](https://github.com/request/request/pull/176) Querystring option (@csainty)
-- [#182](https://github.com/request/request/pull/182) Fix request.defaults to support (uri, options, callback) api (@twilson63)
-- [#180](https://github.com/request/request/pull/180) Modified the post, put, head and del shortcuts to support uri optional param (@twilson63)
-- [#179](https://github.com/request/request/pull/179) fix to add opts in .pipe(stream, opts) (@substack)
-- [#177](https://github.com/request/request/pull/177) Issue #173 Support uri as first and optional config as second argument (@twilson63)
-- [#170](https://github.com/request/request/pull/170) can't create a cookie in a wrapped request (defaults) (@fabianonunes)
-- [#168](https://github.com/request/request/pull/168) Picking off an EasyFix by adding some missing mimetypes. (@serby)
-- [#161](https://github.com/request/request/pull/161) Fix cookie jar/headers.cookie collision (#125) (@papandreou)
-- [#162](https://github.com/request/request/pull/162) Fix issue #159 (@dpetukhov)
-- [#90](https://github.com/request/request/pull/90) add option followAllRedirects to follow post/put redirects (@jroes)
-- [#148](https://github.com/request/request/pull/148) Retry Agent (@thejh)
-- [#146](https://github.com/request/request/pull/146) Multipart should respect content-type if previously set (@apeace)
-- [#144](https://github.com/request/request/pull/144) added "form" option to readme (@petejkim)
-- [#133](https://github.com/request/request/pull/133) Fixed cookies parsing (@afanasy)
-- [#135](https://github.com/request/request/pull/135) host vs hostname (@iangreenleaf)
-- [#132](https://github.com/request/request/pull/132) return the body as a Buffer when encoding is set to null (@jahewson)
-- [#112](https://github.com/request/request/pull/112) Support using a custom http-like module (@jhs)
-- [#104](https://github.com/request/request/pull/104) Cookie handling contains bugs (@janjongboom)
-- [#121](https://github.com/request/request/pull/121) Another patch for cookie handling regression (@jhurliman)
-- [#117](https://github.com/request/request/pull/117) Remove the global `i` (@3rd-Eden)
-- [#110](https://github.com/request/request/pull/110) Update to Iris Couch URL (@jhs)
-- [#86](https://github.com/request/request/pull/86) Can't post binary to multipart requests (@kkaefer)
-- [#105](https://github.com/request/request/pull/105) added test for proxy option. (@dominictarr)
-- [#102](https://github.com/request/request/pull/102) Implemented cookies - closes issue 82: https://github.com/mikeal/request/issues/82 (@alessioalex)
-- [#97](https://github.com/request/request/pull/97) Typo in previous pull causes TypeError in non-0.5.11 versions (@isaacs)
-- [#96](https://github.com/request/request/pull/96) Authless parsed url host support (@isaacs)
-- [#81](https://github.com/request/request/pull/81) Enhance redirect handling (@danmactough)
-- [#78](https://github.com/request/request/pull/78) Don't try to do strictSSL for non-ssl connections (@isaacs)
-- [#76](https://github.com/request/request/pull/76) Bug when a request fails and a timeout is set (@Marsup)
-- [#70](https://github.com/request/request/pull/70) add test script to package.json (@isaacs, @aheckmann)
-- [#73](https://github.com/request/request/pull/73) Fix #71 Respect the strictSSL flag (@isaacs)
-- [#69](https://github.com/request/request/pull/69) Flatten chunked requests properly (@isaacs)
-- [#67](https://github.com/request/request/pull/67) fixed global variable leaks (@aheckmann)
-- [#66](https://github.com/request/request/pull/66) Do not overwrite established content-type headers for read stream deliver (@voodootikigod)
-- [#53](https://github.com/request/request/pull/53) Parse json: Issue #51 (@benatkin)
-- [#45](https://github.com/request/request/pull/45) Added timeout option (@mbrevoort)
-- [#35](https://github.com/request/request/pull/35) The "end" event isn't emitted for some responses (@voxpelli)
-- [#31](https://github.com/request/request/pull/31) Error on piping a request to a destination (@tobowers)
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/CONTRIBUTING.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/CONTRIBUTING.md
deleted file mode 100644
index 8aa6999acd820e7beb1d31d50ea904dba27f845c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/CONTRIBUTING.md
+++ /dev/null
@@ -1,81 +0,0 @@
-
-# Contributing to Request
-
-:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:
-
-The following is a set of guidelines for contributing to Request and its packages, which are hosted in the [Request Organization](https://github.com/request) on GitHub.
-These are just guidelines, not rules, use your best judgment and feel free to propose changes to this document in a pull request.
-
-
-## Submitting an Issue
-
-1. Provide a small self **sufficient** code example to **reproduce** the issue.
-2. Run your test code using [request-debug](https://github.com/request/request-debug) and copy/paste the results inside the issue.
-3. You should **always** use fenced code blocks when submitting code examples or any other formatted output:
-  <pre>
-  ```js
-  put your javascript code here
-  ```
-
-  ```
-  put any other formatted output here,
-  like for example the one returned from using request-debug
-  ```
-  </pre>
-
-If the problem cannot be reliably reproduced, the issue will be marked as `Not enough info (see CONTRIBUTING.md)`.
-
-If the problem is not related to request the issue will be marked as `Help (please use Stackoverflow)`.
-
-
-## Submitting a Pull Request
-
-1. In almost all of the cases your PR **needs tests**. Make sure you have any.
-2. Run `npm test` locally. Fix any errors before pushing to GitHub.
-3. After submitting the PR a build will be triggered on TravisCI. Wait for it to ends and make sure all jobs are passing.
-
-
------------------------------------------
-
-
-## Becoming a Contributor
-
-Individuals making significant and valuable contributions are given
-commit-access to the project to contribute as they see fit. This project is
-more like an open wiki than a standard guarded open source project.
-
-
-## Rules
-
-There are a few basic ground-rules for contributors:
-
-1. **No `--force` pushes** or modifying the Git history in any way.
-1. **Non-master branches** ought to be used for ongoing work.
-1. **Any** change should be added through Pull Request.
-1. **External API changes and significant modifications** ought to be subject
-   to an **internal pull-request** to solicit feedback from other contributors.
-1. Internal pull-requests to solicit feedback are *encouraged* for any other
-   non-trivial contribution but left to the discretion of the contributor.
-1. For significant changes wait a full 24 hours before merging so that active
-   contributors who are distributed throughout the world have a chance to weigh
-   in.
-1. Contributors should attempt to adhere to the prevailing code-style.
-1. Run `npm test` locally before submitting your PR, to catch any easy to miss
-   style & testing issues.  To diagnose test failures, there are two ways to
-   run a single test file:
-     - `node_modules/.bin/taper tests/test-file.js` - run using the default
-       [`taper`](https://github.com/nylen/taper) test reporter.
-     - `node tests/test-file.js` - view the raw
-       [tap](https://testanything.org/) output.
-
-
-## Releases
-
-Declaring formal releases remains the prerogative of the project maintainer.
-
-
-## Changes to this arrangement
-
-This is an experiment and feedback is welcome! This document may also be
-subject to pull-requests or changes by contributors where you believe you have
-something valuable to add or change.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/LICENSE
deleted file mode 100644
index a4a9aee0c2fa14a2007895d018bfa06f0592fd34..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/LICENSE
+++ /dev/null
@@ -1,55 +0,0 @@
-Apache License
-
-Version 2.0, January 2004
-
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
-
-"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
-
-You must give any other recipients of the Work or Derivative Works a copy of this License; and
-
-You must cause any modified files to carry prominent notices stating that You changed the files; and
-
-You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
-
-If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/README.md
deleted file mode 100644
index 81ecac50999a3482095b97bb68752fa5c731196e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/README.md
+++ /dev/null
@@ -1,1097 +0,0 @@
-
-# Request - Simplified HTTP client
-
-[![npm package](https://nodei.co/npm/request.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/request/)
-
-[![Build status](https://img.shields.io/travis/request/request/master.svg?style=flat-square)](https://travis-ci.org/request/request)
-[![Coverage](https://img.shields.io/codecov/c/github/request/request.svg?style=flat-square)](https://codecov.io/github/request/request?branch=master)
-[![Coverage](https://img.shields.io/coveralls/request/request.svg?style=flat-square)](https://coveralls.io/r/request/request)
-[![Dependency Status](https://img.shields.io/david/request/request.svg?style=flat-square)](https://david-dm.org/request/request)
-[![Known Vulnerabilities](https://snyk.io/test/npm/request/badge.svg?style=flat-square)](https://snyk.io/test/npm/request)
-[![Gitter](https://img.shields.io/badge/gitter-join_chat-blue.svg?style=flat-square)](https://gitter.im/request/request?utm_source=badge)
-
-
-## Super simple to use
-
-Request is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.
-
-```js
-var request = require('request');
-request('http://www.google.com', function (error, response, body) {
-  if (!error && response.statusCode == 200) {
-    console.log(body) // Show the HTML for the Google homepage.
-  }
-})
-```
-
-
-## Table of contents
-
-- [Streaming](#streaming)
-- [Forms](#forms)
-- [HTTP Authentication](#http-authentication)
-- [Custom HTTP Headers](#custom-http-headers)
-- [OAuth Signing](#oauth-signing)
-- [Proxies](#proxies)
-- [Unix Domain Sockets](#unix-domain-sockets)
-- [TLS/SSL Protocol](#tlsssl-protocol)
-- [Support for HAR 1.2](#support-for-har-12)
-- [**All Available Options**](#requestoptions-callback)
-
-Request also offers [convenience methods](#convenience-methods) like
-`request.defaults` and `request.post`, and there are
-lots of [usage examples](#examples) and several
-[debugging techniques](#debugging).
-
-
----
-
-
-## Streaming
-
-You can stream any response to a file stream.
-
-```js
-request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))
-```
-
-You can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case `application/json`) and use the proper `content-type` in the PUT request (if the headers don’t already provide one).
-
-```js
-fs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))
-```
-
-Request can also `pipe` to itself. When doing so, `content-type` and `content-length` are preserved in the PUT headers.
-
-```js
-request.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))
-```
-
-Request emits a "response" event when a response is received. The `response` argument will be an instance of [http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage).
-
-```js
-request
-  .get('http://google.com/img.png')
-  .on('response', function(response) {
-    console.log(response.statusCode) // 200
-    console.log(response.headers['content-type']) // 'image/png'
-  })
-  .pipe(request.put('http://mysite.com/img.png'))
-```
-
-To easily handle errors when streaming requests, listen to the `error` event before piping:
-
-```js
-request
-  .get('http://mysite.com/doodle.png')
-  .on('error', function(err) {
-    console.log(err)
-  })
-  .pipe(fs.createWriteStream('doodle.png'))
-```
-
-Now let’s get fancy.
-
-```js
-http.createServer(function (req, resp) {
-  if (req.url === '/doodle.png') {
-    if (req.method === 'PUT') {
-      req.pipe(request.put('http://mysite.com/doodle.png'))
-    } else if (req.method === 'GET' || req.method === 'HEAD') {
-      request.get('http://mysite.com/doodle.png').pipe(resp)
-    }
-  }
-})
-```
-
-You can also `pipe()` from `http.ServerRequest` instances, as well as to `http.ServerResponse` instances. The HTTP method, headers, and entity-body data will be sent. Which means that, if you don't really care about security, you can do:
-
-```js
-http.createServer(function (req, resp) {
-  if (req.url === '/doodle.png') {
-    var x = request('http://mysite.com/doodle.png')
-    req.pipe(x)
-    x.pipe(resp)
-  }
-})
-```
-
-And since `pipe()` returns the destination stream in ≥ Node 0.5.x you can do one line proxying. :)
-
-```js
-req.pipe(request('http://mysite.com/doodle.png')).pipe(resp)
-```
-
-Also, none of this new functionality conflicts with requests previous features, it just expands them.
-
-```js
-var r = request.defaults({'proxy':'http://localproxy.com'})
-
-http.createServer(function (req, resp) {
-  if (req.url === '/doodle.png') {
-    r.get('http://google.com/doodle.png').pipe(resp)
-  }
-})
-```
-
-You can still use intermediate proxies, the requests will still follow HTTP forwards, etc.
-
-[back to top](#table-of-contents)
-
-
----
-
-
-## Forms
-
-`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.
-
-
-#### application/x-www-form-urlencoded (URL-Encoded Forms)
-
-URL-encoded forms are simple.
-
-```js
-request.post('http://service.com/upload', {form:{key:'value'}})
-// or
-request.post('http://service.com/upload').form({key:'value'})
-// or
-request.post({url:'http://service.com/upload', form: {key:'value'}}, function(err,httpResponse,body){ /* ... */ })
-```
-
-
-#### multipart/form-data (Multipart Form Uploads)
-
-For `multipart/form-data` we use the [form-data](https://github.com/form-data/form-data) library by [@felixge](https://github.com/felixge). For the most cases, you can pass your upload form data via the `formData` option.
-
-
-```js
-var formData = {
-  // Pass a simple key-value pair
-  my_field: 'my_value',
-  // Pass data via Buffers
-  my_buffer: new Buffer([1, 2, 3]),
-  // Pass data via Streams
-  my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
-  // Pass multiple values /w an Array
-  attachments: [
-    fs.createReadStream(__dirname + '/attachment1.jpg'),
-    fs.createReadStream(__dirname + '/attachment2.jpg')
-  ],
-  // Pass optional meta-data with an 'options' object with style: {value: DATA, options: OPTIONS}
-  // Use case: for some types of streams, you'll need to provide "file"-related information manually.
-  // See the `form-data` README for more information about options: https://github.com/form-data/form-data
-  custom_file: {
-    value:  fs.createReadStream('/dev/urandom'),
-    options: {
-      filename: 'topsecret.jpg',
-      contentType: 'image/jpg'
-    }
-  }
-};
-request.post({url:'http://service.com/upload', formData: formData}, function optionalCallback(err, httpResponse, body) {
-  if (err) {
-    return console.error('upload failed:', err);
-  }
-  console.log('Upload successful!  Server responded with:', body);
-});
-```
-
-For advanced cases, you can access the form-data object itself via `r.form()`. This can be modified until the request is fired on the next cycle of the event-loop. (Note that this calling `form()` will clear the currently set form data for that request.)
-
-```js
-// NOTE: Advanced use-case, for normal use see 'formData' usage above
-var r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) {...})
-var form = r.form();
-form.append('my_field', 'my_value');
-form.append('my_buffer', new Buffer([1, 2, 3]));
-form.append('custom_file', fs.createReadStream(__dirname + '/unicycle.jpg'), {filename: 'unicycle.jpg'});
-```
-See the [form-data README](https://github.com/form-data/form-data) for more information & examples.
-
-
-#### multipart/related
-
-Some variations in different HTTP implementations require a newline/CRLF before, after, or both before and after the boundary of a `multipart/related` request (using the multipart option). This has been observed in the .NET WebAPI version 4.0. You can turn on a boundary preambleCRLF or postamble by passing them as `true` to your request options.
-
-```js
-  request({
-    method: 'PUT',
-    preambleCRLF: true,
-    postambleCRLF: true,
-    uri: 'http://service.com/upload',
-    multipart: [
-      {
-        'content-type': 'application/json',
-        body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})
-      },
-      { body: 'I am an attachment' },
-      { body: fs.createReadStream('image.png') }
-    ],
-    // alternatively pass an object containing additional options
-    multipart: {
-      chunked: false,
-      data: [
-        {
-          'content-type': 'application/json',
-          body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})
-        },
-        { body: 'I am an attachment' }
-      ]
-    }
-  },
-  function (error, response, body) {
-    if (error) {
-      return console.error('upload failed:', error);
-    }
-    console.log('Upload successful!  Server responded with:', body);
-  })
-```
-
-[back to top](#table-of-contents)
-
-
----
-
-
-## HTTP Authentication
-
-```js
-request.get('http://some.server.com/').auth('username', 'password', false);
-// or
-request.get('http://some.server.com/', {
-  'auth': {
-    'user': 'username',
-    'pass': 'password',
-    'sendImmediately': false
-  }
-});
-// or
-request.get('http://some.server.com/').auth(null, null, true, 'bearerToken');
-// or
-request.get('http://some.server.com/', {
-  'auth': {
-    'bearer': 'bearerToken'
-  }
-});
-```
-
-If passed as an option, `auth` should be a hash containing values:
-
-- `user` || `username`
-- `pass` || `password`
-- `sendImmediately` (optional)
-- `bearer` (optional)
-
-The method form takes parameters
-`auth(username, password, sendImmediately, bearer)`.
-
-`sendImmediately` defaults to `true`, which causes a basic or bearer
-authentication header to be sent.  If `sendImmediately` is `false`, then
-`request` will retry with a proper authentication header after receiving a
-`401` response from the server (which must contain a `WWW-Authenticate` header
-indicating the required authentication method).
-
-Note that you can also specify basic authentication using the URL itself, as
-detailed in [RFC 1738](http://www.ietf.org/rfc/rfc1738.txt).  Simply pass the
-`user:password` before the host with an `@` sign:
-
-```js
-var username = 'username',
-    password = 'password',
-    url = 'http://' + username + ':' + password + '@some.server.com';
-
-request({url: url}, function (error, response, body) {
-   // Do more stuff with 'body' here
-});
-```
-
-Digest authentication is supported, but it only works with `sendImmediately`
-set to `false`; otherwise `request` will send basic authentication on the
-initial request, which will probably cause the request to fail.
-
-Bearer authentication is supported, and is activated when the `bearer` value is
-available. The value may be either a `String` or a `Function` returning a
-`String`. Using a function to supply the bearer token is particularly useful if
-used in conjunction with `defaults` to allow a single function to supply the
-last known token at the time of sending a request, or to compute one on the fly.
-
-[back to top](#table-of-contents)
-
-
----
-
-
-## Custom HTTP Headers
-
-HTTP Headers, such as `User-Agent`, can be set in the `options` object.
-In the example below, we call the github API to find out the number
-of stars and forks for the request repository. This requires a
-custom `User-Agent` header as well as https.
-
-```js
-var request = require('request');
-
-var options = {
-  url: 'https://api.github.com/repos/request/request',
-  headers: {
-    'User-Agent': 'request'
-  }
-};
-
-function callback(error, response, body) {
-  if (!error && response.statusCode == 200) {
-    var info = JSON.parse(body);
-    console.log(info.stargazers_count + " Stars");
-    console.log(info.forks_count + " Forks");
-  }
-}
-
-request(options, callback);
-```
-
-[back to top](#table-of-contents)
-
-
----
-
-
-## OAuth Signing
-
-[OAuth version 1.0](https://tools.ietf.org/html/rfc5849) is supported.  The
-default signing algorithm is
-[HMAC-SHA1](https://tools.ietf.org/html/rfc5849#section-3.4.2):
-
-```js
-// OAuth1.0 - 3-legged server side flow (Twitter example)
-// step 1
-var qs = require('querystring')
-  , oauth =
-    { callback: 'http://mysite.com/callback/'
-    , consumer_key: CONSUMER_KEY
-    , consumer_secret: CONSUMER_SECRET
-    }
-  , url = 'https://api.twitter.com/oauth/request_token'
-  ;
-request.post({url:url, oauth:oauth}, function (e, r, body) {
-  // Ideally, you would take the body in the response
-  // and construct a URL that a user clicks on (like a sign in button).
-  // The verifier is only available in the response after a user has
-  // verified with twitter that they are authorizing your app.
-
-  // step 2
-  var req_data = qs.parse(body)
-  var uri = 'https://api.twitter.com/oauth/authenticate'
-    + '?' + qs.stringify({oauth_token: req_data.oauth_token})
-  // redirect the user to the authorize uri
-
-  // step 3
-  // after the user is redirected back to your server
-  var auth_data = qs.parse(body)
-    , oauth =
-      { consumer_key: CONSUMER_KEY
-      , consumer_secret: CONSUMER_SECRET
-      , token: auth_data.oauth_token
-      , token_secret: req_data.oauth_token_secret
-      , verifier: auth_data.oauth_verifier
-      }
-    , url = 'https://api.twitter.com/oauth/access_token'
-    ;
-  request.post({url:url, oauth:oauth}, function (e, r, body) {
-    // ready to make signed requests on behalf of the user
-    var perm_data = qs.parse(body)
-      , oauth =
-        { consumer_key: CONSUMER_KEY
-        , consumer_secret: CONSUMER_SECRET
-        , token: perm_data.oauth_token
-        , token_secret: perm_data.oauth_token_secret
-        }
-      , url = 'https://api.twitter.com/1.1/users/show.json'
-      , qs =
-        { screen_name: perm_data.screen_name
-        , user_id: perm_data.user_id
-        }
-      ;
-    request.get({url:url, oauth:oauth, qs:qs, json:true}, function (e, r, user) {
-      console.log(user)
-    })
-  })
-})
-```
-
-For [RSA-SHA1 signing](https://tools.ietf.org/html/rfc5849#section-3.4.3), make
-the following changes to the OAuth options object:
-* Pass `signature_method : 'RSA-SHA1'`
-* Instead of `consumer_secret`, specify a `private_key` string in
-  [PEM format](http://how2ssl.com/articles/working_with_pem_files/)
-
-For [PLAINTEXT signing](http://oauth.net/core/1.0/#anchor22), make
-the following changes to the OAuth options object:
-* Pass `signature_method : 'PLAINTEXT'`
-
-To send OAuth parameters via query params or in a post body as described in The
-[Consumer Request Parameters](http://oauth.net/core/1.0/#consumer_req_param)
-section of the oauth1 spec:
-* Pass `transport_method : 'query'` or `transport_method : 'body'` in the OAuth
-  options object.
-* `transport_method` defaults to `'header'`
-
-To use [Request Body Hash](https://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html) you can either
-* Manually generate the body hash and pass it as a string `body_hash: '...'`
-* Automatically generate the body hash by passing `body_hash: true`
-
-[back to top](#table-of-contents)
-
-
----
-
-
-## Proxies
-
-If you specify a `proxy` option, then the request (and any subsequent
-redirects) will be sent via a connection to the proxy server.
-
-If your endpoint is an `https` url, and you are using a proxy, then
-request will send a `CONNECT` request to the proxy server *first*, and
-then use the supplied connection to connect to the endpoint.
-
-That is, first it will make a request like:
-
-```
-HTTP/1.1 CONNECT endpoint-server.com:80
-Host: proxy-server.com
-User-Agent: whatever user agent you specify
-```
-
-and then the proxy server make a TCP connection to `endpoint-server`
-on port `80`, and return a response that looks like:
-
-```
-HTTP/1.1 200 OK
-```
-
-At this point, the connection is left open, and the client is
-communicating directly with the `endpoint-server.com` machine.
-
-See [the wikipedia page on HTTP Tunneling](https://en.wikipedia.org/wiki/HTTP_tunnel)
-for more information.
-
-By default, when proxying `http` traffic, request will simply make a
-standard proxied `http` request.  This is done by making the `url`
-section of the initial line of the request a fully qualified url to
-the endpoint.
-
-For example, it will make a single request that looks like:
-
-```
-HTTP/1.1 GET http://endpoint-server.com/some-url
-Host: proxy-server.com
-Other-Headers: all go here
-
-request body or whatever
-```
-
-Because a pure "http over http" tunnel offers no additional security
-or other features, it is generally simpler to go with a
-straightforward HTTP proxy in this case.  However, if you would like
-to force a tunneling proxy, you may set the `tunnel` option to `true`.
-
-You can also make a standard proxied `http` request by explicitly setting
-`tunnel : false`, but **note that this will allow the proxy to see the traffic
-to/from the destination server**.
-
-If you are using a tunneling proxy, you may set the
-`proxyHeaderWhiteList` to share certain headers with the proxy.
-
-You can also set the `proxyHeaderExclusiveList` to share certain
-headers only with the proxy and not with destination host.
-
-By default, this set is:
-
-```
-accept
-accept-charset
-accept-encoding
-accept-language
-accept-ranges
-cache-control
-content-encoding
-content-language
-content-length
-content-location
-content-md5
-content-range
-content-type
-connection
-date
-expect
-max-forwards
-pragma
-proxy-authorization
-referer
-te
-transfer-encoding
-user-agent
-via
-```
-
-Note that, when using a tunneling proxy, the `proxy-authorization`
-header and any headers from custom `proxyHeaderExclusiveList` are
-*never* sent to the endpoint server, but only to the proxy server.
-
-
-### Controlling proxy behaviour using environment variables
-
-The following environment variables are respected by `request`:
-
- * `HTTP_PROXY` / `http_proxy`
- * `HTTPS_PROXY` / `https_proxy`
- * `NO_PROXY` / `no_proxy`
-
-When `HTTP_PROXY` / `http_proxy` are set, they will be used to proxy non-SSL requests that do not have an explicit `proxy` configuration option present. Similarly, `HTTPS_PROXY` / `https_proxy` will be respected for SSL requests that do not have an explicit `proxy` configuration option. It is valid to define a proxy in one of the environment variables, but then override it for a specific request, using the `proxy` configuration option. Furthermore, the `proxy` configuration option can be explicitly set to false / null to opt out of proxying altogether for that request.
-
-`request` is also aware of the `NO_PROXY`/`no_proxy` environment variables. These variables provide a granular way to opt out of proxying, on a per-host basis. It should contain a comma separated list of hosts to opt out of proxying. It is also possible to opt of proxying when a particular destination port is used. Finally, the variable may be set to `*` to opt out of the implicit proxy configuration of the other environment variables.
-
-Here's some examples of valid `no_proxy` values:
-
- * `google.com` - don't proxy HTTP/HTTPS requests to Google.
- * `google.com:443` - don't proxy HTTPS requests to Google, but *do* proxy HTTP requests to Google.
- * `google.com:443, yahoo.com:80` - don't proxy HTTPS requests to Google, and don't proxy HTTP requests to Yahoo!
- * `*` - ignore `https_proxy`/`http_proxy` environment variables altogether.
-
-[back to top](#table-of-contents)
-
-
----
-
-
-## UNIX Domain Sockets
-
-`request` supports making requests to [UNIX Domain Sockets](https://en.wikipedia.org/wiki/Unix_domain_socket). To make one, use the following URL scheme:
-
-```js
-/* Pattern */ 'http://unix:SOCKET:PATH'
-/* Example */ request.get('http://unix:/absolute/path/to/unix.socket:/request/path')
-```
-
-Note: The `SOCKET` path is assumed to be absolute to the root of the host file system.
-
-[back to top](#table-of-contents)
-
-
----
-
-
-## TLS/SSL Protocol
-
-TLS/SSL Protocol options, such as `cert`, `key` and `passphrase`, can be
-set directly in `options` object, in the `agentOptions` property of the `options` object, or even in `https.globalAgent.options`. Keep in mind that, although `agentOptions` allows for a slightly wider range of configurations, the recommended way is via `options` object directly, as using `agentOptions` or `https.globalAgent.options` would not be applied in the same way in proxied environments (as data travels through a TLS connection instead of an http/https agent).
-
-```js
-var fs = require('fs')
-    , path = require('path')
-    , certFile = path.resolve(__dirname, 'ssl/client.crt')
-    , keyFile = path.resolve(__dirname, 'ssl/client.key')
-    , caFile = path.resolve(__dirname, 'ssl/ca.cert.pem')
-    , request = require('request');
-
-var options = {
-    url: 'https://api.some-server.com/',
-    cert: fs.readFileSync(certFile),
-    key: fs.readFileSync(keyFile),
-    passphrase: 'password',
-    ca: fs.readFileSync(caFile)
-};
-
-request.get(options);
-```
-
-### Using `options.agentOptions`
-
-In the example below, we call an API requires client side SSL certificate
-(in PEM format) with passphrase protected private key (in PEM format) and disable the SSLv3 protocol:
-
-```js
-var fs = require('fs')
-    , path = require('path')
-    , certFile = path.resolve(__dirname, 'ssl/client.crt')
-    , keyFile = path.resolve(__dirname, 'ssl/client.key')
-    , request = require('request');
-
-var options = {
-    url: 'https://api.some-server.com/',
-    agentOptions: {
-        cert: fs.readFileSync(certFile),
-        key: fs.readFileSync(keyFile),
-        // Or use `pfx` property replacing `cert` and `key` when using private key, certificate and CA certs in PFX or PKCS12 format:
-        // pfx: fs.readFileSync(pfxFilePath),
-        passphrase: 'password',
-        securityOptions: 'SSL_OP_NO_SSLv3'
-    }
-};
-
-request.get(options);
-```
-
-It is able to force using SSLv3 only by specifying `secureProtocol`:
-
-```js
-request.get({
-    url: 'https://api.some-server.com/',
-    agentOptions: {
-        secureProtocol: 'SSLv3_method'
-    }
-});
-```
-
-It is possible to accept other certificates than those signed by generally allowed Certificate Authorities (CAs).
-This can be useful, for example,  when using self-signed certificates.
-To require a different root certificate, you can specify the signing CA by adding the contents of the CA's certificate file to the `agentOptions`.
-The certificate the domain presents must be signed by the root certificate specified:
-
-```js
-request.get({
-    url: 'https://api.some-server.com/',
-    agentOptions: {
-        ca: fs.readFileSync('ca.cert.pem')
-    }
-});
-```
-
-[back to top](#table-of-contents)
-
-
----
-
-## Support for HAR 1.2
-
-The `options.har` property will override the values: `url`, `method`, `qs`, `headers`, `form`, `formData`, `body`, `json`, as well as construct multipart data and read files from disk when `request.postData.params[].fileName` is present without a matching `value`.
-
-a validation step will check if the HAR Request format matches the latest spec (v1.2) and will skip parsing if not matching.
-
-```js
-  var request = require('request')
-  request({
-    // will be ignored
-    method: 'GET',
-    uri: 'http://www.google.com',
-
-    // HTTP Archive Request Object
-    har: {
-      url: 'http://www.mockbin.com/har',
-      method: 'POST',
-      headers: [
-        {
-          name: 'content-type',
-          value: 'application/x-www-form-urlencoded'
-        }
-      ],
-      postData: {
-        mimeType: 'application/x-www-form-urlencoded',
-        params: [
-          {
-            name: 'foo',
-            value: 'bar'
-          },
-          {
-            name: 'hello',
-            value: 'world'
-          }
-        ]
-      }
-    }
-  })
-
-  // a POST request will be sent to http://www.mockbin.com
-  // with body an application/x-www-form-urlencoded body:
-  // foo=bar&hello=world
-```
-
-[back to top](#table-of-contents)
-
-
----
-
-## request(options, callback)
-
-The first argument can be either a `url` or an `options` object. The only required option is `uri`; all others are optional.
-
-- `uri` || `url` - fully qualified uri or a parsed url object from `url.parse()`
-- `baseUrl` - fully qualified uri string used as the base url. Most useful with `request.defaults`, for example when you want to do many requests to the same domain.  If `baseUrl` is `https://example.com/api/`, then requesting `/end/point?test=true` will fetch `https://example.com/api/end/point?test=true`. When `baseUrl` is given, `uri` must also be a string.
-- `method` - http method (default: `"GET"`)
-- `headers` - http headers (default: `{}`)
-
----
-
-- `qs` - object containing querystring values to be appended to the `uri`
-- `qsParseOptions` - object containing options to pass to the [qs.parse](https://github.com/hapijs/qs#parsing-objects) method. Alternatively pass options to the [querystring.parse](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_parse_str_sep_eq_options) method using this format `{sep:';', eq:':', options:{}}`
-- `qsStringifyOptions` - object containing options to pass to the [qs.stringify](https://github.com/hapijs/qs#stringifying) method. Alternatively pass options to the  [querystring.stringify](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options) method using this format `{sep:';', eq:':', options:{}}`. For example, to change the way arrays are converted to query strings using the `qs` module pass the `arrayFormat` option with one of `indices|brackets|repeat`
-- `useQuerystring` - If true, use `querystring` to stringify and parse
-  querystrings, otherwise use `qs` (default: `false`).  Set this option to
-  `true` if you need arrays to be serialized as `foo=bar&foo=baz` instead of the
-  default `foo[0]=bar&foo[1]=baz`.
-
----
-
-- `body` - entity body for PATCH, POST and PUT requests. Must be a `Buffer`, `String` or `ReadStream`. If `json` is `true`, then `body` must be a JSON-serializable object.
-- `form` - when passed an object or a querystring, this sets `body` to a querystring representation of value, and adds `Content-type: application/x-www-form-urlencoded` header. When passed no options, a `FormData` instance is returned (and is piped to request). See "Forms" section above.
-- `formData` - Data to pass for a `multipart/form-data` request. See
-  [Forms](#forms) section above.
-- `multipart` - array of objects which contain their own headers and `body`
-  attributes. Sends a `multipart/related` request. See [Forms](#forms) section
-  above.
-  - Alternatively you can pass in an object `{chunked: false, data: []}` where
-    `chunked` is used to specify whether the request is sent in
-    [chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding)
-    In non-chunked requests, data items with body streams are not allowed.
-- `preambleCRLF` - append a newline/CRLF before the boundary of your `multipart/form-data` request.
-- `postambleCRLF` - append a newline/CRLF at the end of the boundary of your `multipart/form-data` request.
-- `json` - sets `body` to JSON representation of value and adds `Content-type: application/json` header.  Additionally, parses the response body as JSON.
-- `jsonReviver` - a [reviver function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) that will be passed to `JSON.parse()` when parsing a JSON response body.
-- `jsonReplacer` - a [replacer function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) that will be passed to `JSON.stringify()` when stringifying a JSON request body.
-
----
-
-- `auth` - A hash containing values `user` || `username`, `pass` || `password`, and `sendImmediately` (optional).  See documentation above.
-- `oauth` - Options for OAuth HMAC-SHA1 signing. See documentation above.
-- `hawk` - Options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example).
-- `aws` - `object` containing AWS signing information. Should have the properties `key`, `secret`. Also requires the property `bucket`, unless you’re specifying your `bucket` as part of the path, or the request doesn’t use a bucket (i.e. GET Services). If you want to use AWS sign version 4 use the parameter `sign_version` with value `4` otherwise the default is version 2. **Note:** you need to `npm install aws4` first.
-- `httpSignature` - Options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options.
-
----
-
-- `followRedirect` - follow HTTP 3xx responses as redirects (default: `true`). This property can also be implemented as function which gets `response` object as a single argument and should return `true` if redirects should continue or `false` otherwise.
-- `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects (default: `false`)
-- `maxRedirects` - the maximum number of redirects to follow (default: `10`)
-- `removeRefererHeader` - removes the referer header when a redirect happens (default: `false`). **Note:** if true, referer header set in the initial request is preserved during redirect chain.
-
----
-
-- `encoding` - Encoding to be used on `setEncoding` of response data. If `null`, the `body` is returned as a `Buffer`. Anything else **(including the default value of `undefined`)** will be passed as the [encoding](http://nodejs.org/api/buffer.html#buffer_buffer) parameter to `toString()` (meaning this is effectively `utf8` by default). (**Note:** if you expect binary data, you should set `encoding: null`.)
-- `gzip` - If `true`, add an `Accept-Encoding` header to request compressed content encodings from the server (if not already present) and decode supported content encodings in the response.  **Note:** Automatic decoding of the response content is performed on the body data returned through `request` (both through the `request` stream and passed to the callback function) but is not performed on the `response` stream (available from the `response` event) which is the unmodified `http.IncomingMessage` object which may contain compressed data. See example below.
-- `jar` - If `true`, remember cookies for future use (or define your custom cookie jar; see examples section)
-
----
-
-- `agent` - `http(s).Agent` instance to use
-- `agentClass` - alternatively specify your agent's class name
-- `agentOptions` - and pass its options. **Note:** for HTTPS see [tls API doc for TLS/SSL options](http://nodejs.org/api/tls.html#tls_tls_connect_options_callback) and the [documentation above](#using-optionsagentoptions).
-- `forever` - set to `true` to use the [forever-agent](https://github.com/request/forever-agent) **Note:** Defaults to `http(s).Agent({keepAlive:true})` in node 0.12+
-- `pool` - An object describing which agents to use for the request. If this option is omitted the request will use the global agent (as long as your options allow for it). Otherwise, request will search the pool for your custom agent. If no custom agent is found, a new agent will be created and added to the pool. **Note:** `pool` is used only when the `agent` option is not specified.
-  - A `maxSockets` property can also be provided on the `pool` object to set the max number of sockets for all agents created (ex: `pool: {maxSockets: Infinity}`).
-  - Note that if you are sending multiple requests in a loop and creating
-    multiple new `pool` objects, `maxSockets` will not work as intended.  To
-    work around this, either use [`request.defaults`](#requestdefaultsoptions)
-    with your pool options or create the pool object with the `maxSockets`
-    property outside of the loop.
-- `timeout` - Integer containing the number of milliseconds to wait for a
-server to send response headers (and start the response body) before aborting
-the request. Note that if the underlying TCP connection cannot be established,
-the OS-wide TCP connection timeout will overrule the `timeout` option ([the
-default in Linux can be anywhere from 20-120 seconds][linux-timeout]).
-
-[linux-timeout]: http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout
-
----
-
-- `localAddress` - Local interface to bind for network connections.
-- `proxy` - An HTTP proxy to be used. Supports proxy Auth with Basic Auth, identical to support for the `url` parameter (by embedding the auth info in the `uri`)
-- `strictSSL` - If `true`, requires SSL certificates be valid. **Note:** to use your own certificate authority, you need to specify an agent that was created with that CA as an option.
-- `tunnel` - controls the behavior of
-  [HTTP `CONNECT` tunneling](https://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_tunneling)
-  as follows:
-   - `undefined` (default) - `true` if the destination is `https`, `false` otherwise
-   - `true` - always tunnel to the destination by making a `CONNECT` request to
-     the proxy
-   - `false` - request the destination as a `GET` request.
-- `proxyHeaderWhiteList` - A whitelist of headers to send to a
-  tunneling proxy.
-- `proxyHeaderExclusiveList` - A whitelist of headers to send
-  exclusively to a tunneling proxy and not to destination.
-
----
-
-- `time` - If `true`, the request-response cycle (including all redirects) is timed at millisecond resolution, and the result provided on the response's `elapsedTime` property.
-- `har` - A [HAR 1.2 Request Object](http://www.softwareishard.com/blog/har-12-spec/#request), will be processed from HAR format into options overwriting matching values *(see the [HAR 1.2 section](#support-for-har-1.2) for details)*
-- `callback` - alternatively pass the request's callback in the options object
-
-The callback argument gets 3 arguments:
-
-1. An `error` when applicable (usually from [`http.ClientRequest`](http://nodejs.org/api/http.html#http_class_http_clientrequest) object)
-2. An [`http.IncomingMessage`](https://nodejs.org/api/http.html#http_class_http_incomingmessage) object
-3. The third is the `response` body (`String` or `Buffer`, or JSON object if the `json` option is supplied)
-
-[back to top](#table-of-contents)
-
-
----
-
-## Convenience methods
-
-There are also shorthand methods for different HTTP METHODs and some other conveniences.
-
-
-### request.defaults(options)
-
-This method **returns a wrapper** around the normal request API that defaults
-to whatever options you pass to it.
-
-**Note:** `request.defaults()` **does not** modify the global request API;
-instead, it **returns a wrapper** that has your default settings applied to it.
-
-**Note:** You can call `.defaults()` on the wrapper that is returned from
-`request.defaults` to add/override defaults that were previously defaulted.
-
-For example:
-```js
-//requests using baseRequest() will set the 'x-token' header
-var baseRequest = request.defaults({
-  headers: {'x-token': 'my-token'}
-})
-
-//requests using specialRequest() will include the 'x-token' header set in
-//baseRequest and will also include the 'special' header
-var specialRequest = baseRequest.defaults({
-  headers: {special: 'special value'}
-})
-```
-
-### request.put
-
-Same as `request()`, but defaults to `method: "PUT"`.
-
-```js
-request.put(url)
-```
-
-### request.patch
-
-Same as `request()`, but defaults to `method: "PATCH"`.
-
-```js
-request.patch(url)
-```
-
-### request.post
-
-Same as `request()`, but defaults to `method: "POST"`.
-
-```js
-request.post(url)
-```
-
-### request.head
-
-Same as `request()`, but defaults to `method: "HEAD"`.
-
-```js
-request.head(url)
-```
-
-### request.del / request.delete
-
-Same as `request()`, but defaults to `method: "DELETE"`.
-
-```js
-request.del(url)
-request.delete(url)
-```
-
-### request.get
-
-Same as `request()` (for uniformity).
-
-```js
-request.get(url)
-```
-### request.cookie
-
-Function that creates a new cookie.
-
-```js
-request.cookie('key1=value1')
-```
-### request.jar()
-
-Function that creates a new cookie jar.
-
-```js
-request.jar()
-```
-
-[back to top](#table-of-contents)
-
-
----
-
-
-## Debugging
-
-There are at least three ways to debug the operation of `request`:
-
-1. Launch the node process like `NODE_DEBUG=request node script.js`
-   (`lib,request,otherlib` works too).
-
-2. Set `require('request').debug = true` at any time (this does the same thing
-   as #1).
-
-3. Use the [request-debug module](https://github.com/request/request-debug) to
-   view request and response headers and bodies.
-
-[back to top](#table-of-contents)
-
-
----
-
-## Timeouts
-
-Most requests to external servers should have a timeout attached, in case the
-server is not responding in a timely manner. Without a timeout, your code may
-have a socket open/consume resources for minutes or more.
-
-There are two main types of timeouts: **connection timeouts** and **read
-timeouts**. A connect timeout occurs if the timeout is hit while your client is
-attempting to establish a connection to a remote machine (corresponding to the
-[connect() call][connect] on the socket). A read timeout occurs any time the
-server is too slow to send back a part of the response.
-
-These two situations have widely different implications for what went wrong
-with the request, so it's useful to be able to distinguish them. You can detect
-timeout errors by checking `err.code` for an 'ETIMEDOUT' value. Further, you
-can detect whether the timeout was a connection timeout by checking if the
-`err.connect` property is set to `true`.
-
-```js
-request.get('http://10.255.255.1', {timeout: 1500}, function(err) {
-    console.log(err.code === 'ETIMEDOUT');
-    // Set to `true` if the timeout was a connection timeout, `false` or
-    // `undefined` otherwise.
-    console.log(err.connect === true);
-    process.exit(0);
-});
-```
-
-[connect]: http://linux.die.net/man/2/connect
-
-## Examples:
-
-```js
-  var request = require('request')
-    , rand = Math.floor(Math.random()*100000000).toString()
-    ;
-  request(
-    { method: 'PUT'
-    , uri: 'http://mikeal.iriscouch.com/testjs/' + rand
-    , multipart:
-      [ { 'content-type': 'application/json'
-        ,  body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})
-        }
-      , { body: 'I am an attachment' }
-      ]
-    }
-  , function (error, response, body) {
-      if(response.statusCode == 201){
-        console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)
-      } else {
-        console.log('error: '+ response.statusCode)
-        console.log(body)
-      }
-    }
-  )
-```
-
-For backwards-compatibility, response compression is not supported by default.
-To accept gzip-compressed responses, set the `gzip` option to `true`.  Note
-that the body data passed through `request` is automatically decompressed
-while the response object is unmodified and will contain compressed data if
-the server sent a compressed response.
-
-```js
-  var request = require('request')
-  request(
-    { method: 'GET'
-    , uri: 'http://www.google.com'
-    , gzip: true
-    }
-  , function (error, response, body) {
-      // body is the decompressed response body
-      console.log('server encoded the data as: ' + (response.headers['content-encoding'] || 'identity'))
-      console.log('the decoded data is: ' + body)
-    }
-  ).on('data', function(data) {
-    // decompressed data as it is received
-    console.log('decoded chunk: ' + data)
-  })
-  .on('response', function(response) {
-    // unmodified http.IncomingMessage object
-    response.on('data', function(data) {
-      // compressed data as it is received
-      console.log('received ' + data.length + ' bytes of compressed data')
-    })
-  })
-```
-
-Cookies are disabled by default (else, they would be used in subsequent requests). To enable cookies, set `jar` to `true` (either in `defaults` or `options`).
-
-```js
-var request = request.defaults({jar: true})
-request('http://www.google.com', function () {
-  request('http://images.google.com')
-})
-```
-
-To use a custom cookie jar (instead of `request`’s global cookie jar), set `jar` to an instance of `request.jar()` (either in `defaults` or `options`)
-
-```js
-var j = request.jar()
-var request = request.defaults({jar:j})
-request('http://www.google.com', function () {
-  request('http://images.google.com')
-})
-```
-
-OR
-
-```js
-var j = request.jar();
-var cookie = request.cookie('key1=value1');
-var url = 'http://www.google.com';
-j.setCookie(cookie, url);
-request({url: url, jar: j}, function () {
-  request('http://images.google.com')
-})
-```
-
-To use a custom cookie store (such as a
-[`FileCookieStore`](https://github.com/mitsuru/tough-cookie-filestore)
-which supports saving to and restoring from JSON files), pass it as a parameter
-to `request.jar()`:
-
-```js
-var FileCookieStore = require('tough-cookie-filestore');
-// NOTE - currently the 'cookies.json' file must already exist!
-var j = request.jar(new FileCookieStore('cookies.json'));
-request = request.defaults({ jar : j })
-request('http://www.google.com', function() {
-  request('http://images.google.com')
-})
-```
-
-The cookie store must be a
-[`tough-cookie`](https://github.com/SalesforceEng/tough-cookie)
-store and it must support synchronous operations; see the
-[`CookieStore` API docs](https://github.com/SalesforceEng/tough-cookie#cookiestore-api)
-for details.
-
-To inspect your cookie jar after a request:
-
-```js
-var j = request.jar()
-request({url: 'http://www.google.com', jar: j}, function () {
-  var cookie_string = j.getCookieString(url); // "key1=value1; key2=value2; ..."
-  var cookies = j.getCookies(url);
-  // [{key: 'key1', value: 'value1', domain: "www.google.com", ...}, ...]
-})
-```
-
-[back to top](#table-of-contents)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/codecov.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/codecov.yml
deleted file mode 100644
index acd3f33ceb5d2b63619376202c95898bea230b58..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/codecov.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-comment: false
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/index.js
deleted file mode 100755
index 911a90dbb5a5cbca95018ab70887756dda09f4a1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/index.js
+++ /dev/null
@@ -1,157 +0,0 @@
-// Copyright 2010-2012 Mikeal Rogers
-//
-//    Licensed under the Apache License, Version 2.0 (the "License");
-//    you may not use this file except in compliance with the License.
-//    You may obtain a copy of the License at
-//
-//        http://www.apache.org/licenses/LICENSE-2.0
-//
-//    Unless required by applicable law or agreed to in writing, software
-//    distributed under the License is distributed on an "AS IS" BASIS,
-//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//    See the License for the specific language governing permissions and
-//    limitations under the License.
-
-'use strict'
-
-var extend                = require('extend')
-  , cookies               = require('./lib/cookies')
-  , helpers               = require('./lib/helpers')
-
-var isFunction            = helpers.isFunction
-  , paramsHaveRequestBody = helpers.paramsHaveRequestBody
-
-
-// organize params for patch, post, put, head, del
-function initParams(uri, options, callback) {
-  if (typeof options === 'function') {
-    callback = options
-  }
-
-  var params = {}
-  if (typeof options === 'object') {
-    extend(params, options, {uri: uri})
-  } else if (typeof uri === 'string') {
-    extend(params, {uri: uri})
-  } else {
-    extend(params, uri)
-  }
-
-  params.callback = callback || params.callback
-  return params
-}
-
-function request (uri, options, callback) {
-  if (typeof uri === 'undefined') {
-    throw new Error('undefined is not a valid uri or options object.')
-  }
-
-  var params = initParams(uri, options, callback)
-
-  if (params.method === 'HEAD' && paramsHaveRequestBody(params)) {
-    throw new Error('HTTP HEAD requests MUST NOT include a request body.')
-  }
-
-  return new request.Request(params)
-}
-
-function verbFunc (verb) {
-  var method = verb.toUpperCase()
-  return function (uri, options, callback) {
-    var params = initParams(uri, options, callback)
-    params.method = method
-    return request(params, params.callback)
-  }
-}
-
-// define like this to please codeintel/intellisense IDEs
-request.get = verbFunc('get')
-request.head = verbFunc('head')
-request.post = verbFunc('post')
-request.put = verbFunc('put')
-request.patch = verbFunc('patch')
-request.del = verbFunc('delete')
-request['delete'] = verbFunc('delete')
-
-request.jar = function (store) {
-  return cookies.jar(store)
-}
-
-request.cookie = function (str) {
-  return cookies.parse(str)
-}
-
-function wrapRequestMethod (method, options, requester, verb) {
-
-  return function (uri, opts, callback) {
-    var params = initParams(uri, opts, callback)
-
-    var target = {}
-    extend(true, target, options, params)
-
-    target.pool = params.pool || options.pool
-
-    if (verb) {
-      target.method = verb.toUpperCase()
-    }
-
-    if (isFunction(requester)) {
-      method = requester
-    }
-
-    return method(target, target.callback)
-  }
-}
-
-request.defaults = function (options, requester) {
-  var self = this
-
-  options = options || {}
-
-  if (typeof options === 'function') {
-    requester = options
-    options = {}
-  }
-
-  var defaults      = wrapRequestMethod(self, options, requester)
-
-  var verbs = ['get', 'head', 'post', 'put', 'patch', 'del', 'delete']
-  verbs.forEach(function(verb) {
-    defaults[verb]  = wrapRequestMethod(self[verb], options, requester, verb)
-  })
-
-  defaults.cookie   = wrapRequestMethod(self.cookie, options, requester)
-  defaults.jar      = self.jar
-  defaults.defaults = self.defaults
-  return defaults
-}
-
-request.forever = function (agentOptions, optionsArg) {
-  var options = {}
-  if (optionsArg) {
-    extend(options, optionsArg)
-  }
-  if (agentOptions) {
-    options.agentOptions = agentOptions
-  }
-
-  options.forever = true
-  return request.defaults(options)
-}
-
-// Exports
-
-module.exports = request
-request.Request = require('./request')
-request.initParams = initParams
-
-// Backwards compatibility for request.debug
-Object.defineProperty(request, 'debug', {
-  enumerable : true,
-  get : function() {
-    return request.Request.debug
-  },
-  set : function(debug) {
-    request.Request.debug = debug
-  }
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/auth.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/auth.js
deleted file mode 100644
index 1cb695216f6b16eba08c67a3fae109e9b54dc47f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/auth.js
+++ /dev/null
@@ -1,168 +0,0 @@
-'use strict'
-
-var caseless = require('caseless')
-  , uuid = require('node-uuid')
-  , helpers = require('./helpers')
-
-var md5 = helpers.md5
-  , toBase64 = helpers.toBase64
-
-
-function Auth (request) {
-  // define all public properties here
-  this.request = request
-  this.hasAuth = false
-  this.sentAuth = false
-  this.bearerToken = null
-  this.user = null
-  this.pass = null
-}
-
-Auth.prototype.basic = function (user, pass, sendImmediately) {
-  var self = this
-  if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) {
-    self.request.emit('error', new Error('auth() received invalid user or password'))
-  }
-  self.user = user
-  self.pass = pass
-  self.hasAuth = true
-  var header = user + ':' + (pass || '')
-  if (sendImmediately || typeof sendImmediately === 'undefined') {
-    var authHeader = 'Basic ' + toBase64(header)
-    self.sentAuth = true
-    return authHeader
-  }
-}
-
-Auth.prototype.bearer = function (bearer, sendImmediately) {
-  var self = this
-  self.bearerToken = bearer
-  self.hasAuth = true
-  if (sendImmediately || typeof sendImmediately === 'undefined') {
-    if (typeof bearer === 'function') {
-      bearer = bearer()
-    }
-    var authHeader = 'Bearer ' + (bearer || '')
-    self.sentAuth = true
-    return authHeader
-  }
-}
-
-Auth.prototype.digest = function (method, path, authHeader) {
-  // TODO: More complete implementation of RFC 2617.
-  //   - handle challenge.domain
-  //   - support qop="auth-int" only
-  //   - handle Authentication-Info (not necessarily?)
-  //   - check challenge.stale (not necessarily?)
-  //   - increase nc (not necessarily?)
-  // For reference:
-  // http://tools.ietf.org/html/rfc2617#section-3
-  // https://github.com/bagder/curl/blob/master/lib/http_digest.c
-
-  var self = this
-
-  var challenge = {}
-  var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi
-  for (;;) {
-    var match = re.exec(authHeader)
-    if (!match) {
-      break
-    }
-    challenge[match[1]] = match[2] || match[3]
-  }
-
-  /**
-   * RFC 2617: handle both MD5 and MD5-sess algorithms.
-   *
-   * If the algorithm directive's value is "MD5" or unspecified, then HA1 is
-   *   HA1=MD5(username:realm:password)
-   * If the algorithm directive's value is "MD5-sess", then HA1 is
-   *   HA1=MD5(MD5(username:realm:password):nonce:cnonce)
-   */
-  var ha1Compute = function (algorithm, user, realm, pass, nonce, cnonce) {
-    var ha1 = md5(user + ':' + realm + ':' + pass)
-    if (algorithm && algorithm.toLowerCase() === 'md5-sess') {
-      return md5(ha1 + ':' + nonce + ':' + cnonce)
-    } else {
-      return ha1
-    }
-  }
-
-  var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth'
-  var nc = qop && '00000001'
-  var cnonce = qop && uuid().replace(/-/g, '')
-  var ha1 = ha1Compute(challenge.algorithm, self.user, challenge.realm, self.pass, challenge.nonce, cnonce)
-  var ha2 = md5(method + ':' + path)
-  var digestResponse = qop
-    ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2)
-    : md5(ha1 + ':' + challenge.nonce + ':' + ha2)
-  var authValues = {
-    username: self.user,
-    realm: challenge.realm,
-    nonce: challenge.nonce,
-    uri: path,
-    qop: qop,
-    response: digestResponse,
-    nc: nc,
-    cnonce: cnonce,
-    algorithm: challenge.algorithm,
-    opaque: challenge.opaque
-  }
-
-  authHeader = []
-  for (var k in authValues) {
-    if (authValues[k]) {
-      if (k === 'qop' || k === 'nc' || k === 'algorithm') {
-        authHeader.push(k + '=' + authValues[k])
-      } else {
-        authHeader.push(k + '="' + authValues[k] + '"')
-      }
-    }
-  }
-  authHeader = 'Digest ' + authHeader.join(', ')
-  self.sentAuth = true
-  return authHeader
-}
-
-Auth.prototype.onRequest = function (user, pass, sendImmediately, bearer) {
-  var self = this
-    , request = self.request
-
-  var authHeader
-  if (bearer === undefined && user === undefined) {
-    self.request.emit('error', new Error('no auth mechanism defined'))
-  } else if (bearer !== undefined) {
-    authHeader = self.bearer(bearer, sendImmediately)
-  } else {
-    authHeader = self.basic(user, pass, sendImmediately)
-  }
-  if (authHeader) {
-    request.setHeader('authorization', authHeader)
-  }
-}
-
-Auth.prototype.onResponse = function (response) {
-  var self = this
-    , request = self.request
-
-  if (!self.hasAuth || self.sentAuth) { return null }
-
-  var c = caseless(response.headers)
-
-  var authHeader = c.get('www-authenticate')
-  var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase()
-  request.debug('reauth', authVerb)
-
-  switch (authVerb) {
-    case 'basic':
-      return self.basic(self.user, self.pass, true)
-
-    case 'bearer':
-      return self.bearer(self.bearerToken, true)
-
-    case 'digest':
-      return self.digest(request.method, request.path, authHeader)
-  }
-}
-
-exports.Auth = Auth
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/cookies.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/cookies.js
deleted file mode 100644
index 412c07d63becb942644b017d98c627816f79b95c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/cookies.js
+++ /dev/null
@@ -1,39 +0,0 @@
-'use strict'
-
-var tough = require('tough-cookie')
-
-var Cookie = tough.Cookie
-  , CookieJar = tough.CookieJar
-
-
-exports.parse = function(str) {
-  if (str && str.uri) {
-    str = str.uri
-  }
-  if (typeof str !== 'string') {
-    throw new Error('The cookie function only accepts STRING as param')
-  }
-  return Cookie.parse(str, {loose: true})
-}
-
-// Adapt the sometimes-Async api of tough.CookieJar to our requirements
-function RequestJar(store) {
-  var self = this
-  self._jar = new CookieJar(store, {looseMode: true})
-}
-RequestJar.prototype.setCookie = function(cookieOrStr, uri, options) {
-  var self = this
-  return self._jar.setCookieSync(cookieOrStr, uri, options || {})
-}
-RequestJar.prototype.getCookieString = function(uri) {
-  var self = this
-  return self._jar.getCookieStringSync(uri)
-}
-RequestJar.prototype.getCookies = function(uri) {
-  var self = this
-  return self._jar.getCookiesSync(uri)
-}
-
-exports.jar = function(store) {
-  return new RequestJar(store)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/getProxyFromURI.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/getProxyFromURI.js
deleted file mode 100644
index c2013a6e125b2c875621b75f6ec19368369bdc4f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/getProxyFromURI.js
+++ /dev/null
@@ -1,79 +0,0 @@
-'use strict'
-
-function formatHostname(hostname) {
-  // canonicalize the hostname, so that 'oogle.com' won't match 'google.com'
-  return hostname.replace(/^\.*/, '.').toLowerCase()
-}
-
-function parseNoProxyZone(zone) {
-  zone = zone.trim().toLowerCase()
-
-  var zoneParts = zone.split(':', 2)
-    , zoneHost = formatHostname(zoneParts[0])
-    , zonePort = zoneParts[1]
-    , hasPort = zone.indexOf(':') > -1
-
-  return {hostname: zoneHost, port: zonePort, hasPort: hasPort}
-}
-
-function uriInNoProxy(uri, noProxy) {
-  var port = uri.port || (uri.protocol === 'https:' ? '443' : '80')
-    , hostname = formatHostname(uri.hostname)
-    , noProxyList = noProxy.split(',')
-
-  // iterate through the noProxyList until it finds a match.
-  return noProxyList.map(parseNoProxyZone).some(function(noProxyZone) {
-    var isMatchedAt = hostname.indexOf(noProxyZone.hostname)
-      , hostnameMatched = (
-          isMatchedAt > -1 &&
-          (isMatchedAt === hostname.length - noProxyZone.hostname.length)
-        )
-
-    if (noProxyZone.hasPort) {
-      return (port === noProxyZone.port) && hostnameMatched
-    }
-
-    return hostnameMatched
-  })
-}
-
-function getProxyFromURI(uri) {
-  // Decide the proper request proxy to use based on the request URI object and the
-  // environmental variables (NO_PROXY, HTTP_PROXY, etc.)
-  // respect NO_PROXY environment variables (see: http://lynx.isc.org/current/breakout/lynx_help/keystrokes/environments.html)
-
-  var noProxy = process.env.NO_PROXY || process.env.no_proxy || ''
-
-  // if the noProxy is a wildcard then return null
-
-  if (noProxy === '*') {
-    return null
-  }
-
-  // if the noProxy is not empty and the uri is found return null
-
-  if (noProxy !== '' && uriInNoProxy(uri, noProxy)) {
-    return null
-  }
-
-  // Check for HTTP or HTTPS Proxy in environment Else default to null
-
-  if (uri.protocol === 'http:') {
-    return process.env.HTTP_PROXY ||
-           process.env.http_proxy || null
-  }
-
-  if (uri.protocol === 'https:') {
-    return process.env.HTTPS_PROXY ||
-           process.env.https_proxy ||
-           process.env.HTTP_PROXY  ||
-           process.env.http_proxy  || null
-  }
-
-  // if none of that works, return null
-  // (What uri protocol are you using then?)
-
-  return null
-}
-
-module.exports = getProxyFromURI
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/har.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/har.js
deleted file mode 100644
index 30595748781ad1c68e4b84e3740dbdad5d856a52..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/har.js
+++ /dev/null
@@ -1,215 +0,0 @@
-'use strict'
-
-var fs = require('fs')
-var qs = require('querystring')
-var validate = require('har-validator')
-var extend = require('extend')
-
-function Har (request) {
-  this.request = request
-}
-
-Har.prototype.reducer = function (obj, pair) {
-  // new property ?
-  if (obj[pair.name] === undefined) {
-    obj[pair.name] = pair.value
-    return obj
-  }
-
-  // existing? convert to array
-  var arr = [
-    obj[pair.name],
-    pair.value
-  ]
-
-  obj[pair.name] = arr
-
-  return obj
-}
-
-Har.prototype.prep = function (data) {
-  // construct utility properties
-  data.queryObj = {}
-  data.headersObj = {}
-  data.postData.jsonObj = false
-  data.postData.paramsObj = false
-
-  // construct query objects
-  if (data.queryString && data.queryString.length) {
-    data.queryObj = data.queryString.reduce(this.reducer, {})
-  }
-
-  // construct headers objects
-  if (data.headers && data.headers.length) {
-    // loweCase header keys
-    data.headersObj = data.headers.reduceRight(function (headers, header) {
-      headers[header.name] = header.value
-      return headers
-    }, {})
-  }
-
-  // construct Cookie header
-  if (data.cookies && data.cookies.length) {
-    var cookies = data.cookies.map(function (cookie) {
-      return cookie.name + '=' + cookie.value
-    })
-
-    if (cookies.length) {
-      data.headersObj.cookie = cookies.join('; ')
-    }
-  }
-
-  // prep body
-  function some (arr) {
-    return arr.some(function (type) {
-      return data.postData.mimeType.indexOf(type) === 0
-    })
-  }
-
-  if (some([
-    'multipart/mixed',
-    'multipart/related',
-    'multipart/form-data',
-    'multipart/alternative'])) {
-
-    // reset values
-    data.postData.mimeType = 'multipart/form-data'
-  }
-
-  else if (some([
-    'application/x-www-form-urlencoded'])) {
-
-    if (!data.postData.params) {
-      data.postData.text = ''
-    } else {
-      data.postData.paramsObj = data.postData.params.reduce(this.reducer, {})
-
-      // always overwrite
-      data.postData.text = qs.stringify(data.postData.paramsObj)
-    }
-  }
-
-  else if (some([
-    'text/json',
-    'text/x-json',
-    'application/json',
-    'application/x-json'])) {
-
-    data.postData.mimeType = 'application/json'
-
-    if (data.postData.text) {
-      try {
-        data.postData.jsonObj = JSON.parse(data.postData.text)
-      } catch (e) {
-        this.request.debug(e)
-
-        // force back to text/plain
-        data.postData.mimeType = 'text/plain'
-      }
-    }
-  }
-
-  return data
-}
-
-Har.prototype.options = function (options) {
-  // skip if no har property defined
-  if (!options.har) {
-    return options
-  }
-
-  var har = {}
-  extend(har, options.har)
-
-  // only process the first entry
-  if (har.log && har.log.entries) {
-    har = har.log.entries[0]
-  }
-
-  // add optional properties to make validation successful
-  har.url = har.url || options.url || options.uri || options.baseUrl || '/'
-  har.httpVersion = har.httpVersion || 'HTTP/1.1'
-  har.queryString = har.queryString || []
-  har.headers = har.headers || []
-  har.cookies = har.cookies || []
-  har.postData = har.postData || {}
-  har.postData.mimeType = har.postData.mimeType || 'application/octet-stream'
-
-  har.bodySize = 0
-  har.headersSize = 0
-  har.postData.size = 0
-
-  if (!validate.request(har)) {
-    return options
-  }
-
-  // clean up and get some utility properties
-  var req = this.prep(har)
-
-  // construct new options
-  if (req.url) {
-    options.url = req.url
-  }
-
-  if (req.method) {
-    options.method = req.method
-  }
-
-  if (Object.keys(req.queryObj).length) {
-    options.qs = req.queryObj
-  }
-
-  if (Object.keys(req.headersObj).length) {
-    options.headers = req.headersObj
-  }
-
-  function test (type) {
-    return req.postData.mimeType.indexOf(type) === 0
-  }
-  if (test('application/x-www-form-urlencoded')) {
-    options.form = req.postData.paramsObj
-  }
-  else if (test('application/json')) {
-    if (req.postData.jsonObj) {
-      options.body = req.postData.jsonObj
-      options.json = true
-    }
-  }
-  else if (test('multipart/form-data')) {
-    options.formData = {}
-
-    req.postData.params.forEach(function (param) {
-      var attachment = {}
-
-      if (!param.fileName && !param.fileName && !param.contentType) {
-        options.formData[param.name] = param.value
-        return
-      }
-
-      // attempt to read from disk!
-      if (param.fileName && !param.value) {
-        attachment.value = fs.createReadStream(param.fileName)
-      } else if (param.value) {
-        attachment.value = param.value
-      }
-
-      if (param.fileName) {
-        attachment.options = {
-          filename: param.fileName,
-          contentType: param.contentType ? param.contentType : null
-        }
-      }
-
-      options.formData[param.name] = attachment
-    })
-  }
-  else {
-    if (req.postData.text) {
-      options.body = req.postData.text
-    }
-  }
-
-  return options
-}
-
-exports.Har = Har
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/helpers.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/helpers.js
deleted file mode 100644
index 356ff748e2f941225e0f1581a283f1cd26095ac5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/helpers.js
+++ /dev/null
@@ -1,74 +0,0 @@
-'use strict'
-
-var jsonSafeStringify = require('json-stringify-safe')
-  , crypto = require('crypto')
-
-function deferMethod() {
-  if (typeof setImmediate === 'undefined') {
-    return process.nextTick
-  }
-
-  return setImmediate
-}
-
-function isFunction(value) {
-  return typeof value === 'function'
-}
-
-function paramsHaveRequestBody(params) {
-  return (
-    params.body ||
-    params.requestBodyStream ||
-    (params.json && typeof params.json !== 'boolean') ||
-    params.multipart
-  )
-}
-
-function safeStringify (obj, replacer) {
-  var ret
-  try {
-    ret = JSON.stringify(obj, replacer)
-  } catch (e) {
-    ret = jsonSafeStringify(obj, replacer)
-  }
-  return ret
-}
-
-function md5 (str) {
-  return crypto.createHash('md5').update(str).digest('hex')
-}
-
-function isReadStream (rs) {
-  return rs.readable && rs.path && rs.mode
-}
-
-function toBase64 (str) {
-  return (new Buffer(str || '', 'utf8')).toString('base64')
-}
-
-function copy (obj) {
-  var o = {}
-  Object.keys(obj).forEach(function (i) {
-    o[i] = obj[i]
-  })
-  return o
-}
-
-function version () {
-  var numbers = process.version.replace('v', '').split('.')
-  return {
-    major: parseInt(numbers[0], 10),
-    minor: parseInt(numbers[1], 10),
-    patch: parseInt(numbers[2], 10)
-  }
-}
-
-exports.isFunction            = isFunction
-exports.paramsHaveRequestBody = paramsHaveRequestBody
-exports.safeStringify         = safeStringify
-exports.md5                   = md5
-exports.isReadStream          = isReadStream
-exports.toBase64              = toBase64
-exports.copy                  = copy
-exports.version               = version
-exports.defer                 = deferMethod()
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/multipart.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/multipart.js
deleted file mode 100644
index c1281726187b6a3534372ad3cdcef6d36f2fcf87..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/multipart.js
+++ /dev/null
@@ -1,112 +0,0 @@
-'use strict'
-
-var uuid = require('node-uuid')
-  , CombinedStream = require('combined-stream')
-  , isstream = require('isstream')
-
-
-function Multipart (request) {
-  this.request = request
-  this.boundary = uuid()
-  this.chunked = false
-  this.body = null
-}
-
-Multipart.prototype.isChunked = function (options) {
-  var self = this
-    , chunked = false
-    , parts = options.data || options
-
-  if (!parts.forEach) {
-    self.request.emit('error', new Error('Argument error, options.multipart.'))
-  }
-
-  if (options.chunked !== undefined) {
-    chunked = options.chunked
-  }
-
-  if (self.request.getHeader('transfer-encoding') === 'chunked') {
-    chunked = true
-  }
-
-  if (!chunked) {
-    parts.forEach(function (part) {
-      if (typeof part.body === 'undefined') {
-        self.request.emit('error', new Error('Body attribute missing in multipart.'))
-      }
-      if (isstream(part.body)) {
-        chunked = true
-      }
-    })
-  }
-
-  return chunked
-}
-
-Multipart.prototype.setHeaders = function (chunked) {
-  var self = this
-
-  if (chunked && !self.request.hasHeader('transfer-encoding')) {
-    self.request.setHeader('transfer-encoding', 'chunked')
-  }
-
-  var header = self.request.getHeader('content-type')
-
-  if (!header || header.indexOf('multipart') === -1) {
-    self.request.setHeader('content-type', 'multipart/related; boundary=' + self.boundary)
-  } else {
-    if (header.indexOf('boundary') !== -1) {
-      self.boundary = header.replace(/.*boundary=([^\s;]+).*/, '$1')
-    } else {
-      self.request.setHeader('content-type', header + '; boundary=' + self.boundary)
-    }
-  }
-}
-
-Multipart.prototype.build = function (parts, chunked) {
-  var self = this
-  var body = chunked ? new CombinedStream() : []
-
-  function add (part) {
-    if (typeof part === 'number') {
-      part = part.toString()
-    }
-    return chunked ? body.append(part) : body.push(new Buffer(part))
-  }
-
-  if (self.request.preambleCRLF) {
-    add('\r\n')
-  }
-
-  parts.forEach(function (part) {
-    var preamble = '--' + self.boundary + '\r\n'
-    Object.keys(part).forEach(function (key) {
-      if (key === 'body') { return }
-      preamble += key + ': ' + part[key] + '\r\n'
-    })
-    preamble += '\r\n'
-    add(preamble)
-    add(part.body)
-    add('\r\n')
-  })
-  add('--' + self.boundary + '--')
-
-  if (self.request.postambleCRLF) {
-    add('\r\n')
-  }
-
-  return body
-}
-
-Multipart.prototype.onRequest = function (options) {
-  var self = this
-
-  var chunked = self.isChunked(options)
-    , parts = options.data || options
-
-  self.setHeaders(chunked)
-  self.chunked = chunked
-  self.body = self.build(parts, chunked)
-}
-
-exports.Multipart = Multipart
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/oauth.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/oauth.js
deleted file mode 100644
index c24209b897a857c7f3ecd3bf48e456e63810e440..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/oauth.js
+++ /dev/null
@@ -1,147 +0,0 @@
-'use strict'
-
-var url = require('url')
-  , qs = require('qs')
-  , caseless = require('caseless')
-  , uuid = require('node-uuid')
-  , oauth = require('oauth-sign')
-  , crypto = require('crypto')
-
-
-function OAuth (request) {
-  this.request = request
-  this.params = null
-}
-
-OAuth.prototype.buildParams = function (_oauth, uri, method, query, form, qsLib) {
-  var oa = {}
-  for (var i in _oauth) {
-    oa['oauth_' + i] = _oauth[i]
-  }
-  if (!oa.oauth_version) {
-    oa.oauth_version = '1.0'
-  }
-  if (!oa.oauth_timestamp) {
-    oa.oauth_timestamp = Math.floor( Date.now() / 1000 ).toString()
-  }
-  if (!oa.oauth_nonce) {
-    oa.oauth_nonce = uuid().replace(/-/g, '')
-  }
-  if (!oa.oauth_signature_method) {
-    oa.oauth_signature_method = 'HMAC-SHA1'
-  }
-
-  var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key
-  delete oa.oauth_consumer_secret
-  delete oa.oauth_private_key
-
-  var token_secret = oa.oauth_token_secret
-  delete oa.oauth_token_secret
-
-  var realm = oa.oauth_realm
-  delete oa.oauth_realm
-  delete oa.oauth_transport_method
-
-  var baseurl = uri.protocol + '//' + uri.host + uri.pathname
-  var params = qsLib.parse([].concat(query, form, qsLib.stringify(oa)).join('&'))
-
-  oa.oauth_signature = oauth.sign(
-    oa.oauth_signature_method,
-    method,
-    baseurl,
-    params,
-    consumer_secret_or_private_key,
-    token_secret)
-
-  if (realm) {
-    oa.realm = realm
-  }
-
-  return oa
-}
-
-OAuth.prototype.buildBodyHash = function(_oauth, body) {
-  if (['HMAC-SHA1', 'RSA-SHA1'].indexOf(_oauth.signature_method || 'HMAC-SHA1') < 0) {
-    this.request.emit('error', new Error('oauth: ' + _oauth.signature_method +
-      ' signature_method not supported with body_hash signing.'))
-  }
-
-  var shasum = crypto.createHash('sha1')
-  shasum.update(body || '')
-  var sha1 = shasum.digest('hex')
-
-  return new Buffer(sha1).toString('base64')
-}
-
-OAuth.prototype.concatParams = function (oa, sep, wrap) {
-  wrap = wrap || ''
-
-  var params = Object.keys(oa).filter(function (i) {
-    return i !== 'realm' && i !== 'oauth_signature'
-  }).sort()
-
-  if (oa.realm) {
-    params.splice(0, 0, 'realm')
-  }
-  params.push('oauth_signature')
-
-  return params.map(function (i) {
-    return i + '=' + wrap + oauth.rfc3986(oa[i]) + wrap
-  }).join(sep)
-}
-
-OAuth.prototype.onRequest = function (_oauth) {
-  var self = this
-  self.params = _oauth
-
-  var uri = self.request.uri || {}
-    , method = self.request.method || ''
-    , headers = caseless(self.request.headers)
-    , body = self.request.body || ''
-    , qsLib = self.request.qsLib || qs
-
-  var form
-    , query
-    , contentType = headers.get('content-type') || ''
-    , formContentType = 'application/x-www-form-urlencoded'
-    , transport = _oauth.transport_method || 'header'
-
-  if (contentType.slice(0, formContentType.length) === formContentType) {
-    contentType = formContentType
-    form = body
-  }
-  if (uri.query) {
-    query = uri.query
-  }
-  if (transport === 'body' && (method !== 'POST' || contentType !== formContentType)) {
-    self.request.emit('error', new Error('oauth: transport_method of body requires POST ' +
-      'and content-type ' + formContentType))
-  }
-
-  if (!form && typeof _oauth.body_hash === 'boolean') {
-    _oauth.body_hash = self.buildBodyHash(_oauth, self.request.body.toString())
-  }
-
-  var oa = self.buildParams(_oauth, uri, method, query, form, qsLib)
-
-  switch (transport) {
-    case 'header':
-      self.request.setHeader('Authorization', 'OAuth ' + self.concatParams(oa, ',', '"'))
-      break
-
-    case 'query':
-      var href = self.request.uri.href += (query ? '&' : '?') + self.concatParams(oa, '&')
-      self.request.uri = url.parse(href)
-      self.request.path = self.request.uri.path
-      break
-
-    case 'body':
-      self.request.body = (form ? form + '&' : '') + self.concatParams(oa, '&')
-      break
-
-    default:
-      self.request.emit('error', new Error('oauth: transport_method invalid'))
-  }
-}
-
-exports.OAuth = OAuth
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/querystring.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/querystring.js
deleted file mode 100644
index baf5e8021f4a61cce5ef6997d51d22ae18db95e0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/querystring.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict'
-
-var qs = require('qs')
-  , querystring = require('querystring')
-
-
-function Querystring (request) {
-  this.request = request
-  this.lib = null
-  this.useQuerystring = null
-  this.parseOptions = null
-  this.stringifyOptions = null
-}
-
-Querystring.prototype.init = function (options) {
-  if (this.lib) {return}
-
-  this.useQuerystring = options.useQuerystring
-  this.lib = (this.useQuerystring ? querystring : qs)
-
-  this.parseOptions = options.qsParseOptions || {}
-  this.stringifyOptions = options.qsStringifyOptions || {}
-}
-
-Querystring.prototype.stringify = function (obj) {
-  return (this.useQuerystring)
-    ? this.rfc3986(this.lib.stringify(obj,
-      this.stringifyOptions.sep || null,
-      this.stringifyOptions.eq || null,
-      this.stringifyOptions))
-    : this.lib.stringify(obj, this.stringifyOptions)
-}
-
-Querystring.prototype.parse = function (str) {
-  return (this.useQuerystring)
-    ? this.lib.parse(str,
-      this.parseOptions.sep || null,
-      this.parseOptions.eq || null,
-      this.parseOptions)
-    : this.lib.parse(str, this.parseOptions)
-}
-
-Querystring.prototype.rfc3986 = function (str) {
-  return str.replace(/[!'()*]/g, function (c) {
-    return '%' + c.charCodeAt(0).toString(16).toUpperCase()
-  })
-}
-
-Querystring.prototype.unescape = querystring.unescape
-
-exports.Querystring = Querystring
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/redirect.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/redirect.js
deleted file mode 100644
index 040dfe0e03d3359fde925e5b9b70378ad7bd14a0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/redirect.js
+++ /dev/null
@@ -1,153 +0,0 @@
-'use strict'
-
-var url = require('url')
-var isUrl = /^https?:/
-
-function Redirect (request) {
-  this.request = request
-  this.followRedirect = true
-  this.followRedirects = true
-  this.followAllRedirects = false
-  this.allowRedirect = function () {return true}
-  this.maxRedirects = 10
-  this.redirects = []
-  this.redirectsFollowed = 0
-  this.removeRefererHeader = false
-}
-
-Redirect.prototype.onRequest = function (options) {
-  var self = this
-
-  if (options.maxRedirects !== undefined) {
-    self.maxRedirects = options.maxRedirects
-  }
-  if (typeof options.followRedirect === 'function') {
-    self.allowRedirect = options.followRedirect
-  }
-  if (options.followRedirect !== undefined) {
-    self.followRedirects = !!options.followRedirect
-  }
-  if (options.followAllRedirects !== undefined) {
-    self.followAllRedirects = options.followAllRedirects
-  }
-  if (self.followRedirects || self.followAllRedirects) {
-    self.redirects = self.redirects || []
-  }
-  if (options.removeRefererHeader !== undefined) {
-    self.removeRefererHeader = options.removeRefererHeader
-  }
-}
-
-Redirect.prototype.redirectTo = function (response) {
-  var self = this
-    , request = self.request
-
-  var redirectTo = null
-  if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has('location')) {
-    var location = response.caseless.get('location')
-    request.debug('redirect', location)
-
-    if (self.followAllRedirects) {
-      redirectTo = location
-    } else if (self.followRedirects) {
-      switch (request.method) {
-        case 'PATCH':
-        case 'PUT':
-        case 'POST':
-        case 'DELETE':
-          // Do not follow redirects
-          break
-        default:
-          redirectTo = location
-          break
-      }
-    }
-  } else if (response.statusCode === 401) {
-    var authHeader = request._auth.onResponse(response)
-    if (authHeader) {
-      request.setHeader('authorization', authHeader)
-      redirectTo = request.uri
-    }
-  }
-  return redirectTo
-}
-
-Redirect.prototype.onResponse = function (response) {
-  var self = this
-    , request = self.request
-
-  var redirectTo = self.redirectTo(response)
-  if (!redirectTo || !self.allowRedirect.call(request, response)) {
-    return false
-  }
-
-  request.debug('redirect to', redirectTo)
-
-  // ignore any potential response body.  it cannot possibly be useful
-  // to us at this point.
-  // response.resume should be defined, but check anyway before calling. Workaround for browserify.
-  if (response.resume) {
-    response.resume()
-  }
-
-  if (self.redirectsFollowed >= self.maxRedirects) {
-    request.emit('error', new Error('Exceeded maxRedirects. Probably stuck in a redirect loop ' + request.uri.href))
-    return false
-  }
-  self.redirectsFollowed += 1
-
-  if (!isUrl.test(redirectTo)) {
-    redirectTo = url.resolve(request.uri.href, redirectTo)
-  }
-
-  var uriPrev = request.uri
-  request.uri = url.parse(redirectTo)
-
-  // handle the case where we change protocol from https to http or vice versa
-  if (request.uri.protocol !== uriPrev.protocol) {
-    delete request.agent
-  }
-
-  self.redirects.push(
-    { statusCode : response.statusCode
-    , redirectUri: redirectTo
-    }
-  )
-  if (self.followAllRedirects && request.method !== 'HEAD'
-    && response.statusCode !== 401 && response.statusCode !== 307) {
-    request.method = 'GET'
-  }
-  // request.method = 'GET' // Force all redirects to use GET || commented out fixes #215
-  delete request.src
-  delete request.req
-  delete request._started
-  if (response.statusCode !== 401 && response.statusCode !== 307) {
-    // Remove parameters from the previous response, unless this is the second request
-    // for a server that requires digest authentication.
-    delete request.body
-    delete request._form
-    if (request.headers) {
-      request.removeHeader('host')
-      request.removeHeader('content-type')
-      request.removeHeader('content-length')
-      if (request.uri.hostname !== request.originalHost.split(':')[0]) {
-        // Remove authorization if changing hostnames (but not if just
-        // changing ports or protocols).  This matches the behavior of curl:
-        // https://github.com/bagder/curl/blob/6beb0eee/lib/http.c#L710
-        request.removeHeader('authorization')
-      }
-    }
-  }
-
-  if (!self.removeRefererHeader) {
-    request.setHeader('referer', uriPrev.href)
-  }
-
-  request.emit('redirect')
-
-  request.init()
-
-  return true
-}
-
-exports.Redirect = Redirect
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/tunnel.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/tunnel.js
deleted file mode 100644
index bf96a8fec533617fe00c61879c0fb694e8b83615..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/lib/tunnel.js
+++ /dev/null
@@ -1,176 +0,0 @@
-'use strict'
-
-var url = require('url')
-  , tunnel = require('tunnel-agent')
-
-var defaultProxyHeaderWhiteList = [
-  'accept',
-  'accept-charset',
-  'accept-encoding',
-  'accept-language',
-  'accept-ranges',
-  'cache-control',
-  'content-encoding',
-  'content-language',
-  'content-location',
-  'content-md5',
-  'content-range',
-  'content-type',
-  'connection',
-  'date',
-  'expect',
-  'max-forwards',
-  'pragma',
-  'referer',
-  'te',
-  'user-agent',
-  'via'
-]
-
-var defaultProxyHeaderExclusiveList = [
-  'proxy-authorization'
-]
-
-function constructProxyHost(uriObject) {
-  var port = uriObject.port
-    , protocol = uriObject.protocol
-    , proxyHost = uriObject.hostname + ':'
-
-  if (port) {
-    proxyHost += port
-  } else if (protocol === 'https:') {
-    proxyHost += '443'
-  } else {
-    proxyHost += '80'
-  }
-
-  return proxyHost
-}
-
-function constructProxyHeaderWhiteList(headers, proxyHeaderWhiteList) {
-  var whiteList = proxyHeaderWhiteList
-    .reduce(function (set, header) {
-      set[header.toLowerCase()] = true
-      return set
-    }, {})
-
-  return Object.keys(headers)
-    .filter(function (header) {
-      return whiteList[header.toLowerCase()]
-    })
-    .reduce(function (set, header) {
-      set[header] = headers[header]
-      return set
-    }, {})
-}
-
-function constructTunnelOptions (request, proxyHeaders) {
-  var proxy = request.proxy
-
-  var tunnelOptions = {
-    proxy : {
-      host      : proxy.hostname,
-      port      : +proxy.port,
-      proxyAuth : proxy.auth,
-      headers   : proxyHeaders
-    },
-    headers            : request.headers,
-    ca                 : request.ca,
-    cert               : request.cert,
-    key                : request.key,
-    passphrase         : request.passphrase,
-    pfx                : request.pfx,
-    ciphers            : request.ciphers,
-    rejectUnauthorized : request.rejectUnauthorized,
-    secureOptions      : request.secureOptions,
-    secureProtocol     : request.secureProtocol
-  }
-
-  return tunnelOptions
-}
-
-function constructTunnelFnName(uri, proxy) {
-  var uriProtocol = (uri.protocol === 'https:' ? 'https' : 'http')
-  var proxyProtocol = (proxy.protocol === 'https:' ? 'Https' : 'Http')
-  return [uriProtocol, proxyProtocol].join('Over')
-}
-
-function getTunnelFn(request) {
-  var uri = request.uri
-  var proxy = request.proxy
-  var tunnelFnName = constructTunnelFnName(uri, proxy)
-  return tunnel[tunnelFnName]
-}
-
-
-function Tunnel (request) {
-  this.request = request
-  this.proxyHeaderWhiteList = defaultProxyHeaderWhiteList
-  this.proxyHeaderExclusiveList = []
-  if (typeof request.tunnel !== 'undefined') {
-    this.tunnelOverride = request.tunnel
-  }
-}
-
-Tunnel.prototype.isEnabled = function () {
-  var self = this
-    , request = self.request
-  // Tunnel HTTPS by default. Allow the user to override this setting.
-
-  // If self.tunnelOverride is set (the user specified a value), use it.
-  if (typeof self.tunnelOverride !== 'undefined') {
-    return self.tunnelOverride
-  }
-
-  // If the destination is HTTPS, tunnel.
-  if (request.uri.protocol === 'https:') {
-    return true
-  }
-
-  // Otherwise, do not use tunnel.
-  return false
-}
-
-Tunnel.prototype.setup = function (options) {
-  var self = this
-    , request = self.request
-
-  options = options || {}
-
-  if (typeof request.proxy === 'string') {
-    request.proxy = url.parse(request.proxy)
-  }
-
-  if (!request.proxy || !request.tunnel) {
-    return false
-  }
-
-  // Setup Proxy Header Exclusive List and White List
-  if (options.proxyHeaderWhiteList) {
-    self.proxyHeaderWhiteList = options.proxyHeaderWhiteList
-  }
-  if (options.proxyHeaderExclusiveList) {
-    self.proxyHeaderExclusiveList = options.proxyHeaderExclusiveList
-  }
-
-  var proxyHeaderExclusiveList = self.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList)
-  var proxyHeaderWhiteList = self.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList)
-
-  // Setup Proxy Headers and Proxy Headers Host
-  // Only send the Proxy White Listed Header names
-  var proxyHeaders = constructProxyHeaderWhiteList(request.headers, proxyHeaderWhiteList)
-  proxyHeaders.host = constructProxyHost(request.uri)
-
-  proxyHeaderExclusiveList.forEach(request.removeHeader, request)
-
-  // Set Agent from Tunnel Data
-  var tunnelFn = getTunnelFn(request)
-  var tunnelOptions = constructTunnelOptions(request, proxyHeaders)
-  request.agent = tunnelFn(tunnelOptions)
-
-  return true
-}
-
-Tunnel.defaultProxyHeaderWhiteList = defaultProxyHeaderWhiteList
-Tunnel.defaultProxyHeaderExclusiveList = defaultProxyHeaderExclusiveList
-exports.Tunnel = Tunnel
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/.bin/har-validator b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/.bin/har-validator
deleted file mode 120000
index c6ec1634688dabe7d56e13c68b9938be64567813..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/.bin/har-validator
+++ /dev/null
@@ -1 +0,0 @@
-../har-validator/bin/har-validator
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/.bin/uuid b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/.bin/uuid
deleted file mode 120000
index 80eb14aa1690b1ec789f2136e711c12a47ad8327..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/.bin/uuid
+++ /dev/null
@@ -1 +0,0 @@
-../node-uuid/bin/uuid
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/LICENSE
deleted file mode 100644
index a4a9aee0c2fa14a2007895d018bfa06f0592fd34..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/LICENSE
+++ /dev/null
@@ -1,55 +0,0 @@
-Apache License
-
-Version 2.0, January 2004
-
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
-
-"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
-
-You must give any other recipients of the Work or Derivative Works a copy of this License; and
-
-You must cause any modified files to carry prominent notices stating that You changed the files; and
-
-You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
-
-If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/README.md
deleted file mode 100644
index 763564e0aa5b8c24f5da55c63d7fdf69564b3222..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-aws-sign
-========
-
-AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/index.js
deleted file mode 100644
index ac72093083975cefa509d4ff5c87a785f0f5163d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/index.js
+++ /dev/null
@@ -1,212 +0,0 @@
-
-/*!
- *  Copyright 2010 LearnBoost <dev@learnboost.com>
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Module dependencies.
- */
-
-var crypto = require('crypto')
-  , parse = require('url').parse
-  ;
-
-/**
- * Valid keys.
- */
-
-var keys = 
-  [ 'acl'
-  , 'location'
-  , 'logging'
-  , 'notification'
-  , 'partNumber'
-  , 'policy'
-  , 'requestPayment'
-  , 'torrent'
-  , 'uploadId'
-  , 'uploads'
-  , 'versionId'
-  , 'versioning'
-  , 'versions'
-  , 'website'
-  ]
-
-/**
- * Return an "Authorization" header value with the given `options`
- * in the form of "AWS <key>:<signature>"
- *
- * @param {Object} options
- * @return {String}
- * @api private
- */
-
-function authorization (options) {
-  return 'AWS ' + options.key + ':' + sign(options)
-}
-
-module.exports = authorization
-module.exports.authorization = authorization
-
-/**
- * Simple HMAC-SHA1 Wrapper
- *
- * @param {Object} options
- * @return {String}
- * @api private
- */ 
-
-function hmacSha1 (options) {
-  return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64')
-}
-
-module.exports.hmacSha1 = hmacSha1
-
-/**
- * Create a base64 sha1 HMAC for `options`. 
- * 
- * @param {Object} options
- * @return {String}
- * @api private
- */
-
-function sign (options) {
-  options.message = stringToSign(options)
-  return hmacSha1(options)
-}
-module.exports.sign = sign
-
-/**
- * Create a base64 sha1 HMAC for `options`. 
- *
- * Specifically to be used with S3 presigned URLs
- * 
- * @param {Object} options
- * @return {String}
- * @api private
- */
-
-function signQuery (options) {
-  options.message = queryStringToSign(options)
-  return hmacSha1(options)
-}
-module.exports.signQuery= signQuery
-
-/**
- * Return a string for sign() with the given `options`.
- *
- * Spec:
- * 
- *    <verb>\n
- *    <md5>\n
- *    <content-type>\n
- *    <date>\n
- *    [headers\n]
- *    <resource>
- *
- * @param {Object} options
- * @return {String}
- * @api private
- */
-
-function stringToSign (options) {
-  var headers = options.amazonHeaders || ''
-  if (headers) headers += '\n'
-  var r = 
-    [ options.verb
-    , options.md5
-    , options.contentType
-    , options.date ? options.date.toUTCString() : ''
-    , headers + options.resource
-    ]
-  return r.join('\n')
-}
-module.exports.queryStringToSign = stringToSign
-
-/**
- * Return a string for sign() with the given `options`, but is meant exclusively
- * for S3 presigned URLs
- *
- * Spec:
- * 
- *    <date>\n
- *    <resource>
- *
- * @param {Object} options
- * @return {String}
- * @api private
- */
-
-function queryStringToSign (options){
-  return 'GET\n\n\n' + options.date + '\n' + options.resource
-}
-module.exports.queryStringToSign = queryStringToSign
-
-/**
- * Perform the following:
- *
- *  - ignore non-amazon headers
- *  - lowercase fields
- *  - sort lexicographically
- *  - trim whitespace between ":"
- *  - join with newline
- *
- * @param {Object} headers
- * @return {String}
- * @api private
- */
-
-function canonicalizeHeaders (headers) {
-  var buf = []
-    , fields = Object.keys(headers)
-    ;
-  for (var i = 0, len = fields.length; i < len; ++i) {
-    var field = fields[i]
-      , val = headers[field]
-      , field = field.toLowerCase()
-      ;
-    if (0 !== field.indexOf('x-amz')) continue
-    buf.push(field + ':' + val)
-  }
-  return buf.sort().join('\n')
-}
-module.exports.canonicalizeHeaders = canonicalizeHeaders
-
-/**
- * Perform the following:
- *
- *  - ignore non sub-resources
- *  - sort lexicographically
- *
- * @param {String} resource
- * @return {String}
- * @api private
- */
-
-function canonicalizeResource (resource) {
-  var url = parse(resource, true)
-    , path = url.pathname
-    , buf = []
-    ;
-
-  Object.keys(url.query).forEach(function(key){
-    if (!~keys.indexOf(key)) return
-    var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key])
-    buf.push(key + val)
-  })
-
-  return path + (buf.length ? '?' + buf.sort().join('&') : '')
-}
-module.exports.canonicalizeResource = canonicalizeResource
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/package.json
deleted file mode 100644
index f32b2f4d0ad61c464ac88414dd380c2a4ad1f30d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws-sign2/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-  "_from": "aws-sign2@>=0.6.0 <0.7.0",
-  "_id": "aws-sign2@0.6.0",
-  "_location": "/serialport/node-pre-gyp/request/aws-sign2",
-  "_nodeVersion": "4.1.2",
-  "_npmUser": {
-    "email": "mikeal.rogers@gmail.com",
-    "name": "mikeal"
-  },
-  "_npmVersion": "2.14.4",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
-  "_shasum": "14342dd38dbcc94d0e5b87d763cd63612c0e794f",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mikeal.rogers@gmail.com",
-    "name": "Mikeal Rogers",
-    "url": "http://www.futurealoof.com"
-  },
-  "bugs": {
-    "url": "https://github.com/mikeal/aws-sign/issues"
-  },
-  "dependencies": {},
-  "description": "AWS signing. Originally pulled from LearnBoost/knox, maintained as vendor in request, now a standalone module.",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "14342dd38dbcc94d0e5b87d763cd63612c0e794f",
-    "tarball": "http://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "gitHead": "8554bdb41268fa295eb1ee300f4adaa9f7f07fec",
-  "homepage": "https://github.com/mikeal/aws-sign#readme",
-  "license": "Apache-2.0",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "mikeal",
-      "email": "mikeal.rogers@gmail.com"
-    }
-  ],
-  "name": "aws-sign2",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "url": "git+https://github.com/mikeal/aws-sign.git"
-  },
-  "scripts": {},
-  "version": "0.6.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/.npmignore
deleted file mode 100644
index 6c6ade6ff0135c31591d0bff8d50e00118892c82..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/.npmignore
+++ /dev/null
@@ -1,4 +0,0 @@
-test
-examples
-example.js
-browser
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/.tern-port b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/.tern-port
deleted file mode 100644
index 7fd1b5223deb908661735014c4b513986ae97183..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/.tern-port
+++ /dev/null
@@ -1 +0,0 @@
-62638
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/.travis.yml
deleted file mode 100644
index 61d0634045597700dc9483ecd624f2ee708f80f9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-node_js:
-  - "0.10"
-  - "0.12"
-  - "4.2"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/LICENSE
deleted file mode 100644
index 4f321e599569f423075c936a659e8e0a02705b5b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright 2013 Michael Hart (michael.hart.au@gmail.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/README.md
deleted file mode 100644
index 6c55da80528c74739971da8e649ea7e52df0338a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/README.md
+++ /dev/null
@@ -1,514 +0,0 @@
-aws4
-----
-
-[![Build Status](https://secure.travis-ci.org/mhart/aws4.png?branch=master)](http://travis-ci.org/mhart/aws4)
-
-A small utility to sign vanilla node.js http(s) request options using Amazon's
-[AWS Signature Version 4](http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html).
-
-Can also be used [in the browser](./browser).
-
-This signature is supported by nearly all Amazon services, including
-[S3](http://docs.aws.amazon.com/AmazonS3/latest/API/),
-[EC2](http://docs.aws.amazon.com/AWSEC2/latest/APIReference/),
-[DynamoDB](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/API.html),
-[Kinesis](http://docs.aws.amazon.com/kinesis/latest/APIReference/),
-[Lambda](http://docs.aws.amazon.com/lambda/latest/dg/API_Reference.html),
-[SQS](http://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/),
-[SNS](http://docs.aws.amazon.com/sns/latest/api/),
-[IAM](http://docs.aws.amazon.com/IAM/latest/APIReference/),
-[STS](http://docs.aws.amazon.com/STS/latest/APIReference/),
-[RDS](http://docs.aws.amazon.com/AmazonRDS/latest/APIReference/),
-[CloudWatch](http://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/),
-[CloudWatch Logs](http://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/),
-[CodeDeploy](http://docs.aws.amazon.com/codedeploy/latest/APIReference/),
-[CloudFront](http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/),
-[CloudTrail](http://docs.aws.amazon.com/awscloudtrail/latest/APIReference/),
-[ElastiCache](http://docs.aws.amazon.com/AmazonElastiCache/latest/APIReference/),
-[EMR](http://docs.aws.amazon.com/ElasticMapReduce/latest/API/),
-[Glacier](http://docs.aws.amazon.com/amazonglacier/latest/dev/amazon-glacier-api.html),
-[CloudSearch](http://docs.aws.amazon.com/cloudsearch/latest/developerguide/APIReq.html),
-[Elastic Load Balancing](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/),
-[Elastic Transcoder](http://docs.aws.amazon.com/elastictranscoder/latest/developerguide/api-reference.html),
-[CloudFormation](http://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/),
-[Elastic Beanstalk](http://docs.aws.amazon.com/elasticbeanstalk/latest/api/),
-[Storage Gateway](http://docs.aws.amazon.com/storagegateway/latest/userguide/AWSStorageGatewayAPI.html),
-[Data Pipeline](http://docs.aws.amazon.com/datapipeline/latest/APIReference/),
-[Direct Connect](http://docs.aws.amazon.com/directconnect/latest/APIReference/),
-[Redshift](http://docs.aws.amazon.com/redshift/latest/APIReference/),
-[OpsWorks](http://docs.aws.amazon.com/opsworks/latest/APIReference/),
-[SES](http://docs.aws.amazon.com/ses/latest/APIReference/),
-[SWF](http://docs.aws.amazon.com/amazonswf/latest/apireference/),
-[AutoScaling](http://docs.aws.amazon.com/AutoScaling/latest/APIReference/),
-[Mobile Analytics](http://docs.aws.amazon.com/mobileanalytics/latest/ug/server-reference.html),
-[Cognito Identity](http://docs.aws.amazon.com/cognitoidentity/latest/APIReference/),
-[Cognito Sync](http://docs.aws.amazon.com/cognitosync/latest/APIReference/),
-[Container Service](http://docs.aws.amazon.com/AmazonECS/latest/APIReference/),
-[AppStream](http://docs.aws.amazon.com/appstream/latest/developerguide/appstream-api-rest.html),
-[Key Management Service](http://docs.aws.amazon.com/kms/latest/APIReference/),
-[Config](http://docs.aws.amazon.com/config/latest/APIReference/),
-[CloudHSM](http://docs.aws.amazon.com/cloudhsm/latest/dg/api-ref.html),
-[Route53](http://docs.aws.amazon.com/Route53/latest/APIReference/requests-rest.html) and
-[Route53 Domains](http://docs.aws.amazon.com/Route53/latest/APIReference/requests-rpc.html).
-
-Indeed, the only AWS services that *don't* support v4 as of 2014-12-30 are
-[Import/Export](http://docs.aws.amazon.com/AWSImportExport/latest/DG/api-reference.html) and
-[SimpleDB](http://docs.aws.amazon.com/AmazonSimpleDB/latest/DeveloperGuide/SDB_API.html)
-(they only support [AWS Signature Version 2](https://github.com/mhart/aws2)).
-
-It also provides defaults for a number of core AWS headers and
-request parameters, making it very easy to query AWS services, or
-build out a fully-featured AWS library.
-
-Example
--------
-
-```javascript
-var http  = require('http'),
-    https = require('https'),
-    aws4  = require('aws4')
-
-// given an options object you could pass to http.request
-var opts = {host: 'sqs.us-east-1.amazonaws.com', path: '/?Action=ListQueues'}
-
-// alternatively (as aws4 can infer the host):
-opts = {service: 'sqs', region: 'us-east-1', path: '/?Action=ListQueues'}
-
-// alternatively (as us-east-1 is default):
-opts = {service: 'sqs', path: '/?Action=ListQueues'}
-
-aws4.sign(opts) // assumes AWS credentials are available in process.env
-
-console.log(opts)
-/*
-{
-  host: 'sqs.us-east-1.amazonaws.com',
-  path: '/?Action=ListQueues',
-  headers: {
-    Host: 'sqs.us-east-1.amazonaws.com',
-    'X-Amz-Date': '20121226T061030Z',
-    Authorization: 'AWS4-HMAC-SHA256 Credential=ABCDEF/20121226/us-east-1/sqs/aws4_request, ...'
-  }
-}
-*/
-
-// we can now use this to query AWS using the standard node.js http API
-http.request(opts, function(res) { res.pipe(process.stdout) }).end()
-/*
-<?xml version="1.0"?>
-<ListQueuesResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
-...
-*/
-```
-
-More options
-------------
-
-```javascript
-// you can also pass AWS credentials in explicitly (otherwise taken from process.env)
-aws4.sign(opts, {accessKeyId: '', secretAccessKey: ''})
-
-// can also add the signature to query strings
-aws4.sign({service: 's3', path: '/my-bucket?X-Amz-Expires=12345', signQuery: true})
-
-// create a utility function to pipe to stdout (with https this time)
-function request(o) { https.request(o, function(res) { res.pipe(process.stdout) }).end(o.body || '') }
-
-// aws4 can infer the HTTP method if a body is passed in
-// method will be POST and Content-Type: 'application/x-www-form-urlencoded; charset=utf-8'
-request(aws4.sign({service: 'iam', body: 'Action=ListGroups&Version=2010-05-08'}))
-/*
-<ListGroupsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">
-...
-*/
-
-// can specify any custom option or header as per usual
-request(aws4.sign({
-  service: 'dynamodb',
-  region: 'ap-southeast-2',
-  method: 'POST',
-  path: '/',
-  headers: {
-    'Content-Type': 'application/x-amz-json-1.0',
-    'X-Amz-Target': 'DynamoDB_20120810.ListTables'
-  },
-  body: '{}'
-}))
-/*
-{"TableNames":[]}
-...
-*/
-
-// works with all other services that support Signature Version 4
-
-request(aws4.sign({service: 's3', path: '/', signQuery: true}))
-/*
-<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
-...
-*/
-
-request(aws4.sign({service: 'ec2', path: '/?Action=DescribeRegions&Version=2014-06-15'}))
-/*
-<DescribeRegionsResponse xmlns="http://ec2.amazonaws.com/doc/2014-06-15/">
-...
-*/
-
-request(aws4.sign({service: 'sns', path: '/?Action=ListTopics&Version=2010-03-31'}))
-/*
-<ListTopicsResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
-...
-*/
-
-request(aws4.sign({service: 'sts', path: '/?Action=GetSessionToken&Version=2011-06-15'}))
-/*
-<GetSessionTokenResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
-...
-*/
-
-request(aws4.sign({service: 'cloudsearch', path: '/?Action=ListDomainNames&Version=2013-01-01'}))
-/*
-<ListDomainNamesResponse xmlns="http://cloudsearch.amazonaws.com/doc/2013-01-01/">
-...
-*/
-
-request(aws4.sign({service: 'ses', path: '/?Action=ListIdentities&Version=2010-12-01'}))
-/*
-<ListIdentitiesResponse xmlns="http://ses.amazonaws.com/doc/2010-12-01/">
-...
-*/
-
-request(aws4.sign({service: 'autoscaling', path: '/?Action=DescribeAutoScalingInstances&Version=2011-01-01'}))
-/*
-<DescribeAutoScalingInstancesResponse xmlns="http://autoscaling.amazonaws.com/doc/2011-01-01/">
-...
-*/
-
-request(aws4.sign({service: 'elasticloadbalancing', path: '/?Action=DescribeLoadBalancers&Version=2012-06-01'}))
-/*
-<DescribeLoadBalancersResponse xmlns="http://elasticloadbalancing.amazonaws.com/doc/2012-06-01/">
-...
-*/
-
-request(aws4.sign({service: 'cloudformation', path: '/?Action=ListStacks&Version=2010-05-15'}))
-/*
-<ListStacksResponse xmlns="http://cloudformation.amazonaws.com/doc/2010-05-15/">
-...
-*/
-
-request(aws4.sign({service: 'elasticbeanstalk', path: '/?Action=ListAvailableSolutionStacks&Version=2010-12-01'}))
-/*
-<ListAvailableSolutionStacksResponse xmlns="http://elasticbeanstalk.amazonaws.com/docs/2010-12-01/">
-...
-*/
-
-request(aws4.sign({service: 'rds', path: '/?Action=DescribeDBInstances&Version=2012-09-17'}))
-/*
-<DescribeDBInstancesResponse xmlns="http://rds.amazonaws.com/doc/2012-09-17/">
-...
-*/
-
-request(aws4.sign({service: 'monitoring', path: '/?Action=ListMetrics&Version=2010-08-01'}))
-/*
-<ListMetricsResponse xmlns="http://monitoring.amazonaws.com/doc/2010-08-01/">
-...
-*/
-
-request(aws4.sign({service: 'redshift', path: '/?Action=DescribeClusters&Version=2012-12-01'}))
-/*
-<DescribeClustersResponse xmlns="http://redshift.amazonaws.com/doc/2012-12-01/">
-...
-*/
-
-request(aws4.sign({service: 'cloudfront', path: '/2014-05-31/distribution'}))
-/*
-<DistributionList xmlns="http://cloudfront.amazonaws.com/doc/2014-05-31/">
-...
-*/
-
-request(aws4.sign({service: 'elasticache', path: '/?Action=DescribeCacheClusters&Version=2014-07-15'}))
-/*
-<DescribeCacheClustersResponse xmlns="http://elasticache.amazonaws.com/doc/2014-07-15/">
-...
-*/
-
-request(aws4.sign({service: 'elasticmapreduce', path: '/?Action=DescribeJobFlows&Version=2009-03-31'}))
-/*
-<DescribeJobFlowsResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31">
-...
-*/
-
-request(aws4.sign({service: 'route53', path: '/2013-04-01/hostedzone'}))
-/*
-<ListHostedZonesResponse xmlns="https://route53.amazonaws.com/doc/2013-04-01/">
-...
-*/
-
-request(aws4.sign({service: 'appstream', path: '/applications'}))
-/*
-{"_links":{"curie":[{"href":"http://docs.aws.amazon.com/appstream/latest/...
-...
-*/
-
-request(aws4.sign({service: 'cognito-sync', path: '/identitypools'}))
-/*
-{"Count":0,"IdentityPoolUsages":[],"MaxResults":16,"NextToken":null}
-...
-*/
-
-request(aws4.sign({service: 'elastictranscoder', path: '/2012-09-25/pipelines'}))
-/*
-{"NextPageToken":null,"Pipelines":[]}
-...
-*/
-
-request(aws4.sign({service: 'lambda', path: '/2014-11-13/functions/'}))
-/*
-{"Functions":[],"NextMarker":null}
-...
-*/
-
-request(aws4.sign({service: 'ecs', path: '/?Action=ListClusters&Version=2014-11-13'}))
-/*
-<ListClustersResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
-...
-*/
-
-request(aws4.sign({service: 'glacier', path: '/-/vaults', headers: {'X-Amz-Glacier-Version': '2012-06-01'}}))
-/*
-{"Marker":null,"VaultList":[]}
-...
-*/
-
-request(aws4.sign({service: 'storagegateway', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'StorageGateway_20120630.ListGateways'
-}}))
-/*
-{"Gateways":[]}
-...
-*/
-
-request(aws4.sign({service: 'datapipeline', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'DataPipeline.ListPipelines'
-}}))
-/*
-{"hasMoreResults":false,"pipelineIdList":[]}
-...
-*/
-
-request(aws4.sign({service: 'opsworks', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'OpsWorks_20130218.DescribeStacks'
-}}))
-/*
-{"Stacks":[]}
-...
-*/
-
-request(aws4.sign({service: 'route53domains', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'Route53Domains_v20140515.ListDomains'
-}}))
-/*
-{"Domains":[]}
-...
-*/
-
-request(aws4.sign({service: 'kinesis', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'Kinesis_20131202.ListStreams'
-}}))
-/*
-{"HasMoreStreams":false,"StreamNames":[]}
-...
-*/
-
-request(aws4.sign({service: 'cloudtrail', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'CloudTrail_20131101.DescribeTrails'
-}}))
-/*
-{"trailList":[]}
-...
-*/
-
-request(aws4.sign({service: 'logs', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'Logs_20140328.DescribeLogGroups'
-}}))
-/*
-{"logGroups":[]}
-...
-*/
-
-request(aws4.sign({service: 'codedeploy', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'CodeDeploy_20141006.ListApplications'
-}}))
-/*
-{"applications":[]}
-...
-*/
-
-request(aws4.sign({service: 'directconnect', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'OvertureService.DescribeConnections'
-}}))
-/*
-{"connections":[]}
-...
-*/
-
-request(aws4.sign({service: 'kms', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'TrentService.ListKeys'
-}}))
-/*
-{"Keys":[],"Truncated":false}
-...
-*/
-
-request(aws4.sign({service: 'config', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'StarlingDoveService.DescribeDeliveryChannels'
-}}))
-/*
-{"DeliveryChannels":[]}
-...
-*/
-
-request(aws4.sign({service: 'cloudhsm', body: '{}', headers: {
-  'Content-Type': 'application/x-amz-json-1.1',
-  'X-Amz-Target': 'CloudHsmFrontendService.ListAvailableZones'
-}}))
-/*
-{"AZList":["us-east-1a","us-east-1b","us-east-1c"]}
-...
-*/
-
-request(aws4.sign({
-  service: 'swf',
-  body: '{"registrationStatus":"REGISTERED"}',
-  headers: {
-    'Content-Type': 'application/x-amz-json-1.0',
-    'X-Amz-Target': 'SimpleWorkflowService.ListDomains'
-  }
-}))
-/*
-{"domainInfos":[]}
-...
-*/
-
-request(aws4.sign({
-  service: 'cognito-identity',
-  body: '{"MaxResults": 1}',
-  headers: {
-    'Content-Type': 'application/x-amz-json-1.1',
-    'X-Amz-Target': 'AWSCognitoIdentityService.ListIdentityPools'
-  }
-}))
-/*
-{"IdentityPools":[]}
-...
-*/
-
-request(aws4.sign({
-  service: 'mobileanalytics',
-  path: '/2014-06-05/events',
-  body: JSON.stringify({events:[{
-    eventType: 'a',
-    timestamp: new Date().toISOString(),
-    session: {},
-  }]}),
-  headers: {
-    'Content-Type': 'application/json',
-    'X-Amz-Client-Context': JSON.stringify({
-      client: {client_id: 'a', app_title: 'a'},
-      custom: {},
-      env: {platform: 'a'},
-      services: {},
-    }),
-  }
-}))
-/*
-(HTTP 202, empty response)
-*/
-```
-
-API
----
-
-### aws4.sign(requestOptions, [credentials])
-
-This calculates and populates the `Authorization` header of
-`requestOptions`, and any other necessary AWS headers and/or request
-options. Returns `requestOptions` as a convenience for chaining.
-
-`requestOptions` is an object holding the same options that the node.js
-[http.request](http://nodejs.org/docs/latest/api/http.html#http_http_request_options_callback)
-function takes.
-
-The following properties of `requestOptions` are used in the signing or
-populated if they don't already exist:
-
-- `hostname` or `host` (will be determined from `service` and `region` if not given)
-- `method` (will use `'GET'` if not given or `'POST'` if there is a `body`)
-- `path` (will use `'/'` if not given)
-- `body` (will use `''` if not given)
-- `service` (will be calculated from `hostname` or `host` if not given)
-- `region` (will be calculated from `hostname` or `host` or use `'us-east-1'` if not given)
-- `headers['Host']` (will use `hostname` or `host` or be calculated if not given)
-- `headers['Content-Type']` (will use `'application/x-www-form-urlencoded; charset=utf-8'`
-  if not given and there is a `body`)
-- `headers['Date']` (used to calculate the signature date if given, otherwise `new Date` is used)
-
-Your AWS credentials (which can be found in your
-[AWS console](https://portal.aws.amazon.com/gp/aws/securityCredentials))
-can be specified in one of two ways:
-
-- As the second argument, like this:
-
-```javascript
-aws4.sign(requestOptions, {
-  secretAccessKey: "<your-secret-access-key>",
-  accessKeyId: "<your-access-key-id>",
-  sessionToken: "<your-session-token>"
-})
-```
-
-- From `process.env`, such as this:
-
-```
-export AWS_SECRET_ACCESS_KEY="<your-secret-access-key>"
-export AWS_ACCESS_KEY_ID="<your-access-key-id>"
-export AWS_SESSION_TOKEN="<your-session-token>"
-```
-
-(will also use `AWS_ACCESS_KEY` and `AWS_SECRET_KEY` if available)
-
-The `sessionToken` property and `AWS_SESSION_TOKEN` environment variable are optional for signing
-with [IAM STS temporary credentials](http://docs.aws.amazon.com/STS/latest/UsingSTS/using-temp-creds.html).
-
-Installation
-------------
-
-With [npm](http://npmjs.org/) do:
-
-```
-npm install aws4
-```
-
-Can also be used [in the browser](./browser).
-
-Thanks
-------
-
-Thanks to [@jed](https://github.com/jed) for his
-[dynamo-client](https://github.com/jed/dynamo-client) lib where I first
-committed and subsequently extracted this code.
-
-Also thanks to the
-[official node.js AWS SDK](https://github.com/aws/aws-sdk-js) for giving
-me a start on implementing the v4 signature.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/aws4.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/aws4.js
deleted file mode 100644
index cbe5dc90494efe7e6c3855a251a83e25eba3a286..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/aws4.js
+++ /dev/null
@@ -1,318 +0,0 @@
-var aws4 = exports,
-    url = require('url'),
-    querystring = require('querystring'),
-    crypto = require('crypto'),
-    lru = require('./lru'),
-    credentialsCache = lru(1000)
-
-// http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html
-
-function hmac(key, string, encoding) {
-  return crypto.createHmac('sha256', key).update(string, 'utf8').digest(encoding)
-}
-
-function hash(string, encoding) {
-  return crypto.createHash('sha256').update(string, 'utf8').digest(encoding)
-}
-
-// This function assumes the string has already been percent encoded
-function encodeRfc3986(urlEncodedString) {
-  return urlEncodedString.replace(/[!'()*]/g, function(c) {
-    return '%' + c.charCodeAt(0).toString(16).toUpperCase()
-  })
-}
-
-// request: { path | body, [host], [method], [headers], [service], [region] }
-// credentials: { accessKeyId, secretAccessKey, [sessionToken] }
-function RequestSigner(request, credentials) {
-
-  if (typeof request === 'string') request = url.parse(request)
-
-  var headers = request.headers = (request.headers || {}),
-      hostParts = this.matchHost(request.hostname || request.host || headers.Host || headers.host)
-
-  this.request = request
-  this.credentials = credentials || this.defaultCredentials()
-
-  this.service = request.service || hostParts[0] || ''
-  this.region = request.region || hostParts[1] || 'us-east-1'
-
-  // SES uses a different domain from the service name
-  if (this.service === 'email') this.service = 'ses'
-
-  if (!request.method && request.body)
-    request.method = 'POST'
-
-  if (!headers.Host && !headers.host) {
-    headers.Host = request.hostname || request.host || this.createHost()
-
-    // If a port is specified explicitly, use it as is
-    if (request.port)
-      headers.Host += ':' + request.port
-  }
-  if (!request.hostname && !request.host)
-    request.hostname = headers.Host || headers.host
-}
-
-RequestSigner.prototype.matchHost = function(host) {
-  var match = (host || '').match(/([^\.]+)\.(?:([^\.]*)\.)?amazonaws\.com$/)
-  var hostParts = (match || []).slice(1, 3)
-
-  // ES's hostParts are sometimes the other way round, if the value that is expected
-  // to be region equals ‘es’ switch them back
-  // e.g. search-cluster-name-aaaa00aaaa0aaa0aaaaaaa0aaa.us-east-1.es.amazonaws.com
-  if (hostParts[1] === 'es')
-    hostParts = hostParts.reverse()
-
-  return hostParts
-}
-
-// http://docs.aws.amazon.com/general/latest/gr/rande.html
-RequestSigner.prototype.isSingleRegion = function() {
-  // Special case for S3 and SimpleDB in us-east-1
-  if (['s3', 'sdb'].indexOf(this.service) >= 0 && this.region === 'us-east-1') return true
-
-  return ['cloudfront', 'ls', 'route53', 'iam', 'importexport', 'sts']
-    .indexOf(this.service) >= 0
-}
-
-RequestSigner.prototype.createHost = function() {
-  var region = this.isSingleRegion() ? '' :
-        (this.service === 's3' && this.region !== 'us-east-1' ? '-' : '.') + this.region,
-      service = this.service === 'ses' ? 'email' : this.service
-  return service + region + '.amazonaws.com'
-}
-
-RequestSigner.prototype.prepareRequest = function() {
-  this.parsePath()
-
-  var request = this.request, headers = request.headers, query
-
-  if (request.signQuery) {
-
-    this.parsedPath.query = query = this.parsedPath.query || {}
-
-    if (this.credentials.sessionToken)
-      query['X-Amz-Security-Token'] = this.credentials.sessionToken
-
-    if (this.service === 's3' && !query['X-Amz-Expires'])
-      query['X-Amz-Expires'] = 86400
-
-    if (query['X-Amz-Date'])
-      this.datetime = query['X-Amz-Date']
-    else
-      query['X-Amz-Date'] = this.getDateTime()
-
-    query['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256'
-    query['X-Amz-Credential'] = this.credentials.accessKeyId + '/' + this.credentialString()
-    query['X-Amz-SignedHeaders'] = this.signedHeaders()
-
-  } else {
-
-    if (!request.doNotModifyHeaders) {
-      if (request.body && !headers['Content-Type'] && !headers['content-type'])
-        headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'
-
-      if (request.body && !headers['Content-Length'] && !headers['content-length'])
-        headers['Content-Length'] = Buffer.byteLength(request.body)
-
-      if (this.credentials.sessionToken)
-        headers['X-Amz-Security-Token'] = this.credentials.sessionToken
-
-      if (this.service === 's3')
-        headers['X-Amz-Content-Sha256'] = hash(this.request.body || '', 'hex')
-
-      if (headers['X-Amz-Date'])
-        this.datetime = headers['X-Amz-Date']
-      else
-        headers['X-Amz-Date'] = this.getDateTime()
-    }
-
-    delete headers.Authorization
-    delete headers.authorization
-  }
-}
-
-RequestSigner.prototype.sign = function() {
-  if (!this.parsedPath) this.prepareRequest()
-
-  if (this.request.signQuery) {
-    this.parsedPath.query['X-Amz-Signature'] = this.signature()
-  } else {
-    this.request.headers.Authorization = this.authHeader()
-  }
-
-  this.request.path = this.formatPath()
-
-  return this.request
-}
-
-RequestSigner.prototype.getDateTime = function() {
-  if (!this.datetime) {
-    var headers = this.request.headers,
-      date = new Date(headers.Date || headers.date || new Date)
-
-    this.datetime = date.toISOString().replace(/[:\-]|\.\d{3}/g, '')
-  }
-  return this.datetime
-}
-
-RequestSigner.prototype.getDate = function() {
-  return this.getDateTime().substr(0, 8)
-}
-
-RequestSigner.prototype.authHeader = function() {
-  return [
-    'AWS4-HMAC-SHA256 Credential=' + this.credentials.accessKeyId + '/' + this.credentialString(),
-    'SignedHeaders=' + this.signedHeaders(),
-    'Signature=' + this.signature(),
-  ].join(', ')
-}
-
-RequestSigner.prototype.signature = function() {
-  var date = this.getDate(),
-      cacheKey = [this.credentials.secretAccessKey, date, this.region, this.service].join(),
-      kDate, kRegion, kService, kCredentials = credentialsCache.get(cacheKey)
-  if (!kCredentials) {
-    kDate = hmac('AWS4' + this.credentials.secretAccessKey, date)
-    kRegion = hmac(kDate, this.region)
-    kService = hmac(kRegion, this.service)
-    kCredentials = hmac(kService, 'aws4_request')
-    credentialsCache.set(cacheKey, kCredentials)
-  }
-  return hmac(kCredentials, this.stringToSign(), 'hex')
-}
-
-RequestSigner.prototype.stringToSign = function() {
-  return [
-    'AWS4-HMAC-SHA256',
-    this.getDateTime(),
-    this.credentialString(),
-    hash(this.canonicalString(), 'hex'),
-  ].join('\n')
-}
-
-RequestSigner.prototype.canonicalString = function() {
-  if (!this.parsedPath) this.prepareRequest()
-
-  var pathStr = this.parsedPath.path,
-      query = this.parsedPath.query,
-      queryStr = '',
-      normalizePath = this.service !== 's3',
-      decodePath = this.service === 's3' || this.request.doNotEncodePath,
-      decodeSlashesInPath = this.service === 's3',
-      firstValOnly = this.service === 's3',
-      bodyHash = this.service === 's3' && this.request.signQuery ?
-        'UNSIGNED-PAYLOAD' : hash(this.request.body || '', 'hex')
-
-  if (query) {
-    queryStr = encodeRfc3986(querystring.stringify(Object.keys(query).sort().reduce(function(obj, key) {
-      if (!key) return obj
-      obj[key] = !Array.isArray(query[key]) ? query[key] :
-        (firstValOnly ? query[key][0] : query[key].slice().sort())
-      return obj
-    }, {})))
-  }
-  if (pathStr !== '/') {
-    if (normalizePath) pathStr = pathStr.replace(/\/{2,}/g, '/')
-    pathStr = pathStr.split('/').reduce(function(path, piece) {
-      if (normalizePath && piece === '..') {
-        path.pop()
-      } else if (!normalizePath || piece !== '.') {
-        if (decodePath) piece = querystring.unescape(piece)
-        path.push(encodeRfc3986(querystring.escape(piece)))
-      }
-      return path
-    }, []).join('/')
-    if (pathStr[0] !== '/') pathStr = '/' + pathStr
-    if (decodeSlashesInPath) pathStr = pathStr.replace(/%2F/g, '/')
-  }
-
-  return [
-    this.request.method || 'GET',
-    pathStr,
-    queryStr,
-    this.canonicalHeaders() + '\n',
-    this.signedHeaders(),
-    bodyHash,
-  ].join('\n')
-}
-
-RequestSigner.prototype.canonicalHeaders = function() {
-  var headers = this.request.headers
-  function trimAll(header) {
-    return header.toString().trim().replace(/\s+/g, ' ')
-  }
-  return Object.keys(headers)
-    .sort(function(a, b) { return a.toLowerCase() < b.toLowerCase() ? -1 : 1 })
-    .map(function(key) { return key.toLowerCase() + ':' + trimAll(headers[key]) })
-    .join('\n')
-}
-
-RequestSigner.prototype.signedHeaders = function() {
-  return Object.keys(this.request.headers)
-    .map(function(key) { return key.toLowerCase() })
-    .sort()
-    .join(';')
-}
-
-RequestSigner.prototype.credentialString = function() {
-  return [
-    this.getDate(),
-    this.region,
-    this.service,
-    'aws4_request',
-  ].join('/')
-}
-
-RequestSigner.prototype.defaultCredentials = function() {
-  var env = process.env
-  return {
-    accessKeyId: env.AWS_ACCESS_KEY_ID || env.AWS_ACCESS_KEY,
-    secretAccessKey: env.AWS_SECRET_ACCESS_KEY || env.AWS_SECRET_KEY,
-    sessionToken: env.AWS_SESSION_TOKEN,
-  }
-}
-
-RequestSigner.prototype.parsePath = function() {
-  var path = this.request.path || '/',
-      queryIx = path.indexOf('?'),
-      query = null
-
-  if (queryIx >= 0) {
-    query = querystring.parse(path.slice(queryIx + 1))
-    path = path.slice(0, queryIx)
-  }
-
-  // S3 doesn't always encode characters > 127 correctly and
-  // all services don't encode characters > 255 correctly
-  // So if there are non-reserved chars (and it's not already all % encoded), just encode them all
-  if (/[^0-9A-Za-z!'()*\-._~%/]/.test(path)) {
-    path = path.split('/').map(function(piece) {
-      return querystring.escape(querystring.unescape(piece))
-    }).join('/')
-  }
-
-  this.parsedPath = {
-    path: path,
-    query: query,
-  }
-}
-
-RequestSigner.prototype.formatPath = function() {
-  var path = this.parsedPath.path,
-      query = this.parsedPath.query
-
-  if (!query) return path
-
-  // Services don't support empty query string keys
-  if (query[''] != null) delete query['']
-
-  return path + '?' + encodeRfc3986(querystring.stringify(query))
-}
-
-aws4.RequestSigner = RequestSigner
-
-aws4.sign = function(request, credentials) {
-  return new RequestSigner(request, credentials).sign()
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/lru.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/lru.js
deleted file mode 100644
index 333f66a4436ec436b714d6c6725f1d9900c25012..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/lru.js
+++ /dev/null
@@ -1,96 +0,0 @@
-module.exports = function(size) {
-  return new LruCache(size)
-}
-
-function LruCache(size) {
-  this.capacity = size | 0
-  this.map = Object.create(null)
-  this.list = new DoublyLinkedList()
-}
-
-LruCache.prototype.get = function(key) {
-  var node = this.map[key]
-  if (node == null) return undefined
-  this.used(node)
-  return node.val
-}
-
-LruCache.prototype.set = function(key, val) {
-  var node = this.map[key]
-  if (node != null) {
-    node.val = val
-  } else {
-    if (!this.capacity) this.prune()
-    if (!this.capacity) return false
-    node = new DoublyLinkedNode(key, val)
-    this.map[key] = node
-    this.capacity--
-  }
-  this.used(node)
-  return true
-}
-
-LruCache.prototype.used = function(node) {
-  this.list.moveToFront(node)
-}
-
-LruCache.prototype.prune = function() {
-  var node = this.list.pop()
-  if (node != null) {
-    delete this.map[node.key]
-    this.capacity++
-  }
-}
-
-
-function DoublyLinkedList() {
-  this.firstNode = null
-  this.lastNode = null
-}
-
-DoublyLinkedList.prototype.moveToFront = function(node) {
-  if (this.firstNode == node) return
-
-  this.remove(node)
-
-  if (this.firstNode == null) {
-    this.firstNode = node
-    this.lastNode = node
-    node.prev = null
-    node.next = null
-  } else {
-    node.prev = null
-    node.next = this.firstNode
-    node.next.prev = node
-    this.firstNode = node
-  }
-}
-
-DoublyLinkedList.prototype.pop = function() {
-  var lastNode = this.lastNode
-  if (lastNode != null) {
-    this.remove(lastNode)
-  }
-  return lastNode
-}
-
-DoublyLinkedList.prototype.remove = function(node) {
-  if (this.firstNode == node) {
-    this.firstNode = node.next
-  } else if (node.prev != null) {
-    node.prev.next = node.next
-  }
-  if (this.lastNode == node) {
-    this.lastNode = node.prev
-  } else if (node.next != null) {
-    node.next.prev = node.prev
-  }
-}
-
-
-function DoublyLinkedNode(key, val) {
-  this.key = key
-  this.val = val
-  this.prev = null
-  this.next = null
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/package.json
deleted file mode 100644
index 8ac2e93d9e2081d9d9a005e64cf69695ea0f7849..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/aws4/package.json
+++ /dev/null
@@ -1,114 +0,0 @@
-{
-  "_from": "aws4@>=1.2.1 <2.0.0",
-  "_id": "aws4@1.4.1",
-  "_location": "/serialport/node-pre-gyp/request/aws4",
-  "_nodeVersion": "4.4.3",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/aws4-1.4.1.tgz_1462643218465_0.6527479749638587"
-  },
-  "_npmUser": {
-    "email": "michael.hart.au@gmail.com",
-    "name": "hichaelmart"
-  },
-  "_npmVersion": "2.15.4",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz",
-  "_shasum": "fde7d5292466d230e5ee0f4e038d9dfaab08fc61",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "michael.hart.au@gmail.com",
-    "name": "Michael Hart",
-    "url": "http://github.com/mhart"
-  },
-  "bugs": {
-    "url": "https://github.com/mhart/aws4/issues"
-  },
-  "dependencies": {},
-  "description": "Signs and prepares requests using AWS Signature Version 4",
-  "devDependencies": {
-    "mocha": "^2.4.5",
-    "should": "^8.2.2"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "fde7d5292466d230e5ee0f4e038d9dfaab08fc61",
-    "tarball": "https://registry.npmjs.org/aws4/-/aws4-1.4.1.tgz"
-  },
-  "gitHead": "f126d3ff80be1ddde0fc6b50bb51a7f199547e81",
-  "homepage": "https://github.com/mhart/aws4#readme",
-  "keywords": [
-    "amazon",
-    "appstream",
-    "autoscaling",
-    "aws",
-    "cloudformation",
-    "cloudfront",
-    "cloudhsm",
-    "cloudsearch",
-    "cloudtrail",
-    "cloudwatch",
-    "codedeploy",
-    "cognito",
-    "cognitoidentity",
-    "cognitosync",
-    "config",
-    "containerservice",
-    "datapipeline",
-    "directconnect",
-    "dynamodb",
-    "ec2",
-    "ecs",
-    "elasticache",
-    "elasticbeanstalk",
-    "elasticloadbalancing",
-    "elasticmapreduce",
-    "elastictranscoder",
-    "elb",
-    "emr",
-    "glacier",
-    "iam",
-    "keymanagementservice",
-    "kinesis",
-    "kms",
-    "lambda",
-    "logs",
-    "mobileanalytics",
-    "monitoring",
-    "opsworks",
-    "rds",
-    "redshift",
-    "route53",
-    "route53domains",
-    "s3",
-    "ses",
-    "signature",
-    "sns",
-    "sqs",
-    "storagegateway",
-    "sts",
-    "swf"
-  ],
-  "license": "MIT",
-  "main": "aws4.js",
-  "maintainers": [
-    {
-      "name": "hichaelmart",
-      "email": "michael.hart.au@gmail.com"
-    }
-  ],
-  "name": "aws4",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/mhart/aws4.git"
-  },
-  "scripts": {
-    "test": "mocha ./test/fast.js ./test/slow.js -b -t 100s -R list"
-  },
-  "version": "1.4.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.jshintrc b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.jshintrc
deleted file mode 100644
index c8ef3ca4097f8288c92d3f298cb089c1bf05aa68..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.jshintrc
+++ /dev/null
@@ -1,59 +0,0 @@
-{
-    "predef": [ ]
-  , "bitwise": false
-  , "camelcase": false
-  , "curly": false
-  , "eqeqeq": false
-  , "forin": false
-  , "immed": false
-  , "latedef": false
-  , "noarg": true
-  , "noempty": true
-  , "nonew": true
-  , "plusplus": false
-  , "quotmark": true
-  , "regexp": false
-  , "undef": true
-  , "unused": true
-  , "strict": false
-  , "trailing": true
-  , "maxlen": 120
-  , "asi": true
-  , "boss": true
-  , "debug": true
-  , "eqnull": true
-  , "esnext": true
-  , "evil": true
-  , "expr": true
-  , "funcscope": false
-  , "globalstrict": false
-  , "iterator": false
-  , "lastsemic": true
-  , "laxbreak": true
-  , "laxcomma": true
-  , "loopfunc": true
-  , "multistr": false
-  , "onecase": false
-  , "proto": false
-  , "regexdash": false
-  , "scripturl": true
-  , "smarttabs": false
-  , "shadow": false
-  , "sub": true
-  , "supernew": false
-  , "validthis": true
-  , "browser": true
-  , "couch": false
-  , "devel": false
-  , "dojo": false
-  , "mootools": false
-  , "node": true
-  , "nonstandard": true
-  , "prototypejs": false
-  , "rhino": false
-  , "worker": true
-  , "wsh": false
-  , "nomen": false
-  , "onevar": false
-  , "passfail": false
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.npmignore
deleted file mode 100644
index 40b878db5b1c97fc77049537a71bb2e249abe5dc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.travis.yml
deleted file mode 100644
index 5cb0480b45457a8c5f9014259f75f602a8c68237..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/.travis.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-sudo: false
-language: node_js
-node_js:
-  - '0.10'
-  - '0.12'
-  - '4'
-  - '5'
-branches:
-  only:
-    - master
-notifications:
-  email:
-    - rod@vagg.org
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/LICENSE.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/LICENSE.md
deleted file mode 100644
index ccb24797c894160a501a5b1e910fd7801e67ea08..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/LICENSE.md
+++ /dev/null
@@ -1,13 +0,0 @@
-The MIT License (MIT)
-=====================
-
-Copyright (c) 2014 bl contributors
-----------------------------------
-
-*bl contributors listed at <https://github.com/rvagg/bl#contributors>*
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/README.md
deleted file mode 100644
index f7044db26e8659afc286cc08ff91afe26a3367eb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/README.md
+++ /dev/null
@@ -1,200 +0,0 @@
-# bl *(BufferList)*
-
-[![Build Status](https://travis-ci.org/rvagg/bl.svg?branch=master)](https://travis-ci.org/rvagg/bl)
-
-**A Node.js Buffer list collector, reader and streamer thingy.**
-
-[![NPM](https://nodei.co/npm/bl.png?downloads=true&downloadRank=true)](https://nodei.co/npm/bl/)
-[![NPM](https://nodei.co/npm-dl/bl.png?months=6&height=3)](https://nodei.co/npm/bl/)
-
-**bl** is a storage object for collections of Node Buffers, exposing them with the main Buffer readable API. Also works as a duplex stream so you can collect buffers from a stream that emits them and emit buffers to a stream that consumes them!
-
-The original buffers are kept intact and copies are only done as necessary. Any reads that require the use of a single original buffer will return a slice of that buffer only (which references the same memory as the original buffer). Reads that span buffers perform concatenation as required and return the results transparently.
-
-```js
-const BufferList = require('bl')
-
-var bl = new BufferList()
-bl.append(new Buffer('abcd'))
-bl.append(new Buffer('efg'))
-bl.append('hi')                     // bl will also accept & convert Strings
-bl.append(new Buffer('j'))
-bl.append(new Buffer([ 0x3, 0x4 ]))
-
-console.log(bl.length) // 12
-
-console.log(bl.slice(0, 10).toString('ascii')) // 'abcdefghij'
-console.log(bl.slice(3, 10).toString('ascii')) // 'defghij'
-console.log(bl.slice(3, 6).toString('ascii'))  // 'def'
-console.log(bl.slice(3, 8).toString('ascii'))  // 'defgh'
-console.log(bl.slice(5, 10).toString('ascii')) // 'fghij'
-
-// or just use toString!
-console.log(bl.toString())               // 'abcdefghij\u0003\u0004'
-console.log(bl.toString('ascii', 3, 8))  // 'defgh'
-console.log(bl.toString('ascii', 5, 10)) // 'fghij'
-
-// other standard Buffer readables
-console.log(bl.readUInt16BE(10)) // 0x0304
-console.log(bl.readUInt16LE(10)) // 0x0403
-```
-
-Give it a callback in the constructor and use it just like **[concat-stream](https://github.com/maxogden/node-concat-stream)**:
-
-```js
-const bl = require('bl')
-    , fs = require('fs')
-
-fs.createReadStream('README.md')
-  .pipe(bl(function (err, data) { // note 'new' isn't strictly required
-    // `data` is a complete Buffer object containing the full data
-    console.log(data.toString())
-  }))
-```
-
-Note that when you use the *callback* method like this, the resulting `data` parameter is a concatenation of all `Buffer` objects in the list. If you want to avoid the overhead of this concatenation (in cases of extreme performance consciousness), then avoid the *callback* method and just listen to `'end'` instead, like a standard Stream.
-
-Or to fetch a URL using [hyperquest](https://github.com/substack/hyperquest) (should work with [request](http://github.com/mikeal/request) and even plain Node http too!):
-```js
-const hyperquest = require('hyperquest')
-    , bl         = require('bl')
-    , url        = 'https://raw.github.com/rvagg/bl/master/README.md'
-
-hyperquest(url).pipe(bl(function (err, data) {
-  console.log(data.toString())
-}))
-```
-
-Or, use it as a readable stream to recompose a list of Buffers to an output source:
-
-```js
-const BufferList = require('bl')
-    , fs         = require('fs')
-
-var bl = new BufferList()
-bl.append(new Buffer('abcd'))
-bl.append(new Buffer('efg'))
-bl.append(new Buffer('hi'))
-bl.append(new Buffer('j'))
-
-bl.pipe(fs.createWriteStream('gibberish.txt'))
-```
-
-## API
-
-  * <a href="#ctor"><code><b>new BufferList([ callback ])</b></code></a>
-  * <a href="#length"><code>bl.<b>length</b></code></a>
-  * <a href="#append"><code>bl.<b>append(buffer)</b></code></a>
-  * <a href="#get"><code>bl.<b>get(index)</b></code></a>
-  * <a href="#slice"><code>bl.<b>slice([ start[, end ] ])</b></code></a>
-  * <a href="#copy"><code>bl.<b>copy(dest, [ destStart, [ srcStart [, srcEnd ] ] ])</b></code></a>
-  * <a href="#duplicate"><code>bl.<b>duplicate()</b></code></a>
-  * <a href="#consume"><code>bl.<b>consume(bytes)</b></code></a>
-  * <a href="#toString"><code>bl.<b>toString([encoding, [ start, [ end ]]])</b></code></a>
-  * <a href="#readXX"><code>bl.<b>readDoubleBE()</b></code>, <code>bl.<b>readDoubleLE()</b></code>, <code>bl.<b>readFloatBE()</b></code>, <code>bl.<b>readFloatLE()</b></code>, <code>bl.<b>readInt32BE()</b></code>, <code>bl.<b>readInt32LE()</b></code>, <code>bl.<b>readUInt32BE()</b></code>, <code>bl.<b>readUInt32LE()</b></code>, <code>bl.<b>readInt16BE()</b></code>, <code>bl.<b>readInt16LE()</b></code>, <code>bl.<b>readUInt16BE()</b></code>, <code>bl.<b>readUInt16LE()</b></code>, <code>bl.<b>readInt8()</b></code>, <code>bl.<b>readUInt8()</b></code></a>
-  * <a href="#streams">Streams</a>
-
---------------------------------------------------------
-<a name="ctor"></a>
-### new BufferList([ callback | Buffer | Buffer array | BufferList | BufferList array | String ])
-The constructor takes an optional callback, if supplied, the callback will be called with an error argument followed by a reference to the **bl** instance, when `bl.end()` is called (i.e. from a piped stream). This is a convenient method of collecting the entire contents of a stream, particularly when the stream is *chunky*, such as a network stream.
-
-Normally, no arguments are required for the constructor, but you can initialise the list by passing in a single `Buffer` object or an array of `Buffer` object.
-
-`new` is not strictly required, if you don't instantiate a new object, it will be done automatically for you so you can create a new instance simply with:
-
-```js
-var bl = require('bl')
-var myinstance = bl()
-
-// equivilant to:
-
-var BufferList = require('bl')
-var myinstance = new BufferList()
-```
-
---------------------------------------------------------
-<a name="length"></a>
-### bl.length
-Get the length of the list in bytes. This is the sum of the lengths of all of the buffers contained in the list, minus any initial offset for a semi-consumed buffer at the beginning. Should accurately represent the total number of bytes that can be read from the list.
-
---------------------------------------------------------
-<a name="append"></a>
-### bl.append(Buffer | Buffer array | BufferList | BufferList array | String)
-`append(buffer)` adds an additional buffer or BufferList to the internal list. `this` is returned so it can be chained.
-
---------------------------------------------------------
-<a name="get"></a>
-### bl.get(index)
-`get()` will return the byte at the specified index.
-
---------------------------------------------------------
-<a name="slice"></a>
-### bl.slice([ start, [ end ] ])
-`slice()` returns a new `Buffer` object containing the bytes within the range specified. Both `start` and `end` are optional and will default to the beginning and end of the list respectively.
-
-If the requested range spans a single internal buffer then a slice of that buffer will be returned which shares the original memory range of that Buffer. If the range spans multiple buffers then copy operations will likely occur to give you a uniform Buffer.
-
---------------------------------------------------------
-<a name="copy"></a>
-### bl.copy(dest, [ destStart, [ srcStart [, srcEnd ] ] ])
-`copy()` copies the content of the list in the `dest` buffer, starting from `destStart` and containing the bytes within the range specified with `srcStart` to `srcEnd`. `destStart`, `start` and `end` are optional and will default to the beginning of the `dest` buffer, and the beginning and end of the list respectively.
-
---------------------------------------------------------
-<a name="duplicate"></a>
-### bl.duplicate()
-`duplicate()` performs a **shallow-copy** of the list. The internal Buffers remains the same, so if you change the underlying Buffers, the change will be reflected in both the original and the duplicate. This method is needed if you want to call `consume()` or `pipe()` and still keep the original list.Example:
-
-```js
-var bl = new BufferList()
-
-bl.append('hello')
-bl.append(' world')
-bl.append('\n')
-
-bl.duplicate().pipe(process.stdout, { end: false })
-
-console.log(bl.toString())
-```
-
---------------------------------------------------------
-<a name="consume"></a>
-### bl.consume(bytes)
-`consume()` will shift bytes *off the start of the list*. The number of bytes consumed don't need to line up with the sizes of the internal Buffers&mdash;initial offsets will be calculated accordingly in order to give you a consistent view of the data.
-
---------------------------------------------------------
-<a name="toString"></a>
-### bl.toString([encoding, [ start, [ end ]]])
-`toString()` will return a string representation of the buffer. The optional `start` and `end` arguments are passed on to `slice()`, while the `encoding` is passed on to `toString()` of the resulting Buffer. See the [Buffer#toString()](http://nodejs.org/docs/latest/api/buffer.html#buffer_buf_tostring_encoding_start_end) documentation for more information.
-
---------------------------------------------------------
-<a name="readXX"></a>
-### bl.readDoubleBE(), bl.readDoubleLE(), bl.readFloatBE(), bl.readFloatLE(), bl.readInt32BE(), bl.readInt32LE(), bl.readUInt32BE(), bl.readUInt32LE(), bl.readInt16BE(), bl.readInt16LE(), bl.readUInt16BE(), bl.readUInt16LE(), bl.readInt8(), bl.readUInt8()
-
-All of the standard byte-reading methods of the `Buffer` interface are implemented and will operate across internal Buffer boundaries transparently.
-
-See the <b><code>[Buffer](http://nodejs.org/docs/latest/api/buffer.html)</code></b> documentation for how these work.
-
---------------------------------------------------------
-<a name="streams"></a>
-### Streams
-**bl** is a Node **[Duplex Stream](http://nodejs.org/docs/latest/api/stream.html#stream_class_stream_duplex)**, so it can be read from and written to like a standard Node stream. You can also `pipe()` to and from a **bl** instance.
-
---------------------------------------------------------
-
-## Contributors
-
-**bl** is brought to you by the following hackers:
-
- * [Rod Vagg](https://github.com/rvagg)
- * [Matteo Collina](https://github.com/mcollina)
- * [Jarett Cruger](https://github.com/jcrugzz)
-
-=======
-
-<a name="license"></a>
-## License &amp; copyright
-
-Copyright (c) 2013-2014 bl contributors (listed above).
-
-bl is licensed under the MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE.md file for more details.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/bl.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/bl.js
deleted file mode 100644
index f585df1721798f6580e5612bc0725d3fac4afbd9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/bl.js
+++ /dev/null
@@ -1,243 +0,0 @@
-var DuplexStream = require('readable-stream/duplex')
-  , util         = require('util')
-
-
-function BufferList (callback) {
-  if (!(this instanceof BufferList))
-    return new BufferList(callback)
-
-  this._bufs  = []
-  this.length = 0
-
-  if (typeof callback == 'function') {
-    this._callback = callback
-
-    var piper = function piper (err) {
-      if (this._callback) {
-        this._callback(err)
-        this._callback = null
-      }
-    }.bind(this)
-
-    this.on('pipe', function onPipe (src) {
-      src.on('error', piper)
-    })
-    this.on('unpipe', function onUnpipe (src) {
-      src.removeListener('error', piper)
-    })
-  } else {
-    this.append(callback)
-  }
-
-  DuplexStream.call(this)
-}
-
-
-util.inherits(BufferList, DuplexStream)
-
-
-BufferList.prototype._offset = function _offset (offset) {
-  var tot = 0, i = 0, _t
-  for (; i < this._bufs.length; i++) {
-    _t = tot + this._bufs[i].length
-    if (offset < _t)
-      return [ i, offset - tot ]
-    tot = _t
-  }
-}
-
-
-BufferList.prototype.append = function append (buf) {
-  var i = 0
-    , newBuf
-
-  if (Array.isArray(buf)) {
-    for (; i < buf.length; i++)
-      this.append(buf[i])
-  } else if (buf instanceof BufferList) {
-    // unwrap argument into individual BufferLists
-    for (; i < buf._bufs.length; i++)
-      this.append(buf._bufs[i])
-  } else if (buf != null) {
-    // coerce number arguments to strings, since Buffer(number) does
-    // uninitialized memory allocation
-    if (typeof buf == 'number')
-      buf = buf.toString()
-
-    newBuf = Buffer.isBuffer(buf) ? buf : new Buffer(buf)
-    this._bufs.push(newBuf)
-    this.length += newBuf.length
-  }
-
-  return this
-}
-
-
-BufferList.prototype._write = function _write (buf, encoding, callback) {
-  this.append(buf)
-
-  if (typeof callback == 'function')
-    callback()
-}
-
-
-BufferList.prototype._read = function _read (size) {
-  if (!this.length)
-    return this.push(null)
-
-  size = Math.min(size, this.length)
-  this.push(this.slice(0, size))
-  this.consume(size)
-}
-
-
-BufferList.prototype.end = function end (chunk) {
-  DuplexStream.prototype.end.call(this, chunk)
-
-  if (this._callback) {
-    this._callback(null, this.slice())
-    this._callback = null
-  }
-}
-
-
-BufferList.prototype.get = function get (index) {
-  return this.slice(index, index + 1)[0]
-}
-
-
-BufferList.prototype.slice = function slice (start, end) {
-  return this.copy(null, 0, start, end)
-}
-
-
-BufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {
-  if (typeof srcStart != 'number' || srcStart < 0)
-    srcStart = 0
-  if (typeof srcEnd != 'number' || srcEnd > this.length)
-    srcEnd = this.length
-  if (srcStart >= this.length)
-    return dst || new Buffer(0)
-  if (srcEnd <= 0)
-    return dst || new Buffer(0)
-
-  var copy   = !!dst
-    , off    = this._offset(srcStart)
-    , len    = srcEnd - srcStart
-    , bytes  = len
-    , bufoff = (copy && dstStart) || 0
-    , start  = off[1]
-    , l
-    , i
-
-  // copy/slice everything
-  if (srcStart === 0 && srcEnd == this.length) {
-    if (!copy) // slice, just return a full concat
-      return Buffer.concat(this._bufs)
-
-    // copy, need to copy individual buffers
-    for (i = 0; i < this._bufs.length; i++) {
-      this._bufs[i].copy(dst, bufoff)
-      bufoff += this._bufs[i].length
-    }
-
-    return dst
-  }
-
-  // easy, cheap case where it's a subset of one of the buffers
-  if (bytes <= this._bufs[off[0]].length - start) {
-    return copy
-      ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes)
-      : this._bufs[off[0]].slice(start, start + bytes)
-  }
-
-  if (!copy) // a slice, we need something to copy in to
-    dst = new Buffer(len)
-
-  for (i = off[0]; i < this._bufs.length; i++) {
-    l = this._bufs[i].length - start
-
-    if (bytes > l) {
-      this._bufs[i].copy(dst, bufoff, start)
-    } else {
-      this._bufs[i].copy(dst, bufoff, start, start + bytes)
-      break
-    }
-
-    bufoff += l
-    bytes -= l
-
-    if (start)
-      start = 0
-  }
-
-  return dst
-}
-
-BufferList.prototype.toString = function toString (encoding, start, end) {
-  return this.slice(start, end).toString(encoding)
-}
-
-BufferList.prototype.consume = function consume (bytes) {
-  while (this._bufs.length) {
-    if (bytes >= this._bufs[0].length) {
-      bytes -= this._bufs[0].length
-      this.length -= this._bufs[0].length
-      this._bufs.shift()
-    } else {
-      this._bufs[0] = this._bufs[0].slice(bytes)
-      this.length -= bytes
-      break
-    }
-  }
-  return this
-}
-
-
-BufferList.prototype.duplicate = function duplicate () {
-  var i = 0
-    , copy = new BufferList()
-
-  for (; i < this._bufs.length; i++)
-    copy.append(this._bufs[i])
-
-  return copy
-}
-
-
-BufferList.prototype.destroy = function destroy () {
-  this._bufs.length = 0
-  this.length = 0
-  this.push(null)
-}
-
-
-;(function () {
-  var methods = {
-      'readDoubleBE' : 8
-    , 'readDoubleLE' : 8
-    , 'readFloatBE'  : 4
-    , 'readFloatLE'  : 4
-    , 'readInt32BE'  : 4
-    , 'readInt32LE'  : 4
-    , 'readUInt32BE' : 4
-    , 'readUInt32LE' : 4
-    , 'readInt16BE'  : 2
-    , 'readInt16LE'  : 2
-    , 'readUInt16BE' : 2
-    , 'readUInt16LE' : 2
-    , 'readInt8'     : 1
-    , 'readUInt8'    : 1
-  }
-
-  for (var m in methods) {
-    (function (m) {
-      BufferList.prototype[m] = function (offset) {
-        return this.slice(offset, offset + methods[m])[m](0)
-      }
-    }(m))
-  }
-}())
-
-
-module.exports = BufferList
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.npmignore
deleted file mode 100644
index 38344f87a627666b74f24036111558589b0bf508..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-build/
-test/
-examples/
-fs.js
-zlib.js
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.travis.yml
deleted file mode 100644
index 1b82118460cfe4c398fc4b35041575353c3083be..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.travis.yml
+++ /dev/null
@@ -1,52 +0,0 @@
-sudo: false
-language: node_js
-before_install:
-  - npm install -g npm@2
-  - npm install -g npm
-notifications:
-  email: false
-matrix:
-  fast_finish: true
-  allow_failures:
-    - env: TASK=browser BROWSER_NAME=ipad BROWSER_VERSION="6.0..latest"
-    - env: TASK=browser BROWSER_NAME=iphone BROWSER_VERSION="6.0..latest"
-  include:
-  - node_js: '0.8'
-    env: TASK=test
-  - node_js: '0.10'
-    env: TASK=test
-  - node_js: '0.11'
-    env: TASK=test
-  - node_js: '0.12'
-    env: TASK=test
-  - node_js: 1
-    env: TASK=test
-  - node_js: 2
-    env: TASK=test
-  - node_js: 3
-    env: TASK=test
-  - node_js: 4
-    env: TASK=test
-  - node_js: 5
-    env: TASK=test
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=android BROWSER_VERSION="4.0..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=ie BROWSER_VERSION="9..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=opera BROWSER_VERSION="11..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=chrome BROWSER_VERSION="-3..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=firefox BROWSER_VERSION="-3..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=ipad BROWSER_VERSION="6.0..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=iphone BROWSER_VERSION="6.0..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=safari BROWSER_VERSION="5..latest"
-script: "npm run $TASK"
-env:
-  global:
-  - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc=
-  - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI=
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.zuul.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.zuul.yml
deleted file mode 100644
index 96d9cfbd38662f7c1bdd39471060f6179031db53..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/.zuul.yml
+++ /dev/null
@@ -1 +0,0 @@
-ui: tape
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/LICENSE
deleted file mode 100644
index e3d4e695a4cff2bf9c1da6c69841ca22bc9f0224..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright Joyent, Inc. and other Node contributors. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/README.md
deleted file mode 100644
index 86b95a3bf6df4e71a0666c6b4d4901cabe9df956..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# readable-stream
-
-***Node-core v5.8.0 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream)
-
-
-[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)
-[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)
-
-
-[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream)
-
-```bash
-npm install --save readable-stream
-```
-
-***Node-core streams for userland***
-
-This package is a mirror of the Streams2 and Streams3 implementations in
-Node-core, including [documentation](doc/stream.markdown).
-
-If you want to guarantee a stable streams base, regardless of what version of
-Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).
-
-As of version 2.0.0 **readable-stream** uses semantic versioning.  
-
-# Streams WG Team Members
-
-* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) &lt;christopher.s.dickinson@gmail.com&gt;
-  - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B
-* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) &lt;calvin.metcalf@gmail.com&gt;
-  - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242
-* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) &lt;rod@vagg.org&gt;
-  - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D
-* **Sam Newman** ([@sonewman](https://github.com/sonewman)) &lt;newmansam@outlook.com&gt;
-* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) &lt;mathiasbuus@gmail.com&gt;
-* **Domenic Denicola** ([@domenic](https://github.com/domenic)) &lt;d@domenic.me&gt;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/doc/stream.markdown b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/doc/stream.markdown
deleted file mode 100644
index 0bc3819e63b0251b01d55b7b05344580665374b8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/doc/stream.markdown
+++ /dev/null
@@ -1,1760 +0,0 @@
-# Stream
-
-    Stability: 2 - Stable
-
-A stream is an abstract interface implemented by various objects in
-Node.js. For example a [request to an HTTP server][http-incoming-message] is a
-stream, as is [`process.stdout`][]. Streams are readable, writable, or both. All
-streams are instances of [`EventEmitter`][].
-
-You can load the Stream base classes by doing `require('stream')`.
-There are base classes provided for [Readable][] streams, [Writable][]
-streams, [Duplex][] streams, and [Transform][] streams.
-
-This document is split up into 3 sections:
-
-1. The first section explains the parts of the API that you need to be
-   aware of to use streams in your programs.
-2. The second section explains the parts of the API that you need to
-   use if you implement your own custom streams yourself. The API is designed to
-   make this easy for you to do.
-3. The third section goes into more depth about how streams work,
-   including some of the internal mechanisms and functions that you
-   should probably not modify unless you definitely know what you are
-   doing.
-
-
-## API for Stream Consumers
-
-<!--type=misc-->
-
-Streams can be either [Readable][], [Writable][], or both ([Duplex][]).
-
-All streams are EventEmitters, but they also have other custom methods
-and properties depending on whether they are Readable, Writable, or
-Duplex.
-
-If a stream is both Readable and Writable, then it implements all of
-the methods and events. So, a [Duplex][] or [Transform][] stream is
-fully described by this API, though their implementation may be
-somewhat different.
-
-It is not necessary to implement Stream interfaces in order to consume
-streams in your programs. If you **are** implementing streaming
-interfaces in your own program, please also refer to
-[API for Stream Implementors][].
-
-Almost all Node.js programs, no matter how simple, use Streams in some
-way. Here is an example of using Streams in an Node.js program:
-
-```js
-const http = require('http');
-
-var server = http.createServer( (req, res) => {
-  // req is an http.IncomingMessage, which is a Readable Stream
-  // res is an http.ServerResponse, which is a Writable Stream
-
-  var body = '';
-  // we want to get the data as utf8 strings
-  // If you don't set an encoding, then you'll get Buffer objects
-  req.setEncoding('utf8');
-
-  // Readable streams emit 'data' events once a listener is added
-  req.on('data', (chunk) => {
-    body += chunk;
-  });
-
-  // the end event tells you that you have entire body
-  req.on('end', () => {
-    try {
-      var data = JSON.parse(body);
-    } catch (er) {
-      // uh oh!  bad json!
-      res.statusCode = 400;
-      return res.end(`error: ${er.message}`);
-    }
-
-    // write back something interesting to the user:
-    res.write(typeof data);
-    res.end();
-  });
-});
-
-server.listen(1337);
-
-// $ curl localhost:1337 -d '{}'
-// object
-// $ curl localhost:1337 -d '"foo"'
-// string
-// $ curl localhost:1337 -d 'not json'
-// error: Unexpected token o
-```
-
-### Class: stream.Duplex
-
-Duplex streams are streams that implement both the [Readable][] and
-[Writable][] interfaces.
-
-Examples of Duplex streams include:
-
-* [TCP sockets][]
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-
-### Class: stream.Readable
-
-<!--type=class-->
-
-The Readable stream interface is the abstraction for a *source* of
-data that you are reading from. In other words, data comes *out* of a
-Readable stream.
-
-A Readable stream will not start emitting data until you indicate that
-you are ready to receive it.
-
-Readable streams have two "modes": a **flowing mode** and a **paused
-mode**. When in flowing mode, data is read from the underlying system
-and provided to your program as fast as possible. In paused mode, you
-must explicitly call [`stream.read()`][stream-read] to get chunks of data out.
-Streams start out in paused mode.
-
-**Note**: If no data event handlers are attached, and there are no
-[`stream.pipe()`][] destinations, and the stream is switched into flowing
-mode, then data will be lost.
-
-You can switch to flowing mode by doing any of the following:
-
-* Adding a [`'data'`][] event handler to listen for data.
-* Calling the [`stream.resume()`][stream-resume] method to explicitly open the
-  flow.
-* Calling the [`stream.pipe()`][] method to send the data to a [Writable][].
-
-You can switch back to paused mode by doing either of the following:
-
-* If there are no pipe destinations, by calling the
-  [`stream.pause()`][stream-pause] method.
-* If there are pipe destinations, by removing any [`'data'`][] event
-  handlers, and removing all pipe destinations by calling the
-  [`stream.unpipe()`][] method.
-
-Note that, for backwards compatibility reasons, removing [`'data'`][]
-event handlers will **not** automatically pause the stream. Also, if
-there are piped destinations, then calling [`stream.pause()`][stream-pause] will
-not guarantee that the stream will *remain* paused once those
-destinations drain and ask for more data.
-
-Examples of readable streams include:
-
-* [HTTP responses, on the client][http-incoming-message]
-* [HTTP requests, on the server][http-incoming-message]
-* [fs read streams][]
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-* [TCP sockets][]
-* [child process stdout and stderr][]
-* [`process.stdin`][]
-
-#### Event: 'close'
-
-Emitted when the stream and any of its underlying resources (a file
-descriptor, for example) have been closed. The event indicates that
-no more events will be emitted, and no further computation will occur.
-
-Not all streams will emit the `'close'` event.
-
-#### Event: 'data'
-
-* `chunk` {Buffer|String} The chunk of data.
-
-Attaching a `'data'` event listener to a stream that has not been
-explicitly paused will switch the stream into flowing mode. Data will
-then be passed as soon as it is available.
-
-If you just want to get all the data out of the stream as fast as
-possible, this is the best way to do so.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('data', (chunk) => {
-  console.log('got %d bytes of data', chunk.length);
-});
-```
-
-#### Event: 'end'
-
-This event fires when there will be no more data to read.
-
-Note that the `'end'` event **will not fire** unless the data is
-completely consumed. This can be done by switching into flowing mode,
-or by calling [`stream.read()`][stream-read] repeatedly until you get to the
-end.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('data', (chunk) => {
-  console.log('got %d bytes of data', chunk.length);
-});
-readable.on('end', () => {
-  console.log('there will be no more data.');
-});
-```
-
-#### Event: 'error'
-
-* {Error Object}
-
-Emitted if there was an error receiving data.
-
-#### Event: 'readable'
-
-When a chunk of data can be read from the stream, it will emit a
-`'readable'` event.
-
-In some cases, listening for a `'readable'` event will cause some data
-to be read into the internal buffer from the underlying system, if it
-hadn't already.
-
-```javascript
-var readable = getReadableStreamSomehow();
-readable.on('readable', () => {
-  // there is some data to read now
-});
-```
-
-Once the internal buffer is drained, a `'readable'` event will fire
-again when more data is available.
-
-The `'readable'` event is not emitted in the "flowing" mode with the
-sole exception of the last one, on end-of-stream.
-
-The `'readable'` event indicates that the stream has new information:
-either new data is available or the end of the stream has been reached.
-In the former case, [`stream.read()`][stream-read] will return that data. In the
-latter case, [`stream.read()`][stream-read] will return null. For instance, in
-the following example, `foo.txt` is an empty file:
-
-```js
-const fs = require('fs');
-var rr = fs.createReadStream('foo.txt');
-rr.on('readable', () => {
-  console.log('readable:', rr.read());
-});
-rr.on('end', () => {
-  console.log('end');
-});
-```
-
-The output of running this script is:
-
-```
-$ node test.js
-readable: null
-end
-```
-
-#### readable.isPaused()
-
-* Return: {Boolean}
-
-This method returns whether or not the `readable` has been **explicitly**
-paused by client code (using [`stream.pause()`][stream-pause] without a
-corresponding [`stream.resume()`][stream-resume]).
-
-```js
-var readable = new stream.Readable
-
-readable.isPaused() // === false
-readable.pause()
-readable.isPaused() // === true
-readable.resume()
-readable.isPaused() // === false
-```
-
-#### readable.pause()
-
-* Return: `this`
-
-This method will cause a stream in flowing mode to stop emitting
-[`'data'`][] events, switching out of flowing mode. Any data that becomes
-available will remain in the internal buffer.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('data', (chunk) => {
-  console.log('got %d bytes of data', chunk.length);
-  readable.pause();
-  console.log('there will be no more data for 1 second');
-  setTimeout(() => {
-    console.log('now data will start flowing again');
-    readable.resume();
-  }, 1000);
-});
-```
-
-#### readable.pipe(destination[, options])
-
-* `destination` {stream.Writable} The destination for writing data
-* `options` {Object} Pipe options
-  * `end` {Boolean} End the writer when the reader ends. Default = `true`
-
-This method pulls all the data out of a readable stream, and writes it
-to the supplied destination, automatically managing the flow so that
-the destination is not overwhelmed by a fast readable stream.
-
-Multiple destinations can be piped to safely.
-
-```js
-var readable = getReadableStreamSomehow();
-var writable = fs.createWriteStream('file.txt');
-// All the data from readable goes into 'file.txt'
-readable.pipe(writable);
-```
-
-This function returns the destination stream, so you can set up pipe
-chains like so:
-
-```js
-var r = fs.createReadStream('file.txt');
-var z = zlib.createGzip();
-var w = fs.createWriteStream('file.txt.gz');
-r.pipe(z).pipe(w);
-```
-
-For example, emulating the Unix `cat` command:
-
-```js
-process.stdin.pipe(process.stdout);
-```
-
-By default [`stream.end()`][stream-end] is called on the destination when the
-source stream emits [`'end'`][], so that `destination` is no longer writable.
-Pass `{ end: false }` as `options` to keep the destination stream open.
-
-This keeps `writer` open so that "Goodbye" can be written at the
-end.
-
-```js
-reader.pipe(writer, { end: false });
-reader.on('end', () => {
-  writer.end('Goodbye\n');
-});
-```
-
-Note that [`process.stderr`][] and [`process.stdout`][] are never closed until
-the process exits, regardless of the specified options.
-
-#### readable.read([size])
-
-* `size` {Number} Optional argument to specify how much data to read.
-* Return {String|Buffer|Null}
-
-The `read()` method pulls some data out of the internal buffer and
-returns it. If there is no data available, then it will return
-`null`.
-
-If you pass in a `size` argument, then it will return that many
-bytes. If `size` bytes are not available, then it will return `null`,
-unless we've ended, in which case it will return the data remaining
-in the buffer.
-
-If you do not specify a `size` argument, then it will return all the
-data in the internal buffer.
-
-This method should only be called in paused mode. In flowing mode,
-this method is called automatically until the internal buffer is
-drained.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('readable', () => {
-  var chunk;
-  while (null !== (chunk = readable.read())) {
-    console.log('got %d bytes of data', chunk.length);
-  }
-});
-```
-
-If this method returns a data chunk, then it will also trigger the
-emission of a [`'data'`][] event.
-
-Note that calling [`stream.read([size])`][stream-read] after the [`'end'`][]
-event has been triggered will return `null`. No runtime error will be raised.
-
-#### readable.resume()
-
-* Return: `this`
-
-This method will cause the readable stream to resume emitting [`'data'`][]
-events.
-
-This method will switch the stream into flowing mode. If you do *not*
-want to consume the data from a stream, but you *do* want to get to
-its [`'end'`][] event, you can call [`stream.resume()`][stream-resume] to open
-the flow of data.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.resume();
-readable.on('end', () => {
-  console.log('got to the end, but did not read anything');
-});
-```
-
-#### readable.setEncoding(encoding)
-
-* `encoding` {String} The encoding to use.
-* Return: `this`
-
-Call this function to cause the stream to return strings of the specified
-encoding instead of Buffer objects. For example, if you do
-`readable.setEncoding('utf8')`, then the output data will be interpreted as
-UTF-8 data, and returned as strings. If you do `readable.setEncoding('hex')`,
-then the data will be encoded in hexadecimal string format.
-
-This properly handles multi-byte characters that would otherwise be
-potentially mangled if you simply pulled the Buffers directly and
-called [`buf.toString(encoding)`][] on them. If you want to read the data
-as strings, always use this method.
-
-Also you can disable any encoding at all with `readable.setEncoding(null)`.
-This approach is very useful if you deal with binary data or with large
-multi-byte strings spread out over multiple chunks.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.setEncoding('utf8');
-readable.on('data', (chunk) => {
-  assert.equal(typeof chunk, 'string');
-  console.log('got %d characters of string data', chunk.length);
-});
-```
-
-#### readable.unpipe([destination])
-
-* `destination` {stream.Writable} Optional specific stream to unpipe
-
-This method will remove the hooks set up for a previous [`stream.pipe()`][]
-call.
-
-If the destination is not specified, then all pipes are removed.
-
-If the destination is specified, but no pipe is set up for it, then
-this is a no-op.
-
-```js
-var readable = getReadableStreamSomehow();
-var writable = fs.createWriteStream('file.txt');
-// All the data from readable goes into 'file.txt',
-// but only for the first second
-readable.pipe(writable);
-setTimeout(() => {
-  console.log('stop writing to file.txt');
-  readable.unpipe(writable);
-  console.log('manually close the file stream');
-  writable.end();
-}, 1000);
-```
-
-#### readable.unshift(chunk)
-
-* `chunk` {Buffer|String} Chunk of data to unshift onto the read queue
-
-This is useful in certain cases where a stream is being consumed by a
-parser, which needs to "un-consume" some data that it has
-optimistically pulled out of the source, so that the stream can be
-passed on to some other party.
-
-Note that `stream.unshift(chunk)` cannot be called after the [`'end'`][] event
-has been triggered; a runtime error will be raised.
-
-If you find that you must often call `stream.unshift(chunk)` in your
-programs, consider implementing a [Transform][] stream instead. (See [API
-for Stream Implementors][].)
-
-```js
-// Pull off a header delimited by \n\n
-// use unshift() if we get too much
-// Call the callback with (error, header, stream)
-const StringDecoder = require('string_decoder').StringDecoder;
-function parseHeader(stream, callback) {
-  stream.on('error', callback);
-  stream.on('readable', onReadable);
-  var decoder = new StringDecoder('utf8');
-  var header = '';
-  function onReadable() {
-    var chunk;
-    while (null !== (chunk = stream.read())) {
-      var str = decoder.write(chunk);
-      if (str.match(/\n\n/)) {
-        // found the header boundary
-        var split = str.split(/\n\n/);
-        header += split.shift();
-        var remaining = split.join('\n\n');
-        var buf = new Buffer(remaining, 'utf8');
-        if (buf.length)
-          stream.unshift(buf);
-        stream.removeListener('error', callback);
-        stream.removeListener('readable', onReadable);
-        // now the body of the message can be read from the stream.
-        callback(null, header, stream);
-      } else {
-        // still reading the header.
-        header += str;
-      }
-    }
-  }
-}
-```
-
-Note that, unlike [`stream.push(chunk)`][stream-push], `stream.unshift(chunk)`
-will not end the reading process by resetting the internal reading state of the
-stream. This can cause unexpected results if `unshift()` is called during a
-read (i.e. from within a [`stream._read()`][stream-_read] implementation on a
-custom stream). Following the call to `unshift()` with an immediate
-[`stream.push('')`][stream-push] will reset the reading state appropriately,
-however it is best to simply avoid calling `unshift()` while in the process of
-performing a read.
-
-#### readable.wrap(stream)
-
-* `stream` {Stream} An "old style" readable stream
-
-Versions of Node.js prior to v0.10 had streams that did not implement the
-entire Streams API as it is today. (See [Compatibility][] for
-more information.)
-
-If you are using an older Node.js library that emits [`'data'`][] events and
-has a [`stream.pause()`][stream-pause] method that is advisory only, then you
-can use the `wrap()` method to create a [Readable][] stream that uses the old
-stream as its data source.
-
-You will very rarely ever need to call this function, but it exists
-as a convenience for interacting with old Node.js programs and libraries.
-
-For example:
-
-```js
-const OldReader = require('./old-api-module.js').OldReader;
-const Readable = require('stream').Readable;
-const oreader = new OldReader;
-const myReader = new Readable().wrap(oreader);
-
-myReader.on('readable', () => {
-  myReader.read(); // etc.
-});
-```
-
-### Class: stream.Transform
-
-Transform streams are [Duplex][] streams where the output is in some way
-computed from the input. They implement both the [Readable][] and
-[Writable][] interfaces.
-
-Examples of Transform streams include:
-
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-
-### Class: stream.Writable
-
-<!--type=class-->
-
-The Writable stream interface is an abstraction for a *destination*
-that you are writing data *to*.
-
-Examples of writable streams include:
-
-* [HTTP requests, on the client][]
-* [HTTP responses, on the server][]
-* [fs write streams][]
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-* [TCP sockets][]
-* [child process stdin][]
-* [`process.stdout`][], [`process.stderr`][]
-
-#### Event: 'drain'
-
-If a [`stream.write(chunk)`][stream-write] call returns `false`, then the
-`'drain'` event will indicate when it is appropriate to begin writing more data
-to the stream.
-
-```js
-// Write the data to the supplied writable stream one million times.
-// Be attentive to back-pressure.
-function writeOneMillionTimes(writer, data, encoding, callback) {
-  var i = 1000000;
-  write();
-  function write() {
-    var ok = true;
-    do {
-      i -= 1;
-      if (i === 0) {
-        // last time!
-        writer.write(data, encoding, callback);
-      } else {
-        // see if we should continue, or wait
-        // don't pass the callback, because we're not done yet.
-        ok = writer.write(data, encoding);
-      }
-    } while (i > 0 && ok);
-    if (i > 0) {
-      // had to stop early!
-      // write some more once it drains
-      writer.once('drain', write);
-    }
-  }
-}
-```
-
-#### Event: 'error'
-
-* {Error}
-
-Emitted if there was an error when writing or piping data.
-
-#### Event: 'finish'
-
-When the [`stream.end()`][stream-end] method has been called, and all data has
-been flushed to the underlying system, this event is emitted.
-
-```javascript
-var writer = getWritableStreamSomehow();
-for (var i = 0; i < 100; i ++) {
-  writer.write('hello, #${i}!\n');
-}
-writer.end('this is the end\n');
-writer.on('finish', () => {
-  console.error('all writes are now complete.');
-});
-```
-
-#### Event: 'pipe'
-
-* `src` {stream.Readable} source stream that is piping to this writable
-
-This is emitted whenever the [`stream.pipe()`][] method is called on a readable
-stream, adding this writable to its set of destinations.
-
-```js
-var writer = getWritableStreamSomehow();
-var reader = getReadableStreamSomehow();
-writer.on('pipe', (src) => {
-  console.error('something is piping into the writer');
-  assert.equal(src, reader);
-});
-reader.pipe(writer);
-```
-
-#### Event: 'unpipe'
-
-* `src` {[Readable][] Stream} The source stream that
-  [unpiped][`stream.unpipe()`] this writable
-
-This is emitted whenever the [`stream.unpipe()`][] method is called on a
-readable stream, removing this writable from its set of destinations.
-
-```js
-var writer = getWritableStreamSomehow();
-var reader = getReadableStreamSomehow();
-writer.on('unpipe', (src) => {
-  console.error('something has stopped piping into the writer');
-  assert.equal(src, reader);
-});
-reader.pipe(writer);
-reader.unpipe(writer);
-```
-
-#### writable.cork()
-
-Forces buffering of all writes.
-
-Buffered data will be flushed either at [`stream.uncork()`][] or at
-[`stream.end()`][stream-end] call.
-
-#### writable.end([chunk][, encoding][, callback])
-
-* `chunk` {String|Buffer} Optional data to write
-* `encoding` {String} The encoding, if `chunk` is a String
-* `callback` {Function} Optional callback for when the stream is finished
-
-Call this method when no more data will be written to the stream. If supplied,
-the callback is attached as a listener on the [`'finish'`][] event.
-
-Calling [`stream.write()`][stream-write] after calling
-[`stream.end()`][stream-end] will raise an error.
-
-```js
-// write 'hello, ' and then end with 'world!'
-var file = fs.createWriteStream('example.txt');
-file.write('hello, ');
-file.end('world!');
-// writing more now is not allowed!
-```
-
-#### writable.setDefaultEncoding(encoding)
-
-* `encoding` {String} The new default encoding
-
-Sets the default encoding for a writable stream.
-
-#### writable.uncork()
-
-Flush all data, buffered since [`stream.cork()`][] call.
-
-#### writable.write(chunk[, encoding][, callback])
-
-* `chunk` {String|Buffer} The data to write
-* `encoding` {String} The encoding, if `chunk` is a String
-* `callback` {Function} Callback for when this chunk of data is flushed
-* Returns: {Boolean} `true` if the data was handled completely.
-
-This method writes some data to the underlying system, and calls the
-supplied callback once the data has been fully handled.
-
-The return value indicates if you should continue writing right now.
-If the data had to be buffered internally, then it will return
-`false`. Otherwise, it will return `true`.
-
-This return value is strictly advisory. You MAY continue to write,
-even if it returns `false`. However, writes will be buffered in
-memory, so it is best not to do this excessively. Instead, wait for
-the [`'drain'`][] event before writing more data.
-
-
-## API for Stream Implementors
-
-<!--type=misc-->
-
-To implement any sort of stream, the pattern is the same:
-
-1. Extend the appropriate parent class in your own subclass. (The
-   [`util.inherits()`][] method is particularly helpful for this.)
-2. Call the appropriate parent class constructor in your constructor,
-   to be sure that the internal mechanisms are set up properly.
-3. Implement one or more specific methods, as detailed below.
-
-The class to extend and the method(s) to implement depend on the sort
-of stream class you are writing:
-
-<table>
-  <thead>
-    <tr>
-      <th>
-        <p>Use-case</p>
-      </th>
-      <th>
-        <p>Class</p>
-      </th>
-      <th>
-        <p>Method(s) to implement</p>
-      </th>
-    </tr>
-  </thead>
-  <tr>
-    <td>
-      <p>Reading only</p>
-    </td>
-    <td>
-      <p>[Readable](#stream_class_stream_readable_1)</p>
-    </td>
-    <td>
-      <p><code>[_read][stream-_read]</code></p>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <p>Writing only</p>
-    </td>
-    <td>
-      <p>[Writable](#stream_class_stream_writable_1)</p>
-    </td>
-    <td>
-      <p><code>[_write][stream-_write]</code>, <code>[_writev][stream-_writev]</code></p>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <p>Reading and writing</p>
-    </td>
-    <td>
-      <p>[Duplex](#stream_class_stream_duplex_1)</p>
-    </td>
-    <td>
-      <p><code>[_read][stream-_read]</code>, <code>[_write][stream-_write]</code>, <code>[_writev][stream-_writev]</code></p>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <p>Operate on written data, then read the result</p>
-    </td>
-    <td>
-      <p>[Transform](#stream_class_stream_transform_1)</p>
-    </td>
-    <td>
-      <p><code>[_transform][stream-_transform]</code>, <code>[_flush][stream-_flush]</code></p>
-    </td>
-  </tr>
-</table>
-
-In your implementation code, it is very important to never call the methods
-described in [API for Stream Consumers][]. Otherwise, you can potentially cause
-adverse side effects in programs that consume your streaming interfaces.
-
-### Class: stream.Duplex
-
-<!--type=class-->
-
-A "duplex" stream is one that is both Readable and Writable, such as a TCP
-socket connection.
-
-Note that `stream.Duplex` is an abstract class designed to be extended
-with an underlying implementation of the [`stream._read(size)`][stream-_read]
-and [`stream._write(chunk, encoding, callback)`][stream-_write] methods as you
-would with a Readable or Writable stream class.
-
-Since JavaScript doesn't have multiple prototypal inheritance, this class
-prototypally inherits from Readable, and then parasitically from Writable. It is
-thus up to the user to implement both the low-level
-[`stream._read(n)`][stream-_read] method as well as the low-level
-[`stream._write(chunk, encoding, callback)`][stream-_write] method on extension
-duplex classes.
-
-#### new stream.Duplex(options)
-
-* `options` {Object} Passed to both Writable and Readable
-  constructors. Also has the following fields:
-  * `allowHalfOpen` {Boolean} Default = `true`. If set to `false`, then
-    the stream will automatically end the readable side when the
-    writable side ends and vice versa.
-  * `readableObjectMode` {Boolean} Default = `false`. Sets `objectMode`
-    for readable side of the stream. Has no effect if `objectMode`
-    is `true`.
-  * `writableObjectMode` {Boolean} Default = `false`. Sets `objectMode`
-    for writable side of the stream. Has no effect if `objectMode`
-    is `true`.
-
-In classes that extend the Duplex class, make sure to call the
-constructor so that the buffering settings can be properly
-initialized.
-
-### Class: stream.PassThrough
-
-This is a trivial implementation of a [Transform][] stream that simply
-passes the input bytes across to the output. Its purpose is mainly
-for examples and testing, but there are occasionally use cases where
-it can come in handy as a building block for novel sorts of streams.
-
-### Class: stream.Readable
-
-<!--type=class-->
-
-`stream.Readable` is an abstract class designed to be extended with an
-underlying implementation of the [`stream._read(size)`][stream-_read] method.
-
-Please see [API for Stream Consumers][] for how to consume
-streams in your programs. What follows is an explanation of how to
-implement Readable streams in your programs.
-
-#### new stream.Readable([options])
-
-* `options` {Object}
-  * `highWaterMark` {Number} The maximum number of bytes to store in
-    the internal buffer before ceasing to read from the underlying
-    resource. Default = `16384` (16kb), or `16` for `objectMode` streams
-  * `encoding` {String} If specified, then buffers will be decoded to
-    strings using the specified encoding. Default = `null`
-  * `objectMode` {Boolean} Whether this stream should behave
-    as a stream of objects. Meaning that [`stream.read(n)`][stream-read] returns
-    a single value instead of a Buffer of size n. Default = `false`
-  * `read` {Function} Implementation for the [`stream._read()`][stream-_read]
-    method.
-
-In classes that extend the Readable class, make sure to call the
-Readable constructor so that the buffering settings can be properly
-initialized.
-
-#### readable.\_read(size)
-
-* `size` {Number} Number of bytes to read asynchronously
-
-Note: **Implement this method, but do NOT call it directly.**
-
-This method is prefixed with an underscore because it is internal to the
-class that defines it and should only be called by the internal Readable
-class methods. All Readable stream implementations must provide a \_read
-method to fetch data from the underlying resource.
-
-When `_read()` is called, if data is available from the resource, the `_read()`
-implementation should start pushing that data into the read queue by calling
-[`this.push(dataChunk)`][stream-push]. `_read()` should continue reading from
-the resource and pushing data until push returns `false`, at which point it
-should stop reading from the resource. Only when `_read()` is called again after
-it has stopped should it start reading more data from the resource and pushing
-that data onto the queue.
-
-Note: once the `_read()` method is called, it will not be called again until
-the [`stream.push()`][stream-push] method is called.
-
-The `size` argument is advisory. Implementations where a "read" is a
-single call that returns data can use this to know how much data to
-fetch. Implementations where that is not relevant, such as TCP or
-TLS, may ignore this argument, and simply provide data whenever it
-becomes available. There is no need, for example to "wait" until
-`size` bytes are available before calling [`stream.push(chunk)`][stream-push].
-
-#### readable.push(chunk[, encoding])
-
-
-* `chunk` {Buffer|Null|String} Chunk of data to push into the read queue
-* `encoding` {String} Encoding of String chunks.  Must be a valid
-  Buffer encoding, such as `'utf8'` or `'ascii'`
-* return {Boolean} Whether or not more pushes should be performed
-
-Note: **This method should be called by Readable implementors, NOT
-by consumers of Readable streams.**
-
-If a value other than null is passed, The `push()` method adds a chunk of data
-into the queue for subsequent stream processors to consume. If `null` is
-passed, it signals the end of the stream (EOF), after which no more data
-can be written.
-
-The data added with `push()` can be pulled out by calling the
-[`stream.read()`][stream-read] method when the [`'readable'`][] event fires.
-
-This API is designed to be as flexible as possible. For example,
-you may be wrapping a lower-level source which has some sort of
-pause/resume mechanism, and a data callback. In those cases, you
-could wrap the low-level source object by doing something like this:
-
-```js
-// source is an object with readStop() and readStart() methods,
-// and an `ondata` member that gets called when it has data, and
-// an `onend` member that gets called when the data is over.
-
-util.inherits(SourceWrapper, Readable);
-
-function SourceWrapper(options) {
-  Readable.call(this, options);
-
-  this._source = getLowlevelSourceObject();
-
-  // Every time there's data, we push it into the internal buffer.
-  this._source.ondata = (chunk) => {
-    // if push() returns false, then we need to stop reading from source
-    if (!this.push(chunk))
-      this._source.readStop();
-  };
-
-  // When the source ends, we push the EOF-signaling `null` chunk
-  this._source.onend = () => {
-    this.push(null);
-  };
-}
-
-// _read will be called when the stream wants to pull more data in
-// the advisory size argument is ignored in this case.
-SourceWrapper.prototype._read = function(size) {
-  this._source.readStart();
-};
-```
-
-#### Example: A Counting Stream
-
-<!--type=example-->
-
-This is a basic example of a Readable stream. It emits the numerals
-from 1 to 1,000,000 in ascending order, and then ends.
-
-```js
-const Readable = require('stream').Readable;
-const util = require('util');
-util.inherits(Counter, Readable);
-
-function Counter(opt) {
-  Readable.call(this, opt);
-  this._max = 1000000;
-  this._index = 1;
-}
-
-Counter.prototype._read = function() {
-  var i = this._index++;
-  if (i > this._max)
-    this.push(null);
-  else {
-    var str = '' + i;
-    var buf = new Buffer(str, 'ascii');
-    this.push(buf);
-  }
-};
-```
-
-#### Example: SimpleProtocol v1 (Sub-optimal)
-
-This is similar to the `parseHeader` function described
-[here](#stream_readable_unshift_chunk), but implemented as a custom stream.
-Also, note that this implementation does not convert the incoming data to a
-string.
-
-However, this would be better implemented as a [Transform][] stream. See
-[SimpleProtocol v2][] for a better implementation.
-
-```js
-// A parser for a simple data protocol.
-// The "header" is a JSON object, followed by 2 \n characters, and
-// then a message body.
-//
-// NOTE: This can be done more simply as a Transform stream!
-// Using Readable directly for this is sub-optimal. See the
-// alternative example below under the Transform section.
-
-const Readable = require('stream').Readable;
-const util = require('util');
-
-util.inherits(SimpleProtocol, Readable);
-
-function SimpleProtocol(source, options) {
-  if (!(this instanceof SimpleProtocol))
-    return new SimpleProtocol(source, options);
-
-  Readable.call(this, options);
-  this._inBody = false;
-  this._sawFirstCr = false;
-
-  // source is a readable stream, such as a socket or file
-  this._source = source;
-
-  var self = this;
-  source.on('end', () => {
-    self.push(null);
-  });
-
-  // give it a kick whenever the source is readable
-  // read(0) will not consume any bytes
-  source.on('readable', () => {
-    self.read(0);
-  });
-
-  this._rawHeader = [];
-  this.header = null;
-}
-
-SimpleProtocol.prototype._read = function(n) {
-  if (!this._inBody) {
-    var chunk = this._source.read();
-
-    // if the source doesn't have data, we don't have data yet.
-    if (chunk === null)
-      return this.push('');
-
-    // check if the chunk has a \n\n
-    var split = -1;
-    for (var i = 0; i < chunk.length; i++) {
-      if (chunk[i] === 10) { // '\n'
-        if (this._sawFirstCr) {
-          split = i;
-          break;
-        } else {
-          this._sawFirstCr = true;
-        }
-      } else {
-        this._sawFirstCr = false;
-      }
-    }
-
-    if (split === -1) {
-      // still waiting for the \n\n
-      // stash the chunk, and try again.
-      this._rawHeader.push(chunk);
-      this.push('');
-    } else {
-      this._inBody = true;
-      var h = chunk.slice(0, split);
-      this._rawHeader.push(h);
-      var header = Buffer.concat(this._rawHeader).toString();
-      try {
-        this.header = JSON.parse(header);
-      } catch (er) {
-        this.emit('error', new Error('invalid simple protocol data'));
-        return;
-      }
-      // now, because we got some extra data, unshift the rest
-      // back into the read queue so that our consumer will see it.
-      var b = chunk.slice(split);
-      this.unshift(b);
-      // calling unshift by itself does not reset the reading state
-      // of the stream; since we're inside _read, doing an additional
-      // push('') will reset the state appropriately.
-      this.push('');
-
-      // and let them know that we are done parsing the header.
-      this.emit('header', this.header);
-    }
-  } else {
-    // from there on, just provide the data to our consumer.
-    // careful not to push(null), since that would indicate EOF.
-    var chunk = this._source.read();
-    if (chunk) this.push(chunk);
-  }
-};
-
-// Usage:
-// var parser = new SimpleProtocol(source);
-// Now parser is a readable stream that will emit 'header'
-// with the parsed header data.
-```
-
-### Class: stream.Transform
-
-A "transform" stream is a duplex stream where the output is causally
-connected in some way to the input, such as a [zlib][] stream or a
-[crypto][] stream.
-
-There is no requirement that the output be the same size as the input,
-the same number of chunks, or arrive at the same time. For example, a
-Hash stream will only ever have a single chunk of output which is
-provided when the input is ended. A zlib stream will produce output
-that is either much smaller or much larger than its input.
-
-Rather than implement the [`stream._read()`][stream-_read] and
-[`stream._write()`][stream-_write] methods, Transform classes must implement the
-[`stream._transform()`][stream-_transform] method, and may optionally
-also implement the [`stream._flush()`][stream-_flush] method. (See below.)
-
-#### new stream.Transform([options])
-
-* `options` {Object} Passed to both Writable and Readable
-  constructors. Also has the following fields:
-  * `transform` {Function} Implementation for the
-    [`stream._transform()`][stream-_transform] method.
-  * `flush` {Function} Implementation for the [`stream._flush()`][stream-_flush]
-    method.
-
-In classes that extend the Transform class, make sure to call the
-constructor so that the buffering settings can be properly
-initialized.
-
-#### Events: 'finish' and 'end'
-
-The [`'finish'`][] and [`'end'`][] events are from the parent Writable
-and Readable classes respectively. The `'finish'` event is fired after
-[`stream.end()`][stream-end] is called and all chunks have been processed by
-[`stream._transform()`][stream-_transform], `'end'` is fired after all data has
-been output which is after the callback in [`stream._flush()`][stream-_flush]
-has been called.
-
-#### transform.\_flush(callback)
-
-* `callback` {Function} Call this function (optionally with an error
-  argument) when you are done flushing any remaining data.
-
-Note: **This function MUST NOT be called directly.**  It MAY be implemented
-by child classes, and if so, will be called by the internal Transform
-class methods only.
-
-In some cases, your transform operation may need to emit a bit more
-data at the end of the stream. For example, a `Zlib` compression
-stream will store up some internal state so that it can optimally
-compress the output. At the end, however, it needs to do the best it
-can with what is left, so that the data will be complete.
-
-In those cases, you can implement a `_flush()` method, which will be
-called at the very end, after all the written data is consumed, but
-before emitting [`'end'`][] to signal the end of the readable side. Just
-like with [`stream._transform()`][stream-_transform], call
-`transform.push(chunk)` zero or more times, as appropriate, and call `callback`
-when the flush operation is complete.
-
-This method is prefixed with an underscore because it is internal to
-the class that defines it, and should not be called directly by user
-programs. However, you **are** expected to override this method in
-your own extension classes.
-
-#### transform.\_transform(chunk, encoding, callback)
-
-* `chunk` {Buffer|String} The chunk to be transformed. Will **always**
-  be a buffer unless the `decodeStrings` option was set to `false`.
-* `encoding` {String} If the chunk is a string, then this is the
-  encoding type. If chunk is a buffer, then this is the special
-  value - 'buffer', ignore it in this case.
-* `callback` {Function} Call this function (optionally with an error
-  argument and data) when you are done processing the supplied chunk.
-
-Note: **This function MUST NOT be called directly.**  It should be
-implemented by child classes, and called by the internal Transform
-class methods only.
-
-All Transform stream implementations must provide a `_transform()`
-method to accept input and produce output.
-
-`_transform()` should do whatever has to be done in this specific
-Transform class, to handle the bytes being written, and pass them off
-to the readable portion of the interface. Do asynchronous I/O,
-process things, and so on.
-
-Call `transform.push(outputChunk)` 0 or more times to generate output
-from this input chunk, depending on how much data you want to output
-as a result of this chunk.
-
-Call the callback function only when the current chunk is completely
-consumed. Note that there may or may not be output as a result of any
-particular input chunk. If you supply a second argument to the callback
-it will be passed to the push method. In other words the following are
-equivalent:
-
-```js
-transform.prototype._transform = function (data, encoding, callback) {
-  this.push(data);
-  callback();
-};
-
-transform.prototype._transform = function (data, encoding, callback) {
-  callback(null, data);
-};
-```
-
-This method is prefixed with an underscore because it is internal to
-the class that defines it, and should not be called directly by user
-programs. However, you **are** expected to override this method in
-your own extension classes.
-
-#### Example: `SimpleProtocol` parser v2
-
-The example [here](#stream_example_simpleprotocol_v1_sub_optimal) of a simple
-protocol parser can be implemented simply by using the higher level
-[Transform][] stream class, similar to the `parseHeader` and `SimpleProtocol
-v1` examples.
-
-In this example, rather than providing the input as an argument, it
-would be piped into the parser, which is a more idiomatic Node.js stream
-approach.
-
-```javascript
-const util = require('util');
-const Transform = require('stream').Transform;
-util.inherits(SimpleProtocol, Transform);
-
-function SimpleProtocol(options) {
-  if (!(this instanceof SimpleProtocol))
-    return new SimpleProtocol(options);
-
-  Transform.call(this, options);
-  this._inBody = false;
-  this._sawFirstCr = false;
-  this._rawHeader = [];
-  this.header = null;
-}
-
-SimpleProtocol.prototype._transform = function(chunk, encoding, done) {
-  if (!this._inBody) {
-    // check if the chunk has a \n\n
-    var split = -1;
-    for (var i = 0; i < chunk.length; i++) {
-      if (chunk[i] === 10) { // '\n'
-        if (this._sawFirstCr) {
-          split = i;
-          break;
-        } else {
-          this._sawFirstCr = true;
-        }
-      } else {
-        this._sawFirstCr = false;
-      }
-    }
-
-    if (split === -1) {
-      // still waiting for the \n\n
-      // stash the chunk, and try again.
-      this._rawHeader.push(chunk);
-    } else {
-      this._inBody = true;
-      var h = chunk.slice(0, split);
-      this._rawHeader.push(h);
-      var header = Buffer.concat(this._rawHeader).toString();
-      try {
-        this.header = JSON.parse(header);
-      } catch (er) {
-        this.emit('error', new Error('invalid simple protocol data'));
-        return;
-      }
-      // and let them know that we are done parsing the header.
-      this.emit('header', this.header);
-
-      // now, because we got some extra data, emit this first.
-      this.push(chunk.slice(split));
-    }
-  } else {
-    // from there on, just provide the data to our consumer as-is.
-    this.push(chunk);
-  }
-  done();
-};
-
-// Usage:
-// var parser = new SimpleProtocol();
-// source.pipe(parser)
-// Now parser is a readable stream that will emit 'header'
-// with the parsed header data.
-```
-
-### Class: stream.Writable
-
-<!--type=class-->
-
-`stream.Writable` is an abstract class designed to be extended with an
-underlying implementation of the
-[`stream._write(chunk, encoding, callback)`][stream-_write] method.
-
-Please see [API for Stream Consumers][] for how to consume
-writable streams in your programs. What follows is an explanation of
-how to implement Writable streams in your programs.
-
-#### new stream.Writable([options])
-
-* `options` {Object}
-  * `highWaterMark` {Number} Buffer level when
-    [`stream.write()`][stream-write] starts returning `false`. Default = `16384`
-    (16kb), or `16` for `objectMode` streams.
-  * `decodeStrings` {Boolean} Whether or not to decode strings into
-    Buffers before passing them to [`stream._write()`][stream-_write].
-    Default = `true`
-  * `objectMode` {Boolean} Whether or not the
-    [`stream.write(anyObj)`][stream-write] is a valid operation. If set you can
-    write arbitrary data instead of only `Buffer` / `String` data.
-    Default = `false`
-  * `write` {Function} Implementation for the
-    [`stream._write()`][stream-_write] method.
-  * `writev` {Function} Implementation for the
-    [`stream._writev()`][stream-_writev] method.
-
-In classes that extend the Writable class, make sure to call the
-constructor so that the buffering settings can be properly
-initialized.
-
-#### writable.\_write(chunk, encoding, callback)
-
-* `chunk` {Buffer|String} The chunk to be written. Will **always**
-  be a buffer unless the `decodeStrings` option was set to `false`.
-* `encoding` {String} If the chunk is a string, then this is the
-  encoding type. If chunk is a buffer, then this is the special
-  value - 'buffer', ignore it in this case.
-* `callback` {Function} Call this function (optionally with an error
-  argument) when you are done processing the supplied chunk.
-
-All Writable stream implementations must provide a
-[`stream._write()`][stream-_write] method to send data to the underlying
-resource.
-
-Note: **This function MUST NOT be called directly.**  It should be
-implemented by child classes, and called by the internal Writable
-class methods only.
-
-Call the callback using the standard `callback(error)` pattern to
-signal that the write completed successfully or with an error.
-
-If the `decodeStrings` flag is set in the constructor options, then
-`chunk` may be a string rather than a Buffer, and `encoding` will
-indicate the sort of string that it is. This is to support
-implementations that have an optimized handling for certain string
-data encodings. If you do not explicitly set the `decodeStrings`
-option to `false`, then you can safely ignore the `encoding` argument,
-and assume that `chunk` will always be a Buffer.
-
-This method is prefixed with an underscore because it is internal to
-the class that defines it, and should not be called directly by user
-programs. However, you **are** expected to override this method in
-your own extension classes.
-
-#### writable.\_writev(chunks, callback)
-
-* `chunks` {Array} The chunks to be written. Each chunk has following
-  format: `{ chunk: ..., encoding: ... }`.
-* `callback` {Function} Call this function (optionally with an error
-  argument) when you are done processing the supplied chunks.
-
-Note: **This function MUST NOT be called directly.**  It may be
-implemented by child classes, and called by the internal Writable
-class methods only.
-
-This function is completely optional to implement. In most cases it is
-unnecessary. If implemented, it will be called with all the chunks
-that are buffered in the write queue.
-
-
-## Simplified Constructor API
-
-<!--type=misc-->
-
-In simple cases there is now the added benefit of being able to construct a
-stream without inheritance.
-
-This can be done by passing the appropriate methods as constructor options:
-
-Examples:
-
-### Duplex
-
-```js
-var duplex = new stream.Duplex({
-  read: function(n) {
-    // sets this._read under the hood
-
-    // push data onto the read queue, passing null
-    // will signal the end of the stream (EOF)
-    this.push(chunk);
-  },
-  write: function(chunk, encoding, next) {
-    // sets this._write under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-
-// or
-
-var duplex = new stream.Duplex({
-  read: function(n) {
-    // sets this._read under the hood
-
-    // push data onto the read queue, passing null
-    // will signal the end of the stream (EOF)
-    this.push(chunk);
-  },
-  writev: function(chunks, next) {
-    // sets this._writev under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-```
-
-### Readable
-
-```js
-var readable = new stream.Readable({
-  read: function(n) {
-    // sets this._read under the hood
-
-    // push data onto the read queue, passing null
-    // will signal the end of the stream (EOF)
-    this.push(chunk);
-  }
-});
-```
-
-### Transform
-
-```js
-var transform = new stream.Transform({
-  transform: function(chunk, encoding, next) {
-    // sets this._transform under the hood
-
-    // generate output as many times as needed
-    // this.push(chunk);
-
-    // call when the current chunk is consumed
-    next();
-  },
-  flush: function(done) {
-    // sets this._flush under the hood
-
-    // generate output as many times as needed
-    // this.push(chunk);
-
-    done();
-  }
-});
-```
-
-### Writable
-
-```js
-var writable = new stream.Writable({
-  write: function(chunk, encoding, next) {
-    // sets this._write under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-
-// or
-
-var writable = new stream.Writable({
-  writev: function(chunks, next) {
-    // sets this._writev under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-```
-
-## Streams: Under the Hood
-
-<!--type=misc-->
-
-### Buffering
-
-<!--type=misc-->
-
-Both Writable and Readable streams will buffer data on an internal
-object which can be retrieved from `_writableState.getBuffer()` or
-`_readableState.buffer`, respectively.
-
-The amount of data that will potentially be buffered depends on the
-`highWaterMark` option which is passed into the constructor.
-
-Buffering in Readable streams happens when the implementation calls
-[`stream.push(chunk)`][stream-push]. If the consumer of the Stream does not
-call [`stream.read()`][stream-read], then the data will sit in the internal
-queue until it is consumed.
-
-Buffering in Writable streams happens when the user calls
-[`stream.write(chunk)`][stream-write] repeatedly, even when it returns `false`.
-
-The purpose of streams, especially with the [`stream.pipe()`][] method, is to
-limit the buffering of data to acceptable levels, so that sources and
-destinations of varying speed will not overwhelm the available memory.
-
-### Compatibility with Older Node.js Versions
-
-<!--type=misc-->
-
-In versions of Node.js prior to v0.10, the Readable stream interface was
-simpler, but also less powerful and less useful.
-
-* Rather than waiting for you to call the [`stream.read()`][stream-read] method,
-  [`'data'`][] events would start emitting immediately. If you needed to do
-  some I/O to decide how to handle data, then you had to store the chunks
-  in some kind of buffer so that they would not be lost.
-* The [`stream.pause()`][stream-pause] method was advisory, rather than
-  guaranteed. This meant that you still had to be prepared to receive
-  [`'data'`][] events even when the stream was in a paused state.
-
-In Node.js v0.10, the [Readable][] class was added.
-For backwards compatibility with older Node.js programs, Readable streams
-switch into "flowing mode" when a [`'data'`][] event handler is added, or
-when the [`stream.resume()`][stream-resume] method is called. The effect is
-that, even if you are not using the new [`stream.read()`][stream-read] method
-and [`'readable'`][] event, you no longer have to worry about losing
-[`'data'`][] chunks.
-
-Most programs will continue to function normally. However, this
-introduces an edge case in the following conditions:
-
-* No [`'data'`][] event handler is added.
-* The [`stream.resume()`][stream-resume] method is never called.
-* The stream is not piped to any writable destination.
-
-For example, consider the following code:
-
-```js
-// WARNING!  BROKEN!
-net.createServer((socket) => {
-
-  // we add an 'end' method, but never consume the data
-  socket.on('end', () => {
-    // It will never get here.
-    socket.end('I got your message (but didnt read it)\n');
-  });
-
-}).listen(1337);
-```
-
-In versions of Node.js prior to v0.10, the incoming message data would be
-simply discarded. However, in Node.js v0.10 and beyond,
-the socket will remain paused forever.
-
-The workaround in this situation is to call the
-[`stream.resume()`][stream-resume] method to start the flow of data:
-
-```js
-// Workaround
-net.createServer((socket) => {
-
-  socket.on('end', () => {
-    socket.end('I got your message (but didnt read it)\n');
-  });
-
-  // start the flow of data, discarding it.
-  socket.resume();
-
-}).listen(1337);
-```
-
-In addition to new Readable streams switching into flowing mode,
-pre-v0.10 style streams can be wrapped in a Readable class using the
-[`stream.wrap()`][] method.
-
-
-### Object Mode
-
-<!--type=misc-->
-
-Normally, Streams operate on Strings and Buffers exclusively.
-
-Streams that are in **object mode** can emit generic JavaScript values
-other than Buffers and Strings.
-
-A Readable stream in object mode will always return a single item from
-a call to [`stream.read(size)`][stream-read], regardless of what the size
-argument is.
-
-A Writable stream in object mode will always ignore the `encoding`
-argument to [`stream.write(data, encoding)`][stream-write].
-
-The special value `null` still retains its special value for object
-mode streams. That is, for object mode readable streams, `null` as a
-return value from [`stream.read()`][stream-read] indicates that there is no more
-data, and [`stream.push(null)`][stream-push] will signal the end of stream data
-(`EOF`).
-
-No streams in Node.js core are object mode streams. This pattern is only
-used by userland streaming libraries.
-
-You should set `objectMode` in your stream child class constructor on
-the options object. Setting `objectMode` mid-stream is not safe.
-
-For Duplex streams `objectMode` can be set exclusively for readable or
-writable side with `readableObjectMode` and `writableObjectMode`
-respectively. These options can be used to implement parsers and
-serializers with Transform streams.
-
-```js
-const util = require('util');
-const StringDecoder = require('string_decoder').StringDecoder;
-const Transform = require('stream').Transform;
-util.inherits(JSONParseStream, Transform);
-
-// Gets \n-delimited JSON string data, and emits the parsed objects
-function JSONParseStream() {
-  if (!(this instanceof JSONParseStream))
-    return new JSONParseStream();
-
-  Transform.call(this, { readableObjectMode : true });
-
-  this._buffer = '';
-  this._decoder = new StringDecoder('utf8');
-}
-
-JSONParseStream.prototype._transform = function(chunk, encoding, cb) {
-  this._buffer += this._decoder.write(chunk);
-  // split on newlines
-  var lines = this._buffer.split(/\r?\n/);
-  // keep the last partial line buffered
-  this._buffer = lines.pop();
-  for (var l = 0; l < lines.length; l++) {
-    var line = lines[l];
-    try {
-      var obj = JSON.parse(line);
-    } catch (er) {
-      this.emit('error', er);
-      return;
-    }
-    // push the parsed object out to the readable consumer
-    this.push(obj);
-  }
-  cb();
-};
-
-JSONParseStream.prototype._flush = function(cb) {
-  // Just handle any leftover
-  var rem = this._buffer.trim();
-  if (rem) {
-    try {
-      var obj = JSON.parse(rem);
-    } catch (er) {
-      this.emit('error', er);
-      return;
-    }
-    // push the parsed object out to the readable consumer
-    this.push(obj);
-  }
-  cb();
-};
-```
-
-### `stream.read(0)`
-
-There are some cases where you want to trigger a refresh of the
-underlying readable stream mechanisms, without actually consuming any
-data. In that case, you can call `stream.read(0)`, which will always
-return null.
-
-If the internal read buffer is below the `highWaterMark`, and the
-stream is not currently reading, then calling `stream.read(0)` will trigger
-a low-level [`stream._read()`][stream-_read] call.
-
-There is almost never a need to do this. However, you will see some
-cases in Node.js's internals where this is done, particularly in the
-Readable stream class internals.
-
-### `stream.push('')`
-
-Pushing a zero-byte string or Buffer (when not in [Object mode][]) has an
-interesting side effect. Because it *is* a call to
-[`stream.push()`][stream-push], it will end the `reading` process. However, it
-does *not* add any data to the readable buffer, so there's nothing for
-a user to consume.
-
-Very rarely, there are cases where you have no data to provide now,
-but the consumer of your stream (or, perhaps, another bit of your own
-code) will know when to check again, by calling [`stream.read(0)`][stream-read].
-In those cases, you *may* call `stream.push('')`.
-
-So far, the only use case for this functionality is in the
-[`tls.CryptoStream`][] class, which is deprecated in Node.js/io.js v1.0. If you
-find that you have to use `stream.push('')`, please consider another
-approach, because it almost certainly indicates that something is
-horribly wrong.
-
-[`'data'`]: #stream_event_data
-[`'drain'`]: #stream_event_drain
-[`'end'`]: #stream_event_end
-[`'finish'`]: #stream_event_finish
-[`'readable'`]: #stream_event_readable
-[`buf.toString(encoding)`]: https://nodejs.org/docs/v5.8.0/api/buffer.html#buffer_buf_tostring_encoding_start_end
-[`EventEmitter`]: https://nodejs.org/docs/v5.8.0/api/events.html#events_class_eventemitter
-[`process.stderr`]: https://nodejs.org/docs/v5.8.0/api/process.html#process_process_stderr
-[`process.stdin`]: https://nodejs.org/docs/v5.8.0/api/process.html#process_process_stdin
-[`process.stdout`]: https://nodejs.org/docs/v5.8.0/api/process.html#process_process_stdout
-[`stream.cork()`]: #stream_writable_cork
-[`stream.pipe()`]: #stream_readable_pipe_destination_options
-[`stream.uncork()`]: #stream_writable_uncork
-[`stream.unpipe()`]: #stream_readable_unpipe_destination
-[`stream.wrap()`]: #stream_readable_wrap_stream
-[`tls.CryptoStream`]: https://nodejs.org/docs/v5.8.0/api/tls.html#tls_class_cryptostream
-[`util.inherits()`]: https://nodejs.org/docs/v5.8.0/api/util.html#util_util_inherits_constructor_superconstructor
-[API for Stream Consumers]: #stream_api_for_stream_consumers
-[API for Stream Implementors]: #stream_api_for_stream_implementors
-[child process stdin]: https://nodejs.org/docs/v5.8.0/api/child_process.html#child_process_child_stdin
-[child process stdout and stderr]: https://nodejs.org/docs/v5.8.0/api/child_process.html#child_process_child_stdout
-[Compatibility]: #stream_compatibility_with_older_node_js_versions
-[crypto]: crypto.html
-[Duplex]: #stream_class_stream_duplex
-[fs read streams]: https://nodejs.org/docs/v5.8.0/api/fs.html#fs_class_fs_readstream
-[fs write streams]: https://nodejs.org/docs/v5.8.0/api/fs.html#fs_class_fs_writestream
-[HTTP requests, on the client]: https://nodejs.org/docs/v5.8.0/api/http.html#http_class_http_clientrequest
-[HTTP responses, on the server]: https://nodejs.org/docs/v5.8.0/api/http.html#http_class_http_serverresponse
-[http-incoming-message]: https://nodejs.org/docs/v5.8.0/api/http.html#http_class_http_incomingmessage
-[Object mode]: #stream_object_mode
-[Readable]: #stream_class_stream_readable
-[SimpleProtocol v2]: #stream_example_simpleprotocol_parser_v2
-[stream-_flush]: #stream_transform_flush_callback
-[stream-_read]: #stream_readable_read_size_1
-[stream-_transform]: #stream_transform_transform_chunk_encoding_callback
-[stream-_write]: #stream_writable_write_chunk_encoding_callback_1
-[stream-_writev]: #stream_writable_writev_chunks_callback
-[stream-end]: #stream_writable_end_chunk_encoding_callback
-[stream-pause]: #stream_readable_pause
-[stream-push]: #stream_readable_push_chunk_encoding
-[stream-read]: #stream_readable_read_size
-[stream-resume]: #stream_readable_resume
-[stream-write]: #stream_writable_write_chunk_encoding_callback
-[TCP sockets]: https://nodejs.org/docs/v5.8.0/api/net.html#net_class_net_socket
-[Transform]: #stream_class_stream_transform
-[Writable]: #stream_class_stream_writable
-[zlib]: zlib.html
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md
deleted file mode 100644
index 83275f192e4077d32942525aaf510fa449a7c417..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# streams WG Meeting 2015-01-30
-
-## Links
-
-* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg
-* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106
-* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/
-
-## Agenda
-
-Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting.
-
-* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105)
-* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101)
-* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102)
-* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99)
-
-## Minutes
-
-### adopt a charter
-
-* group: +1's all around
-
-### What versioning scheme should be adopted?
-* group: +1’s 3.0.0
-* domenic+group: pulling in patches from other sources where appropriate
-* mikeal: version independently, suggesting versions for io.js
-* mikeal+domenic: work with TC to notify in advance of changes
-simpler stream creation
-
-### streamline creation of streams
-* sam: streamline creation of streams
-* domenic: nice simple solution posted
-  but, we lose the opportunity to change the model
-  may not be backwards incompatible (double check keys)
-
-  **action item:** domenic will check
-
-### remove implicit flowing of streams on(‘data’)
-* add isFlowing / isPaused
-* mikeal: worrying that we’re documenting polyfill methods – confuses users
-* domenic: more reflective API is probably good, with warning labels for users
-* new section for mad scientists (reflective stream access)
-* calvin: name the “third state”
-* mikeal: maybe borrow the name from whatwg?
-* domenic: we’re missing the “third state”
-* consensus: kind of difficult to name the third state
-* mikeal: figure out differences in states / compat
-* mathias: always flow on data – eliminates third state
-  * explore what it breaks
-
-**action items:**
-* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream)
-* ask rod/build for infrastructure
-* **chris**: explore the “flow on data” approach
-* add isPaused/isFlowing
-* add new docs section
-* move isPaused to that section
-
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js
deleted file mode 100644
index ca807af87620dd789b4f72984b813618fc1a76ff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/duplex.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_duplex.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js
deleted file mode 100644
index 736693b8400fed16544db29d1eecd42233dc71c9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_duplex.js
+++ /dev/null
@@ -1,75 +0,0 @@
-// a duplex stream is just a stream that is both readable and writable.
-// Since JS doesn't have multiple prototypal inheritance, this class
-// prototypally inherits from Readable, and then parasitically from
-// Writable.
-
-'use strict';
-
-/*<replacement>*/
-
-var objectKeys = Object.keys || function (obj) {
-  var keys = [];
-  for (var key in obj) {
-    keys.push(key);
-  }return keys;
-};
-/*</replacement>*/
-
-module.exports = Duplex;
-
-/*<replacement>*/
-var processNextTick = require('process-nextick-args');
-/*</replacement>*/
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-var Readable = require('./_stream_readable');
-var Writable = require('./_stream_writable');
-
-util.inherits(Duplex, Readable);
-
-var keys = objectKeys(Writable.prototype);
-for (var v = 0; v < keys.length; v++) {
-  var method = keys[v];
-  if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
-}
-
-function Duplex(options) {
-  if (!(this instanceof Duplex)) return new Duplex(options);
-
-  Readable.call(this, options);
-  Writable.call(this, options);
-
-  if (options && options.readable === false) this.readable = false;
-
-  if (options && options.writable === false) this.writable = false;
-
-  this.allowHalfOpen = true;
-  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
-
-  this.once('end', onend);
-}
-
-// the no-half-open enforcer
-function onend() {
-  // if we allow half-open state, or if the writable side ended,
-  // then we're ok.
-  if (this.allowHalfOpen || this._writableState.ended) return;
-
-  // no more data can be written.
-  // But allow more writes to happen in this tick.
-  processNextTick(onEndNT, this);
-}
-
-function onEndNT(self) {
-  self.end();
-}
-
-function forEach(xs, f) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    f(xs[i], i);
-  }
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js
deleted file mode 100644
index d06f71f1868d77a4111e894550798c977a091182..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_passthrough.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// a passthrough stream.
-// basically just the most minimal sort of Transform stream.
-// Every written chunk gets output as-is.
-
-'use strict';
-
-module.exports = PassThrough;
-
-var Transform = require('./_stream_transform');
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-util.inherits(PassThrough, Transform);
-
-function PassThrough(options) {
-  if (!(this instanceof PassThrough)) return new PassThrough(options);
-
-  Transform.call(this, options);
-}
-
-PassThrough.prototype._transform = function (chunk, encoding, cb) {
-  cb(null, chunk);
-};
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js
deleted file mode 100644
index 54a9d5c553d69e93a4b774f120168d780beb1730..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_readable.js
+++ /dev/null
@@ -1,880 +0,0 @@
-'use strict';
-
-module.exports = Readable;
-
-/*<replacement>*/
-var processNextTick = require('process-nextick-args');
-/*</replacement>*/
-
-/*<replacement>*/
-var isArray = require('isarray');
-/*</replacement>*/
-
-/*<replacement>*/
-var Buffer = require('buffer').Buffer;
-/*</replacement>*/
-
-Readable.ReadableState = ReadableState;
-
-var EE = require('events');
-
-/*<replacement>*/
-var EElistenerCount = function (emitter, type) {
-  return emitter.listeners(type).length;
-};
-/*</replacement>*/
-
-/*<replacement>*/
-var Stream;
-(function () {
-  try {
-    Stream = require('st' + 'ream');
-  } catch (_) {} finally {
-    if (!Stream) Stream = require('events').EventEmitter;
-  }
-})();
-/*</replacement>*/
-
-var Buffer = require('buffer').Buffer;
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-/*<replacement>*/
-var debugUtil = require('util');
-var debug = undefined;
-if (debugUtil && debugUtil.debuglog) {
-  debug = debugUtil.debuglog('stream');
-} else {
-  debug = function () {};
-}
-/*</replacement>*/
-
-var StringDecoder;
-
-util.inherits(Readable, Stream);
-
-var Duplex;
-function ReadableState(options, stream) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  options = options || {};
-
-  // object stream flag. Used to make read(n) ignore n and to
-  // make all the buffer merging and length checks go away
-  this.objectMode = !!options.objectMode;
-
-  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
-
-  // the point at which it stops calling _read() to fill the buffer
-  // Note: 0 is a valid value, means "don't call _read preemptively ever"
-  var hwm = options.highWaterMark;
-  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
-  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
-
-  // cast to ints.
-  this.highWaterMark = ~ ~this.highWaterMark;
-
-  this.buffer = [];
-  this.length = 0;
-  this.pipes = null;
-  this.pipesCount = 0;
-  this.flowing = null;
-  this.ended = false;
-  this.endEmitted = false;
-  this.reading = false;
-
-  // a flag to be able to tell if the onwrite cb is called immediately,
-  // or on a later tick.  We set this to true at first, because any
-  // actions that shouldn't happen until "later" should generally also
-  // not happen before the first write call.
-  this.sync = true;
-
-  // whenever we return null, then we set a flag to say
-  // that we're awaiting a 'readable' event emission.
-  this.needReadable = false;
-  this.emittedReadable = false;
-  this.readableListening = false;
-  this.resumeScheduled = false;
-
-  // Crypto is kind of old and crusty.  Historically, its default string
-  // encoding is 'binary' so we have to make this configurable.
-  // Everything else in the universe uses 'utf8', though.
-  this.defaultEncoding = options.defaultEncoding || 'utf8';
-
-  // when piping, we only care about 'readable' events that happen
-  // after read()ing all the bytes and not getting any pushback.
-  this.ranOut = false;
-
-  // the number of writers that are awaiting a drain event in .pipe()s
-  this.awaitDrain = 0;
-
-  // if true, a maybeReadMore has been scheduled
-  this.readingMore = false;
-
-  this.decoder = null;
-  this.encoding = null;
-  if (options.encoding) {
-    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
-    this.decoder = new StringDecoder(options.encoding);
-    this.encoding = options.encoding;
-  }
-}
-
-var Duplex;
-function Readable(options) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  if (!(this instanceof Readable)) return new Readable(options);
-
-  this._readableState = new ReadableState(options, this);
-
-  // legacy
-  this.readable = true;
-
-  if (options && typeof options.read === 'function') this._read = options.read;
-
-  Stream.call(this);
-}
-
-// Manually shove something into the read() buffer.
-// This returns true if the highWaterMark has not been hit yet,
-// similar to how Writable.write() returns true if you should
-// write() some more.
-Readable.prototype.push = function (chunk, encoding) {
-  var state = this._readableState;
-
-  if (!state.objectMode && typeof chunk === 'string') {
-    encoding = encoding || state.defaultEncoding;
-    if (encoding !== state.encoding) {
-      chunk = new Buffer(chunk, encoding);
-      encoding = '';
-    }
-  }
-
-  return readableAddChunk(this, state, chunk, encoding, false);
-};
-
-// Unshift should *always* be something directly out of read()
-Readable.prototype.unshift = function (chunk) {
-  var state = this._readableState;
-  return readableAddChunk(this, state, chunk, '', true);
-};
-
-Readable.prototype.isPaused = function () {
-  return this._readableState.flowing === false;
-};
-
-function readableAddChunk(stream, state, chunk, encoding, addToFront) {
-  var er = chunkInvalid(state, chunk);
-  if (er) {
-    stream.emit('error', er);
-  } else if (chunk === null) {
-    state.reading = false;
-    onEofChunk(stream, state);
-  } else if (state.objectMode || chunk && chunk.length > 0) {
-    if (state.ended && !addToFront) {
-      var e = new Error('stream.push() after EOF');
-      stream.emit('error', e);
-    } else if (state.endEmitted && addToFront) {
-      var e = new Error('stream.unshift() after end event');
-      stream.emit('error', e);
-    } else {
-      var skipAdd;
-      if (state.decoder && !addToFront && !encoding) {
-        chunk = state.decoder.write(chunk);
-        skipAdd = !state.objectMode && chunk.length === 0;
-      }
-
-      if (!addToFront) state.reading = false;
-
-      // Don't add to the buffer if we've decoded to an empty string chunk and
-      // we're not in object mode
-      if (!skipAdd) {
-        // if we want the data now, just emit it.
-        if (state.flowing && state.length === 0 && !state.sync) {
-          stream.emit('data', chunk);
-          stream.read(0);
-        } else {
-          // update the buffer info.
-          state.length += state.objectMode ? 1 : chunk.length;
-          if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
-
-          if (state.needReadable) emitReadable(stream);
-        }
-      }
-
-      maybeReadMore(stream, state);
-    }
-  } else if (!addToFront) {
-    state.reading = false;
-  }
-
-  return needMoreData(state);
-}
-
-// if it's past the high water mark, we can push in some more.
-// Also, if we have no data yet, we can stand some
-// more bytes.  This is to work around cases where hwm=0,
-// such as the repl.  Also, if the push() triggered a
-// readable event, and the user called read(largeNumber) such that
-// needReadable was set, then we ought to push more, so that another
-// 'readable' event will be triggered.
-function needMoreData(state) {
-  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
-}
-
-// backwards compatibility.
-Readable.prototype.setEncoding = function (enc) {
-  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
-  this._readableState.decoder = new StringDecoder(enc);
-  this._readableState.encoding = enc;
-  return this;
-};
-
-// Don't raise the hwm > 8MB
-var MAX_HWM = 0x800000;
-function computeNewHighWaterMark(n) {
-  if (n >= MAX_HWM) {
-    n = MAX_HWM;
-  } else {
-    // Get the next highest power of 2
-    n--;
-    n |= n >>> 1;
-    n |= n >>> 2;
-    n |= n >>> 4;
-    n |= n >>> 8;
-    n |= n >>> 16;
-    n++;
-  }
-  return n;
-}
-
-function howMuchToRead(n, state) {
-  if (state.length === 0 && state.ended) return 0;
-
-  if (state.objectMode) return n === 0 ? 0 : 1;
-
-  if (n === null || isNaN(n)) {
-    // only flow one buffer at a time
-    if (state.flowing && state.buffer.length) return state.buffer[0].length;else return state.length;
-  }
-
-  if (n <= 0) return 0;
-
-  // If we're asking for more than the target buffer level,
-  // then raise the water mark.  Bump up to the next highest
-  // power of 2, to prevent increasing it excessively in tiny
-  // amounts.
-  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
-
-  // don't have that much.  return null, unless we've ended.
-  if (n > state.length) {
-    if (!state.ended) {
-      state.needReadable = true;
-      return 0;
-    } else {
-      return state.length;
-    }
-  }
-
-  return n;
-}
-
-// you can override either this method, or the async _read(n) below.
-Readable.prototype.read = function (n) {
-  debug('read', n);
-  var state = this._readableState;
-  var nOrig = n;
-
-  if (typeof n !== 'number' || n > 0) state.emittedReadable = false;
-
-  // if we're doing read(0) to trigger a readable event, but we
-  // already have a bunch of data in the buffer, then just trigger
-  // the 'readable' event and move on.
-  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
-    debug('read: emitReadable', state.length, state.ended);
-    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
-    return null;
-  }
-
-  n = howMuchToRead(n, state);
-
-  // if we've ended, and we're now clear, then finish it up.
-  if (n === 0 && state.ended) {
-    if (state.length === 0) endReadable(this);
-    return null;
-  }
-
-  // All the actual chunk generation logic needs to be
-  // *below* the call to _read.  The reason is that in certain
-  // synthetic stream cases, such as passthrough streams, _read
-  // may be a completely synchronous operation which may change
-  // the state of the read buffer, providing enough data when
-  // before there was *not* enough.
-  //
-  // So, the steps are:
-  // 1. Figure out what the state of things will be after we do
-  // a read from the buffer.
-  //
-  // 2. If that resulting state will trigger a _read, then call _read.
-  // Note that this may be asynchronous, or synchronous.  Yes, it is
-  // deeply ugly to write APIs this way, but that still doesn't mean
-  // that the Readable class should behave improperly, as streams are
-  // designed to be sync/async agnostic.
-  // Take note if the _read call is sync or async (ie, if the read call
-  // has returned yet), so that we know whether or not it's safe to emit
-  // 'readable' etc.
-  //
-  // 3. Actually pull the requested chunks out of the buffer and return.
-
-  // if we need a readable event, then we need to do some reading.
-  var doRead = state.needReadable;
-  debug('need readable', doRead);
-
-  // if we currently have less than the highWaterMark, then also read some
-  if (state.length === 0 || state.length - n < state.highWaterMark) {
-    doRead = true;
-    debug('length less than watermark', doRead);
-  }
-
-  // however, if we've ended, then there's no point, and if we're already
-  // reading, then it's unnecessary.
-  if (state.ended || state.reading) {
-    doRead = false;
-    debug('reading or ended', doRead);
-  }
-
-  if (doRead) {
-    debug('do read');
-    state.reading = true;
-    state.sync = true;
-    // if the length is currently zero, then we *need* a readable event.
-    if (state.length === 0) state.needReadable = true;
-    // call internal read method
-    this._read(state.highWaterMark);
-    state.sync = false;
-  }
-
-  // If _read pushed data synchronously, then `reading` will be false,
-  // and we need to re-evaluate how much data we can return to the user.
-  if (doRead && !state.reading) n = howMuchToRead(nOrig, state);
-
-  var ret;
-  if (n > 0) ret = fromList(n, state);else ret = null;
-
-  if (ret === null) {
-    state.needReadable = true;
-    n = 0;
-  }
-
-  state.length -= n;
-
-  // If we have nothing in the buffer, then we want to know
-  // as soon as we *do* get something into the buffer.
-  if (state.length === 0 && !state.ended) state.needReadable = true;
-
-  // If we tried to read() past the EOF, then emit end on the next tick.
-  if (nOrig !== n && state.ended && state.length === 0) endReadable(this);
-
-  if (ret !== null) this.emit('data', ret);
-
-  return ret;
-};
-
-function chunkInvalid(state, chunk) {
-  var er = null;
-  if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {
-    er = new TypeError('Invalid non-string/buffer chunk');
-  }
-  return er;
-}
-
-function onEofChunk(stream, state) {
-  if (state.ended) return;
-  if (state.decoder) {
-    var chunk = state.decoder.end();
-    if (chunk && chunk.length) {
-      state.buffer.push(chunk);
-      state.length += state.objectMode ? 1 : chunk.length;
-    }
-  }
-  state.ended = true;
-
-  // emit 'readable' now to make sure it gets picked up.
-  emitReadable(stream);
-}
-
-// Don't emit readable right away in sync mode, because this can trigger
-// another read() call => stack overflow.  This way, it might trigger
-// a nextTick recursion warning, but that's not so bad.
-function emitReadable(stream) {
-  var state = stream._readableState;
-  state.needReadable = false;
-  if (!state.emittedReadable) {
-    debug('emitReadable', state.flowing);
-    state.emittedReadable = true;
-    if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);
-  }
-}
-
-function emitReadable_(stream) {
-  debug('emit readable');
-  stream.emit('readable');
-  flow(stream);
-}
-
-// at this point, the user has presumably seen the 'readable' event,
-// and called read() to consume some data.  that may have triggered
-// in turn another _read(n) call, in which case reading = true if
-// it's in progress.
-// However, if we're not ended, or reading, and the length < hwm,
-// then go ahead and try to read some more preemptively.
-function maybeReadMore(stream, state) {
-  if (!state.readingMore) {
-    state.readingMore = true;
-    processNextTick(maybeReadMore_, stream, state);
-  }
-}
-
-function maybeReadMore_(stream, state) {
-  var len = state.length;
-  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
-    debug('maybeReadMore read 0');
-    stream.read(0);
-    if (len === state.length)
-      // didn't get any data, stop spinning.
-      break;else len = state.length;
-  }
-  state.readingMore = false;
-}
-
-// abstract method.  to be overridden in specific implementation classes.
-// call cb(er, data) where data is <= n in length.
-// for virtual (non-string, non-buffer) streams, "length" is somewhat
-// arbitrary, and perhaps not very meaningful.
-Readable.prototype._read = function (n) {
-  this.emit('error', new Error('not implemented'));
-};
-
-Readable.prototype.pipe = function (dest, pipeOpts) {
-  var src = this;
-  var state = this._readableState;
-
-  switch (state.pipesCount) {
-    case 0:
-      state.pipes = dest;
-      break;
-    case 1:
-      state.pipes = [state.pipes, dest];
-      break;
-    default:
-      state.pipes.push(dest);
-      break;
-  }
-  state.pipesCount += 1;
-  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
-
-  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
-
-  var endFn = doEnd ? onend : cleanup;
-  if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);
-
-  dest.on('unpipe', onunpipe);
-  function onunpipe(readable) {
-    debug('onunpipe');
-    if (readable === src) {
-      cleanup();
-    }
-  }
-
-  function onend() {
-    debug('onend');
-    dest.end();
-  }
-
-  // when the dest drains, it reduces the awaitDrain counter
-  // on the source.  This would be more elegant with a .once()
-  // handler in flow(), but adding and removing repeatedly is
-  // too slow.
-  var ondrain = pipeOnDrain(src);
-  dest.on('drain', ondrain);
-
-  var cleanedUp = false;
-  function cleanup() {
-    debug('cleanup');
-    // cleanup event handlers once the pipe is broken
-    dest.removeListener('close', onclose);
-    dest.removeListener('finish', onfinish);
-    dest.removeListener('drain', ondrain);
-    dest.removeListener('error', onerror);
-    dest.removeListener('unpipe', onunpipe);
-    src.removeListener('end', onend);
-    src.removeListener('end', cleanup);
-    src.removeListener('data', ondata);
-
-    cleanedUp = true;
-
-    // if the reader is waiting for a drain event from this
-    // specific writer, then it would cause it to never start
-    // flowing again.
-    // So, if this is awaiting a drain, then we just call it now.
-    // If we don't know, then assume that we are waiting for one.
-    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
-  }
-
-  src.on('data', ondata);
-  function ondata(chunk) {
-    debug('ondata');
-    var ret = dest.write(chunk);
-    if (false === ret) {
-      // If the user unpiped during `dest.write()`, it is possible
-      // to get stuck in a permanently paused state if that write
-      // also returned false.
-      if (state.pipesCount === 1 && state.pipes[0] === dest && src.listenerCount('data') === 1 && !cleanedUp) {
-        debug('false write response, pause', src._readableState.awaitDrain);
-        src._readableState.awaitDrain++;
-      }
-      src.pause();
-    }
-  }
-
-  // if the dest has an error, then stop piping into it.
-  // however, don't suppress the throwing behavior for this.
-  function onerror(er) {
-    debug('onerror', er);
-    unpipe();
-    dest.removeListener('error', onerror);
-    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
-  }
-  // This is a brutally ugly hack to make sure that our error handler
-  // is attached before any userland ones.  NEVER DO THIS.
-  if (!dest._events || !dest._events.error) dest.on('error', onerror);else if (isArray(dest._events.error)) dest._events.error.unshift(onerror);else dest._events.error = [onerror, dest._events.error];
-
-  // Both close and finish should trigger unpipe, but only once.
-  function onclose() {
-    dest.removeListener('finish', onfinish);
-    unpipe();
-  }
-  dest.once('close', onclose);
-  function onfinish() {
-    debug('onfinish');
-    dest.removeListener('close', onclose);
-    unpipe();
-  }
-  dest.once('finish', onfinish);
-
-  function unpipe() {
-    debug('unpipe');
-    src.unpipe(dest);
-  }
-
-  // tell the dest that it's being piped to
-  dest.emit('pipe', src);
-
-  // start the flow if it hasn't been started already.
-  if (!state.flowing) {
-    debug('pipe resume');
-    src.resume();
-  }
-
-  return dest;
-};
-
-function pipeOnDrain(src) {
-  return function () {
-    var state = src._readableState;
-    debug('pipeOnDrain', state.awaitDrain);
-    if (state.awaitDrain) state.awaitDrain--;
-    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
-      state.flowing = true;
-      flow(src);
-    }
-  };
-}
-
-Readable.prototype.unpipe = function (dest) {
-  var state = this._readableState;
-
-  // if we're not piping anywhere, then do nothing.
-  if (state.pipesCount === 0) return this;
-
-  // just one destination.  most common case.
-  if (state.pipesCount === 1) {
-    // passed in one, but it's not the right one.
-    if (dest && dest !== state.pipes) return this;
-
-    if (!dest) dest = state.pipes;
-
-    // got a match.
-    state.pipes = null;
-    state.pipesCount = 0;
-    state.flowing = false;
-    if (dest) dest.emit('unpipe', this);
-    return this;
-  }
-
-  // slow case. multiple pipe destinations.
-
-  if (!dest) {
-    // remove all.
-    var dests = state.pipes;
-    var len = state.pipesCount;
-    state.pipes = null;
-    state.pipesCount = 0;
-    state.flowing = false;
-
-    for (var _i = 0; _i < len; _i++) {
-      dests[_i].emit('unpipe', this);
-    }return this;
-  }
-
-  // try to find the right one.
-  var i = indexOf(state.pipes, dest);
-  if (i === -1) return this;
-
-  state.pipes.splice(i, 1);
-  state.pipesCount -= 1;
-  if (state.pipesCount === 1) state.pipes = state.pipes[0];
-
-  dest.emit('unpipe', this);
-
-  return this;
-};
-
-// set up data events if they are asked for
-// Ensure readable listeners eventually get something
-Readable.prototype.on = function (ev, fn) {
-  var res = Stream.prototype.on.call(this, ev, fn);
-
-  // If listening to data, and it has not explicitly been paused,
-  // then call resume to start the flow of data on the next tick.
-  if (ev === 'data' && false !== this._readableState.flowing) {
-    this.resume();
-  }
-
-  if (ev === 'readable' && !this._readableState.endEmitted) {
-    var state = this._readableState;
-    if (!state.readableListening) {
-      state.readableListening = true;
-      state.emittedReadable = false;
-      state.needReadable = true;
-      if (!state.reading) {
-        processNextTick(nReadingNextTick, this);
-      } else if (state.length) {
-        emitReadable(this, state);
-      }
-    }
-  }
-
-  return res;
-};
-Readable.prototype.addListener = Readable.prototype.on;
-
-function nReadingNextTick(self) {
-  debug('readable nexttick read 0');
-  self.read(0);
-}
-
-// pause() and resume() are remnants of the legacy readable stream API
-// If the user uses them, then switch into old mode.
-Readable.prototype.resume = function () {
-  var state = this._readableState;
-  if (!state.flowing) {
-    debug('resume');
-    state.flowing = true;
-    resume(this, state);
-  }
-  return this;
-};
-
-function resume(stream, state) {
-  if (!state.resumeScheduled) {
-    state.resumeScheduled = true;
-    processNextTick(resume_, stream, state);
-  }
-}
-
-function resume_(stream, state) {
-  if (!state.reading) {
-    debug('resume read 0');
-    stream.read(0);
-  }
-
-  state.resumeScheduled = false;
-  stream.emit('resume');
-  flow(stream);
-  if (state.flowing && !state.reading) stream.read(0);
-}
-
-Readable.prototype.pause = function () {
-  debug('call pause flowing=%j', this._readableState.flowing);
-  if (false !== this._readableState.flowing) {
-    debug('pause');
-    this._readableState.flowing = false;
-    this.emit('pause');
-  }
-  return this;
-};
-
-function flow(stream) {
-  var state = stream._readableState;
-  debug('flow', state.flowing);
-  if (state.flowing) {
-    do {
-      var chunk = stream.read();
-    } while (null !== chunk && state.flowing);
-  }
-}
-
-// wrap an old-style stream as the async data source.
-// This is *not* part of the readable stream interface.
-// It is an ugly unfortunate mess of history.
-Readable.prototype.wrap = function (stream) {
-  var state = this._readableState;
-  var paused = false;
-
-  var self = this;
-  stream.on('end', function () {
-    debug('wrapped end');
-    if (state.decoder && !state.ended) {
-      var chunk = state.decoder.end();
-      if (chunk && chunk.length) self.push(chunk);
-    }
-
-    self.push(null);
-  });
-
-  stream.on('data', function (chunk) {
-    debug('wrapped data');
-    if (state.decoder) chunk = state.decoder.write(chunk);
-
-    // don't skip over falsy values in objectMode
-    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
-
-    var ret = self.push(chunk);
-    if (!ret) {
-      paused = true;
-      stream.pause();
-    }
-  });
-
-  // proxy all the other methods.
-  // important when wrapping filters and duplexes.
-  for (var i in stream) {
-    if (this[i] === undefined && typeof stream[i] === 'function') {
-      this[i] = function (method) {
-        return function () {
-          return stream[method].apply(stream, arguments);
-        };
-      }(i);
-    }
-  }
-
-  // proxy certain important events.
-  var events = ['error', 'close', 'destroy', 'pause', 'resume'];
-  forEach(events, function (ev) {
-    stream.on(ev, self.emit.bind(self, ev));
-  });
-
-  // when we try to consume some more bytes, simply unpause the
-  // underlying stream.
-  self._read = function (n) {
-    debug('wrapped _read', n);
-    if (paused) {
-      paused = false;
-      stream.resume();
-    }
-  };
-
-  return self;
-};
-
-// exposed for testing purposes only.
-Readable._fromList = fromList;
-
-// Pluck off n bytes from an array of buffers.
-// Length is the combined lengths of all the buffers in the list.
-function fromList(n, state) {
-  var list = state.buffer;
-  var length = state.length;
-  var stringMode = !!state.decoder;
-  var objectMode = !!state.objectMode;
-  var ret;
-
-  // nothing in the list, definitely empty.
-  if (list.length === 0) return null;
-
-  if (length === 0) ret = null;else if (objectMode) ret = list.shift();else if (!n || n >= length) {
-    // read it all, truncate the array.
-    if (stringMode) ret = list.join('');else if (list.length === 1) ret = list[0];else ret = Buffer.concat(list, length);
-    list.length = 0;
-  } else {
-    // read just some of it.
-    if (n < list[0].length) {
-      // just take a part of the first list item.
-      // slice is the same for buffers and strings.
-      var buf = list[0];
-      ret = buf.slice(0, n);
-      list[0] = buf.slice(n);
-    } else if (n === list[0].length) {
-      // first list is a perfect match
-      ret = list.shift();
-    } else {
-      // complex case.
-      // we have enough to cover it, but it spans past the first buffer.
-      if (stringMode) ret = '';else ret = new Buffer(n);
-
-      var c = 0;
-      for (var i = 0, l = list.length; i < l && c < n; i++) {
-        var buf = list[0];
-        var cpy = Math.min(n - c, buf.length);
-
-        if (stringMode) ret += buf.slice(0, cpy);else buf.copy(ret, c, 0, cpy);
-
-        if (cpy < buf.length) list[0] = buf.slice(cpy);else list.shift();
-
-        c += cpy;
-      }
-    }
-  }
-
-  return ret;
-}
-
-function endReadable(stream) {
-  var state = stream._readableState;
-
-  // If we get here before consuming all the bytes, then that is a
-  // bug in node.  Should never happen.
-  if (state.length > 0) throw new Error('endReadable called on non-empty stream');
-
-  if (!state.endEmitted) {
-    state.ended = true;
-    processNextTick(endReadableNT, state, stream);
-  }
-}
-
-function endReadableNT(state, stream) {
-  // Check that we didn't get one last unshift.
-  if (!state.endEmitted && state.length === 0) {
-    state.endEmitted = true;
-    stream.readable = false;
-    stream.emit('end');
-  }
-}
-
-function forEach(xs, f) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    f(xs[i], i);
-  }
-}
-
-function indexOf(xs, x) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    if (xs[i] === x) return i;
-  }
-  return -1;
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js
deleted file mode 100644
index 625cdc17698059f551012822fe1fcc202ea97530..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_transform.js
+++ /dev/null
@@ -1,180 +0,0 @@
-// a transform stream is a readable/writable stream where you do
-// something with the data.  Sometimes it's called a "filter",
-// but that's not a great name for it, since that implies a thing where
-// some bits pass through, and others are simply ignored.  (That would
-// be a valid example of a transform, of course.)
-//
-// While the output is causally related to the input, it's not a
-// necessarily symmetric or synchronous transformation.  For example,
-// a zlib stream might take multiple plain-text writes(), and then
-// emit a single compressed chunk some time in the future.
-//
-// Here's how this works:
-//
-// The Transform stream has all the aspects of the readable and writable
-// stream classes.  When you write(chunk), that calls _write(chunk,cb)
-// internally, and returns false if there's a lot of pending writes
-// buffered up.  When you call read(), that calls _read(n) until
-// there's enough pending readable data buffered up.
-//
-// In a transform stream, the written data is placed in a buffer.  When
-// _read(n) is called, it transforms the queued up data, calling the
-// buffered _write cb's as it consumes chunks.  If consuming a single
-// written chunk would result in multiple output chunks, then the first
-// outputted bit calls the readcb, and subsequent chunks just go into
-// the read buffer, and will cause it to emit 'readable' if necessary.
-//
-// This way, back-pressure is actually determined by the reading side,
-// since _read has to be called to start processing a new chunk.  However,
-// a pathological inflate type of transform can cause excessive buffering
-// here.  For example, imagine a stream where every byte of input is
-// interpreted as an integer from 0-255, and then results in that many
-// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
-// 1kb of data being output.  In this case, you could write a very small
-// amount of input, and end up with a very large amount of output.  In
-// such a pathological inflating mechanism, there'd be no way to tell
-// the system to stop doing the transform.  A single 4MB write could
-// cause the system to run out of memory.
-//
-// However, even in such a pathological case, only a single written chunk
-// would be consumed, and then the rest would wait (un-transformed) until
-// the results of the previous transformed chunk were consumed.
-
-'use strict';
-
-module.exports = Transform;
-
-var Duplex = require('./_stream_duplex');
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-util.inherits(Transform, Duplex);
-
-function TransformState(stream) {
-  this.afterTransform = function (er, data) {
-    return afterTransform(stream, er, data);
-  };
-
-  this.needTransform = false;
-  this.transforming = false;
-  this.writecb = null;
-  this.writechunk = null;
-  this.writeencoding = null;
-}
-
-function afterTransform(stream, er, data) {
-  var ts = stream._transformState;
-  ts.transforming = false;
-
-  var cb = ts.writecb;
-
-  if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));
-
-  ts.writechunk = null;
-  ts.writecb = null;
-
-  if (data !== null && data !== undefined) stream.push(data);
-
-  cb(er);
-
-  var rs = stream._readableState;
-  rs.reading = false;
-  if (rs.needReadable || rs.length < rs.highWaterMark) {
-    stream._read(rs.highWaterMark);
-  }
-}
-
-function Transform(options) {
-  if (!(this instanceof Transform)) return new Transform(options);
-
-  Duplex.call(this, options);
-
-  this._transformState = new TransformState(this);
-
-  // when the writable side finishes, then flush out anything remaining.
-  var stream = this;
-
-  // start out asking for a readable event once data is transformed.
-  this._readableState.needReadable = true;
-
-  // we have implemented the _read method, and done the other things
-  // that Readable wants before the first _read call, so unset the
-  // sync guard flag.
-  this._readableState.sync = false;
-
-  if (options) {
-    if (typeof options.transform === 'function') this._transform = options.transform;
-
-    if (typeof options.flush === 'function') this._flush = options.flush;
-  }
-
-  this.once('prefinish', function () {
-    if (typeof this._flush === 'function') this._flush(function (er) {
-      done(stream, er);
-    });else done(stream);
-  });
-}
-
-Transform.prototype.push = function (chunk, encoding) {
-  this._transformState.needTransform = false;
-  return Duplex.prototype.push.call(this, chunk, encoding);
-};
-
-// This is the part where you do stuff!
-// override this function in implementation classes.
-// 'chunk' is an input chunk.
-//
-// Call `push(newChunk)` to pass along transformed output
-// to the readable side.  You may call 'push' zero or more times.
-//
-// Call `cb(err)` when you are done with this chunk.  If you pass
-// an error, then that'll put the hurt on the whole operation.  If you
-// never call cb(), then you'll never get another chunk.
-Transform.prototype._transform = function (chunk, encoding, cb) {
-  throw new Error('not implemented');
-};
-
-Transform.prototype._write = function (chunk, encoding, cb) {
-  var ts = this._transformState;
-  ts.writecb = cb;
-  ts.writechunk = chunk;
-  ts.writeencoding = encoding;
-  if (!ts.transforming) {
-    var rs = this._readableState;
-    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
-  }
-};
-
-// Doesn't matter what the args are here.
-// _transform does all the work.
-// That we got here means that the readable side wants more data.
-Transform.prototype._read = function (n) {
-  var ts = this._transformState;
-
-  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
-    ts.transforming = true;
-    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
-  } else {
-    // mark that we need a transform, so that any data that comes in
-    // will get processed, now that we've asked for it.
-    ts.needTransform = true;
-  }
-};
-
-function done(stream, er) {
-  if (er) return stream.emit('error', er);
-
-  // if there's nothing in the write buffer, then that means
-  // that nothing more will ever be provided
-  var ws = stream._writableState;
-  var ts = stream._transformState;
-
-  if (ws.length) throw new Error('calling transform done when ws.length != 0');
-
-  if (ts.transforming) throw new Error('calling transform done when still transforming');
-
-  return stream.push(null);
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js
deleted file mode 100644
index 95916c992a9507908788c81f22175bb1a0877f68..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/lib/_stream_writable.js
+++ /dev/null
@@ -1,516 +0,0 @@
-// A bit simpler than readable streams.
-// Implement an async ._write(chunk, encoding, cb), and it'll handle all
-// the drain event emission and buffering.
-
-'use strict';
-
-module.exports = Writable;
-
-/*<replacement>*/
-var processNextTick = require('process-nextick-args');
-/*</replacement>*/
-
-/*<replacement>*/
-var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;
-/*</replacement>*/
-
-/*<replacement>*/
-var Buffer = require('buffer').Buffer;
-/*</replacement>*/
-
-Writable.WritableState = WritableState;
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-/*<replacement>*/
-var internalUtil = {
-  deprecate: require('util-deprecate')
-};
-/*</replacement>*/
-
-/*<replacement>*/
-var Stream;
-(function () {
-  try {
-    Stream = require('st' + 'ream');
-  } catch (_) {} finally {
-    if (!Stream) Stream = require('events').EventEmitter;
-  }
-})();
-/*</replacement>*/
-
-var Buffer = require('buffer').Buffer;
-
-util.inherits(Writable, Stream);
-
-function nop() {}
-
-function WriteReq(chunk, encoding, cb) {
-  this.chunk = chunk;
-  this.encoding = encoding;
-  this.callback = cb;
-  this.next = null;
-}
-
-var Duplex;
-function WritableState(options, stream) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  options = options || {};
-
-  // object stream flag to indicate whether or not this stream
-  // contains buffers or objects.
-  this.objectMode = !!options.objectMode;
-
-  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
-
-  // the point at which write() starts returning false
-  // Note: 0 is a valid value, means that we always return false if
-  // the entire buffer is not flushed immediately on write()
-  var hwm = options.highWaterMark;
-  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
-  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
-
-  // cast to ints.
-  this.highWaterMark = ~ ~this.highWaterMark;
-
-  this.needDrain = false;
-  // at the start of calling end()
-  this.ending = false;
-  // when end() has been called, and returned
-  this.ended = false;
-  // when 'finish' is emitted
-  this.finished = false;
-
-  // should we decode strings into buffers before passing to _write?
-  // this is here so that some node-core streams can optimize string
-  // handling at a lower level.
-  var noDecode = options.decodeStrings === false;
-  this.decodeStrings = !noDecode;
-
-  // Crypto is kind of old and crusty.  Historically, its default string
-  // encoding is 'binary' so we have to make this configurable.
-  // Everything else in the universe uses 'utf8', though.
-  this.defaultEncoding = options.defaultEncoding || 'utf8';
-
-  // not an actual buffer we keep track of, but a measurement
-  // of how much we're waiting to get pushed to some underlying
-  // socket or file.
-  this.length = 0;
-
-  // a flag to see when we're in the middle of a write.
-  this.writing = false;
-
-  // when true all writes will be buffered until .uncork() call
-  this.corked = 0;
-
-  // a flag to be able to tell if the onwrite cb is called immediately,
-  // or on a later tick.  We set this to true at first, because any
-  // actions that shouldn't happen until "later" should generally also
-  // not happen before the first write call.
-  this.sync = true;
-
-  // a flag to know if we're processing previously buffered items, which
-  // may call the _write() callback in the same tick, so that we don't
-  // end up in an overlapped onwrite situation.
-  this.bufferProcessing = false;
-
-  // the callback that's passed to _write(chunk,cb)
-  this.onwrite = function (er) {
-    onwrite(stream, er);
-  };
-
-  // the callback that the user supplies to write(chunk,encoding,cb)
-  this.writecb = null;
-
-  // the amount that is being written when _write is called.
-  this.writelen = 0;
-
-  this.bufferedRequest = null;
-  this.lastBufferedRequest = null;
-
-  // number of pending user-supplied write callbacks
-  // this must be 0 before 'finish' can be emitted
-  this.pendingcb = 0;
-
-  // emit prefinish if the only thing we're waiting for is _write cbs
-  // This is relevant for synchronous Transform streams
-  this.prefinished = false;
-
-  // True if the error was already emitted and should not be thrown again
-  this.errorEmitted = false;
-
-  // count buffered requests
-  this.bufferedRequestCount = 0;
-
-  // create the two objects needed to store the corked requests
-  // they are not a linked list, as no new elements are inserted in there
-  this.corkedRequestsFree = new CorkedRequest(this);
-  this.corkedRequestsFree.next = new CorkedRequest(this);
-}
-
-WritableState.prototype.getBuffer = function writableStateGetBuffer() {
-  var current = this.bufferedRequest;
-  var out = [];
-  while (current) {
-    out.push(current);
-    current = current.next;
-  }
-  return out;
-};
-
-(function () {
-  try {
-    Object.defineProperty(WritableState.prototype, 'buffer', {
-      get: internalUtil.deprecate(function () {
-        return this.getBuffer();
-      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')
-    });
-  } catch (_) {}
-})();
-
-var Duplex;
-function Writable(options) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  // Writable ctor is applied to Duplexes, though they're not
-  // instanceof Writable, they're instanceof Readable.
-  if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options);
-
-  this._writableState = new WritableState(options, this);
-
-  // legacy.
-  this.writable = true;
-
-  if (options) {
-    if (typeof options.write === 'function') this._write = options.write;
-
-    if (typeof options.writev === 'function') this._writev = options.writev;
-  }
-
-  Stream.call(this);
-}
-
-// Otherwise people can pipe Writable streams, which is just wrong.
-Writable.prototype.pipe = function () {
-  this.emit('error', new Error('Cannot pipe. Not readable.'));
-};
-
-function writeAfterEnd(stream, cb) {
-  var er = new Error('write after end');
-  // TODO: defer error events consistently everywhere, not just the cb
-  stream.emit('error', er);
-  processNextTick(cb, er);
-}
-
-// If we get something that is not a buffer, string, null, or undefined,
-// and we're not in objectMode, then that's an error.
-// Otherwise stream chunks are all considered to be of length=1, and the
-// watermarks determine how many objects to keep in the buffer, rather than
-// how many bytes or characters.
-function validChunk(stream, state, chunk, cb) {
-  var valid = true;
-
-  if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {
-    var er = new TypeError('Invalid non-string/buffer chunk');
-    stream.emit('error', er);
-    processNextTick(cb, er);
-    valid = false;
-  }
-  return valid;
-}
-
-Writable.prototype.write = function (chunk, encoding, cb) {
-  var state = this._writableState;
-  var ret = false;
-
-  if (typeof encoding === 'function') {
-    cb = encoding;
-    encoding = null;
-  }
-
-  if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
-
-  if (typeof cb !== 'function') cb = nop;
-
-  if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) {
-    state.pendingcb++;
-    ret = writeOrBuffer(this, state, chunk, encoding, cb);
-  }
-
-  return ret;
-};
-
-Writable.prototype.cork = function () {
-  var state = this._writableState;
-
-  state.corked++;
-};
-
-Writable.prototype.uncork = function () {
-  var state = this._writableState;
-
-  if (state.corked) {
-    state.corked--;
-
-    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
-  }
-};
-
-Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
-  // node::ParseEncoding() requires lower case.
-  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
-  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
-  this._writableState.defaultEncoding = encoding;
-};
-
-function decodeChunk(state, chunk, encoding) {
-  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
-    chunk = new Buffer(chunk, encoding);
-  }
-  return chunk;
-}
-
-// if we're already writing something, then just put this
-// in the queue, and wait our turn.  Otherwise, call _write
-// If we return false, then we need a drain event, so set that flag.
-function writeOrBuffer(stream, state, chunk, encoding, cb) {
-  chunk = decodeChunk(state, chunk, encoding);
-
-  if (Buffer.isBuffer(chunk)) encoding = 'buffer';
-  var len = state.objectMode ? 1 : chunk.length;
-
-  state.length += len;
-
-  var ret = state.length < state.highWaterMark;
-  // we must ensure that previous needDrain will not be reset to false.
-  if (!ret) state.needDrain = true;
-
-  if (state.writing || state.corked) {
-    var last = state.lastBufferedRequest;
-    state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);
-    if (last) {
-      last.next = state.lastBufferedRequest;
-    } else {
-      state.bufferedRequest = state.lastBufferedRequest;
-    }
-    state.bufferedRequestCount += 1;
-  } else {
-    doWrite(stream, state, false, len, chunk, encoding, cb);
-  }
-
-  return ret;
-}
-
-function doWrite(stream, state, writev, len, chunk, encoding, cb) {
-  state.writelen = len;
-  state.writecb = cb;
-  state.writing = true;
-  state.sync = true;
-  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
-  state.sync = false;
-}
-
-function onwriteError(stream, state, sync, er, cb) {
-  --state.pendingcb;
-  if (sync) processNextTick(cb, er);else cb(er);
-
-  stream._writableState.errorEmitted = true;
-  stream.emit('error', er);
-}
-
-function onwriteStateUpdate(state) {
-  state.writing = false;
-  state.writecb = null;
-  state.length -= state.writelen;
-  state.writelen = 0;
-}
-
-function onwrite(stream, er) {
-  var state = stream._writableState;
-  var sync = state.sync;
-  var cb = state.writecb;
-
-  onwriteStateUpdate(state);
-
-  if (er) onwriteError(stream, state, sync, er, cb);else {
-    // Check if we're actually ready to finish, but don't emit yet
-    var finished = needFinish(state);
-
-    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
-      clearBuffer(stream, state);
-    }
-
-    if (sync) {
-      /*<replacement>*/
-      asyncWrite(afterWrite, stream, state, finished, cb);
-      /*</replacement>*/
-    } else {
-        afterWrite(stream, state, finished, cb);
-      }
-  }
-}
-
-function afterWrite(stream, state, finished, cb) {
-  if (!finished) onwriteDrain(stream, state);
-  state.pendingcb--;
-  cb();
-  finishMaybe(stream, state);
-}
-
-// Must force callback to be called on nextTick, so that we don't
-// emit 'drain' before the write() consumer gets the 'false' return
-// value, and has a chance to attach a 'drain' listener.
-function onwriteDrain(stream, state) {
-  if (state.length === 0 && state.needDrain) {
-    state.needDrain = false;
-    stream.emit('drain');
-  }
-}
-
-// if there's something in the buffer waiting, then process it
-function clearBuffer(stream, state) {
-  state.bufferProcessing = true;
-  var entry = state.bufferedRequest;
-
-  if (stream._writev && entry && entry.next) {
-    // Fast case, write everything using _writev()
-    var l = state.bufferedRequestCount;
-    var buffer = new Array(l);
-    var holder = state.corkedRequestsFree;
-    holder.entry = entry;
-
-    var count = 0;
-    while (entry) {
-      buffer[count] = entry;
-      entry = entry.next;
-      count += 1;
-    }
-
-    doWrite(stream, state, true, state.length, buffer, '', holder.finish);
-
-    // doWrite is always async, defer these to save a bit of time
-    // as the hot path ends with doWrite
-    state.pendingcb++;
-    state.lastBufferedRequest = null;
-    state.corkedRequestsFree = holder.next;
-    holder.next = null;
-  } else {
-    // Slow case, write chunks one-by-one
-    while (entry) {
-      var chunk = entry.chunk;
-      var encoding = entry.encoding;
-      var cb = entry.callback;
-      var len = state.objectMode ? 1 : chunk.length;
-
-      doWrite(stream, state, false, len, chunk, encoding, cb);
-      entry = entry.next;
-      // if we didn't call the onwrite immediately, then
-      // it means that we need to wait until it does.
-      // also, that means that the chunk and cb are currently
-      // being processed, so move the buffer counter past them.
-      if (state.writing) {
-        break;
-      }
-    }
-
-    if (entry === null) state.lastBufferedRequest = null;
-  }
-
-  state.bufferedRequestCount = 0;
-  state.bufferedRequest = entry;
-  state.bufferProcessing = false;
-}
-
-Writable.prototype._write = function (chunk, encoding, cb) {
-  cb(new Error('not implemented'));
-};
-
-Writable.prototype._writev = null;
-
-Writable.prototype.end = function (chunk, encoding, cb) {
-  var state = this._writableState;
-
-  if (typeof chunk === 'function') {
-    cb = chunk;
-    chunk = null;
-    encoding = null;
-  } else if (typeof encoding === 'function') {
-    cb = encoding;
-    encoding = null;
-  }
-
-  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
-
-  // .end() fully uncorks
-  if (state.corked) {
-    state.corked = 1;
-    this.uncork();
-  }
-
-  // ignore unnecessary end() calls.
-  if (!state.ending && !state.finished) endWritable(this, state, cb);
-};
-
-function needFinish(state) {
-  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
-}
-
-function prefinish(stream, state) {
-  if (!state.prefinished) {
-    state.prefinished = true;
-    stream.emit('prefinish');
-  }
-}
-
-function finishMaybe(stream, state) {
-  var need = needFinish(state);
-  if (need) {
-    if (state.pendingcb === 0) {
-      prefinish(stream, state);
-      state.finished = true;
-      stream.emit('finish');
-    } else {
-      prefinish(stream, state);
-    }
-  }
-  return need;
-}
-
-function endWritable(stream, state, cb) {
-  state.ending = true;
-  finishMaybe(stream, state);
-  if (cb) {
-    if (state.finished) processNextTick(cb);else stream.once('finish', cb);
-  }
-  state.ended = true;
-  stream.writable = false;
-}
-
-// It seems a linked list but it is not
-// there will be only 2 of these for each stream
-function CorkedRequest(state) {
-  var _this = this;
-
-  this.next = null;
-  this.entry = null;
-
-  this.finish = function (err) {
-    var entry = _this.entry;
-    _this.entry = null;
-    while (entry) {
-      var cb = entry.callback;
-      state.pendingcb--;
-      cb(err);
-      entry = entry.next;
-    }
-    if (state.corkedRequestsFree) {
-      state.corkedRequestsFree.next = _this;
-    } else {
-      state.corkedRequestsFree = _this;
-    }
-  };
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/LICENSE
deleted file mode 100644
index d8d7f9437dbf5ad54701a187f05988bcf0006fd8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright Node.js contributors. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/README.md
deleted file mode 100644
index 5a76b4149c5eb5077c09578e349820bccbbd266e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# core-util-is
-
-The `util.is*` functions introduced in Node v0.12.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/float.patch b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/float.patch
deleted file mode 100644
index a06d5c05f75fd5617f8849b43a88e0e3d8d824e9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/float.patch
+++ /dev/null
@@ -1,604 +0,0 @@
-diff --git a/lib/util.js b/lib/util.js
-index a03e874..9074e8e 100644
---- a/lib/util.js
-+++ b/lib/util.js
-@@ -19,430 +19,6 @@
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
-
--var formatRegExp = /%[sdj%]/g;
--exports.format = function(f) {
--  if (!isString(f)) {
--    var objects = [];
--    for (var i = 0; i < arguments.length; i++) {
--      objects.push(inspect(arguments[i]));
--    }
--    return objects.join(' ');
--  }
--
--  var i = 1;
--  var args = arguments;
--  var len = args.length;
--  var str = String(f).replace(formatRegExp, function(x) {
--    if (x === '%%') return '%';
--    if (i >= len) return x;
--    switch (x) {
--      case '%s': return String(args[i++]);
--      case '%d': return Number(args[i++]);
--      case '%j':
--        try {
--          return JSON.stringify(args[i++]);
--        } catch (_) {
--          return '[Circular]';
--        }
--      default:
--        return x;
--    }
--  });
--  for (var x = args[i]; i < len; x = args[++i]) {
--    if (isNull(x) || !isObject(x)) {
--      str += ' ' + x;
--    } else {
--      str += ' ' + inspect(x);
--    }
--  }
--  return str;
--};
--
--
--// Mark that a method should not be used.
--// Returns a modified function which warns once by default.
--// If --no-deprecation is set, then it is a no-op.
--exports.deprecate = function(fn, msg) {
--  // Allow for deprecating things in the process of starting up.
--  if (isUndefined(global.process)) {
--    return function() {
--      return exports.deprecate(fn, msg).apply(this, arguments);
--    };
--  }
--
--  if (process.noDeprecation === true) {
--    return fn;
--  }
--
--  var warned = false;
--  function deprecated() {
--    if (!warned) {
--      if (process.throwDeprecation) {
--        throw new Error(msg);
--      } else if (process.traceDeprecation) {
--        console.trace(msg);
--      } else {
--        console.error(msg);
--      }
--      warned = true;
--    }
--    return fn.apply(this, arguments);
--  }
--
--  return deprecated;
--};
--
--
--var debugs = {};
--var debugEnviron;
--exports.debuglog = function(set) {
--  if (isUndefined(debugEnviron))
--    debugEnviron = process.env.NODE_DEBUG || '';
--  set = set.toUpperCase();
--  if (!debugs[set]) {
--    if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
--      var pid = process.pid;
--      debugs[set] = function() {
--        var msg = exports.format.apply(exports, arguments);
--        console.error('%s %d: %s', set, pid, msg);
--      };
--    } else {
--      debugs[set] = function() {};
--    }
--  }
--  return debugs[set];
--};
--
--
--/**
-- * Echos the value of a value. Trys to print the value out
-- * in the best way possible given the different types.
-- *
-- * @param {Object} obj The object to print out.
-- * @param {Object} opts Optional options object that alters the output.
-- */
--/* legacy: obj, showHidden, depth, colors*/
--function inspect(obj, opts) {
--  // default options
--  var ctx = {
--    seen: [],
--    stylize: stylizeNoColor
--  };
--  // legacy...
--  if (arguments.length >= 3) ctx.depth = arguments[2];
--  if (arguments.length >= 4) ctx.colors = arguments[3];
--  if (isBoolean(opts)) {
--    // legacy...
--    ctx.showHidden = opts;
--  } else if (opts) {
--    // got an "options" object
--    exports._extend(ctx, opts);
--  }
--  // set default options
--  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
--  if (isUndefined(ctx.depth)) ctx.depth = 2;
--  if (isUndefined(ctx.colors)) ctx.colors = false;
--  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
--  if (ctx.colors) ctx.stylize = stylizeWithColor;
--  return formatValue(ctx, obj, ctx.depth);
--}
--exports.inspect = inspect;
--
--
--// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
--inspect.colors = {
--  'bold' : [1, 22],
--  'italic' : [3, 23],
--  'underline' : [4, 24],
--  'inverse' : [7, 27],
--  'white' : [37, 39],
--  'grey' : [90, 39],
--  'black' : [30, 39],
--  'blue' : [34, 39],
--  'cyan' : [36, 39],
--  'green' : [32, 39],
--  'magenta' : [35, 39],
--  'red' : [31, 39],
--  'yellow' : [33, 39]
--};
--
--// Don't use 'blue' not visible on cmd.exe
--inspect.styles = {
--  'special': 'cyan',
--  'number': 'yellow',
--  'boolean': 'yellow',
--  'undefined': 'grey',
--  'null': 'bold',
--  'string': 'green',
--  'date': 'magenta',
--  // "name": intentionally not styling
--  'regexp': 'red'
--};
--
--
--function stylizeWithColor(str, styleType) {
--  var style = inspect.styles[styleType];
--
--  if (style) {
--    return '\u001b[' + inspect.colors[style][0] + 'm' + str +
--           '\u001b[' + inspect.colors[style][1] + 'm';
--  } else {
--    return str;
--  }
--}
--
--
--function stylizeNoColor(str, styleType) {
--  return str;
--}
--
--
--function arrayToHash(array) {
--  var hash = {};
--
--  array.forEach(function(val, idx) {
--    hash[val] = true;
--  });
--
--  return hash;
--}
--
--
--function formatValue(ctx, value, recurseTimes) {
--  // Provide a hook for user-specified inspect functions.
--  // Check that value is an object with an inspect function on it
--  if (ctx.customInspect &&
--      value &&
--      isFunction(value.inspect) &&
--      // Filter out the util module, it's inspect function is special
--      value.inspect !== exports.inspect &&
--      // Also filter out any prototype objects using the circular check.
--      !(value.constructor && value.constructor.prototype === value)) {
--    var ret = value.inspect(recurseTimes, ctx);
--    if (!isString(ret)) {
--      ret = formatValue(ctx, ret, recurseTimes);
--    }
--    return ret;
--  }
--
--  // Primitive types cannot have properties
--  var primitive = formatPrimitive(ctx, value);
--  if (primitive) {
--    return primitive;
--  }
--
--  // Look up the keys of the object.
--  var keys = Object.keys(value);
--  var visibleKeys = arrayToHash(keys);
--
--  if (ctx.showHidden) {
--    keys = Object.getOwnPropertyNames(value);
--  }
--
--  // Some type of object without properties can be shortcutted.
--  if (keys.length === 0) {
--    if (isFunction(value)) {
--      var name = value.name ? ': ' + value.name : '';
--      return ctx.stylize('[Function' + name + ']', 'special');
--    }
--    if (isRegExp(value)) {
--      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
--    }
--    if (isDate(value)) {
--      return ctx.stylize(Date.prototype.toString.call(value), 'date');
--    }
--    if (isError(value)) {
--      return formatError(value);
--    }
--  }
--
--  var base = '', array = false, braces = ['{', '}'];
--
--  // Make Array say that they are Array
--  if (isArray(value)) {
--    array = true;
--    braces = ['[', ']'];
--  }
--
--  // Make functions say that they are functions
--  if (isFunction(value)) {
--    var n = value.name ? ': ' + value.name : '';
--    base = ' [Function' + n + ']';
--  }
--
--  // Make RegExps say that they are RegExps
--  if (isRegExp(value)) {
--    base = ' ' + RegExp.prototype.toString.call(value);
--  }
--
--  // Make dates with properties first say the date
--  if (isDate(value)) {
--    base = ' ' + Date.prototype.toUTCString.call(value);
--  }
--
--  // Make error with message first say the error
--  if (isError(value)) {
--    base = ' ' + formatError(value);
--  }
--
--  if (keys.length === 0 && (!array || value.length == 0)) {
--    return braces[0] + base + braces[1];
--  }
--
--  if (recurseTimes < 0) {
--    if (isRegExp(value)) {
--      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
--    } else {
--      return ctx.stylize('[Object]', 'special');
--    }
--  }
--
--  ctx.seen.push(value);
--
--  var output;
--  if (array) {
--    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
--  } else {
--    output = keys.map(function(key) {
--      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
--    });
--  }
--
--  ctx.seen.pop();
--
--  return reduceToSingleString(output, base, braces);
--}
--
--
--function formatPrimitive(ctx, value) {
--  if (isUndefined(value))
--    return ctx.stylize('undefined', 'undefined');
--  if (isString(value)) {
--    var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
--                                             .replace(/'/g, "\\'")
--                                             .replace(/\\"/g, '"') + '\'';
--    return ctx.stylize(simple, 'string');
--  }
--  if (isNumber(value)) {
--    // Format -0 as '-0'. Strict equality won't distinguish 0 from -0,
--    // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 .
--    if (value === 0 && 1 / value < 0)
--      return ctx.stylize('-0', 'number');
--    return ctx.stylize('' + value, 'number');
--  }
--  if (isBoolean(value))
--    return ctx.stylize('' + value, 'boolean');
--  // For some reason typeof null is "object", so special case here.
--  if (isNull(value))
--    return ctx.stylize('null', 'null');
--}
--
--
--function formatError(value) {
--  return '[' + Error.prototype.toString.call(value) + ']';
--}
--
--
--function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
--  var output = [];
--  for (var i = 0, l = value.length; i < l; ++i) {
--    if (hasOwnProperty(value, String(i))) {
--      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
--          String(i), true));
--    } else {
--      output.push('');
--    }
--  }
--  keys.forEach(function(key) {
--    if (!key.match(/^\d+$/)) {
--      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
--          key, true));
--    }
--  });
--  return output;
--}
--
--
--function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
--  var name, str, desc;
--  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
--  if (desc.get) {
--    if (desc.set) {
--      str = ctx.stylize('[Getter/Setter]', 'special');
--    } else {
--      str = ctx.stylize('[Getter]', 'special');
--    }
--  } else {
--    if (desc.set) {
--      str = ctx.stylize('[Setter]', 'special');
--    }
--  }
--  if (!hasOwnProperty(visibleKeys, key)) {
--    name = '[' + key + ']';
--  }
--  if (!str) {
--    if (ctx.seen.indexOf(desc.value) < 0) {
--      if (isNull(recurseTimes)) {
--        str = formatValue(ctx, desc.value, null);
--      } else {
--        str = formatValue(ctx, desc.value, recurseTimes - 1);
--      }
--      if (str.indexOf('\n') > -1) {
--        if (array) {
--          str = str.split('\n').map(function(line) {
--            return '  ' + line;
--          }).join('\n').substr(2);
--        } else {
--          str = '\n' + str.split('\n').map(function(line) {
--            return '   ' + line;
--          }).join('\n');
--        }
--      }
--    } else {
--      str = ctx.stylize('[Circular]', 'special');
--    }
--  }
--  if (isUndefined(name)) {
--    if (array && key.match(/^\d+$/)) {
--      return str;
--    }
--    name = JSON.stringify('' + key);
--    if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
--      name = name.substr(1, name.length - 2);
--      name = ctx.stylize(name, 'name');
--    } else {
--      name = name.replace(/'/g, "\\'")
--                 .replace(/\\"/g, '"')
--                 .replace(/(^"|"$)/g, "'");
--      name = ctx.stylize(name, 'string');
--    }
--  }
--
--  return name + ': ' + str;
--}
--
--
--function reduceToSingleString(output, base, braces) {
--  var numLinesEst = 0;
--  var length = output.reduce(function(prev, cur) {
--    numLinesEst++;
--    if (cur.indexOf('\n') >= 0) numLinesEst++;
--    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
--  }, 0);
--
--  if (length > 60) {
--    return braces[0] +
--           (base === '' ? '' : base + '\n ') +
--           ' ' +
--           output.join(',\n  ') +
--           ' ' +
--           braces[1];
--  }
--
--  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
--}
--
--
- // NOTE: These type checking functions intentionally don't use `instanceof`
- // because it is fragile and can be easily faked with `Object.create()`.
- function isArray(ar) {
-@@ -522,166 +98,10 @@ function isPrimitive(arg) {
- exports.isPrimitive = isPrimitive;
-
- function isBuffer(arg) {
--  return arg instanceof Buffer;
-+  return Buffer.isBuffer(arg);
- }
- exports.isBuffer = isBuffer;
-
- function objectToString(o) {
-   return Object.prototype.toString.call(o);
--}
--
--
--function pad(n) {
--  return n < 10 ? '0' + n.toString(10) : n.toString(10);
--}
--
--
--var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
--              'Oct', 'Nov', 'Dec'];
--
--// 26 Feb 16:19:34
--function timestamp() {
--  var d = new Date();
--  var time = [pad(d.getHours()),
--              pad(d.getMinutes()),
--              pad(d.getSeconds())].join(':');
--  return [d.getDate(), months[d.getMonth()], time].join(' ');
--}
--
--
--// log is just a thin wrapper to console.log that prepends a timestamp
--exports.log = function() {
--  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
--};
--
--
--/**
-- * Inherit the prototype methods from one constructor into another.
-- *
-- * The Function.prototype.inherits from lang.js rewritten as a standalone
-- * function (not on Function.prototype). NOTE: If this file is to be loaded
-- * during bootstrapping this function needs to be rewritten using some native
-- * functions as prototype setup using normal JavaScript does not work as
-- * expected during bootstrapping (see mirror.js in r114903).
-- *
-- * @param {function} ctor Constructor function which needs to inherit the
-- *     prototype.
-- * @param {function} superCtor Constructor function to inherit prototype from.
-- */
--exports.inherits = function(ctor, superCtor) {
--  ctor.super_ = superCtor;
--  ctor.prototype = Object.create(superCtor.prototype, {
--    constructor: {
--      value: ctor,
--      enumerable: false,
--      writable: true,
--      configurable: true
--    }
--  });
--};
--
--exports._extend = function(origin, add) {
--  // Don't do anything if add isn't an object
--  if (!add || !isObject(add)) return origin;
--
--  var keys = Object.keys(add);
--  var i = keys.length;
--  while (i--) {
--    origin[keys[i]] = add[keys[i]];
--  }
--  return origin;
--};
--
--function hasOwnProperty(obj, prop) {
--  return Object.prototype.hasOwnProperty.call(obj, prop);
--}
--
--
--// Deprecated old stuff.
--
--exports.p = exports.deprecate(function() {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    console.error(exports.inspect(arguments[i]));
--  }
--}, 'util.p: Use console.error() instead');
--
--
--exports.exec = exports.deprecate(function() {
--  return require('child_process').exec.apply(this, arguments);
--}, 'util.exec is now called `child_process.exec`.');
--
--
--exports.print = exports.deprecate(function() {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    process.stdout.write(String(arguments[i]));
--  }
--}, 'util.print: Use console.log instead');
--
--
--exports.puts = exports.deprecate(function() {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    process.stdout.write(arguments[i] + '\n');
--  }
--}, 'util.puts: Use console.log instead');
--
--
--exports.debug = exports.deprecate(function(x) {
--  process.stderr.write('DEBUG: ' + x + '\n');
--}, 'util.debug: Use console.error instead');
--
--
--exports.error = exports.deprecate(function(x) {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    process.stderr.write(arguments[i] + '\n');
--  }
--}, 'util.error: Use console.error instead');
--
--
--exports.pump = exports.deprecate(function(readStream, writeStream, callback) {
--  var callbackCalled = false;
--
--  function call(a, b, c) {
--    if (callback && !callbackCalled) {
--      callback(a, b, c);
--      callbackCalled = true;
--    }
--  }
--
--  readStream.addListener('data', function(chunk) {
--    if (writeStream.write(chunk) === false) readStream.pause();
--  });
--
--  writeStream.addListener('drain', function() {
--    readStream.resume();
--  });
--
--  readStream.addListener('end', function() {
--    writeStream.end();
--  });
--
--  readStream.addListener('close', function() {
--    call();
--  });
--
--  readStream.addListener('error', function(err) {
--    writeStream.end();
--    call(err);
--  });
--
--  writeStream.addListener('error', function(err) {
--    readStream.destroy();
--    call(err);
--  });
--}, 'util.pump(): Use readableStream.pipe() instead');
--
--
--var uv;
--exports._errnoException = function(err, syscall) {
--  if (isUndefined(uv)) uv = process.binding('uv');
--  var errname = uv.errname(err);
--  var e = new Error(syscall + ' ' + errname);
--  e.code = errname;
--  e.errno = errname;
--  e.syscall = syscall;
--  return e;
--};
-+}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/lib/util.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/lib/util.js
deleted file mode 100644
index ff4c851c075a2f0fd1654419178eceb22a836100..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/lib/util.js
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// NOTE: These type checking functions intentionally don't use `instanceof`
-// because it is fragile and can be easily faked with `Object.create()`.
-
-function isArray(arg) {
-  if (Array.isArray) {
-    return Array.isArray(arg);
-  }
-  return objectToString(arg) === '[object Array]';
-}
-exports.isArray = isArray;
-
-function isBoolean(arg) {
-  return typeof arg === 'boolean';
-}
-exports.isBoolean = isBoolean;
-
-function isNull(arg) {
-  return arg === null;
-}
-exports.isNull = isNull;
-
-function isNullOrUndefined(arg) {
-  return arg == null;
-}
-exports.isNullOrUndefined = isNullOrUndefined;
-
-function isNumber(arg) {
-  return typeof arg === 'number';
-}
-exports.isNumber = isNumber;
-
-function isString(arg) {
-  return typeof arg === 'string';
-}
-exports.isString = isString;
-
-function isSymbol(arg) {
-  return typeof arg === 'symbol';
-}
-exports.isSymbol = isSymbol;
-
-function isUndefined(arg) {
-  return arg === void 0;
-}
-exports.isUndefined = isUndefined;
-
-function isRegExp(re) {
-  return objectToString(re) === '[object RegExp]';
-}
-exports.isRegExp = isRegExp;
-
-function isObject(arg) {
-  return typeof arg === 'object' && arg !== null;
-}
-exports.isObject = isObject;
-
-function isDate(d) {
-  return objectToString(d) === '[object Date]';
-}
-exports.isDate = isDate;
-
-function isError(e) {
-  return (objectToString(e) === '[object Error]' || e instanceof Error);
-}
-exports.isError = isError;
-
-function isFunction(arg) {
-  return typeof arg === 'function';
-}
-exports.isFunction = isFunction;
-
-function isPrimitive(arg) {
-  return arg === null ||
-         typeof arg === 'boolean' ||
-         typeof arg === 'number' ||
-         typeof arg === 'string' ||
-         typeof arg === 'symbol' ||  // ES6 symbol
-         typeof arg === 'undefined';
-}
-exports.isPrimitive = isPrimitive;
-
-exports.isBuffer = Buffer.isBuffer;
-
-function objectToString(o) {
-  return Object.prototype.toString.call(o);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json
deleted file mode 100644
index 4a247030441a5548f4f294295bb53afe5cd032ad..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/package.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-  "_from": "core-util-is@>=1.0.0 <1.1.0",
-  "_id": "core-util-is@1.0.2",
-  "_location": "/serialport/node-pre-gyp/request/bl/readable-stream/core-util-is",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/bl/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-  "_shasum": "b5fd54220aa2bc5ab57aab7140c940754503c1a7",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/core-util-is/issues"
-  },
-  "dependencies": {},
-  "description": "The `util.is*` functions introduced in Node v0.12.",
-  "devDependencies": {
-    "tap": "^2.3.0"
-  },
-  "homepage": "https://github.com/isaacs/core-util-is#readme",
-  "keywords": [
-    "isArray",
-    "isBuffer",
-    "isNumber",
-    "isRegExp",
-    "isString",
-    "isThat",
-    "isThis",
-    "polyfill",
-    "util"
-  ],
-  "license": "MIT",
-  "main": "lib/util.js",
-  "name": "core-util-is",
-  "optionalDependencies": {},
-  "readme": "# core-util-is\n\nThe `util.is*` functions introduced in Node v0.12.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/core-util-is.git"
-  },
-  "scripts": {
-    "test": "tap test.js"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/test.js
deleted file mode 100644
index 1a490c65ac8b5df16357c0e90de3825e150d1164..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/core-util-is/test.js
+++ /dev/null
@@ -1,68 +0,0 @@
-var assert = require('tap');
-
-var t = require('./lib/util');
-
-assert.equal(t.isArray([]), true);
-assert.equal(t.isArray({}), false);
-
-assert.equal(t.isBoolean(null), false);
-assert.equal(t.isBoolean(true), true);
-assert.equal(t.isBoolean(false), true);
-
-assert.equal(t.isNull(null), true);
-assert.equal(t.isNull(undefined), false);
-assert.equal(t.isNull(false), false);
-assert.equal(t.isNull(), false);
-
-assert.equal(t.isNullOrUndefined(null), true);
-assert.equal(t.isNullOrUndefined(undefined), true);
-assert.equal(t.isNullOrUndefined(false), false);
-assert.equal(t.isNullOrUndefined(), true);
-
-assert.equal(t.isNumber(null), false);
-assert.equal(t.isNumber('1'), false);
-assert.equal(t.isNumber(1), true);
-
-assert.equal(t.isString(null), false);
-assert.equal(t.isString('1'), true);
-assert.equal(t.isString(1), false);
-
-assert.equal(t.isSymbol(null), false);
-assert.equal(t.isSymbol('1'), false);
-assert.equal(t.isSymbol(1), false);
-assert.equal(t.isSymbol(Symbol()), true);
-
-assert.equal(t.isUndefined(null), false);
-assert.equal(t.isUndefined(undefined), true);
-assert.equal(t.isUndefined(false), false);
-assert.equal(t.isUndefined(), true);
-
-assert.equal(t.isRegExp(null), false);
-assert.equal(t.isRegExp('1'), false);
-assert.equal(t.isRegExp(new RegExp()), true);
-
-assert.equal(t.isObject({}), true);
-assert.equal(t.isObject([]), true);
-assert.equal(t.isObject(new RegExp()), true);
-assert.equal(t.isObject(new Date()), true);
-
-assert.equal(t.isDate(null), false);
-assert.equal(t.isDate('1'), false);
-assert.equal(t.isDate(new Date()), true);
-
-assert.equal(t.isError(null), false);
-assert.equal(t.isError({ err: true }), false);
-assert.equal(t.isError(new Error()), true);
-
-assert.equal(t.isFunction(null), false);
-assert.equal(t.isFunction({ }), false);
-assert.equal(t.isFunction(function() {}), true);
-
-assert.equal(t.isPrimitive(null), true);
-assert.equal(t.isPrimitive(''), true);
-assert.equal(t.isPrimitive(0), true);
-assert.equal(t.isPrimitive(new Date()), false);
-
-assert.equal(t.isBuffer(null), false);
-assert.equal(t.isBuffer({}), false);
-assert.equal(t.isBuffer(new Buffer(0)), true);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/LICENSE
deleted file mode 100644
index dea3013d6710ee273f49ac606a65d5211d480c88..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/LICENSE
+++ /dev/null
@@ -1,16 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/README.md
deleted file mode 100644
index b1c56658557b8162aa9f5ba8610ed03a5e558d9d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-Browser-friendly inheritance fully compatible with standard node.js
-[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
-
-This package exports standard `inherits` from node.js `util` module in
-node environment, but also provides alternative browser-friendly
-implementation through [browser
-field](https://gist.github.com/shtylman/4339901). Alternative
-implementation is a literal copy of standard one located in standalone
-module to avoid requiring of `util`. It also has a shim for old
-browsers with no `Object.create` support.
-
-While keeping you sure you are using standard `inherits`
-implementation in node.js environment, it allows bundlers such as
-[browserify](https://github.com/substack/node-browserify) to not
-include full `util` package to your client code if all you need is
-just `inherits` function. It worth, because browser shim for `util`
-package is large and `inherits` is often the single function you need
-from it.
-
-It's recommended to use this package instead of
-`require('util').inherits` for any code that has chances to be used
-not only in node.js but in browser too.
-
-## usage
-
-```js
-var inherits = require('inherits');
-// then use exactly as the standard one
-```
-
-## note on version ~1.0
-
-Version ~1.0 had completely different motivation and is not compatible
-neither with 2.0 nor with standard node.js `inherits`.
-
-If you are using version ~1.0 and planning to switch to ~2.0, be
-careful:
-
-* new version uses `super_` instead of `super` for referencing
-  superclass
-* new version overwrites current prototype while old one preserves any
-  existing fields on it
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits.js
deleted file mode 100644
index 29f5e24f57b5aacb9f199dea05a57fcbf4918bc1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('util').inherits
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits_browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits_browser.js
deleted file mode 100644
index c1e78a75e6b52b7434e7e8aa0d64d8abd593763b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/inherits_browser.js
+++ /dev/null
@@ -1,23 +0,0 @@
-if (typeof Object.create === 'function') {
-  // implementation from standard node.js 'util' module
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    ctor.prototype = Object.create(superCtor.prototype, {
-      constructor: {
-        value: ctor,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-  };
-} else {
-  // old school shim for old browsers
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    var TempCtor = function () {}
-    TempCtor.prototype = superCtor.prototype
-    ctor.prototype = new TempCtor()
-    ctor.prototype.constructor = ctor
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/package.json
deleted file mode 100644
index 7e6a0410824d2997ff0e9e23f0f6b7fe9c9f2e60..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "_from": "inherits@>=2.0.1 <2.1.0",
-  "_id": "inherits@2.0.1",
-  "_location": "/serialport/node-pre-gyp/request/bl/readable-stream/inherits",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/bl/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-  "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1",
-  "_shrinkwrap": null,
-  "browser": "./inherits_browser.js",
-  "bugs": {
-    "url": "https://github.com/isaacs/inherits/issues"
-  },
-  "dependencies": {},
-  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
-  "devDependencies": {},
-  "homepage": "https://github.com/isaacs/inherits#readme",
-  "keywords": [
-    "browser",
-    "browserify",
-    "class",
-    "inheritance",
-    "inherits",
-    "klass",
-    "object-oriented",
-    "oop"
-  ],
-  "license": "ISC",
-  "main": "./inherits.js",
-  "name": "inherits",
-  "optionalDependencies": {},
-  "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n  superclass\n* new version overwrites current prototype while old one preserves any\n  existing fields on it\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/inherits.git"
-  },
-  "scripts": {
-    "test": "node test"
-  },
-  "version": "2.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/test.js
deleted file mode 100644
index fc53012d31c0cde4f4bca408e7470e35a06f88fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/inherits/test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var inherits = require('./inherits.js')
-var assert = require('assert')
-
-function test(c) {
-  assert(c.constructor === Child)
-  assert(c.constructor.super_ === Parent)
-  assert(Object.getPrototypeOf(c) === Child.prototype)
-  assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype)
-  assert(c instanceof Child)
-  assert(c instanceof Parent)
-}
-
-function Child() {
-  Parent.call(this)
-  test(this)
-}
-
-function Parent() {}
-
-inherits(Child, Parent)
-
-var c = new Child
-test(c)
-
-console.log('ok')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/.npmignore
deleted file mode 100644
index 3c3629e647f5ddf82548912e337bea9826b434af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/.travis.yml
deleted file mode 100644
index cc4dba29d959a2da7b97f9edd3c7c91384b2ee5b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/Makefile b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/Makefile
deleted file mode 100644
index 787d56e1e982e48588bc199f36f0d50cb4724066..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-
-test:
-	@node_modules/.bin/tape test.js
-
-.PHONY: test
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/README.md
deleted file mode 100644
index 16d2c59c6195f9a1ac9af37cb9d75f1a6b85ab01..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/README.md
+++ /dev/null
@@ -1,60 +0,0 @@
-
-# isarray
-
-`Array#isArray` for older browsers.
-
-[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray)
-[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray)
-
-[![browser support](https://ci.testling.com/juliangruber/isarray.png)
-](https://ci.testling.com/juliangruber/isarray)
-
-## Usage
-
-```js
-var isArray = require('isarray');
-
-console.log(isArray([])); // => true
-console.log(isArray({})); // => false
-```
-
-## Installation
-
-With [npm](http://npmjs.org) do
-
-```bash
-$ npm install isarray
-```
-
-Then bundle for the browser with
-[browserify](https://github.com/substack/browserify).
-
-With [component](http://component.io) do
-
-```bash
-$ component install juliangruber/isarray
-```
-
-## License
-
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/component.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/component.json
deleted file mode 100644
index 9e31b6838890159e397063bdd2ea7de80b4e4a42..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/component.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name" : "isarray",
-  "description" : "Array#isArray for older browsers",
-  "version" : "0.0.1",
-  "repository" : "juliangruber/isarray",
-  "homepage": "https://github.com/juliangruber/isarray",
-  "main" : "index.js",
-  "scripts" : [
-    "index.js"
-  ],
-  "dependencies" : {},
-  "keywords": ["browser","isarray","array"],
-  "author": {
-    "name": "Julian Gruber",
-    "email": "mail@juliangruber.com",
-    "url": "http://juliangruber.com"
-  },
-  "license": "MIT"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/index.js
deleted file mode 100644
index a57f63495943a07b3b08d17e0f9ef6793548c801..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var toString = {}.toString;
-
-module.exports = Array.isArray || function (arr) {
-  return toString.call(arr) == '[object Array]';
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/package.json
deleted file mode 100644
index b918618159b9723e4d0215bc1ee52246e825924e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "_from": "isarray@>=1.0.0 <1.1.0",
-  "_id": "isarray@1.0.0",
-  "_location": "/serialport/node-pre-gyp/request/bl/readable-stream/isarray",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/bl/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-  "_shasum": "bb935d48582cba168c06834957a54a3e07124f11",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@juliangruber.com",
-    "name": "Julian Gruber",
-    "url": "http://juliangruber.com"
-  },
-  "bugs": {
-    "url": "https://github.com/juliangruber/isarray/issues"
-  },
-  "dependencies": {},
-  "description": "Array#isArray for older browsers",
-  "devDependencies": {
-    "tape": "~2.13.4"
-  },
-  "homepage": "https://github.com/juliangruber/isarray",
-  "keywords": [
-    "array",
-    "browser",
-    "isarray"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "isarray",
-  "optionalDependencies": {},
-  "readme": "\n# isarray\n\n`Array#isArray` for older browsers.\n\n[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray)\n[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray)\n\n[![browser support](https://ci.testling.com/juliangruber/isarray.png)\n](https://ci.testling.com/juliangruber/isarray)\n\n## Usage\n\n```js\nvar isArray = require('isarray');\n\nconsole.log(isArray([])); // => true\nconsole.log(isArray({})); // => false\n```\n\n## Installation\n\nWith [npm](http://npmjs.org) do\n\n```bash\n$ npm install isarray\n```\n\nThen bundle for the browser with\n[browserify](https://github.com/substack/browserify).\n\nWith [component](http://component.io) do\n\n```bash\n$ component install juliangruber/isarray\n```\n\n## License\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/isarray.git"
-  },
-  "scripts": {
-    "test": "tape test.js"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2..latest",
-      "chrome/22..latest",
-      "chrome/canary",
-      "firefox/17..latest",
-      "firefox/nightly",
-      "ie/8..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest"
-    ],
-    "files": "test.js"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/test.js
deleted file mode 100644
index e0c3444d85d5c799bd70b2ee9df62ef56d9763ea..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/isarray/test.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var isArray = require('./');
-var test = require('tape');
-
-test('is array', function(t){
-  t.ok(isArray([]));
-  t.notOk(isArray({}));
-  t.notOk(isArray(null));
-  t.notOk(isArray(false));
-
-  var obj = {};
-  obj[0] = true;
-  t.notOk(isArray(obj));
-
-  var arr = [];
-  arr.foo = 'bar';
-  t.ok(isArray(arr));
-
-  t.end();
-});
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/.travis.yml
deleted file mode 100644
index 36201b10017a5e0533961815850e393d54ceecb8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
-  - "0.11"
-  - "0.12"
-  - "1.7.1"
-  - 1
-  - 2
-  - 3
-  - 4
-  - 5
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/index.js
deleted file mode 100644
index a4f40f845faa65905ec20c08c254fcac474e2c8f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/index.js
+++ /dev/null
@@ -1,43 +0,0 @@
-'use strict';
-
-if (!process.version ||
-    process.version.indexOf('v0.') === 0 ||
-    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
-  module.exports = nextTick;
-} else {
-  module.exports = process.nextTick;
-}
-
-function nextTick(fn, arg1, arg2, arg3) {
-  if (typeof fn !== 'function') {
-    throw new TypeError('"callback" argument must be a function');
-  }
-  var len = arguments.length;
-  var args, i;
-  switch (len) {
-  case 0:
-  case 1:
-    return process.nextTick(fn);
-  case 2:
-    return process.nextTick(function afterTickOne() {
-      fn.call(null, arg1);
-    });
-  case 3:
-    return process.nextTick(function afterTickTwo() {
-      fn.call(null, arg1, arg2);
-    });
-  case 4:
-    return process.nextTick(function afterTickThree() {
-      fn.call(null, arg1, arg2, arg3);
-    });
-  default:
-    args = new Array(len - 1);
-    i = 0;
-    while (i < args.length) {
-      args[i++] = arguments[i];
-    }
-    return process.nextTick(function afterTick() {
-      fn.apply(null, args);
-    });
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/license.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/license.md
deleted file mode 100644
index c67e3532b542455fad8c4004ef297534d7f480b2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/license.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (c) 2015 Calvin Metcalf
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.**
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/package.json
deleted file mode 100644
index 8da9b0e6a053c2187ad742f06449b2ce5b2be86d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "_from": "process-nextick-args@>=1.0.6 <1.1.0",
-  "_id": "process-nextick-args@1.0.7",
-  "_location": "/serialport/node-pre-gyp/request/bl/readable-stream/process-nextick-args",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/bl/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
-  "_shasum": "150e20b756590ad3f91093f25a4f2ad8bff30ba3",
-  "_shrinkwrap": null,
-  "author": "",
-  "bugs": {
-    "url": "https://github.com/calvinmetcalf/process-nextick-args/issues"
-  },
-  "dependencies": {},
-  "description": "process.nextTick but always with args",
-  "devDependencies": {
-    "tap": "~0.2.6"
-  },
-  "homepage": "https://github.com/calvinmetcalf/process-nextick-args",
-  "license": "MIT",
-  "main": "index.js",
-  "name": "process-nextick-args",
-  "optionalDependencies": {},
-  "readme": "process-nextick-args\n=====\n\n[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args)\n\n```bash\nnpm install --save process-nextick-args\n```\n\nAlways be able to pass arguments to process.nextTick, no matter the platform\n\n```js\nvar nextTick = require('process-nextick-args');\n\nnextTick(function (a, b, c) {\n  console.log(a, b, c);\n}, 'step', 3,  'profit');\n```\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/calvinmetcalf/process-nextick-args.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "1.0.7"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/readme.md
deleted file mode 100644
index 78e7cfaeb7acdef0248b6820e5ec48302eebf1a0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/readme.md
+++ /dev/null
@@ -1,18 +0,0 @@
-process-nextick-args
-=====
-
-[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args)
-
-```bash
-npm install --save process-nextick-args
-```
-
-Always be able to pass arguments to process.nextTick, no matter the platform
-
-```js
-var nextTick = require('process-nextick-args');
-
-nextTick(function (a, b, c) {
-  console.log(a, b, c);
-}, 'step', 3,  'profit');
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/test.js
deleted file mode 100644
index ef15721584ac9973198e407f6ce3beadf95d5fff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/process-nextick-args/test.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var test = require("tap").test;
-var nextTick = require('./');
-
-test('should work', function (t) {
-  t.plan(5);
-  nextTick(function (a) {
-    t.ok(a);
-    nextTick(function (thing) {
-      t.equals(thing, 7);
-    }, 7);
-  }, true);
-  nextTick(function (a, b, c) {
-    t.equals(a, 'step');
-    t.equals(b, 3);
-    t.equals(c, 'profit');
-  }, 'step', 3,  'profit');
-});
-
-test('correct number of arguments', function (t) {
-  t.plan(1);
-  nextTick(function () {
-    t.equals(2, arguments.length, 'correct number');
-  }, 1, 2);
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/.npmignore
deleted file mode 100644
index 206320cc1d21b9cc9e3e0e8a303896045453c524..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build
-test
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/LICENSE
deleted file mode 100644
index 6de584a48f5c897d27bfe9922f976297c07cae02..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright Joyent, Inc. and other Node contributors.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to permit
-persons to whom the Software is furnished to do so, subject to the
-following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/README.md
deleted file mode 100644
index 4d2aa001501107cd2792f385ad62237dc3757521..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-**string_decoder.js** (`require('string_decoder')`) from Node.js core
-
-Copyright Joyent, Inc. and other Node contributors. See LICENCE file for details.
-
-Version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. **Prefer the stable version over the unstable.**
-
-The *build/* directory contains a build script that will scrape the source from the [joyent/node](https://github.com/joyent/node) repo given a specific Node version.
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/index.js
deleted file mode 100644
index b00e54fb7909827a02b6fa96ef55bd4dd85a3fe7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/index.js
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Buffer = require('buffer').Buffer;
-
-var isBufferEncoding = Buffer.isEncoding
-  || function(encoding) {
-       switch (encoding && encoding.toLowerCase()) {
-         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;
-         default: return false;
-       }
-     }
-
-
-function assertEncoding(encoding) {
-  if (encoding && !isBufferEncoding(encoding)) {
-    throw new Error('Unknown encoding: ' + encoding);
-  }
-}
-
-// StringDecoder provides an interface for efficiently splitting a series of
-// buffers into a series of JS strings without breaking apart multi-byte
-// characters. CESU-8 is handled as part of the UTF-8 encoding.
-//
-// @TODO Handling all encodings inside a single object makes it very difficult
-// to reason about this code, so it should be split up in the future.
-// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
-// points as used by CESU-8.
-var StringDecoder = exports.StringDecoder = function(encoding) {
-  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
-  assertEncoding(encoding);
-  switch (this.encoding) {
-    case 'utf8':
-      // CESU-8 represents each of Surrogate Pair by 3-bytes
-      this.surrogateSize = 3;
-      break;
-    case 'ucs2':
-    case 'utf16le':
-      // UTF-16 represents each of Surrogate Pair by 2-bytes
-      this.surrogateSize = 2;
-      this.detectIncompleteChar = utf16DetectIncompleteChar;
-      break;
-    case 'base64':
-      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
-      this.surrogateSize = 3;
-      this.detectIncompleteChar = base64DetectIncompleteChar;
-      break;
-    default:
-      this.write = passThroughWrite;
-      return;
-  }
-
-  // Enough space to store all bytes of a single character. UTF-8 needs 4
-  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
-  this.charBuffer = new Buffer(6);
-  // Number of bytes received for the current incomplete multi-byte character.
-  this.charReceived = 0;
-  // Number of bytes expected for the current incomplete multi-byte character.
-  this.charLength = 0;
-};
-
-
-// write decodes the given buffer and returns it as JS string that is
-// guaranteed to not contain any partial multi-byte characters. Any partial
-// character found at the end of the buffer is buffered up, and will be
-// returned when calling write again with the remaining bytes.
-//
-// Note: Converting a Buffer containing an orphan surrogate to a String
-// currently works, but converting a String to a Buffer (via `new Buffer`, or
-// Buffer#write) will replace incomplete surrogates with the unicode
-// replacement character. See https://codereview.chromium.org/121173009/ .
-StringDecoder.prototype.write = function(buffer) {
-  var charStr = '';
-  // if our last write ended with an incomplete multibyte character
-  while (this.charLength) {
-    // determine how many remaining bytes this buffer has to offer for this char
-    var available = (buffer.length >= this.charLength - this.charReceived) ?
-        this.charLength - this.charReceived :
-        buffer.length;
-
-    // add the new bytes to the char buffer
-    buffer.copy(this.charBuffer, this.charReceived, 0, available);
-    this.charReceived += available;
-
-    if (this.charReceived < this.charLength) {
-      // still not enough chars in this buffer? wait for more ...
-      return '';
-    }
-
-    // remove bytes belonging to the current character from the buffer
-    buffer = buffer.slice(available, buffer.length);
-
-    // get the character that was split
-    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
-
-    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
-    var charCode = charStr.charCodeAt(charStr.length - 1);
-    if (charCode >= 0xD800 && charCode <= 0xDBFF) {
-      this.charLength += this.surrogateSize;
-      charStr = '';
-      continue;
-    }
-    this.charReceived = this.charLength = 0;
-
-    // if there are no more bytes in this buffer, just emit our char
-    if (buffer.length === 0) {
-      return charStr;
-    }
-    break;
-  }
-
-  // determine and set charLength / charReceived
-  this.detectIncompleteChar(buffer);
-
-  var end = buffer.length;
-  if (this.charLength) {
-    // buffer the incomplete character bytes we got
-    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
-    end -= this.charReceived;
-  }
-
-  charStr += buffer.toString(this.encoding, 0, end);
-
-  var end = charStr.length - 1;
-  var charCode = charStr.charCodeAt(end);
-  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
-  if (charCode >= 0xD800 && charCode <= 0xDBFF) {
-    var size = this.surrogateSize;
-    this.charLength += size;
-    this.charReceived += size;
-    this.charBuffer.copy(this.charBuffer, size, 0, size);
-    buffer.copy(this.charBuffer, 0, 0, size);
-    return charStr.substring(0, end);
-  }
-
-  // or just emit the charStr
-  return charStr;
-};
-
-// detectIncompleteChar determines if there is an incomplete UTF-8 character at
-// the end of the given buffer. If so, it sets this.charLength to the byte
-// length that character, and sets this.charReceived to the number of bytes
-// that are available for this character.
-StringDecoder.prototype.detectIncompleteChar = function(buffer) {
-  // determine how many bytes we have to check at the end of this buffer
-  var i = (buffer.length >= 3) ? 3 : buffer.length;
-
-  // Figure out if one of the last i bytes of our buffer announces an
-  // incomplete char.
-  for (; i > 0; i--) {
-    var c = buffer[buffer.length - i];
-
-    // See http://en.wikipedia.org/wiki/UTF-8#Description
-
-    // 110XXXXX
-    if (i == 1 && c >> 5 == 0x06) {
-      this.charLength = 2;
-      break;
-    }
-
-    // 1110XXXX
-    if (i <= 2 && c >> 4 == 0x0E) {
-      this.charLength = 3;
-      break;
-    }
-
-    // 11110XXX
-    if (i <= 3 && c >> 3 == 0x1E) {
-      this.charLength = 4;
-      break;
-    }
-  }
-  this.charReceived = i;
-};
-
-StringDecoder.prototype.end = function(buffer) {
-  var res = '';
-  if (buffer && buffer.length)
-    res = this.write(buffer);
-
-  if (this.charReceived) {
-    var cr = this.charReceived;
-    var buf = this.charBuffer;
-    var enc = this.encoding;
-    res += buf.slice(0, cr).toString(enc);
-  }
-
-  return res;
-};
-
-function passThroughWrite(buffer) {
-  return buffer.toString(this.encoding);
-}
-
-function utf16DetectIncompleteChar(buffer) {
-  this.charReceived = buffer.length % 2;
-  this.charLength = this.charReceived ? 2 : 0;
-}
-
-function base64DetectIncompleteChar(buffer) {
-  this.charReceived = buffer.length % 3;
-  this.charLength = this.charReceived ? 3 : 0;
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json
deleted file mode 100644
index 35f72307899c18bdf872d7a26606218cefa9882e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/string_decoder/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "_from": "string_decoder@>=0.10.0 <0.11.0",
-  "_id": "string_decoder@0.10.31",
-  "_location": "/serialport/node-pre-gyp/request/bl/readable-stream/string_decoder",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/bl/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-  "_shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/rvagg/string_decoder/issues"
-  },
-  "dependencies": {},
-  "description": "The string_decoder module from Node core",
-  "devDependencies": {
-    "tap": "~0.4.8"
-  },
-  "homepage": "https://github.com/rvagg/string_decoder",
-  "keywords": [
-    "browser",
-    "browserify",
-    "decoder",
-    "string"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "string_decoder",
-  "optionalDependencies": {},
-  "readme": "**string_decoder.js** (`require('string_decoder')`) from Node.js core\n\nCopyright Joyent, Inc. and other Node contributors. See LICENCE file for details.\n\nVersion numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. **Prefer the stable version over the unstable.**\n\nThe *build/* directory contains a build script that will scrape the source from the [joyent/node](https://github.com/joyent/node) repo given a specific Node version.",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/rvagg/string_decoder.git"
-  },
-  "scripts": {
-    "test": "tap test/simple/*.js"
-  },
-  "version": "0.10.31"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/History.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/History.md
deleted file mode 100644
index acc8675372e980824723cfcfec09c0ba43a3195a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/History.md
+++ /dev/null
@@ -1,16 +0,0 @@
-
-1.0.2 / 2015-10-07
-==================
-
-  * use try/catch when checking `localStorage` (#3, @kumavis)
-
-1.0.1 / 2014-11-25
-==================
-
-  * browser: use `console.warn()` for deprecation calls
-  * browser: more jsdocs
-
-1.0.0 / 2014-04-30
-==================
-
-  * initial commit
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/LICENSE
deleted file mode 100644
index 6a60e8c225c9baca25907f87c74b428e5d85de0c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/README.md
deleted file mode 100644
index 75622fa7c250a6605f4778d9dffe97bf60291d17..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-util-deprecate
-==============
-### The Node.js `util.deprecate()` function with browser support
-
-In Node.js, this module simply re-exports the `util.deprecate()` function.
-
-In the web browser (i.e. via browserify), a browser-specific implementation
-of the `util.deprecate()` function is used.
-
-
-## API
-
-A `deprecate()` function is the only thing exposed by this module.
-
-``` javascript
-// setup:
-exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead');
-
-
-// users see:
-foo();
-// foo() is deprecated, use bar() instead
-foo();
-foo();
-```
-
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/browser.js
deleted file mode 100644
index 549ae2f065ea5add2c4b3667e412a9d0e7d2b1af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/browser.js
+++ /dev/null
@@ -1,67 +0,0 @@
-
-/**
- * Module exports.
- */
-
-module.exports = deprecate;
-
-/**
- * Mark that a method should not be used.
- * Returns a modified function which warns once by default.
- *
- * If `localStorage.noDeprecation = true` is set, then it is a no-op.
- *
- * If `localStorage.throwDeprecation = true` is set, then deprecated functions
- * will throw an Error when invoked.
- *
- * If `localStorage.traceDeprecation = true` is set, then deprecated functions
- * will invoke `console.trace()` instead of `console.error()`.
- *
- * @param {Function} fn - the function to deprecate
- * @param {String} msg - the string to print to the console when `fn` is invoked
- * @returns {Function} a new "deprecated" version of `fn`
- * @api public
- */
-
-function deprecate (fn, msg) {
-  if (config('noDeprecation')) {
-    return fn;
-  }
-
-  var warned = false;
-  function deprecated() {
-    if (!warned) {
-      if (config('throwDeprecation')) {
-        throw new Error(msg);
-      } else if (config('traceDeprecation')) {
-        console.trace(msg);
-      } else {
-        console.warn(msg);
-      }
-      warned = true;
-    }
-    return fn.apply(this, arguments);
-  }
-
-  return deprecated;
-}
-
-/**
- * Checks `localStorage` for boolean values for the given `name`.
- *
- * @param {String} name
- * @returns {Boolean}
- * @api private
- */
-
-function config (name) {
-  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
-  try {
-    if (!global.localStorage) return false;
-  } catch (_) {
-    return false;
-  }
-  var val = global.localStorage[name];
-  if (null == val) return false;
-  return String(val).toLowerCase() === 'true';
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/node.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/node.js
deleted file mode 100644
index 5e6fcff5ddd3fbf8bdda6310c224114d30b7509e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/node.js
+++ /dev/null
@@ -1,6 +0,0 @@
-
-/**
- * For Node.js, simply re-export the core `util.deprecate` function.
- */
-
-module.exports = require('util').deprecate;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/package.json
deleted file mode 100644
index 3a0f493deddd74768464202c689f5ef2afff05d4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/node_modules/util-deprecate/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "_from": "util-deprecate@>=1.0.1 <1.1.0",
-  "_id": "util-deprecate@1.0.2",
-  "_location": "/serialport/node-pre-gyp/request/bl/readable-stream/util-deprecate",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/bl/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-  "_shasum": "450d4dc9fa70de732762fbd2d4a28981419a0ccf",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "nathan@tootallnate.net",
-    "name": "Nathan Rajlich",
-    "url": "http://n8.io/"
-  },
-  "browser": "browser.js",
-  "bugs": {
-    "url": "https://github.com/TooTallNate/util-deprecate/issues"
-  },
-  "dependencies": {},
-  "description": "The Node.js `util.deprecate()` function with browser support",
-  "devDependencies": {},
-  "homepage": "https://github.com/TooTallNate/util-deprecate",
-  "keywords": [
-    "browser",
-    "browserify",
-    "deprecate",
-    "node",
-    "util"
-  ],
-  "license": "MIT",
-  "main": "node.js",
-  "name": "util-deprecate",
-  "optionalDependencies": {},
-  "readme": "util-deprecate\n==============\n### The Node.js `util.deprecate()` function with browser support\n\nIn Node.js, this module simply re-exports the `util.deprecate()` function.\n\nIn the web browser (i.e. via browserify), a browser-specific implementation\nof the `util.deprecate()` function is used.\n\n\n## API\n\nA `deprecate()` function is the only thing exposed by this module.\n\n``` javascript\n// setup:\nexports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead');\n\n\n// users see:\nfoo();\n// foo() is deprecated, use bar() instead\nfoo();\nfoo();\n```\n\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/TooTallNate/util-deprecate.git"
-  },
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json
deleted file mode 100644
index 7062d156b387395848bf21cc833ccc21786069a4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/package.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
-  "_from": "readable-stream@>=2.0.5 <2.1.0",
-  "_id": "readable-stream@2.0.6",
-  "_location": "/serialport/node-pre-gyp/request/bl/readable-stream",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/bl"
-  ],
-  "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
-  "_shasum": "8f90341e68a53ccc928788dacfcd11b36eb9b78e",
-  "_shrinkwrap": null,
-  "browser": {
-    "util": false
-  },
-  "bugs": {
-    "url": "https://github.com/nodejs/readable-stream/issues"
-  },
-  "dependencies": {
-    "core-util-is": "~1.0.0",
-    "inherits": "~2.0.1",
-    "isarray": "~1.0.0",
-    "process-nextick-args": "~1.0.6",
-    "string_decoder": "~0.10.x",
-    "util-deprecate": "~1.0.1"
-  },
-  "description": "Streams3, a user-land copy of the stream library from Node.js",
-  "devDependencies": {
-    "tap": "~0.2.6",
-    "tape": "~4.5.1",
-    "zuul": "~3.9.0"
-  },
-  "homepage": "https://github.com/nodejs/readable-stream#readme",
-  "keywords": [
-    "pipe",
-    "readable",
-    "stream"
-  ],
-  "license": "MIT",
-  "main": "readable.js",
-  "name": "readable-stream",
-  "optionalDependencies": {},
-  "readme": "# readable-stream\n\n***Node-core v5.8.0 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream)\n\n\n[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)\n[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)\n\n\n[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream)\n\n```bash\nnpm install --save readable-stream\n```\n\n***Node-core streams for userland***\n\nThis package is a mirror of the Streams2 and Streams3 implementations in\nNode-core, including [documentation](doc/stream.markdown).\n\nIf you want to guarantee a stable streams base, regardless of what version of\nNode you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *\"stream\"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).\n\nAs of version 2.0.0 **readable-stream** uses semantic versioning.  \n\n# Streams WG Team Members\n\n* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) &lt;christopher.s.dickinson@gmail.com&gt;\n  - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B\n* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) &lt;calvin.metcalf@gmail.com&gt;\n  - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242\n* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) &lt;rod@vagg.org&gt;\n  - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D\n* **Sam Newman** ([@sonewman](https://github.com/sonewman)) &lt;newmansam@outlook.com&gt;\n* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) &lt;mathiasbuus@gmail.com&gt;\n* **Domenic Denicola** ([@domenic](https://github.com/domenic)) &lt;d@domenic.me&gt;\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/nodejs/readable-stream.git"
-  },
-  "scripts": {
-    "browser": "npm run write-zuul && zuul -- test/browser.js",
-    "test": "tap test/parallel/*.js test/ours/*.js",
-    "write-zuul": "printf \"ui: tape\nbrowsers:\n  - name: $BROWSER_NAME\n    version: $BROWSER_VERSION\n\">.zuul.yml"
-  },
-  "version": "2.0.6"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/passthrough.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/passthrough.js
deleted file mode 100644
index 27e8d8a55165f9d1d7d1d1905d8d70e9c5a24f6e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/passthrough.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_passthrough.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/readable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/readable.js
deleted file mode 100644
index 6222a579864dd2d7a035c9016c1bd1731518b7d1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/readable.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var Stream = (function (){
-  try {
-    return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify
-  } catch(_){}
-}());
-exports = module.exports = require('./lib/_stream_readable.js');
-exports.Stream = Stream || exports;
-exports.Readable = exports;
-exports.Writable = require('./lib/_stream_writable.js');
-exports.Duplex = require('./lib/_stream_duplex.js');
-exports.Transform = require('./lib/_stream_transform.js');
-exports.PassThrough = require('./lib/_stream_passthrough.js');
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/transform.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/transform.js
deleted file mode 100644
index 5d482f0780e9934896cd693414fee2b9b425778f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/transform.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_transform.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/writable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/writable.js
deleted file mode 100644
index e1e9efdf3c12e938a4fd0659f2af60dbe65bf240..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/node_modules/readable-stream/writable.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_writable.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/package.json
deleted file mode 100644
index cc55b5ff8fb144444e807a23a77a56446547e591..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/package.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-  "_from": "bl@>=1.1.2 <1.2.0",
-  "_id": "bl@1.1.2",
-  "_location": "/serialport/node-pre-gyp/request/bl",
-  "_nodeVersion": "5.3.0",
-  "_npmOperationalInternal": {
-    "host": "packages-9-west.internal.npmjs.com",
-    "tmp": "tmp/bl-1.1.2.tgz_1455246621698_0.6300242957659066"
-  },
-  "_npmUser": {
-    "email": "rod@vagg.org",
-    "name": "rvagg"
-  },
-  "_npmVersion": "3.3.12",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz",
-  "_shasum": "fdca871a99713aa00d19e3bbba41c44787a65398",
-  "_shrinkwrap": null,
-  "authors": [
-    "Jarett Cruger <jcrugzz@gmail.com> (https://github.com/jcrugzz)",
-    "Matteo Collina <matteo.collina@gmail.com> (https://github.com/mcollina)",
-    "Rod Vagg <rod@vagg.org> (https://github.com/rvagg)"
-  ],
-  "bugs": {
-    "url": "https://github.com/rvagg/bl/issues"
-  },
-  "dependencies": {
-    "readable-stream": "~2.0.5"
-  },
-  "description": "Buffer List: collect buffers and access with a standard readable Buffer interface, streamable too!",
-  "devDependencies": {
-    "faucet": "0.0.1",
-    "hash_file": "~0.1.1",
-    "tape": "~4.4.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "fdca871a99713aa00d19e3bbba41c44787a65398",
-    "tarball": "https://registry.npmjs.org/bl/-/bl-1.1.2.tgz"
-  },
-  "gitHead": "ea42021059dc65fc60d7f4b9217c73431f09d23d",
-  "homepage": "https://github.com/rvagg/bl",
-  "keywords": [
-    "awesomesauce",
-    "buffer",
-    "buffers",
-    "stream"
-  ],
-  "license": "MIT",
-  "main": "bl.js",
-  "maintainers": [
-    {
-      "name": "rvagg",
-      "email": "rod@vagg.org"
-    }
-  ],
-  "name": "bl",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/rvagg/bl.git"
-  },
-  "scripts": {
-    "test": "node test/test.js | faucet"
-  },
-  "version": "1.1.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/test.js
deleted file mode 100644
index c95b1ba4844ef71636f812e72d68df9aaa5f3c63..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/bl/test/test.js
+++ /dev/null
@@ -1,640 +0,0 @@
-var tape       = require('tape')
-  , crypto     = require('crypto')
-  , fs         = require('fs')
-  , hash       = require('hash_file')
-  , BufferList = require('../')
-
-  , encodings  =
-      ('hex utf8 utf-8 ascii binary base64'
-          + (process.browser ? '' : ' ucs2 ucs-2 utf16le utf-16le')).split(' ')
-
-tape('single bytes from single buffer', function (t) {
-  var bl = new BufferList()
-  bl.append(new Buffer('abcd'))
-
-  t.equal(bl.length, 4)
-
-  t.equal(bl.get(0), 97)
-  t.equal(bl.get(1), 98)
-  t.equal(bl.get(2), 99)
-  t.equal(bl.get(3), 100)
-
-  t.end()
-})
-
-tape('single bytes from multiple buffers', function (t) {
-  var bl = new BufferList()
-  bl.append(new Buffer('abcd'))
-  bl.append(new Buffer('efg'))
-  bl.append(new Buffer('hi'))
-  bl.append(new Buffer('j'))
-
-  t.equal(bl.length, 10)
-
-  t.equal(bl.get(0), 97)
-  t.equal(bl.get(1), 98)
-  t.equal(bl.get(2), 99)
-  t.equal(bl.get(3), 100)
-  t.equal(bl.get(4), 101)
-  t.equal(bl.get(5), 102)
-  t.equal(bl.get(6), 103)
-  t.equal(bl.get(7), 104)
-  t.equal(bl.get(8), 105)
-  t.equal(bl.get(9), 106)
-  t.end()
-})
-
-tape('multi bytes from single buffer', function (t) {
-  var bl = new BufferList()
-  bl.append(new Buffer('abcd'))
-
-  t.equal(bl.length, 4)
-
-  t.equal(bl.slice(0, 4).toString('ascii'), 'abcd')
-  t.equal(bl.slice(0, 3).toString('ascii'), 'abc')
-  t.equal(bl.slice(1, 4).toString('ascii'), 'bcd')
-
-  t.end()
-})
-
-tape('multiple bytes from multiple buffers', function (t) {
-  var bl = new BufferList()
-
-  bl.append(new Buffer('abcd'))
-  bl.append(new Buffer('efg'))
-  bl.append(new Buffer('hi'))
-  bl.append(new Buffer('j'))
-
-  t.equal(bl.length, 10)
-
-  t.equal(bl.slice(0, 10).toString('ascii'), 'abcdefghij')
-  t.equal(bl.slice(3, 10).toString('ascii'), 'defghij')
-  t.equal(bl.slice(3, 6).toString('ascii'), 'def')
-  t.equal(bl.slice(3, 8).toString('ascii'), 'defgh')
-  t.equal(bl.slice(5, 10).toString('ascii'), 'fghij')
-
-  t.end()
-})
-
-tape('multiple bytes from multiple buffer lists', function (t) {
-  var bl = new BufferList()
-
-  bl.append(new BufferList([ new Buffer('abcd'), new Buffer('efg') ]))
-  bl.append(new BufferList([ new Buffer('hi'), new Buffer('j') ]))
-
-  t.equal(bl.length, 10)
-
-  t.equal(bl.slice(0, 10).toString('ascii'), 'abcdefghij')
-
-  t.equal(bl.slice(3, 10).toString('ascii'), 'defghij')
-  t.equal(bl.slice(3, 6).toString('ascii'), 'def')
-  t.equal(bl.slice(3, 8).toString('ascii'), 'defgh')
-  t.equal(bl.slice(5, 10).toString('ascii'), 'fghij')
-
-  t.end()
-})
-
-// same data as previous test, just using nested constructors
-tape('multiple bytes from crazy nested buffer lists', function (t) {
-  var bl = new BufferList()
-
-  bl.append(new BufferList([
-      new BufferList([
-          new BufferList(new Buffer('abc'))
-        , new Buffer('d')
-        , new BufferList(new Buffer('efg'))
-      ])
-    , new BufferList([ new Buffer('hi') ])
-    , new BufferList(new Buffer('j'))
-  ]))
-
-  t.equal(bl.length, 10)
-
-  t.equal(bl.slice(0, 10).toString('ascii'), 'abcdefghij')
-
-  t.equal(bl.slice(3, 10).toString('ascii'), 'defghij')
-  t.equal(bl.slice(3, 6).toString('ascii'), 'def')
-  t.equal(bl.slice(3, 8).toString('ascii'), 'defgh')
-  t.equal(bl.slice(5, 10).toString('ascii'), 'fghij')
-
-  t.end()
-})
-
-tape('append accepts arrays of Buffers', function (t) {
-  var bl = new BufferList()
-  bl.append(new Buffer('abc'))
-  bl.append([ new Buffer('def') ])
-  bl.append([ new Buffer('ghi'), new Buffer('jkl') ])
-  bl.append([ new Buffer('mnop'), new Buffer('qrstu'), new Buffer('vwxyz') ])
-  t.equal(bl.length, 26)
-  t.equal(bl.slice().toString('ascii'), 'abcdefghijklmnopqrstuvwxyz')
-  t.end()
-})
-
-tape('append accepts arrays of BufferLists', function (t) {
-  var bl = new BufferList()
-  bl.append(new Buffer('abc'))
-  bl.append([ new BufferList('def') ])
-  bl.append(new BufferList([ new Buffer('ghi'), new BufferList('jkl') ]))
-  bl.append([ new Buffer('mnop'), new BufferList([ new Buffer('qrstu'), new Buffer('vwxyz') ]) ])
-  t.equal(bl.length, 26)
-  t.equal(bl.slice().toString('ascii'), 'abcdefghijklmnopqrstuvwxyz')
-  t.end()
-})
-
-tape('append chainable', function (t) {
-  var bl = new BufferList()
-  t.ok(bl.append(new Buffer('abcd')) === bl)
-  t.ok(bl.append([ new Buffer('abcd') ]) === bl)
-  t.ok(bl.append(new BufferList(new Buffer('abcd'))) === bl)
-  t.ok(bl.append([ new BufferList(new Buffer('abcd')) ]) === bl)
-  t.end()
-})
-
-tape('append chainable (test results)', function (t) {
-  var bl = new BufferList('abc')
-    .append([ new BufferList('def') ])
-    .append(new BufferList([ new Buffer('ghi'), new BufferList('jkl') ]))
-    .append([ new Buffer('mnop'), new BufferList([ new Buffer('qrstu'), new Buffer('vwxyz') ]) ])
-
-  t.equal(bl.length, 26)
-  t.equal(bl.slice().toString('ascii'), 'abcdefghijklmnopqrstuvwxyz')
-  t.end()
-})
-
-tape('consuming from multiple buffers', function (t) {
-  var bl = new BufferList()
-
-  bl.append(new Buffer('abcd'))
-  bl.append(new Buffer('efg'))
-  bl.append(new Buffer('hi'))
-  bl.append(new Buffer('j'))
-
-  t.equal(bl.length, 10)
-
-  t.equal(bl.slice(0, 10).toString('ascii'), 'abcdefghij')
-
-  bl.consume(3)
-  t.equal(bl.length, 7)
-  t.equal(bl.slice(0, 7).toString('ascii'), 'defghij')
-
-  bl.consume(2)
-  t.equal(bl.length, 5)
-  t.equal(bl.slice(0, 5).toString('ascii'), 'fghij')
-
-  bl.consume(1)
-  t.equal(bl.length, 4)
-  t.equal(bl.slice(0, 4).toString('ascii'), 'ghij')
-
-  bl.consume(1)
-  t.equal(bl.length, 3)
-  t.equal(bl.slice(0, 3).toString('ascii'), 'hij')
-
-  bl.consume(2)
-  t.equal(bl.length, 1)
-  t.equal(bl.slice(0, 1).toString('ascii'), 'j')
-
-  t.end()
-})
-
-tape('complete consumption', function (t) {
-  var bl = new BufferList()
-
-  bl.append(new Buffer('a'))
-  bl.append(new Buffer('b'))
-
-  bl.consume(2)
-
-  t.equal(bl.length, 0)
-  t.equal(bl._bufs.length, 0)
-
-  t.end()
-})
-
-tape('test readUInt8 / readInt8', function (t) {
-  var buf1 = new Buffer(1)
-    , buf2 = new Buffer(3)
-    , buf3 = new Buffer(3)
-    , bl  = new BufferList()
-
-  buf2[1] = 0x3
-  buf2[2] = 0x4
-  buf3[0] = 0x23
-  buf3[1] = 0x42
-
-  bl.append(buf1)
-  bl.append(buf2)
-  bl.append(buf3)
-
-  t.equal(bl.readUInt8(2), 0x3)
-  t.equal(bl.readInt8(2), 0x3)
-  t.equal(bl.readUInt8(3), 0x4)
-  t.equal(bl.readInt8(3), 0x4)
-  t.equal(bl.readUInt8(4), 0x23)
-  t.equal(bl.readInt8(4), 0x23)
-  t.equal(bl.readUInt8(5), 0x42)
-  t.equal(bl.readInt8(5), 0x42)
-  t.end()
-})
-
-tape('test readUInt16LE / readUInt16BE / readInt16LE / readInt16BE', function (t) {
-  var buf1 = new Buffer(1)
-    , buf2 = new Buffer(3)
-    , buf3 = new Buffer(3)
-    , bl   = new BufferList()
-
-  buf2[1] = 0x3
-  buf2[2] = 0x4
-  buf3[0] = 0x23
-  buf3[1] = 0x42
-
-  bl.append(buf1)
-  bl.append(buf2)
-  bl.append(buf3)
-
-  t.equal(bl.readUInt16BE(2), 0x0304)
-  t.equal(bl.readUInt16LE(2), 0x0403)
-  t.equal(bl.readInt16BE(2), 0x0304)
-  t.equal(bl.readInt16LE(2), 0x0403)
-  t.equal(bl.readUInt16BE(3), 0x0423)
-  t.equal(bl.readUInt16LE(3), 0x2304)
-  t.equal(bl.readInt16BE(3), 0x0423)
-  t.equal(bl.readInt16LE(3), 0x2304)
-  t.equal(bl.readUInt16BE(4), 0x2342)
-  t.equal(bl.readUInt16LE(4), 0x4223)
-  t.equal(bl.readInt16BE(4), 0x2342)
-  t.equal(bl.readInt16LE(4), 0x4223)
-  t.end()
-})
-
-tape('test readUInt32LE / readUInt32BE / readInt32LE / readInt32BE', function (t) {
-  var buf1 = new Buffer(1)
-    , buf2 = new Buffer(3)
-    , buf3 = new Buffer(3)
-    , bl   = new BufferList()
-
-  buf2[1] = 0x3
-  buf2[2] = 0x4
-  buf3[0] = 0x23
-  buf3[1] = 0x42
-
-  bl.append(buf1)
-  bl.append(buf2)
-  bl.append(buf3)
-
-  t.equal(bl.readUInt32BE(2), 0x03042342)
-  t.equal(bl.readUInt32LE(2), 0x42230403)
-  t.equal(bl.readInt32BE(2), 0x03042342)
-  t.equal(bl.readInt32LE(2), 0x42230403)
-  t.end()
-})
-
-tape('test readFloatLE / readFloatBE', function (t) {
-  var buf1 = new Buffer(1)
-    , buf2 = new Buffer(3)
-    , buf3 = new Buffer(3)
-    , bl   = new BufferList()
-
-  buf2[1] = 0x00
-  buf2[2] = 0x00
-  buf3[0] = 0x80
-  buf3[1] = 0x3f
-
-  bl.append(buf1)
-  bl.append(buf2)
-  bl.append(buf3)
-
-  t.equal(bl.readFloatLE(2), 0x01)
-  t.end()
-})
-
-tape('test readDoubleLE / readDoubleBE', function (t) {
-  var buf1 = new Buffer(1)
-    , buf2 = new Buffer(3)
-    , buf3 = new Buffer(10)
-    , bl   = new BufferList()
-
-  buf2[1] = 0x55
-  buf2[2] = 0x55
-  buf3[0] = 0x55
-  buf3[1] = 0x55
-  buf3[2] = 0x55
-  buf3[3] = 0x55
-  buf3[4] = 0xd5
-  buf3[5] = 0x3f
-
-  bl.append(buf1)
-  bl.append(buf2)
-  bl.append(buf3)
-
-  t.equal(bl.readDoubleLE(2), 0.3333333333333333)
-  t.end()
-})
-
-tape('test toString', function (t) {
-  var bl = new BufferList()
-
-  bl.append(new Buffer('abcd'))
-  bl.append(new Buffer('efg'))
-  bl.append(new Buffer('hi'))
-  bl.append(new Buffer('j'))
-
-  t.equal(bl.toString('ascii', 0, 10), 'abcdefghij')
-  t.equal(bl.toString('ascii', 3, 10), 'defghij')
-  t.equal(bl.toString('ascii', 3, 6), 'def')
-  t.equal(bl.toString('ascii', 3, 8), 'defgh')
-  t.equal(bl.toString('ascii', 5, 10), 'fghij')
-
-  t.end()
-})
-
-tape('test toString encoding', function (t) {
-  var bl = new BufferList()
-    , b  = new Buffer('abcdefghij\xff\x00')
-
-  bl.append(new Buffer('abcd'))
-  bl.append(new Buffer('efg'))
-  bl.append(new Buffer('hi'))
-  bl.append(new Buffer('j'))
-  bl.append(new Buffer('\xff\x00'))
-
-  encodings.forEach(function (enc) {
-      t.equal(bl.toString(enc), b.toString(enc), enc)
-    })
-
-  t.end()
-})
-
-!process.browser && tape('test stream', function (t) {
-  var random = crypto.randomBytes(65534)
-    , rndhash = hash(random, 'md5')
-    , md5sum = crypto.createHash('md5')
-    , bl     = new BufferList(function (err, buf) {
-        t.ok(Buffer.isBuffer(buf))
-        t.ok(err === null)
-        t.equal(rndhash, hash(bl.slice(), 'md5'))
-        t.equal(rndhash, hash(buf, 'md5'))
-
-        bl.pipe(fs.createWriteStream('/tmp/bl_test_rnd_out.dat'))
-          .on('close', function () {
-            var s = fs.createReadStream('/tmp/bl_test_rnd_out.dat')
-            s.on('data', md5sum.update.bind(md5sum))
-            s.on('end', function() {
-              t.equal(rndhash, md5sum.digest('hex'), 'woohoo! correct hash!')
-              t.end()
-            })
-          })
-
-      })
-
-  fs.writeFileSync('/tmp/bl_test_rnd.dat', random)
-  fs.createReadStream('/tmp/bl_test_rnd.dat').pipe(bl)
-})
-
-tape('instantiation with Buffer', function (t) {
-  var buf  = crypto.randomBytes(1024)
-    , buf2 = crypto.randomBytes(1024)
-    , b    = BufferList(buf)
-
-  t.equal(buf.toString('hex'), b.slice().toString('hex'), 'same buffer')
-  b = BufferList([ buf, buf2 ])
-  t.equal(b.slice().toString('hex'), Buffer.concat([ buf, buf2 ]).toString('hex'), 'same buffer')
-  t.end()
-})
-
-tape('test String appendage', function (t) {
-  var bl = new BufferList()
-    , b  = new Buffer('abcdefghij\xff\x00')
-
-  bl.append('abcd')
-  bl.append('efg')
-  bl.append('hi')
-  bl.append('j')
-  bl.append('\xff\x00')
-
-  encodings.forEach(function (enc) {
-      t.equal(bl.toString(enc), b.toString(enc))
-    })
-
-  t.end()
-})
-
-tape('test Number appendage', function (t) {
-  var bl = new BufferList()
-    , b  = new Buffer('1234567890')
-
-  bl.append(1234)
-  bl.append(567)
-  bl.append(89)
-  bl.append(0)
-
-  encodings.forEach(function (enc) {
-      t.equal(bl.toString(enc), b.toString(enc))
-    })
-
-  t.end()
-})
-
-tape('write nothing, should get empty buffer', function (t) {
-  t.plan(3)
-  BufferList(function (err, data) {
-    t.notOk(err, 'no error')
-    t.ok(Buffer.isBuffer(data), 'got a buffer')
-    t.equal(0, data.length, 'got a zero-length buffer')
-    t.end()
-  }).end()
-})
-
-tape('unicode string', function (t) {
-  t.plan(2)
-  var inp1 = '\u2600'
-    , inp2 = '\u2603'
-    , exp = inp1 + ' and ' + inp2
-    , bl = BufferList()
-  bl.write(inp1)
-  bl.write(' and ')
-  bl.write(inp2)
-  t.equal(exp, bl.toString())
-  t.equal(new Buffer(exp).toString('hex'), bl.toString('hex'))
-})
-
-tape('should emit finish', function (t) {
-  var source = BufferList()
-    , dest = BufferList()
-
-  source.write('hello')
-  source.pipe(dest)
-
-  dest.on('finish', function () {
-    t.equal(dest.toString('utf8'), 'hello')
-    t.end()
-  })
-})
-
-tape('basic copy', function (t) {
-  var buf  = crypto.randomBytes(1024)
-    , buf2 = new Buffer(1024)
-    , b    = BufferList(buf)
-
-  b.copy(buf2)
-  t.equal(b.slice().toString('hex'), buf2.toString('hex'), 'same buffer')
-  t.end()
-})
-
-tape('copy after many appends', function (t) {
-  var buf  = crypto.randomBytes(512)
-    , buf2 = new Buffer(1024)
-    , b    = BufferList(buf)
-
-  b.append(buf)
-  b.copy(buf2)
-  t.equal(b.slice().toString('hex'), buf2.toString('hex'), 'same buffer')
-  t.end()
-})
-
-tape('copy at a precise position', function (t) {
-  var buf  = crypto.randomBytes(1004)
-    , buf2 = new Buffer(1024)
-    , b    = BufferList(buf)
-
-  b.copy(buf2, 20)
-  t.equal(b.slice().toString('hex'), buf2.slice(20).toString('hex'), 'same buffer')
-  t.end()
-})
-
-tape('copy starting from a precise location', function (t) {
-  var buf  = crypto.randomBytes(10)
-    , buf2 = new Buffer(5)
-    , b    = BufferList(buf)
-
-  b.copy(buf2, 0, 5)
-  t.equal(b.slice(5).toString('hex'), buf2.toString('hex'), 'same buffer')
-  t.end()
-})
-
-tape('copy in an interval', function (t) {
-  var rnd      = crypto.randomBytes(10)
-    , b        = BufferList(rnd) // put the random bytes there
-    , actual   = new Buffer(3)
-    , expected = new Buffer(3)
-
-  rnd.copy(expected, 0, 5, 8)
-  b.copy(actual, 0, 5, 8)
-
-  t.equal(actual.toString('hex'), expected.toString('hex'), 'same buffer')
-  t.end()
-})
-
-tape('copy an interval between two buffers', function (t) {
-  var buf      = crypto.randomBytes(10)
-    , buf2     = new Buffer(10)
-    , b        = BufferList(buf)
-
-  b.append(buf)
-  b.copy(buf2, 0, 5, 15)
-
-  t.equal(b.slice(5, 15).toString('hex'), buf2.toString('hex'), 'same buffer')
-  t.end()
-})
-
-tape('duplicate', function (t) {
-  t.plan(2)
-
-  var bl = new BufferList('abcdefghij\xff\x00')
-    , dup = bl.duplicate()
-
-  t.equal(bl.prototype, dup.prototype)
-  t.equal(bl.toString('hex'), dup.toString('hex'))
-})
-
-tape('destroy no pipe', function (t) {
-  t.plan(2)
-
-  var bl = new BufferList('alsdkfja;lsdkfja;lsdk')
-  bl.destroy()
-
-  t.equal(bl._bufs.length, 0)
-  t.equal(bl.length, 0)
-})
-
-!process.browser && tape('destroy with pipe before read end', function (t) {
-  t.plan(2)
-
-  var bl = new BufferList()
-  fs.createReadStream(__dirname + '/test.js')
-    .pipe(bl)
-
-  bl.destroy()
-
-  t.equal(bl._bufs.length, 0)
-  t.equal(bl.length, 0)
-
-})
-
-!process.browser && tape('destroy with pipe before read end with race', function (t) {
-  t.plan(2)
-
-  var bl = new BufferList()
-  fs.createReadStream(__dirname + '/test.js')
-    .pipe(bl)
-
-  setTimeout(function () {
-    bl.destroy()
-    setTimeout(function () {
-      t.equal(bl._bufs.length, 0)
-      t.equal(bl.length, 0)
-    }, 500)
-  }, 500)
-})
-
-!process.browser && tape('destroy with pipe after read end', function (t) {
-  t.plan(2)
-
-  var bl = new BufferList()
-  fs.createReadStream(__dirname + '/test.js')
-    .on('end', onEnd)
-    .pipe(bl)
-
-  function onEnd () {
-    bl.destroy()
-
-    t.equal(bl._bufs.length, 0)
-    t.equal(bl.length, 0)
-  }
-})
-
-!process.browser && tape('destroy with pipe while writing to a destination', function (t) {
-  t.plan(4)
-
-  var bl = new BufferList()
-    , ds = new BufferList()
-
-  fs.createReadStream(__dirname + '/test.js')
-    .on('end', onEnd)
-    .pipe(bl)
-
-  function onEnd () {
-    bl.pipe(ds)
-
-    setTimeout(function () {
-      bl.destroy()
-
-      t.equals(bl._bufs.length, 0)
-      t.equals(bl.length, 0)
-
-      ds.destroy()
-
-      t.equals(bl._bufs.length, 0)
-      t.equals(bl.length, 0)
-
-    }, 100)
-  }
-})
-
-!process.browser && tape('handle error', function (t) {
-  t.plan(2)
-  fs.createReadStream('/does/not/exist').pipe(BufferList(function (err, data) {
-    t.ok(err instanceof Error, 'has error')
-    t.notOk(data, 'no data')
-  }))
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/LICENSE
deleted file mode 100644
index 61789f4a4f858613c6926b69b8d5869c3c211b3d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/LICENSE
+++ /dev/null
@@ -1,28 +0,0 @@
-Apache License
-Version 2.0, January 2004
-http://www.apache.org/licenses/
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-1. Definitions.
-"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
-"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
-"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
-"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
-"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
-"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
-"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
-"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
-"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
-2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
-3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
-4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
-You must give any other recipients of the Work or Derivative Works a copy of this License; and
-You must cause any modified files to carry prominent notices stating that You changed the files; and
-You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
-If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
-5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
-6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
-7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
-8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
-9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
-END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/README.md
deleted file mode 100644
index e5077a21659b2505d2516d74cad91cb1268cc9eb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/README.md
+++ /dev/null
@@ -1,45 +0,0 @@
-## Caseless -- wrap an object to set and get property with caseless semantics but also preserve caseing.
-
-This library is incredibly useful when working with HTTP headers. It allows you to get/set/check for headers in a caseless manner while also preserving the caseing of headers the first time they are set.
-
-## Usage
-
-```javascript
-var headers = {}
-  , c = caseless(headers)
-  ;
-c.set('a-Header', 'asdf')
-c.get('a-header') === 'asdf'
-```
-
-## has(key)
-
-Has takes a name and if it finds a matching header will return that header name with the preserved caseing it was set with.
-
-```javascript
-c.has('a-header') === 'a-Header'
-```
-
-## set(key, value[, clobber=true])
-
-Set is fairly straight forward except that if the header exists and clobber is disabled it will add `','+value` to the existing header.
-
-```javascript
-c.set('a-Header', 'fdas')
-c.set('a-HEADER', 'more', false)
-c.get('a-header') === 'fdsa,more'
-```
-
-## swap(key)
-
-Swaps the casing of a header with the new one that is passed in.
-
-```javascript
-var headers = {}
-  , c = caseless(headers)
-  ;
-c.set('a-Header', 'fdas')
-c.swap('a-HEADER')
-c.has('a-header') === 'a-HEADER'
-headers === {'a-HEADER': 'fdas'}
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/index.js
deleted file mode 100644
index d86a70eca1b8f7977d885e9eabecd7462f9f16f2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/index.js
+++ /dev/null
@@ -1,66 +0,0 @@
-function Caseless (dict) {
-  this.dict = dict || {}
-}
-Caseless.prototype.set = function (name, value, clobber) {
-  if (typeof name === 'object') {
-    for (var i in name) {
-      this.set(i, name[i], value)
-    }
-  } else {
-    if (typeof clobber === 'undefined') clobber = true
-    var has = this.has(name)
-
-    if (!clobber && has) this.dict[has] = this.dict[has] + ',' + value
-    else this.dict[has || name] = value
-    return has
-  }
-}
-Caseless.prototype.has = function (name) {
-  var keys = Object.keys(this.dict)
-    , name = name.toLowerCase()
-    ;
-  for (var i=0;i<keys.length;i++) {
-    if (keys[i].toLowerCase() === name) return keys[i]
-  }
-  return false
-}
-Caseless.prototype.get = function (name) {
-  name = name.toLowerCase()
-  var result, _key
-  var headers = this.dict
-  Object.keys(headers).forEach(function (key) {
-    _key = key.toLowerCase()
-    if (name === _key) result = headers[key]
-  })
-  return result
-}
-Caseless.prototype.swap = function (name) {
-  var has = this.has(name)
-  if (!has) throw new Error('There is no header than matches "'+name+'"')
-  this.dict[name] = this.dict[has]
-  delete this.dict[has]
-}
-Caseless.prototype.del = function (name) {
-  var has = this.has(name)
-  return delete this.dict[has || name]
-}
-
-module.exports = function (dict) {return new Caseless(dict)}
-module.exports.httpify = function (resp, headers) {
-  var c = new Caseless(headers)
-  resp.setHeader = function (key, value, clobber) {
-    if (typeof value === 'undefined') return
-    return c.set(key, value, clobber)
-  }
-  resp.hasHeader = function (key) {
-    return c.has(key)
-  }
-  resp.getHeader = function (key) {
-    return c.get(key)
-  }
-  resp.removeHeader = function (key) {
-    return c.del(key)
-  }
-  resp.headers = c.dict
-  return c
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/package.json
deleted file mode 100644
index 191124742f887363c9c3976110a7fac91e94b846..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "_from": "caseless@>=0.11.0 <0.12.0",
-  "_id": "caseless@0.11.0",
-  "_location": "/serialport/node-pre-gyp/request/caseless",
-  "_nodeVersion": "1.8.1",
-  "_npmUser": {
-    "email": "mikeal.rogers@gmail.com",
-    "name": "mikeal"
-  },
-  "_npmVersion": "2.8.3",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
-  "_shasum": "715b96ea9841593cc33067923f5ec60ebda4f7d7",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mikeal.rogers@gmail.com",
-    "name": "Mikeal Rogers"
-  },
-  "bugs": {
-    "url": "https://github.com/mikeal/caseless/issues"
-  },
-  "dependencies": {},
-  "description": "Caseless object set/get/has, very useful when working with HTTP headers.",
-  "devDependencies": {
-    "tape": "^2.10.2"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "715b96ea9841593cc33067923f5ec60ebda4f7d7",
-    "tarball": "http://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz"
-  },
-  "gitHead": "c578232a02cc2b46b6da8851caf57fdbfac89ff5",
-  "homepage": "https://github.com/mikeal/caseless#readme",
-  "keywords": [
-    "caseless",
-    "headers",
-    "http"
-  ],
-  "license": "Apache-2.0",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "mikeal",
-      "email": "mikeal.rogers@gmail.com"
-    },
-    {
-      "name": "nylen",
-      "email": "jnylen@gmail.com"
-    },
-    {
-      "name": "simov",
-      "email": "simeonvelichkov@gmail.com"
-    }
-  ],
-  "name": "caseless",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/mikeal/caseless.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "test": "node test.js",
-  "version": "0.11.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/test.js
deleted file mode 100644
index 084bbaf5e93f27ab4aa7f130c9b7903a6ba91d14..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/caseless/test.js
+++ /dev/null
@@ -1,40 +0,0 @@
-var tape = require('tape')
-  , caseless = require('./')
-  ;
-
-tape('set get has', function (t) {
-  var headers = {}
-    , c = caseless(headers)
-    ;
-  t.plan(17)
-  c.set('a-Header', 'asdf')
-  t.equal(c.get('a-header'), 'asdf')
-  t.equal(c.has('a-header'), 'a-Header')
-  t.ok(!c.has('nothing'))
-  // old bug where we used the wrong regex
-  t.ok(!c.has('a-hea'))
-  c.set('a-header', 'fdsa')
-  t.equal(c.get('a-header'), 'fdsa')
-  t.equal(c.get('a-Header'), 'fdsa')
-  c.set('a-HEADER', 'more', false)
-  t.equal(c.get('a-header'), 'fdsa,more')
-
-  t.deepEqual(headers, {'a-Header': 'fdsa,more'})
-  c.swap('a-HEADER')
-  t.deepEqual(headers, {'a-HEADER': 'fdsa,more'})
-
-  c.set('deleteme', 'foobar')
-  t.ok(c.has('deleteme'))
-  t.ok(c.del('deleteme'))
-  t.notOk(c.has('deleteme'))
-  t.notOk(c.has('idonotexist'))
-  t.ok(c.del('idonotexist'))
-
-  c.set('tva', 'test1')
-  c.set('tva-header', 'test2')
-  t.equal(c.has('tva'), 'tva')
-  t.notOk(c.has('header'))
-
-  t.equal(c.get('tva'), 'test1')
-
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/License b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/License
deleted file mode 100644
index 4804b7ab411f5f72ff74343a88bc503ecc309033..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/License
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2011 Debuggable Limited <felix@debuggable.com>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/Readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/Readme.md
deleted file mode 100644
index 3a9e025fb47a650a545a94b152eab92f2c068ec0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/Readme.md
+++ /dev/null
@@ -1,138 +0,0 @@
-# combined-stream
-
-A stream that emits multiple other streams one after another.
-
-**NB** Currently `combined-stream` works with streams vesrion 1 only. There is ongoing effort to switch this library to streams version 2. Any help is welcome. :) Meanwhile you can explore other libraries that provide streams2 support with more or less compatability with `combined-stream`.
-
-- [combined-stream2](https://www.npmjs.com/package/combined-stream2): A drop-in streams2-compatible replacement for the combined-stream module.
-
-- [multistream](https://www.npmjs.com/package/multistream): A stream that emits multiple other streams one after another.
-
-## Installation
-
-``` bash
-npm install combined-stream
-```
-
-## Usage
-
-Here is a simple example that shows how you can use combined-stream to combine
-two files into one:
-
-``` javascript
-var CombinedStream = require('combined-stream');
-var fs = require('fs');
-
-var combinedStream = CombinedStream.create();
-combinedStream.append(fs.createReadStream('file1.txt'));
-combinedStream.append(fs.createReadStream('file2.txt'));
-
-combinedStream.pipe(fs.createWriteStream('combined.txt'));
-```
-
-While the example above works great, it will pause all source streams until
-they are needed. If you don't want that to happen, you can set `pauseStreams`
-to `false`:
-
-``` javascript
-var CombinedStream = require('combined-stream');
-var fs = require('fs');
-
-var combinedStream = CombinedStream.create({pauseStreams: false});
-combinedStream.append(fs.createReadStream('file1.txt'));
-combinedStream.append(fs.createReadStream('file2.txt'));
-
-combinedStream.pipe(fs.createWriteStream('combined.txt'));
-```
-
-However, what if you don't have all the source streams yet, or you don't want
-to allocate the resources (file descriptors, memory, etc.) for them right away?
-Well, in that case you can simply provide a callback that supplies the stream
-by calling a `next()` function:
-
-``` javascript
-var CombinedStream = require('combined-stream');
-var fs = require('fs');
-
-var combinedStream = CombinedStream.create();
-combinedStream.append(function(next) {
-  next(fs.createReadStream('file1.txt'));
-});
-combinedStream.append(function(next) {
-  next(fs.createReadStream('file2.txt'));
-});
-
-combinedStream.pipe(fs.createWriteStream('combined.txt'));
-```
-
-## API
-
-### CombinedStream.create([options])
-
-Returns a new combined stream object. Available options are:
-
-* `maxDataSize`
-* `pauseStreams`
-
-The effect of those options is described below.
-
-### combinedStream.pauseStreams = `true`
-
-Whether to apply back pressure to the underlaying streams. If set to `false`,
-the underlaying streams will never be paused. If set to `true`, the
-underlaying streams will be paused right after being appended, as well as when
-`delayedStream.pipe()` wants to throttle.
-
-### combinedStream.maxDataSize = `2 * 1024 * 1024`
-
-The maximum amount of bytes (or characters) to buffer for all source streams.
-If this value is exceeded, `combinedStream` emits an `'error'` event.
-
-### combinedStream.dataSize = `0`
-
-The amount of bytes (or characters) currently buffered by `combinedStream`.
-
-### combinedStream.append(stream)
-
-Appends the given `stream` to the combinedStream object. If `pauseStreams` is
-set to `true, this stream will also be paused right away.
-
-`streams` can also be a function that takes one parameter called `next`. `next`
-is a function that must be invoked in order to provide the `next` stream, see
-example above.
-
-Regardless of how the `stream` is appended, combined-stream always attaches an
-`'error'` listener to it, so you don't have to do that manually.
-
-Special case: `stream` can also be a String or Buffer.
-
-### combinedStream.write(data)
-
-You should not call this, `combinedStream` takes care of piping the appended
-streams into itself for you.
-
-### combinedStream.resume()
-
-Causes `combinedStream` to start drain the streams it manages. The function is
-idempotent, and also emits a `'resume'` event each time which usually goes to
-the stream that is currently being drained.
-
-### combinedStream.pause();
-
-If `combinedStream.pauseStreams` is set to `false`, this does nothing.
-Otherwise a `'pause'` event is emitted, this goes to the stream that is
-currently being drained, so you can use it to apply back pressure.
-
-### combinedStream.end();
-
-Sets `combinedStream.writable` to false, emits an `'end'` event, and removes
-all streams from the queue.
-
-### combinedStream.destroy();
-
-Same as `combinedStream.end()`, except it emits a `'close'` event instead of
-`'end'`.
-
-## License
-
-combined-stream is licensed under the MIT license.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/lib/combined_stream.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/lib/combined_stream.js
deleted file mode 100644
index 6b5c21b6b425138507447d11610a1a828ec538e0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/lib/combined_stream.js
+++ /dev/null
@@ -1,188 +0,0 @@
-var util = require('util');
-var Stream = require('stream').Stream;
-var DelayedStream = require('delayed-stream');
-
-module.exports = CombinedStream;
-function CombinedStream() {
-  this.writable = false;
-  this.readable = true;
-  this.dataSize = 0;
-  this.maxDataSize = 2 * 1024 * 1024;
-  this.pauseStreams = true;
-
-  this._released = false;
-  this._streams = [];
-  this._currentStream = null;
-}
-util.inherits(CombinedStream, Stream);
-
-CombinedStream.create = function(options) {
-  var combinedStream = new this();
-
-  options = options || {};
-  for (var option in options) {
-    combinedStream[option] = options[option];
-  }
-
-  return combinedStream;
-};
-
-CombinedStream.isStreamLike = function(stream) {
-  return (typeof stream !== 'function')
-    && (typeof stream !== 'string')
-    && (typeof stream !== 'boolean')
-    && (typeof stream !== 'number')
-    && (!Buffer.isBuffer(stream));
-};
-
-CombinedStream.prototype.append = function(stream) {
-  var isStreamLike = CombinedStream.isStreamLike(stream);
-
-  if (isStreamLike) {
-    if (!(stream instanceof DelayedStream)) {
-      var newStream = DelayedStream.create(stream, {
-        maxDataSize: Infinity,
-        pauseStream: this.pauseStreams,
-      });
-      stream.on('data', this._checkDataSize.bind(this));
-      stream = newStream;
-    }
-
-    this._handleErrors(stream);
-
-    if (this.pauseStreams) {
-      stream.pause();
-    }
-  }
-
-  this._streams.push(stream);
-  return this;
-};
-
-CombinedStream.prototype.pipe = function(dest, options) {
-  Stream.prototype.pipe.call(this, dest, options);
-  this.resume();
-  return dest;
-};
-
-CombinedStream.prototype._getNext = function() {
-  this._currentStream = null;
-  var stream = this._streams.shift();
-
-
-  if (typeof stream == 'undefined') {
-    this.end();
-    return;
-  }
-
-  if (typeof stream !== 'function') {
-    this._pipeNext(stream);
-    return;
-  }
-
-  var getStream = stream;
-  getStream(function(stream) {
-    var isStreamLike = CombinedStream.isStreamLike(stream);
-    if (isStreamLike) {
-      stream.on('data', this._checkDataSize.bind(this));
-      this._handleErrors(stream);
-    }
-
-    this._pipeNext(stream);
-  }.bind(this));
-};
-
-CombinedStream.prototype._pipeNext = function(stream) {
-  this._currentStream = stream;
-
-  var isStreamLike = CombinedStream.isStreamLike(stream);
-  if (isStreamLike) {
-    stream.on('end', this._getNext.bind(this));
-    stream.pipe(this, {end: false});
-    return;
-  }
-
-  var value = stream;
-  this.write(value);
-  this._getNext();
-};
-
-CombinedStream.prototype._handleErrors = function(stream) {
-  var self = this;
-  stream.on('error', function(err) {
-    self._emitError(err);
-  });
-};
-
-CombinedStream.prototype.write = function(data) {
-  this.emit('data', data);
-};
-
-CombinedStream.prototype.pause = function() {
-  if (!this.pauseStreams) {
-    return;
-  }
-
-  if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause();
-  this.emit('pause');
-};
-
-CombinedStream.prototype.resume = function() {
-  if (!this._released) {
-    this._released = true;
-    this.writable = true;
-    this._getNext();
-  }
-
-  if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume();
-  this.emit('resume');
-};
-
-CombinedStream.prototype.end = function() {
-  this._reset();
-  this.emit('end');
-};
-
-CombinedStream.prototype.destroy = function() {
-  this._reset();
-  this.emit('close');
-};
-
-CombinedStream.prototype._reset = function() {
-  this.writable = false;
-  this._streams = [];
-  this._currentStream = null;
-};
-
-CombinedStream.prototype._checkDataSize = function() {
-  this._updateDataSize();
-  if (this.dataSize <= this.maxDataSize) {
-    return;
-  }
-
-  var message =
-    'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.';
-  this._emitError(new Error(message));
-};
-
-CombinedStream.prototype._updateDataSize = function() {
-  this.dataSize = 0;
-
-  var self = this;
-  this._streams.forEach(function(stream) {
-    if (!stream.dataSize) {
-      return;
-    }
-
-    self.dataSize += stream.dataSize;
-  });
-
-  if (this._currentStream && this._currentStream.dataSize) {
-    this.dataSize += this._currentStream.dataSize;
-  }
-};
-
-CombinedStream.prototype._emitError = function(err) {
-  this._reset();
-  this.emit('error', err);
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/.npmignore
deleted file mode 100644
index 9daeafb9864cf43055ae93beb0afd6c7d144bfa4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-test
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/License b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/License
deleted file mode 100644
index 4804b7ab411f5f72ff74343a88bc503ecc309033..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/License
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2011 Debuggable Limited <felix@debuggable.com>
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Makefile b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Makefile
deleted file mode 100644
index b4ff85a33b6eb482476385b7c3e6661ec9c9eb0c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-SHELL := /bin/bash
-
-test:
-	@./test/run.js
-
-.PHONY: test
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Readme.md
deleted file mode 100644
index aca36f9f0bc9662c8ff39d6e61e727e69fbe5b2a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/Readme.md
+++ /dev/null
@@ -1,141 +0,0 @@
-# delayed-stream
-
-Buffers events from a stream until you are ready to handle them.
-
-## Installation
-
-``` bash
-npm install delayed-stream
-```
-
-## Usage
-
-The following example shows how to write a http echo server that delays its
-response by 1000 ms.
-
-``` javascript
-var DelayedStream = require('delayed-stream');
-var http = require('http');
-
-http.createServer(function(req, res) {
-  var delayed = DelayedStream.create(req);
-
-  setTimeout(function() {
-    res.writeHead(200);
-    delayed.pipe(res);
-  }, 1000);
-});
-```
-
-If you are not using `Stream#pipe`, you can also manually release the buffered
-events by calling `delayedStream.resume()`:
-
-``` javascript
-var delayed = DelayedStream.create(req);
-
-setTimeout(function() {
-  // Emit all buffered events and resume underlaying source
-  delayed.resume();
-}, 1000);
-```
-
-## Implementation
-
-In order to use this meta stream properly, here are a few things you should
-know about the implementation.
-
-### Event Buffering / Proxying
-
-All events of the `source` stream are hijacked by overwriting the `source.emit`
-method. Until node implements a catch-all event listener, this is the only way.
-
-However, delayed-stream still continues to emit all events it captures on the
-`source`, regardless of whether you have released the delayed stream yet or
-not.
-
-Upon creation, delayed-stream captures all `source` events and stores them in
-an internal event buffer. Once `delayedStream.release()` is called, all
-buffered events are emitted on the `delayedStream`, and the event buffer is
-cleared. After that, delayed-stream merely acts as a proxy for the underlaying
-source.
-
-### Error handling
-
-Error events on `source` are buffered / proxied just like any other events.
-However, `delayedStream.create` attaches a no-op `'error'` listener to the
-`source`. This way you only have to handle errors on the `delayedStream`
-object, rather than in two places.
-
-### Buffer limits
-
-delayed-stream provides a `maxDataSize` property that can be used to limit
-the amount of data being buffered. In order to protect you from bad `source`
-streams that don't react to `source.pause()`, this feature is enabled by
-default.
-
-## API
-
-### DelayedStream.create(source, [options])
-
-Returns a new `delayedStream`. Available options are:
-
-* `pauseStream`
-* `maxDataSize`
-
-The description for those properties can be found below.
-
-### delayedStream.source
-
-The `source` stream managed by this object. This is useful if you are
-passing your `delayedStream` around, and you still want to access properties
-on the `source` object.
-
-### delayedStream.pauseStream = true
-
-Whether to pause the underlaying `source` when calling
-`DelayedStream.create()`. Modifying this property afterwards has no effect.
-
-### delayedStream.maxDataSize = 1024 * 1024
-
-The amount of data to buffer before emitting an `error`.
-
-If the underlaying source is emitting `Buffer` objects, the `maxDataSize`
-refers to bytes.
-
-If the underlaying source is emitting JavaScript strings, the size refers to
-characters.
-
-If you know what you are doing, you can set this property to `Infinity` to
-disable this feature. You can also modify this property during runtime.
-
-### delayedStream.dataSize = 0
-
-The amount of data buffered so far.
-
-### delayedStream.readable
-
-An ECMA5 getter that returns the value of `source.readable`.
-
-### delayedStream.resume()
-
-If the `delayedStream` has not been released so far, `delayedStream.release()`
-is called.
-
-In either case, `source.resume()` is called.
-
-### delayedStream.pause()
-
-Calls `source.pause()`.
-
-### delayedStream.pipe(dest)
-
-Calls `delayedStream.resume()` and then proxies the arguments to `source.pipe`.
-
-### delayedStream.release()
-
-Emits and clears all events that have been buffered up so far. This does not
-resume the underlaying source, use `delayedStream.resume()` instead.
-
-## License
-
-delayed-stream is licensed under the MIT license.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js
deleted file mode 100644
index b38fc85ff415f0bbf893eb55eaf54dcbba67e73b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/lib/delayed_stream.js
+++ /dev/null
@@ -1,107 +0,0 @@
-var Stream = require('stream').Stream;
-var util = require('util');
-
-module.exports = DelayedStream;
-function DelayedStream() {
-  this.source = null;
-  this.dataSize = 0;
-  this.maxDataSize = 1024 * 1024;
-  this.pauseStream = true;
-
-  this._maxDataSizeExceeded = false;
-  this._released = false;
-  this._bufferedEvents = [];
-}
-util.inherits(DelayedStream, Stream);
-
-DelayedStream.create = function(source, options) {
-  var delayedStream = new this();
-
-  options = options || {};
-  for (var option in options) {
-    delayedStream[option] = options[option];
-  }
-
-  delayedStream.source = source;
-
-  var realEmit = source.emit;
-  source.emit = function() {
-    delayedStream._handleEmit(arguments);
-    return realEmit.apply(source, arguments);
-  };
-
-  source.on('error', function() {});
-  if (delayedStream.pauseStream) {
-    source.pause();
-  }
-
-  return delayedStream;
-};
-
-Object.defineProperty(DelayedStream.prototype, 'readable', {
-  configurable: true,
-  enumerable: true,
-  get: function() {
-    return this.source.readable;
-  }
-});
-
-DelayedStream.prototype.setEncoding = function() {
-  return this.source.setEncoding.apply(this.source, arguments);
-};
-
-DelayedStream.prototype.resume = function() {
-  if (!this._released) {
-    this.release();
-  }
-
-  this.source.resume();
-};
-
-DelayedStream.prototype.pause = function() {
-  this.source.pause();
-};
-
-DelayedStream.prototype.release = function() {
-  this._released = true;
-
-  this._bufferedEvents.forEach(function(args) {
-    this.emit.apply(this, args);
-  }.bind(this));
-  this._bufferedEvents = [];
-};
-
-DelayedStream.prototype.pipe = function() {
-  var r = Stream.prototype.pipe.apply(this, arguments);
-  this.resume();
-  return r;
-};
-
-DelayedStream.prototype._handleEmit = function(args) {
-  if (this._released) {
-    this.emit.apply(this, args);
-    return;
-  }
-
-  if (args[0] === 'data') {
-    this.dataSize += args[1].length;
-    this._checkIfMaxDataSizeExceeded();
-  }
-
-  this._bufferedEvents.push(args);
-};
-
-DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
-  if (this._maxDataSizeExceeded) {
-    return;
-  }
-
-  if (this.dataSize <= this.maxDataSize) {
-    return;
-  }
-
-  this._maxDataSizeExceeded = true;
-  var message =
-    'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'
-  this.emit('error', new Error(message));
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json
deleted file mode 100644
index 9c55d3d1adaadb675421e9f3b81250401d065679..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/node_modules/delayed-stream/package.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-  "_from": "delayed-stream@>=1.0.0 <1.1.0",
-  "_id": "delayed-stream@1.0.0",
-  "_location": "/serialport/node-pre-gyp/request/combined-stream/delayed-stream",
-  "_nodeVersion": "1.6.4",
-  "_npmUser": {
-    "email": "apeherder@gmail.com",
-    "name": "apechimp"
-  },
-  "_npmVersion": "2.8.3",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/combined-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-  "_shasum": "df3ae199acadfb7d440aaae0b29e2272b24ec619",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "felix@debuggable.com",
-    "name": "Felix Geisendörfer",
-    "url": "http://debuggable.com/"
-  },
-  "bugs": {
-    "url": "https://github.com/felixge/node-delayed-stream/issues"
-  },
-  "contributors": [
-    {
-      "name": "Mike Atkins",
-      "email": "apeherder@gmail.com"
-    }
-  ],
-  "dependencies": {},
-  "description": "Buffers events from a stream until you are ready to handle them.",
-  "devDependencies": {
-    "fake": "0.2.0",
-    "far": "0.0.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "df3ae199acadfb7d440aaae0b29e2272b24ec619",
-    "tarball": "http://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
-  },
-  "engines": {
-    "node": ">=0.4.0"
-  },
-  "gitHead": "07a9dc99fb8f1a488160026b9ad77493f766fb84",
-  "homepage": "https://github.com/felixge/node-delayed-stream",
-  "license": "MIT",
-  "main": "./lib/delayed_stream",
-  "maintainers": [
-    {
-      "name": "felixge",
-      "email": "felix@debuggable.com"
-    },
-    {
-      "name": "apechimp",
-      "email": "apeherder@gmail.com"
-    }
-  ],
-  "name": "delayed-stream",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/felixge/node-delayed-stream.git"
-  },
-  "scripts": {
-    "test": "make test"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/package.json
deleted file mode 100644
index 045e6c6719160dfac0ec0cb08727d0411f19bee4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/combined-stream/package.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "_from": "combined-stream@>=1.0.5 <1.1.0",
-  "_id": "combined-stream@1.0.5",
-  "_location": "/serialport/node-pre-gyp/request/combined-stream",
-  "_nodeVersion": "0.12.4",
-  "_npmUser": {
-    "email": "iam@alexindigo.com",
-    "name": "alexindigo"
-  },
-  "_npmVersion": "2.10.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request",
-    "/serialport/node-pre-gyp/request/form-data"
-  ],
-  "_resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz",
-  "_shasum": "938370a57b4a51dea2c77c15d5c5fdf895164009",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "felix@debuggable.com",
-    "name": "Felix Geisendörfer",
-    "url": "http://debuggable.com/"
-  },
-  "bugs": {
-    "url": "https://github.com/felixge/node-combined-stream/issues"
-  },
-  "dependencies": {
-    "delayed-stream": "~1.0.0"
-  },
-  "description": "A stream that emits multiple other streams one after another.",
-  "devDependencies": {
-    "far": "~0.0.7"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "938370a57b4a51dea2c77c15d5c5fdf895164009",
-    "tarball": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz"
-  },
-  "engines": {
-    "node": ">= 0.8"
-  },
-  "gitHead": "cfc7b815d090a109bcedb5bb0f6713148d55a6b7",
-  "homepage": "https://github.com/felixge/node-combined-stream",
-  "license": "MIT",
-  "main": "./lib/combined_stream",
-  "maintainers": [
-    {
-      "name": "felixge",
-      "email": "felix@debuggable.com"
-    },
-    {
-      "name": "celer",
-      "email": "dtyree77@gmail.com"
-    },
-    {
-      "name": "alexindigo",
-      "email": "iam@alexindigo.com"
-    },
-    {
-      "name": "apechimp",
-      "email": "apeherder@gmail.com"
-    }
-  ],
-  "name": "combined-stream",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/felixge/node-combined-stream.git"
-  },
-  "scripts": {
-    "test": "node test/run.js"
-  },
-  "version": "1.0.5"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.eslintrc b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.eslintrc
deleted file mode 100644
index d49f17353d70e2f0efa0f5a82d672ddee06ca1ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.eslintrc
+++ /dev/null
@@ -1,192 +0,0 @@
-{
-	"env": {
-		"browser": false,
-		"node": true,
-		"amd": false,
-		"mocha": false,
-		"jasmine": false
-	},
-
-	"rules": {
-		"accessor-pairs": [2, { getWithoutSet: false, setWithoutGet: true }],
-		"array-bracket-spacing": [2, "never", {
-			"singleValue": false,
-			"objectsInArrays": false,
-			"arraysInArrays": false
-		}],
-		"block-scoped-var": [0],
-		"brace-style": [2, "1tbs", { "allowSingleLine": true }],
-		"camelcase": [2],
-		"comma-dangle": [2, "never"],
-		"comma-spacing": [2],
-		"comma-style": [2, "last"],
-		"complexity": [2, 15],
-		"computed-property-spacing": [2, "never"],
-		"consistent-return": [2],
-		"consistent-this": [0, "that"],
-		"constructor-super": [2],
-		"curly": [2, "all"],
-		"default-case": [2],
-		"dot-notation": [2, { "allowKeywords": true }],
-		"eol-last": [2],
-		"eqeqeq": [2],
-		"func-names": [0],
-		"func-style": [2, "expression"],
-		"generator-star-spacing": [2, { "before": false, "after": true }],
-		"global-strict": [0, "never"],
-		"guard-for-in": [0],
-		"handle-callback-err": [0],
-		"key-spacing": [2, { "beforeColon": false, "afterColon": true }],
-		"linebreak-style": [2, "unix"],
-		"lines-around-comment": [2, {
-			"beforeBlockComment": false,
-			"afterBlockComment": false,
-			"beforeLineComment": false,
-			"beforeLineComment": false,
-			"allowBlockStart": true,
-			"allowBlockEnd": true
-		}],
-		"quotes": [2, "single", "avoid-escape"],
-		"max-depth": [1, 4],
-		"max-len": [0, 80, 4],
-		"max-nested-callbacks": [2, 2],
-		"max-params": [2, 2],
-		"max-statements": [2, 21],
-		"new-parens": [2],
-		"new-cap": [2],
-		"newline-after-var": [0],
-		"no-alert": [2],
-		"no-array-constructor": [2],
-		"no-bitwise": [0],
-		"no-caller": [2],
-		"no-catch-shadow": [2],
-		"no-cond-assign": [2],
-		"no-console": [2],
-		"no-constant-condition": [2],
-		"no-continue": [2],
-		"no-control-regex": [2],
-		"no-debugger": [2],
-		"no-delete-var": [2],
-		"no-div-regex": [0],
-		"no-dupe-args": [2],
-		"no-dupe-keys": [2],
-		"no-duplicate-case": [2],
-		"no-else-return": [0],
-		"no-empty": [2],
-		"no-empty-character-class": [2],
-		"no-empty-label": [2],
-		"no-eq-null": [0],
-		"no-eval": [2],
-		"no-ex-assign": [2],
-		"no-extend-native": [2],
-		"no-extra-bind": [2],
-		"no-extra-boolean-cast": [2],
-		"no-extra-parens": [0],
-		"no-extra-semi": [2],
-		"no-fallthrough": [2],
-		"no-floating-decimal": [2],
-		"no-func-assign": [2],
-		"no-implied-eval": [2],
-		"no-inline-comments": [0],
-		"no-inner-declarations": [2, "functions"],
-		"no-invalid-regexp": [2],
-		"no-irregular-whitespace": [2],
-		"no-iterator": [2],
-		"no-label-var": [2],
-		"no-labels": [2],
-		"no-lone-blocks": [2],
-		"no-lonely-if": [2],
-		"no-loop-func": [2],
-		"no-mixed-requires": [0, false],
-		"no-mixed-spaces-and-tabs": [2, false],
-		"no-multi-spaces": [2],
-		"no-multi-str": [2],
-		"no-multiple-empty-lines": [2, {"max": 1}],
-		"no-native-reassign": [2],
-		"no-negated-in-lhs": [2],
-		"no-nested-ternary": [0],
-		"no-new": [2],
-		"no-new-func": [2],
-		"no-new-object": [2],
-		"no-new-require": [0],
-		"no-new-wrappers": [2],
-		"no-obj-calls": [2],
-		"no-octal": [2],
-		"no-octal-escape": [2],
-		"no-param-reassign": [2],
-		"no-path-concat": [0],
-		"no-plusplus": [0],
-		"no-process-env": [0],
-		"no-process-exit": [2],
-		"no-proto": [2],
-		"no-redeclare": [2],
-		"no-regex-spaces": [2],
-		"no-reserved-keys": [2],
-		"no-restricted-modules": [0],
-		"no-return-assign": [2, "always"],
-		"no-script-url": [2],
-		"no-self-compare": [0],
-		"no-sequences": [2],
-		"no-shadow": [2],
-		"no-shadow-restricted-names": [2],
-		"no-space-before-semi": [2],
-		"no-spaced-func": [2],
-		"no-sparse-arrays": [2],
-		"no-sync": [0],
-		"no-ternary": [0],
-		"no-this-before-super": [2],
-		"no-throw-literal": [2],
-		"no-trailing-spaces": [2, { "skipBlankLines": false }],
-		"no-undef": [2],
-		"no-undef-init": [2],
-		"no-undefined": [0],
-		"no-underscore-dangle": [2],
-		"no-unexpected-multiline": [2],
-		"no-unneeded-ternary": [2],
-		"no-unreachable": [2],
-		"no-unused-expressions": [2],
-		"no-unused-vars": [2, { "vars": "all", "args": "after-used" }],
-		"no-use-before-define": [2],
-		"no-void": [0],
-		"no-warning-comments": [0, { "terms": ["todo", "fixme", "xxx"], "location": "start" }],
-		"no-with": [2],
-		"no-wrap-func": [2],
-		"object-curly-spacing": [2, "always"],
-		"object-shorthand": [2, "never"],
-		"one-var": [0],
-		"operator-assignment": [0, "always"],
-		"operator-linebreak": [2, "none"],
-		"padded-blocks": [0],
-		"prefer-const": [0],
-		"quote-props": [0],
-		"radix": [0],
-		"semi": [2],
-		"semi-spacing": [2, { "before": false, "after": true }],
-		"sort-vars": [0],
-		"space-after-keywords": [2, "always"],
-		"space-before-function-paren": [2, { "anonymous": "always", "named": "never" }],
-		"space-before-blocks": [0, "always"],
-		"space-in-brackets": [0, "never", {
-			"singleValue": true,
-			"arraysInArrays": false,
-			"arraysInObjects": false,
-			"objectsInArrays": true,
-			"objectsInObjects": true,
-			"propertyName": false
-		}],
-		"space-in-parens": [2, "never"],
-		"space-infix-ops": [2],
-		"space-return-throw-case": [2],
-		"space-unary-ops": [2, { "words": true, "nonwords": false }],
-		"spaced-comment": [2, "always"],
-		"spaced-line-comment": [0, "always"],
-		"strict": [2, "global"],
-		"use-isnan": [2],
-		"valid-jsdoc": [0],
-		"valid-typeof": [2],
-		"vars-on-top": [0],
-		"wrap-iife": [2],
-		"wrap-regex": [2],
-		"yoda": [2, "never", { "exceptRange": true, "onlyEquality": false }]
-	}
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.jscs.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.jscs.json
deleted file mode 100644
index 7e84b282bb17638107ad04f5cade06d164e06b2d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.jscs.json
+++ /dev/null
@@ -1,104 +0,0 @@
-{
-	"additionalRules": [],
-
-	"requireSemicolons": true,
-
-	"disallowMultipleSpaces": true,
-
-	"disallowIdentifierNames": [],
-
-	"requireCurlyBraces": ["if", "else", "for", "while", "do", "try", "catch"],
-
-	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
-
-	"disallowSpaceAfterKeywords": [],
-
-	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
-	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
-	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
-
-	"requireSpaceBetweenArguments": true,
-
-	"disallowSpacesInsideParentheses": true,
-
-	"disallowSpacesInsideArrayBrackets": true,
-
-	"disallowQuotedKeysInObjects": "allButReserved",
-
-	"disallowSpaceAfterObjectKeys": true,
-
-	"requireCommaBeforeLineBreak": true,
-
-	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
-	"requireSpaceAfterPrefixUnaryOperators": [],
-
-	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
-	"requireSpaceBeforePostfixUnaryOperators": [],
-
-	"disallowSpaceBeforeBinaryOperators": [],
-	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-
-	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-	"disallowSpaceAfterBinaryOperators": [],
-
-	"disallowImplicitTypeConversion": ["binary", "string"],
-
-	"disallowKeywords": ["with", "eval"],
-
-	"requireKeywordsOnNewLine": [],
-	"disallowKeywordsOnNewLine": ["else"],
-
-	"requireLineFeedAtFileEnd": true,
-
-	"disallowTrailingWhitespace": true,
-
-	"disallowTrailingComma": true,
-
-	"excludeFiles": ["node_modules/**", "vendor/**"],
-
-	"disallowMultipleLineStrings": true,
-
-	"requireDotNotation": true,
-
-	"requireParenthesesAroundIIFE": true,
-
-	"validateLineBreaks": "LF",
-
-	"validateQuoteMarks": {
-		"escape": true,
-		"mark": "'"
-	},
-
-	"disallowOperatorBeforeLineBreak": [],
-
-	"requireSpaceBeforeKeywords": [
-		"do",
-		"for",
-		"if",
-		"else",
-		"switch",
-		"case",
-		"try",
-		"catch",
-		"finally",
-		"while",
-		"with",
-		"return"
-	],
-
-	"validateAlignedFunctionParameters": {
-		"lineBreakAfterOpeningBraces": true,
-		"lineBreakBeforeClosingBraces": true
-	},
-
-	"requirePaddingNewLinesBeforeExport": true,
-
-	"validateNewlineAfterArrayElements": {
-		"maximum": 6
-	},
-
-	"requirePaddingNewLinesAfterUseStrict": true
-}
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.npmignore
deleted file mode 100644
index 30d74d258442c7c65512eafab474568dd706c430..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-test
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.travis.yml
deleted file mode 100644
index ebef64499b35530b3663e40a3163dfd21e790a9c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/.travis.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-language: node_js
-node_js:
-  - "iojs-v2.3"
-  - "iojs-v2.2"
-  - "iojs-v2.1"
-  - "iojs-v2.0"
-  - "iojs-v1.8"
-  - "iojs-v1.7"
-  - "iojs-v1.6"
-  - "iojs-v1.5"
-  - "iojs-v1.4"
-  - "iojs-v1.3"
-  - "iojs-v1.2"
-  - "iojs-v1.1"
-  - "iojs-v1.0"
-  - "0.12"
-  - "0.11"
-  - "0.10"
-  - "0.9"
-  - "0.8"
-  - "0.6"
-  - "0.4"
-before_install:
-  - '[ "${TRAVIS_NODE_VERSION}" = "0.6" ] || npm install -g npm@1.4.28 && npm install -g npm'
-sudo: false
-matrix:
-  fast_finish: true
-  allow_failures:
-    - node_js: "iojs-v2.2"
-    - node_js: "iojs-v2.1"
-    - node_js: "iojs-v2.0"
-    - node_js: "iojs-v1.7"
-    - node_js: "iojs-v1.6"
-    - node_js: "iojs-v1.5"
-    - node_js: "iojs-v1.4"
-    - node_js: "iojs-v1.3"
-    - node_js: "iojs-v1.2"
-    - node_js: "iojs-v1.1"
-    - node_js: "iojs-v1.0"
-    - node_js: "0.11"
-    - node_js: "0.9"
-    - node_js: "0.8"
-    - node_js: "0.6"
-    - node_js: "0.4"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/CHANGELOG.md
deleted file mode 100644
index ee0cfd6adb5a2e3021a4f680f30ad86a02f85f03..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/CHANGELOG.md
+++ /dev/null
@@ -1,69 +0,0 @@
-3.0.0 / 2015-07-01
-==================
-  * [Possible breaking change] Use global "strict" directive (#32)
-  * [Tests] `int` is an ES3 reserved word
-  * [Tests] Test up to `io.js` `v2.3`
-  * [Tests] Add `npm run eslint`
-  * [Dev Deps] Update `covert`, `jscs`
-
-2.0.1 / 2015-04-25
-==================
-  * Use an inline `isArray` check, for ES3 browsers. (#27)
-  * Some old browsers fail when an identifier is `toString`
-  * Test latest `node` and `io.js` versions on `travis-ci`; speed up builds
-  * Add license info to package.json (#25)
-  * Update `tape`, `jscs`
-  * Adding a CHANGELOG
-
-2.0.0 / 2014-10-01
-==================
-  * Increase code coverage to 100%; run code coverage as part of tests
-  * Add `npm run lint`; Run linter as part of tests
-  * Remove nodeType and setInterval checks in isPlainObject
-  * Updating `tape`, `jscs`, `covert`
-  * General style and README cleanup
-
-1.3.0 / 2014-06-20
-==================
-  * Add component.json for browser support (#18)
-  * Use SVG for badges in README (#16)
-  * Updating `tape`, `covert`
-  * Updating travis-ci to work with multiple node versions
-  * Fix `deep === false` bug (returning target as {}) (#14)
-  * Fixing constructor checks in isPlainObject
-  * Adding additional test coverage
-  * Adding `npm run coverage`
-  * Add LICENSE (#13)
-  * Adding a warning about `false`, per #11
-  * General style and whitespace cleanup
-
-1.2.1 / 2013-09-14
-==================
-  * Fixing hasOwnProperty bugs that would only have shown up in specific browsers. Fixes #8
-  * Updating `tape`
-
-1.2.0 / 2013-09-02
-==================
-  * Updating the README: add badges
-  * Adding a missing variable reference.
-  * Using `tape` instead of `buster` for tests; add more tests (#7)
-  * Adding node 0.10 to Travis CI (#6)
-  * Enabling "npm test" and cleaning up package.json (#5)
-  * Add Travis CI.
-
-1.1.3 / 2012-12-06
-==================
-  * Added unit tests.
-  * Ensure extend function is named. (Looks nicer in a stack trace.)
-  * README cleanup.
-
-1.1.1 / 2012-11-07
-==================
-  * README cleanup.
-  * Added installation instructions.
-  * Added a missing semicolon
-
-1.0.0 / 2012-04-08
-==================
-  * Initial commit
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/LICENSE
deleted file mode 100644
index e16d6a56ca64e235d9065c37f4566a0fe0be28d4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Stefan Thomas
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/README.md
deleted file mode 100644
index 632fb0f96fd347b2a56ba335f639faba19501d69..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/README.md
+++ /dev/null
@@ -1,62 +0,0 @@
-[![Build Status][travis-svg]][travis-url]
-[![dependency status][deps-svg]][deps-url]
-[![dev dependency status][dev-deps-svg]][dev-deps-url]
-
-# extend() for Node.js <sup>[![Version Badge][npm-version-png]][npm-url]</sup>
-
-`node-extend` is a port of the classic extend() method from jQuery. It behaves as you expect. It is simple, tried and true.
-
-## Installation
-
-This package is available on [npm][npm-url] as: `extend`
-
-``` sh
-npm install extend
-```
-
-## Usage
-
-**Syntax:** extend **(** [`deep`], `target`, `object1`, [`objectN`] **)**
-
-*Extend one object with one or more others, returning the modified object.*
-
-Keep in mind that the target object will be modified, and will be returned from extend().
-
-If a boolean true is specified as the first argument, extend performs a deep copy, recursively copying any objects it finds. Otherwise, the copy will share structure with the original object(s).
-Undefined properties are not copied. However, properties inherited from the object's prototype will be copied over.
-Warning: passing `false` as the first argument is not supported.
-
-### Arguments
-
-* `deep` *Boolean* (optional)
-If set, the merge becomes recursive (i.e. deep copy).
-* `target`	*Object*
-The object to extend.
-* `object1`	*Object*
-The object that will be merged into the first.
-* `objectN` *Object* (Optional)
-More objects to merge into the first.
-
-## License
-
-`node-extend` is licensed under the [MIT License][mit-license-url].
-
-## Acknowledgements
-
-All credit to the jQuery authors for perfecting this amazing utility.
-
-Ported to Node.js by [Stefan Thomas][github-justmoon] with contributions by [Jonathan Buchanan][github-insin] and [Jordan Harband][github-ljharb].
-
-[travis-svg]: https://travis-ci.org/justmoon/node-extend.svg
-[travis-url]: https://travis-ci.org/justmoon/node-extend
-[npm-url]: https://npmjs.org/package/extend
-[mit-license-url]: http://opensource.org/licenses/MIT
-[github-justmoon]: https://github.com/justmoon
-[github-insin]: https://github.com/insin
-[github-ljharb]: https://github.com/ljharb
-[npm-version-png]: http://vb.teelaun.ch/justmoon/node-extend.svg
-[deps-svg]: https://david-dm.org/justmoon/node-extend.svg
-[deps-url]: https://david-dm.org/justmoon/node-extend
-[dev-deps-svg]: https://david-dm.org/justmoon/node-extend/dev-status.svg
-[dev-deps-url]: https://david-dm.org/justmoon/node-extend#info=devDependencies
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/component.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/component.json
deleted file mode 100644
index 1500a2f37181823ef8500854e8bbe613fbc5215a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/component.json
+++ /dev/null
@@ -1,32 +0,0 @@
-{
-	"name": "extend",
-	"author": "Stefan Thomas <justmoon@members.fsf.org> (http://www.justmoon.net)",
-	"version": "3.0.0",
-	"description": "Port of jQuery.extend for node.js and the browser.",
-	"scripts": [
-		"index.js"
-	],
-	"contributors": [
-		{
-			"name": "Jordan Harband",
-			"url": "https://github.com/ljharb"
-		}
-	],
-	"keywords": [
-		"extend",
-		"clone",
-		"merge"
-	],
-	"repository" : {
-		"type": "git",
-		"url": "https://github.com/justmoon/node-extend.git"
-	},
-	"dependencies": {
-	},
-	"devDependencies": {
-		"tape" : "~3.0.0",
-		"covert": "~0.4.0",
-		"jscs": "~1.6.2"
-	}
-}
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/index.js
deleted file mode 100644
index f5ec75d52f5f61f65da937519d0f2f38f4e4007d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/index.js
+++ /dev/null
@@ -1,86 +0,0 @@
-'use strict';
-
-var hasOwn = Object.prototype.hasOwnProperty;
-var toStr = Object.prototype.toString;
-
-var isArray = function isArray(arr) {
-	if (typeof Array.isArray === 'function') {
-		return Array.isArray(arr);
-	}
-
-	return toStr.call(arr) === '[object Array]';
-};
-
-var isPlainObject = function isPlainObject(obj) {
-	if (!obj || toStr.call(obj) !== '[object Object]') {
-		return false;
-	}
-
-	var hasOwnConstructor = hasOwn.call(obj, 'constructor');
-	var hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');
-	// Not own constructor property must be Object
-	if (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {
-		return false;
-	}
-
-	// Own properties are enumerated firstly, so to speed up,
-	// if last one is own, then all properties are own.
-	var key;
-	for (key in obj) {/**/}
-
-	return typeof key === 'undefined' || hasOwn.call(obj, key);
-};
-
-module.exports = function extend() {
-	var options, name, src, copy, copyIsArray, clone,
-		target = arguments[0],
-		i = 1,
-		length = arguments.length,
-		deep = false;
-
-	// Handle a deep copy situation
-	if (typeof target === 'boolean') {
-		deep = target;
-		target = arguments[1] || {};
-		// skip the boolean and the target
-		i = 2;
-	} else if ((typeof target !== 'object' && typeof target !== 'function') || target == null) {
-		target = {};
-	}
-
-	for (; i < length; ++i) {
-		options = arguments[i];
-		// Only deal with non-null/undefined values
-		if (options != null) {
-			// Extend the base object
-			for (name in options) {
-				src = target[name];
-				copy = options[name];
-
-				// Prevent never-ending loop
-				if (target !== copy) {
-					// Recurse if we're merging plain objects or arrays
-					if (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {
-						if (copyIsArray) {
-							copyIsArray = false;
-							clone = src && isArray(src) ? src : [];
-						} else {
-							clone = src && isPlainObject(src) ? src : {};
-						}
-
-						// Never move original objects, clone them
-						target[name] = extend(deep, clone, copy);
-
-					// Don't bring in undefined values
-					} else if (typeof copy !== 'undefined') {
-						target[name] = copy;
-					}
-				}
-			}
-		}
-	}
-
-	// Return the modified object
-	return target;
-};
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/package.json
deleted file mode 100644
index 2f36ae50e3c27f8527fb053d95314769a80c3a29..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/extend/package.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
-  "_from": "extend@>=3.0.0 <3.1.0",
-  "_id": "extend@3.0.0",
-  "_location": "/serialport/node-pre-gyp/request/extend",
-  "_nodeVersion": "2.3.1",
-  "_npmUser": {
-    "email": "ljharb@gmail.com",
-    "name": "ljharb"
-  },
-  "_npmVersion": "2.11.3",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz",
-  "_shasum": "5a474353b9f3353ddd8176dfd37b91c83a46f1d4",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "justmoon@members.fsf.org",
-    "name": "Stefan Thomas",
-    "url": "http://www.justmoon.net"
-  },
-  "bugs": {
-    "url": "https://github.com/justmoon/node-extend/issues"
-  },
-  "contributors": [
-    {
-      "name": "Jordan Harband",
-      "url": "https://github.com/ljharb"
-    }
-  ],
-  "dependencies": {},
-  "description": "Port of jQuery.extend for node.js and the browser",
-  "devDependencies": {
-    "covert": "^1.1.0",
-    "eslint": "^0.24.0",
-    "jscs": "^1.13.1",
-    "tape": "^4.0.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "5a474353b9f3353ddd8176dfd37b91c83a46f1d4",
-    "tarball": "http://registry.npmjs.org/extend/-/extend-3.0.0.tgz"
-  },
-  "gitHead": "148e7270cab2e9413af2cd0cab147070d755ed6d",
-  "homepage": "https://github.com/justmoon/node-extend#readme",
-  "keywords": [
-    "clone",
-    "extend",
-    "merge"
-  ],
-  "license": "MIT",
-  "main": "index",
-  "maintainers": [
-    {
-      "name": "justmoon",
-      "email": "justmoon@members.fsf.org"
-    },
-    {
-      "name": "ljharb",
-      "email": "ljharb@gmail.com"
-    }
-  ],
-  "name": "extend",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/justmoon/node-extend.git"
-  },
-  "scripts": {
-    "coverage": "covert test/index.js",
-    "coverage-quiet": "covert test/index.js --quiet",
-    "eslint": "eslint *.js */*.js",
-    "jscs": "jscs *.js */*.js",
-    "lint": "npm run jscs && npm run eslint",
-    "test": "npm run lint && node test/index.js && npm run coverage-quiet"
-  },
-  "version": "3.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/LICENSE
deleted file mode 100644
index a4a9aee0c2fa14a2007895d018bfa06f0592fd34..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/LICENSE
+++ /dev/null
@@ -1,55 +0,0 @@
-Apache License
-
-Version 2.0, January 2004
-
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
-
-"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
-
-You must give any other recipients of the Work or Derivative Works a copy of this License; and
-
-You must cause any modified files to carry prominent notices stating that You changed the files; and
-
-You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
-
-If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/README.md
deleted file mode 100644
index 9d5b66343c4e917ad1600b7656dbd2f4112ed8aa..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-forever-agent
-=============
-
-HTTP Agent that keeps socket connections alive between keep-alive requests. Formerly part of mikeal/request, now a standalone module.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/index.js
deleted file mode 100644
index 416c7abd7092332918838b4e8ed782d0b072fec7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/index.js
+++ /dev/null
@@ -1,138 +0,0 @@
-module.exports = ForeverAgent
-ForeverAgent.SSL = ForeverAgentSSL
-
-var util = require('util')
-  , Agent = require('http').Agent
-  , net = require('net')
-  , tls = require('tls')
-  , AgentSSL = require('https').Agent
-  
-function getConnectionName(host, port) {  
-  var name = ''
-  if (typeof host === 'string') {
-    name = host + ':' + port
-  } else {
-    // For node.js v012.0 and iojs-v1.5.1, host is an object. And any existing localAddress is part of the connection name.
-    name = host.host + ':' + host.port + ':' + (host.localAddress ? (host.localAddress + ':') : ':')
-  }
-  return name
-}    
-
-function ForeverAgent(options) {
-  var self = this
-  self.options = options || {}
-  self.requests = {}
-  self.sockets = {}
-  self.freeSockets = {}
-  self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets
-  self.minSockets = self.options.minSockets || ForeverAgent.defaultMinSockets
-  self.on('free', function(socket, host, port) {
-    var name = getConnectionName(host, port)
-
-    if (self.requests[name] && self.requests[name].length) {
-      self.requests[name].shift().onSocket(socket)
-    } else if (self.sockets[name].length < self.minSockets) {
-      if (!self.freeSockets[name]) self.freeSockets[name] = []
-      self.freeSockets[name].push(socket)
-      
-      // if an error happens while we don't use the socket anyway, meh, throw the socket away
-      var onIdleError = function() {
-        socket.destroy()
-      }
-      socket._onIdleError = onIdleError
-      socket.on('error', onIdleError)
-    } else {
-      // If there are no pending requests just destroy the
-      // socket and it will get removed from the pool. This
-      // gets us out of timeout issues and allows us to
-      // default to Connection:keep-alive.
-      socket.destroy()
-    }
-  })
-
-}
-util.inherits(ForeverAgent, Agent)
-
-ForeverAgent.defaultMinSockets = 5
-
-
-ForeverAgent.prototype.createConnection = net.createConnection
-ForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest
-ForeverAgent.prototype.addRequest = function(req, host, port) {
-  var name = getConnectionName(host, port)
-  
-  if (typeof host !== 'string') {
-    var options = host
-    port = options.port
-    host = options.host
-  }
-
-  if (this.freeSockets[name] && this.freeSockets[name].length > 0 && !req.useChunkedEncodingByDefault) {
-    var idleSocket = this.freeSockets[name].pop()
-    idleSocket.removeListener('error', idleSocket._onIdleError)
-    delete idleSocket._onIdleError
-    req._reusedSocket = true
-    req.onSocket(idleSocket)
-  } else {
-    this.addRequestNoreuse(req, host, port)
-  }
-}
-
-ForeverAgent.prototype.removeSocket = function(s, name, host, port) {
-  if (this.sockets[name]) {
-    var index = this.sockets[name].indexOf(s)
-    if (index !== -1) {
-      this.sockets[name].splice(index, 1)
-    }
-  } else if (this.sockets[name] && this.sockets[name].length === 0) {
-    // don't leak
-    delete this.sockets[name]
-    delete this.requests[name]
-  }
-  
-  if (this.freeSockets[name]) {
-    var index = this.freeSockets[name].indexOf(s)
-    if (index !== -1) {
-      this.freeSockets[name].splice(index, 1)
-      if (this.freeSockets[name].length === 0) {
-        delete this.freeSockets[name]
-      }
-    }
-  }
-
-  if (this.requests[name] && this.requests[name].length) {
-    // If we have pending requests and a socket gets closed a new one
-    // needs to be created to take over in the pool for the one that closed.
-    this.createSocket(name, host, port).emit('free')
-  }
-}
-
-function ForeverAgentSSL (options) {
-  ForeverAgent.call(this, options)
-}
-util.inherits(ForeverAgentSSL, ForeverAgent)
-
-ForeverAgentSSL.prototype.createConnection = createConnectionSSL
-ForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest
-
-function createConnectionSSL (port, host, options) {
-  if (typeof port === 'object') {
-    options = port;
-  } else if (typeof host === 'object') {
-    options = host;
-  } else if (typeof options === 'object') {
-    options = options;
-  } else {
-    options = {};
-  }
-
-  if (typeof port === 'number') {
-    options.port = port;
-  }
-
-  if (typeof host === 'string') {
-    options.host = host;
-  }
-
-  return tls.connect(options);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/package.json
deleted file mode 100644
index 18be5df66fd2e5c64060344351b806bbfcb809e4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/forever-agent/package.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
-  "_from": "forever-agent@>=0.6.1 <0.7.0",
-  "_id": "forever-agent@0.6.1",
-  "_location": "/serialport/node-pre-gyp/request/forever-agent",
-  "_npmUser": {
-    "email": "simeonvelichkov@gmail.com",
-    "name": "simov"
-  },
-  "_npmVersion": "1.4.28",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-  "_shasum": "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mikeal.rogers@gmail.com",
-    "name": "Mikeal Rogers",
-    "url": "http://www.futurealoof.com"
-  },
-  "bugs": {
-    "url": "https://github.com/mikeal/forever-agent/issues"
-  },
-  "dependencies": {},
-  "description": "HTTP Agent that keeps socket connections alive between keep-alive requests. Formerly part of mikeal/request, now a standalone module.",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91",
-    "tarball": "http://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "gitHead": "1b3b6163f2b3c2c4122bbfa288c1325c0df9871d",
-  "homepage": "https://github.com/mikeal/forever-agent",
-  "license": "Apache-2.0",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "mikeal",
-      "email": "mikeal.rogers@gmail.com"
-    },
-    {
-      "name": "nylen",
-      "email": "jnylen@gmail.com"
-    },
-    {
-      "name": "simov",
-      "email": "simeonvelichkov@gmail.com"
-    }
-  ],
-  "name": "forever-agent",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "url": "git+https://github.com/mikeal/forever-agent.git"
-  },
-  "scripts": {},
-  "version": "0.6.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.dockerignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.dockerignore
deleted file mode 100644
index c67305cf96976eb882f5df662b32e0406a50b88a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.dockerignore
+++ /dev/null
@@ -1,7 +0,0 @@
-*.iml
-*.sublime-*
-*.un~
-.idea
-sftp-config.json
-node_modules/
-test/tmp/
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.editorconfig b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.editorconfig
deleted file mode 100644
index 0f099897b15f2fb0408f9b3640a6f0a19dfc348f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.editorconfig
+++ /dev/null
@@ -1,10 +0,0 @@
-# editorconfig.org
-root = true
-
-[*]
-indent_style = space
-indent_size = 2
-end_of_line = lf
-charset = utf-8
-trim_trailing_whitespace = true
-insert_final_newline = true
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.eslintignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.eslintignore
deleted file mode 100644
index 8d87b1d267eabcb51a652ac62f9e0862dbde5541..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.eslintignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules/*
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.eslintrc b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.eslintrc
deleted file mode 100644
index 129fcef0389c9a8b6f21e48d47ab17741ae238ec..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/.eslintrc
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "env": {
-    "node": true,
-    "browser": false
-  },
-  "rules": {
-    // 2-space indentation
-    "indent": [2, 2, {"SwitchCase": 1}],
-    // Require strings to use single quotes
-    "quotes": [2, "single"],
-    // Allow only unix line-endings
-    "linebreak-style": [2, "unix"],
-    // Always require semicolons
-    "semi": [2, "always"],
-    // Require curly braces for multi-line control statements
-    "curly": [2, "multi-line"],
-    // Always handle callback error cases
-    "handle-callback-err": [2, "^err"],
-    // Require JSDoc for all function definitions
-    "valid-jsdoc": [2, {
-      "requireReturn": false,
-      "requireReturnDescription": false,
-      "prefer": {
-        "return": "returns"
-      }
-    }],
-    "require-jsdoc": [2, {
-      "require": {
-        "FunctionDeclaration": true
-      }
-    }],
-    "no-redeclare": [2, { "builtinGlobals": true }],
-    "no-shadow": [2, { "builtinGlobals": true, "hoist": "all" }],
-    // Disallow using variables before they've been defined
-    // functions are ok
-    "no-use-before-define": [2, "nofunc"],
-    "no-shadow-restricted-names": 2,
-    "no-extra-semi": 2,
-    // Disallow unused variables
-    "no-unused-vars": 2,
-    "no-undef": 2,
-    // Use if () { }
-    //       ^ space
-    "keyword-spacing": 2,
-    // Use if () { }
-    //          ^ space
-    "space-before-blocks": [2, "always"],
-    // eslint can't handle this, so the check is disabled.
-    "key-spacing": 0,
-    "strict": 0,
-    // Do not force dot-notation
-    "dot-notation": 0,
-    "eol-last": 0,
-    "no-new": 0,
-    "semi-spacing": 0,
-    // Allow multi spaces around operators since they are
-    // used for alignment.  This is not consistent in the
-    // code.
-    "no-multi-spaces": 0,
-    "eqeqeq": 0,
-    "no-mixed-requires": 0,
-    "no-console": 0
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/License b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/License
deleted file mode 100644
index c7ff12a2f8af2e2c57f39da1754409c25b35f46a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/License
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/README.md
deleted file mode 100644
index e857db6e2ea8e188ddfbe180eae125e1e26a83f6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/README.md
+++ /dev/null
@@ -1,218 +0,0 @@
-# Form-Data [![NPM Module](https://img.shields.io/npm/v/form-data.svg)](https://www.npmjs.com/package/form-data) [![Join the chat at https://gitter.im/form-data/form-data](http://form-data.github.io/images/gitterbadge.svg)](https://gitter.im/form-data/form-data)
-
-A library to create readable ```"multipart/form-data"``` streams. Can be used to submit forms and file uploads to other web applications.
-
-The API of this library is inspired by the [XMLHttpRequest-2 FormData Interface][xhr2-fd].
-
-[xhr2-fd]: http://dev.w3.org/2006/webapi/XMLHttpRequest-2/Overview.html#the-formdata-interface
-[streams2-thing]: http://nodejs.org/api/stream.html#stream_compatibility_with_older_node_versions
-
-[![Linux Build](https://img.shields.io/travis/form-data/form-data/master.svg?label=linux:0.10-5.x)](https://travis-ci.org/form-data/form-data)
-[![Windows Build](https://img.shields.io/appveyor/ci/alexindigo/form-data/master.svg?label=windows:0.10-5.x)](https://ci.appveyor.com/project/alexindigo/form-data)
-[![Coverage Status](https://img.shields.io/coveralls/form-data/form-data/master.svg?label=code+coverage)](https://coveralls.io/github/form-data/form-data?branch=master)
-
-[![Dependency Status](https://img.shields.io/david/form-data/form-data.svg)](https://david-dm.org/form-data/form-data)
-[![Codacy Badge](https://img.shields.io/codacy/43ece80331c246179695e41f81eeffe2.svg)](https://www.codacy.com/app/form-data/form-data)
-[![bitHound Overall Score](https://www.bithound.io/github/form-data/form-data/badges/score.svg)](https://www.bithound.io/github/form-data/form-data)
-
-## Install
-
-```
-npm install form-data
-```
-
-## Usage
-
-In this example we are constructing a form with 3 fields that contain a string,
-a buffer and a file stream.
-
-``` javascript
-var FormData = require('form-data');
-var fs = require('fs');
-
-var form = new FormData();
-form.append('my_field', 'my value');
-form.append('my_buffer', new Buffer(10));
-form.append('my_file', fs.createReadStream('/foo/bar.jpg'));
-```
-
-Also you can use http-response stream:
-
-``` javascript
-var FormData = require('form-data');
-var http = require('http');
-
-var form = new FormData();
-
-http.request('http://nodejs.org/images/logo.png', function(response) {
-  form.append('my_field', 'my value');
-  form.append('my_buffer', new Buffer(10));
-  form.append('my_logo', response);
-});
-```
-
-Or @mikeal's [request](https://github.com/request/request) stream:
-
-``` javascript
-var FormData = require('form-data');
-var request = require('request');
-
-var form = new FormData();
-
-form.append('my_field', 'my value');
-form.append('my_buffer', new Buffer(10));
-form.append('my_logo', request('http://nodejs.org/images/logo.png'));
-```
-
-In order to submit this form to a web application, call ```submit(url, [callback])``` method:
-
-``` javascript
-form.submit('http://example.org/', function(err, res) {
-  // res – response object (http.IncomingMessage)  //
-  res.resume();
-});
-
-```
-
-For more advanced request manipulations ```submit()``` method returns ```http.ClientRequest``` object, or you can choose from one of the alternative submission methods.
-
-### Alternative submission methods
-
-You can use node's http client interface:
-
-``` javascript
-var http = require('http');
-
-var request = http.request({
-  method: 'post',
-  host: 'example.org',
-  path: '/upload',
-  headers: form.getHeaders()
-});
-
-form.pipe(request);
-
-request.on('response', function(res) {
-  console.log(res.statusCode);
-});
-```
-
-Or if you would prefer the `'Content-Length'` header to be set for you:
-
-``` javascript
-form.submit('example.org/upload', function(err, res) {
-  console.log(res.statusCode);
-});
-```
-
-To use custom headers and pre-known length in parts:
-
-``` javascript
-var CRLF = '\r\n';
-var form = new FormData();
-
-var options = {
-  header: CRLF + '--' + form.getBoundary() + CRLF + 'X-Custom-Header: 123' + CRLF + CRLF,
-  knownLength: 1
-};
-
-form.append('my_buffer', buffer, options);
-
-form.submit('http://example.com/', function(err, res) {
-  if (err) throw err;
-  console.log('Done');
-});
-```
-
-Form-Data can recognize and fetch all the required information from common types of streams (```fs.readStream```, ```http.response``` and ```mikeal's request```), for some other types of streams you'd need to provide "file"-related information manually:
-
-``` javascript
-someModule.stream(function(err, stdout, stderr) {
-  if (err) throw err;
-
-  var form = new FormData();
-
-  form.append('file', stdout, {
-    filename: 'unicycle.jpg',
-    contentType: 'image/jpg',
-    knownLength: 19806
-  });
-
-  form.submit('http://example.com/', function(err, res) {
-    if (err) throw err;
-    console.log('Done');
-  });
-});
-```
-
-For edge cases, like POST request to URL with query string or to pass HTTP auth credentials, object can be passed to `form.submit()` as first parameter:
-
-``` javascript
-form.submit({
-  host: 'example.com',
-  path: '/probably.php?extra=params',
-  auth: 'username:password'
-}, function(err, res) {
-  console.log(res.statusCode);
-});
-```
-
-In case you need to also send custom HTTP headers with the POST request, you can use the `headers` key in first parameter of `form.submit()`:
-
-``` javascript
-form.submit({
-  host: 'example.com',
-  path: '/surelynot.php',
-  headers: {'x-test-header': 'test-header-value'}
-}, function(err, res) {
-  console.log(res.statusCode);
-});
-```
-
-### Integration with other libraries
-
-#### Request
-
-Form submission using  [request](https://github.com/request/request):
-
-```javascript
-var formData = {
-  my_field: 'my_value',
-  my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
-};
-
-request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) {
-  if (err) {
-    return console.error('upload failed:', err);
-  }
-  console.log('Upload successful!  Server responded with:', body);
-});
-```
-
-For more details see [request readme](https://github.com/request/request#multipartform-data-multipart-form-uploads).
-
-#### node-fetch
-
-You can also submit a form using [node-fetch](https://github.com/bitinn/node-fetch):
-
-```javascript
-var form = new FormData();
-
-form.append('a', 1);
-
-fetch('http://example.com', { method: 'POST', body: form })
-    .then(function(res) {
-        return res.json();
-    }).then(function(json) {
-        console.log(json);
-    });
-```
-
-## Notes
-
-- ```getLengthSync()``` method DOESN'T calculate length for streams, use ```knownLength``` options as workaround.
-- If it feels like FormData hangs after submit and you're on ```node-0.10```, please check [Compatibility with Older Node Versions][streams2-thing]
-
-## License
-
-Form-Data is licensed under the MIT license.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/browser.js
deleted file mode 100644
index 8141d6589ddaccafddd398f6b5101562b5556555..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/browser.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/* eslint-env browser */
-module.exports = FormData;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/form_data.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/form_data.js
deleted file mode 100644
index 55328b463b3bf343744061cb2165122d15e4b9fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/form_data.js
+++ /dev/null
@@ -1,411 +0,0 @@
-var CombinedStream = require('combined-stream');
-var util = require('util');
-var path = require('path');
-var http = require('http');
-var https = require('https');
-var parseUrl = require('url').parse;
-var fs = require('fs');
-var mime = require('mime-types');
-var async = require('async');
-var populate = require('./populate.js');
-
-// Public API
-module.exports = FormData;
-
-// make it a Stream
-util.inherits(FormData, CombinedStream);
-
-/**
- * Create readable "multipart/form-data" streams.
- * Can be used to submit forms
- * and file uploads to other web applications.
- *
- * @constructor
- */
-function FormData() {
-  if (!(this instanceof FormData)) {
-    throw new TypeError('Failed to construct FormData: Please use the _new_ operator, this object constructor cannot be called as a function.');
-  }
-
-  this._overheadLength = 0;
-  this._valueLength = 0;
-  this._lengthRetrievers = [];
-
-  CombinedStream.call(this);
-}
-
-FormData.LINE_BREAK = '\r\n';
-FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';
-
-FormData.prototype.append = function(field, value, options) {
-
-  options = options || {};
-
-  // allow filename as single option
-  if (typeof options == 'string') {
-    options = {filename: options};
-  }
-
-  var append = CombinedStream.prototype.append.bind(this);
-
-  // all that streamy business can't handle numbers
-  if (typeof value == 'number') {
-    value = '' + value;
-  }
-
-  // https://github.com/felixge/node-form-data/issues/38
-  if (util.isArray(value)) {
-    // Please convert your array into string
-    // the way web server expects it
-    this._error(new Error('Arrays are not supported.'));
-    return;
-  }
-
-  var header = this._multiPartHeader(field, value, options);
-  var footer = this._multiPartFooter();
-
-  append(header);
-  append(value);
-  append(footer);
-
-  // pass along options.knownLength
-  this._trackLength(header, value, options);
-};
-
-FormData.prototype._trackLength = function(header, value, options) {
-  var valueLength = 0;
-
-  // used w/ getLengthSync(), when length is known.
-  // e.g. for streaming directly from a remote server,
-  // w/ a known file a size, and not wanting to wait for
-  // incoming file to finish to get its size.
-  if (options.knownLength != null) {
-    valueLength += +options.knownLength;
-  } else if (Buffer.isBuffer(value)) {
-    valueLength = value.length;
-  } else if (typeof value === 'string') {
-    valueLength = Buffer.byteLength(value);
-  }
-
-  this._valueLength += valueLength;
-
-  // @check why add CRLF? does this account for custom/multiple CRLFs?
-  this._overheadLength +=
-    Buffer.byteLength(header) +
-    FormData.LINE_BREAK.length;
-
-  // empty or either doesn't have path or not an http response
-  if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) )) {
-    return;
-  }
-
-  // no need to bother with the length
-  if (!options.knownLength) {
-    this._lengthRetrievers.push(function(next) {
-
-      if (value.hasOwnProperty('fd')) {
-
-        // take read range into a account
-        // `end` = Infinity –> read file till the end
-        //
-        // TODO: Looks like there is bug in Node fs.createReadStream
-        // it doesn't respect `end` options without `start` options
-        // Fix it when node fixes it.
-        // https://github.com/joyent/node/issues/7819
-        if (value.end != undefined && value.end != Infinity && value.start != undefined) {
-
-          // when end specified
-          // no need to calculate range
-          // inclusive, starts with 0
-          next(null, value.end + 1 - (value.start ? value.start : 0));
-
-        // not that fast snoopy
-        } else {
-          // still need to fetch file size from fs
-          fs.stat(value.path, function(err, stat) {
-
-            var fileSize;
-
-            if (err) {
-              next(err);
-              return;
-            }
-
-            // update final size based on the range options
-            fileSize = stat.size - (value.start ? value.start : 0);
-            next(null, fileSize);
-          });
-        }
-
-      // or http response
-      } else if (value.hasOwnProperty('httpVersion')) {
-        next(null, +value.headers['content-length']);
-
-      // or request stream http://github.com/mikeal/request
-      } else if (value.hasOwnProperty('httpModule')) {
-        // wait till response come back
-        value.on('response', function(response) {
-          value.pause();
-          next(null, +response.headers['content-length']);
-        });
-        value.resume();
-
-      // something else
-      } else {
-        next('Unknown stream');
-      }
-    });
-  }
-};
-
-FormData.prototype._multiPartHeader = function(field, value, options) {
-  // custom header specified (as string)?
-  // it becomes responsible for boundary
-  // (e.g. to handle extra CRLFs on .NET servers)
-  if (options.header) {
-    return options.header;
-  }
-
-  var contentDisposition = this._getContentDisposition(value, options);
-  var contentType = this._getContentType(value, options);
-
-  var contents = '';
-  var headers  = {
-    // add custom disposition as third element or keep it two elements if not
-    'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []),
-    // if no content type. allow it to be empty array
-    'Content-Type': [].concat(contentType || [])
-  };
-
-  for (var prop in headers) {
-    if (headers[prop].length) {
-      contents += prop + ': ' + headers[prop].join('; ') + FormData.LINE_BREAK;
-    }
-  }
-
-  return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;
-};
-
-FormData.prototype._getContentDisposition = function(value, options) {
-
-  var contentDisposition;
-
-  // custom filename takes precedence
-  // fs- and request- streams have path property
-  var filename = options.filename || value.path;
-
-  // or try http response
-  if (!filename && value.readable && value.hasOwnProperty('httpVersion')) {
-    filename = value.client._httpMessage.path;
-  }
-
-  if (filename) {
-    contentDisposition = 'filename="' + path.basename(filename) + '"';
-  }
-
-  return contentDisposition;
-};
-
-FormData.prototype._getContentType = function(value, options) {
-
-  // use custom content-type above all
-  var contentType = options.contentType;
-
-  // or try `path` from fs-, request- streams
-  if (!contentType && value.path) {
-    contentType = mime.lookup(value.path);
-  }
-
-  // or if it's http-reponse
-  if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {
-    contentType = value.headers['content-type'];
-  }
-
-  // or guess it from the filename
-  if (!contentType && options.filename) {
-    contentType = mime.lookup(options.filename);
-  }
-
-  // fallback to the default content type if `value` is not simple value
-  if (!contentType && typeof value == 'object') {
-    contentType = FormData.DEFAULT_CONTENT_TYPE;
-  }
-
-  return contentType;
-};
-
-FormData.prototype._multiPartFooter = function() {
-  return function(next) {
-    var footer = FormData.LINE_BREAK;
-
-    var lastPart = (this._streams.length === 0);
-    if (lastPart) {
-      footer += this._lastBoundary();
-    }
-
-    next(footer);
-  }.bind(this);
-};
-
-FormData.prototype._lastBoundary = function() {
-  return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;
-};
-
-FormData.prototype.getHeaders = function(userHeaders) {
-  var header;
-  var formHeaders = {
-    'content-type': 'multipart/form-data; boundary=' + this.getBoundary()
-  };
-
-  for (header in userHeaders) {
-    if (userHeaders.hasOwnProperty(header)) {
-      formHeaders[header.toLowerCase()] = userHeaders[header];
-    }
-  }
-
-  return formHeaders;
-};
-
-FormData.prototype.getCustomHeaders = function(contentType) {
-  contentType = contentType ? contentType : 'multipart/form-data';
-
-  var formHeaders = {
-    'content-type': contentType + '; boundary=' + this.getBoundary(),
-    'content-length': this.getLengthSync()
-  };
-
-  return formHeaders;
-};
-
-FormData.prototype.getBoundary = function() {
-  if (!this._boundary) {
-    this._generateBoundary();
-  }
-
-  return this._boundary;
-};
-
-FormData.prototype._generateBoundary = function() {
-  // This generates a 50 character boundary similar to those used by Firefox.
-  // They are optimized for boyer-moore parsing.
-  var boundary = '--------------------------';
-  for (var i = 0; i < 24; i++) {
-    boundary += Math.floor(Math.random() * 10).toString(16);
-  }
-
-  this._boundary = boundary;
-};
-
-// Note: getLengthSync DOESN'T calculate streams length
-// As workaround one can calculate file size manually
-// and add it as knownLength option
-FormData.prototype.getLengthSync = function() {
-  var knownLength = this._overheadLength + this._valueLength;
-
-  // Don't get confused, there are 3 "internal" streams for each keyval pair
-  // so it basically checks if there is any value added to the form
-  if (this._streams.length) {
-    knownLength += this._lastBoundary().length;
-  }
-
-  // https://github.com/form-data/form-data/issues/40
-  if (this._lengthRetrievers.length) {
-    // Some async length retrievers are present
-    // therefore synchronous length calculation is false.
-    // Please use getLength(callback) to get proper length
-    this._error(new Error('Cannot calculate proper length in synchronous way.'));
-  }
-
-  return knownLength;
-};
-
-FormData.prototype.getLength = function(cb) {
-  var knownLength = this._overheadLength + this._valueLength;
-
-  if (this._streams.length) {
-    knownLength += this._lastBoundary().length;
-  }
-
-  if (!this._lengthRetrievers.length) {
-    process.nextTick(cb.bind(this, null, knownLength));
-    return;
-  }
-
-  async.parallel(this._lengthRetrievers, function(err, values) {
-    if (err) {
-      cb(err);
-      return;
-    }
-
-    values.forEach(function(length) {
-      knownLength += length;
-    });
-
-    cb(null, knownLength);
-  });
-};
-
-FormData.prototype.submit = function(params, cb) {
-  var request
-    , options
-    , defaults = {method: 'post'}
-    ;
-
-  // parse provided url if it's string
-  // or treat it as options object
-  if (typeof params == 'string') {
-
-    params = parseUrl(params);
-    options = populate({
-      port: params.port,
-      path: params.pathname,
-      host: params.hostname
-    }, defaults);
-
-  // use custom params
-  } else {
-
-    options = populate(params, defaults);
-    // if no port provided use default one
-    if (!options.port) {
-      options.port = options.protocol == 'https:' ? 443 : 80;
-    }
-  }
-
-  // put that good code in getHeaders to some use
-  options.headers = this.getHeaders(params.headers);
-
-  // https if specified, fallback to http in any other case
-  if (options.protocol == 'https:') {
-    request = https.request(options);
-  } else {
-    request = http.request(options);
-  }
-
-  // get content length and fire away
-  this.getLength(function(err, length) {
-    if (err) {
-      this._error(err);
-      return;
-    }
-
-    // add content length
-    request.setHeader('Content-Length', length);
-
-    this.pipe(request);
-    if (cb) {
-      request.on('error', cb);
-      request.on('response', cb.bind(this, null));
-    }
-  }.bind(this));
-
-  return request;
-};
-
-FormData.prototype._error = function(err) {
-  if (!this.error) {
-    this.error = err;
-    this.pause();
-    this.emit('error', err);
-  }
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/populate.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/populate.js
deleted file mode 100644
index 6f64a6d32cf1865d0488578424222a4ad70c8aad..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/lib/populate.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// populates missing values
-module.exports = function(dst, src) {
-  for (var prop in src) {
-    if (src.hasOwnProperty(prop) && !dst[prop]) {
-      dst[prop] = src[prop];
-    }
-  }
-  return dst;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/CHANGELOG.md
deleted file mode 100644
index f15e08121b2ecb8575d93934ca173c04289e6af6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/CHANGELOG.md
+++ /dev/null
@@ -1,125 +0,0 @@
-# v1.5.2
-- Allow using `"consructor"` as an argument in `memoize` (#998)
-- Give a better error messsage when `auto` dependency checking fails (#994)
-- Various doc updates (#936, #956, #979, #1002)
-
-# v1.5.1
-- Fix issue with `pause` in `queue` with concurrency enabled (#946)
-- `while` and `until` now pass the final result to callback (#963)
-- `auto` will properly handle concurrency when there is no callback (#966)
-- `auto` will now  properly stop execution when an error occurs (#988, #993)
-- Various doc fixes (#971, #980)
-
-# v1.5.0
-
-- Added `transform`, analogous to [`_.transform`](http://lodash.com/docs#transform) (#892)
-- `map` now returns an object when an object is passed in, rather than array with non-numeric keys. `map` will begin always returning an array with numeric indexes in the next major release. (#873)
-- `auto` now accepts an optional `concurrency` argument to limit the number of  running tasks (#637)
-- Added `queue#workersList()`, to retrieve the list  of currently running tasks. (#891)
-- Various code simplifications (#896, #904)
-- Various doc fixes :scroll: (#890, #894, #903, #905, #912)
-
-# v1.4.2
-
-- Ensure coverage files don't get published on npm (#879)
-
-# v1.4.1
-
-- Add in overlooked `detectLimit` method (#866)
-- Removed unnecessary files from npm releases (#861)
-- Removed usage of a reserved word to prevent :boom: in older environments (#870)
-
-# v1.4.0
-
-- `asyncify` now supports promises (#840)
-- Added `Limit` versions of `filter` and `reject` (#836)
-- Add `Limit` versions of `detect`, `some` and `every` (#828, #829)
-- `some`, `every` and `detect` now short circuit early (#828, #829)
-- Improve detection of the global object (#804), enabling use in WebWorkers
-- `whilst` now called with arguments from iterator (#823)
-- `during` now gets called with arguments from iterator (#824)
-- Code simplifications and optimizations aplenty ([diff](https://github.com/caolan/async/compare/v1.3.0...v1.4.0))
-
-
-# v1.3.0
-
-New Features:
-- Added `constant`
-- Added `asyncify`/`wrapSync` for making sync functions work with callbacks. (#671, #806)
-- Added `during` and `doDuring`, which are like `whilst` with an async truth test. (#800)
-- `retry` now accepts an `interval` parameter to specify a delay between retries. (#793)
-- `async` should work better in Web Workers due to better `root` detection (#804)
-- Callbacks are now optional in `whilst`, `doWhilst`, `until`, and `doUntil` (#642)
-- Various internal updates (#786, #801, #802, #803)
-- Various doc fixes (#790, #794)
-
-Bug Fixes:
-- `cargo` now exposes the `payload` size, and `cargo.payload` can be changed on the fly after the `cargo` is created. (#740, #744, #783)
-
-
-# v1.2.1
-
-Bug Fix:
-
-- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array.  Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores.  In 2.0.0, it will be called on the next tick.  (#782)
-
-
-# v1.2.0
-
-New Features:
-
-- Added `timesLimit` (#743)
-- `concurrency` can be changed after initialization in `queue` by setting `q.concurrency`.  The new concurrency will be reflected the next time a task is processed. (#747, #772)
-
-Bug Fixes:
-
-- Fixed a regression in `each` and family with empty arrays that have additional properties. (#775, #777)
-
-
-# v1.1.1
-
-Bug Fix:
-
-- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array.  Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores.  In 2.0.0, it will be called on the next tick.  (#782) 
-
-
-# v1.1.0
-
-New Features:
-
-- `cargo` now supports all of the same methods and event callbacks as `queue`.
-- Added `ensureAsync` - A wrapper that ensures an async function calls its callback on a later tick. (#769)
-- Optimized `map`, `eachOf`, and `waterfall` families of functions
-- Passing a `null` or `undefined` array to `map`, `each`, `parallel` and families will be treated as an empty array (#667).
-- The callback is now optional for the composed results of `compose` and `seq`. (#618)
-- Reduced file size by 4kb, (minified version by 1kb) 
-- Added code coverage through `nyc` and `coveralls` (#768)
-
-Bug Fixes:
-
-- `forever` will no longer stack overflow with a synchronous iterator (#622)
-- `eachLimit` and other limit functions will stop iterating once an error occurs (#754)
-- Always pass `null` in callbacks when there is no error (#439)
-- Ensure proper conditions when calling `drain()` after pushing an empty data set to a queue (#668)
-- `each` and family will properly handle an empty array (#578)
-- `eachSeries` and family will finish if the underlying array is modified during execution (#557)
-- `queue` will throw if a non-function is passed to `q.push()` (#593)
-- Doc fixes (#629, #766)
-
-
-# v1.0.0
-
-No known breaking changes, we are simply complying with semver from here on out.
-
-Changes:
-
-- Start using a changelog!
-- Add `forEachOf` for iterating over Objects (or to iterate Arrays with indexes available) (#168 #704 #321)
-- Detect deadlocks in `auto` (#663)
-- Better support for require.js (#527)
-- Throw if queue created with concurrency `0` (#714)
-- Fix unneeded iteration in `queue.resume()` (#758)
-- Guard against timer mocking overriding `setImmediate` (#609 #611)
-- Miscellaneous doc fixes (#542 #596 #615 #628 #631 #690 #729)
-- Use single noop function internally (#546)
-- Optimize internal `_each`, `_map` and `_keys` functions.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/LICENSE
deleted file mode 100644
index 8f29698588533b535c9989361c44abacf23512ae..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2010-2014 Caolan McMahon
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/README.md
deleted file mode 100644
index 316c40505c7ff3cbfb5f7acb387c56bffac508c7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/README.md
+++ /dev/null
@@ -1,1877 +0,0 @@
-# Async.js
-
-[![Build Status via Travis CI](https://travis-ci.org/caolan/async.svg?branch=master)](https://travis-ci.org/caolan/async)
-[![NPM version](http://img.shields.io/npm/v/async.svg)](https://www.npmjs.org/package/async)
-[![Coverage Status](https://coveralls.io/repos/caolan/async/badge.svg?branch=master)](https://coveralls.io/r/caolan/async?branch=master)
-[![Join the chat at https://gitter.im/caolan/async](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/caolan/async?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
-
-
-Async is a utility module which provides straight-forward, powerful functions
-for working with asynchronous JavaScript. Although originally designed for
-use with [Node.js](http://nodejs.org) and installable via `npm install async`,
-it can also be used directly in the browser.
-
-Async is also installable via:
-
-- [bower](http://bower.io/): `bower install async`
-- [component](https://github.com/component/component): `component install
-  caolan/async`
-- [jam](http://jamjs.org/): `jam install async`
-- [spm](http://spmjs.io/): `spm install async`
-
-Async provides around 20 functions that include the usual 'functional'
-suspects (`map`, `reduce`, `filter`, `each`…) as well as some common patterns
-for asynchronous control flow (`parallel`, `series`, `waterfall`…). All these
-functions assume you follow the Node.js convention of providing a single
-callback as the last argument of your `async` function.
-
-
-## Quick Examples
-
-```javascript
-async.map(['file1','file2','file3'], fs.stat, function(err, results){
-    // results is now an array of stats for each file
-});
-
-async.filter(['file1','file2','file3'], fs.exists, function(results){
-    // results now equals an array of the existing files
-});
-
-async.parallel([
-    function(){ ... },
-    function(){ ... }
-], callback);
-
-async.series([
-    function(){ ... },
-    function(){ ... }
-]);
-```
-
-There are many more functions available so take a look at the docs below for a
-full list. This module aims to be comprehensive, so if you feel anything is
-missing please create a GitHub issue for it.
-
-## Common Pitfalls <sub>[(StackOverflow)](http://stackoverflow.com/questions/tagged/async.js)</sub>
-### Synchronous iteration functions
-
-If you get an error like `RangeError: Maximum call stack size exceeded.` or other stack overflow issues when using async, you are likely using a synchronous iterator.  By *synchronous* we mean a function that calls its callback on the same tick in the javascript event loop, without doing any I/O or using any timers.  Calling many callbacks iteratively will quickly overflow the stack. If you run into this issue, just defer your callback with `async.setImmediate` to start a new call stack on the next tick of the event loop.
-
-This can also arise by accident if you callback early in certain cases:
-
-```js
-async.eachSeries(hugeArray, function iterator(item, callback) {
-  if (inCache(item)) {
-    callback(null, cache[item]); // if many items are cached, you'll overflow
-  } else {
-    doSomeIO(item, callback);
-  }
-}, function done() {
-  //...
-});
-```
-
-Just change it to:
-
-```js
-async.eachSeries(hugeArray, function iterator(item, callback) {
-  if (inCache(item)) {
-    async.setImmediate(function () {
-      callback(null, cache[item]);
-    });
-  } else {
-    doSomeIO(item, callback);
-  //...
-```
-
-Async guards against synchronous functions in some, but not all, cases.  If you are still running into stack overflows, you can defer as suggested above, or wrap functions with [`async.ensureAsync`](#ensureAsync)  Functions that are asynchronous by their nature do not have this problem and don't need the extra callback deferral.
-
-If JavaScript's event loop is still a bit nebulous, check out [this article](http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/) or [this talk](http://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html) for more detailed information about how it works.
-
-
-### Multiple callbacks
-
-Make sure to always `return` when calling a callback early, otherwise you will cause multiple callbacks and unpredictable behavior in many cases.
-
-```js
-async.waterfall([
-    function (callback) {
-        getSomething(options, function (err, result) {
-          if (err) {
-            callback(new Error("failed getting something:" + err.message));
-            // we should return here
-          }
-          // since we did not return, this callback still will be called and
-          // `processData` will be called twice
-          callback(null, result);
-        });
-    },
-    processData
-], done)
-```
-
-It is always good practice to `return callback(err, result)`  whenever a callback call is not the last statement of a function.
-
-
-### Binding a context to an iterator
-
-This section is really about `bind`, not about `async`. If you are wondering how to
-make `async` execute your iterators in a given context, or are confused as to why
-a method of another library isn't working as an iterator, study this example:
-
-```js
-// Here is a simple object with an (unnecessarily roundabout) squaring method
-var AsyncSquaringLibrary = {
-  squareExponent: 2,
-  square: function(number, callback){
-    var result = Math.pow(number, this.squareExponent);
-    setTimeout(function(){
-      callback(null, result);
-    }, 200);
-  }
-};
-
-async.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){
-  // result is [NaN, NaN, NaN]
-  // This fails because the `this.squareExponent` expression in the square
-  // function is not evaluated in the context of AsyncSquaringLibrary, and is
-  // therefore undefined.
-});
-
-async.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){
-  // result is [1, 4, 9]
-  // With the help of bind we can attach a context to the iterator before
-  // passing it to async. Now the square function will be executed in its
-  // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`
-  // will be as expected.
-});
-```
-
-## Download
-
-The source is available for download from
-[GitHub](https://github.com/caolan/async/blob/master/lib/async.js).
-Alternatively, you can install using Node Package Manager (`npm`):
-
-    npm install async
-
-As well as using Bower:
-
-    bower install async
-
-__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed
-
-## In the Browser
-
-So far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5.
-
-Usage:
-
-```html
-<script type="text/javascript" src="async.js"></script>
-<script type="text/javascript">
-
-    async.map(data, asyncProcess, function(err, results){
-        alert(results);
-    });
-
-</script>
-```
-
-## Documentation
-
-Some functions are also available in the following forms:
-* `<name>Series` - the same as `<name>` but runs only a single async operation at a time
-* `<name>Limit` - the same as `<name>` but runs a maximum of `limit` async operations at a time
-
-### Collections
-
-* [`each`](#each), `eachSeries`, `eachLimit`
-* [`forEachOf`](#forEachOf), `forEachOfSeries`, `forEachOfLimit`
-* [`map`](#map), `mapSeries`, `mapLimit`
-* [`filter`](#filter), `filterSeries`, `filterLimit`
-* [`reject`](#reject), `rejectSeries`, `rejectLimit`
-* [`reduce`](#reduce), [`reduceRight`](#reduceRight)
-* [`detect`](#detect), `detectSeries`, `detectLimit`
-* [`sortBy`](#sortBy)
-* [`some`](#some), `someLimit`
-* [`every`](#every), `everyLimit`
-* [`concat`](#concat), `concatSeries`
-
-### Control Flow
-
-* [`series`](#seriestasks-callback)
-* [`parallel`](#parallel), `parallelLimit`
-* [`whilst`](#whilst), [`doWhilst`](#doWhilst)
-* [`until`](#until), [`doUntil`](#doUntil)
-* [`during`](#during), [`doDuring`](#doDuring)
-* [`forever`](#forever)
-* [`waterfall`](#waterfall)
-* [`compose`](#compose)
-* [`seq`](#seq)
-* [`applyEach`](#applyEach), `applyEachSeries`
-* [`queue`](#queue), [`priorityQueue`](#priorityQueue)
-* [`cargo`](#cargo)
-* [`auto`](#auto)
-* [`retry`](#retry)
-* [`iterator`](#iterator)
-* [`times`](#times), `timesSeries`, `timesLimit`
-
-### Utils
-
-* [`apply`](#apply)
-* [`nextTick`](#nextTick)
-* [`memoize`](#memoize)
-* [`unmemoize`](#unmemoize)
-* [`ensureAsync`](#ensureAsync)
-* [`constant`](#constant)
-* [`asyncify`](#asyncify)
-* [`wrapSync`](#wrapSync)
-* [`log`](#log)
-* [`dir`](#dir)
-* [`noConflict`](#noConflict)
-
-## Collections
-
-<a name="forEach" />
-<a name="each" />
-### each(arr, iterator, [callback])
-
-Applies the function `iterator` to each item in `arr`, in parallel.
-The `iterator` is called with an item from the list, and a callback for when it
-has finished. If the `iterator` passes an error to its `callback`, the main
-`callback` (for the `each` function) is immediately called with the error.
-
-Note, that since this function applies `iterator` to each item in parallel,
-there is no guarantee that the iterator functions will complete in order.
-
-__Arguments__
-
-* `arr` - An array to iterate over.
-* `iterator(item, callback)` - A function to apply to each item in `arr`.
-  The iterator is passed a `callback(err)` which must be called once it has
-  completed. If no error has occurred, the `callback` should be run without
-  arguments or with an explicit `null` argument.  The array index is not passed
-  to the iterator.  If you need the index, use [`forEachOf`](#forEachOf).
-* `callback(err)` - *Optional* A callback which is called when all `iterator` functions
-  have finished, or an error occurs.
-
-__Examples__
-
-
-```js
-// assuming openFiles is an array of file names and saveFile is a function
-// to save the modified contents of that file:
-
-async.each(openFiles, saveFile, function(err){
-    // if any of the saves produced an error, err would equal that error
-});
-```
-
-```js
-// assuming openFiles is an array of file names
-
-async.each(openFiles, function(file, callback) {
-
-  // Perform operation on file here.
-  console.log('Processing file ' + file);
-
-  if( file.length > 32 ) {
-    console.log('This file name is too long');
-    callback('File name too long');
-  } else {
-    // Do work to process file here
-    console.log('File processed');
-    callback();
-  }
-}, function(err){
-    // if any of the file processing produced an error, err would equal that error
-    if( err ) {
-      // One of the iterations produced an error.
-      // All processing will now stop.
-      console.log('A file failed to process');
-    } else {
-      console.log('All files have been processed successfully');
-    }
-});
-```
-
-__Related__
-
-* eachSeries(arr, iterator, [callback])
-* eachLimit(arr, limit, iterator, [callback])
-
----------------------------------------
-
-<a name="forEachOf" />
-<a name="eachOf" />
-
-### forEachOf(obj, iterator, [callback])
-
-Like `each`, except that it iterates over objects, and passes the key as the second argument to the iterator.
-
-__Arguments__
-
-* `obj` - An object or array to iterate over.
-* `iterator(item, key, callback)` - A function to apply to each item in `obj`.
-The `key` is the item's key, or index in the case of an array. The iterator is
-passed a `callback(err)` which must be called once it has completed. If no
-error has occurred, the callback should be run without arguments or with an
-explicit `null` argument.
-* `callback(err)` - *Optional* A callback which is called when all `iterator` functions have finished, or an error occurs.
-
-__Example__
-
-```js
-var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};
-var configs = {};
-
-async.forEachOf(obj, function (value, key, callback) {
-  fs.readFile(__dirname + value, "utf8", function (err, data) {
-    if (err) return callback(err);
-    try {
-      configs[key] = JSON.parse(data);
-    } catch (e) {
-      return callback(e);
-    }
-    callback();
-  })
-}, function (err) {
-  if (err) console.error(err.message);
-  // configs is now a map of JSON data
-  doSomethingWith(configs);
-})
-```
-
-__Related__
-
-* forEachOfSeries(obj, iterator, [callback])
-* forEachOfLimit(obj, limit, iterator, [callback])
-
----------------------------------------
-
-<a name="map" />
-### map(arr, iterator, [callback])
-
-Produces a new array of values by mapping each value in `arr` through
-the `iterator` function. The `iterator` is called with an item from `arr` and a
-callback for when it has finished processing. Each of these callback takes 2 arguments:
-an `error`, and the transformed item from `arr`. If `iterator` passes an error to its
-callback, the main `callback` (for the `map` function) is immediately called with the error.
-
-Note, that since this function applies the `iterator` to each item in parallel,
-there is no guarantee that the `iterator` functions will complete in order.
-However, the results array will be in the same order as the original `arr`.
-
-__Arguments__
-
-* `arr` - An array to iterate over.
-* `iterator(item, callback)` - A function to apply to each item in `arr`.
-  The iterator is passed a `callback(err, transformed)` which must be called once
-  it has completed with an error (which can be `null`) and a transformed item.
-* `callback(err, results)` - *Optional* A callback which is called when all `iterator`
-  functions have finished, or an error occurs. Results is an array of the
-  transformed items from the `arr`.
-
-__Example__
-
-```js
-async.map(['file1','file2','file3'], fs.stat, function(err, results){
-    // results is now an array of stats for each file
-});
-```
-
-__Related__
-* mapSeries(arr, iterator, [callback])
-* mapLimit(arr, limit, iterator, [callback])
-
----------------------------------------
-
-<a name="select" />
-<a name="filter" />
-### filter(arr, iterator, [callback])
-
-__Alias:__ `select`
-
-Returns a new array of all the values in `arr` which pass an async truth test.
-_The callback for each `iterator` call only accepts a single argument of `true` or
-`false`; it does not accept an error argument first!_ This is in-line with the
-way node libraries work with truth tests like `fs.exists`. This operation is
-performed in parallel, but the results array will be in the same order as the
-original.
-
-__Arguments__
-
-* `arr` - An array to iterate over.
-* `iterator(item, callback)` - A truth test to apply to each item in `arr`.
-  The `iterator` is passed a `callback(truthValue)`, which must be called with a
-  boolean argument once it has completed.
-* `callback(results)` - *Optional* A callback which is called after all the `iterator`
-  functions have finished.
-
-__Example__
-
-```js
-async.filter(['file1','file2','file3'], fs.exists, function(results){
-    // results now equals an array of the existing files
-});
-```
-
-__Related__
-
-* filterSeries(arr, iterator, [callback])
-* filterLimit(arr, limit, iterator, [callback])
-
----------------------------------------
-
-<a name="reject" />
-### reject(arr, iterator, [callback])
-
-The opposite of [`filter`](#filter). Removes values that pass an `async` truth test.
-
-__Related__
-
-* rejectSeries(arr, iterator, [callback])
-* rejectLimit(arr, limit, iterator, [callback])
-
----------------------------------------
-
-<a name="reduce" />
-### reduce(arr, memo, iterator, [callback])
-
-__Aliases:__ `inject`, `foldl`
-
-Reduces `arr` into a single value using an async `iterator` to return
-each successive step. `memo` is the initial state of the reduction.
-This function only operates in series.
-
-For performance reasons, it may make sense to split a call to this function into
-a parallel map, and then use the normal `Array.prototype.reduce` on the results.
-This function is for situations where each step in the reduction needs to be async;
-if you can get the data before reducing it, then it's probably a good idea to do so.
-
-__Arguments__
-
-* `arr` - An array to iterate over.
-* `memo` - The initial state of the reduction.
-* `iterator(memo, item, callback)` - A function applied to each item in the
-  array to produce the next step in the reduction. The `iterator` is passed a
-  `callback(err, reduction)` which accepts an optional error as its first
-  argument, and the state of the reduction as the second. If an error is
-  passed to the callback, the reduction is stopped and the main `callback` is
-  immediately called with the error.
-* `callback(err, result)` - *Optional* A callback which is called after all the `iterator`
-  functions have finished. Result is the reduced value.
-
-__Example__
-
-```js
-async.reduce([1,2,3], 0, function(memo, item, callback){
-    // pointless async:
-    process.nextTick(function(){
-        callback(null, memo + item)
-    });
-}, function(err, result){
-    // result is now equal to the last value of memo, which is 6
-});
-```
-
----------------------------------------
-
-<a name="reduceRight" />
-### reduceRight(arr, memo, iterator, [callback])
-
-__Alias:__ `foldr`
-
-Same as [`reduce`](#reduce), only operates on `arr` in reverse order.
-
-
----------------------------------------
-
-<a name="detect" />
-### detect(arr, iterator, [callback])
-
-Returns the first value in `arr` that passes an async truth test. The
-`iterator` is applied in parallel, meaning the first iterator to return `true` will
-fire the detect `callback` with that result. That means the result might not be
-the first item in the original `arr` (in terms of order) that passes the test.
-
-If order within the original `arr` is important, then look at [`detectSeries`](#detectSeries).
-
-__Arguments__
-
-* `arr` - An array to iterate over.
-* `iterator(item, callback)` - A truth test to apply to each item in `arr`.
-  The iterator is passed a `callback(truthValue)` which must be called with a
-  boolean argument once it has completed. **Note: this callback does not take an error as its first argument.**
-* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns
-  `true`, or after all the `iterator` functions have finished. Result will be
-  the first item in the array that passes the truth test (iterator) or the
-  value `undefined` if none passed.  **Note: this callback does not take an error as its first argument.**
-
-__Example__
-
-```js
-async.detect(['file1','file2','file3'], fs.exists, function(result){
-    // result now equals the first file in the list that exists
-});
-```
-
-__Related__
-
-* detectSeries(arr, iterator, [callback])
-* detectLimit(arr, limit, iterator, [callback])
-
----------------------------------------
-
-<a name="sortBy" />
-### sortBy(arr, iterator, [callback])
-
-Sorts a list by the results of running each `arr` value through an async `iterator`.
-
-__Arguments__
-
-* `arr` - An array to iterate over.
-* `iterator(item, callback)` - A function to apply to each item in `arr`.
-  The iterator is passed a `callback(err, sortValue)` which must be called once it
-  has completed with an error (which can be `null`) and a value to use as the sort
-  criteria.
-* `callback(err, results)` - *Optional* A callback which is called after all the `iterator`
-  functions have finished, or an error occurs. Results is the items from
-  the original `arr` sorted by the values returned by the `iterator` calls.
-
-__Example__
-
-```js
-async.sortBy(['file1','file2','file3'], function(file, callback){
-    fs.stat(file, function(err, stats){
-        callback(err, stats.mtime);
-    });
-}, function(err, results){
-    // results is now the original array of files sorted by
-    // modified date
-});
-```
-
-__Sort Order__
-
-By modifying the callback parameter the sorting order can be influenced:
-
-```js
-//ascending order
-async.sortBy([1,9,3,5], function(x, callback){
-    callback(null, x);
-}, function(err,result){
-    //result callback
-} );
-
-//descending order
-async.sortBy([1,9,3,5], function(x, callback){
-    callback(null, x*-1);    //<- x*-1 instead of x, turns the order around
-}, function(err,result){
-    //result callback
-} );
-```
-
----------------------------------------
-
-<a name="some" />
-### some(arr, iterator, [callback])
-
-__Alias:__ `any`
-
-Returns `true` if at least one element in the `arr` satisfies an async test.
-_The callback for each iterator call only accepts a single argument of `true` or
-`false`; it does not accept an error argument first!_ This is in-line with the
-way node libraries work with truth tests like `fs.exists`. Once any iterator
-call returns `true`, the main `callback` is immediately called.
-
-__Arguments__
-
-* `arr` - An array to iterate over.
-* `iterator(item, callback)` - A truth test to apply to each item in the array
-  in parallel. The iterator is passed a `callback(truthValue)`` which must be
-  called with a boolean argument once it has completed.
-* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns
-  `true`, or after all the iterator functions have finished. Result will be
-  either `true` or `false` depending on the values of the async tests.
-
- **Note: the callbacks do not take an error as their first argument.**
-__Example__
-
-```js
-async.some(['file1','file2','file3'], fs.exists, function(result){
-    // if result is true then at least one of the files exists
-});
-```
-
-__Related__
-
-* someLimit(arr, limit, iterator, callback)
-
----------------------------------------
-
-<a name="every" />
-### every(arr, iterator, [callback])
-
-__Alias:__ `all`
-
-Returns `true` if every element in `arr` satisfies an async test.
-_The callback for each `iterator` call only accepts a single argument of `true` or
-`false`; it does not accept an error argument first!_ This is in-line with the
-way node libraries work with truth tests like `fs.exists`.
-
-__Arguments__
-
-* `arr` - An array to iterate over.
-* `iterator(item, callback)` - A truth test to apply to each item in the array
-  in parallel. The iterator is passed a `callback(truthValue)` which must be
-  called with a  boolean argument once it has completed.
-* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns
-  `false`, or after all the iterator functions have finished. Result will be
-  either `true` or `false` depending on the values of the async tests.
-
- **Note: the callbacks do not take an error as their first argument.**
-
-__Example__
-
-```js
-async.every(['file1','file2','file3'], fs.exists, function(result){
-    // if result is true then every file exists
-});
-```
-
-__Related__
-
-* everyLimit(arr, limit, iterator, callback)
-
----------------------------------------
-
-<a name="concat" />
-### concat(arr, iterator, [callback])
-
-Applies `iterator` to each item in `arr`, concatenating the results. Returns the
-concatenated list. The `iterator`s are called in parallel, and the results are
-concatenated as they return. There is no guarantee that the results array will
-be returned in the original order of `arr` passed to the `iterator` function.
-
-__Arguments__
-
-* `arr` - An array to iterate over.
-* `iterator(item, callback)` - A function to apply to each item in `arr`.
-  The iterator is passed a `callback(err, results)` which must be called once it
-  has completed with an error (which can be `null`) and an array of results.
-* `callback(err, results)` - *Optional* A callback which is called after all the `iterator`
-  functions have finished, or an error occurs. Results is an array containing
-  the concatenated results of the `iterator` function.
-
-__Example__
-
-```js
-async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){
-    // files is now a list of filenames that exist in the 3 directories
-});
-```
-
-__Related__
-
-* concatSeries(arr, iterator, [callback])
-
-
-## Control Flow
-
-<a name="series" />
-### series(tasks, [callback])
-
-Run the functions in the `tasks` array in series, each one running once the previous
-function has completed. If any functions in the series pass an error to its
-callback, no more functions are run, and `callback` is immediately called with the value of the error.
-Otherwise, `callback` receives an array of results when `tasks` have completed.
-
-It is also possible to use an object instead of an array. Each property will be
-run as a function, and the results will be passed to the final `callback` as an object
-instead of an array. This can be a more readable way of handling results from
-[`series`](#series).
-
-**Note** that while many implementations preserve the order of object properties, the
-[ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6)
-explicitly states that
-
-> The mechanics and order of enumerating the properties is not specified.
-
-So if you rely on the order in which your series of functions are executed, and want
-this to work on all platforms, consider using an array.
-
-__Arguments__
-
-* `tasks` - An array or object containing functions to run, each function is passed
-  a `callback(err, result)` it must call on completion with an error `err` (which can
-  be `null`) and an optional `result` value.
-* `callback(err, results)` - An optional callback to run once all the functions
-  have completed. This function gets a results array (or object) containing all
-  the result arguments passed to the `task` callbacks.
-
-__Example__
-
-```js
-async.series([
-    function(callback){
-        // do some stuff ...
-        callback(null, 'one');
-    },
-    function(callback){
-        // do some more stuff ...
-        callback(null, 'two');
-    }
-],
-// optional callback
-function(err, results){
-    // results is now equal to ['one', 'two']
-});
-
-
-// an example using an object instead of an array
-async.series({
-    one: function(callback){
-        setTimeout(function(){
-            callback(null, 1);
-        }, 200);
-    },
-    two: function(callback){
-        setTimeout(function(){
-            callback(null, 2);
-        }, 100);
-    }
-},
-function(err, results) {
-    // results is now equal to: {one: 1, two: 2}
-});
-```
-
----------------------------------------
-
-<a name="parallel" />
-### parallel(tasks, [callback])
-
-Run the `tasks` array of functions in parallel, without waiting until the previous
-function has completed. If any of the functions pass an error to its
-callback, the main `callback` is immediately called with the value of the error.
-Once the `tasks` have completed, the results are passed to the final `callback` as an
-array.
-
-**Note:** `parallel` is about kicking-off I/O tasks in parallel, not about parallel execution of code.  If your tasks do not use any timers or perform any I/O, they will actually be executed in series.  Any synchronous setup sections for each task will happen one after the other.  JavaScript remains single-threaded.
-
-It is also possible to use an object instead of an array. Each property will be
-run as a function and the results will be passed to the final `callback` as an object
-instead of an array. This can be a more readable way of handling results from
-[`parallel`](#parallel).
-
-
-__Arguments__
-
-* `tasks` - An array or object containing functions to run. Each function is passed
-  a `callback(err, result)` which it must call on completion with an error `err`
-  (which can be `null`) and an optional `result` value.
-* `callback(err, results)` - An optional callback to run once all the functions
-  have completed successfully. This function gets a results array (or object) containing all
-  the result arguments passed to the task callbacks.
-
-__Example__
-
-```js
-async.parallel([
-    function(callback){
-        setTimeout(function(){
-            callback(null, 'one');
-        }, 200);
-    },
-    function(callback){
-        setTimeout(function(){
-            callback(null, 'two');
-        }, 100);
-    }
-],
-// optional callback
-function(err, results){
-    // the results array will equal ['one','two'] even though
-    // the second function had a shorter timeout.
-});
-
-
-// an example using an object instead of an array
-async.parallel({
-    one: function(callback){
-        setTimeout(function(){
-            callback(null, 1);
-        }, 200);
-    },
-    two: function(callback){
-        setTimeout(function(){
-            callback(null, 2);
-        }, 100);
-    }
-},
-function(err, results) {
-    // results is now equals to: {one: 1, two: 2}
-});
-```
-
-__Related__
-
-* parallelLimit(tasks, limit, [callback])
-
----------------------------------------
-
-<a name="whilst" />
-### whilst(test, fn, callback)
-
-Repeatedly call `fn`, while `test` returns `true`. Calls `callback` when stopped,
-or an error occurs.
-
-__Arguments__
-
-* `test()` - synchronous truth test to perform before each execution of `fn`.
-* `fn(callback)` - A function which is called each time `test` passes. The function is
-  passed a `callback(err)`, which must be called once it has completed with an
-  optional `err` argument.
-* `callback(err, [results])` - A callback which is called after the test
-  function has failed and repeated execution of `fn` has stopped. `callback`
-  will be passed an error and any arguments passed to the final `fn`'s callback.
-
-__Example__
-
-```js
-var count = 0;
-
-async.whilst(
-    function () { return count < 5; },
-    function (callback) {
-        count++;
-        setTimeout(function () {
-            callback(null, count);
-        }, 1000);
-    },
-    function (err, n) {
-        // 5 seconds have passed, n = 5
-    }
-);
-```
-
----------------------------------------
-
-<a name="doWhilst" />
-### doWhilst(fn, test, callback)
-
-The post-check version of [`whilst`](#whilst). To reflect the difference in
-the order of operations, the arguments `test` and `fn` are switched.
-
-`doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.
-
----------------------------------------
-
-<a name="until" />
-### until(test, fn, callback)
-
-Repeatedly call `fn` until `test` returns `true`. Calls `callback` when stopped,
-or an error occurs. `callback` will be passed an error and any arguments passed
-to the final `fn`'s callback.
-
-The inverse of [`whilst`](#whilst).
-
----------------------------------------
-
-<a name="doUntil" />
-### doUntil(fn, test, callback)
-
-Like [`doWhilst`](#doWhilst), except the `test` is inverted. Note the argument ordering differs from `until`.
-
----------------------------------------
-
-<a name="during" />
-### during(test, fn, callback)
-
-Like [`whilst`](#whilst), except the `test` is an asynchronous function that is passed a callback in the form of `function (err, truth)`. If error is passed to `test` or `fn`, the main callback is immediately called with the value of the error.
-
-__Example__
-
-```js
-var count = 0;
-
-async.during(
-    function (callback) {
-      return callback(null, count < 5);
-    },
-    function (callback) {
-        count++;
-        setTimeout(callback, 1000);
-    },
-    function (err) {
-        // 5 seconds have passed
-    }
-);
-```
-
----------------------------------------
-
-<a name="doDuring" />
-### doDuring(fn, test, callback)
-
-The post-check version of [`during`](#during). To reflect the difference in
-the order of operations, the arguments `test` and `fn` are switched.
-
-Also a version of [`doWhilst`](#doWhilst) with asynchronous `test` function.
-
----------------------------------------
-
-<a name="forever" />
-### forever(fn, [errback])
-
-Calls the asynchronous function `fn` with a callback parameter that allows it to
-call itself again, in series, indefinitely.
-
-If an error is passed to the callback then `errback` is called with the
-error, and execution stops, otherwise it will never be called.
-
-```js
-async.forever(
-    function(next) {
-        // next is suitable for passing to things that need a callback(err [, whatever]);
-        // it will result in this function being called again.
-    },
-    function(err) {
-        // if next is called with a value in its first parameter, it will appear
-        // in here as 'err', and execution will stop.
-    }
-);
-```
-
----------------------------------------
-
-<a name="waterfall" />
-### waterfall(tasks, [callback])
-
-Runs the `tasks` array of functions in series, each passing their results to the next in
-the array. However, if any of the `tasks` pass an error to their own callback, the
-next function is not executed, and the main `callback` is immediately called with
-the error.
-
-__Arguments__
-
-* `tasks` - An array of functions to run, each function is passed a
-  `callback(err, result1, result2, ...)` it must call on completion. The first
-  argument is an error (which can be `null`) and any further arguments will be
-  passed as arguments in order to the next task.
-* `callback(err, [results])` - An optional callback to run once all the functions
-  have completed. This will be passed the results of the last task's callback.
-
-
-
-__Example__
-
-```js
-async.waterfall([
-    function(callback) {
-        callback(null, 'one', 'two');
-    },
-    function(arg1, arg2, callback) {
-      // arg1 now equals 'one' and arg2 now equals 'two'
-        callback(null, 'three');
-    },
-    function(arg1, callback) {
-        // arg1 now equals 'three'
-        callback(null, 'done');
-    }
-], function (err, result) {
-    // result now equals 'done'
-});
-```
-Or, with named functions:
-
-```js
-async.waterfall([
-    myFirstFunction,
-    mySecondFunction,
-    myLastFunction,
-], function (err, result) {
-    // result now equals 'done'
-});
-function myFirstFunction(callback) {
-  callback(null, 'one', 'two');
-}
-function mySecondFunction(arg1, arg2, callback) {
-  // arg1 now equals 'one' and arg2 now equals 'two'
-  callback(null, 'three');
-}
-function myLastFunction(arg1, callback) {
-  // arg1 now equals 'three'
-  callback(null, 'done');
-}
-```
-
-Or, if you need to pass any argument to the first function:
-
-```js
-async.waterfall([
-    async.apply(myFirstFunction, 'zero'),
-    mySecondFunction,
-    myLastFunction,
-], function (err, result) {
-    // result now equals 'done'
-});
-function myFirstFunction(arg1, callback) {
-  // arg1 now equals 'zero'
-  callback(null, 'one', 'two');
-}
-function mySecondFunction(arg1, arg2, callback) {
-  // arg1 now equals 'one' and arg2 now equals 'two'
-  callback(null, 'three');
-}
-function myLastFunction(arg1, callback) {
-  // arg1 now equals 'three'
-  callback(null, 'done');
-}
-```
-
----------------------------------------
-<a name="compose" />
-### compose(fn1, fn2...)
-
-Creates a function which is a composition of the passed asynchronous
-functions. Each function consumes the return value of the function that
-follows. Composing functions `f()`, `g()`, and `h()` would produce the result of
-`f(g(h()))`, only this version uses callbacks to obtain the return values.
-
-Each function is executed with the `this` binding of the composed function.
-
-__Arguments__
-
-* `functions...` - the asynchronous functions to compose
-
-
-__Example__
-
-```js
-function add1(n, callback) {
-    setTimeout(function () {
-        callback(null, n + 1);
-    }, 10);
-}
-
-function mul3(n, callback) {
-    setTimeout(function () {
-        callback(null, n * 3);
-    }, 10);
-}
-
-var add1mul3 = async.compose(mul3, add1);
-
-add1mul3(4, function (err, result) {
-   // result now equals 15
-});
-```
-
----------------------------------------
-<a name="seq" />
-### seq(fn1, fn2...)
-
-Version of the compose function that is more natural to read.
-Each function consumes the return value of the previous function.
-It is the equivalent of [`compose`](#compose) with the arguments reversed.
-
-Each function is executed with the `this` binding of the composed function.
-
-__Arguments__
-
-* `functions...` - the asynchronous functions to compose
-
-
-__Example__
-
-```js
-// Requires lodash (or underscore), express3 and dresende's orm2.
-// Part of an app, that fetches cats of the logged user.
-// This example uses `seq` function to avoid overnesting and error
-// handling clutter.
-app.get('/cats', function(request, response) {
-  var User = request.models.User;
-  async.seq(
-    _.bind(User.get, User),  // 'User.get' has signature (id, callback(err, data))
-    function(user, fn) {
-      user.getCats(fn);      // 'getCats' has signature (callback(err, data))
-    }
-  )(req.session.user_id, function (err, cats) {
-    if (err) {
-      console.error(err);
-      response.json({ status: 'error', message: err.message });
-    } else {
-      response.json({ status: 'ok', message: 'Cats found', data: cats });
-    }
-  });
-});
-```
-
----------------------------------------
-<a name="applyEach" />
-### applyEach(fns, args..., callback)
-
-Applies the provided arguments to each function in the array, calling
-`callback` after all functions have completed. If you only provide the first
-argument, then it will return a function which lets you pass in the
-arguments as if it were a single function call.
-
-__Arguments__
-
-* `fns` - the asynchronous functions to all call with the same arguments
-* `args...` - any number of separate arguments to pass to the function
-* `callback` - the final argument should be the callback, called when all
-  functions have completed processing
-
-
-__Example__
-
-```js
-async.applyEach([enableSearch, updateSchema], 'bucket', callback);
-
-// partial application example:
-async.each(
-    buckets,
-    async.applyEach([enableSearch, updateSchema]),
-    callback
-);
-```
-
-__Related__
-
-* applyEachSeries(tasks, args..., [callback])
-
----------------------------------------
-
-<a name="queue" />
-### queue(worker, [concurrency])
-
-Creates a `queue` object with the specified `concurrency`. Tasks added to the
-`queue` are processed in parallel (up to the `concurrency` limit). If all
-`worker`s are in progress, the task is queued until one becomes available.
-Once a `worker` completes a `task`, that `task`'s callback is called.
-
-__Arguments__
-
-* `worker(task, callback)` - An asynchronous function for processing a queued
-  task, which must call its `callback(err)` argument when finished, with an
-  optional `error` as an argument.  If you want to handle errors from an individual task, pass a callback to `q.push()`.
-* `concurrency` - An `integer` for determining how many `worker` functions should be
-  run in parallel.  If omitted, the concurrency defaults to `1`.  If the concurrency is `0`, an error is thrown.
-
-__Queue objects__
-
-The `queue` object returned by this function has the following properties and
-methods:
-
-* `length()` - a function returning the number of items waiting to be processed.
-* `started` - a function returning whether or not any items have been pushed and processed by the queue
-* `running()` - a function returning the number of items currently being processed.
-* `workersList()` - a function returning the array of items currently being processed.
-* `idle()` - a function returning false if there are items waiting or being processed, or true if not.
-* `concurrency` - an integer for determining how many `worker` functions should be
-  run in parallel. This property can be changed after a `queue` is created to
-  alter the concurrency on-the-fly.
-* `push(task, [callback])` - add a new task to the `queue`. Calls `callback` once
-  the `worker` has finished processing the task. Instead of a single task, a `tasks` array
-  can be submitted. The respective callback is used for every task in the list.
-* `unshift(task, [callback])` - add a new task to the front of the `queue`.
-* `saturated` - a callback that is called when the `queue` length hits the `concurrency` limit,
-   and further tasks will be queued.
-* `empty` - a callback that is called when the last item from the `queue` is given to a `worker`.
-* `drain` - a callback that is called when the last item from the `queue` has returned from the `worker`.
-* `paused` - a boolean for determining whether the queue is in a paused state
-* `pause()` - a function that pauses the processing of tasks until `resume()` is called.
-* `resume()` - a function that resumes the processing of queued tasks when the queue is paused.
-* `kill()` - a function that removes the `drain` callback and empties remaining tasks from the queue forcing it to go idle.
-
-__Example__
-
-```js
-// create a queue object with concurrency 2
-
-var q = async.queue(function (task, callback) {
-    console.log('hello ' + task.name);
-    callback();
-}, 2);
-
-
-// assign a callback
-q.drain = function() {
-    console.log('all items have been processed');
-}
-
-// add some items to the queue
-
-q.push({name: 'foo'}, function (err) {
-    console.log('finished processing foo');
-});
-q.push({name: 'bar'}, function (err) {
-    console.log('finished processing bar');
-});
-
-// add some items to the queue (batch-wise)
-
-q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {
-    console.log('finished processing item');
-});
-
-// add some items to the front of the queue
-
-q.unshift({name: 'bar'}, function (err) {
-    console.log('finished processing bar');
-});
-```
-
-
----------------------------------------
-
-<a name="priorityQueue" />
-### priorityQueue(worker, concurrency)
-
-The same as [`queue`](#queue) only tasks are assigned a priority and completed in ascending priority order. There are two differences between `queue` and `priorityQueue` objects:
-
-* `push(task, priority, [callback])` - `priority` should be a number. If an array of
-  `tasks` is given, all tasks will be assigned the same priority.
-* The `unshift` method was removed.
-
----------------------------------------
-
-<a name="cargo" />
-### cargo(worker, [payload])
-
-Creates a `cargo` object with the specified payload. Tasks added to the
-cargo will be processed altogether (up to the `payload` limit). If the
-`worker` is in progress, the task is queued until it becomes available. Once
-the `worker` has completed some tasks, each callback of those tasks is called.
-Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966) for how `cargo` and `queue` work.
-
-While [queue](#queue) passes only one task to one of a group of workers
-at a time, cargo passes an array of tasks to a single worker, repeating
-when the worker is finished.
-
-__Arguments__
-
-* `worker(tasks, callback)` - An asynchronous function for processing an array of
-  queued tasks, which must call its `callback(err)` argument when finished, with
-  an optional `err` argument.
-* `payload` - An optional `integer` for determining how many tasks should be
-  processed per round; if omitted, the default is unlimited.
-
-__Cargo objects__
-
-The `cargo` object returned by this function has the following properties and
-methods:
-
-* `length()` - A function returning the number of items waiting to be processed.
-* `payload` - An `integer` for determining how many tasks should be
-  process per round. This property can be changed after a `cargo` is created to
-  alter the payload on-the-fly.
-* `push(task, [callback])` - Adds `task` to the `queue`. The callback is called
-  once the `worker` has finished processing the task. Instead of a single task, an array of `tasks`
-  can be submitted. The respective callback is used for every task in the list.
-* `saturated` - A callback that is called when the `queue.length()` hits the concurrency and further tasks will be queued.
-* `empty` - A callback that is called when the last item from the `queue` is given to a `worker`.
-* `drain` - A callback that is called when the last item from the `queue` has returned from the `worker`.
-* `idle()`, `pause()`, `resume()`, `kill()` - cargo inherits all of the same methods and event calbacks as [`queue`](#queue)
-
-__Example__
-
-```js
-// create a cargo object with payload 2
-
-var cargo = async.cargo(function (tasks, callback) {
-    for(var i=0; i<tasks.length; i++){
-      console.log('hello ' + tasks[i].name);
-    }
-    callback();
-}, 2);
-
-
-// add some items
-
-cargo.push({name: 'foo'}, function (err) {
-    console.log('finished processing foo');
-});
-cargo.push({name: 'bar'}, function (err) {
-    console.log('finished processing bar');
-});
-cargo.push({name: 'baz'}, function (err) {
-    console.log('finished processing baz');
-});
-```
-
----------------------------------------
-
-<a name="auto" />
-### auto(tasks, [concurrency], [callback])
-
-Determines the best order for running the functions in `tasks`, based on their requirements. Each function can optionally depend on other functions being completed first, and each function is run as soon as its requirements are satisfied.
-
-If any of the functions pass an error to their callback, the `auto` sequence will stop. Further tasks will not execute (so any other functions depending on it will not run), and the main `callback` is immediately called with the error.  Functions also receive an object containing the results of functions which have completed so far.
-
-Note, all functions are called with a `results` object as a second argument,
-so it is unsafe to pass functions in the `tasks` object which cannot handle the
-extra argument.
-
-For example, this snippet of code:
-
-```js
-async.auto({
-  readData: async.apply(fs.readFile, 'data.txt', 'utf-8')
-}, callback);
-```
-
-will have the effect of calling `readFile` with the results object as the last
-argument, which will fail:
-
-```js
-fs.readFile('data.txt', 'utf-8', cb, {});
-```
-
-Instead, wrap the call to `readFile` in a function which does not forward the
-`results` object:
-
-```js
-async.auto({
-  readData: function(cb, results){
-    fs.readFile('data.txt', 'utf-8', cb);
-  }
-}, callback);
-```
-
-__Arguments__
-
-* `tasks` - An object. Each of its properties is either a function or an array of
-  requirements, with the function itself the last item in the array. The object's key
-  of a property serves as the name of the task defined by that property,
-  i.e. can be used when specifying requirements for other tasks.
-  The function receives two arguments: (1) a `callback(err, result)` which must be
-  called when finished, passing an `error` (which can be `null`) and the result of
-  the function's execution, and (2) a `results` object, containing the results of
-  the previously executed functions.
-* `concurrency` - An optional `integer` for determining the maximum number of tasks that can be run in parallel. By default, as many as possible.
-* `callback(err, results)` - An optional callback which is called when all the
-  tasks have been completed. It receives the `err` argument if any `tasks`
-  pass an error to their callback. Results are always returned; however, if
-  an error occurs, no further `tasks` will be performed, and the results
-  object will only contain partial results.
-
-
-__Example__
-
-```js
-async.auto({
-    get_data: function(callback){
-        console.log('in get_data');
-        // async code to get some data
-        callback(null, 'data', 'converted to array');
-    },
-    make_folder: function(callback){
-        console.log('in make_folder');
-        // async code to create a directory to store a file in
-        // this is run at the same time as getting the data
-        callback(null, 'folder');
-    },
-    write_file: ['get_data', 'make_folder', function(callback, results){
-        console.log('in write_file', JSON.stringify(results));
-        // once there is some data and the directory exists,
-        // write the data to a file in the directory
-        callback(null, 'filename');
-    }],
-    email_link: ['write_file', function(callback, results){
-        console.log('in email_link', JSON.stringify(results));
-        // once the file is written let's email a link to it...
-        // results.write_file contains the filename returned by write_file.
-        callback(null, {'file':results.write_file, 'email':'user@example.com'});
-    }]
-}, function(err, results) {
-    console.log('err = ', err);
-    console.log('results = ', results);
-});
-```
-
-This is a fairly trivial example, but to do this using the basic parallel and
-series functions would look like this:
-
-```js
-async.parallel([
-    function(callback){
-        console.log('in get_data');
-        // async code to get some data
-        callback(null, 'data', 'converted to array');
-    },
-    function(callback){
-        console.log('in make_folder');
-        // async code to create a directory to store a file in
-        // this is run at the same time as getting the data
-        callback(null, 'folder');
-    }
-],
-function(err, results){
-    async.series([
-        function(callback){
-            console.log('in write_file', JSON.stringify(results));
-            // once there is some data and the directory exists,
-            // write the data to a file in the directory
-            results.push('filename');
-            callback(null);
-        },
-        function(callback){
-            console.log('in email_link', JSON.stringify(results));
-            // once the file is written let's email a link to it...
-            callback(null, {'file':results.pop(), 'email':'user@example.com'});
-        }
-    ]);
-});
-```
-
-For a complicated series of `async` tasks, using the [`auto`](#auto) function makes adding
-new tasks much easier (and the code more readable).
-
-
----------------------------------------
-
-<a name="retry" />
-### retry([opts = {times: 5, interval: 0}| 5], task, [callback])
-
-Attempts to get a successful response from `task` no more than `times` times before
-returning an error. If the task is successful, the `callback` will be passed the result
-of the successful task. If all attempts fail, the callback will be passed the error and
-result (if any) of the final attempt.
-
-__Arguments__
-
-* `opts` - Can be either an object with `times` and `interval` or a number.
-  * `times` - The number of attempts to make before giving up.  The default is `5`.
-  * `interval` - The time to wait between retries, in milliseconds.  The default is `0`.
-  * If `opts` is a number, the number specifies the number of times to retry, with the default interval of `0`. 
-* `task(callback, results)` - A function which receives two arguments: (1) a `callback(err, result)`
-  which must be called when finished, passing `err` (which can be `null`) and the `result` of
-  the function's execution, and (2) a `results` object, containing the results of
-  the previously executed functions (if nested inside another control flow).
-* `callback(err, results)` - An optional callback which is called when the
-  task has succeeded, or after the final failed attempt. It receives the `err` and `result` arguments of the last attempt at completing the `task`.
-
-The [`retry`](#retry) function can be used as a stand-alone control flow by passing a callback, as shown below:
-
-```js
-// try calling apiMethod 3 times
-async.retry(3, apiMethod, function(err, result) {
-    // do something with the result
-});
-```
-
-```js
-// try calling apiMethod 3 times, waiting 200 ms between each retry 
-async.retry({times: 3, interval: 200}, apiMethod, function(err, result) {
-    // do something with the result
-});
-```
-
-```js
-// try calling apiMethod the default 5 times no delay between each retry 
-async.retry(apiMethod, function(err, result) {
-    // do something with the result
-});
-```
-
-It can also be embedded within other control flow functions to retry individual methods
-that are not as reliable, like this:
-
-```js
-async.auto({
-    users: api.getUsers.bind(api),
-    payments: async.retry(3, api.getPayments.bind(api))
-}, function(err, results) {
-  // do something with the results
-});
-```
-
-
----------------------------------------
-
-<a name="iterator" />
-### iterator(tasks)
-
-Creates an iterator function which calls the next function in the `tasks` array,
-returning a continuation to call the next one after that. It's also possible to
-“peek” at the next iterator with `iterator.next()`.
-
-This function is used internally by the `async` module, but can be useful when
-you want to manually control the flow of functions in series.
-
-__Arguments__
-
-* `tasks` - An array of functions to run.
-
-__Example__
-
-```js
-var iterator = async.iterator([
-    function(){ sys.p('one'); },
-    function(){ sys.p('two'); },
-    function(){ sys.p('three'); }
-]);
-
-node> var iterator2 = iterator();
-'one'
-node> var iterator3 = iterator2();
-'two'
-node> iterator3();
-'three'
-node> var nextfn = iterator2.next();
-node> nextfn();
-'three'
-```
-
----------------------------------------
-
-<a name="apply" />
-### apply(function, arguments..)
-
-Creates a continuation function with some arguments already applied.
-
-Useful as a shorthand when combined with other control flow functions. Any arguments
-passed to the returned function are added to the arguments originally passed
-to apply.
-
-__Arguments__
-
-* `function` - The function you want to eventually apply all arguments to.
-* `arguments...` - Any number of arguments to automatically apply when the
-  continuation is called.
-
-__Example__
-
-```js
-// using apply
-
-async.parallel([
-    async.apply(fs.writeFile, 'testfile1', 'test1'),
-    async.apply(fs.writeFile, 'testfile2', 'test2'),
-]);
-
-
-// the same process without using apply
-
-async.parallel([
-    function(callback){
-        fs.writeFile('testfile1', 'test1', callback);
-    },
-    function(callback){
-        fs.writeFile('testfile2', 'test2', callback);
-    }
-]);
-```
-
-It's possible to pass any number of additional arguments when calling the
-continuation:
-
-```js
-node> var fn = async.apply(sys.puts, 'one');
-node> fn('two', 'three');
-one
-two
-three
-```
-
----------------------------------------
-
-<a name="nextTick" />
-### nextTick(callback), setImmediate(callback)
-
-Calls `callback` on a later loop around the event loop. In Node.js this just
-calls `process.nextTick`; in the browser it falls back to `setImmediate(callback)`
-if available, otherwise `setTimeout(callback, 0)`, which means other higher priority
-events may precede the execution of `callback`.
-
-This is used internally for browser-compatibility purposes.
-
-__Arguments__
-
-* `callback` - The function to call on a later loop around the event loop.
-
-__Example__
-
-```js
-var call_order = [];
-async.nextTick(function(){
-    call_order.push('two');
-    // call_order now equals ['one','two']
-});
-call_order.push('one')
-```
-
-<a name="times" />
-### times(n, iterator, [callback])
-
-Calls the `iterator` function `n` times, and accumulates results in the same manner
-you would use with [`map`](#map).
-
-__Arguments__
-
-* `n` - The number of times to run the function.
-* `iterator` - The function to call `n` times.
-* `callback` - see [`map`](#map)
-
-__Example__
-
-```js
-// Pretend this is some complicated async factory
-var createUser = function(id, callback) {
-  callback(null, {
-    id: 'user' + id
-  })
-}
-// generate 5 users
-async.times(5, function(n, next){
-    createUser(n, function(err, user) {
-      next(err, user)
-    })
-}, function(err, users) {
-  // we should now have 5 users
-});
-```
-
-__Related__
-
-* timesSeries(n, iterator, [callback])
-* timesLimit(n, limit, iterator, [callback])
-
-
-## Utils
-
-<a name="memoize" />
-### memoize(fn, [hasher])
-
-Caches the results of an `async` function. When creating a hash to store function
-results against, the callback is omitted from the hash and an optional hash
-function can be used.
-
-If no hash function is specified, the first argument is used as a hash key, which may work reasonably if it is a string or a data type that converts to a distinct string. Note that objects and arrays will not behave reasonably. Neither will cases where the other arguments are significant. In such cases, specify your own hash function.
-
-The cache of results is exposed as the `memo` property of the function returned
-by `memoize`.
-
-__Arguments__
-
-* `fn` - The function to proxy and cache results from.
-* `hasher` - An optional function for generating a custom hash for storing
-  results. It has all the arguments applied to it apart from the callback, and
-  must be synchronous.
-
-__Example__
-
-```js
-var slow_fn = function (name, callback) {
-    // do something
-    callback(null, result);
-};
-var fn = async.memoize(slow_fn);
-
-// fn can now be used as if it were slow_fn
-fn('some name', function () {
-    // callback
-});
-```
-
-<a name="unmemoize" />
-### unmemoize(fn)
-
-Undoes a [`memoize`](#memoize)d function, reverting it to the original, unmemoized
-form. Handy for testing.
-
-__Arguments__
-
-* `fn` - the memoized function
-
----------------------------------------
-
-<a name="ensureAsync" />
-### ensureAsync(fn)
-
-Wrap an async function and ensure it calls its callback on a later tick of the event loop.  If the function already calls its callback on a next tick, no extra deferral is added. This is useful for preventing stack overflows (`RangeError: Maximum call stack size exceeded`) and generally keeping [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) contained.
-
-__Arguments__
-
-* `fn` - an async function, one that expects a node-style callback as its last argument
-
-Returns a wrapped function with the exact same call signature as the function passed in.
-
-__Example__
-
-```js
-function sometimesAsync(arg, callback) {
-  if (cache[arg]) {
-    return callback(null, cache[arg]); // this would be synchronous!!
-  } else {
-    doSomeIO(arg, callback); // this IO would be asynchronous
-  }
-}
-
-// this has a risk of stack overflows if many results are cached in a row
-async.mapSeries(args, sometimesAsync, done);
-
-// this will defer sometimesAsync's callback if necessary,
-// preventing stack overflows
-async.mapSeries(args, async.ensureAsync(sometimesAsync), done);
-
-```
-
----------------------------------------
-
-<a name="constant">
-### constant(values...)
-
-Returns a function that when called, calls-back with the values provided.  Useful as the first function in a `waterfall`, or for plugging values in to `auto`.
-
-__Example__
-
-```js
-async.waterfall([
-  async.constant(42),
-  function (value, next) {
-    // value === 42
-  },
-  //...
-], callback);
-
-async.waterfall([
-  async.constant(filename, "utf8"),
-  fs.readFile,
-  function (fileData, next) {
-    //...
-  }
-  //...
-], callback);
-
-async.auto({
-  hostname: async.constant("https://server.net/"),
-  port: findFreePort,
-  launchServer: ["hostname", "port", function (cb, options) {
-    startServer(options, cb);
-  }],
-  //...
-}, callback);
-
-```
-
----------------------------------------
-
-<a name="asyncify">
-<a name="wrapSync">
-### asyncify(func)
-
-__Alias:__ `wrapSync`
-
-Take a sync function and make it async, passing its return value to a callback. This is useful for plugging sync functions into a waterfall, series, or other async functions. Any arguments passed to the generated function will be passed to the wrapped function (except for the final callback argument). Errors thrown will be passed to the callback.
-
-__Example__
-
-```js
-async.waterfall([
-  async.apply(fs.readFile, filename, "utf8"),
-  async.asyncify(JSON.parse),
-  function (data, next) {
-    // data is the result of parsing the text.
-    // If there was a parsing error, it would have been caught.
-  }
-], callback)
-```
-
-If the function passed to `asyncify` returns a Promise, that promises's resolved/rejected state will be used to call the callback, rather than simply the synchronous return value.  Example:
-
-```js
-async.waterfall([
-  async.apply(fs.readFile, filename, "utf8"),
-  async.asyncify(function (contents) {
-    return db.model.create(contents);
-  }),
-  function (model, next) {
-    // `model` is the instantiated model object. 
-    // If there was an error, this function would be skipped.
-  }
-], callback)
-```
-
-This also means you can asyncify ES2016 `async` functions.
-
-```js
-var q = async.queue(async.asyncify(async function (file) {
-  var intermediateStep = await processFile(file);
-  return await somePromise(intermediateStep)
-}));
-
-q.push(files);
-```
-
----------------------------------------
-
-<a name="log" />
-### log(function, arguments)
-
-Logs the result of an `async` function to the `console`. Only works in Node.js or
-in browsers that support `console.log` and `console.error` (such as FF and Chrome).
-If multiple arguments are returned from the async function, `console.log` is
-called on each argument in order.
-
-__Arguments__
-
-* `function` - The function you want to eventually apply all arguments to.
-* `arguments...` - Any number of arguments to apply to the function.
-
-__Example__
-
-```js
-var hello = function(name, callback){
-    setTimeout(function(){
-        callback(null, 'hello ' + name);
-    }, 1000);
-};
-```
-```js
-node> async.log(hello, 'world');
-'hello world'
-```
-
----------------------------------------
-
-<a name="dir" />
-### dir(function, arguments)
-
-Logs the result of an `async` function to the `console` using `console.dir` to
-display the properties of the resulting object. Only works in Node.js or
-in browsers that support `console.dir` and `console.error` (such as FF and Chrome).
-If multiple arguments are returned from the async function, `console.dir` is
-called on each argument in order.
-
-__Arguments__
-
-* `function` - The function you want to eventually apply all arguments to.
-* `arguments...` - Any number of arguments to apply to the function.
-
-__Example__
-
-```js
-var hello = function(name, callback){
-    setTimeout(function(){
-        callback(null, {hello: name});
-    }, 1000);
-};
-```
-```js
-node> async.dir(hello, 'world');
-{hello: 'world'}
-```
-
----------------------------------------
-
-<a name="noConflict" />
-### noConflict()
-
-Changes the value of `async` back to its original value, returning a reference to the
-`async` object.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/dist/async.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/dist/async.js
deleted file mode 100644
index 31e7620fb6ffb3a9db48740e3f18921cb3d07c1f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/dist/async.js
+++ /dev/null
@@ -1,1265 +0,0 @@
-/*!
- * async
- * https://github.com/caolan/async
- *
- * Copyright 2010-2014 Caolan McMahon
- * Released under the MIT license
- */
-(function () {
-
-    var async = {};
-    function noop() {}
-    function identity(v) {
-        return v;
-    }
-    function toBool(v) {
-        return !!v;
-    }
-    function notId(v) {
-        return !v;
-    }
-
-    // global on the server, window in the browser
-    var previous_async;
-
-    // Establish the root object, `window` (`self`) in the browser, `global`
-    // on the server, or `this` in some virtual machines. We use `self`
-    // instead of `window` for `WebWorker` support.
-    var root = typeof self === 'object' && self.self === self && self ||
-            typeof global === 'object' && global.global === global && global ||
-            this;
-
-    if (root != null) {
-        previous_async = root.async;
-    }
-
-    async.noConflict = function () {
-        root.async = previous_async;
-        return async;
-    };
-
-    function only_once(fn) {
-        return function() {
-            if (fn === null) throw new Error("Callback was already called.");
-            fn.apply(this, arguments);
-            fn = null;
-        };
-    }
-
-    function _once(fn) {
-        return function() {
-            if (fn === null) return;
-            fn.apply(this, arguments);
-            fn = null;
-        };
-    }
-
-    //// cross-browser compatiblity functions ////
-
-    var _toString = Object.prototype.toString;
-
-    var _isArray = Array.isArray || function (obj) {
-        return _toString.call(obj) === '[object Array]';
-    };
-
-    // Ported from underscore.js isObject
-    var _isObject = function(obj) {
-        var type = typeof obj;
-        return type === 'function' || type === 'object' && !!obj;
-    };
-
-    function _isArrayLike(arr) {
-        return _isArray(arr) || (
-            // has a positive integer length property
-            typeof arr.length === "number" &&
-            arr.length >= 0 &&
-            arr.length % 1 === 0
-        );
-    }
-
-    function _arrayEach(arr, iterator) {
-        var index = -1,
-            length = arr.length;
-
-        while (++index < length) {
-            iterator(arr[index], index, arr);
-        }
-    }
-
-    function _map(arr, iterator) {
-        var index = -1,
-            length = arr.length,
-            result = Array(length);
-
-        while (++index < length) {
-            result[index] = iterator(arr[index], index, arr);
-        }
-        return result;
-    }
-
-    function _range(count) {
-        return _map(Array(count), function (v, i) { return i; });
-    }
-
-    function _reduce(arr, iterator, memo) {
-        _arrayEach(arr, function (x, i, a) {
-            memo = iterator(memo, x, i, a);
-        });
-        return memo;
-    }
-
-    function _forEachOf(object, iterator) {
-        _arrayEach(_keys(object), function (key) {
-            iterator(object[key], key);
-        });
-    }
-
-    function _indexOf(arr, item) {
-        for (var i = 0; i < arr.length; i++) {
-            if (arr[i] === item) return i;
-        }
-        return -1;
-    }
-
-    var _keys = Object.keys || function (obj) {
-        var keys = [];
-        for (var k in obj) {
-            if (obj.hasOwnProperty(k)) {
-                keys.push(k);
-            }
-        }
-        return keys;
-    };
-
-    function _keyIterator(coll) {
-        var i = -1;
-        var len;
-        var keys;
-        if (_isArrayLike(coll)) {
-            len = coll.length;
-            return function next() {
-                i++;
-                return i < len ? i : null;
-            };
-        } else {
-            keys = _keys(coll);
-            len = keys.length;
-            return function next() {
-                i++;
-                return i < len ? keys[i] : null;
-            };
-        }
-    }
-
-    // Similar to ES6's rest param (http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html)
-    // This accumulates the arguments passed into an array, after a given index.
-    // From underscore.js (https://github.com/jashkenas/underscore/pull/2140).
-    function _restParam(func, startIndex) {
-        startIndex = startIndex == null ? func.length - 1 : +startIndex;
-        return function() {
-            var length = Math.max(arguments.length - startIndex, 0);
-            var rest = Array(length);
-            for (var index = 0; index < length; index++) {
-                rest[index] = arguments[index + startIndex];
-            }
-            switch (startIndex) {
-                case 0: return func.call(this, rest);
-                case 1: return func.call(this, arguments[0], rest);
-            }
-            // Currently unused but handle cases outside of the switch statement:
-            // var args = Array(startIndex + 1);
-            // for (index = 0; index < startIndex; index++) {
-            //     args[index] = arguments[index];
-            // }
-            // args[startIndex] = rest;
-            // return func.apply(this, args);
-        };
-    }
-
-    function _withoutIndex(iterator) {
-        return function (value, index, callback) {
-            return iterator(value, callback);
-        };
-    }
-
-    //// exported async module functions ////
-
-    //// nextTick implementation with browser-compatible fallback ////
-
-    // capture the global reference to guard against fakeTimer mocks
-    var _setImmediate = typeof setImmediate === 'function' && setImmediate;
-
-    var _delay = _setImmediate ? function(fn) {
-        // not a direct alias for IE10 compatibility
-        _setImmediate(fn);
-    } : function(fn) {
-        setTimeout(fn, 0);
-    };
-
-    if (typeof process === 'object' && typeof process.nextTick === 'function') {
-        async.nextTick = process.nextTick;
-    } else {
-        async.nextTick = _delay;
-    }
-    async.setImmediate = _setImmediate ? _delay : async.nextTick;
-
-
-    async.forEach =
-    async.each = function (arr, iterator, callback) {
-        return async.eachOf(arr, _withoutIndex(iterator), callback);
-    };
-
-    async.forEachSeries =
-    async.eachSeries = function (arr, iterator, callback) {
-        return async.eachOfSeries(arr, _withoutIndex(iterator), callback);
-    };
-
-
-    async.forEachLimit =
-    async.eachLimit = function (arr, limit, iterator, callback) {
-        return _eachOfLimit(limit)(arr, _withoutIndex(iterator), callback);
-    };
-
-    async.forEachOf =
-    async.eachOf = function (object, iterator, callback) {
-        callback = _once(callback || noop);
-        object = object || [];
-
-        var iter = _keyIterator(object);
-        var key, completed = 0;
-
-        while ((key = iter()) != null) {
-            completed += 1;
-            iterator(object[key], key, only_once(done));
-        }
-
-        if (completed === 0) callback(null);
-
-        function done(err) {
-            completed--;
-            if (err) {
-                callback(err);
-            }
-            // Check key is null in case iterator isn't exhausted
-            // and done resolved synchronously.
-            else if (key === null && completed <= 0) {
-                callback(null);
-            }
-        }
-    };
-
-    async.forEachOfSeries =
-    async.eachOfSeries = function (obj, iterator, callback) {
-        callback = _once(callback || noop);
-        obj = obj || [];
-        var nextKey = _keyIterator(obj);
-        var key = nextKey();
-        function iterate() {
-            var sync = true;
-            if (key === null) {
-                return callback(null);
-            }
-            iterator(obj[key], key, only_once(function (err) {
-                if (err) {
-                    callback(err);
-                }
-                else {
-                    key = nextKey();
-                    if (key === null) {
-                        return callback(null);
-                    } else {
-                        if (sync) {
-                            async.setImmediate(iterate);
-                        } else {
-                            iterate();
-                        }
-                    }
-                }
-            }));
-            sync = false;
-        }
-        iterate();
-    };
-
-
-
-    async.forEachOfLimit =
-    async.eachOfLimit = function (obj, limit, iterator, callback) {
-        _eachOfLimit(limit)(obj, iterator, callback);
-    };
-
-    function _eachOfLimit(limit) {
-
-        return function (obj, iterator, callback) {
-            callback = _once(callback || noop);
-            obj = obj || [];
-            var nextKey = _keyIterator(obj);
-            if (limit <= 0) {
-                return callback(null);
-            }
-            var done = false;
-            var running = 0;
-            var errored = false;
-
-            (function replenish () {
-                if (done && running <= 0) {
-                    return callback(null);
-                }
-
-                while (running < limit && !errored) {
-                    var key = nextKey();
-                    if (key === null) {
-                        done = true;
-                        if (running <= 0) {
-                            callback(null);
-                        }
-                        return;
-                    }
-                    running += 1;
-                    iterator(obj[key], key, only_once(function (err) {
-                        running -= 1;
-                        if (err) {
-                            callback(err);
-                            errored = true;
-                        }
-                        else {
-                            replenish();
-                        }
-                    }));
-                }
-            })();
-        };
-    }
-
-
-    function doParallel(fn) {
-        return function (obj, iterator, callback) {
-            return fn(async.eachOf, obj, iterator, callback);
-        };
-    }
-    function doParallelLimit(fn) {
-        return function (obj, limit, iterator, callback) {
-            return fn(_eachOfLimit(limit), obj, iterator, callback);
-        };
-    }
-    function doSeries(fn) {
-        return function (obj, iterator, callback) {
-            return fn(async.eachOfSeries, obj, iterator, callback);
-        };
-    }
-
-    function _asyncMap(eachfn, arr, iterator, callback) {
-        callback = _once(callback || noop);
-        arr = arr || [];
-        var results = _isArrayLike(arr) ? [] : {};
-        eachfn(arr, function (value, index, callback) {
-            iterator(value, function (err, v) {
-                results[index] = v;
-                callback(err);
-            });
-        }, function (err) {
-            callback(err, results);
-        });
-    }
-
-    async.map = doParallel(_asyncMap);
-    async.mapSeries = doSeries(_asyncMap);
-    async.mapLimit = doParallelLimit(_asyncMap);
-
-    // reduce only has a series version, as doing reduce in parallel won't
-    // work in many situations.
-    async.inject =
-    async.foldl =
-    async.reduce = function (arr, memo, iterator, callback) {
-        async.eachOfSeries(arr, function (x, i, callback) {
-            iterator(memo, x, function (err, v) {
-                memo = v;
-                callback(err);
-            });
-        }, function (err) {
-            callback(err, memo);
-        });
-    };
-
-    async.foldr =
-    async.reduceRight = function (arr, memo, iterator, callback) {
-        var reversed = _map(arr, identity).reverse();
-        async.reduce(reversed, memo, iterator, callback);
-    };
-
-    async.transform = function (arr, memo, iterator, callback) {
-        if (arguments.length === 3) {
-            callback = iterator;
-            iterator = memo;
-            memo = _isArray(arr) ? [] : {};
-        }
-
-        async.eachOf(arr, function(v, k, cb) {
-            iterator(memo, v, k, cb);
-        }, function(err) {
-            callback(err, memo);
-        });
-    };
-
-    function _filter(eachfn, arr, iterator, callback) {
-        var results = [];
-        eachfn(arr, function (x, index, callback) {
-            iterator(x, function (v) {
-                if (v) {
-                    results.push({index: index, value: x});
-                }
-                callback();
-            });
-        }, function () {
-            callback(_map(results.sort(function (a, b) {
-                return a.index - b.index;
-            }), function (x) {
-                return x.value;
-            }));
-        });
-    }
-
-    async.select =
-    async.filter = doParallel(_filter);
-
-    async.selectLimit =
-    async.filterLimit = doParallelLimit(_filter);
-
-    async.selectSeries =
-    async.filterSeries = doSeries(_filter);
-
-    function _reject(eachfn, arr, iterator, callback) {
-        _filter(eachfn, arr, function(value, cb) {
-            iterator(value, function(v) {
-                cb(!v);
-            });
-        }, callback);
-    }
-    async.reject = doParallel(_reject);
-    async.rejectLimit = doParallelLimit(_reject);
-    async.rejectSeries = doSeries(_reject);
-
-    function _createTester(eachfn, check, getResult) {
-        return function(arr, limit, iterator, cb) {
-            function done() {
-                if (cb) cb(getResult(false, void 0));
-            }
-            function iteratee(x, _, callback) {
-                if (!cb) return callback();
-                iterator(x, function (v) {
-                    if (cb && check(v)) {
-                        cb(getResult(true, x));
-                        cb = iterator = false;
-                    }
-                    callback();
-                });
-            }
-            if (arguments.length > 3) {
-                eachfn(arr, limit, iteratee, done);
-            } else {
-                cb = iterator;
-                iterator = limit;
-                eachfn(arr, iteratee, done);
-            }
-        };
-    }
-
-    async.any =
-    async.some = _createTester(async.eachOf, toBool, identity);
-
-    async.someLimit = _createTester(async.eachOfLimit, toBool, identity);
-
-    async.all =
-    async.every = _createTester(async.eachOf, notId, notId);
-
-    async.everyLimit = _createTester(async.eachOfLimit, notId, notId);
-
-    function _findGetResult(v, x) {
-        return x;
-    }
-    async.detect = _createTester(async.eachOf, identity, _findGetResult);
-    async.detectSeries = _createTester(async.eachOfSeries, identity, _findGetResult);
-    async.detectLimit = _createTester(async.eachOfLimit, identity, _findGetResult);
-
-    async.sortBy = function (arr, iterator, callback) {
-        async.map(arr, function (x, callback) {
-            iterator(x, function (err, criteria) {
-                if (err) {
-                    callback(err);
-                }
-                else {
-                    callback(null, {value: x, criteria: criteria});
-                }
-            });
-        }, function (err, results) {
-            if (err) {
-                return callback(err);
-            }
-            else {
-                callback(null, _map(results.sort(comparator), function (x) {
-                    return x.value;
-                }));
-            }
-
-        });
-
-        function comparator(left, right) {
-            var a = left.criteria, b = right.criteria;
-            return a < b ? -1 : a > b ? 1 : 0;
-        }
-    };
-
-    async.auto = function (tasks, concurrency, callback) {
-        if (typeof arguments[1] === 'function') {
-            // concurrency is optional, shift the args.
-            callback = concurrency;
-            concurrency = null;
-        }
-        callback = _once(callback || noop);
-        var keys = _keys(tasks);
-        var remainingTasks = keys.length;
-        if (!remainingTasks) {
-            return callback(null);
-        }
-        if (!concurrency) {
-            concurrency = remainingTasks;
-        }
-
-        var results = {};
-        var runningTasks = 0;
-
-        var hasError = false;
-
-        var listeners = [];
-        function addListener(fn) {
-            listeners.unshift(fn);
-        }
-        function removeListener(fn) {
-            var idx = _indexOf(listeners, fn);
-            if (idx >= 0) listeners.splice(idx, 1);
-        }
-        function taskComplete() {
-            remainingTasks--;
-            _arrayEach(listeners.slice(0), function (fn) {
-                fn();
-            });
-        }
-
-        addListener(function () {
-            if (!remainingTasks) {
-                callback(null, results);
-            }
-        });
-
-        _arrayEach(keys, function (k) {
-            if (hasError) return;
-            var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];
-            var taskCallback = _restParam(function(err, args) {
-                runningTasks--;
-                if (args.length <= 1) {
-                    args = args[0];
-                }
-                if (err) {
-                    var safeResults = {};
-                    _forEachOf(results, function(val, rkey) {
-                        safeResults[rkey] = val;
-                    });
-                    safeResults[k] = args;
-                    hasError = true;
-
-                    callback(err, safeResults);
-                }
-                else {
-                    results[k] = args;
-                    async.setImmediate(taskComplete);
-                }
-            });
-            var requires = task.slice(0, task.length - 1);
-            // prevent dead-locks
-            var len = requires.length;
-            var dep;
-            while (len--) {
-                if (!(dep = tasks[requires[len]])) {
-                    throw new Error('Has nonexistent dependency in ' + requires.join(', '));
-                }
-                if (_isArray(dep) && _indexOf(dep, k) >= 0) {
-                    throw new Error('Has cyclic dependencies');
-                }
-            }
-            function ready() {
-                return runningTasks < concurrency && _reduce(requires, function (a, x) {
-                    return (a && results.hasOwnProperty(x));
-                }, true) && !results.hasOwnProperty(k);
-            }
-            if (ready()) {
-                runningTasks++;
-                task[task.length - 1](taskCallback, results);
-            }
-            else {
-                addListener(listener);
-            }
-            function listener() {
-                if (ready()) {
-                    runningTasks++;
-                    removeListener(listener);
-                    task[task.length - 1](taskCallback, results);
-                }
-            }
-        });
-    };
-
-
-
-    async.retry = function(times, task, callback) {
-        var DEFAULT_TIMES = 5;
-        var DEFAULT_INTERVAL = 0;
-
-        var attempts = [];
-
-        var opts = {
-            times: DEFAULT_TIMES,
-            interval: DEFAULT_INTERVAL
-        };
-
-        function parseTimes(acc, t){
-            if(typeof t === 'number'){
-                acc.times = parseInt(t, 10) || DEFAULT_TIMES;
-            } else if(typeof t === 'object'){
-                acc.times = parseInt(t.times, 10) || DEFAULT_TIMES;
-                acc.interval = parseInt(t.interval, 10) || DEFAULT_INTERVAL;
-            } else {
-                throw new Error('Unsupported argument type for \'times\': ' + typeof t);
-            }
-        }
-
-        var length = arguments.length;
-        if (length < 1 || length > 3) {
-            throw new Error('Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)');
-        } else if (length <= 2 && typeof times === 'function') {
-            callback = task;
-            task = times;
-        }
-        if (typeof times !== 'function') {
-            parseTimes(opts, times);
-        }
-        opts.callback = callback;
-        opts.task = task;
-
-        function wrappedTask(wrappedCallback, wrappedResults) {
-            function retryAttempt(task, finalAttempt) {
-                return function(seriesCallback) {
-                    task(function(err, result){
-                        seriesCallback(!err || finalAttempt, {err: err, result: result});
-                    }, wrappedResults);
-                };
-            }
-
-            function retryInterval(interval){
-                return function(seriesCallback){
-                    setTimeout(function(){
-                        seriesCallback(null);
-                    }, interval);
-                };
-            }
-
-            while (opts.times) {
-
-                var finalAttempt = !(opts.times-=1);
-                attempts.push(retryAttempt(opts.task, finalAttempt));
-                if(!finalAttempt && opts.interval > 0){
-                    attempts.push(retryInterval(opts.interval));
-                }
-            }
-
-            async.series(attempts, function(done, data){
-                data = data[data.length - 1];
-                (wrappedCallback || opts.callback)(data.err, data.result);
-            });
-        }
-
-        // If a callback is passed, run this as a controll flow
-        return opts.callback ? wrappedTask() : wrappedTask;
-    };
-
-    async.waterfall = function (tasks, callback) {
-        callback = _once(callback || noop);
-        if (!_isArray(tasks)) {
-            var err = new Error('First argument to waterfall must be an array of functions');
-            return callback(err);
-        }
-        if (!tasks.length) {
-            return callback();
-        }
-        function wrapIterator(iterator) {
-            return _restParam(function (err, args) {
-                if (err) {
-                    callback.apply(null, [err].concat(args));
-                }
-                else {
-                    var next = iterator.next();
-                    if (next) {
-                        args.push(wrapIterator(next));
-                    }
-                    else {
-                        args.push(callback);
-                    }
-                    ensureAsync(iterator).apply(null, args);
-                }
-            });
-        }
-        wrapIterator(async.iterator(tasks))();
-    };
-
-    function _parallel(eachfn, tasks, callback) {
-        callback = callback || noop;
-        var results = _isArrayLike(tasks) ? [] : {};
-
-        eachfn(tasks, function (task, key, callback) {
-            task(_restParam(function (err, args) {
-                if (args.length <= 1) {
-                    args = args[0];
-                }
-                results[key] = args;
-                callback(err);
-            }));
-        }, function (err) {
-            callback(err, results);
-        });
-    }
-
-    async.parallel = function (tasks, callback) {
-        _parallel(async.eachOf, tasks, callback);
-    };
-
-    async.parallelLimit = function(tasks, limit, callback) {
-        _parallel(_eachOfLimit(limit), tasks, callback);
-    };
-
-    async.series = function(tasks, callback) {
-        _parallel(async.eachOfSeries, tasks, callback);
-    };
-
-    async.iterator = function (tasks) {
-        function makeCallback(index) {
-            function fn() {
-                if (tasks.length) {
-                    tasks[index].apply(null, arguments);
-                }
-                return fn.next();
-            }
-            fn.next = function () {
-                return (index < tasks.length - 1) ? makeCallback(index + 1): null;
-            };
-            return fn;
-        }
-        return makeCallback(0);
-    };
-
-    async.apply = _restParam(function (fn, args) {
-        return _restParam(function (callArgs) {
-            return fn.apply(
-                null, args.concat(callArgs)
-            );
-        });
-    });
-
-    function _concat(eachfn, arr, fn, callback) {
-        var result = [];
-        eachfn(arr, function (x, index, cb) {
-            fn(x, function (err, y) {
-                result = result.concat(y || []);
-                cb(err);
-            });
-        }, function (err) {
-            callback(err, result);
-        });
-    }
-    async.concat = doParallel(_concat);
-    async.concatSeries = doSeries(_concat);
-
-    async.whilst = function (test, iterator, callback) {
-        callback = callback || noop;
-        if (test()) {
-            var next = _restParam(function(err, args) {
-                if (err) {
-                    callback(err);
-                } else if (test.apply(this, args)) {
-                    iterator(next);
-                } else {
-                    callback.apply(null, [null].concat(args));
-                }
-            });
-            iterator(next);
-        } else {
-            callback(null);
-        }
-    };
-
-    async.doWhilst = function (iterator, test, callback) {
-        var calls = 0;
-        return async.whilst(function() {
-            return ++calls <= 1 || test.apply(this, arguments);
-        }, iterator, callback);
-    };
-
-    async.until = function (test, iterator, callback) {
-        return async.whilst(function() {
-            return !test.apply(this, arguments);
-        }, iterator, callback);
-    };
-
-    async.doUntil = function (iterator, test, callback) {
-        return async.doWhilst(iterator, function() {
-            return !test.apply(this, arguments);
-        }, callback);
-    };
-
-    async.during = function (test, iterator, callback) {
-        callback = callback || noop;
-
-        var next = _restParam(function(err, args) {
-            if (err) {
-                callback(err);
-            } else {
-                args.push(check);
-                test.apply(this, args);
-            }
-        });
-
-        var check = function(err, truth) {
-            if (err) {
-                callback(err);
-            } else if (truth) {
-                iterator(next);
-            } else {
-                callback(null);
-            }
-        };
-
-        test(check);
-    };
-
-    async.doDuring = function (iterator, test, callback) {
-        var calls = 0;
-        async.during(function(next) {
-            if (calls++ < 1) {
-                next(null, true);
-            } else {
-                test.apply(this, arguments);
-            }
-        }, iterator, callback);
-    };
-
-    function _queue(worker, concurrency, payload) {
-        if (concurrency == null) {
-            concurrency = 1;
-        }
-        else if(concurrency === 0) {
-            throw new Error('Concurrency must not be zero');
-        }
-        function _insert(q, data, pos, callback) {
-            if (callback != null && typeof callback !== "function") {
-                throw new Error("task callback must be a function");
-            }
-            q.started = true;
-            if (!_isArray(data)) {
-                data = [data];
-            }
-            if(data.length === 0 && q.idle()) {
-                // call drain immediately if there are no tasks
-                return async.setImmediate(function() {
-                    q.drain();
-                });
-            }
-            _arrayEach(data, function(task) {
-                var item = {
-                    data: task,
-                    callback: callback || noop
-                };
-
-                if (pos) {
-                    q.tasks.unshift(item);
-                } else {
-                    q.tasks.push(item);
-                }
-
-                if (q.tasks.length === q.concurrency) {
-                    q.saturated();
-                }
-            });
-            async.setImmediate(q.process);
-        }
-        function _next(q, tasks) {
-            return function(){
-                workers -= 1;
-
-                var removed = false;
-                var args = arguments;
-                _arrayEach(tasks, function (task) {
-                    _arrayEach(workersList, function (worker, index) {
-                        if (worker === task && !removed) {
-                            workersList.splice(index, 1);
-                            removed = true;
-                        }
-                    });
-
-                    task.callback.apply(task, args);
-                });
-                if (q.tasks.length + workers === 0) {
-                    q.drain();
-                }
-                q.process();
-            };
-        }
-
-        var workers = 0;
-        var workersList = [];
-        var q = {
-            tasks: [],
-            concurrency: concurrency,
-            payload: payload,
-            saturated: noop,
-            empty: noop,
-            drain: noop,
-            started: false,
-            paused: false,
-            push: function (data, callback) {
-                _insert(q, data, false, callback);
-            },
-            kill: function () {
-                q.drain = noop;
-                q.tasks = [];
-            },
-            unshift: function (data, callback) {
-                _insert(q, data, true, callback);
-            },
-            process: function () {
-                while(!q.paused && workers < q.concurrency && q.tasks.length){
-
-                    var tasks = q.payload ?
-                        q.tasks.splice(0, q.payload) :
-                        q.tasks.splice(0, q.tasks.length);
-
-                    var data = _map(tasks, function (task) {
-                        return task.data;
-                    });
-
-                    if (q.tasks.length === 0) {
-                        q.empty();
-                    }
-                    workers += 1;
-                    workersList.push(tasks[0]);
-                    var cb = only_once(_next(q, tasks));
-                    worker(data, cb);
-                }
-            },
-            length: function () {
-                return q.tasks.length;
-            },
-            running: function () {
-                return workers;
-            },
-            workersList: function () {
-                return workersList;
-            },
-            idle: function() {
-                return q.tasks.length + workers === 0;
-            },
-            pause: function () {
-                q.paused = true;
-            },
-            resume: function () {
-                if (q.paused === false) { return; }
-                q.paused = false;
-                var resumeCount = Math.min(q.concurrency, q.tasks.length);
-                // Need to call q.process once per concurrent
-                // worker to preserve full concurrency after pause
-                for (var w = 1; w <= resumeCount; w++) {
-                    async.setImmediate(q.process);
-                }
-            }
-        };
-        return q;
-    }
-
-    async.queue = function (worker, concurrency) {
-        var q = _queue(function (items, cb) {
-            worker(items[0], cb);
-        }, concurrency, 1);
-
-        return q;
-    };
-
-    async.priorityQueue = function (worker, concurrency) {
-
-        function _compareTasks(a, b){
-            return a.priority - b.priority;
-        }
-
-        function _binarySearch(sequence, item, compare) {
-            var beg = -1,
-                end = sequence.length - 1;
-            while (beg < end) {
-                var mid = beg + ((end - beg + 1) >>> 1);
-                if (compare(item, sequence[mid]) >= 0) {
-                    beg = mid;
-                } else {
-                    end = mid - 1;
-                }
-            }
-            return beg;
-        }
-
-        function _insert(q, data, priority, callback) {
-            if (callback != null && typeof callback !== "function") {
-                throw new Error("task callback must be a function");
-            }
-            q.started = true;
-            if (!_isArray(data)) {
-                data = [data];
-            }
-            if(data.length === 0) {
-                // call drain immediately if there are no tasks
-                return async.setImmediate(function() {
-                    q.drain();
-                });
-            }
-            _arrayEach(data, function(task) {
-                var item = {
-                    data: task,
-                    priority: priority,
-                    callback: typeof callback === 'function' ? callback : noop
-                };
-
-                q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);
-
-                if (q.tasks.length === q.concurrency) {
-                    q.saturated();
-                }
-                async.setImmediate(q.process);
-            });
-        }
-
-        // Start with a normal queue
-        var q = async.queue(worker, concurrency);
-
-        // Override push to accept second parameter representing priority
-        q.push = function (data, priority, callback) {
-            _insert(q, data, priority, callback);
-        };
-
-        // Remove unshift function
-        delete q.unshift;
-
-        return q;
-    };
-
-    async.cargo = function (worker, payload) {
-        return _queue(worker, 1, payload);
-    };
-
-    function _console_fn(name) {
-        return _restParam(function (fn, args) {
-            fn.apply(null, args.concat([_restParam(function (err, args) {
-                if (typeof console === 'object') {
-                    if (err) {
-                        if (console.error) {
-                            console.error(err);
-                        }
-                    }
-                    else if (console[name]) {
-                        _arrayEach(args, function (x) {
-                            console[name](x);
-                        });
-                    }
-                }
-            })]));
-        });
-    }
-    async.log = _console_fn('log');
-    async.dir = _console_fn('dir');
-    /*async.info = _console_fn('info');
-    async.warn = _console_fn('warn');
-    async.error = _console_fn('error');*/
-
-    async.memoize = function (fn, hasher) {
-        var memo = {};
-        var queues = {};
-        var has = Object.prototype.hasOwnProperty;
-        hasher = hasher || identity;
-        var memoized = _restParam(function memoized(args) {
-            var callback = args.pop();
-            var key = hasher.apply(null, args);
-            if (has.call(memo, key)) {   
-                async.setImmediate(function () {
-                    callback.apply(null, memo[key]);
-                });
-            }
-            else if (has.call(queues, key)) {
-                queues[key].push(callback);
-            }
-            else {
-                queues[key] = [callback];
-                fn.apply(null, args.concat([_restParam(function (args) {
-                    memo[key] = args;
-                    var q = queues[key];
-                    delete queues[key];
-                    for (var i = 0, l = q.length; i < l; i++) {
-                        q[i].apply(null, args);
-                    }
-                })]));
-            }
-        });
-        memoized.memo = memo;
-        memoized.unmemoized = fn;
-        return memoized;
-    };
-
-    async.unmemoize = function (fn) {
-        return function () {
-            return (fn.unmemoized || fn).apply(null, arguments);
-        };
-    };
-
-    function _times(mapper) {
-        return function (count, iterator, callback) {
-            mapper(_range(count), iterator, callback);
-        };
-    }
-
-    async.times = _times(async.map);
-    async.timesSeries = _times(async.mapSeries);
-    async.timesLimit = function (count, limit, iterator, callback) {
-        return async.mapLimit(_range(count), limit, iterator, callback);
-    };
-
-    async.seq = function (/* functions... */) {
-        var fns = arguments;
-        return _restParam(function (args) {
-            var that = this;
-
-            var callback = args[args.length - 1];
-            if (typeof callback == 'function') {
-                args.pop();
-            } else {
-                callback = noop;
-            }
-
-            async.reduce(fns, args, function (newargs, fn, cb) {
-                fn.apply(that, newargs.concat([_restParam(function (err, nextargs) {
-                    cb(err, nextargs);
-                })]));
-            },
-            function (err, results) {
-                callback.apply(that, [err].concat(results));
-            });
-        });
-    };
-
-    async.compose = function (/* functions... */) {
-        return async.seq.apply(null, Array.prototype.reverse.call(arguments));
-    };
-
-
-    function _applyEach(eachfn) {
-        return _restParam(function(fns, args) {
-            var go = _restParam(function(args) {
-                var that = this;
-                var callback = args.pop();
-                return eachfn(fns, function (fn, _, cb) {
-                    fn.apply(that, args.concat([cb]));
-                },
-                callback);
-            });
-            if (args.length) {
-                return go.apply(this, args);
-            }
-            else {
-                return go;
-            }
-        });
-    }
-
-    async.applyEach = _applyEach(async.eachOf);
-    async.applyEachSeries = _applyEach(async.eachOfSeries);
-
-
-    async.forever = function (fn, callback) {
-        var done = only_once(callback || noop);
-        var task = ensureAsync(fn);
-        function next(err) {
-            if (err) {
-                return done(err);
-            }
-            task(next);
-        }
-        next();
-    };
-
-    function ensureAsync(fn) {
-        return _restParam(function (args) {
-            var callback = args.pop();
-            args.push(function () {
-                var innerArgs = arguments;
-                if (sync) {
-                    async.setImmediate(function () {
-                        callback.apply(null, innerArgs);
-                    });
-                } else {
-                    callback.apply(null, innerArgs);
-                }
-            });
-            var sync = true;
-            fn.apply(this, args);
-            sync = false;
-        });
-    }
-
-    async.ensureAsync = ensureAsync;
-
-    async.constant = _restParam(function(values) {
-        var args = [null].concat(values);
-        return function (callback) {
-            return callback.apply(this, args);
-        };
-    });
-
-    async.wrapSync =
-    async.asyncify = function asyncify(func) {
-        return _restParam(function (args) {
-            var callback = args.pop();
-            var result;
-            try {
-                result = func.apply(this, args);
-            } catch (e) {
-                return callback(e);
-            }
-            // if result is Promise object
-            if (_isObject(result) && typeof result.then === "function") {
-                result.then(function(value) {
-                    callback(null, value);
-                })["catch"](function(err) {
-                    callback(err.message ? err : new Error(err));
-                });
-            } else {
-                callback(null, result);
-            }
-        });
-    };
-
-    // Node.js
-    if (typeof module === 'object' && module.exports) {
-        module.exports = async;
-    }
-    // AMD / RequireJS
-    else if (typeof define === 'function' && define.amd) {
-        define([], function () {
-            return async;
-        });
-    }
-    // included directly via <script> tag
-    else {
-        root.async = async;
-    }
-
-}());
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js
deleted file mode 100644
index 2490016a06f95be9535d89f05a3db81f07a8199c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/dist/async.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-!function(){function n(){}function t(n){return n}function e(n){return!!n}function r(n){return!n}function u(n){return function(){if(null===n)throw new Error("Callback was already called.");n.apply(this,arguments),n=null}}function i(n){return function(){null!==n&&(n.apply(this,arguments),n=null)}}function o(n){return M(n)||"number"==typeof n.length&&n.length>=0&&n.length%1===0}function c(n,t){for(var e=-1,r=n.length;++e<r;)t(n[e],e,n)}function a(n,t){for(var e=-1,r=n.length,u=Array(r);++e<r;)u[e]=t(n[e],e,n);return u}function f(n){return a(Array(n),function(n,t){return t})}function l(n,t,e){return c(n,function(n,r,u){e=t(e,n,r,u)}),e}function s(n,t){c(W(n),function(e){t(n[e],e)})}function p(n,t){for(var e=0;e<n.length;e++)if(n[e]===t)return e;return-1}function h(n){var t,e,r=-1;return o(n)?(t=n.length,function(){return r++,t>r?r:null}):(e=W(n),t=e.length,function(){return r++,t>r?e[r]:null})}function m(n,t){return t=null==t?n.length-1:+t,function(){for(var e=Math.max(arguments.length-t,0),r=Array(e),u=0;e>u;u++)r[u]=arguments[u+t];switch(t){case 0:return n.call(this,r);case 1:return n.call(this,arguments[0],r)}}}function y(n){return function(t,e,r){return n(t,r)}}function v(t){return function(e,r,o){o=i(o||n),e=e||[];var c=h(e);if(0>=t)return o(null);var a=!1,f=0,l=!1;!function s(){if(a&&0>=f)return o(null);for(;t>f&&!l;){var n=c();if(null===n)return a=!0,void(0>=f&&o(null));f+=1,r(e[n],n,u(function(n){f-=1,n?(o(n),l=!0):s()}))}}()}}function d(n){return function(t,e,r){return n(P.eachOf,t,e,r)}}function g(n){return function(t,e,r,u){return n(v(e),t,r,u)}}function k(n){return function(t,e,r){return n(P.eachOfSeries,t,e,r)}}function b(t,e,r,u){u=i(u||n),e=e||[];var c=o(e)?[]:{};t(e,function(n,t,e){r(n,function(n,r){c[t]=r,e(n)})},function(n){u(n,c)})}function w(n,t,e,r){var u=[];n(t,function(n,t,r){e(n,function(e){e&&u.push({index:t,value:n}),r()})},function(){r(a(u.sort(function(n,t){return n.index-t.index}),function(n){return n.value}))})}function O(n,t,e,r){w(n,t,function(n,t){e(n,function(n){t(!n)})},r)}function S(n,t,e){return function(r,u,i,o){function c(){o&&o(e(!1,void 0))}function a(n,r,u){return o?void i(n,function(r){o&&t(r)&&(o(e(!0,n)),o=i=!1),u()}):u()}arguments.length>3?n(r,u,a,c):(o=i,i=u,n(r,a,c))}}function E(n,t){return t}function L(t,e,r){r=r||n;var u=o(e)?[]:{};t(e,function(n,t,e){n(m(function(n,r){r.length<=1&&(r=r[0]),u[t]=r,e(n)}))},function(n){r(n,u)})}function j(n,t,e,r){var u=[];n(t,function(n,t,r){e(n,function(n,t){u=u.concat(t||[]),r(n)})},function(n){r(n,u)})}function I(t,e,r){function i(t,e,r,u){if(null!=u&&"function"!=typeof u)throw new Error("task callback must be a function");return t.started=!0,M(e)||(e=[e]),0===e.length&&t.idle()?P.setImmediate(function(){t.drain()}):(c(e,function(e){var i={data:e,callback:u||n};r?t.tasks.unshift(i):t.tasks.push(i),t.tasks.length===t.concurrency&&t.saturated()}),void P.setImmediate(t.process))}function o(n,t){return function(){f-=1;var e=!1,r=arguments;c(t,function(n){c(l,function(t,r){t!==n||e||(l.splice(r,1),e=!0)}),n.callback.apply(n,r)}),n.tasks.length+f===0&&n.drain(),n.process()}}if(null==e)e=1;else if(0===e)throw new Error("Concurrency must not be zero");var f=0,l=[],s={tasks:[],concurrency:e,payload:r,saturated:n,empty:n,drain:n,started:!1,paused:!1,push:function(n,t){i(s,n,!1,t)},kill:function(){s.drain=n,s.tasks=[]},unshift:function(n,t){i(s,n,!0,t)},process:function(){for(;!s.paused&&f<s.concurrency&&s.tasks.length;){var n=s.payload?s.tasks.splice(0,s.payload):s.tasks.splice(0,s.tasks.length),e=a(n,function(n){return n.data});0===s.tasks.length&&s.empty(),f+=1,l.push(n[0]);var r=u(o(s,n));t(e,r)}},length:function(){return s.tasks.length},running:function(){return f},workersList:function(){return l},idle:function(){return s.tasks.length+f===0},pause:function(){s.paused=!0},resume:function(){if(s.paused!==!1){s.paused=!1;for(var n=Math.min(s.concurrency,s.tasks.length),t=1;n>=t;t++)P.setImmediate(s.process)}}};return s}function x(n){return m(function(t,e){t.apply(null,e.concat([m(function(t,e){"object"==typeof console&&(t?console.error&&console.error(t):console[n]&&c(e,function(t){console[n](t)}))})]))})}function A(n){return function(t,e,r){n(f(t),e,r)}}function T(n){return m(function(t,e){var r=m(function(e){var r=this,u=e.pop();return n(t,function(n,t,u){n.apply(r,e.concat([u]))},u)});return e.length?r.apply(this,e):r})}function z(n){return m(function(t){var e=t.pop();t.push(function(){var n=arguments;r?P.setImmediate(function(){e.apply(null,n)}):e.apply(null,n)});var r=!0;n.apply(this,t),r=!1})}var q,P={},C="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||this;null!=C&&(q=C.async),P.noConflict=function(){return C.async=q,P};var H=Object.prototype.toString,M=Array.isArray||function(n){return"[object Array]"===H.call(n)},U=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},W=Object.keys||function(n){var t=[];for(var e in n)n.hasOwnProperty(e)&&t.push(e);return t},B="function"==typeof setImmediate&&setImmediate,D=B?function(n){B(n)}:function(n){setTimeout(n,0)};"object"==typeof process&&"function"==typeof process.nextTick?P.nextTick=process.nextTick:P.nextTick=D,P.setImmediate=B?D:P.nextTick,P.forEach=P.each=function(n,t,e){return P.eachOf(n,y(t),e)},P.forEachSeries=P.eachSeries=function(n,t,e){return P.eachOfSeries(n,y(t),e)},P.forEachLimit=P.eachLimit=function(n,t,e,r){return v(t)(n,y(e),r)},P.forEachOf=P.eachOf=function(t,e,r){function o(n){f--,n?r(n):null===c&&0>=f&&r(null)}r=i(r||n),t=t||[];for(var c,a=h(t),f=0;null!=(c=a());)f+=1,e(t[c],c,u(o));0===f&&r(null)},P.forEachOfSeries=P.eachOfSeries=function(t,e,r){function o(){var n=!0;return null===a?r(null):(e(t[a],a,u(function(t){if(t)r(t);else{if(a=c(),null===a)return r(null);n?P.setImmediate(o):o()}})),void(n=!1))}r=i(r||n),t=t||[];var c=h(t),a=c();o()},P.forEachOfLimit=P.eachOfLimit=function(n,t,e,r){v(t)(n,e,r)},P.map=d(b),P.mapSeries=k(b),P.mapLimit=g(b),P.inject=P.foldl=P.reduce=function(n,t,e,r){P.eachOfSeries(n,function(n,r,u){e(t,n,function(n,e){t=e,u(n)})},function(n){r(n,t)})},P.foldr=P.reduceRight=function(n,e,r,u){var i=a(n,t).reverse();P.reduce(i,e,r,u)},P.transform=function(n,t,e,r){3===arguments.length&&(r=e,e=t,t=M(n)?[]:{}),P.eachOf(n,function(n,r,u){e(t,n,r,u)},function(n){r(n,t)})},P.select=P.filter=d(w),P.selectLimit=P.filterLimit=g(w),P.selectSeries=P.filterSeries=k(w),P.reject=d(O),P.rejectLimit=g(O),P.rejectSeries=k(O),P.any=P.some=S(P.eachOf,e,t),P.someLimit=S(P.eachOfLimit,e,t),P.all=P.every=S(P.eachOf,r,r),P.everyLimit=S(P.eachOfLimit,r,r),P.detect=S(P.eachOf,t,E),P.detectSeries=S(P.eachOfSeries,t,E),P.detectLimit=S(P.eachOfLimit,t,E),P.sortBy=function(n,t,e){function r(n,t){var e=n.criteria,r=t.criteria;return r>e?-1:e>r?1:0}P.map(n,function(n,e){t(n,function(t,r){t?e(t):e(null,{value:n,criteria:r})})},function(n,t){return n?e(n):void e(null,a(t.sort(r),function(n){return n.value}))})},P.auto=function(t,e,r){function u(n){g.unshift(n)}function o(n){var t=p(g,n);t>=0&&g.splice(t,1)}function a(){h--,c(g.slice(0),function(n){n()})}"function"==typeof arguments[1]&&(r=e,e=null),r=i(r||n);var f=W(t),h=f.length;if(!h)return r(null);e||(e=h);var y={},v=0,d=!1,g=[];u(function(){h||r(null,y)}),c(f,function(n){function i(){return e>v&&l(k,function(n,t){return n&&y.hasOwnProperty(t)},!0)&&!y.hasOwnProperty(n)}function c(){i()&&(v++,o(c),h[h.length-1](g,y))}if(!d){for(var f,h=M(t[n])?t[n]:[t[n]],g=m(function(t,e){if(v--,e.length<=1&&(e=e[0]),t){var u={};s(y,function(n,t){u[t]=n}),u[n]=e,d=!0,r(t,u)}else y[n]=e,P.setImmediate(a)}),k=h.slice(0,h.length-1),b=k.length;b--;){if(!(f=t[k[b]]))throw new Error("Has nonexistent dependency in "+k.join(", "));if(M(f)&&p(f,n)>=0)throw new Error("Has cyclic dependencies")}i()?(v++,h[h.length-1](g,y)):u(c)}})},P.retry=function(n,t,e){function r(n,t){if("number"==typeof t)n.times=parseInt(t,10)||i;else{if("object"!=typeof t)throw new Error("Unsupported argument type for 'times': "+typeof t);n.times=parseInt(t.times,10)||i,n.interval=parseInt(t.interval,10)||o}}function u(n,t){function e(n,e){return function(r){n(function(n,t){r(!n||e,{err:n,result:t})},t)}}function r(n){return function(t){setTimeout(function(){t(null)},n)}}for(;a.times;){var u=!(a.times-=1);c.push(e(a.task,u)),!u&&a.interval>0&&c.push(r(a.interval))}P.series(c,function(t,e){e=e[e.length-1],(n||a.callback)(e.err,e.result)})}var i=5,o=0,c=[],a={times:i,interval:o},f=arguments.length;if(1>f||f>3)throw new Error("Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)");return 2>=f&&"function"==typeof n&&(e=t,t=n),"function"!=typeof n&&r(a,n),a.callback=e,a.task=t,a.callback?u():u},P.waterfall=function(t,e){function r(n){return m(function(t,u){if(t)e.apply(null,[t].concat(u));else{var i=n.next();i?u.push(r(i)):u.push(e),z(n).apply(null,u)}})}if(e=i(e||n),!M(t)){var u=new Error("First argument to waterfall must be an array of functions");return e(u)}return t.length?void r(P.iterator(t))():e()},P.parallel=function(n,t){L(P.eachOf,n,t)},P.parallelLimit=function(n,t,e){L(v(t),n,e)},P.series=function(n,t){L(P.eachOfSeries,n,t)},P.iterator=function(n){function t(e){function r(){return n.length&&n[e].apply(null,arguments),r.next()}return r.next=function(){return e<n.length-1?t(e+1):null},r}return t(0)},P.apply=m(function(n,t){return m(function(e){return n.apply(null,t.concat(e))})}),P.concat=d(j),P.concatSeries=k(j),P.whilst=function(t,e,r){if(r=r||n,t()){var u=m(function(n,i){n?r(n):t.apply(this,i)?e(u):r.apply(null,[null].concat(i))});e(u)}else r(null)},P.doWhilst=function(n,t,e){var r=0;return P.whilst(function(){return++r<=1||t.apply(this,arguments)},n,e)},P.until=function(n,t,e){return P.whilst(function(){return!n.apply(this,arguments)},t,e)},P.doUntil=function(n,t,e){return P.doWhilst(n,function(){return!t.apply(this,arguments)},e)},P.during=function(t,e,r){r=r||n;var u=m(function(n,e){n?r(n):(e.push(i),t.apply(this,e))}),i=function(n,t){n?r(n):t?e(u):r(null)};t(i)},P.doDuring=function(n,t,e){var r=0;P.during(function(n){r++<1?n(null,!0):t.apply(this,arguments)},n,e)},P.queue=function(n,t){var e=I(function(t,e){n(t[0],e)},t,1);return e},P.priorityQueue=function(t,e){function r(n,t){return n.priority-t.priority}function u(n,t,e){for(var r=-1,u=n.length-1;u>r;){var i=r+(u-r+1>>>1);e(t,n[i])>=0?r=i:u=i-1}return r}function i(t,e,i,o){if(null!=o&&"function"!=typeof o)throw new Error("task callback must be a function");return t.started=!0,M(e)||(e=[e]),0===e.length?P.setImmediate(function(){t.drain()}):void c(e,function(e){var c={data:e,priority:i,callback:"function"==typeof o?o:n};t.tasks.splice(u(t.tasks,c,r)+1,0,c),t.tasks.length===t.concurrency&&t.saturated(),P.setImmediate(t.process)})}var o=P.queue(t,e);return o.push=function(n,t,e){i(o,n,t,e)},delete o.unshift,o},P.cargo=function(n,t){return I(n,1,t)},P.log=x("log"),P.dir=x("dir"),P.memoize=function(n,e){var r={},u={},i=Object.prototype.hasOwnProperty;e=e||t;var o=m(function(t){var o=t.pop(),c=e.apply(null,t);i.call(r,c)?P.setImmediate(function(){o.apply(null,r[c])}):i.call(u,c)?u[c].push(o):(u[c]=[o],n.apply(null,t.concat([m(function(n){r[c]=n;var t=u[c];delete u[c];for(var e=0,i=t.length;i>e;e++)t[e].apply(null,n)})])))});return o.memo=r,o.unmemoized=n,o},P.unmemoize=function(n){return function(){return(n.unmemoized||n).apply(null,arguments)}},P.times=A(P.map),P.timesSeries=A(P.mapSeries),P.timesLimit=function(n,t,e,r){return P.mapLimit(f(n),t,e,r)},P.seq=function(){var t=arguments;return m(function(e){var r=this,u=e[e.length-1];"function"==typeof u?e.pop():u=n,P.reduce(t,e,function(n,t,e){t.apply(r,n.concat([m(function(n,t){e(n,t)})]))},function(n,t){u.apply(r,[n].concat(t))})})},P.compose=function(){return P.seq.apply(null,Array.prototype.reverse.call(arguments))},P.applyEach=T(P.eachOf),P.applyEachSeries=T(P.eachOfSeries),P.forever=function(t,e){function r(n){return n?i(n):void o(r)}var i=u(e||n),o=z(t);r()},P.ensureAsync=z,P.constant=m(function(n){var t=[null].concat(n);return function(n){return n.apply(this,t)}}),P.wrapSync=P.asyncify=function(n){return m(function(t){var e,r=t.pop();try{e=n.apply(this,t)}catch(u){return r(u)}U(e)&&"function"==typeof e.then?e.then(function(n){r(null,n)})["catch"](function(n){r(n.message?n:new Error(n))}):r(null,e)})},"object"==typeof module&&module.exports?module.exports=P:"function"==typeof define&&define.amd?define([],function(){return P}):C.async=P}();
-//# sourceMappingURL=dist/async.min.map
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js
deleted file mode 100644
index 31e7620fb6ffb3a9db48740e3f18921cb3d07c1f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/lib/async.js
+++ /dev/null
@@ -1,1265 +0,0 @@
-/*!
- * async
- * https://github.com/caolan/async
- *
- * Copyright 2010-2014 Caolan McMahon
- * Released under the MIT license
- */
-(function () {
-
-    var async = {};
-    function noop() {}
-    function identity(v) {
-        return v;
-    }
-    function toBool(v) {
-        return !!v;
-    }
-    function notId(v) {
-        return !v;
-    }
-
-    // global on the server, window in the browser
-    var previous_async;
-
-    // Establish the root object, `window` (`self`) in the browser, `global`
-    // on the server, or `this` in some virtual machines. We use `self`
-    // instead of `window` for `WebWorker` support.
-    var root = typeof self === 'object' && self.self === self && self ||
-            typeof global === 'object' && global.global === global && global ||
-            this;
-
-    if (root != null) {
-        previous_async = root.async;
-    }
-
-    async.noConflict = function () {
-        root.async = previous_async;
-        return async;
-    };
-
-    function only_once(fn) {
-        return function() {
-            if (fn === null) throw new Error("Callback was already called.");
-            fn.apply(this, arguments);
-            fn = null;
-        };
-    }
-
-    function _once(fn) {
-        return function() {
-            if (fn === null) return;
-            fn.apply(this, arguments);
-            fn = null;
-        };
-    }
-
-    //// cross-browser compatiblity functions ////
-
-    var _toString = Object.prototype.toString;
-
-    var _isArray = Array.isArray || function (obj) {
-        return _toString.call(obj) === '[object Array]';
-    };
-
-    // Ported from underscore.js isObject
-    var _isObject = function(obj) {
-        var type = typeof obj;
-        return type === 'function' || type === 'object' && !!obj;
-    };
-
-    function _isArrayLike(arr) {
-        return _isArray(arr) || (
-            // has a positive integer length property
-            typeof arr.length === "number" &&
-            arr.length >= 0 &&
-            arr.length % 1 === 0
-        );
-    }
-
-    function _arrayEach(arr, iterator) {
-        var index = -1,
-            length = arr.length;
-
-        while (++index < length) {
-            iterator(arr[index], index, arr);
-        }
-    }
-
-    function _map(arr, iterator) {
-        var index = -1,
-            length = arr.length,
-            result = Array(length);
-
-        while (++index < length) {
-            result[index] = iterator(arr[index], index, arr);
-        }
-        return result;
-    }
-
-    function _range(count) {
-        return _map(Array(count), function (v, i) { return i; });
-    }
-
-    function _reduce(arr, iterator, memo) {
-        _arrayEach(arr, function (x, i, a) {
-            memo = iterator(memo, x, i, a);
-        });
-        return memo;
-    }
-
-    function _forEachOf(object, iterator) {
-        _arrayEach(_keys(object), function (key) {
-            iterator(object[key], key);
-        });
-    }
-
-    function _indexOf(arr, item) {
-        for (var i = 0; i < arr.length; i++) {
-            if (arr[i] === item) return i;
-        }
-        return -1;
-    }
-
-    var _keys = Object.keys || function (obj) {
-        var keys = [];
-        for (var k in obj) {
-            if (obj.hasOwnProperty(k)) {
-                keys.push(k);
-            }
-        }
-        return keys;
-    };
-
-    function _keyIterator(coll) {
-        var i = -1;
-        var len;
-        var keys;
-        if (_isArrayLike(coll)) {
-            len = coll.length;
-            return function next() {
-                i++;
-                return i < len ? i : null;
-            };
-        } else {
-            keys = _keys(coll);
-            len = keys.length;
-            return function next() {
-                i++;
-                return i < len ? keys[i] : null;
-            };
-        }
-    }
-
-    // Similar to ES6's rest param (http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html)
-    // This accumulates the arguments passed into an array, after a given index.
-    // From underscore.js (https://github.com/jashkenas/underscore/pull/2140).
-    function _restParam(func, startIndex) {
-        startIndex = startIndex == null ? func.length - 1 : +startIndex;
-        return function() {
-            var length = Math.max(arguments.length - startIndex, 0);
-            var rest = Array(length);
-            for (var index = 0; index < length; index++) {
-                rest[index] = arguments[index + startIndex];
-            }
-            switch (startIndex) {
-                case 0: return func.call(this, rest);
-                case 1: return func.call(this, arguments[0], rest);
-            }
-            // Currently unused but handle cases outside of the switch statement:
-            // var args = Array(startIndex + 1);
-            // for (index = 0; index < startIndex; index++) {
-            //     args[index] = arguments[index];
-            // }
-            // args[startIndex] = rest;
-            // return func.apply(this, args);
-        };
-    }
-
-    function _withoutIndex(iterator) {
-        return function (value, index, callback) {
-            return iterator(value, callback);
-        };
-    }
-
-    //// exported async module functions ////
-
-    //// nextTick implementation with browser-compatible fallback ////
-
-    // capture the global reference to guard against fakeTimer mocks
-    var _setImmediate = typeof setImmediate === 'function' && setImmediate;
-
-    var _delay = _setImmediate ? function(fn) {
-        // not a direct alias for IE10 compatibility
-        _setImmediate(fn);
-    } : function(fn) {
-        setTimeout(fn, 0);
-    };
-
-    if (typeof process === 'object' && typeof process.nextTick === 'function') {
-        async.nextTick = process.nextTick;
-    } else {
-        async.nextTick = _delay;
-    }
-    async.setImmediate = _setImmediate ? _delay : async.nextTick;
-
-
-    async.forEach =
-    async.each = function (arr, iterator, callback) {
-        return async.eachOf(arr, _withoutIndex(iterator), callback);
-    };
-
-    async.forEachSeries =
-    async.eachSeries = function (arr, iterator, callback) {
-        return async.eachOfSeries(arr, _withoutIndex(iterator), callback);
-    };
-
-
-    async.forEachLimit =
-    async.eachLimit = function (arr, limit, iterator, callback) {
-        return _eachOfLimit(limit)(arr, _withoutIndex(iterator), callback);
-    };
-
-    async.forEachOf =
-    async.eachOf = function (object, iterator, callback) {
-        callback = _once(callback || noop);
-        object = object || [];
-
-        var iter = _keyIterator(object);
-        var key, completed = 0;
-
-        while ((key = iter()) != null) {
-            completed += 1;
-            iterator(object[key], key, only_once(done));
-        }
-
-        if (completed === 0) callback(null);
-
-        function done(err) {
-            completed--;
-            if (err) {
-                callback(err);
-            }
-            // Check key is null in case iterator isn't exhausted
-            // and done resolved synchronously.
-            else if (key === null && completed <= 0) {
-                callback(null);
-            }
-        }
-    };
-
-    async.forEachOfSeries =
-    async.eachOfSeries = function (obj, iterator, callback) {
-        callback = _once(callback || noop);
-        obj = obj || [];
-        var nextKey = _keyIterator(obj);
-        var key = nextKey();
-        function iterate() {
-            var sync = true;
-            if (key === null) {
-                return callback(null);
-            }
-            iterator(obj[key], key, only_once(function (err) {
-                if (err) {
-                    callback(err);
-                }
-                else {
-                    key = nextKey();
-                    if (key === null) {
-                        return callback(null);
-                    } else {
-                        if (sync) {
-                            async.setImmediate(iterate);
-                        } else {
-                            iterate();
-                        }
-                    }
-                }
-            }));
-            sync = false;
-        }
-        iterate();
-    };
-
-
-
-    async.forEachOfLimit =
-    async.eachOfLimit = function (obj, limit, iterator, callback) {
-        _eachOfLimit(limit)(obj, iterator, callback);
-    };
-
-    function _eachOfLimit(limit) {
-
-        return function (obj, iterator, callback) {
-            callback = _once(callback || noop);
-            obj = obj || [];
-            var nextKey = _keyIterator(obj);
-            if (limit <= 0) {
-                return callback(null);
-            }
-            var done = false;
-            var running = 0;
-            var errored = false;
-
-            (function replenish () {
-                if (done && running <= 0) {
-                    return callback(null);
-                }
-
-                while (running < limit && !errored) {
-                    var key = nextKey();
-                    if (key === null) {
-                        done = true;
-                        if (running <= 0) {
-                            callback(null);
-                        }
-                        return;
-                    }
-                    running += 1;
-                    iterator(obj[key], key, only_once(function (err) {
-                        running -= 1;
-                        if (err) {
-                            callback(err);
-                            errored = true;
-                        }
-                        else {
-                            replenish();
-                        }
-                    }));
-                }
-            })();
-        };
-    }
-
-
-    function doParallel(fn) {
-        return function (obj, iterator, callback) {
-            return fn(async.eachOf, obj, iterator, callback);
-        };
-    }
-    function doParallelLimit(fn) {
-        return function (obj, limit, iterator, callback) {
-            return fn(_eachOfLimit(limit), obj, iterator, callback);
-        };
-    }
-    function doSeries(fn) {
-        return function (obj, iterator, callback) {
-            return fn(async.eachOfSeries, obj, iterator, callback);
-        };
-    }
-
-    function _asyncMap(eachfn, arr, iterator, callback) {
-        callback = _once(callback || noop);
-        arr = arr || [];
-        var results = _isArrayLike(arr) ? [] : {};
-        eachfn(arr, function (value, index, callback) {
-            iterator(value, function (err, v) {
-                results[index] = v;
-                callback(err);
-            });
-        }, function (err) {
-            callback(err, results);
-        });
-    }
-
-    async.map = doParallel(_asyncMap);
-    async.mapSeries = doSeries(_asyncMap);
-    async.mapLimit = doParallelLimit(_asyncMap);
-
-    // reduce only has a series version, as doing reduce in parallel won't
-    // work in many situations.
-    async.inject =
-    async.foldl =
-    async.reduce = function (arr, memo, iterator, callback) {
-        async.eachOfSeries(arr, function (x, i, callback) {
-            iterator(memo, x, function (err, v) {
-                memo = v;
-                callback(err);
-            });
-        }, function (err) {
-            callback(err, memo);
-        });
-    };
-
-    async.foldr =
-    async.reduceRight = function (arr, memo, iterator, callback) {
-        var reversed = _map(arr, identity).reverse();
-        async.reduce(reversed, memo, iterator, callback);
-    };
-
-    async.transform = function (arr, memo, iterator, callback) {
-        if (arguments.length === 3) {
-            callback = iterator;
-            iterator = memo;
-            memo = _isArray(arr) ? [] : {};
-        }
-
-        async.eachOf(arr, function(v, k, cb) {
-            iterator(memo, v, k, cb);
-        }, function(err) {
-            callback(err, memo);
-        });
-    };
-
-    function _filter(eachfn, arr, iterator, callback) {
-        var results = [];
-        eachfn(arr, function (x, index, callback) {
-            iterator(x, function (v) {
-                if (v) {
-                    results.push({index: index, value: x});
-                }
-                callback();
-            });
-        }, function () {
-            callback(_map(results.sort(function (a, b) {
-                return a.index - b.index;
-            }), function (x) {
-                return x.value;
-            }));
-        });
-    }
-
-    async.select =
-    async.filter = doParallel(_filter);
-
-    async.selectLimit =
-    async.filterLimit = doParallelLimit(_filter);
-
-    async.selectSeries =
-    async.filterSeries = doSeries(_filter);
-
-    function _reject(eachfn, arr, iterator, callback) {
-        _filter(eachfn, arr, function(value, cb) {
-            iterator(value, function(v) {
-                cb(!v);
-            });
-        }, callback);
-    }
-    async.reject = doParallel(_reject);
-    async.rejectLimit = doParallelLimit(_reject);
-    async.rejectSeries = doSeries(_reject);
-
-    function _createTester(eachfn, check, getResult) {
-        return function(arr, limit, iterator, cb) {
-            function done() {
-                if (cb) cb(getResult(false, void 0));
-            }
-            function iteratee(x, _, callback) {
-                if (!cb) return callback();
-                iterator(x, function (v) {
-                    if (cb && check(v)) {
-                        cb(getResult(true, x));
-                        cb = iterator = false;
-                    }
-                    callback();
-                });
-            }
-            if (arguments.length > 3) {
-                eachfn(arr, limit, iteratee, done);
-            } else {
-                cb = iterator;
-                iterator = limit;
-                eachfn(arr, iteratee, done);
-            }
-        };
-    }
-
-    async.any =
-    async.some = _createTester(async.eachOf, toBool, identity);
-
-    async.someLimit = _createTester(async.eachOfLimit, toBool, identity);
-
-    async.all =
-    async.every = _createTester(async.eachOf, notId, notId);
-
-    async.everyLimit = _createTester(async.eachOfLimit, notId, notId);
-
-    function _findGetResult(v, x) {
-        return x;
-    }
-    async.detect = _createTester(async.eachOf, identity, _findGetResult);
-    async.detectSeries = _createTester(async.eachOfSeries, identity, _findGetResult);
-    async.detectLimit = _createTester(async.eachOfLimit, identity, _findGetResult);
-
-    async.sortBy = function (arr, iterator, callback) {
-        async.map(arr, function (x, callback) {
-            iterator(x, function (err, criteria) {
-                if (err) {
-                    callback(err);
-                }
-                else {
-                    callback(null, {value: x, criteria: criteria});
-                }
-            });
-        }, function (err, results) {
-            if (err) {
-                return callback(err);
-            }
-            else {
-                callback(null, _map(results.sort(comparator), function (x) {
-                    return x.value;
-                }));
-            }
-
-        });
-
-        function comparator(left, right) {
-            var a = left.criteria, b = right.criteria;
-            return a < b ? -1 : a > b ? 1 : 0;
-        }
-    };
-
-    async.auto = function (tasks, concurrency, callback) {
-        if (typeof arguments[1] === 'function') {
-            // concurrency is optional, shift the args.
-            callback = concurrency;
-            concurrency = null;
-        }
-        callback = _once(callback || noop);
-        var keys = _keys(tasks);
-        var remainingTasks = keys.length;
-        if (!remainingTasks) {
-            return callback(null);
-        }
-        if (!concurrency) {
-            concurrency = remainingTasks;
-        }
-
-        var results = {};
-        var runningTasks = 0;
-
-        var hasError = false;
-
-        var listeners = [];
-        function addListener(fn) {
-            listeners.unshift(fn);
-        }
-        function removeListener(fn) {
-            var idx = _indexOf(listeners, fn);
-            if (idx >= 0) listeners.splice(idx, 1);
-        }
-        function taskComplete() {
-            remainingTasks--;
-            _arrayEach(listeners.slice(0), function (fn) {
-                fn();
-            });
-        }
-
-        addListener(function () {
-            if (!remainingTasks) {
-                callback(null, results);
-            }
-        });
-
-        _arrayEach(keys, function (k) {
-            if (hasError) return;
-            var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];
-            var taskCallback = _restParam(function(err, args) {
-                runningTasks--;
-                if (args.length <= 1) {
-                    args = args[0];
-                }
-                if (err) {
-                    var safeResults = {};
-                    _forEachOf(results, function(val, rkey) {
-                        safeResults[rkey] = val;
-                    });
-                    safeResults[k] = args;
-                    hasError = true;
-
-                    callback(err, safeResults);
-                }
-                else {
-                    results[k] = args;
-                    async.setImmediate(taskComplete);
-                }
-            });
-            var requires = task.slice(0, task.length - 1);
-            // prevent dead-locks
-            var len = requires.length;
-            var dep;
-            while (len--) {
-                if (!(dep = tasks[requires[len]])) {
-                    throw new Error('Has nonexistent dependency in ' + requires.join(', '));
-                }
-                if (_isArray(dep) && _indexOf(dep, k) >= 0) {
-                    throw new Error('Has cyclic dependencies');
-                }
-            }
-            function ready() {
-                return runningTasks < concurrency && _reduce(requires, function (a, x) {
-                    return (a && results.hasOwnProperty(x));
-                }, true) && !results.hasOwnProperty(k);
-            }
-            if (ready()) {
-                runningTasks++;
-                task[task.length - 1](taskCallback, results);
-            }
-            else {
-                addListener(listener);
-            }
-            function listener() {
-                if (ready()) {
-                    runningTasks++;
-                    removeListener(listener);
-                    task[task.length - 1](taskCallback, results);
-                }
-            }
-        });
-    };
-
-
-
-    async.retry = function(times, task, callback) {
-        var DEFAULT_TIMES = 5;
-        var DEFAULT_INTERVAL = 0;
-
-        var attempts = [];
-
-        var opts = {
-            times: DEFAULT_TIMES,
-            interval: DEFAULT_INTERVAL
-        };
-
-        function parseTimes(acc, t){
-            if(typeof t === 'number'){
-                acc.times = parseInt(t, 10) || DEFAULT_TIMES;
-            } else if(typeof t === 'object'){
-                acc.times = parseInt(t.times, 10) || DEFAULT_TIMES;
-                acc.interval = parseInt(t.interval, 10) || DEFAULT_INTERVAL;
-            } else {
-                throw new Error('Unsupported argument type for \'times\': ' + typeof t);
-            }
-        }
-
-        var length = arguments.length;
-        if (length < 1 || length > 3) {
-            throw new Error('Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)');
-        } else if (length <= 2 && typeof times === 'function') {
-            callback = task;
-            task = times;
-        }
-        if (typeof times !== 'function') {
-            parseTimes(opts, times);
-        }
-        opts.callback = callback;
-        opts.task = task;
-
-        function wrappedTask(wrappedCallback, wrappedResults) {
-            function retryAttempt(task, finalAttempt) {
-                return function(seriesCallback) {
-                    task(function(err, result){
-                        seriesCallback(!err || finalAttempt, {err: err, result: result});
-                    }, wrappedResults);
-                };
-            }
-
-            function retryInterval(interval){
-                return function(seriesCallback){
-                    setTimeout(function(){
-                        seriesCallback(null);
-                    }, interval);
-                };
-            }
-
-            while (opts.times) {
-
-                var finalAttempt = !(opts.times-=1);
-                attempts.push(retryAttempt(opts.task, finalAttempt));
-                if(!finalAttempt && opts.interval > 0){
-                    attempts.push(retryInterval(opts.interval));
-                }
-            }
-
-            async.series(attempts, function(done, data){
-                data = data[data.length - 1];
-                (wrappedCallback || opts.callback)(data.err, data.result);
-            });
-        }
-
-        // If a callback is passed, run this as a controll flow
-        return opts.callback ? wrappedTask() : wrappedTask;
-    };
-
-    async.waterfall = function (tasks, callback) {
-        callback = _once(callback || noop);
-        if (!_isArray(tasks)) {
-            var err = new Error('First argument to waterfall must be an array of functions');
-            return callback(err);
-        }
-        if (!tasks.length) {
-            return callback();
-        }
-        function wrapIterator(iterator) {
-            return _restParam(function (err, args) {
-                if (err) {
-                    callback.apply(null, [err].concat(args));
-                }
-                else {
-                    var next = iterator.next();
-                    if (next) {
-                        args.push(wrapIterator(next));
-                    }
-                    else {
-                        args.push(callback);
-                    }
-                    ensureAsync(iterator).apply(null, args);
-                }
-            });
-        }
-        wrapIterator(async.iterator(tasks))();
-    };
-
-    function _parallel(eachfn, tasks, callback) {
-        callback = callback || noop;
-        var results = _isArrayLike(tasks) ? [] : {};
-
-        eachfn(tasks, function (task, key, callback) {
-            task(_restParam(function (err, args) {
-                if (args.length <= 1) {
-                    args = args[0];
-                }
-                results[key] = args;
-                callback(err);
-            }));
-        }, function (err) {
-            callback(err, results);
-        });
-    }
-
-    async.parallel = function (tasks, callback) {
-        _parallel(async.eachOf, tasks, callback);
-    };
-
-    async.parallelLimit = function(tasks, limit, callback) {
-        _parallel(_eachOfLimit(limit), tasks, callback);
-    };
-
-    async.series = function(tasks, callback) {
-        _parallel(async.eachOfSeries, tasks, callback);
-    };
-
-    async.iterator = function (tasks) {
-        function makeCallback(index) {
-            function fn() {
-                if (tasks.length) {
-                    tasks[index].apply(null, arguments);
-                }
-                return fn.next();
-            }
-            fn.next = function () {
-                return (index < tasks.length - 1) ? makeCallback(index + 1): null;
-            };
-            return fn;
-        }
-        return makeCallback(0);
-    };
-
-    async.apply = _restParam(function (fn, args) {
-        return _restParam(function (callArgs) {
-            return fn.apply(
-                null, args.concat(callArgs)
-            );
-        });
-    });
-
-    function _concat(eachfn, arr, fn, callback) {
-        var result = [];
-        eachfn(arr, function (x, index, cb) {
-            fn(x, function (err, y) {
-                result = result.concat(y || []);
-                cb(err);
-            });
-        }, function (err) {
-            callback(err, result);
-        });
-    }
-    async.concat = doParallel(_concat);
-    async.concatSeries = doSeries(_concat);
-
-    async.whilst = function (test, iterator, callback) {
-        callback = callback || noop;
-        if (test()) {
-            var next = _restParam(function(err, args) {
-                if (err) {
-                    callback(err);
-                } else if (test.apply(this, args)) {
-                    iterator(next);
-                } else {
-                    callback.apply(null, [null].concat(args));
-                }
-            });
-            iterator(next);
-        } else {
-            callback(null);
-        }
-    };
-
-    async.doWhilst = function (iterator, test, callback) {
-        var calls = 0;
-        return async.whilst(function() {
-            return ++calls <= 1 || test.apply(this, arguments);
-        }, iterator, callback);
-    };
-
-    async.until = function (test, iterator, callback) {
-        return async.whilst(function() {
-            return !test.apply(this, arguments);
-        }, iterator, callback);
-    };
-
-    async.doUntil = function (iterator, test, callback) {
-        return async.doWhilst(iterator, function() {
-            return !test.apply(this, arguments);
-        }, callback);
-    };
-
-    async.during = function (test, iterator, callback) {
-        callback = callback || noop;
-
-        var next = _restParam(function(err, args) {
-            if (err) {
-                callback(err);
-            } else {
-                args.push(check);
-                test.apply(this, args);
-            }
-        });
-
-        var check = function(err, truth) {
-            if (err) {
-                callback(err);
-            } else if (truth) {
-                iterator(next);
-            } else {
-                callback(null);
-            }
-        };
-
-        test(check);
-    };
-
-    async.doDuring = function (iterator, test, callback) {
-        var calls = 0;
-        async.during(function(next) {
-            if (calls++ < 1) {
-                next(null, true);
-            } else {
-                test.apply(this, arguments);
-            }
-        }, iterator, callback);
-    };
-
-    function _queue(worker, concurrency, payload) {
-        if (concurrency == null) {
-            concurrency = 1;
-        }
-        else if(concurrency === 0) {
-            throw new Error('Concurrency must not be zero');
-        }
-        function _insert(q, data, pos, callback) {
-            if (callback != null && typeof callback !== "function") {
-                throw new Error("task callback must be a function");
-            }
-            q.started = true;
-            if (!_isArray(data)) {
-                data = [data];
-            }
-            if(data.length === 0 && q.idle()) {
-                // call drain immediately if there are no tasks
-                return async.setImmediate(function() {
-                    q.drain();
-                });
-            }
-            _arrayEach(data, function(task) {
-                var item = {
-                    data: task,
-                    callback: callback || noop
-                };
-
-                if (pos) {
-                    q.tasks.unshift(item);
-                } else {
-                    q.tasks.push(item);
-                }
-
-                if (q.tasks.length === q.concurrency) {
-                    q.saturated();
-                }
-            });
-            async.setImmediate(q.process);
-        }
-        function _next(q, tasks) {
-            return function(){
-                workers -= 1;
-
-                var removed = false;
-                var args = arguments;
-                _arrayEach(tasks, function (task) {
-                    _arrayEach(workersList, function (worker, index) {
-                        if (worker === task && !removed) {
-                            workersList.splice(index, 1);
-                            removed = true;
-                        }
-                    });
-
-                    task.callback.apply(task, args);
-                });
-                if (q.tasks.length + workers === 0) {
-                    q.drain();
-                }
-                q.process();
-            };
-        }
-
-        var workers = 0;
-        var workersList = [];
-        var q = {
-            tasks: [],
-            concurrency: concurrency,
-            payload: payload,
-            saturated: noop,
-            empty: noop,
-            drain: noop,
-            started: false,
-            paused: false,
-            push: function (data, callback) {
-                _insert(q, data, false, callback);
-            },
-            kill: function () {
-                q.drain = noop;
-                q.tasks = [];
-            },
-            unshift: function (data, callback) {
-                _insert(q, data, true, callback);
-            },
-            process: function () {
-                while(!q.paused && workers < q.concurrency && q.tasks.length){
-
-                    var tasks = q.payload ?
-                        q.tasks.splice(0, q.payload) :
-                        q.tasks.splice(0, q.tasks.length);
-
-                    var data = _map(tasks, function (task) {
-                        return task.data;
-                    });
-
-                    if (q.tasks.length === 0) {
-                        q.empty();
-                    }
-                    workers += 1;
-                    workersList.push(tasks[0]);
-                    var cb = only_once(_next(q, tasks));
-                    worker(data, cb);
-                }
-            },
-            length: function () {
-                return q.tasks.length;
-            },
-            running: function () {
-                return workers;
-            },
-            workersList: function () {
-                return workersList;
-            },
-            idle: function() {
-                return q.tasks.length + workers === 0;
-            },
-            pause: function () {
-                q.paused = true;
-            },
-            resume: function () {
-                if (q.paused === false) { return; }
-                q.paused = false;
-                var resumeCount = Math.min(q.concurrency, q.tasks.length);
-                // Need to call q.process once per concurrent
-                // worker to preserve full concurrency after pause
-                for (var w = 1; w <= resumeCount; w++) {
-                    async.setImmediate(q.process);
-                }
-            }
-        };
-        return q;
-    }
-
-    async.queue = function (worker, concurrency) {
-        var q = _queue(function (items, cb) {
-            worker(items[0], cb);
-        }, concurrency, 1);
-
-        return q;
-    };
-
-    async.priorityQueue = function (worker, concurrency) {
-
-        function _compareTasks(a, b){
-            return a.priority - b.priority;
-        }
-
-        function _binarySearch(sequence, item, compare) {
-            var beg = -1,
-                end = sequence.length - 1;
-            while (beg < end) {
-                var mid = beg + ((end - beg + 1) >>> 1);
-                if (compare(item, sequence[mid]) >= 0) {
-                    beg = mid;
-                } else {
-                    end = mid - 1;
-                }
-            }
-            return beg;
-        }
-
-        function _insert(q, data, priority, callback) {
-            if (callback != null && typeof callback !== "function") {
-                throw new Error("task callback must be a function");
-            }
-            q.started = true;
-            if (!_isArray(data)) {
-                data = [data];
-            }
-            if(data.length === 0) {
-                // call drain immediately if there are no tasks
-                return async.setImmediate(function() {
-                    q.drain();
-                });
-            }
-            _arrayEach(data, function(task) {
-                var item = {
-                    data: task,
-                    priority: priority,
-                    callback: typeof callback === 'function' ? callback : noop
-                };
-
-                q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);
-
-                if (q.tasks.length === q.concurrency) {
-                    q.saturated();
-                }
-                async.setImmediate(q.process);
-            });
-        }
-
-        // Start with a normal queue
-        var q = async.queue(worker, concurrency);
-
-        // Override push to accept second parameter representing priority
-        q.push = function (data, priority, callback) {
-            _insert(q, data, priority, callback);
-        };
-
-        // Remove unshift function
-        delete q.unshift;
-
-        return q;
-    };
-
-    async.cargo = function (worker, payload) {
-        return _queue(worker, 1, payload);
-    };
-
-    function _console_fn(name) {
-        return _restParam(function (fn, args) {
-            fn.apply(null, args.concat([_restParam(function (err, args) {
-                if (typeof console === 'object') {
-                    if (err) {
-                        if (console.error) {
-                            console.error(err);
-                        }
-                    }
-                    else if (console[name]) {
-                        _arrayEach(args, function (x) {
-                            console[name](x);
-                        });
-                    }
-                }
-            })]));
-        });
-    }
-    async.log = _console_fn('log');
-    async.dir = _console_fn('dir');
-    /*async.info = _console_fn('info');
-    async.warn = _console_fn('warn');
-    async.error = _console_fn('error');*/
-
-    async.memoize = function (fn, hasher) {
-        var memo = {};
-        var queues = {};
-        var has = Object.prototype.hasOwnProperty;
-        hasher = hasher || identity;
-        var memoized = _restParam(function memoized(args) {
-            var callback = args.pop();
-            var key = hasher.apply(null, args);
-            if (has.call(memo, key)) {   
-                async.setImmediate(function () {
-                    callback.apply(null, memo[key]);
-                });
-            }
-            else if (has.call(queues, key)) {
-                queues[key].push(callback);
-            }
-            else {
-                queues[key] = [callback];
-                fn.apply(null, args.concat([_restParam(function (args) {
-                    memo[key] = args;
-                    var q = queues[key];
-                    delete queues[key];
-                    for (var i = 0, l = q.length; i < l; i++) {
-                        q[i].apply(null, args);
-                    }
-                })]));
-            }
-        });
-        memoized.memo = memo;
-        memoized.unmemoized = fn;
-        return memoized;
-    };
-
-    async.unmemoize = function (fn) {
-        return function () {
-            return (fn.unmemoized || fn).apply(null, arguments);
-        };
-    };
-
-    function _times(mapper) {
-        return function (count, iterator, callback) {
-            mapper(_range(count), iterator, callback);
-        };
-    }
-
-    async.times = _times(async.map);
-    async.timesSeries = _times(async.mapSeries);
-    async.timesLimit = function (count, limit, iterator, callback) {
-        return async.mapLimit(_range(count), limit, iterator, callback);
-    };
-
-    async.seq = function (/* functions... */) {
-        var fns = arguments;
-        return _restParam(function (args) {
-            var that = this;
-
-            var callback = args[args.length - 1];
-            if (typeof callback == 'function') {
-                args.pop();
-            } else {
-                callback = noop;
-            }
-
-            async.reduce(fns, args, function (newargs, fn, cb) {
-                fn.apply(that, newargs.concat([_restParam(function (err, nextargs) {
-                    cb(err, nextargs);
-                })]));
-            },
-            function (err, results) {
-                callback.apply(that, [err].concat(results));
-            });
-        });
-    };
-
-    async.compose = function (/* functions... */) {
-        return async.seq.apply(null, Array.prototype.reverse.call(arguments));
-    };
-
-
-    function _applyEach(eachfn) {
-        return _restParam(function(fns, args) {
-            var go = _restParam(function(args) {
-                var that = this;
-                var callback = args.pop();
-                return eachfn(fns, function (fn, _, cb) {
-                    fn.apply(that, args.concat([cb]));
-                },
-                callback);
-            });
-            if (args.length) {
-                return go.apply(this, args);
-            }
-            else {
-                return go;
-            }
-        });
-    }
-
-    async.applyEach = _applyEach(async.eachOf);
-    async.applyEachSeries = _applyEach(async.eachOfSeries);
-
-
-    async.forever = function (fn, callback) {
-        var done = only_once(callback || noop);
-        var task = ensureAsync(fn);
-        function next(err) {
-            if (err) {
-                return done(err);
-            }
-            task(next);
-        }
-        next();
-    };
-
-    function ensureAsync(fn) {
-        return _restParam(function (args) {
-            var callback = args.pop();
-            args.push(function () {
-                var innerArgs = arguments;
-                if (sync) {
-                    async.setImmediate(function () {
-                        callback.apply(null, innerArgs);
-                    });
-                } else {
-                    callback.apply(null, innerArgs);
-                }
-            });
-            var sync = true;
-            fn.apply(this, args);
-            sync = false;
-        });
-    }
-
-    async.ensureAsync = ensureAsync;
-
-    async.constant = _restParam(function(values) {
-        var args = [null].concat(values);
-        return function (callback) {
-            return callback.apply(this, args);
-        };
-    });
-
-    async.wrapSync =
-    async.asyncify = function asyncify(func) {
-        return _restParam(function (args) {
-            var callback = args.pop();
-            var result;
-            try {
-                result = func.apply(this, args);
-            } catch (e) {
-                return callback(e);
-            }
-            // if result is Promise object
-            if (_isObject(result) && typeof result.then === "function") {
-                result.then(function(value) {
-                    callback(null, value);
-                })["catch"](function(err) {
-                    callback(err.message ? err : new Error(err));
-                });
-            } else {
-                callback(null, result);
-            }
-        });
-    };
-
-    // Node.js
-    if (typeof module === 'object' && module.exports) {
-        module.exports = async;
-    }
-    // AMD / RequireJS
-    else if (typeof define === 'function' && define.amd) {
-        define([], function () {
-            return async;
-        });
-    }
-    // included directly via <script> tag
-    else {
-        root.async = async;
-    }
-
-}());
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/package.json
deleted file mode 100644
index e33ea16a4b58e5da00a254dad4433f8ad7aec9c0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/node_modules/async/package.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
-  "_from": "async@>=1.5.2 <2.0.0",
-  "_id": "async@1.5.2",
-  "_location": "/serialport/node-pre-gyp/request/form-data/async",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/form-data"
-  ],
-  "_resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
-  "_shasum": "ec6a61ae56480c0c3cb241c95618e20892f9672a",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "Caolan McMahon"
-  },
-  "bugs": {
-    "url": "https://github.com/caolan/async/issues"
-  },
-  "dependencies": {},
-  "description": "Higher-order functions and common patterns for asynchronous code",
-  "devDependencies": {
-    "benchmark": "github:bestiejs/benchmark.js",
-    "bluebird": "^2.9.32",
-    "chai": "^3.1.0",
-    "coveralls": "^2.11.2",
-    "es6-promise": "^2.3.0",
-    "jscs": "^1.13.1",
-    "jshint": "~2.8.0",
-    "karma": "^0.13.2",
-    "karma-browserify": "^4.2.1",
-    "karma-firefox-launcher": "^0.1.6",
-    "karma-mocha": "^0.2.0",
-    "karma-mocha-reporter": "^1.0.2",
-    "lodash": "^3.9.0",
-    "mkdirp": "~0.5.1",
-    "mocha": "^2.2.5",
-    "native-promise-only": "^0.8.0-a",
-    "nodeunit": ">0.0.0",
-    "nyc": "^2.1.0",
-    "rsvp": "^3.0.18",
-    "semver": "^4.3.6",
-    "uglify-js": "~2.4.0",
-    "xyz": "^0.5.0",
-    "yargs": "~3.9.1"
-  },
-  "files": [
-    "dist/async.js",
-    "dist/async.min.js",
-    "lib"
-  ],
-  "homepage": "https://github.com/caolan/async#readme",
-  "jam": {
-    "categories": [
-      "Utilities"
-    ],
-    "include": [
-      "LICENSE",
-      "README.md",
-      "lib/async.js"
-    ],
-    "main": "lib/async.js"
-  },
-  "keywords": [
-    "async",
-    "callback",
-    "module",
-    "utility"
-  ],
-  "license": "MIT",
-  "main": "lib/async.js",
-  "name": "async",
-  "optionalDependencies": {},
-  "readme": "# Async.js\n\n[![Build Status via Travis CI](https://travis-ci.org/caolan/async.svg?branch=master)](https://travis-ci.org/caolan/async)\n[![NPM version](http://img.shields.io/npm/v/async.svg)](https://www.npmjs.org/package/async)\n[![Coverage Status](https://coveralls.io/repos/caolan/async/badge.svg?branch=master)](https://coveralls.io/r/caolan/async?branch=master)\n[![Join the chat at https://gitter.im/caolan/async](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/caolan/async?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n\nAsync is a utility module which provides straight-forward, powerful functions\nfor working with asynchronous JavaScript. Although originally designed for\nuse with [Node.js](http://nodejs.org) and installable via `npm install async`,\nit can also be used directly in the browser.\n\nAsync is also installable via:\n\n- [bower](http://bower.io/): `bower install async`\n- [component](https://github.com/component/component): `component install\n  caolan/async`\n- [jam](http://jamjs.org/): `jam install async`\n- [spm](http://spmjs.io/): `spm install async`\n\nAsync provides around 20 functions that include the usual 'functional'\nsuspects (`map`, `reduce`, `filter`, `each`…) as well as some common patterns\nfor asynchronous control flow (`parallel`, `series`, `waterfall`…). All these\nfunctions assume you follow the Node.js convention of providing a single\ncallback as the last argument of your `async` function.\n\n\n## Quick Examples\n\n```javascript\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n    // results is now an array of stats for each file\n});\n\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n    // results now equals an array of the existing files\n});\n\nasync.parallel([\n    function(){ ... },\n    function(){ ... }\n], callback);\n\nasync.series([\n    function(){ ... },\n    function(){ ... }\n]);\n```\n\nThere are many more functions available so take a look at the docs below for a\nfull list. This module aims to be comprehensive, so if you feel anything is\nmissing please create a GitHub issue for it.\n\n## Common Pitfalls <sub>[(StackOverflow)](http://stackoverflow.com/questions/tagged/async.js)</sub>\n### Synchronous iteration functions\n\nIf you get an error like `RangeError: Maximum call stack size exceeded.` or other stack overflow issues when using async, you are likely using a synchronous iterator.  By *synchronous* we mean a function that calls its callback on the same tick in the javascript event loop, without doing any I/O or using any timers.  Calling many callbacks iteratively will quickly overflow the stack. If you run into this issue, just defer your callback with `async.setImmediate` to start a new call stack on the next tick of the event loop.\n\nThis can also arise by accident if you callback early in certain cases:\n\n```js\nasync.eachSeries(hugeArray, function iterator(item, callback) {\n  if (inCache(item)) {\n    callback(null, cache[item]); // if many items are cached, you'll overflow\n  } else {\n    doSomeIO(item, callback);\n  }\n}, function done() {\n  //...\n});\n```\n\nJust change it to:\n\n```js\nasync.eachSeries(hugeArray, function iterator(item, callback) {\n  if (inCache(item)) {\n    async.setImmediate(function () {\n      callback(null, cache[item]);\n    });\n  } else {\n    doSomeIO(item, callback);\n  //...\n```\n\nAsync guards against synchronous functions in some, but not all, cases.  If you are still running into stack overflows, you can defer as suggested above, or wrap functions with [`async.ensureAsync`](#ensureAsync)  Functions that are asynchronous by their nature do not have this problem and don't need the extra callback deferral.\n\nIf JavaScript's event loop is still a bit nebulous, check out [this article](http://blog.carbonfive.com/2013/10/27/the-javascript-event-loop-explained/) or [this talk](http://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html) for more detailed information about how it works.\n\n\n### Multiple callbacks\n\nMake sure to always `return` when calling a callback early, otherwise you will cause multiple callbacks and unpredictable behavior in many cases.\n\n```js\nasync.waterfall([\n    function (callback) {\n        getSomething(options, function (err, result) {\n          if (err) {\n            callback(new Error(\"failed getting something:\" + err.message));\n            // we should return here\n          }\n          // since we did not return, this callback still will be called and\n          // `processData` will be called twice\n          callback(null, result);\n        });\n    },\n    processData\n], done)\n```\n\nIt is always good practice to `return callback(err, result)`  whenever a callback call is not the last statement of a function.\n\n\n### Binding a context to an iterator\n\nThis section is really about `bind`, not about `async`. If you are wondering how to\nmake `async` execute your iterators in a given context, or are confused as to why\na method of another library isn't working as an iterator, study this example:\n\n```js\n// Here is a simple object with an (unnecessarily roundabout) squaring method\nvar AsyncSquaringLibrary = {\n  squareExponent: 2,\n  square: function(number, callback){\n    var result = Math.pow(number, this.squareExponent);\n    setTimeout(function(){\n      callback(null, result);\n    }, 200);\n  }\n};\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square, function(err, result){\n  // result is [NaN, NaN, NaN]\n  // This fails because the `this.squareExponent` expression in the square\n  // function is not evaluated in the context of AsyncSquaringLibrary, and is\n  // therefore undefined.\n});\n\nasync.map([1, 2, 3], AsyncSquaringLibrary.square.bind(AsyncSquaringLibrary), function(err, result){\n  // result is [1, 4, 9]\n  // With the help of bind we can attach a context to the iterator before\n  // passing it to async. Now the square function will be executed in its\n  // 'home' AsyncSquaringLibrary context and the value of `this.squareExponent`\n  // will be as expected.\n});\n```\n\n## Download\n\nThe source is available for download from\n[GitHub](https://github.com/caolan/async/blob/master/lib/async.js).\nAlternatively, you can install using Node Package Manager (`npm`):\n\n    npm install async\n\nAs well as using Bower:\n\n    bower install async\n\n__Development:__ [async.js](https://github.com/caolan/async/raw/master/lib/async.js) - 29.6kb Uncompressed\n\n## In the Browser\n\nSo far it's been tested in IE6, IE7, IE8, FF3.6 and Chrome 5.\n\nUsage:\n\n```html\n<script type=\"text/javascript\" src=\"async.js\"></script>\n<script type=\"text/javascript\">\n\n    async.map(data, asyncProcess, function(err, results){\n        alert(results);\n    });\n\n</script>\n```\n\n## Documentation\n\nSome functions are also available in the following forms:\n* `<name>Series` - the same as `<name>` but runs only a single async operation at a time\n* `<name>Limit` - the same as `<name>` but runs a maximum of `limit` async operations at a time\n\n### Collections\n\n* [`each`](#each), `eachSeries`, `eachLimit`\n* [`forEachOf`](#forEachOf), `forEachOfSeries`, `forEachOfLimit`\n* [`map`](#map), `mapSeries`, `mapLimit`\n* [`filter`](#filter), `filterSeries`, `filterLimit`\n* [`reject`](#reject), `rejectSeries`, `rejectLimit`\n* [`reduce`](#reduce), [`reduceRight`](#reduceRight)\n* [`detect`](#detect), `detectSeries`, `detectLimit`\n* [`sortBy`](#sortBy)\n* [`some`](#some), `someLimit`\n* [`every`](#every), `everyLimit`\n* [`concat`](#concat), `concatSeries`\n\n### Control Flow\n\n* [`series`](#seriestasks-callback)\n* [`parallel`](#parallel), `parallelLimit`\n* [`whilst`](#whilst), [`doWhilst`](#doWhilst)\n* [`until`](#until), [`doUntil`](#doUntil)\n* [`during`](#during), [`doDuring`](#doDuring)\n* [`forever`](#forever)\n* [`waterfall`](#waterfall)\n* [`compose`](#compose)\n* [`seq`](#seq)\n* [`applyEach`](#applyEach), `applyEachSeries`\n* [`queue`](#queue), [`priorityQueue`](#priorityQueue)\n* [`cargo`](#cargo)\n* [`auto`](#auto)\n* [`retry`](#retry)\n* [`iterator`](#iterator)\n* [`times`](#times), `timesSeries`, `timesLimit`\n\n### Utils\n\n* [`apply`](#apply)\n* [`nextTick`](#nextTick)\n* [`memoize`](#memoize)\n* [`unmemoize`](#unmemoize)\n* [`ensureAsync`](#ensureAsync)\n* [`constant`](#constant)\n* [`asyncify`](#asyncify)\n* [`wrapSync`](#wrapSync)\n* [`log`](#log)\n* [`dir`](#dir)\n* [`noConflict`](#noConflict)\n\n## Collections\n\n<a name=\"forEach\" />\n<a name=\"each\" />\n### each(arr, iterator, [callback])\n\nApplies the function `iterator` to each item in `arr`, in parallel.\nThe `iterator` is called with an item from the list, and a callback for when it\nhas finished. If the `iterator` passes an error to its `callback`, the main\n`callback` (for the `each` function) is immediately called with the error.\n\nNote, that since this function applies `iterator` to each item in parallel,\nthere is no guarantee that the iterator functions will complete in order.\n\n__Arguments__\n\n* `arr` - An array to iterate over.\n* `iterator(item, callback)` - A function to apply to each item in `arr`.\n  The iterator is passed a `callback(err)` which must be called once it has\n  completed. If no error has occurred, the `callback` should be run without\n  arguments or with an explicit `null` argument.  The array index is not passed\n  to the iterator.  If you need the index, use [`forEachOf`](#forEachOf).\n* `callback(err)` - *Optional* A callback which is called when all `iterator` functions\n  have finished, or an error occurs.\n\n__Examples__\n\n\n```js\n// assuming openFiles is an array of file names and saveFile is a function\n// to save the modified contents of that file:\n\nasync.each(openFiles, saveFile, function(err){\n    // if any of the saves produced an error, err would equal that error\n});\n```\n\n```js\n// assuming openFiles is an array of file names\n\nasync.each(openFiles, function(file, callback) {\n\n  // Perform operation on file here.\n  console.log('Processing file ' + file);\n\n  if( file.length > 32 ) {\n    console.log('This file name is too long');\n    callback('File name too long');\n  } else {\n    // Do work to process file here\n    console.log('File processed');\n    callback();\n  }\n}, function(err){\n    // if any of the file processing produced an error, err would equal that error\n    if( err ) {\n      // One of the iterations produced an error.\n      // All processing will now stop.\n      console.log('A file failed to process');\n    } else {\n      console.log('All files have been processed successfully');\n    }\n});\n```\n\n__Related__\n\n* eachSeries(arr, iterator, [callback])\n* eachLimit(arr, limit, iterator, [callback])\n\n---------------------------------------\n\n<a name=\"forEachOf\" />\n<a name=\"eachOf\" />\n\n### forEachOf(obj, iterator, [callback])\n\nLike `each`, except that it iterates over objects, and passes the key as the second argument to the iterator.\n\n__Arguments__\n\n* `obj` - An object or array to iterate over.\n* `iterator(item, key, callback)` - A function to apply to each item in `obj`.\nThe `key` is the item's key, or index in the case of an array. The iterator is\npassed a `callback(err)` which must be called once it has completed. If no\nerror has occurred, the callback should be run without arguments or with an\nexplicit `null` argument.\n* `callback(err)` - *Optional* A callback which is called when all `iterator` functions have finished, or an error occurs.\n\n__Example__\n\n```js\nvar obj = {dev: \"/dev.json\", test: \"/test.json\", prod: \"/prod.json\"};\nvar configs = {};\n\nasync.forEachOf(obj, function (value, key, callback) {\n  fs.readFile(__dirname + value, \"utf8\", function (err, data) {\n    if (err) return callback(err);\n    try {\n      configs[key] = JSON.parse(data);\n    } catch (e) {\n      return callback(e);\n    }\n    callback();\n  })\n}, function (err) {\n  if (err) console.error(err.message);\n  // configs is now a map of JSON data\n  doSomethingWith(configs);\n})\n```\n\n__Related__\n\n* forEachOfSeries(obj, iterator, [callback])\n* forEachOfLimit(obj, limit, iterator, [callback])\n\n---------------------------------------\n\n<a name=\"map\" />\n### map(arr, iterator, [callback])\n\nProduces a new array of values by mapping each value in `arr` through\nthe `iterator` function. The `iterator` is called with an item from `arr` and a\ncallback for when it has finished processing. Each of these callback takes 2 arguments:\nan `error`, and the transformed item from `arr`. If `iterator` passes an error to its\ncallback, the main `callback` (for the `map` function) is immediately called with the error.\n\nNote, that since this function applies the `iterator` to each item in parallel,\nthere is no guarantee that the `iterator` functions will complete in order.\nHowever, the results array will be in the same order as the original `arr`.\n\n__Arguments__\n\n* `arr` - An array to iterate over.\n* `iterator(item, callback)` - A function to apply to each item in `arr`.\n  The iterator is passed a `callback(err, transformed)` which must be called once\n  it has completed with an error (which can be `null`) and a transformed item.\n* `callback(err, results)` - *Optional* A callback which is called when all `iterator`\n  functions have finished, or an error occurs. Results is an array of the\n  transformed items from the `arr`.\n\n__Example__\n\n```js\nasync.map(['file1','file2','file3'], fs.stat, function(err, results){\n    // results is now an array of stats for each file\n});\n```\n\n__Related__\n* mapSeries(arr, iterator, [callback])\n* mapLimit(arr, limit, iterator, [callback])\n\n---------------------------------------\n\n<a name=\"select\" />\n<a name=\"filter\" />\n### filter(arr, iterator, [callback])\n\n__Alias:__ `select`\n\nReturns a new array of all the values in `arr` which pass an async truth test.\n_The callback for each `iterator` call only accepts a single argument of `true` or\n`false`; it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like `fs.exists`. This operation is\nperformed in parallel, but the results array will be in the same order as the\noriginal.\n\n__Arguments__\n\n* `arr` - An array to iterate over.\n* `iterator(item, callback)` - A truth test to apply to each item in `arr`.\n  The `iterator` is passed a `callback(truthValue)`, which must be called with a\n  boolean argument once it has completed.\n* `callback(results)` - *Optional* A callback which is called after all the `iterator`\n  functions have finished.\n\n__Example__\n\n```js\nasync.filter(['file1','file2','file3'], fs.exists, function(results){\n    // results now equals an array of the existing files\n});\n```\n\n__Related__\n\n* filterSeries(arr, iterator, [callback])\n* filterLimit(arr, limit, iterator, [callback])\n\n---------------------------------------\n\n<a name=\"reject\" />\n### reject(arr, iterator, [callback])\n\nThe opposite of [`filter`](#filter). Removes values that pass an `async` truth test.\n\n__Related__\n\n* rejectSeries(arr, iterator, [callback])\n* rejectLimit(arr, limit, iterator, [callback])\n\n---------------------------------------\n\n<a name=\"reduce\" />\n### reduce(arr, memo, iterator, [callback])\n\n__Aliases:__ `inject`, `foldl`\n\nReduces `arr` into a single value using an async `iterator` to return\neach successive step. `memo` is the initial state of the reduction.\nThis function only operates in series.\n\nFor performance reasons, it may make sense to split a call to this function into\na parallel map, and then use the normal `Array.prototype.reduce` on the results.\nThis function is for situations where each step in the reduction needs to be async;\nif you can get the data before reducing it, then it's probably a good idea to do so.\n\n__Arguments__\n\n* `arr` - An array to iterate over.\n* `memo` - The initial state of the reduction.\n* `iterator(memo, item, callback)` - A function applied to each item in the\n  array to produce the next step in the reduction. The `iterator` is passed a\n  `callback(err, reduction)` which accepts an optional error as its first\n  argument, and the state of the reduction as the second. If an error is\n  passed to the callback, the reduction is stopped and the main `callback` is\n  immediately called with the error.\n* `callback(err, result)` - *Optional* A callback which is called after all the `iterator`\n  functions have finished. Result is the reduced value.\n\n__Example__\n\n```js\nasync.reduce([1,2,3], 0, function(memo, item, callback){\n    // pointless async:\n    process.nextTick(function(){\n        callback(null, memo + item)\n    });\n}, function(err, result){\n    // result is now equal to the last value of memo, which is 6\n});\n```\n\n---------------------------------------\n\n<a name=\"reduceRight\" />\n### reduceRight(arr, memo, iterator, [callback])\n\n__Alias:__ `foldr`\n\nSame as [`reduce`](#reduce), only operates on `arr` in reverse order.\n\n\n---------------------------------------\n\n<a name=\"detect\" />\n### detect(arr, iterator, [callback])\n\nReturns the first value in `arr` that passes an async truth test. The\n`iterator` is applied in parallel, meaning the first iterator to return `true` will\nfire the detect `callback` with that result. That means the result might not be\nthe first item in the original `arr` (in terms of order) that passes the test.\n\nIf order within the original `arr` is important, then look at [`detectSeries`](#detectSeries).\n\n__Arguments__\n\n* `arr` - An array to iterate over.\n* `iterator(item, callback)` - A truth test to apply to each item in `arr`.\n  The iterator is passed a `callback(truthValue)` which must be called with a\n  boolean argument once it has completed. **Note: this callback does not take an error as its first argument.**\n* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns\n  `true`, or after all the `iterator` functions have finished. Result will be\n  the first item in the array that passes the truth test (iterator) or the\n  value `undefined` if none passed.  **Note: this callback does not take an error as its first argument.**\n\n__Example__\n\n```js\nasync.detect(['file1','file2','file3'], fs.exists, function(result){\n    // result now equals the first file in the list that exists\n});\n```\n\n__Related__\n\n* detectSeries(arr, iterator, [callback])\n* detectLimit(arr, limit, iterator, [callback])\n\n---------------------------------------\n\n<a name=\"sortBy\" />\n### sortBy(arr, iterator, [callback])\n\nSorts a list by the results of running each `arr` value through an async `iterator`.\n\n__Arguments__\n\n* `arr` - An array to iterate over.\n* `iterator(item, callback)` - A function to apply to each item in `arr`.\n  The iterator is passed a `callback(err, sortValue)` which must be called once it\n  has completed with an error (which can be `null`) and a value to use as the sort\n  criteria.\n* `callback(err, results)` - *Optional* A callback which is called after all the `iterator`\n  functions have finished, or an error occurs. Results is the items from\n  the original `arr` sorted by the values returned by the `iterator` calls.\n\n__Example__\n\n```js\nasync.sortBy(['file1','file2','file3'], function(file, callback){\n    fs.stat(file, function(err, stats){\n        callback(err, stats.mtime);\n    });\n}, function(err, results){\n    // results is now the original array of files sorted by\n    // modified date\n});\n```\n\n__Sort Order__\n\nBy modifying the callback parameter the sorting order can be influenced:\n\n```js\n//ascending order\nasync.sortBy([1,9,3,5], function(x, callback){\n    callback(null, x);\n}, function(err,result){\n    //result callback\n} );\n\n//descending order\nasync.sortBy([1,9,3,5], function(x, callback){\n    callback(null, x*-1);    //<- x*-1 instead of x, turns the order around\n}, function(err,result){\n    //result callback\n} );\n```\n\n---------------------------------------\n\n<a name=\"some\" />\n### some(arr, iterator, [callback])\n\n__Alias:__ `any`\n\nReturns `true` if at least one element in the `arr` satisfies an async test.\n_The callback for each iterator call only accepts a single argument of `true` or\n`false`; it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like `fs.exists`. Once any iterator\ncall returns `true`, the main `callback` is immediately called.\n\n__Arguments__\n\n* `arr` - An array to iterate over.\n* `iterator(item, callback)` - A truth test to apply to each item in the array\n  in parallel. The iterator is passed a `callback(truthValue)`` which must be\n  called with a boolean argument once it has completed.\n* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns\n  `true`, or after all the iterator functions have finished. Result will be\n  either `true` or `false` depending on the values of the async tests.\n\n **Note: the callbacks do not take an error as their first argument.**\n__Example__\n\n```js\nasync.some(['file1','file2','file3'], fs.exists, function(result){\n    // if result is true then at least one of the files exists\n});\n```\n\n__Related__\n\n* someLimit(arr, limit, iterator, callback)\n\n---------------------------------------\n\n<a name=\"every\" />\n### every(arr, iterator, [callback])\n\n__Alias:__ `all`\n\nReturns `true` if every element in `arr` satisfies an async test.\n_The callback for each `iterator` call only accepts a single argument of `true` or\n`false`; it does not accept an error argument first!_ This is in-line with the\nway node libraries work with truth tests like `fs.exists`.\n\n__Arguments__\n\n* `arr` - An array to iterate over.\n* `iterator(item, callback)` - A truth test to apply to each item in the array\n  in parallel. The iterator is passed a `callback(truthValue)` which must be\n  called with a  boolean argument once it has completed.\n* `callback(result)` - *Optional* A callback which is called as soon as any iterator returns\n  `false`, or after all the iterator functions have finished. Result will be\n  either `true` or `false` depending on the values of the async tests.\n\n **Note: the callbacks do not take an error as their first argument.**\n\n__Example__\n\n```js\nasync.every(['file1','file2','file3'], fs.exists, function(result){\n    // if result is true then every file exists\n});\n```\n\n__Related__\n\n* everyLimit(arr, limit, iterator, callback)\n\n---------------------------------------\n\n<a name=\"concat\" />\n### concat(arr, iterator, [callback])\n\nApplies `iterator` to each item in `arr`, concatenating the results. Returns the\nconcatenated list. The `iterator`s are called in parallel, and the results are\nconcatenated as they return. There is no guarantee that the results array will\nbe returned in the original order of `arr` passed to the `iterator` function.\n\n__Arguments__\n\n* `arr` - An array to iterate over.\n* `iterator(item, callback)` - A function to apply to each item in `arr`.\n  The iterator is passed a `callback(err, results)` which must be called once it\n  has completed with an error (which can be `null`) and an array of results.\n* `callback(err, results)` - *Optional* A callback which is called after all the `iterator`\n  functions have finished, or an error occurs. Results is an array containing\n  the concatenated results of the `iterator` function.\n\n__Example__\n\n```js\nasync.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files){\n    // files is now a list of filenames that exist in the 3 directories\n});\n```\n\n__Related__\n\n* concatSeries(arr, iterator, [callback])\n\n\n## Control Flow\n\n<a name=\"series\" />\n### series(tasks, [callback])\n\nRun the functions in the `tasks` array in series, each one running once the previous\nfunction has completed. If any functions in the series pass an error to its\ncallback, no more functions are run, and `callback` is immediately called with the value of the error.\nOtherwise, `callback` receives an array of results when `tasks` have completed.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function, and the results will be passed to the final `callback` as an object\ninstead of an array. This can be a more readable way of handling results from\n[`series`](#series).\n\n**Note** that while many implementations preserve the order of object properties, the\n[ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6)\nexplicitly states that\n\n> The mechanics and order of enumerating the properties is not specified.\n\nSo if you rely on the order in which your series of functions are executed, and want\nthis to work on all platforms, consider using an array.\n\n__Arguments__\n\n* `tasks` - An array or object containing functions to run, each function is passed\n  a `callback(err, result)` it must call on completion with an error `err` (which can\n  be `null`) and an optional `result` value.\n* `callback(err, results)` - An optional callback to run once all the functions\n  have completed. This function gets a results array (or object) containing all\n  the result arguments passed to the `task` callbacks.\n\n__Example__\n\n```js\nasync.series([\n    function(callback){\n        // do some stuff ...\n        callback(null, 'one');\n    },\n    function(callback){\n        // do some more stuff ...\n        callback(null, 'two');\n    }\n],\n// optional callback\nfunction(err, results){\n    // results is now equal to ['one', 'two']\n});\n\n\n// an example using an object instead of an array\nasync.series({\n    one: function(callback){\n        setTimeout(function(){\n            callback(null, 1);\n        }, 200);\n    },\n    two: function(callback){\n        setTimeout(function(){\n            callback(null, 2);\n        }, 100);\n    }\n},\nfunction(err, results) {\n    // results is now equal to: {one: 1, two: 2}\n});\n```\n\n---------------------------------------\n\n<a name=\"parallel\" />\n### parallel(tasks, [callback])\n\nRun the `tasks` array of functions in parallel, without waiting until the previous\nfunction has completed. If any of the functions pass an error to its\ncallback, the main `callback` is immediately called with the value of the error.\nOnce the `tasks` have completed, the results are passed to the final `callback` as an\narray.\n\n**Note:** `parallel` is about kicking-off I/O tasks in parallel, not about parallel execution of code.  If your tasks do not use any timers or perform any I/O, they will actually be executed in series.  Any synchronous setup sections for each task will happen one after the other.  JavaScript remains single-threaded.\n\nIt is also possible to use an object instead of an array. Each property will be\nrun as a function and the results will be passed to the final `callback` as an object\ninstead of an array. This can be a more readable way of handling results from\n[`parallel`](#parallel).\n\n\n__Arguments__\n\n* `tasks` - An array or object containing functions to run. Each function is passed\n  a `callback(err, result)` which it must call on completion with an error `err`\n  (which can be `null`) and an optional `result` value.\n* `callback(err, results)` - An optional callback to run once all the functions\n  have completed successfully. This function gets a results array (or object) containing all\n  the result arguments passed to the task callbacks.\n\n__Example__\n\n```js\nasync.parallel([\n    function(callback){\n        setTimeout(function(){\n            callback(null, 'one');\n        }, 200);\n    },\n    function(callback){\n        setTimeout(function(){\n            callback(null, 'two');\n        }, 100);\n    }\n],\n// optional callback\nfunction(err, results){\n    // the results array will equal ['one','two'] even though\n    // the second function had a shorter timeout.\n});\n\n\n// an example using an object instead of an array\nasync.parallel({\n    one: function(callback){\n        setTimeout(function(){\n            callback(null, 1);\n        }, 200);\n    },\n    two: function(callback){\n        setTimeout(function(){\n            callback(null, 2);\n        }, 100);\n    }\n},\nfunction(err, results) {\n    // results is now equals to: {one: 1, two: 2}\n});\n```\n\n__Related__\n\n* parallelLimit(tasks, limit, [callback])\n\n---------------------------------------\n\n<a name=\"whilst\" />\n### whilst(test, fn, callback)\n\nRepeatedly call `fn`, while `test` returns `true`. Calls `callback` when stopped,\nor an error occurs.\n\n__Arguments__\n\n* `test()` - synchronous truth test to perform before each execution of `fn`.\n* `fn(callback)` - A function which is called each time `test` passes. The function is\n  passed a `callback(err)`, which must be called once it has completed with an\n  optional `err` argument.\n* `callback(err, [results])` - A callback which is called after the test\n  function has failed and repeated execution of `fn` has stopped. `callback`\n  will be passed an error and any arguments passed to the final `fn`'s callback.\n\n__Example__\n\n```js\nvar count = 0;\n\nasync.whilst(\n    function () { return count < 5; },\n    function (callback) {\n        count++;\n        setTimeout(function () {\n            callback(null, count);\n        }, 1000);\n    },\n    function (err, n) {\n        // 5 seconds have passed, n = 5\n    }\n);\n```\n\n---------------------------------------\n\n<a name=\"doWhilst\" />\n### doWhilst(fn, test, callback)\n\nThe post-check version of [`whilst`](#whilst). To reflect the difference in\nthe order of operations, the arguments `test` and `fn` are switched.\n\n`doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.\n\n---------------------------------------\n\n<a name=\"until\" />\n### until(test, fn, callback)\n\nRepeatedly call `fn` until `test` returns `true`. Calls `callback` when stopped,\nor an error occurs. `callback` will be passed an error and any arguments passed\nto the final `fn`'s callback.\n\nThe inverse of [`whilst`](#whilst).\n\n---------------------------------------\n\n<a name=\"doUntil\" />\n### doUntil(fn, test, callback)\n\nLike [`doWhilst`](#doWhilst), except the `test` is inverted. Note the argument ordering differs from `until`.\n\n---------------------------------------\n\n<a name=\"during\" />\n### during(test, fn, callback)\n\nLike [`whilst`](#whilst), except the `test` is an asynchronous function that is passed a callback in the form of `function (err, truth)`. If error is passed to `test` or `fn`, the main callback is immediately called with the value of the error.\n\n__Example__\n\n```js\nvar count = 0;\n\nasync.during(\n    function (callback) {\n      return callback(null, count < 5);\n    },\n    function (callback) {\n        count++;\n        setTimeout(callback, 1000);\n    },\n    function (err) {\n        // 5 seconds have passed\n    }\n);\n```\n\n---------------------------------------\n\n<a name=\"doDuring\" />\n### doDuring(fn, test, callback)\n\nThe post-check version of [`during`](#during). To reflect the difference in\nthe order of operations, the arguments `test` and `fn` are switched.\n\nAlso a version of [`doWhilst`](#doWhilst) with asynchronous `test` function.\n\n---------------------------------------\n\n<a name=\"forever\" />\n### forever(fn, [errback])\n\nCalls the asynchronous function `fn` with a callback parameter that allows it to\ncall itself again, in series, indefinitely.\n\nIf an error is passed to the callback then `errback` is called with the\nerror, and execution stops, otherwise it will never be called.\n\n```js\nasync.forever(\n    function(next) {\n        // next is suitable for passing to things that need a callback(err [, whatever]);\n        // it will result in this function being called again.\n    },\n    function(err) {\n        // if next is called with a value in its first parameter, it will appear\n        // in here as 'err', and execution will stop.\n    }\n);\n```\n\n---------------------------------------\n\n<a name=\"waterfall\" />\n### waterfall(tasks, [callback])\n\nRuns the `tasks` array of functions in series, each passing their results to the next in\nthe array. However, if any of the `tasks` pass an error to their own callback, the\nnext function is not executed, and the main `callback` is immediately called with\nthe error.\n\n__Arguments__\n\n* `tasks` - An array of functions to run, each function is passed a\n  `callback(err, result1, result2, ...)` it must call on completion. The first\n  argument is an error (which can be `null`) and any further arguments will be\n  passed as arguments in order to the next task.\n* `callback(err, [results])` - An optional callback to run once all the functions\n  have completed. This will be passed the results of the last task's callback.\n\n\n\n__Example__\n\n```js\nasync.waterfall([\n    function(callback) {\n        callback(null, 'one', 'two');\n    },\n    function(arg1, arg2, callback) {\n      // arg1 now equals 'one' and arg2 now equals 'two'\n        callback(null, 'three');\n    },\n    function(arg1, callback) {\n        // arg1 now equals 'three'\n        callback(null, 'done');\n    }\n], function (err, result) {\n    // result now equals 'done'\n});\n```\nOr, with named functions:\n\n```js\nasync.waterfall([\n    myFirstFunction,\n    mySecondFunction,\n    myLastFunction,\n], function (err, result) {\n    // result now equals 'done'\n});\nfunction myFirstFunction(callback) {\n  callback(null, 'one', 'two');\n}\nfunction mySecondFunction(arg1, arg2, callback) {\n  // arg1 now equals 'one' and arg2 now equals 'two'\n  callback(null, 'three');\n}\nfunction myLastFunction(arg1, callback) {\n  // arg1 now equals 'three'\n  callback(null, 'done');\n}\n```\n\nOr, if you need to pass any argument to the first function:\n\n```js\nasync.waterfall([\n    async.apply(myFirstFunction, 'zero'),\n    mySecondFunction,\n    myLastFunction,\n], function (err, result) {\n    // result now equals 'done'\n});\nfunction myFirstFunction(arg1, callback) {\n  // arg1 now equals 'zero'\n  callback(null, 'one', 'two');\n}\nfunction mySecondFunction(arg1, arg2, callback) {\n  // arg1 now equals 'one' and arg2 now equals 'two'\n  callback(null, 'three');\n}\nfunction myLastFunction(arg1, callback) {\n  // arg1 now equals 'three'\n  callback(null, 'done');\n}\n```\n\n---------------------------------------\n<a name=\"compose\" />\n### compose(fn1, fn2...)\n\nCreates a function which is a composition of the passed asynchronous\nfunctions. Each function consumes the return value of the function that\nfollows. Composing functions `f()`, `g()`, and `h()` would produce the result of\n`f(g(h()))`, only this version uses callbacks to obtain the return values.\n\nEach function is executed with the `this` binding of the composed function.\n\n__Arguments__\n\n* `functions...` - the asynchronous functions to compose\n\n\n__Example__\n\n```js\nfunction add1(n, callback) {\n    setTimeout(function () {\n        callback(null, n + 1);\n    }, 10);\n}\n\nfunction mul3(n, callback) {\n    setTimeout(function () {\n        callback(null, n * 3);\n    }, 10);\n}\n\nvar add1mul3 = async.compose(mul3, add1);\n\nadd1mul3(4, function (err, result) {\n   // result now equals 15\n});\n```\n\n---------------------------------------\n<a name=\"seq\" />\n### seq(fn1, fn2...)\n\nVersion of the compose function that is more natural to read.\nEach function consumes the return value of the previous function.\nIt is the equivalent of [`compose`](#compose) with the arguments reversed.\n\nEach function is executed with the `this` binding of the composed function.\n\n__Arguments__\n\n* `functions...` - the asynchronous functions to compose\n\n\n__Example__\n\n```js\n// Requires lodash (or underscore), express3 and dresende's orm2.\n// Part of an app, that fetches cats of the logged user.\n// This example uses `seq` function to avoid overnesting and error\n// handling clutter.\napp.get('/cats', function(request, response) {\n  var User = request.models.User;\n  async.seq(\n    _.bind(User.get, User),  // 'User.get' has signature (id, callback(err, data))\n    function(user, fn) {\n      user.getCats(fn);      // 'getCats' has signature (callback(err, data))\n    }\n  )(req.session.user_id, function (err, cats) {\n    if (err) {\n      console.error(err);\n      response.json({ status: 'error', message: err.message });\n    } else {\n      response.json({ status: 'ok', message: 'Cats found', data: cats });\n    }\n  });\n});\n```\n\n---------------------------------------\n<a name=\"applyEach\" />\n### applyEach(fns, args..., callback)\n\nApplies the provided arguments to each function in the array, calling\n`callback` after all functions have completed. If you only provide the first\nargument, then it will return a function which lets you pass in the\narguments as if it were a single function call.\n\n__Arguments__\n\n* `fns` - the asynchronous functions to all call with the same arguments\n* `args...` - any number of separate arguments to pass to the function\n* `callback` - the final argument should be the callback, called when all\n  functions have completed processing\n\n\n__Example__\n\n```js\nasync.applyEach([enableSearch, updateSchema], 'bucket', callback);\n\n// partial application example:\nasync.each(\n    buckets,\n    async.applyEach([enableSearch, updateSchema]),\n    callback\n);\n```\n\n__Related__\n\n* applyEachSeries(tasks, args..., [callback])\n\n---------------------------------------\n\n<a name=\"queue\" />\n### queue(worker, [concurrency])\n\nCreates a `queue` object with the specified `concurrency`. Tasks added to the\n`queue` are processed in parallel (up to the `concurrency` limit). If all\n`worker`s are in progress, the task is queued until one becomes available.\nOnce a `worker` completes a `task`, that `task`'s callback is called.\n\n__Arguments__\n\n* `worker(task, callback)` - An asynchronous function for processing a queued\n  task, which must call its `callback(err)` argument when finished, with an\n  optional `error` as an argument.  If you want to handle errors from an individual task, pass a callback to `q.push()`.\n* `concurrency` - An `integer` for determining how many `worker` functions should be\n  run in parallel.  If omitted, the concurrency defaults to `1`.  If the concurrency is `0`, an error is thrown.\n\n__Queue objects__\n\nThe `queue` object returned by this function has the following properties and\nmethods:\n\n* `length()` - a function returning the number of items waiting to be processed.\n* `started` - a function returning whether or not any items have been pushed and processed by the queue\n* `running()` - a function returning the number of items currently being processed.\n* `workersList()` - a function returning the array of items currently being processed.\n* `idle()` - a function returning false if there are items waiting or being processed, or true if not.\n* `concurrency` - an integer for determining how many `worker` functions should be\n  run in parallel. This property can be changed after a `queue` is created to\n  alter the concurrency on-the-fly.\n* `push(task, [callback])` - add a new task to the `queue`. Calls `callback` once\n  the `worker` has finished processing the task. Instead of a single task, a `tasks` array\n  can be submitted. The respective callback is used for every task in the list.\n* `unshift(task, [callback])` - add a new task to the front of the `queue`.\n* `saturated` - a callback that is called when the `queue` length hits the `concurrency` limit,\n   and further tasks will be queued.\n* `empty` - a callback that is called when the last item from the `queue` is given to a `worker`.\n* `drain` - a callback that is called when the last item from the `queue` has returned from the `worker`.\n* `paused` - a boolean for determining whether the queue is in a paused state\n* `pause()` - a function that pauses the processing of tasks until `resume()` is called.\n* `resume()` - a function that resumes the processing of queued tasks when the queue is paused.\n* `kill()` - a function that removes the `drain` callback and empties remaining tasks from the queue forcing it to go idle.\n\n__Example__\n\n```js\n// create a queue object with concurrency 2\n\nvar q = async.queue(function (task, callback) {\n    console.log('hello ' + task.name);\n    callback();\n}, 2);\n\n\n// assign a callback\nq.drain = function() {\n    console.log('all items have been processed');\n}\n\n// add some items to the queue\n\nq.push({name: 'foo'}, function (err) {\n    console.log('finished processing foo');\n});\nq.push({name: 'bar'}, function (err) {\n    console.log('finished processing bar');\n});\n\n// add some items to the queue (batch-wise)\n\nq.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function (err) {\n    console.log('finished processing item');\n});\n\n// add some items to the front of the queue\n\nq.unshift({name: 'bar'}, function (err) {\n    console.log('finished processing bar');\n});\n```\n\n\n---------------------------------------\n\n<a name=\"priorityQueue\" />\n### priorityQueue(worker, concurrency)\n\nThe same as [`queue`](#queue) only tasks are assigned a priority and completed in ascending priority order. There are two differences between `queue` and `priorityQueue` objects:\n\n* `push(task, priority, [callback])` - `priority` should be a number. If an array of\n  `tasks` is given, all tasks will be assigned the same priority.\n* The `unshift` method was removed.\n\n---------------------------------------\n\n<a name=\"cargo\" />\n### cargo(worker, [payload])\n\nCreates a `cargo` object with the specified payload. Tasks added to the\ncargo will be processed altogether (up to the `payload` limit). If the\n`worker` is in progress, the task is queued until it becomes available. Once\nthe `worker` has completed some tasks, each callback of those tasks is called.\nCheck out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966) for how `cargo` and `queue` work.\n\nWhile [queue](#queue) passes only one task to one of a group of workers\nat a time, cargo passes an array of tasks to a single worker, repeating\nwhen the worker is finished.\n\n__Arguments__\n\n* `worker(tasks, callback)` - An asynchronous function for processing an array of\n  queued tasks, which must call its `callback(err)` argument when finished, with\n  an optional `err` argument.\n* `payload` - An optional `integer` for determining how many tasks should be\n  processed per round; if omitted, the default is unlimited.\n\n__Cargo objects__\n\nThe `cargo` object returned by this function has the following properties and\nmethods:\n\n* `length()` - A function returning the number of items waiting to be processed.\n* `payload` - An `integer` for determining how many tasks should be\n  process per round. This property can be changed after a `cargo` is created to\n  alter the payload on-the-fly.\n* `push(task, [callback])` - Adds `task` to the `queue`. The callback is called\n  once the `worker` has finished processing the task. Instead of a single task, an array of `tasks`\n  can be submitted. The respective callback is used for every task in the list.\n* `saturated` - A callback that is called when the `queue.length()` hits the concurrency and further tasks will be queued.\n* `empty` - A callback that is called when the last item from the `queue` is given to a `worker`.\n* `drain` - A callback that is called when the last item from the `queue` has returned from the `worker`.\n* `idle()`, `pause()`, `resume()`, `kill()` - cargo inherits all of the same methods and event calbacks as [`queue`](#queue)\n\n__Example__\n\n```js\n// create a cargo object with payload 2\n\nvar cargo = async.cargo(function (tasks, callback) {\n    for(var i=0; i<tasks.length; i++){\n      console.log('hello ' + tasks[i].name);\n    }\n    callback();\n}, 2);\n\n\n// add some items\n\ncargo.push({name: 'foo'}, function (err) {\n    console.log('finished processing foo');\n});\ncargo.push({name: 'bar'}, function (err) {\n    console.log('finished processing bar');\n});\ncargo.push({name: 'baz'}, function (err) {\n    console.log('finished processing baz');\n});\n```\n\n---------------------------------------\n\n<a name=\"auto\" />\n### auto(tasks, [concurrency], [callback])\n\nDetermines the best order for running the functions in `tasks`, based on their requirements. Each function can optionally depend on other functions being completed first, and each function is run as soon as its requirements are satisfied.\n\nIf any of the functions pass an error to their callback, the `auto` sequence will stop. Further tasks will not execute (so any other functions depending on it will not run), and the main `callback` is immediately called with the error.  Functions also receive an object containing the results of functions which have completed so far.\n\nNote, all functions are called with a `results` object as a second argument,\nso it is unsafe to pass functions in the `tasks` object which cannot handle the\nextra argument.\n\nFor example, this snippet of code:\n\n```js\nasync.auto({\n  readData: async.apply(fs.readFile, 'data.txt', 'utf-8')\n}, callback);\n```\n\nwill have the effect of calling `readFile` with the results object as the last\nargument, which will fail:\n\n```js\nfs.readFile('data.txt', 'utf-8', cb, {});\n```\n\nInstead, wrap the call to `readFile` in a function which does not forward the\n`results` object:\n\n```js\nasync.auto({\n  readData: function(cb, results){\n    fs.readFile('data.txt', 'utf-8', cb);\n  }\n}, callback);\n```\n\n__Arguments__\n\n* `tasks` - An object. Each of its properties is either a function or an array of\n  requirements, with the function itself the last item in the array. The object's key\n  of a property serves as the name of the task defined by that property,\n  i.e. can be used when specifying requirements for other tasks.\n  The function receives two arguments: (1) a `callback(err, result)` which must be\n  called when finished, passing an `error` (which can be `null`) and the result of\n  the function's execution, and (2) a `results` object, containing the results of\n  the previously executed functions.\n* `concurrency` - An optional `integer` for determining the maximum number of tasks that can be run in parallel. By default, as many as possible.\n* `callback(err, results)` - An optional callback which is called when all the\n  tasks have been completed. It receives the `err` argument if any `tasks`\n  pass an error to their callback. Results are always returned; however, if\n  an error occurs, no further `tasks` will be performed, and the results\n  object will only contain partial results.\n\n\n__Example__\n\n```js\nasync.auto({\n    get_data: function(callback){\n        console.log('in get_data');\n        // async code to get some data\n        callback(null, 'data', 'converted to array');\n    },\n    make_folder: function(callback){\n        console.log('in make_folder');\n        // async code to create a directory to store a file in\n        // this is run at the same time as getting the data\n        callback(null, 'folder');\n    },\n    write_file: ['get_data', 'make_folder', function(callback, results){\n        console.log('in write_file', JSON.stringify(results));\n        // once there is some data and the directory exists,\n        // write the data to a file in the directory\n        callback(null, 'filename');\n    }],\n    email_link: ['write_file', function(callback, results){\n        console.log('in email_link', JSON.stringify(results));\n        // once the file is written let's email a link to it...\n        // results.write_file contains the filename returned by write_file.\n        callback(null, {'file':results.write_file, 'email':'user@example.com'});\n    }]\n}, function(err, results) {\n    console.log('err = ', err);\n    console.log('results = ', results);\n});\n```\n\nThis is a fairly trivial example, but to do this using the basic parallel and\nseries functions would look like this:\n\n```js\nasync.parallel([\n    function(callback){\n        console.log('in get_data');\n        // async code to get some data\n        callback(null, 'data', 'converted to array');\n    },\n    function(callback){\n        console.log('in make_folder');\n        // async code to create a directory to store a file in\n        // this is run at the same time as getting the data\n        callback(null, 'folder');\n    }\n],\nfunction(err, results){\n    async.series([\n        function(callback){\n            console.log('in write_file', JSON.stringify(results));\n            // once there is some data and the directory exists,\n            // write the data to a file in the directory\n            results.push('filename');\n            callback(null);\n        },\n        function(callback){\n            console.log('in email_link', JSON.stringify(results));\n            // once the file is written let's email a link to it...\n            callback(null, {'file':results.pop(), 'email':'user@example.com'});\n        }\n    ]);\n});\n```\n\nFor a complicated series of `async` tasks, using the [`auto`](#auto) function makes adding\nnew tasks much easier (and the code more readable).\n\n\n---------------------------------------\n\n<a name=\"retry\" />\n### retry([opts = {times: 5, interval: 0}| 5], task, [callback])\n\nAttempts to get a successful response from `task` no more than `times` times before\nreturning an error. If the task is successful, the `callback` will be passed the result\nof the successful task. If all attempts fail, the callback will be passed the error and\nresult (if any) of the final attempt.\n\n__Arguments__\n\n* `opts` - Can be either an object with `times` and `interval` or a number.\n  * `times` - The number of attempts to make before giving up.  The default is `5`.\n  * `interval` - The time to wait between retries, in milliseconds.  The default is `0`.\n  * If `opts` is a number, the number specifies the number of times to retry, with the default interval of `0`. \n* `task(callback, results)` - A function which receives two arguments: (1) a `callback(err, result)`\n  which must be called when finished, passing `err` (which can be `null`) and the `result` of\n  the function's execution, and (2) a `results` object, containing the results of\n  the previously executed functions (if nested inside another control flow).\n* `callback(err, results)` - An optional callback which is called when the\n  task has succeeded, or after the final failed attempt. It receives the `err` and `result` arguments of the last attempt at completing the `task`.\n\nThe [`retry`](#retry) function can be used as a stand-alone control flow by passing a callback, as shown below:\n\n```js\n// try calling apiMethod 3 times\nasync.retry(3, apiMethod, function(err, result) {\n    // do something with the result\n});\n```\n\n```js\n// try calling apiMethod 3 times, waiting 200 ms between each retry \nasync.retry({times: 3, interval: 200}, apiMethod, function(err, result) {\n    // do something with the result\n});\n```\n\n```js\n// try calling apiMethod the default 5 times no delay between each retry \nasync.retry(apiMethod, function(err, result) {\n    // do something with the result\n});\n```\n\nIt can also be embedded within other control flow functions to retry individual methods\nthat are not as reliable, like this:\n\n```js\nasync.auto({\n    users: api.getUsers.bind(api),\n    payments: async.retry(3, api.getPayments.bind(api))\n}, function(err, results) {\n  // do something with the results\n});\n```\n\n\n---------------------------------------\n\n<a name=\"iterator\" />\n### iterator(tasks)\n\nCreates an iterator function which calls the next function in the `tasks` array,\nreturning a continuation to call the next one after that. It's also possible to\n“peek” at the next iterator with `iterator.next()`.\n\nThis function is used internally by the `async` module, but can be useful when\nyou want to manually control the flow of functions in series.\n\n__Arguments__\n\n* `tasks` - An array of functions to run.\n\n__Example__\n\n```js\nvar iterator = async.iterator([\n    function(){ sys.p('one'); },\n    function(){ sys.p('two'); },\n    function(){ sys.p('three'); }\n]);\n\nnode> var iterator2 = iterator();\n'one'\nnode> var iterator3 = iterator2();\n'two'\nnode> iterator3();\n'three'\nnode> var nextfn = iterator2.next();\nnode> nextfn();\n'three'\n```\n\n---------------------------------------\n\n<a name=\"apply\" />\n### apply(function, arguments..)\n\nCreates a continuation function with some arguments already applied.\n\nUseful as a shorthand when combined with other control flow functions. Any arguments\npassed to the returned function are added to the arguments originally passed\nto apply.\n\n__Arguments__\n\n* `function` - The function you want to eventually apply all arguments to.\n* `arguments...` - Any number of arguments to automatically apply when the\n  continuation is called.\n\n__Example__\n\n```js\n// using apply\n\nasync.parallel([\n    async.apply(fs.writeFile, 'testfile1', 'test1'),\n    async.apply(fs.writeFile, 'testfile2', 'test2'),\n]);\n\n\n// the same process without using apply\n\nasync.parallel([\n    function(callback){\n        fs.writeFile('testfile1', 'test1', callback);\n    },\n    function(callback){\n        fs.writeFile('testfile2', 'test2', callback);\n    }\n]);\n```\n\nIt's possible to pass any number of additional arguments when calling the\ncontinuation:\n\n```js\nnode> var fn = async.apply(sys.puts, 'one');\nnode> fn('two', 'three');\none\ntwo\nthree\n```\n\n---------------------------------------\n\n<a name=\"nextTick\" />\n### nextTick(callback), setImmediate(callback)\n\nCalls `callback` on a later loop around the event loop. In Node.js this just\ncalls `process.nextTick`; in the browser it falls back to `setImmediate(callback)`\nif available, otherwise `setTimeout(callback, 0)`, which means other higher priority\nevents may precede the execution of `callback`.\n\nThis is used internally for browser-compatibility purposes.\n\n__Arguments__\n\n* `callback` - The function to call on a later loop around the event loop.\n\n__Example__\n\n```js\nvar call_order = [];\nasync.nextTick(function(){\n    call_order.push('two');\n    // call_order now equals ['one','two']\n});\ncall_order.push('one')\n```\n\n<a name=\"times\" />\n### times(n, iterator, [callback])\n\nCalls the `iterator` function `n` times, and accumulates results in the same manner\nyou would use with [`map`](#map).\n\n__Arguments__\n\n* `n` - The number of times to run the function.\n* `iterator` - The function to call `n` times.\n* `callback` - see [`map`](#map)\n\n__Example__\n\n```js\n// Pretend this is some complicated async factory\nvar createUser = function(id, callback) {\n  callback(null, {\n    id: 'user' + id\n  })\n}\n// generate 5 users\nasync.times(5, function(n, next){\n    createUser(n, function(err, user) {\n      next(err, user)\n    })\n}, function(err, users) {\n  // we should now have 5 users\n});\n```\n\n__Related__\n\n* timesSeries(n, iterator, [callback])\n* timesLimit(n, limit, iterator, [callback])\n\n\n## Utils\n\n<a name=\"memoize\" />\n### memoize(fn, [hasher])\n\nCaches the results of an `async` function. When creating a hash to store function\nresults against, the callback is omitted from the hash and an optional hash\nfunction can be used.\n\nIf no hash function is specified, the first argument is used as a hash key, which may work reasonably if it is a string or a data type that converts to a distinct string. Note that objects and arrays will not behave reasonably. Neither will cases where the other arguments are significant. In such cases, specify your own hash function.\n\nThe cache of results is exposed as the `memo` property of the function returned\nby `memoize`.\n\n__Arguments__\n\n* `fn` - The function to proxy and cache results from.\n* `hasher` - An optional function for generating a custom hash for storing\n  results. It has all the arguments applied to it apart from the callback, and\n  must be synchronous.\n\n__Example__\n\n```js\nvar slow_fn = function (name, callback) {\n    // do something\n    callback(null, result);\n};\nvar fn = async.memoize(slow_fn);\n\n// fn can now be used as if it were slow_fn\nfn('some name', function () {\n    // callback\n});\n```\n\n<a name=\"unmemoize\" />\n### unmemoize(fn)\n\nUndoes a [`memoize`](#memoize)d function, reverting it to the original, unmemoized\nform. Handy for testing.\n\n__Arguments__\n\n* `fn` - the memoized function\n\n---------------------------------------\n\n<a name=\"ensureAsync\" />\n### ensureAsync(fn)\n\nWrap an async function and ensure it calls its callback on a later tick of the event loop.  If the function already calls its callback on a next tick, no extra deferral is added. This is useful for preventing stack overflows (`RangeError: Maximum call stack size exceeded`) and generally keeping [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) contained.\n\n__Arguments__\n\n* `fn` - an async function, one that expects a node-style callback as its last argument\n\nReturns a wrapped function with the exact same call signature as the function passed in.\n\n__Example__\n\n```js\nfunction sometimesAsync(arg, callback) {\n  if (cache[arg]) {\n    return callback(null, cache[arg]); // this would be synchronous!!\n  } else {\n    doSomeIO(arg, callback); // this IO would be asynchronous\n  }\n}\n\n// this has a risk of stack overflows if many results are cached in a row\nasync.mapSeries(args, sometimesAsync, done);\n\n// this will defer sometimesAsync's callback if necessary,\n// preventing stack overflows\nasync.mapSeries(args, async.ensureAsync(sometimesAsync), done);\n\n```\n\n---------------------------------------\n\n<a name=\"constant\">\n### constant(values...)\n\nReturns a function that when called, calls-back with the values provided.  Useful as the first function in a `waterfall`, or for plugging values in to `auto`.\n\n__Example__\n\n```js\nasync.waterfall([\n  async.constant(42),\n  function (value, next) {\n    // value === 42\n  },\n  //...\n], callback);\n\nasync.waterfall([\n  async.constant(filename, \"utf8\"),\n  fs.readFile,\n  function (fileData, next) {\n    //...\n  }\n  //...\n], callback);\n\nasync.auto({\n  hostname: async.constant(\"https://server.net/\"),\n  port: findFreePort,\n  launchServer: [\"hostname\", \"port\", function (cb, options) {\n    startServer(options, cb);\n  }],\n  //...\n}, callback);\n\n```\n\n---------------------------------------\n\n<a name=\"asyncify\">\n<a name=\"wrapSync\">\n### asyncify(func)\n\n__Alias:__ `wrapSync`\n\nTake a sync function and make it async, passing its return value to a callback. This is useful for plugging sync functions into a waterfall, series, or other async functions. Any arguments passed to the generated function will be passed to the wrapped function (except for the final callback argument). Errors thrown will be passed to the callback.\n\n__Example__\n\n```js\nasync.waterfall([\n  async.apply(fs.readFile, filename, \"utf8\"),\n  async.asyncify(JSON.parse),\n  function (data, next) {\n    // data is the result of parsing the text.\n    // If there was a parsing error, it would have been caught.\n  }\n], callback)\n```\n\nIf the function passed to `asyncify` returns a Promise, that promises's resolved/rejected state will be used to call the callback, rather than simply the synchronous return value.  Example:\n\n```js\nasync.waterfall([\n  async.apply(fs.readFile, filename, \"utf8\"),\n  async.asyncify(function (contents) {\n    return db.model.create(contents);\n  }),\n  function (model, next) {\n    // `model` is the instantiated model object. \n    // If there was an error, this function would be skipped.\n  }\n], callback)\n```\n\nThis also means you can asyncify ES2016 `async` functions.\n\n```js\nvar q = async.queue(async.asyncify(async function (file) {\n  var intermediateStep = await processFile(file);\n  return await somePromise(intermediateStep)\n}));\n\nq.push(files);\n```\n\n---------------------------------------\n\n<a name=\"log\" />\n### log(function, arguments)\n\nLogs the result of an `async` function to the `console`. Only works in Node.js or\nin browsers that support `console.log` and `console.error` (such as FF and Chrome).\nIf multiple arguments are returned from the async function, `console.log` is\ncalled on each argument in order.\n\n__Arguments__\n\n* `function` - The function you want to eventually apply all arguments to.\n* `arguments...` - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n    setTimeout(function(){\n        callback(null, 'hello ' + name);\n    }, 1000);\n};\n```\n```js\nnode> async.log(hello, 'world');\n'hello world'\n```\n\n---------------------------------------\n\n<a name=\"dir\" />\n### dir(function, arguments)\n\nLogs the result of an `async` function to the `console` using `console.dir` to\ndisplay the properties of the resulting object. Only works in Node.js or\nin browsers that support `console.dir` and `console.error` (such as FF and Chrome).\nIf multiple arguments are returned from the async function, `console.dir` is\ncalled on each argument in order.\n\n__Arguments__\n\n* `function` - The function you want to eventually apply all arguments to.\n* `arguments...` - Any number of arguments to apply to the function.\n\n__Example__\n\n```js\nvar hello = function(name, callback){\n    setTimeout(function(){\n        callback(null, {hello: name});\n    }, 1000);\n};\n```\n```js\nnode> async.dir(hello, 'world');\n{hello: 'world'}\n```\n\n---------------------------------------\n\n<a name=\"noConflict\" />\n### noConflict()\n\nChanges the value of `async` back to its original value, returning a reference to the\n`async` object.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/caolan/async.git"
-  },
-  "scripts": {
-    "coverage": "nyc npm test && nyc report",
-    "coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls",
-    "lint": "jshint lib/*.js test/*.js perf/*.js && jscs lib/*.js test/*.js perf/*.js",
-    "mocha-browser-test": "karma start",
-    "mocha-node-test": "mocha mocha_test/",
-    "mocha-test": "npm run mocha-node-test && npm run mocha-browser-test",
-    "nodeunit-test": "nodeunit test/test-async.js",
-    "test": "npm run-script lint && npm run nodeunit-test && npm run mocha-test"
-  },
-  "spm": {
-    "main": "lib/async.js"
-  },
-  "version": "1.5.2",
-  "volo": {
-    "ignore": [
-      "**/.*",
-      "bower_components",
-      "node_modules",
-      "test",
-      "tests"
-    ],
-    "main": "lib/async.js"
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/package.json
deleted file mode 100644
index 283f7ba3985ce70b7e0c5eb1e4ccdee99dd8b501..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/package.json
+++ /dev/null
@@ -1,111 +0,0 @@
-{
-  "_from": "form-data@>=1.0.0-rc4 <1.1.0",
-  "_id": "form-data@1.0.0-rc4",
-  "_location": "/serialport/node-pre-gyp/request/form-data",
-  "_nodeVersion": "0.12.11",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/form-data-1.0.0-rc4.tgz_1458059747097_0.14101114077493548"
-  },
-  "_npmUser": {
-    "email": "iam@alexindigo.com",
-    "name": "alexindigo"
-  },
-  "_npmVersion": "2.14.9",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz",
-  "_shasum": "05ac6bc22227b43e4461f488161554699d4f8b5e",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "felix@debuggable.com",
-    "name": "Felix Geisendörfer",
-    "url": "http://debuggable.com/"
-  },
-  "browser": "./lib/browser",
-  "bugs": {
-    "url": "https://github.com/form-data/form-data/issues"
-  },
-  "dependencies": {
-    "async": "^1.5.2",
-    "combined-stream": "^1.0.5",
-    "mime-types": "^2.1.10"
-  },
-  "description": "A library to create readable \"multipart/form-data\" streams. Can be used to submit forms and file uploads to other web applications.",
-  "devDependencies": {
-    "codacy-coverage": "^1.1.3",
-    "coveralls": "^2.11.8",
-    "cross-spawn": "^2.1.5",
-    "eslint": "^2.4.0",
-    "fake": "^0.2.2",
-    "far": "^0.0.7",
-    "formidable": "^1.0.17",
-    "istanbul": "^0.4.2",
-    "pre-commit": "^1.1.2",
-    "request": "^2.69.0",
-    "rimraf": "^2.5.2"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "05ac6bc22227b43e4461f488161554699d4f8b5e",
-    "tarball": "http://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz"
-  },
-  "engines": {
-    "node": ">= 0.10"
-  },
-  "gitHead": "f73996e0508ee2d4b2b376276adfac1de4188ac2",
-  "homepage": "https://github.com/form-data/form-data#readme",
-  "license": "MIT",
-  "main": "./lib/form_data",
-  "maintainers": [
-    {
-      "name": "felixge",
-      "email": "felix@debuggable.com"
-    },
-    {
-      "name": "idralyuk",
-      "email": "igor@buran.us"
-    },
-    {
-      "name": "alexindigo",
-      "email": "iam@alexindigo.com"
-    },
-    {
-      "name": "mikeal",
-      "email": "mikeal.rogers@gmail.com"
-    },
-    {
-      "name": "celer",
-      "email": "dtyree77@gmail.com"
-    },
-    {
-      "name": "dylanpiercey",
-      "email": "pierceydylan@gmail.com"
-    }
-  ],
-  "name": "form-data",
-  "optionalDependencies": {},
-  "pre-commit": [
-    "check",
-    "lint",
-    "test"
-  ],
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/form-data/form-data.git"
-  },
-  "scripts": {
-    "check": "istanbul check-coverage coverage/coverage*.json",
-    "coverage": "codacy-coverage < ./coverage/lcov.info; true",
-    "debug": "verbose=1 ./test/run.js",
-    "lint": "eslint lib/*.js test/*.js test/**/*.js",
-    "posttest": "istanbul report",
-    "predebug": "rimraf coverage test/tmp",
-    "pretest": "rimraf coverage test/tmp",
-    "test": "istanbul cover --report none test/run.js"
-  },
-  "version": "1.0.0-rc4"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/wercker.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/wercker.yml
deleted file mode 100644
index 6b118d1e31aa73c53355f667cf388d32987ad4d8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/form-data/wercker.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-# This references the default nodejs container from
-# the Docker Hub: https://registry.hub.docker.com/_/node/
-# If you want Nodesource's container you would reference nodesource/node
-# Read more about containers on our dev center
-# http://devcenter.wercker.com/docs/containers/index.html
-box: node
-# This is the build pipeline. Pipelines are the core of wercker
-# Read more about pipelines on our dev center
-# http://devcenter.wercker.com/docs/pipelines/index.html
-
-# You can also use services such as databases. Read more on our dev center:
-# http://devcenter.wercker.com/docs/services/index.html
-# services:
-    # - postgres
-    # http://devcenter.wercker.com/docs/services/postgresql.html
-
-    # - mongodb
-    # http://devcenter.wercker.com/docs/services/mongodb.html
-build:
-  # The steps that will be executed on build
-  # Steps make up the actions in your pipeline
-  # Read more about steps on our dev center:
-  # http://devcenter.wercker.com/docs/steps/index.html
-  steps:
-    # A step that executes `npm install` command
-    - npm-install
-    # A step that executes `npm test` command
-    - npm-test
-
-    # A custom script step, name value is used in the UI
-    # and the code value contains the command that get executed
-    - script:
-        name: echo nodejs information
-        code: |
-          echo "node version $(node -v) running"
-          echo "npm version $(npm -v) running"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/LICENSE
deleted file mode 100644
index ca55c91af4ec5f1f6a4e2df5e3db25ca689d8bab..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/LICENSE
+++ /dev/null
@@ -1,13 +0,0 @@
-Copyright (c) 2015, Ahmad Nassri <ahmad@ahmadnassri.com>
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/README.md
deleted file mode 100644
index 91526e6ddb666bd7549991a88d390fe377bd8cea..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/README.md
+++ /dev/null
@@ -1,309 +0,0 @@
-# HAR Validator [![version][npm-version]][npm-url] [![License][npm-license]][license-url]
-
-Extremely fast HTTP Archive ([HAR](http://www.softwareishard.com/blog/har-12-spec/)) validator using JSON Schema.
-
-[![Build Status][travis-image]][travis-url]
-[![Downloads][npm-downloads]][npm-url]
-[![Code Climate][codeclimate-quality]][codeclimate-url]
-[![Coverage Status][codeclimate-coverage]][codeclimate-url]
-[![Dependencies][david-image]][david-url]
-
-## Install
-
-```shell
-# to use in cli
-npm install --global har-validator
-
-# to use as a module
-npm install --save har-validator
-```
-
-## Usage
-
-```
-
-  Usage: har-validator [options] <files ...>
-
-  Options:
-
-    -h, --help           output usage information
-    -V, --version        output the version number
-    -s, --schema [name]  validate schema name (log, request, response, etc ...)
-
-```
-
-###### Example
-
-```shell
-har-validator har.json
-
-har-validator --schema request request.json
-```
-
-## API
-
-**Note**: as of [`v2.0.0`](https://github.com/ahmadnassri/har-validator/releases/tag/v2.0.0) this module defaults to Promise based API. *For backward comptability with `v1.x` an [async/callback API](#callback-api) is provided*
-
-### Validate(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a full [HAR](http://www.softwareishard.com/blog/har-12-spec/) object
-
-```js
-validate(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.log(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [log](http://www.softwareishard.com/blog/har-12-spec/#log) object
-
-```js
-validate.log(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.cache(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [cache](http://www.softwareishard.com/blog/har-12-spec/#cache) object
-
-```js
-validate.cache(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.cacheEntry(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a ["beforeRequest" or "afterRequest"](http://www.softwareishard.com/blog/har-12-spec/#cache) objects
-
-```js
-validate.cacheEntry(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.content(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [content](http://www.softwareishard.com/blog/har-12-spec/#content) object
-
-```js
-validate.content(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.cookie(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [cookie](http://www.softwareishard.com/blog/har-12-spec/#cookies) object
-
-```js
-validate.cookie(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.creator(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [creator](http://www.softwareishard.com/blog/har-12-spec/#creator) object
-
-```js
-validate.creator(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.entry(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  an [entry](http://www.softwareishard.com/blog/har-12-spec/#entries) object
-
-```js
-validate.entry(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.log(data)
-
-alias of [`Validate(data)`](#validate-data-callback-)
-
-### Validate.page(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [page](http://www.softwareishard.com/blog/har-12-spec/#pages) object
-
-```js
-validate.page(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.pageTimings(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [pageTimings](http://www.softwareishard.com/blog/har-12-spec/#pageTimings) object
-
-```js
-validate.pageTimings(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.postData(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [postData](http://www.softwareishard.com/blog/har-12-spec/#postData) object
-
-```js
-validate.postData(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.record(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [record](http://www.softwareishard.com/blog/har-12-spec/#headers) object
-
-```js
-validate.record(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.request(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [request](http://www.softwareishard.com/blog/har-12-spec/#request) object
-
-```js
-validate.request(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.response(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [response](http://www.softwareishard.com/blog/har-12-spec/#response) object
-
-```js
-validate.cacheEntry(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-### Validate.timings(data)
-
-> Returns a promise that resolves to the valid object.
-
-- **data**: `Object` *(Required)*
-  a [timings](http://www.softwareishard.com/blog/har-12-spec/#timings) object
-
-```js
-validate.timings(data)
-  .then(data => console.log('horray!'))
-  .catch(console.error)
-```
-
-----
-
-## Callback API
-
-### Validate(data [, callback])
-
-> Returns `true` or `false`.
-
-```js
-var HAR = require('./har.json');
-var validate = require('har-validator/lib/async');
-
-validate(HAR, function (e, valid) {
-  if (e) console.log(e.errors)
-
-  if (valid) console.log('horray!');
-});
-
-```
-The async API provides exactly the same methods as the [Promise API](#promise-api)
-
-----
-
-## Support
-
-Donations are welcome to help support the continuous development of this project.
-
-[![Gratipay][gratipay-image]][gratipay-url]
-[![PayPal][paypal-image]][paypal-url]
-[![Flattr][flattr-image]][flattr-url]
-[![Bitcoin][bitcoin-image]][bitcoin-url]
-
-## License
-
-[ISC License](LICENSE) &copy; [Ahmad Nassri](https://www.ahmadnassri.com/)
-
-[license-url]: https://github.com/ahmadnassri/har-validator/blob/master/LICENSE
-
-[travis-url]: https://travis-ci.org/ahmadnassri/har-validator
-[travis-image]: https://img.shields.io/travis/ahmadnassri/har-validator.svg?style=flat-square
-
-[npm-url]: https://www.npmjs.com/package/har-validator
-[npm-license]: https://img.shields.io/npm/l/har-validator.svg?style=flat-square
-[npm-version]: https://img.shields.io/npm/v/har-validator.svg?style=flat-square
-[npm-downloads]: https://img.shields.io/npm/dm/har-validator.svg?style=flat-square
-
-[codeclimate-url]: https://codeclimate.com/github/ahmadnassri/har-validator
-[codeclimate-quality]: https://img.shields.io/codeclimate/github/ahmadnassri/har-validator.svg?style=flat-square
-[codeclimate-coverage]: https://img.shields.io/codeclimate/coverage/github/ahmadnassri/har-validator.svg?style=flat-square
-
-[david-url]: https://david-dm.org/ahmadnassri/har-validator
-[david-image]: https://img.shields.io/david/ahmadnassri/har-validator.svg?style=flat-square
-
-[gratipay-url]: https://www.gratipay.com/ahmadnassri/
-[gratipay-image]: https://img.shields.io/gratipay/ahmadnassri.svg?style=flat-square
-
-[paypal-url]: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=UJ2B2BTK9VLRS&on0=project&os0=har-validator
-[paypal-image]: http://img.shields.io/badge/paypal-donate-green.svg?style=flat-square
-
-[flattr-url]: https://flattr.com/submit/auto?user_id=ahmadnassri&url=https://github.com/ahmadnassri/har-validator&title=har-validator&language=&tags=github&category=software
-[flattr-image]: http://img.shields.io/badge/flattr-donate-green.svg?style=flat-square
-
-[bitcoin-image]: http://img.shields.io/badge/bitcoin-1Nb46sZRVG3or7pNaDjthcGJpWhvoPpCxy-green.svg?style=flat-square
-[bitcoin-url]: https://www.coinbase.com/checkouts/ae383ae6bb931a2fa5ad11cec115191e?name=har-validator
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/bin/har-validator b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/bin/har-validator
deleted file mode 100755
index fd7cc0d34dc42c3b8b34728df65112a521effe3e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/bin/har-validator
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env node
-
-'use strict'
-
-var chalk = require('chalk')
-var cmd = require('commander')
-var fs = require('fs')
-var path = require('path')
-var pkg = require('../package.json')
-var Promise = require('pinkie-promise')
-var validate = require('..')
-var ValidationError = require('../lib/error')
-
-cmd
-  .version(pkg.version)
-  .usage('[options] <files ...>')
-  .option('-s, --schema [name]', 'validate schema name (log, request, response, etc ...)')
-  .parse(process.argv)
-
-if (!cmd.args.length) {
-  cmd.help()
-}
-
-cmd.args.map(function (fileName) {
-  var file = chalk.yellow.italic(path.basename(fileName))
-
-  new Promise(function (resolve, reject) {
-    fs.readFile(fileName, function (err, data) {
-      return err === null ? resolve(data) : reject(err)
-    })
-  })
-
-    .then(JSON.parse)
-
-    .then(cmd.schema ? validate[cmd.schema] : validate)
-
-    .then(function (data) {
-      console.log('%s [%s] is valid', chalk.green('✓'), file)
-    })
-
-    .catch(function (err) {
-      if (err instanceof SyntaxError) {
-        return console.error('%s [%s] failed to read JSON: %s', chalk.red('✖'), file, chalk.red(err.message))
-      }
-
-      if (err instanceof ValidationError) {
-        err.errors.forEach(function (details) {
-          console.error('%s [%s] failed validation: (%s: %s) %s', chalk.red('✖'), file, chalk.cyan.italic(details.field), chalk.magenta.italic(details.value), chalk.red(details.message))
-        })
-
-        return
-      }
-
-      console.error('%s [%s] an unknown error has occured: %s', chalk.red('✖'), file, chalk.red(err.message))
-    })
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/async.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/async.js
deleted file mode 100644
index 77b99a7db7b6970d8ca12b645849428864384d99..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/async.js
+++ /dev/null
@@ -1,14 +0,0 @@
-'use strict'
-
-var runner = require('./runner')
-var schemas = require('./schemas')
-
-module.exports = function (data, cb) {
-  return runner(schemas.har, data, cb)
-}
-
-Object.keys(schemas).map(function (name) {
-  module.exports[name] = function (data, cb) {
-    return runner(schemas[name], data, cb)
-  }
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/error.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/error.js
deleted file mode 100644
index fc08a87218550cfbd5c723545f0208d2acbefa6a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/error.js
+++ /dev/null
@@ -1,10 +0,0 @@
-'use strict'
-
-function ValidationError (errors) {
-  this.name = 'ValidationError'
-  this.errors = errors
-}
-
-ValidationError.prototype = Error.prototype
-
-module.exports = ValidationError
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/index.js
deleted file mode 100644
index e8351b8d5684352b0581650d6b855e0dd74b9e42..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/index.js
+++ /dev/null
@@ -1,22 +0,0 @@
-'use strict'
-
-var Promise = require('pinkie-promise')
-var runner = require('./runner')
-var schemas = require('./schemas')
-
-var promisify = function (schema) {
-  return function (data) {
-    return new Promise(function (resolve, reject) {
-      runner(schema, data, function (err, valid) {
-        return err === null ? resolve(data) : reject(err)
-      })
-    })
-  }
-}
-
-module.exports = promisify(schemas.har)
-
-// utility methods for all parts of the schema
-Object.keys(schemas).map(function (name) {
-  module.exports[name] = promisify(schemas[name])
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/runner.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/runner.js
deleted file mode 100644
index f0ed484e155561ba7a363aec0e9b847577d93b9a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/runner.js
+++ /dev/null
@@ -1,29 +0,0 @@
-'use strict'
-
-var schemas = require('./schemas')
-var ValidationError = require('./error')
-var validator = require('is-my-json-valid')
-
-module.exports = function (schema, data, cb) {
-  // default value
-  var valid = false
-
-  // validator config
-  var validate = validator(schema, {
-    greedy: true,
-    verbose: true,
-    schemas: schemas
-  })
-
-  // execute is-my-json-valid
-  if (data !== undefined) {
-    valid = validate(data)
-  }
-
-  // callback?
-  if (typeof cb === 'function') {
-    return cb(validate.errors ? new ValidationError(validate.errors) : null, valid)
-  }
-
-  return valid
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/cache.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/cache.json
deleted file mode 100644
index a3ab682d53a378b2994fe1647a3078055bdf9b79..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/cache.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
-  "properties": {
-    "beforeRequest": {
-      "$ref": "#cacheEntry"
-    },
-    "afterRequest": {
-      "$ref": "#cacheEntry"
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json
deleted file mode 100644
index a397439fd9e17cfa81559f198451a1662554a3ef..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/cacheEntry.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
-  "oneOf": [{
-    "type": "object",
-    "optional": true,
-    "required": [
-      "lastAccess",
-      "eTag",
-      "hitCount"
-    ],
-    "properties": {
-      "expires": {
-        "type": "string"
-      },
-      "lastAccess": {
-        "type": "string"
-      },
-      "eTag": {
-        "type": "string"
-      },
-      "hitCount": {
-        "type": "integer"
-      },
-      "comment": {
-        "type": "string"
-      }
-    }
-  }, {
-    "type": null,
-    "additionalProperties": false
-  }]
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/content.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/content.json
deleted file mode 100644
index 3710d7939bf6b6b5094c3c2da2a776c9dc75ad2f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/content.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
-  "type": "object",
-  "required": [
-    "size",
-    "mimeType"
-  ],
-  "properties": {
-    "size": {
-      "type": "integer"
-    },
-    "compression": {
-      "type": "integer"
-    },
-    "mimeType": {
-      "type": "string"
-    },
-    "text": {
-      "type": "string"
-    },
-    "encoding": {
-      "type": "string"
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/cookie.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/cookie.json
deleted file mode 100644
index 5768181838c03f3f577a9fe23455dfc5d3d5e446..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/cookie.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "type": "object",
-  "required": [
-    "name",
-    "value"
-  ],
-  "properties": {
-    "name": {
-      "type": "string"
-    },
-    "value": {
-      "type": "string"
-    },
-    "path": {
-      "type": "string"
-    },
-    "domain": {
-      "type": "string"
-    },
-    "expires": {
-      "type": ["string", "null"],
-      "format": "date-time"
-    },
-    "httpOnly": {
-      "type": "boolean"
-    },
-    "secure": {
-      "type": "boolean"
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/creator.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/creator.json
deleted file mode 100644
index 50586006460885579c7879c5ff2fe6f4916ff9d0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/creator.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "type": "object",
-  "required": [
-    "name",
-    "version"
-  ],
-  "properties": {
-    "name": {
-      "type": "string"
-    },
-    "version": {
-      "type": "string"
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/entry.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/entry.json
deleted file mode 100644
index 8a9c022bda6ea2282b20b072cd91a0423b03485f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/entry.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-  "type": "object",
-  "optional": true,
-  "required": [
-    "startedDateTime",
-    "time",
-    "request",
-    "response",
-    "cache",
-    "timings"
-  ],
-  "properties": {
-    "pageref": {
-      "type": "string"
-    },
-    "startedDateTime": {
-      "type": "string",
-      "format": "date-time",
-      "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))"
-    },
-    "time": {
-      "type": "number",
-      "min": 0
-    },
-    "request": {
-      "$ref": "#request"
-    },
-    "response": {
-      "$ref": "#response"
-    },
-    "cache": {
-      "$ref": "#cache"
-    },
-    "timings": {
-      "$ref": "#timings"
-    },
-    "serverIPAddress": {
-      "type": "string",
-      "oneOf": [
-        { "format": "ipv4" },
-        { "format": "ipv6" }
-      ]
-    },
-    "connection": {
-      "type": "string"
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/har.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/har.json
deleted file mode 100644
index b542782db41fac090c9589b5b374464913c0c09b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/har.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-  "type": "object",
-  "required": [
-    "log"
-  ],
-  "properties": {
-    "log": {
-      "$ref": "#log"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/index.js
deleted file mode 100644
index 7b6db7dabb0692ae5f79c5409cf6023b08440241..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/index.js
+++ /dev/null
@@ -1,49 +0,0 @@
-'use strict'
-
-var schemas = {
-  cache: require('./cache.json'),
-  cacheEntry: require('./cacheEntry.json'),
-  content: require('./content.json'),
-  cookie: require('./cookie.json'),
-  creator: require('./creator.json'),
-  entry: require('./entry.json'),
-  har: require('./har.json'),
-  log: require('./log.json'),
-  page: require('./page.json'),
-  pageTimings: require('./pageTimings.json'),
-  postData: require('./postData.json'),
-  record: require('./record.json'),
-  request: require('./request.json'),
-  response: require('./response.json'),
-  timings: require('./timings.json')
-}
-
-// is-my-json-valid does not provide meaningful error messages for external schemas
-// this is a workaround
-schemas.cache.properties.beforeRequest = schemas.cacheEntry
-schemas.cache.properties.afterRequest = schemas.cacheEntry
-
-schemas.page.properties.pageTimings = schemas.pageTimings
-
-schemas.request.properties.cookies.items = schemas.cookie
-schemas.request.properties.headers.items = schemas.record
-schemas.request.properties.queryString.items = schemas.record
-schemas.request.properties.postData = schemas.postData
-
-schemas.response.properties.cookies.items = schemas.cookie
-schemas.response.properties.headers.items = schemas.record
-schemas.response.properties.content = schemas.content
-
-schemas.entry.properties.request = schemas.request
-schemas.entry.properties.response = schemas.response
-schemas.entry.properties.cache = schemas.cache
-schemas.entry.properties.timings = schemas.timings
-
-schemas.log.properties.creator = schemas.creator
-schemas.log.properties.browser = schemas.creator
-schemas.log.properties.pages.items = schemas.page
-schemas.log.properties.entries.items = schemas.entry
-
-schemas.har.properties.log = schemas.log
-
-module.exports = schemas
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/log.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/log.json
deleted file mode 100644
index 0c91d38bf59f8af1cdacce58cc66c34007e543ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/log.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "type": "object",
-  "required": [
-    "version",
-    "creator",
-    "entries"
-  ],
-  "properties": {
-    "version": {
-      "type": "string"
-    },
-    "creator": {
-      "$ref": "#creator"
-    },
-    "browser": {
-      "$ref": "#creator"
-    },
-    "pages": {
-      "type": "array",
-      "items": {
-        "$ref": "#page"
-      }
-    },
-    "entries": {
-      "type": "array",
-      "items": {
-        "$ref": "#entry"
-      }
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/page.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/page.json
deleted file mode 100644
index ef64abe5c50fb98cbd8cd3f1f753df691055e2ed..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/page.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "type": "object",
-  "optional": true,
-  "required": [
-    "startedDateTime",
-    "id",
-    "title",
-    "pageTimings"
-  ],
-  "properties": {
-    "startedDateTime": {
-      "type": "string",
-      "format": "date-time",
-      "pattern": "^(\\d{4})(-)?(\\d\\d)(-)?(\\d\\d)(T)?(\\d\\d)(:)?(\\d\\d)(:)?(\\d\\d)(\\.\\d+)?(Z|([+-])(\\d\\d)(:)?(\\d\\d))"
-    },
-    "id": {
-      "type": "string",
-      "unique": true
-    },
-    "title": {
-      "type": "string"
-    },
-    "pageTimings": {
-      "$ref": "#pageTimings"
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json
deleted file mode 100644
index adc83cccd0e2851bfeb7d8db20d5d5f6c893ae7b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/pageTimings.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "type": "object",
-  "properties": {
-    "onContentLoad": {
-      "type": "number",
-      "min": -1
-    },
-    "onLoad": {
-      "type": "number",
-      "min": -1
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/postData.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/postData.json
deleted file mode 100644
index 91958b64a5ad330029e55095c106dfcd66eefb73..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/postData.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "type": "object",
-  "optional": true,
-  "required": [
-    "mimeType"
-  ],
-  "properties": {
-    "mimeType": {
-      "type": "string"
-    },
-    "text": {
-      "type": "string"
-    },
-    "params": {
-      "type": "array",
-      "required": [
-        "name"
-      ],
-      "properties": {
-        "name": {
-          "type": "string"
-        },
-        "value": {
-          "type": "string"
-        },
-        "fileName": {
-          "type": "string"
-        },
-        "contentType": {
-          "type": "string"
-        },
-        "comment": {
-          "type": "string"
-        }
-      }
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/record.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/record.json
deleted file mode 100644
index 04acd5194832b40edc598cc414296cc85af221e8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/record.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "type": "object",
-  "required": [
-    "name",
-    "value"
-  ],
-  "properties": {
-    "name": {
-      "type": "string"
-    },
-    "value": {
-      "type": "string"
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/request.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/request.json
deleted file mode 100644
index 639af06dc207712926073ac8086347337a3c00a8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/request.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-  "type": "object",
-  "required": [
-    "method",
-    "url",
-    "httpVersion",
-    "cookies",
-    "headers",
-    "queryString",
-    "headersSize",
-    "bodySize"
-  ],
-  "properties": {
-    "method": {
-      "type": "string"
-    },
-    "url": {
-      "type": "string",
-      "format": "uri"
-    },
-    "httpVersion": {
-      "type": "string"
-    },
-    "cookies": {
-      "type": "array",
-      "items": {
-        "$ref": "#cookie"
-      }
-    },
-    "headers": {
-      "type": "array",
-      "items": {
-        "$ref": "#record"
-      }
-    },
-    "queryString": {
-      "type": "array",
-      "items": {
-        "$ref": "#record"
-      }
-    },
-    "postData": {
-      "$ref": "#postData"
-    },
-    "headersSize": {
-      "type": "integer"
-    },
-    "bodySize": {
-      "type": "integer"
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/response.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/response.json
deleted file mode 100644
index de99c55bb90c5f615882eed626f99f0f8ab4b8c0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/response.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-  "type": "object",
-  "required": [
-    "status",
-    "statusText",
-    "httpVersion",
-    "cookies",
-    "headers",
-    "content",
-    "redirectURL",
-    "headersSize",
-    "bodySize"
-  ],
-  "properties": {
-    "status": {
-      "type": "integer"
-    },
-    "statusText": {
-      "type": "string"
-    },
-    "httpVersion": {
-      "type": "string"
-    },
-    "cookies": {
-      "type": "array",
-      "items": {
-        "$ref": "#cookie"
-      }
-    },
-    "headers": {
-      "type": "array",
-      "items": {
-        "$ref": "#record"
-      }
-    },
-    "content": {
-      "$ref": "#content"
-    },
-    "redirectURL": {
-      "type": "string"
-    },
-    "headersSize": {
-      "type": "integer"
-    },
-    "bodySize": {
-      "type": "integer"
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/timings.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/timings.json
deleted file mode 100644
index 066ef71a142e075d6f44526a492a6c0800e1a239..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/lib/schemas/timings.json
+++ /dev/null
@@ -1,40 +0,0 @@
-{
-  "required": [
-    "send",
-    "wait",
-    "receive"
-  ],
-  "properties": {
-    "dns": {
-      "type": "number",
-      "min": -1
-    },
-    "connect": {
-      "type": "number",
-      "min": -1
-    },
-    "blocked": {
-      "type": "number",
-      "min": -1
-    },
-    "send": {
-      "type": "number",
-      "min": -1
-    },
-    "wait": {
-      "type": "number",
-      "min": -1
-    },
-    "receive": {
-      "type": "number",
-      "min": -1
-    },
-    "ssl": {
-      "type": "number",
-      "min": -1
-    },
-    "comment": {
-      "type": "string"
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/index.js
deleted file mode 100644
index 2d85a91747a71a0972653135db8142fc696b1ef7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/index.js
+++ /dev/null
@@ -1,116 +0,0 @@
-'use strict';
-var escapeStringRegexp = require('escape-string-regexp');
-var ansiStyles = require('ansi-styles');
-var stripAnsi = require('strip-ansi');
-var hasAnsi = require('has-ansi');
-var supportsColor = require('supports-color');
-var defineProps = Object.defineProperties;
-var isSimpleWindowsTerm = process.platform === 'win32' && !/^xterm/i.test(process.env.TERM);
-
-function Chalk(options) {
-	// detect mode if not set manually
-	this.enabled = !options || options.enabled === undefined ? supportsColor : options.enabled;
-}
-
-// use bright blue on Windows as the normal blue color is illegible
-if (isSimpleWindowsTerm) {
-	ansiStyles.blue.open = '\u001b[94m';
-}
-
-var styles = (function () {
-	var ret = {};
-
-	Object.keys(ansiStyles).forEach(function (key) {
-		ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
-
-		ret[key] = {
-			get: function () {
-				return build.call(this, this._styles.concat(key));
-			}
-		};
-	});
-
-	return ret;
-})();
-
-var proto = defineProps(function chalk() {}, styles);
-
-function build(_styles) {
-	var builder = function () {
-		return applyStyle.apply(builder, arguments);
-	};
-
-	builder._styles = _styles;
-	builder.enabled = this.enabled;
-	// __proto__ is used because we must return a function, but there is
-	// no way to create a function with a different prototype.
-	/* eslint-disable no-proto */
-	builder.__proto__ = proto;
-
-	return builder;
-}
-
-function applyStyle() {
-	// support varags, but simply cast to string in case there's only one arg
-	var args = arguments;
-	var argsLen = args.length;
-	var str = argsLen !== 0 && String(arguments[0]);
-
-	if (argsLen > 1) {
-		// don't slice `arguments`, it prevents v8 optimizations
-		for (var a = 1; a < argsLen; a++) {
-			str += ' ' + args[a];
-		}
-	}
-
-	if (!this.enabled || !str) {
-		return str;
-	}
-
-	var nestedStyles = this._styles;
-	var i = nestedStyles.length;
-
-	// Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
-	// see https://github.com/chalk/chalk/issues/58
-	// If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
-	var originalDim = ansiStyles.dim.open;
-	if (isSimpleWindowsTerm && (nestedStyles.indexOf('gray') !== -1 || nestedStyles.indexOf('grey') !== -1)) {
-		ansiStyles.dim.open = '';
-	}
-
-	while (i--) {
-		var code = ansiStyles[nestedStyles[i]];
-
-		// Replace any instances already present with a re-opening code
-		// otherwise only the part of the string until said closing code
-		// will be colored, and the rest will simply be 'plain'.
-		str = code.open + str.replace(code.closeRe, code.open) + code.close;
-	}
-
-	// Reset the original 'dim' if we changed it to work around the Windows dimmed gray issue.
-	ansiStyles.dim.open = originalDim;
-
-	return str;
-}
-
-function init() {
-	var ret = {};
-
-	Object.keys(styles).forEach(function (name) {
-		ret[name] = {
-			get: function () {
-				return build.call(this, [name]);
-			}
-		};
-	});
-
-	return ret;
-}
-
-defineProps(Chalk.prototype, init());
-
-module.exports = new Chalk();
-module.exports.styles = ansiStyles;
-module.exports.hasColor = hasAnsi;
-module.exports.stripColor = stripAnsi;
-module.exports.supportsColor = supportsColor;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/index.js
deleted file mode 100644
index 78945278f78a72f3228fdd65388a64ee8215572d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/index.js
+++ /dev/null
@@ -1,65 +0,0 @@
-'use strict';
-
-function assembleStyles () {
-	var styles = {
-		modifiers: {
-			reset: [0, 0],
-			bold: [1, 22], // 21 isn't widely supported and 22 does the same thing
-			dim: [2, 22],
-			italic: [3, 23],
-			underline: [4, 24],
-			inverse: [7, 27],
-			hidden: [8, 28],
-			strikethrough: [9, 29]
-		},
-		colors: {
-			black: [30, 39],
-			red: [31, 39],
-			green: [32, 39],
-			yellow: [33, 39],
-			blue: [34, 39],
-			magenta: [35, 39],
-			cyan: [36, 39],
-			white: [37, 39],
-			gray: [90, 39]
-		},
-		bgColors: {
-			bgBlack: [40, 49],
-			bgRed: [41, 49],
-			bgGreen: [42, 49],
-			bgYellow: [43, 49],
-			bgBlue: [44, 49],
-			bgMagenta: [45, 49],
-			bgCyan: [46, 49],
-			bgWhite: [47, 49]
-		}
-	};
-
-	// fix humans
-	styles.colors.grey = styles.colors.gray;
-
-	Object.keys(styles).forEach(function (groupName) {
-		var group = styles[groupName];
-
-		Object.keys(group).forEach(function (styleName) {
-			var style = group[styleName];
-
-			styles[styleName] = group[styleName] = {
-				open: '\u001b[' + style[0] + 'm',
-				close: '\u001b[' + style[1] + 'm'
-			};
-		});
-
-		Object.defineProperty(styles, groupName, {
-			value: group,
-			enumerable: false
-		});
-	});
-
-	return styles;
-}
-
-Object.defineProperty(module, 'exports', {
-	enumerable: true,
-	get: assembleStyles
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/package.json
deleted file mode 100644
index ac82bc9e647c0ee25b69bb27dfd178ed70887caa..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/package.json
+++ /dev/null
@@ -1,79 +0,0 @@
-{
-  "_from": "ansi-styles@>=2.2.1 <3.0.0",
-  "_id": "ansi-styles@2.2.1",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/chalk/ansi-styles",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/chalk"
-  ],
-  "_resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-  "_shasum": "b432dd3358b634cf75e1e4664368240533c1ddbe",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/chalk/ansi-styles/issues"
-  },
-  "dependencies": {},
-  "description": "ANSI escape codes for styling strings in the terminal",
-  "devDependencies": {
-    "mocha": "*"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/chalk/ansi-styles#readme",
-  "keywords": [
-    "256",
-    "ansi",
-    "cli",
-    "color",
-    "colors",
-    "colour",
-    "command-line",
-    "console",
-    "escape",
-    "formatting",
-    "log",
-    "logging",
-    "rgb",
-    "shell",
-    "string",
-    "styles",
-    "terminal",
-    "text",
-    "tty",
-    "xterm"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "Sindre Sorhus",
-      "email": "sindresorhus@gmail.com",
-      "url": "sindresorhus.com"
-    },
-    {
-      "name": "Joshua Appelman",
-      "email": "jappelman@xebia.com",
-      "url": "jbnicolai.com"
-    }
-  ],
-  "name": "ansi-styles",
-  "optionalDependencies": {},
-  "readme": "# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles)\n\n> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal\n\nYou probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings.\n\n![](screenshot.png)\n\n\n## Install\n\n```\n$ npm install --save ansi-styles\n```\n\n\n## Usage\n\n```js\nvar ansi = require('ansi-styles');\n\nconsole.log(ansi.green.open + 'Hello world!' + ansi.green.close);\n```\n\n\n## API\n\nEach style has an `open` and `close` property.\n\n\n## Styles\n\n### Modifiers\n\n- `reset`\n- `bold`\n- `dim`\n- `italic` *(not widely supported)*\n- `underline`\n- `inverse`\n- `hidden`\n- `strikethrough` *(not widely supported)*\n\n### Colors\n\n- `black`\n- `red`\n- `green`\n- `yellow`\n- `blue`\n- `magenta`\n- `cyan`\n- `white`\n- `gray`\n\n### Background colors\n\n- `bgBlack`\n- `bgRed`\n- `bgGreen`\n- `bgYellow`\n- `bgBlue`\n- `bgMagenta`\n- `bgCyan`\n- `bgWhite`\n\n\n## Advanced usage\n\nBy default you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module.\n\n- `ansi.modifiers`\n- `ansi.colors`\n- `ansi.bgColors`\n\n\n###### Example\n\n```js\nconsole.log(ansi.colors.green.open);\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/chalk/ansi-styles.git"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "version": "2.2.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/readme.md
deleted file mode 100644
index 3f933f6162e58e2751182dc250f4387e80bb81db..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/ansi-styles/readme.md
+++ /dev/null
@@ -1,86 +0,0 @@
-# ansi-styles [![Build Status](https://travis-ci.org/chalk/ansi-styles.svg?branch=master)](https://travis-ci.org/chalk/ansi-styles)
-
-> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal
-
-You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings.
-
-![](screenshot.png)
-
-
-## Install
-
-```
-$ npm install --save ansi-styles
-```
-
-
-## Usage
-
-```js
-var ansi = require('ansi-styles');
-
-console.log(ansi.green.open + 'Hello world!' + ansi.green.close);
-```
-
-
-## API
-
-Each style has an `open` and `close` property.
-
-
-## Styles
-
-### Modifiers
-
-- `reset`
-- `bold`
-- `dim`
-- `italic` *(not widely supported)*
-- `underline`
-- `inverse`
-- `hidden`
-- `strikethrough` *(not widely supported)*
-
-### Colors
-
-- `black`
-- `red`
-- `green`
-- `yellow`
-- `blue`
-- `magenta`
-- `cyan`
-- `white`
-- `gray`
-
-### Background colors
-
-- `bgBlack`
-- `bgRed`
-- `bgGreen`
-- `bgYellow`
-- `bgBlue`
-- `bgMagenta`
-- `bgCyan`
-- `bgWhite`
-
-
-## Advanced usage
-
-By default you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module.
-
-- `ansi.modifiers`
-- `ansi.colors`
-- `ansi.bgColors`
-
-
-###### Example
-
-```js
-console.log(ansi.colors.green.open);
-```
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/index.js
deleted file mode 100644
index 7834bf9b24c481efa379fc07679c2d8e3ba85247..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-
-var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
-
-module.exports = function (str) {
-	if (typeof str !== 'string') {
-		throw new TypeError('Expected a string');
-	}
-
-	return str.replace(matchOperatorsRe, '\\$&');
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/package.json
deleted file mode 100644
index 1341ffe9c9c84cc743cc73d6f75f23ea0664a6cb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "_from": "escape-string-regexp@>=1.0.2 <2.0.0",
-  "_id": "escape-string-regexp@1.0.5",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/chalk/escape-string-regexp",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/chalk"
-  ],
-  "_resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-  "_shasum": "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/escape-string-regexp/issues"
-  },
-  "dependencies": {},
-  "description": "Escape RegExp special characters",
-  "devDependencies": {
-    "ava": "*",
-    "xo": "*"
-  },
-  "engines": {
-    "node": ">=0.8.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/escape-string-regexp#readme",
-  "keywords": [
-    "characters",
-    "escape",
-    "expression",
-    "re",
-    "regex",
-    "regexp",
-    "regular",
-    "special",
-    "str",
-    "string"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "Sindre Sorhus",
-      "email": "sindresorhus@gmail.com",
-      "url": "sindresorhus.com"
-    },
-    {
-      "name": "Joshua Boy Nicolai Appelman",
-      "email": "joshua@jbna.nl",
-      "url": "jbna.nl"
-    }
-  ],
-  "name": "escape-string-regexp",
-  "optionalDependencies": {},
-  "readme": "# escape-string-regexp [![Build Status](https://travis-ci.org/sindresorhus/escape-string-regexp.svg?branch=master)](https://travis-ci.org/sindresorhus/escape-string-regexp)\n\n> Escape RegExp special characters\n\n\n## Install\n\n```\n$ npm install --save escape-string-regexp\n```\n\n\n## Usage\n\n```js\nconst escapeStringRegexp = require('escape-string-regexp');\n\nconst escapedString = escapeStringRegexp('how much $ for a unicorn?');\n//=> 'how much \\$ for a unicorn\\?'\n\nnew RegExp(escapedString);\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/escape-string-regexp.git"
-  },
-  "scripts": {
-    "test": "xo && ava"
-  },
-  "version": "1.0.5"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/readme.md
deleted file mode 100644
index 87ac82d5ef8bc9515f709cf0dffe4c7a6fb84f93..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/escape-string-regexp/readme.md
+++ /dev/null
@@ -1,27 +0,0 @@
-# escape-string-regexp [![Build Status](https://travis-ci.org/sindresorhus/escape-string-regexp.svg?branch=master)](https://travis-ci.org/sindresorhus/escape-string-regexp)
-
-> Escape RegExp special characters
-
-
-## Install
-
-```
-$ npm install --save escape-string-regexp
-```
-
-
-## Usage
-
-```js
-const escapeStringRegexp = require('escape-string-regexp');
-
-const escapedString = escapeStringRegexp('how much $ for a unicorn?');
-//=> 'how much \$ for a unicorn\?'
-
-new RegExp(escapedString);
-```
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/index.js
deleted file mode 100644
index 98fae067673731ae1c340c871365c5742eb27e4a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-'use strict';
-var ansiRegex = require('ansi-regex');
-var re = new RegExp(ansiRegex().source); // remove the `g` flag
-module.exports = re.test.bind(re);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/index.js
deleted file mode 100644
index 4906755bc93573e0e3d86d6e4df78c2dcd511649..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-'use strict';
-module.exports = function () {
-	return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json
deleted file mode 100644
index f321ef337ff956c9097edefff411da632b781a4d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/package.json
+++ /dev/null
@@ -1,85 +0,0 @@
-{
-  "_from": "ansi-regex@>=2.0.0 <3.0.0",
-  "_id": "ansi-regex@2.0.0",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/chalk/has-ansi/ansi-regex",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/chalk/has-ansi"
-  ],
-  "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz",
-  "_shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/ansi-regex/issues"
-  },
-  "dependencies": {},
-  "description": "Regular expression for matching ANSI escape codes",
-  "devDependencies": {
-    "mocha": "*"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/ansi-regex#readme",
-  "keywords": [
-    "256",
-    "ansi",
-    "cli",
-    "color",
-    "colors",
-    "colour",
-    "command-line",
-    "console",
-    "escape",
-    "find",
-    "formatting",
-    "match",
-    "pattern",
-    "re",
-    "regex",
-    "regexp",
-    "rgb",
-    "shell",
-    "string",
-    "styles",
-    "terminal",
-    "test",
-    "text",
-    "tty",
-    "xterm"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "Sindre Sorhus",
-      "email": "sindresorhus@gmail.com",
-      "url": "sindresorhus.com"
-    },
-    {
-      "name": "Joshua Appelman",
-      "email": "jappelman@xebia.com",
-      "url": "jbnicolai.com"
-    }
-  ],
-  "name": "ansi-regex",
-  "optionalDependencies": {},
-  "readme": "# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)\n\n> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```\n$ npm install --save ansi-regex\n```\n\n\n## Usage\n\n```js\nvar ansiRegex = require('ansi-regex');\n\nansiRegex().test('\\u001b[4mcake\\u001b[0m');\n//=> true\n\nansiRegex().test('cake');\n//=> false\n\n'\\u001b[4mcake\\u001b[0m'.match(ansiRegex());\n//=> ['\\u001b[4m', '\\u001b[0m']\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/ansi-regex.git"
-  },
-  "scripts": {
-    "test": "mocha test/test.js",
-    "view-supported": "node test/viewCodes.js"
-  },
-  "version": "2.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/readme.md
deleted file mode 100644
index 1a4894ec1110e3ce2fbfd7824bcf91181a374aeb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/node_modules/ansi-regex/readme.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)
-
-> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
-
-
-## Install
-
-```
-$ npm install --save ansi-regex
-```
-
-
-## Usage
-
-```js
-var ansiRegex = require('ansi-regex');
-
-ansiRegex().test('\u001b[4mcake\u001b[0m');
-//=> true
-
-ansiRegex().test('cake');
-//=> false
-
-'\u001b[4mcake\u001b[0m'.match(ansiRegex());
-//=> ['\u001b[4m', '\u001b[0m']
-```
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/package.json
deleted file mode 100644
index a9ea78f857cab842a4e732b127819c805a8bd08a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/package.json
+++ /dev/null
@@ -1,83 +0,0 @@
-{
-  "_from": "has-ansi@>=2.0.0 <3.0.0",
-  "_id": "has-ansi@2.0.0",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/chalk/has-ansi",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/chalk"
-  ],
-  "_resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-  "_shasum": "34f5049ce1ecdf2b0649af3ef24e45ed35416d91",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/has-ansi/issues"
-  },
-  "dependencies": {
-    "ansi-regex": "^2.0.0"
-  },
-  "description": "Check if a string has ANSI escape codes",
-  "devDependencies": {
-    "ava": "0.0.4"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/has-ansi#readme",
-  "keywords": [
-    "ansi",
-    "color",
-    "colors",
-    "colour",
-    "command-line",
-    "console",
-    "escape",
-    "find",
-    "has",
-    "match",
-    "pattern",
-    "re",
-    "regex",
-    "regexp",
-    "shell",
-    "string",
-    "styles",
-    "terminal",
-    "test",
-    "text",
-    "tty",
-    "xterm"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "Sindre Sorhus",
-      "email": "sindresorhus@gmail.com",
-      "url": "sindresorhus.com"
-    },
-    {
-      "name": "Joshua Appelman",
-      "email": "jappelman@xebia.com",
-      "url": "jbnicolai.com"
-    }
-  ],
-  "name": "has-ansi",
-  "optionalDependencies": {},
-  "readme": "# has-ansi [![Build Status](https://travis-ci.org/sindresorhus/has-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/has-ansi)\n\n> Check if a string has [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```\n$ npm install --save has-ansi\n```\n\n\n## Usage\n\n```js\nvar hasAnsi = require('has-ansi');\n\nhasAnsi('\\u001b[4mcake\\u001b[0m');\n//=> true\n\nhasAnsi('cake');\n//=> false\n```\n\n\n## Related\n\n- [has-ansi-cli](https://github.com/sindresorhus/has-ansi-cli) - CLI for this module\n- [strip-ansi](https://github.com/sindresorhus/strip-ansi) - Strip ANSI escape codes\n- [ansi-regex](https://github.com/sindresorhus/ansi-regex) - Regular expression for matching ANSI escape codes\n- [chalk](https://github.com/sindresorhus/chalk) - Terminal string styling done right\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/has-ansi.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "2.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/readme.md
deleted file mode 100644
index 02bc7c2300a679d6858fa95f87ea4cb03b36307d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/has-ansi/readme.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# has-ansi [![Build Status](https://travis-ci.org/sindresorhus/has-ansi.svg?branch=master)](https://travis-ci.org/sindresorhus/has-ansi)
-
-> Check if a string has [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
-
-
-## Install
-
-```
-$ npm install --save has-ansi
-```
-
-
-## Usage
-
-```js
-var hasAnsi = require('has-ansi');
-
-hasAnsi('\u001b[4mcake\u001b[0m');
-//=> true
-
-hasAnsi('cake');
-//=> false
-```
-
-
-## Related
-
-- [has-ansi-cli](https://github.com/sindresorhus/has-ansi-cli) - CLI for this module
-- [strip-ansi](https://github.com/sindresorhus/strip-ansi) - Strip ANSI escape codes
-- [ansi-regex](https://github.com/sindresorhus/ansi-regex) - Regular expression for matching ANSI escape codes
-- [chalk](https://github.com/sindresorhus/chalk) - Terminal string styling done right
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/index.js
deleted file mode 100644
index 099480fbfc54cb238d6d190fda653408fbf1ef7f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/index.js
+++ /dev/null
@@ -1,6 +0,0 @@
-'use strict';
-var ansiRegex = require('ansi-regex')();
-
-module.exports = function (str) {
-	return typeof str === 'string' ? str.replace(ansiRegex, '') : str;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/index.js
deleted file mode 100644
index 4906755bc93573e0e3d86d6e4df78c2dcd511649..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-'use strict';
-module.exports = function () {
-	return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json
deleted file mode 100644
index 95d6ffb1aa32e60048bc766387ea9026a49934d5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/package.json
+++ /dev/null
@@ -1,85 +0,0 @@
-{
-  "_from": "ansi-regex@>=2.0.0 <3.0.0",
-  "_id": "ansi-regex@2.0.0",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/chalk/strip-ansi/ansi-regex",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/chalk/strip-ansi"
-  ],
-  "_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz",
-  "_shasum": "c5061b6e0ef8a81775e50f5d66151bf6bf371107",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/ansi-regex/issues"
-  },
-  "dependencies": {},
-  "description": "Regular expression for matching ANSI escape codes",
-  "devDependencies": {
-    "mocha": "*"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/ansi-regex#readme",
-  "keywords": [
-    "256",
-    "ansi",
-    "cli",
-    "color",
-    "colors",
-    "colour",
-    "command-line",
-    "console",
-    "escape",
-    "find",
-    "formatting",
-    "match",
-    "pattern",
-    "re",
-    "regex",
-    "regexp",
-    "rgb",
-    "shell",
-    "string",
-    "styles",
-    "terminal",
-    "test",
-    "text",
-    "tty",
-    "xterm"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "Sindre Sorhus",
-      "email": "sindresorhus@gmail.com",
-      "url": "sindresorhus.com"
-    },
-    {
-      "name": "Joshua Appelman",
-      "email": "jappelman@xebia.com",
-      "url": "jbnicolai.com"
-    }
-  ],
-  "name": "ansi-regex",
-  "optionalDependencies": {},
-  "readme": "# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)\n\n> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```\n$ npm install --save ansi-regex\n```\n\n\n## Usage\n\n```js\nvar ansiRegex = require('ansi-regex');\n\nansiRegex().test('\\u001b[4mcake\\u001b[0m');\n//=> true\n\nansiRegex().test('cake');\n//=> false\n\n'\\u001b[4mcake\\u001b[0m'.match(ansiRegex());\n//=> ['\\u001b[4m', '\\u001b[0m']\n```\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/ansi-regex.git"
-  },
-  "scripts": {
-    "test": "mocha test/test.js",
-    "view-supported": "node test/viewCodes.js"
-  },
-  "version": "2.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/readme.md
deleted file mode 100644
index 1a4894ec1110e3ce2fbfd7824bcf91181a374aeb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/node_modules/ansi-regex/readme.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# ansi-regex [![Build Status](https://travis-ci.org/sindresorhus/ansi-regex.svg?branch=master)](https://travis-ci.org/sindresorhus/ansi-regex)
-
-> Regular expression for matching [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
-
-
-## Install
-
-```
-$ npm install --save ansi-regex
-```
-
-
-## Usage
-
-```js
-var ansiRegex = require('ansi-regex');
-
-ansiRegex().test('\u001b[4mcake\u001b[0m');
-//=> true
-
-ansiRegex().test('cake');
-//=> false
-
-'\u001b[4mcake\u001b[0m'.match(ansiRegex());
-//=> ['\u001b[4m', '\u001b[0m']
-```
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/package.json
deleted file mode 100644
index 65a6312c884e86819259cf2bedfee691726a7280..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/package.json
+++ /dev/null
@@ -1,89 +0,0 @@
-{
-  "_from": "strip-ansi@>=3.0.0 <4.0.0",
-  "_id": "strip-ansi@3.0.1",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/chalk/strip-ansi",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/chalk"
-  ],
-  "_resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-  "_shasum": "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/chalk/strip-ansi/issues"
-  },
-  "dependencies": {
-    "ansi-regex": "^2.0.0"
-  },
-  "description": "Strip ANSI escape codes",
-  "devDependencies": {
-    "ava": "*",
-    "xo": "*"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/chalk/strip-ansi#readme",
-  "keywords": [
-    "256",
-    "ansi",
-    "color",
-    "colors",
-    "colour",
-    "command-line",
-    "console",
-    "escape",
-    "formatting",
-    "log",
-    "logging",
-    "remove",
-    "rgb",
-    "shell",
-    "string",
-    "strip",
-    "styles",
-    "terminal",
-    "text",
-    "trim",
-    "tty",
-    "xterm"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "Sindre Sorhus",
-      "email": "sindresorhus@gmail.com",
-      "url": "sindresorhus.com"
-    },
-    {
-      "name": "Joshua Boy Nicolai Appelman",
-      "email": "joshua@jbna.nl",
-      "url": "jbna.nl"
-    },
-    {
-      "name": "JD Ballard",
-      "email": "i.am.qix@gmail.com",
-      "url": "github.com/qix-"
-    }
-  ],
-  "name": "strip-ansi",
-  "optionalDependencies": {},
-  "readme": "# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi)\n\n> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)\n\n\n## Install\n\n```\n$ npm install --save strip-ansi\n```\n\n\n## Usage\n\n```js\nvar stripAnsi = require('strip-ansi');\n\nstripAnsi('\\u001b[4mcake\\u001b[0m');\n//=> 'cake'\n```\n\n\n## Related\n\n- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module\n- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes\n- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes\n- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/chalk/strip-ansi.git"
-  },
-  "scripts": {
-    "test": "xo && ava"
-  },
-  "version": "3.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/readme.md
deleted file mode 100644
index cb7d9ff7ee403d6cd7827beaed0629b9eb9af83f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/strip-ansi/readme.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# strip-ansi [![Build Status](https://travis-ci.org/chalk/strip-ansi.svg?branch=master)](https://travis-ci.org/chalk/strip-ansi)
-
-> Strip [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code)
-
-
-## Install
-
-```
-$ npm install --save strip-ansi
-```
-
-
-## Usage
-
-```js
-var stripAnsi = require('strip-ansi');
-
-stripAnsi('\u001b[4mcake\u001b[0m');
-//=> 'cake'
-```
-
-
-## Related
-
-- [strip-ansi-cli](https://github.com/chalk/strip-ansi-cli) - CLI for this module
-- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes
-- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes
-- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/index.js
deleted file mode 100644
index 4346e272e1f1cdf1641daa074543ae0ccbf7378e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/index.js
+++ /dev/null
@@ -1,50 +0,0 @@
-'use strict';
-var argv = process.argv;
-
-var terminator = argv.indexOf('--');
-var hasFlag = function (flag) {
-	flag = '--' + flag;
-	var pos = argv.indexOf(flag);
-	return pos !== -1 && (terminator !== -1 ? pos < terminator : true);
-};
-
-module.exports = (function () {
-	if ('FORCE_COLOR' in process.env) {
-		return true;
-	}
-
-	if (hasFlag('no-color') ||
-		hasFlag('no-colors') ||
-		hasFlag('color=false')) {
-		return false;
-	}
-
-	if (hasFlag('color') ||
-		hasFlag('colors') ||
-		hasFlag('color=true') ||
-		hasFlag('color=always')) {
-		return true;
-	}
-
-	if (process.stdout && !process.stdout.isTTY) {
-		return false;
-	}
-
-	if (process.platform === 'win32') {
-		return true;
-	}
-
-	if ('COLORTERM' in process.env) {
-		return true;
-	}
-
-	if (process.env.TERM === 'dumb') {
-		return false;
-	}
-
-	if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) {
-		return true;
-	}
-
-	return false;
-})();
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/package.json
deleted file mode 100644
index 9f523c1e5326658ed4d3b734582ac040fa482698..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/package.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "_from": "supports-color@>=2.0.0 <3.0.0",
-  "_id": "supports-color@2.0.0",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/chalk/supports-color",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/chalk"
-  ],
-  "_resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-  "_shasum": "535d045ce6b6363fa40117084629995e9df324c7",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/chalk/supports-color/issues"
-  },
-  "dependencies": {},
-  "description": "Detect whether a terminal supports color",
-  "devDependencies": {
-    "mocha": "*",
-    "require-uncached": "^1.0.2"
-  },
-  "engines": {
-    "node": ">=0.8.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/chalk/supports-color#readme",
-  "keywords": [
-    "256",
-    "ansi",
-    "capability",
-    "cli",
-    "color",
-    "colors",
-    "colour",
-    "command-line",
-    "console",
-    "detect",
-    "rgb",
-    "shell",
-    "styles",
-    "support",
-    "supports",
-    "terminal",
-    "tty",
-    "xterm"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "Sindre Sorhus",
-      "email": "sindresorhus@gmail.com",
-      "url": "sindresorhus.com"
-    },
-    {
-      "name": "Joshua Appelman",
-      "email": "jappelman@xebia.com",
-      "url": "jbnicolai.com"
-    }
-  ],
-  "name": "supports-color",
-  "optionalDependencies": {},
-  "readme": "# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color)\n\n> Detect whether a terminal supports color\n\n\n## Install\n\n```\n$ npm install --save supports-color\n```\n\n\n## Usage\n\n```js\nvar supportsColor = require('supports-color');\n\nif (supportsColor) {\n\tconsole.log('Terminal supports color');\n}\n```\n\nIt obeys the `--color` and `--no-color` CLI flags.\n\nFor situations where using `--color` is not possible, add an environment variable `FORCE_COLOR` with any value to force color. Trumps `--no-color`.\n\n\n## Related\n\n- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module\n- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/chalk/supports-color.git"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "version": "2.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/readme.md
deleted file mode 100644
index b4761f1ecdeaf08974d54079713f1b49d43223c4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/node_modules/supports-color/readme.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# supports-color [![Build Status](https://travis-ci.org/chalk/supports-color.svg?branch=master)](https://travis-ci.org/chalk/supports-color)
-
-> Detect whether a terminal supports color
-
-
-## Install
-
-```
-$ npm install --save supports-color
-```
-
-
-## Usage
-
-```js
-var supportsColor = require('supports-color');
-
-if (supportsColor) {
-	console.log('Terminal supports color');
-}
-```
-
-It obeys the `--color` and `--no-color` CLI flags.
-
-For situations where using `--color` is not possible, add an environment variable `FORCE_COLOR` with any value to force color. Trumps `--no-color`.
-
-
-## Related
-
-- [supports-color-cli](https://github.com/chalk/supports-color-cli) - CLI for this module
-- [chalk](https://github.com/chalk/chalk) - Terminal string styling done right
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/package.json
deleted file mode 100644
index ee707501657d755d103897dd2b97fba0c447f897..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/package.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
-  "_from": "chalk@>=1.1.1 <2.0.0",
-  "_id": "chalk@1.1.3",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/chalk",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator"
-  ],
-  "_resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-  "_shasum": "a8115c55e4a702fe4d150abd3872822a7e09fc98",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/chalk/chalk/issues"
-  },
-  "dependencies": {
-    "ansi-styles": "^2.2.1",
-    "escape-string-regexp": "^1.0.2",
-    "has-ansi": "^2.0.0",
-    "strip-ansi": "^3.0.0",
-    "supports-color": "^2.0.0"
-  },
-  "description": "Terminal string styling done right. Much color.",
-  "devDependencies": {
-    "coveralls": "^2.11.2",
-    "matcha": "^0.6.0",
-    "mocha": "*",
-    "nyc": "^3.0.0",
-    "require-uncached": "^1.0.2",
-    "resolve-from": "^1.0.0",
-    "semver": "^4.3.3",
-    "xo": "*"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/chalk/chalk#readme",
-  "keywords": [
-    "256",
-    "ansi",
-    "cli",
-    "color",
-    "colors",
-    "colour",
-    "command-line",
-    "console",
-    "formatting",
-    "log",
-    "logging",
-    "rgb",
-    "shell",
-    "str",
-    "string",
-    "style",
-    "styles",
-    "terminal",
-    "text",
-    "tty",
-    "xterm"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "Sindre Sorhus",
-      "email": "sindresorhus@gmail.com",
-      "url": "sindresorhus.com"
-    },
-    {
-      "name": "Joshua Appelman",
-      "email": "jappelman@xebia.com",
-      "url": "jbnicolai.com"
-    },
-    {
-      "name": "JD Ballard",
-      "email": "i.am.qix@gmail.com",
-      "url": "github.com/qix-"
-    }
-  ],
-  "name": "chalk",
-  "optionalDependencies": {},
-  "readme": "<h1 align=\"center\">\n\t<br>\n\t<br>\n\t<img width=\"360\" src=\"https://cdn.rawgit.com/chalk/chalk/19935d6484811c5e468817f846b7b3d417d7bf4a/logo.svg\" alt=\"chalk\">\n\t<br>\n\t<br>\n\t<br>\n</h1>\n\n> Terminal string styling done right\n\n[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk)\n[![Coverage Status](https://coveralls.io/repos/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/r/chalk/chalk?branch=master)\n[![](http://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4)\n\n\n[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68). Although there are other ones, they either do too much or not enough.\n\n**Chalk is a clean and focused alternative.**\n\n![](https://github.com/chalk/ansi-styles/raw/master/screenshot.png)\n\n\n## Why\n\n- Highly performant\n- Doesn't extend `String.prototype`\n- Expressive API\n- Ability to nest styles\n- Clean and focused\n- Auto-detects color support\n- Actively maintained\n- [Used by ~4500 modules](https://www.npmjs.com/browse/depended/chalk) as of July 15, 2015\n\n\n## Install\n\n```\n$ npm install --save chalk\n```\n\n\n## Usage\n\nChalk comes with an easy to use composable API where you just chain and nest the styles you want.\n\n```js\nvar chalk = require('chalk');\n\n// style a string\nchalk.blue('Hello world!');\n\n// combine styled and normal strings\nchalk.blue('Hello') + 'World' + chalk.red('!');\n\n// compose multiple styles using the chainable API\nchalk.blue.bgRed.bold('Hello world!');\n\n// pass in multiple arguments\nchalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz');\n\n// nest styles\nchalk.red('Hello', chalk.underline.bgBlue('world') + '!');\n\n// nest styles of the same type even (color, underline, background)\nchalk.green(\n\t'I am a green line ' +\n\tchalk.blue.underline.bold('with a blue substring') +\n\t' that becomes green again!'\n);\n```\n\nEasily define your own themes.\n\n```js\nvar chalk = require('chalk');\nvar error = chalk.bold.red;\nconsole.log(error('Error!'));\n```\n\nTake advantage of console.log [string substitution](http://nodejs.org/docs/latest/api/console.html#console_console_log_data).\n\n```js\nvar name = 'Sindre';\nconsole.log(chalk.green('Hello %s'), name);\n//=> Hello Sindre\n```\n\n\n## API\n\n### chalk.`<style>[.<style>...](string, [string...])`\n\nExample: `chalk.red.bold.underline('Hello', 'world');`\n\nChain [styles](#styles) and call the last one as a method with a string argument. Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that `Chalk.red.yellow.green` is equivalent to `Chalk.green`.\n\nMultiple arguments will be separated by space.\n\n### chalk.enabled\n\nColor support is automatically detected, but you can override it by setting the `enabled` property. You should however only do this in your own code as it applies globally to all chalk consumers.\n\nIf you need to change this in a reusable module create a new instance:\n\n```js\nvar ctx = new chalk.constructor({enabled: false});\n```\n\n### chalk.supportsColor\n\nDetect whether the terminal [supports color](https://github.com/chalk/supports-color). Used internally and handled for you, but exposed for convenience.\n\nCan be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, add an environment variable `FORCE_COLOR` with any value to force color. Trumps `--no-color`.\n\n### chalk.styles\n\nExposes the styles as [ANSI escape codes](https://github.com/chalk/ansi-styles).\n\nGenerally not useful, but you might need just the `.open` or `.close` escape code if you're mixing externally styled strings with your own.\n\n```js\nvar chalk = require('chalk');\n\nconsole.log(chalk.styles.red);\n//=> {open: '\\u001b[31m', close: '\\u001b[39m'}\n\nconsole.log(chalk.styles.red.open + 'Hello' + chalk.styles.red.close);\n```\n\n### chalk.hasColor(string)\n\nCheck whether a string [has color](https://github.com/chalk/has-ansi).\n\n### chalk.stripColor(string)\n\n[Strip color](https://github.com/chalk/strip-ansi) from a string.\n\nCan be useful in combination with `.supportsColor` to strip color on externally styled text when it's not supported.\n\nExample:\n\n```js\nvar chalk = require('chalk');\nvar styledString = getText();\n\nif (!chalk.supportsColor) {\n\tstyledString = chalk.stripColor(styledString);\n}\n```\n\n\n## Styles\n\n### Modifiers\n\n- `reset`\n- `bold`\n- `dim`\n- `italic` *(not widely supported)*\n- `underline`\n- `inverse`\n- `hidden`\n- `strikethrough` *(not widely supported)*\n\n### Colors\n\n- `black`\n- `red`\n- `green`\n- `yellow`\n- `blue` *(on Windows the bright version is used as normal blue is illegible)*\n- `magenta`\n- `cyan`\n- `white`\n- `gray`\n\n### Background colors\n\n- `bgBlack`\n- `bgRed`\n- `bgGreen`\n- `bgYellow`\n- `bgBlue`\n- `bgMagenta`\n- `bgCyan`\n- `bgWhite`\n\n\n## 256-colors\n\nChalk does not support anything other than the base eight colors, which guarantees it will work on all terminals and systems. Some terminals, specifically `xterm` compliant ones, will support the full range of 8-bit colors. For this the lower level [ansi-256-colors](https://github.com/jbnicolai/ansi-256-colors) package can be used.\n\n\n## Windows\n\nIf you're on Windows, do yourself a favor and use [`cmder`](http://bliker.github.io/cmder/) instead of `cmd.exe`.\n\n\n## Related\n\n- [chalk-cli](https://github.com/chalk/chalk-cli) - CLI for this module\n- [ansi-styles](https://github.com/chalk/ansi-styles/) - ANSI escape codes for styling strings in the terminal\n- [supports-color](https://github.com/chalk/supports-color/) - Detect whether a terminal supports color\n- [strip-ansi](https://github.com/chalk/strip-ansi) - Strip ANSI escape codes\n- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes\n- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes\n- [wrap-ansi](https://github.com/chalk/wrap-ansi) - Wordwrap a string with ANSI escape codes\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/chalk/chalk.git"
-  },
-  "scripts": {
-    "bench": "matcha benchmark.js",
-    "coverage": "nyc npm test && nyc report",
-    "coveralls": "nyc npm test && nyc report --reporter=text-lcov | coveralls",
-    "test": "xo && mocha"
-  },
-  "version": "1.1.3",
-  "xo": {
-    "envs": [
-      "mocha",
-      "node"
-    ]
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/readme.md
deleted file mode 100644
index 5cf111e353383d881d2476dd6a63cddb3cf2cfef..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/chalk/readme.md
+++ /dev/null
@@ -1,213 +0,0 @@
-<h1 align="center">
-	<br>
-	<br>
-	<img width="360" src="https://cdn.rawgit.com/chalk/chalk/19935d6484811c5e468817f846b7b3d417d7bf4a/logo.svg" alt="chalk">
-	<br>
-	<br>
-	<br>
-</h1>
-
-> Terminal string styling done right
-
-[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk)
-[![Coverage Status](https://coveralls.io/repos/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/r/chalk/chalk?branch=master)
-[![](http://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4)
-
-
-[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68). Although there are other ones, they either do too much or not enough.
-
-**Chalk is a clean and focused alternative.**
-
-![](https://github.com/chalk/ansi-styles/raw/master/screenshot.png)
-
-
-## Why
-
-- Highly performant
-- Doesn't extend `String.prototype`
-- Expressive API
-- Ability to nest styles
-- Clean and focused
-- Auto-detects color support
-- Actively maintained
-- [Used by ~4500 modules](https://www.npmjs.com/browse/depended/chalk) as of July 15, 2015
-
-
-## Install
-
-```
-$ npm install --save chalk
-```
-
-
-## Usage
-
-Chalk comes with an easy to use composable API where you just chain and nest the styles you want.
-
-```js
-var chalk = require('chalk');
-
-// style a string
-chalk.blue('Hello world!');
-
-// combine styled and normal strings
-chalk.blue('Hello') + 'World' + chalk.red('!');
-
-// compose multiple styles using the chainable API
-chalk.blue.bgRed.bold('Hello world!');
-
-// pass in multiple arguments
-chalk.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz');
-
-// nest styles
-chalk.red('Hello', chalk.underline.bgBlue('world') + '!');
-
-// nest styles of the same type even (color, underline, background)
-chalk.green(
-	'I am a green line ' +
-	chalk.blue.underline.bold('with a blue substring') +
-	' that becomes green again!'
-);
-```
-
-Easily define your own themes.
-
-```js
-var chalk = require('chalk');
-var error = chalk.bold.red;
-console.log(error('Error!'));
-```
-
-Take advantage of console.log [string substitution](http://nodejs.org/docs/latest/api/console.html#console_console_log_data).
-
-```js
-var name = 'Sindre';
-console.log(chalk.green('Hello %s'), name);
-//=> Hello Sindre
-```
-
-
-## API
-
-### chalk.`<style>[.<style>...](string, [string...])`
-
-Example: `chalk.red.bold.underline('Hello', 'world');`
-
-Chain [styles](#styles) and call the last one as a method with a string argument. Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that `Chalk.red.yellow.green` is equivalent to `Chalk.green`.
-
-Multiple arguments will be separated by space.
-
-### chalk.enabled
-
-Color support is automatically detected, but you can override it by setting the `enabled` property. You should however only do this in your own code as it applies globally to all chalk consumers.
-
-If you need to change this in a reusable module create a new instance:
-
-```js
-var ctx = new chalk.constructor({enabled: false});
-```
-
-### chalk.supportsColor
-
-Detect whether the terminal [supports color](https://github.com/chalk/supports-color). Used internally and handled for you, but exposed for convenience.
-
-Can be overridden by the user with the flags `--color` and `--no-color`. For situations where using `--color` is not possible, add an environment variable `FORCE_COLOR` with any value to force color. Trumps `--no-color`.
-
-### chalk.styles
-
-Exposes the styles as [ANSI escape codes](https://github.com/chalk/ansi-styles).
-
-Generally not useful, but you might need just the `.open` or `.close` escape code if you're mixing externally styled strings with your own.
-
-```js
-var chalk = require('chalk');
-
-console.log(chalk.styles.red);
-//=> {open: '\u001b[31m', close: '\u001b[39m'}
-
-console.log(chalk.styles.red.open + 'Hello' + chalk.styles.red.close);
-```
-
-### chalk.hasColor(string)
-
-Check whether a string [has color](https://github.com/chalk/has-ansi).
-
-### chalk.stripColor(string)
-
-[Strip color](https://github.com/chalk/strip-ansi) from a string.
-
-Can be useful in combination with `.supportsColor` to strip color on externally styled text when it's not supported.
-
-Example:
-
-```js
-var chalk = require('chalk');
-var styledString = getText();
-
-if (!chalk.supportsColor) {
-	styledString = chalk.stripColor(styledString);
-}
-```
-
-
-## Styles
-
-### Modifiers
-
-- `reset`
-- `bold`
-- `dim`
-- `italic` *(not widely supported)*
-- `underline`
-- `inverse`
-- `hidden`
-- `strikethrough` *(not widely supported)*
-
-### Colors
-
-- `black`
-- `red`
-- `green`
-- `yellow`
-- `blue` *(on Windows the bright version is used as normal blue is illegible)*
-- `magenta`
-- `cyan`
-- `white`
-- `gray`
-
-### Background colors
-
-- `bgBlack`
-- `bgRed`
-- `bgGreen`
-- `bgYellow`
-- `bgBlue`
-- `bgMagenta`
-- `bgCyan`
-- `bgWhite`
-
-
-## 256-colors
-
-Chalk does not support anything other than the base eight colors, which guarantees it will work on all terminals and systems. Some terminals, specifically `xterm` compliant ones, will support the full range of 8-bit colors. For this the lower level [ansi-256-colors](https://github.com/jbnicolai/ansi-256-colors) package can be used.
-
-
-## Windows
-
-If you're on Windows, do yourself a favor and use [`cmder`](http://bliker.github.io/cmder/) instead of `cmd.exe`.
-
-
-## Related
-
-- [chalk-cli](https://github.com/chalk/chalk-cli) - CLI for this module
-- [ansi-styles](https://github.com/chalk/ansi-styles/) - ANSI escape codes for styling strings in the terminal
-- [supports-color](https://github.com/chalk/supports-color/) - Detect whether a terminal supports color
-- [strip-ansi](https://github.com/chalk/strip-ansi) - Strip ANSI escape codes
-- [has-ansi](https://github.com/chalk/has-ansi) - Check if a string has ANSI escape codes
-- [ansi-regex](https://github.com/chalk/ansi-regex) - Regular expression for matching ANSI escape codes
-- [wrap-ansi](https://github.com/chalk/wrap-ansi) - Wordwrap a string with ANSI escape codes
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/.npmignore
deleted file mode 100644
index dbb0721ce547c184bfd8b6fc7564ce0b83f760b8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules
-cosmicrealms.com
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/.travis.yml
deleted file mode 100644
index 6e5919de39a312330fd1abf64237c4b6ad10c56b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/.travis.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-language: node_js
-node_js:
-  - "0.10"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/LICENSE
deleted file mode 100644
index 757562ec59276bff35792501d88fe83b34acca9a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Mathias Buus
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/README.md
deleted file mode 100644
index 104a425ad204ed1c86972627b19397bed24c55aa..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/README.md
+++ /dev/null
@@ -1,173 +0,0 @@
-# is-my-json-valid
-
-A [JSONSchema](http://json-schema.org/) validator that uses code generation
-to be extremely fast
-
-```
-npm install is-my-json-valid
-```
-
-It passes the entire JSONSchema v4 test suite except for `remoteRefs` and `maxLength`/`minLength` when using unicode surrogate pairs.
-
-[![build status](http://img.shields.io/travis/mafintosh/is-my-json-valid.svg?style=flat)](http://travis-ci.org/mafintosh/is-my-json-valid)
-
-## Usage
-
-Simply pass a schema to compile it
-
-``` js
-var validator = require('is-my-json-valid')
-
-var validate = validator({
-  required: true,
-  type: 'object',
-  properties: {
-    hello: {
-      required: true,
-      type: 'string'
-    }
-  }
-})
-
-console.log('should be valid', validate({hello: 'world'}))
-console.log('should not be valid', validate({}))
-
-// get the last list of errors by checking validate.errors
-// the following will print [{field: 'data.hello', message: 'is required'}]
-console.log(validate.errors)
-```
-
-You can also pass the schema as a string
-
-``` js
-var validate = validator('{"type": ... }')
-```
-
-Optionally you can use the require submodule to load a schema from `__dirname`
-
-``` js
-var validator = require('is-my-json-valid/require')
-var validate = validator('my-schema.json')
-```
-
-## Custom formats
-
-is-my-json-valid supports the formats specified in JSON schema v4 (such as date-time).
-If you want to add your own custom formats pass them as the formats options to the validator
-
-``` js
-var validate = validator({
-  type: 'string',
-  required: true,
-  format: 'only-a'
-}, {
-  formats: {
-    'only-a': /^a+$/
-  }
-})
-
-console.log(validate('aa')) // true
-console.log(validate('ab')) // false
-```
-
-## External schemas
-
-You can pass in external schemas that you reference using the `$ref` attribute as the `schemas` option
-
-``` js
-var ext = {
-  required: true,
-  type: 'string'
-}
-
-var schema = {
-  $ref: '#ext' // references another schema called ext
-}
-
-// pass the external schemas as an option
-var validate = validator(schema, {schemas: {ext: ext}})
-
-validate('hello') // returns true
-validate(42) // return false
-```
-
-## Filtering away additional properties
-
-is-my-json-valid supports filtering away properties not in the schema
-
-``` js
-var filter = validator.filter({
-  required: true,
-  type: 'object',
-  properties: {
-    hello: {type: 'string', required: true}
-  },
-  additionalProperties: false
-})
-
-var doc = {hello: 'world', notInSchema: true}
-console.log(filter(doc)) // {hello: 'world'}
-```
-
-## Verbose mode outputs the value on errors
-
-is-my-json-valid outputs the value causing an error when verbose is set to true
-
-``` js
-var validate = validator({
-  required: true,
-  type: 'object',
-  properties: {
-    hello: {
-      required: true,
-      type: 'string'
-    }
-  }
-}, {
-  verbose: true
-})
-
-validate({hello: 100});
-console.log(validate.errors) // {field: 'data.hello', message: 'is the wrong type', value: 100, type: 'string'}
-```
-
-## Greedy mode tries to validate as much as possible
-
-By default is-my-json-valid bails on first validation error but when greedy is
-set to true it tries to validate as much as possible:
-
-``` js
-var validate = validator({
-  type: 'object',
-  properties: {
-    x: {
-      type: 'number'
-    }
-  },
-  required: ['x', 'y']
-}, {
-  greedy: true
-});
-
-validate({x: 'string'});
-console.log(validate.errors) // [{field: 'data.y', message: 'is required'},
-                             //  {field: 'data.x', message: 'is the wrong type'}]
-```
-
-## Performance
-
-is-my-json-valid uses code generation to turn your JSON schema into basic javascript code that is easily optimizeable by v8.
-
-At the time of writing, is-my-json-valid is the __fastest validator__ when running
-
-* [json-schema-benchmark](https://github.com/Muscula/json-schema-benchmark)
-* [cosmicreals.com benchmark](http://cosmicrealms.com/blog/2014/08/29/benchmark-of-node-dot-js-json-validation-modules-part-3/)
-* [jsck benchmark](https://github.com/pandastrike/jsck/issues/72#issuecomment-70992684)
-* [themis benchmark](https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html)
-* [z-schema benchmark](https://rawgit.com/zaggino/z-schema/master/benchmark/results.html)
-
-If you know any other relevant benchmarks open a PR and I'll add them.
-
-## License
-
-MIT
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/example.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/example.js
deleted file mode 100644
index f70f4dfb5ca5fc0fe208b48288ed5dd7e3ddee06..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/example.js
+++ /dev/null
@@ -1,18 +0,0 @@
-var validator = require('./')
-
-var validate = validator({
-  type: 'object',
-  properties: {
-    hello: {
-      required: true,
-      type: 'string'
-    }
-  }
-})
-
-console.log('should be valid', validate({hello: 'world'}))
-console.log('should not be valid', validate({}))
-
-// get the last error message by checking validate.error
-// the following will print "data.hello is required"
-console.log('the errors were:', validate.errors)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js
deleted file mode 100644
index 9cb8380bc87403ad4212984da548a2acdacf0d3f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/formats.js
+++ /dev/null
@@ -1,14 +0,0 @@
-exports['date-time'] = /^\d{4}-(?:0[0-9]{1}|1[0-2]{1})-[0-9]{2}[tT ]\d{2}:\d{2}:\d{2}(\.\d+)?([zZ]|[+-]\d{2}:\d{2})$/
-exports['date'] = /^\d{4}-(?:0[0-9]{1}|1[0-2]{1})-[0-9]{2}$/
-exports['time'] = /^\d{2}:\d{2}:\d{2}$/
-exports['email'] = /^\S+@\S+$/
-exports['ip-address'] = exports['ipv4'] = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
-exports['ipv6'] = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/
-exports['uri'] = /^[a-zA-Z][a-zA-Z0-9+-.]*:[^\s]*$/
-exports['color'] = /(#?([0-9A-Fa-f]{3,6})\b)|(aqua)|(black)|(blue)|(fuchsia)|(gray)|(green)|(lime)|(maroon)|(navy)|(olive)|(orange)|(purple)|(red)|(silver)|(teal)|(white)|(yellow)|(rgb\(\s*\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\s*,\s*\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\s*,\s*\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\s*\))|(rgb\(\s*(\d?\d%|100%)+\s*,\s*(\d?\d%|100%)+\s*,\s*(\d?\d%|100%)+\s*\))/
-exports['hostname'] = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$/
-exports['alpha'] = /^[a-zA-Z]+$/
-exports['alphanumeric'] = /^[a-zA-Z0-9]+$/
-exports['style'] = /\s*(.+?):\s*([^;]+);?/g
-exports['phone'] = /^\+(?:[0-9] ?){6,14}[0-9]$/
-exports['utc-millisec'] = /^[0-9]{1,15}\.?[0-9]{0,15}$/
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js
deleted file mode 100644
index f929bb75394944ecde7cf659a8f48985a835c311..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/index.js
+++ /dev/null
@@ -1,584 +0,0 @@
-var genobj = require('generate-object-property')
-var genfun = require('generate-function')
-var jsonpointer = require('jsonpointer')
-var xtend = require('xtend')
-var formats = require('./formats')
-
-var get = function(obj, additionalSchemas, ptr) {
-
-  var visit = function(sub) {
-    if (sub && sub.id === ptr) return sub
-    if (typeof sub !== 'object' || !sub) return null
-    return Object.keys(sub).reduce(function(res, k) {
-      return res || visit(sub[k])
-    }, null)
-  }
-
-  var res = visit(obj)
-  if (res) return res
-
-  ptr = ptr.replace(/^#/, '')
-  ptr = ptr.replace(/\/$/, '')
-
-  try {
-    return jsonpointer.get(obj, decodeURI(ptr))
-  } catch (err) {
-    var end = ptr.indexOf('#')
-    var other
-    // external reference
-    if (end !== 0) {
-      // fragment doesn't exist.
-      if (end === -1) {
-        other = additionalSchemas[ptr]
-      } else {
-        var ext = ptr.slice(0, end)
-        other = additionalSchemas[ext]
-        var fragment = ptr.slice(end).replace(/^#/, '')
-        try {
-          return jsonpointer.get(other, fragment)
-        } catch (err) {}
-      }
-    } else {
-      other = additionalSchemas[ptr]
-    }
-    return other || null
-  }
-}
-
-var formatName = function(field) {
-  field = JSON.stringify(field)
-  var pattern = /\[([^\[\]"]+)\]/
-  while (pattern.test(field)) field = field.replace(pattern, '."+$1+"')
-  return field
-}
-
-var types = {}
-
-types.any = function() {
-  return 'true'
-}
-
-types.null = function(name) {
-  return name+' === null'
-}
-
-types.boolean = function(name) {
-  return 'typeof '+name+' === "boolean"'
-}
-
-types.array = function(name) {
-  return 'Array.isArray('+name+')'
-}
-
-types.object = function(name) {
-  return 'typeof '+name+' === "object" && '+name+' && !Array.isArray('+name+')'
-}
-
-types.number = function(name) {
-  return 'typeof '+name+' === "number"'
-}
-
-types.integer = function(name) {
-  return 'typeof '+name+' === "number" && (Math.floor('+name+') === '+name+' || '+name+' > 9007199254740992 || '+name+' < -9007199254740992)'
-}
-
-types.string = function(name) {
-  return 'typeof '+name+' === "string"'
-}
-
-var unique = function(array) {
-  var list = []
-  for (var i = 0; i < array.length; i++) {
-    list.push(typeof array[i] === 'object' ? JSON.stringify(array[i]) : array[i])
-  }
-  for (var i = 1; i < list.length; i++) {
-    if (list.indexOf(list[i]) !== i) return false
-  }
-  return true
-}
-
-var isMultipleOf = function(name, multipleOf) {
-  var res;
-  var factor = ((multipleOf | 0) !== multipleOf) ? Math.pow(10, multipleOf.toString().split('.').pop().length) : 1
-  if (factor > 1) {
-    var factorName = ((name | 0) !== name) ? Math.pow(10, name.toString().split('.').pop().length) : 1
-    if (factorName > factor) res = true
-    else res = Math.round(factor * name) % (factor * multipleOf)
-  }
-  else res = name % multipleOf;
-  return !res;
-}
-
-var toType = function(node) {
-  return node.type
-}
-
-var compile = function(schema, cache, root, reporter, opts) {
-  var fmts = opts ? xtend(formats, opts.formats) : formats
-  var scope = {unique:unique, formats:fmts, isMultipleOf:isMultipleOf}
-  var verbose = opts ? !!opts.verbose : false;
-  var greedy = opts && opts.greedy !== undefined ?
-    opts.greedy : false;
-
-  var syms = {}
-  var gensym = function(name) {
-    return name+(syms[name] = (syms[name] || 0)+1)
-  }
-
-  var reversePatterns = {}
-  var patterns = function(p) {
-    if (reversePatterns[p]) return reversePatterns[p]
-    var n = gensym('pattern')
-    scope[n] = new RegExp(p)
-    reversePatterns[p] = n
-    return n
-  }
-
-  var vars = ['i','j','k','l','m','n','o','p','q','r','s','t','u','v','x','y','z']
-  var genloop = function() {
-    var v = vars.shift()
-    vars.push(v+v[0])
-    return v
-  }
-
-  var visit = function(name, node, reporter, filter) {
-    var properties = node.properties
-    var type = node.type
-    var tuple = false
-
-    if (Array.isArray(node.items)) { // tuple type
-      properties = {}
-      node.items.forEach(function(item, i) {
-        properties[i] = item
-      })
-      type = 'array'
-      tuple = true
-    }
-
-    var indent = 0
-    var error = function(msg, prop, value) {
-      validate('errors++')
-      if (reporter === true) {
-        validate('if (validate.errors === null) validate.errors = []')
-        if (verbose) {
-          validate('validate.errors.push({field:%s,message:%s,value:%s,type:%s})', formatName(prop || name), JSON.stringify(msg), value || name, JSON.stringify(type))
-        } else {
-          validate('validate.errors.push({field:%s,message:%s})', formatName(prop || name), JSON.stringify(msg))
-        }
-      }
-    }
-
-    if (node.required === true) {
-      indent++
-      validate('if (%s === undefined) {', name)
-      error('is required')
-      validate('} else {')
-    } else {
-      indent++
-      validate('if (%s !== undefined) {', name)
-    }
-
-    var valid = [].concat(type)
-      .map(function(t) {
-        return types[t || 'any'](name)
-      })
-      .join(' || ') || 'true'
-
-    if (valid !== 'true') {
-      indent++
-      validate('if (!(%s)) {', valid)
-      error('is the wrong type')
-      validate('} else {')
-    }
-
-    if (tuple) {
-      if (node.additionalItems === false) {
-        validate('if (%s.length > %d) {', name, node.items.length)
-        error('has additional items')
-        validate('}')
-      } else if (node.additionalItems) {
-        var i = genloop()
-        validate('for (var %s = %d; %s < %s.length; %s++) {', i, node.items.length, i, name, i)
-        visit(name+'['+i+']', node.additionalItems, reporter, filter)
-        validate('}')
-      }
-    }
-
-    if (node.format && fmts[node.format]) {
-      if (type !== 'string' && formats[node.format]) validate('if (%s) {', types.string(name))
-      var n = gensym('format')
-      scope[n] = fmts[node.format]
-
-      if (typeof scope[n] === 'function') validate('if (!%s(%s)) {', n, name)
-      else validate('if (!%s.test(%s)) {', n, name)
-      error('must be '+node.format+' format')
-      validate('}')
-      if (type !== 'string' && formats[node.format]) validate('}')
-    }
-
-    if (Array.isArray(node.required)) {
-      var isUndefined = function(req) {
-        return genobj(name, req) + ' === undefined'
-      }
-
-      var checkRequired = function (req) {
-        var prop = genobj(name, req);
-        validate('if (%s === undefined) {', prop)
-        error('is required', prop)
-        validate('missing++')
-        validate('}')
-      }
-      validate('if ((%s)) {', type !== 'object' ? types.object(name) : 'true')
-      validate('var missing = 0')
-      node.required.map(checkRequired)
-      validate('}');
-      if (!greedy) {
-        validate('if (missing === 0) {')
-        indent++
-      }
-    }
-
-    if (node.uniqueItems) {
-      if (type !== 'array') validate('if (%s) {', types.array(name))
-      validate('if (!(unique(%s))) {', name)
-      error('must be unique')
-      validate('}')
-      if (type !== 'array') validate('}')
-    }
-
-    if (node.enum) {
-      var complex = node.enum.some(function(e) {
-        return typeof e === 'object'
-      })
-
-      var compare = complex ?
-        function(e) {
-          return 'JSON.stringify('+name+')'+' !== JSON.stringify('+JSON.stringify(e)+')'
-        } :
-        function(e) {
-          return name+' !== '+JSON.stringify(e)
-        }
-
-      validate('if (%s) {', node.enum.map(compare).join(' && ') || 'false')
-      error('must be an enum value')
-      validate('}')
-    }
-
-    if (node.dependencies) {
-      if (type !== 'object') validate('if (%s) {', types.object(name))
-
-      Object.keys(node.dependencies).forEach(function(key) {
-        var deps = node.dependencies[key]
-        if (typeof deps === 'string') deps = [deps]
-
-        var exists = function(k) {
-          return genobj(name, k) + ' !== undefined'
-        }
-
-        if (Array.isArray(deps)) {
-          validate('if (%s !== undefined && !(%s)) {', genobj(name, key), deps.map(exists).join(' && ') || 'true')
-          error('dependencies not set')
-          validate('}')
-        }
-        if (typeof deps === 'object') {
-          validate('if (%s !== undefined) {', genobj(name, key))
-          visit(name, deps, reporter, filter)
-          validate('}')
-        }
-      })
-
-      if (type !== 'object') validate('}')
-    }
-
-    if (node.additionalProperties || node.additionalProperties === false) {
-      if (type !== 'object') validate('if (%s) {', types.object(name))
-
-      var i = genloop()
-      var keys = gensym('keys')
-
-      var toCompare = function(p) {
-        return keys+'['+i+'] !== '+JSON.stringify(p)
-      }
-
-      var toTest = function(p) {
-        return '!'+patterns(p)+'.test('+keys+'['+i+'])'
-      }
-
-      var additionalProp = Object.keys(properties || {}).map(toCompare)
-        .concat(Object.keys(node.patternProperties || {}).map(toTest))
-        .join(' && ') || 'true'
-
-      validate('var %s = Object.keys(%s)', keys, name)
-        ('for (var %s = 0; %s < %s.length; %s++) {', i, i, keys, i)
-          ('if (%s) {', additionalProp)
-
-      if (node.additionalProperties === false) {
-        if (filter) validate('delete %s', name+'['+keys+'['+i+']]')
-        error('has additional properties', null, JSON.stringify(name+'.') + ' + ' + keys + '['+i+']')
-      } else {
-        visit(name+'['+keys+'['+i+']]', node.additionalProperties, reporter, filter)
-      }
-
-      validate
-          ('}')
-        ('}')
-
-      if (type !== 'object') validate('}')
-    }
-
-    if (node.$ref) {
-      var sub = get(root, opts && opts.schemas || {}, node.$ref)
-      if (sub) {
-        var fn = cache[node.$ref]
-        if (!fn) {
-          cache[node.$ref] = function proxy(data) {
-            return fn(data)
-          }
-          fn = compile(sub, cache, root, false, opts)
-        }
-        var n = gensym('ref')
-        scope[n] = fn
-        validate('if (!(%s(%s))) {', n, name)
-        error('referenced schema does not match')
-        validate('}')
-      }
-    }
-
-    if (node.not) {
-      var prev = gensym('prev')
-      validate('var %s = errors', prev)
-      visit(name, node.not, false, filter)
-      validate('if (%s === errors) {', prev)
-      error('negative schema matches')
-      validate('} else {')
-        ('errors = %s', prev)
-      ('}')
-    }
-
-    if (node.items && !tuple) {
-      if (type !== 'array') validate('if (%s) {', types.array(name))
-
-      var i = genloop()
-      validate('for (var %s = 0; %s < %s.length; %s++) {', i, i, name, i)
-      visit(name+'['+i+']', node.items, reporter, filter)
-      validate('}')
-
-      if (type !== 'array') validate('}')
-    }
-
-    if (node.patternProperties) {
-      if (type !== 'object') validate('if (%s) {', types.object(name))
-      var keys = gensym('keys')
-      var i = genloop()
-      validate
-        ('var %s = Object.keys(%s)', keys, name)
-        ('for (var %s = 0; %s < %s.length; %s++) {', i, i, keys, i)
-
-      Object.keys(node.patternProperties).forEach(function(key) {
-        var p = patterns(key)
-        validate('if (%s.test(%s)) {', p, keys+'['+i+']')
-        visit(name+'['+keys+'['+i+']]', node.patternProperties[key], reporter, filter)
-        validate('}')
-      })
-
-      validate('}')
-      if (type !== 'object') validate('}')
-    }
-
-    if (node.pattern) {
-      var p = patterns(node.pattern)
-      if (type !== 'string') validate('if (%s) {', types.string(name))
-      validate('if (!(%s.test(%s))) {', p, name)
-      error('pattern mismatch')
-      validate('}')
-      if (type !== 'string') validate('}')
-    }
-
-    if (node.allOf) {
-      node.allOf.forEach(function(sch) {
-        visit(name, sch, reporter, filter)
-      })
-    }
-
-    if (node.anyOf && node.anyOf.length) {
-      var prev = gensym('prev')
-
-      node.anyOf.forEach(function(sch, i) {
-        if (i === 0) {
-          validate('var %s = errors', prev)
-        } else {
-          validate('if (errors !== %s) {', prev)
-            ('errors = %s', prev)
-        }
-        visit(name, sch, false, false)
-      })
-      node.anyOf.forEach(function(sch, i) {
-        if (i) validate('}')
-      })
-      validate('if (%s !== errors) {', prev)
-      error('no schemas match')
-      validate('}')
-    }
-
-    if (node.oneOf && node.oneOf.length) {
-      var prev = gensym('prev')
-      var passes = gensym('passes')
-
-      validate
-        ('var %s = errors', prev)
-        ('var %s = 0', passes)
-
-      node.oneOf.forEach(function(sch, i) {
-        visit(name, sch, false, false)
-        validate('if (%s === errors) {', prev)
-          ('%s++', passes)
-        ('} else {')
-          ('errors = %s', prev)
-        ('}')
-      })
-
-      validate('if (%s !== 1) {', passes)
-      error('no (or more than one) schemas match')
-      validate('}')
-    }
-
-    if (node.multipleOf !== undefined) {
-      if (type !== 'number' && type !== 'integer') validate('if (%s) {', types.number(name))
-
-      validate('if (!isMultipleOf(%s, %d)) {', name, node.multipleOf)
-
-      error('has a remainder')
-      validate('}')
-
-      if (type !== 'number' && type !== 'integer') validate('}')
-    }
-
-    if (node.maxProperties !== undefined) {
-      if (type !== 'object') validate('if (%s) {', types.object(name))
-
-      validate('if (Object.keys(%s).length > %d) {', name, node.maxProperties)
-      error('has more properties than allowed')
-      validate('}')
-
-      if (type !== 'object') validate('}')
-    }
-
-    if (node.minProperties !== undefined) {
-      if (type !== 'object') validate('if (%s) {', types.object(name))
-
-      validate('if (Object.keys(%s).length < %d) {', name, node.minProperties)
-      error('has less properties than allowed')
-      validate('}')
-
-      if (type !== 'object') validate('}')
-    }
-
-    if (node.maxItems !== undefined) {
-      if (type !== 'array') validate('if (%s) {', types.array(name))
-
-      validate('if (%s.length > %d) {', name, node.maxItems)
-      error('has more items than allowed')
-      validate('}')
-
-      if (type !== 'array') validate('}')
-    }
-
-    if (node.minItems !== undefined) {
-      if (type !== 'array') validate('if (%s) {', types.array(name))
-
-      validate('if (%s.length < %d) {', name, node.minItems)
-      error('has less items than allowed')
-      validate('}')
-
-      if (type !== 'array') validate('}')
-    }
-
-    if (node.maxLength !== undefined) {
-      if (type !== 'string') validate('if (%s) {', types.string(name))
-
-      validate('if (%s.length > %d) {', name, node.maxLength)
-      error('has longer length than allowed')
-      validate('}')
-
-      if (type !== 'string') validate('}')
-    }
-
-    if (node.minLength !== undefined) {
-      if (type !== 'string') validate('if (%s) {', types.string(name))
-
-      validate('if (%s.length < %d) {', name, node.minLength)
-      error('has less length than allowed')
-      validate('}')
-
-      if (type !== 'string') validate('}')
-    }
-
-    if (node.minimum !== undefined) {
-      validate('if (%s %s %d) {', name, node.exclusiveMinimum ? '<=' : '<', node.minimum)
-      error('is less than minimum')
-      validate('}')
-    }
-
-    if (node.maximum !== undefined) {
-      validate('if (%s %s %d) {', name, node.exclusiveMaximum ? '>=' : '>', node.maximum)
-      error('is more than maximum')
-      validate('}')
-    }
-
-    if (properties) {
-      Object.keys(properties).forEach(function(p) {
-        if (Array.isArray(type) && type.indexOf('null') !== -1) validate('if (%s !== null) {', name)
-
-        visit(genobj(name, p), properties[p], reporter, filter)
-
-        if (Array.isArray(type) && type.indexOf('null') !== -1) validate('}')
-      })
-    }
-
-    while (indent--) validate('}')
-  }
-
-  var validate = genfun
-    ('function validate(data) {')
-      ('validate.errors = null')
-      ('var errors = 0')
-
-  visit('data', schema, reporter, opts && opts.filter)
-
-  validate
-      ('return errors === 0')
-    ('}')
-
-  validate = validate.toFunction(scope)
-  validate.errors = null
-
-  if (Object.defineProperty) {
-    Object.defineProperty(validate, 'error', {
-      get: function() {
-        if (!validate.errors) return ''
-        return validate.errors.map(function(err) {
-          return err.field + ' ' + err.message;
-        }).join('\n')
-      }
-    })
-  }
-
-  validate.toJSON = function() {
-    return schema
-  }
-
-  return validate
-}
-
-module.exports = function(schema, opts) {
-  if (typeof schema === 'string') schema = JSON.parse(schema)
-  return compile(schema, {}, schema, true, opts)
-}
-
-module.exports.filter = function(schema, opts) {
-  var validate = module.exports(schema, xtend(opts, {filter: true}))
-  return function(sch) {
-    validate(sch)
-    return sch
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/.npmignore
deleted file mode 100644
index 3c3629e647f5ddf82548912e337bea9826b434af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/.travis.yml
deleted file mode 100644
index 6e5919de39a312330fd1abf64237c4b6ad10c56b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/.travis.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-language: node_js
-node_js:
-  - "0.10"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/README.md
deleted file mode 100644
index 693bff87cfe9008536b005d032ba100e99fde12b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/README.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# generate-function
-
-Module that helps you write generated functions in Node
-
-```
-npm install generate-function
-```
-
-[![build status](http://img.shields.io/travis/mafintosh/generate-function.svg?style=flat)](http://travis-ci.org/mafintosh/generate-function)
-
-## Disclamer
-
-Writing code that generates code is hard.
-You should only use this if you really, really, really need this for performance reasons (like schema validators / parsers etc).
-
-## Usage
-
-``` js
-var genfun = require('generate-function')
-
-var addNumber = function(val) {
-  var fn = genfun()
-    ('function add(n) {')
-      ('return n + %d', val) // supports format strings to insert values
-    ('}')
-
-  return fn.toFunction() // will compile the function
-}
-
-var add2 = addNumber(2)
-
-console.log('1+2=', add2(1))
-console.log(add2.toString()) // prints the generated function
-```
-
-If you need to close over variables in your generated function pass them to `toFunction(scope)`
-
-``` js
-var multiply = function(a, b) {
-  return a * b
-}
-
-var addAndMultiplyNumber = function(val) {
-  var fn = genfun()
-    ('function(n) {')
-      ('if (typeof n !== "number") {') // ending a line with { will indent the source
-        ('throw new Error("argument should be a number")')
-      ('}')
-      ('var result = multiply(%d, n+%d)', val, val)
-      ('return result')
-    ('}')
-
-  // use fn.toString() if you want to see the generated source
-
-  return fn.toFunction({
-    multiply: multiply
-  })
-}
-
-var addAndMultiply2 = addAndMultiplyNumber(2)
-
-console.log('(3 + 2) * 2 =', addAndMultiply2(3))
-```
-
-## Related
-
-See [generate-object-property](https://github.com/mafintosh/generate-object-property) if you need to safely generate code that
-can be used to reference an object property
-
-## License
-
-MIT
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/example.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/example.js
deleted file mode 100644
index 8d1fee16262403e1fa894503979f51aeca97295c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/example.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var genfun = require('./')
-
-var multiply = function(a, b) {
-  return a * b
-}
-
-var addAndMultiplyNumber = function(val) {
-  var fn = genfun()
-    ('function(n) {')
-      ('if (typeof n !== "number") {') // ending a line with { will indent the source
-        ('throw new Error("argument should be a number")')
-      ('}')
-      ('var result = multiply(%d, n+%d)', val, val)
-      ('return result')
-    ('}')
-
-  // use fn.toString() if you want to see the generated source
-
-  return fn.toFunction({
-    multiply: multiply
-  })
-}
-
-var addAndMultiply2 = addAndMultiplyNumber(2)
-
-console.log(addAndMultiply2.toString())
-console.log('(3 + 2) * 2 =', addAndMultiply2(3))
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js
deleted file mode 100644
index 37e064bb47bf2334e11487807fd4f0eee27523f7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/index.js
+++ /dev/null
@@ -1,61 +0,0 @@
-var util = require('util')
-
-var INDENT_START = /[\{\[]/
-var INDENT_END = /[\}\]]/
-
-module.exports = function() {
-  var lines = []
-  var indent = 0
-
-  var push = function(str) {
-    var spaces = ''
-    while (spaces.length < indent*2) spaces += '  '
-    lines.push(spaces+str)
-  }
-
-  var line = function(fmt) {
-    if (!fmt) return line
-
-    if (INDENT_END.test(fmt.trim()[0]) && INDENT_START.test(fmt[fmt.length-1])) {
-      indent--
-      push(util.format.apply(util, arguments))
-      indent++
-      return line
-    }
-    if (INDENT_START.test(fmt[fmt.length-1])) {
-      push(util.format.apply(util, arguments))
-      indent++
-      return line
-    }
-    if (INDENT_END.test(fmt.trim()[0])) {
-      indent--
-      push(util.format.apply(util, arguments))
-      return line
-    }
-
-    push(util.format.apply(util, arguments))
-    return line
-  }
-
-  line.toString = function() {
-    return lines.join('\n')
-  }
-
-  line.toFunction = function(scope) {
-    var src = 'return ('+line.toString()+')'
-
-    var keys = Object.keys(scope || {}).map(function(key) {
-      return key
-    })
-
-    var vals = keys.map(function(key) {
-      return scope[key]
-    })
-
-    return Function.apply(null, keys.concat(src)).apply(null, vals)
-  }
-
-  if (arguments.length) line.apply(null, arguments)
-
-  return line
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json
deleted file mode 100644
index 68f9a09e4a62821da4f5f9cfc144de265bd3d743..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/package.json
+++ /dev/null
@@ -1,45 +0,0 @@
-{
-  "_from": "generate-function@>=2.0.0 <3.0.0",
-  "_id": "generate-function@2.0.0",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/is-my-json-valid/generate-function",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/is-my-json-valid"
-  ],
-  "_resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
-  "_shasum": "6858fe7c0969b7d4e9093337647ac79f60dfbe74",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "Mathias Buus"
-  },
-  "bugs": {
-    "url": "https://github.com/mafintosh/generate-function/issues"
-  },
-  "dependencies": {},
-  "description": "Module that helps you write generated functions in Node",
-  "devDependencies": {
-    "tape": "^2.13.4"
-  },
-  "homepage": "https://github.com/mafintosh/generate-function",
-  "keywords": [
-    "code",
-    "function",
-    "generate",
-    "generation",
-    "performance"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "generate-function",
-  "optionalDependencies": {},
-  "readme": "# generate-function\n\nModule that helps you write generated functions in Node\n\n```\nnpm install generate-function\n```\n\n[![build status](http://img.shields.io/travis/mafintosh/generate-function.svg?style=flat)](http://travis-ci.org/mafintosh/generate-function)\n\n## Disclamer\n\nWriting code that generates code is hard.\nYou should only use this if you really, really, really need this for performance reasons (like schema validators / parsers etc).\n\n## Usage\n\n``` js\nvar genfun = require('generate-function')\n\nvar addNumber = function(val) {\n  var fn = genfun()\n    ('function add(n) {')\n      ('return n + %d', val) // supports format strings to insert values\n    ('}')\n\n  return fn.toFunction() // will compile the function\n}\n\nvar add2 = addNumber(2)\n\nconsole.log('1+2=', add2(1))\nconsole.log(add2.toString()) // prints the generated function\n```\n\nIf you need to close over variables in your generated function pass them to `toFunction(scope)`\n\n``` js\nvar multiply = function(a, b) {\n  return a * b\n}\n\nvar addAndMultiplyNumber = function(val) {\n  var fn = genfun()\n    ('function(n) {')\n      ('if (typeof n !== \"number\") {') // ending a line with { will indent the source\n        ('throw new Error(\"argument should be a number\")')\n      ('}')\n      ('var result = multiply(%d, n+%d)', val, val)\n      ('return result')\n    ('}')\n\n  // use fn.toString() if you want to see the generated source\n\n  return fn.toFunction({\n    multiply: multiply\n  })\n}\n\nvar addAndMultiply2 = addAndMultiplyNumber(2)\n\nconsole.log('(3 + 2) * 2 =', addAndMultiply2(3))\n```\n\n## Related\n\nSee [generate-object-property](https://github.com/mafintosh/generate-object-property) if you need to safely generate code that\ncan be used to reference an object property\n\n## License\n\nMIT",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/mafintosh/generate-function.git"
-  },
-  "scripts": {
-    "test": "tape test.js"
-  },
-  "version": "2.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/test.js
deleted file mode 100644
index 2768893eb150666a3edd1eb61da0890de55ca213..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-function/test.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var tape = require('tape')
-var genfun = require('./')
-
-tape('generate add function', function(t) {
-  var fn = genfun()
-    ('function add(n) {')
-      ('return n + %d', 42)
-    ('}')
-
-  t.same(fn.toString(), 'function add(n) {\n  return n + 42\n}', 'code is indented')
-  t.same(fn.toFunction()(10), 52, 'function works')
-  t.end()
-})
-
-tape('generate function + closed variables', function(t) {
-  var fn = genfun()
-    ('function add(n) {')
-      ('return n + %d + number', 42)
-    ('}')
-
-  var notGood = fn.toFunction()
-  var good = fn.toFunction({number:10})
-
-  try {
-    notGood(10)
-    t.ok(false, 'function should not work')
-  } catch (err) {
-    t.same(err.message, 'number is not defined', 'throws reference error')
-  }
-
-  t.same(good(11), 63, 'function with closed var works')
-  t.end()
-})
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/.npmignore
deleted file mode 100644
index 3c3629e647f5ddf82548912e337bea9826b434af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/.travis.yml
deleted file mode 100644
index 6e5919de39a312330fd1abf64237c4b6ad10c56b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/.travis.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-language: node_js
-node_js:
-  - "0.10"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/LICENSE
deleted file mode 100644
index 757562ec59276bff35792501d88fe83b34acca9a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Mathias Buus
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/README.md
deleted file mode 100644
index 0ee04613de54c7f0b0c90fa4b6e96985d39fcb57..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/README.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# generate-object-property
-
-Generate safe JS code that can used to reference a object property
-
-	npm install generate-object-property
-
-[![build status](http://img.shields.io/travis/mafintosh/generate-object-property.svg?style=flat)](http://travis-ci.org/mafintosh/generate-object-property)
-
-## Usage
-
-``` js
-var gen = require('generate-object-property');
-console.log(gen('a','b')); // prints a.b
-console.log(gen('a', 'foo-bar')); // prints a["foo-bar"]
-```
-
-## License
-
-MIT
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js
deleted file mode 100644
index 5dc9f776d9853919376c13efb900eac0d03ffdb5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/index.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var isProperty = require('is-property')
-
-var gen = function(obj, prop) {
-  return isProperty(prop) ? obj+'.'+prop : obj+'['+JSON.stringify(prop)+']'
-}
-
-gen.valid = isProperty
-gen.property = function (prop) {
- return isProperty(prop) ? prop : JSON.stringify(prop)
-}
-
-module.exports = gen
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/.npmignore
deleted file mode 100644
index 8ecfa25a868d833ad4e8d1a134517915370c6836..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/.npmignore
+++ /dev/null
@@ -1,17 +0,0 @@
-lib-cov
-*.seed
-*.log
-*.csv
-*.dat
-*.out
-*.pid
-*.gz
-
-pids
-logs
-results
-
-npm-debug.log
-node_modules/*
-*.DS_Store
-test/*
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/LICENSE
deleted file mode 100644
index 8ce206a84544ae1623a4c94db88c18c2d9ed8009..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-
-The MIT License (MIT)
-
-Copyright (c) 2013 Mikola Lysenko
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/README.md
deleted file mode 100644
index ef1d00b62f8022ad49b6de9e451834137a5aa57a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/README.md
+++ /dev/null
@@ -1,28 +0,0 @@
-is-property
-===========
-Tests if a property of a JavaScript object can be accessed using the dot (.) notation or if it must be enclosed in brackets, (ie use x[" ... "])
-
-Example
--------
-
-```javascript
-var isProperty = require("is-property")
-
-console.log(isProperty("foo"))  //Prints true
-console.log(isProperty("0"))    //Prints false
-```
-
-Install
--------
-
-    npm install is-property
-    
-### `require("is-property")(str)`
-Checks if str is a property
-
-* `str` is a string which we will test if it is a property or not
-
-**Returns** true or false depending if str is a property
-
-## Credits
-(c) 2013 Mikola Lysenko. MIT License
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js
deleted file mode 100644
index db58b47b27a46b1e03b2c20ce781a1c1703464f6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/is-property.js
+++ /dev/null
@@ -1,5 +0,0 @@
-"use strict"
-function isProperty(str) {
-  return /^[$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc][$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc0-9\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19b0-\u19c0\u19c8\u19c9\u19d0-\u19d9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f]*$/.test(str)
-}
-module.exports = isProperty
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json
deleted file mode 100644
index a31336ea564b981f52435dbdba03850f792d3c84..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/node_modules/is-property/package.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-  "_from": "is-property@>=1.0.0 <2.0.0",
-  "_id": "is-property@1.0.2",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/is-my-json-valid/generate-object-property/is-property",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/is-my-json-valid/generate-object-property"
-  ],
-  "_resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
-  "_shasum": "57fe1c4e48474edd65b09911f26b1cd4095dda84",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "Mikola Lysenko"
-  },
-  "bugs": {
-    "url": "https://github.com/mikolalysenko/is-property/issues"
-  },
-  "dependencies": {},
-  "description": "Tests if a JSON property can be accessed using . syntax",
-  "devDependencies": {
-    "tape": "~1.0.4"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "gitHead": "0a85ea5b6b1264ea1cdecc6e5cf186adbb3ffc50",
-  "homepage": "https://github.com/mikolalysenko/is-property#readme",
-  "keywords": [
-    ".",
-    "[]",
-    "bracket",
-    "dot",
-    "is",
-    "json",
-    "property"
-  ],
-  "license": "MIT",
-  "main": "is-property.js",
-  "name": "is-property",
-  "optionalDependencies": {},
-  "readme": "is-property\n===========\nTests if a property of a JavaScript object can be accessed using the dot (.) notation or if it must be enclosed in brackets, (ie use x[\" ... \"])\n\nExample\n-------\n\n```javascript\nvar isProperty = require(\"is-property\")\n\nconsole.log(isProperty(\"foo\"))  //Prints true\nconsole.log(isProperty(\"0\"))    //Prints false\n```\n\nInstall\n-------\n\n    npm install is-property\n    \n### `require(\"is-property\")(str)`\nChecks if str is a property\n\n* `str` is a string which we will test if it is a property or not\n\n**Returns** true or false depending if str is a property\n\n## Credits\n(c) 2013 Mikola Lysenko. MIT License",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/mikolalysenko/is-property.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json
deleted file mode 100644
index f71abf0446b05cd732b38fabc37f1d4a8b06616c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "_from": "generate-object-property@>=1.1.0 <2.0.0",
-  "_id": "generate-object-property@1.2.0",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/is-my-json-valid/generate-object-property",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/is-my-json-valid"
-  ],
-  "_resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
-  "_shasum": "9c0e1c40308ce804f4783618b937fa88f99d50d0",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "Mathias Buus",
-    "url": "@mafintosh"
-  },
-  "bugs": {
-    "url": "https://github.com/mafintosh/generate-object-property/issues"
-  },
-  "dependencies": {
-    "is-property": "^1.0.0"
-  },
-  "description": "Generate safe JS code that can used to reference a object property",
-  "devDependencies": {
-    "tape": "^2.13.0"
-  },
-  "homepage": "https://github.com/mafintosh/generate-object-property",
-  "license": "MIT",
-  "main": "index.js",
-  "name": "generate-object-property",
-  "optionalDependencies": {},
-  "readme": "# generate-object-property\n\nGenerate safe JS code that can used to reference a object property\n\n\tnpm install generate-object-property\n\n[![build status](http://img.shields.io/travis/mafintosh/generate-object-property.svg?style=flat)](http://travis-ci.org/mafintosh/generate-object-property)\n\n## Usage\n\n``` js\nvar gen = require('generate-object-property');\nconsole.log(gen('a','b')); // prints a.b\nconsole.log(gen('a', 'foo-bar')); // prints a[\"foo-bar\"]\n```\n\n## License\n\nMIT",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/mafintosh/generate-object-property.git"
-  },
-  "scripts": {
-    "test": "tape test.js"
-  },
-  "version": "1.2.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/test.js
deleted file mode 100644
index 6c299c67fd3165e7c13374d08951fa3b0a31cf23..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/generate-object-property/test.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var tape = require('tape')
-var gen = require('./')
-
-tape('valid', function(t) {
-  t.same(gen('a', 'b'), 'a.b')
-  t.end()
-})
-
-tape('invalid', function(t) {
-  t.same(gen('a', '-b'), 'a["-b"]')
-  t.end()
-})
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/.travis.yml
deleted file mode 100644
index 9338bf147031dfdca4e0cbdebb572b0a81b25b62..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/.travis.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-language: "node_js"
-node_js:
-  - 0.6
-  - 0.8
-  - 0.10
-  - 0.11
-  - 0.12
-  - iojs-v1.0
-  - iojs-v2.0
-  - iojs
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/README.md
deleted file mode 100644
index e096dfa5d62a7743d2c3bd5e5520418fb7b62e09..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# JSON Pointer for nodejs
-
-This is an implementation of [JSON Pointer](http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-08).
-
-## Usage
-
-    var jsonpointer = require("jsonpointer");
-    var obj = { foo: 1, bar: { baz: 2}, qux: [3, 4, 5]};
-    var one = jsonpointer.get(obj, "/foo");
-    var two = jsonpointer.get(obj, "/bar/baz");
-    var three = jsonpointer.get(obj, "/qux/0");
-    var four = jsonpointer.get(obj, "/qux/1");
-    var five = jsonpointer.get(obj, "/qux/2");
-    var notfound = jsonpointer.get(obj, "/quo"); // returns null
-
-    jsonpointer.set(obj, "/foo", 6); // obj.foo = 6;
-
-## Testing
-
-    $ node test.js
-    All tests pass.
-    $
-
-[![Build Status](https://travis-ci.org/janl/node-jsonpointer.png?branch=master)](https://travis-ci.org/janl/node-jsonpointer)
-
-## Author
-
-(c) 2011 Jan Lehnardt <jan@apache.org>
-
-## License
-
-MIT License.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js
deleted file mode 100644
index 006f85ef3a5489cf15db857aa28c881765a1427e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/jsonpointer.js
+++ /dev/null
@@ -1,76 +0,0 @@
-var untilde = function(str) {
-  return str.replace(/~./g, function(m) {
-    switch (m) {
-      case "~0":
-        return "~";
-      case "~1":
-        return "/";
-    }
-    throw new Error("Invalid tilde escape: " + m);
-  });
-}
-
-var traverse = function(obj, pointer, value) {
-  // assert(isArray(pointer))
-  var part = untilde(pointer.shift());
-  if(!obj.hasOwnProperty(part)) {
-    return null;
-  }
-  if(pointer.length !== 0) { // keep traversin!
-    return traverse(obj[part], pointer, value);
-  }
-  // we're done
-  if(typeof value === "undefined") {
-    // just reading
-    return obj[part];
-  }
-  // set new value, return old value
-  var old_value = obj[part];
-  if(value === null) {
-    delete obj[part];
-  } else {
-    obj[part] = value;
-  }
-  return old_value;
-}
-
-var validate_input = function(obj, pointer) {
-  if(typeof obj !== "object") {
-    throw new Error("Invalid input object.");
-  }
-
-  if(pointer === "") {
-    return [];
-  }
-
-  if(!pointer) {
-    throw new Error("Invalid JSON pointer.");
-  }
-
-  pointer = pointer.split("/");
-  var first = pointer.shift();
-  if (first !== "") {
-    throw new Error("Invalid JSON pointer.");
-  }
-
-  return pointer;
-}
-
-var get = function(obj, pointer) {
-  pointer = validate_input(obj, pointer);
-  if (pointer.length === 0) {
-    return obj;
-  }
-  return traverse(obj, pointer);
-}
-
-var set = function(obj, pointer, value) {
-  pointer = validate_input(obj, pointer);
-  if (pointer.length === 0) {
-    throw new Error("Invalid JSON pointer for set.")
-  }
-  return traverse(obj, pointer, value);
-}
-
-exports.get = get
-exports.set = set
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json
deleted file mode 100644
index 3232338c8fa7ef62c5b85c9bec9debc8b402c41e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/package.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-  "_from": "jsonpointer@2.0.0",
-  "_id": "jsonpointer@2.0.0",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/is-my-json-valid/jsonpointer",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/is-my-json-valid"
-  ],
-  "_resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz",
-  "_shasum": "3af1dd20fe85463910d469a385e33017d2a030d9",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "jan@apache.org",
-    "name": "Jan Lehnardt"
-  },
-  "bugs": {
-    "url": "http://github.com/janl/node-jsonpointer/issues"
-  },
-  "contributors": [
-    {
-      "name": "Joe Hildebrand",
-      "email": "joe-github@cursive.net"
-    }
-  ],
-  "dependencies": {},
-  "description": "Simple JSON Addressing.",
-  "devDependencies": {},
-  "engines": {
-    "node": ">=0.6.0"
-  },
-  "homepage": "https://github.com/janl/node-jsonpointer#readme",
-  "license": "MIT",
-  "main": "./jsonpointer",
-  "name": "jsonpointer",
-  "optionalDependencies": {},
-  "readme": "# JSON Pointer for nodejs\n\nThis is an implementation of [JSON Pointer](http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-08).\n\n## Usage\n\n    var jsonpointer = require(\"jsonpointer\");\n    var obj = { foo: 1, bar: { baz: 2}, qux: [3, 4, 5]};\n    var one = jsonpointer.get(obj, \"/foo\");\n    var two = jsonpointer.get(obj, \"/bar/baz\");\n    var three = jsonpointer.get(obj, \"/qux/0\");\n    var four = jsonpointer.get(obj, \"/qux/1\");\n    var five = jsonpointer.get(obj, \"/qux/2\");\n    var notfound = jsonpointer.get(obj, \"/quo\"); // returns null\n\n    jsonpointer.set(obj, \"/foo\", 6); // obj.foo = 6;\n\n## Testing\n\n    $ node test.js\n    All tests pass.\n    $\n\n[![Build Status](https://travis-ci.org/janl/node-jsonpointer.png?branch=master)](https://travis-ci.org/janl/node-jsonpointer)\n\n## Author\n\n(c) 2011 Jan Lehnardt <jan@apache.org>\n\n## License\n\nMIT License.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+ssh://git@github.com/janl/node-jsonpointer.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "tags": [
-    "simple",
-    "util",
-    "util",
-    "utility"
-  ],
-  "version": "2.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/test.js
deleted file mode 100644
index 1c67d7f7efc8980a06bc5821700b0c0dbf11cfd5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/jsonpointer/test.js
+++ /dev/null
@@ -1,98 +0,0 @@
-var assert = require("assert");
-var jsonpointer = require("./jsonpointer");
-
-var obj = {
-  a: 1,
-  b: {
-    c: 2
-  },
-  d: {
-    e: [{a:3}, {b:4}, {c:5}]
-  }
-};
-
-assert.equal(jsonpointer.get(obj, "/a"), 1);
-assert.equal(jsonpointer.get(obj, "/b/c"), 2);
-assert.equal(jsonpointer.get(obj, "/d/e/0/a"), 3);
-assert.equal(jsonpointer.get(obj, "/d/e/1/b"), 4);
-assert.equal(jsonpointer.get(obj, "/d/e/2/c"), 5);
-
-// set returns old value
-assert.equal(jsonpointer.set(obj, "/a", 2), 1);
-assert.equal(jsonpointer.set(obj, "/b/c", 3), 2);
-assert.equal(jsonpointer.set(obj, "/d/e/0/a", 4), 3);
-assert.equal(jsonpointer.set(obj, "/d/e/1/b", 5), 4);
-assert.equal(jsonpointer.set(obj, "/d/e/2/c", 6), 5);
-
-assert.equal(jsonpointer.get(obj, "/a"), 2);
-assert.equal(jsonpointer.get(obj, "/b/c"), 3);
-assert.equal(jsonpointer.get(obj, "/d/e/0/a"), 4);
-assert.equal(jsonpointer.get(obj, "/d/e/1/b"), 5);
-assert.equal(jsonpointer.get(obj, "/d/e/2/c"), 6);
-
-assert.equal(jsonpointer.get(obj, ""), obj);
-assert.throws(function(){ jsonpointer.get(obj, "a"); }, validateError);
-assert.throws(function(){ jsonpointer.get(obj, "a/"); }, validateError);
-
-function validateError(err) {
-  if ( (err instanceof Error) && /Invalid JSON pointer/.test(err.message) ) {
-      return true;
-  }
-}
-
-var complexKeys = {
-  "a/b": {
-    c: 1
-  },
-  d: {
-    "e/f": 2
-  },
-  "~1": 3,
-  "01": 4
-}
-
-assert.equal(jsonpointer.get(complexKeys, "/a~1b/c"), 1);
-assert.equal(jsonpointer.get(complexKeys, "/d/e~1f"), 2);
-assert.equal(jsonpointer.get(complexKeys, "/~01"), 3);
-assert.equal(jsonpointer.get(complexKeys, "/01"), 4);
-assert.equal(jsonpointer.get(complexKeys, "/a/b/c"), null);
-assert.equal(jsonpointer.get(complexKeys, "/~1"), null);
-
-// draft-ietf-appsawg-json-pointer-08 has special array rules
-var ary = [ "zero", "one", "two" ];
-assert.equal(jsonpointer.get(ary, "/01"), null);
-
-//assert.equal(jsonpointer.set(ary, "/-", "three"), null);
-//assert.equal(ary[3], "three");
-
-// Examples from the draft:
-var example = {
-  "foo": ["bar", "baz"],
-  "": 0,
-  "a/b": 1,
-  "c%d": 2,
-  "e^f": 3,
-  "g|h": 4,
-  "i\\j": 5,
-  "k\"l": 6,
-  " ": 7,
-  "m~n": 8
-};
-
-assert.equal(jsonpointer.get(example, ""), example);
-var ans = jsonpointer.get(example, "/foo");
-assert.equal(ans.length, 2);
-assert.equal(ans[0], "bar");
-assert.equal(ans[1], "baz");
-assert.equal(jsonpointer.get(example, "/foo/0"), "bar");
-assert.equal(jsonpointer.get(example, "/"), 0);
-assert.equal(jsonpointer.get(example, "/a~1b"), 1);
-assert.equal(jsonpointer.get(example, "/c%d"), 2);
-assert.equal(jsonpointer.get(example, "/e^f"), 3);
-assert.equal(jsonpointer.get(example, "/g|h"), 4);
-assert.equal(jsonpointer.get(example, "/i\\j"), 5);
-assert.equal(jsonpointer.get(example, "/k\"l"), 6);
-assert.equal(jsonpointer.get(example, "/ "), 7);
-assert.equal(jsonpointer.get(example, "/m~0n"), 8);
-
-console.log("All tests pass.");
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/.jshintrc b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/.jshintrc
deleted file mode 100644
index 77887b5f0f2efc24bd55430cb6f95f8a0cad89d8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/.jshintrc
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-    "maxdepth": 4,
-    "maxstatements": 200,
-    "maxcomplexity": 12,
-    "maxlen": 80,
-    "maxparams": 5,
-
-    "curly": true,
-    "eqeqeq": true,
-    "immed": true,
-    "latedef": false,
-    "noarg": true,
-    "noempty": true,
-    "nonew": true,
-    "undef": true,
-    "unused": "vars",
-    "trailing": true,
-
-    "quotmark": true,
-    "expr": true,
-    "asi": true,
-
-    "browser": false,
-    "esnext": true,
-    "devel": false,
-    "node": false,
-    "nonstandard": false,
-
-    "predef": ["require", "module", "__dirname", "__filename"]
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/.npmignore
deleted file mode 100644
index 3c3629e647f5ddf82548912e337bea9826b434af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/LICENCE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/LICENCE
deleted file mode 100644
index 1a14b437e87a8f3b7cd67b0c164b84b5575b554c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/LICENCE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2012-2014 Raynos.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/Makefile b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/Makefile
deleted file mode 100644
index d583fcf49dc1a343087a932f9912fab74e2b2f6b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/Makefile
+++ /dev/null
@@ -1,4 +0,0 @@
-browser:
-	node ./support/compile
-
-.PHONY: browser
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/README.md
deleted file mode 100644
index 093cb2978e4af078e3e8f40dd505afd96999569e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# xtend
-
-[![browser support][3]][4]
-
-[![locked](http://badges.github.io/stability-badges/dist/locked.svg)](http://github.com/badges/stability-badges)
-
-Extend like a boss
-
-xtend is a basic utility library which allows you to extend an object by appending all of the properties from each object in a list. When there are identical properties, the right-most property takes precedence.
-
-## Examples
-
-```js
-var extend = require("xtend")
-
-// extend returns a new object. Does not mutate arguments
-var combination = extend({
-    a: "a",
-    b: 'c'
-}, {
-    b: "b"
-})
-// { a: "a", b: "b" }
-```
-
-## Stability status: Locked
-
-## MIT Licenced
-
-
-  [3]: http://ci.testling.com/Raynos/xtend.png
-  [4]: http://ci.testling.com/Raynos/xtend
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/immutable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/immutable.js
deleted file mode 100644
index 94889c9de11a181cec153de1713c8ae14ae4cb43..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/immutable.js
+++ /dev/null
@@ -1,19 +0,0 @@
-module.exports = extend
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-function extend() {
-    var target = {}
-
-    for (var i = 0; i < arguments.length; i++) {
-        var source = arguments[i]
-
-        for (var key in source) {
-            if (hasOwnProperty.call(source, key)) {
-                target[key] = source[key]
-            }
-        }
-    }
-
-    return target
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/mutable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/mutable.js
deleted file mode 100644
index 72debede6ca58592fe93b5ab22d434311a76861b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/mutable.js
+++ /dev/null
@@ -1,17 +0,0 @@
-module.exports = extend
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-
-function extend(target) {
-    for (var i = 1; i < arguments.length; i++) {
-        var source = arguments[i]
-
-        for (var key in source) {
-            if (hasOwnProperty.call(source, key)) {
-                target[key] = source[key]
-            }
-        }
-    }
-
-    return target
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/package.json
deleted file mode 100644
index c66ef21260246c36700b77f8af7bb05a7360b3ac..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/package.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
-  "_from": "xtend@>=4.0.0 <5.0.0",
-  "_id": "xtend@4.0.1",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/is-my-json-valid/xtend",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/is-my-json-valid"
-  ],
-  "_resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
-  "_shasum": "a5c6d532be656e23db820efb943a1f04998d63af",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "raynos2@gmail.com",
-    "name": "Raynos"
-  },
-  "bugs": {
-    "email": "raynos2@gmail.com",
-    "url": "https://github.com/Raynos/xtend/issues"
-  },
-  "contributors": [
-    {
-      "name": "Jake Verbaten"
-    },
-    {
-      "name": "Matt Esch"
-    }
-  ],
-  "dependencies": {},
-  "description": "extend like a boss",
-  "devDependencies": {
-    "tape": "~1.1.0"
-  },
-  "engines": {
-    "node": ">=0.4"
-  },
-  "homepage": "https://github.com/Raynos/xtend",
-  "keywords": [
-    "array",
-    "extend",
-    "merge",
-    "object",
-    "options",
-    "opts"
-  ],
-  "license": "MIT",
-  "main": "immutable",
-  "name": "xtend",
-  "optionalDependencies": {},
-  "readme": "# xtend\n\n[![browser support][3]][4]\n\n[![locked](http://badges.github.io/stability-badges/dist/locked.svg)](http://github.com/badges/stability-badges)\n\nExtend like a boss\n\nxtend is a basic utility library which allows you to extend an object by appending all of the properties from each object in a list. When there are identical properties, the right-most property takes precedence.\n\n## Examples\n\n```js\nvar extend = require(\"xtend\")\n\n// extend returns a new object. Does not mutate arguments\nvar combination = extend({\n    a: \"a\",\n    b: 'c'\n}, {\n    b: \"b\"\n})\n// { a: \"a\", b: \"b\" }\n```\n\n## Stability status: Locked\n\n## MIT Licenced\n\n\n  [3]: http://ci.testling.com/Raynos/xtend.png\n  [4]: http://ci.testling.com/Raynos/xtend\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/Raynos/xtend.git"
-  },
-  "scripts": {
-    "test": "node test"
-  },
-  "testling": {
-    "browsers": [
-      "chrome/22..latest",
-      "chrome/canary",
-      "firefox/16..latest",
-      "firefox/nightly",
-      "ie/7..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest"
-    ],
-    "files": "test.js"
-  },
-  "version": "4.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/test.js
deleted file mode 100644
index 093a2b061e81ae56054714a1096f451c7f8910c4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/node_modules/xtend/test.js
+++ /dev/null
@@ -1,83 +0,0 @@
-var test = require("tape")
-var extend = require("./")
-var mutableExtend = require("./mutable")
-
-test("merge", function(assert) {
-    var a = { a: "foo" }
-    var b = { b: "bar" }
-
-    assert.deepEqual(extend(a, b), { a: "foo", b: "bar" })
-    assert.end()
-})
-
-test("replace", function(assert) {
-    var a = { a: "foo" }
-    var b = { a: "bar" }
-
-    assert.deepEqual(extend(a, b), { a: "bar" })
-    assert.end()
-})
-
-test("undefined", function(assert) {
-    var a = { a: undefined }
-    var b = { b: "foo" }
-
-    assert.deepEqual(extend(a, b), { a: undefined, b: "foo" })
-    assert.deepEqual(extend(b, a), { a: undefined, b: "foo" })
-    assert.end()
-})
-
-test("handle 0", function(assert) {
-    var a = { a: "default" }
-    var b = { a: 0 }
-
-    assert.deepEqual(extend(a, b), { a: 0 })
-    assert.deepEqual(extend(b, a), { a: "default" })
-    assert.end()
-})
-
-test("is immutable", function (assert) {
-    var record = {}
-
-    extend(record, { foo: "bar" })
-    assert.equal(record.foo, undefined)
-    assert.end()
-})
-
-test("null as argument", function (assert) {
-    var a = { foo: "bar" }
-    var b = null
-    var c = void 0
-
-    assert.deepEqual(extend(b, a, c), { foo: "bar" })
-    assert.end()
-})
-
-test("mutable", function (assert) {
-    var a = { foo: "bar" }
-
-    mutableExtend(a, { bar: "baz" })
-
-    assert.equal(a.bar, "baz")
-    assert.end()
-})
-
-test("null prototype", function(assert) {
-    var a = { a: "foo" }
-    var b = Object.create(null)
-    b.b = "bar";
-
-    assert.deepEqual(extend(a, b), { a: "foo", b: "bar" })
-    assert.end()
-})
-
-test("null prototype mutable", function (assert) {
-    var a = { foo: "bar" }
-    var b = Object.create(null)
-    b.bar = "baz";
-
-    mutableExtend(a, b)
-
-    assert.equal(a.bar, "baz")
-    assert.end()
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json
deleted file mode 100644
index 07b46b6e15281ae44074336f98a097e24013da12..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/package.json
+++ /dev/null
@@ -1,49 +0,0 @@
-{
-  "_from": "is-my-json-valid@>=2.12.4 <3.0.0",
-  "_id": "is-my-json-valid@2.13.1",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/is-my-json-valid",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator"
-  ],
-  "_resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.13.1.tgz",
-  "_shasum": "d55778a82feb6b0963ff4be111d5d1684e890707",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "Mathias Buus"
-  },
-  "bugs": {
-    "url": "https://github.com/mafintosh/is-my-json-valid/issues"
-  },
-  "dependencies": {
-    "generate-function": "^2.0.0",
-    "generate-object-property": "^1.1.0",
-    "jsonpointer": "2.0.0",
-    "xtend": "^4.0.0"
-  },
-  "description": "A JSONSchema validator that uses code generation to be extremely fast",
-  "devDependencies": {
-    "tape": "^2.13.4"
-  },
-  "homepage": "https://github.com/mafintosh/is-my-json-valid",
-  "keywords": [
-    "json",
-    "jsonschema",
-    "orderly",
-    "schema"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "is-my-json-valid",
-  "optionalDependencies": {},
-  "readme": "# is-my-json-valid\n\nA [JSONSchema](http://json-schema.org/) validator that uses code generation\nto be extremely fast\n\n```\nnpm install is-my-json-valid\n```\n\nIt passes the entire JSONSchema v4 test suite except for `remoteRefs` and `maxLength`/`minLength` when using unicode surrogate pairs.\n\n[![build status](http://img.shields.io/travis/mafintosh/is-my-json-valid.svg?style=flat)](http://travis-ci.org/mafintosh/is-my-json-valid)\n\n## Usage\n\nSimply pass a schema to compile it\n\n``` js\nvar validator = require('is-my-json-valid')\n\nvar validate = validator({\n  required: true,\n  type: 'object',\n  properties: {\n    hello: {\n      required: true,\n      type: 'string'\n    }\n  }\n})\n\nconsole.log('should be valid', validate({hello: 'world'}))\nconsole.log('should not be valid', validate({}))\n\n// get the last list of errors by checking validate.errors\n// the following will print [{field: 'data.hello', message: 'is required'}]\nconsole.log(validate.errors)\n```\n\nYou can also pass the schema as a string\n\n``` js\nvar validate = validator('{\"type\": ... }')\n```\n\nOptionally you can use the require submodule to load a schema from `__dirname`\n\n``` js\nvar validator = require('is-my-json-valid/require')\nvar validate = validator('my-schema.json')\n```\n\n## Custom formats\n\nis-my-json-valid supports the formats specified in JSON schema v4 (such as date-time).\nIf you want to add your own custom formats pass them as the formats options to the validator\n\n``` js\nvar validate = validator({\n  type: 'string',\n  required: true,\n  format: 'only-a'\n}, {\n  formats: {\n    'only-a': /^a+$/\n  }\n})\n\nconsole.log(validate('aa')) // true\nconsole.log(validate('ab')) // false\n```\n\n## External schemas\n\nYou can pass in external schemas that you reference using the `$ref` attribute as the `schemas` option\n\n``` js\nvar ext = {\n  required: true,\n  type: 'string'\n}\n\nvar schema = {\n  $ref: '#ext' // references another schema called ext\n}\n\n// pass the external schemas as an option\nvar validate = validator(schema, {schemas: {ext: ext}})\n\nvalidate('hello') // returns true\nvalidate(42) // return false\n```\n\n## Filtering away additional properties\n\nis-my-json-valid supports filtering away properties not in the schema\n\n``` js\nvar filter = validator.filter({\n  required: true,\n  type: 'object',\n  properties: {\n    hello: {type: 'string', required: true}\n  },\n  additionalProperties: false\n})\n\nvar doc = {hello: 'world', notInSchema: true}\nconsole.log(filter(doc)) // {hello: 'world'}\n```\n\n## Verbose mode outputs the value on errors\n\nis-my-json-valid outputs the value causing an error when verbose is set to true\n\n``` js\nvar validate = validator({\n  required: true,\n  type: 'object',\n  properties: {\n    hello: {\n      required: true,\n      type: 'string'\n    }\n  }\n}, {\n  verbose: true\n})\n\nvalidate({hello: 100});\nconsole.log(validate.errors) // {field: 'data.hello', message: 'is the wrong type', value: 100, type: 'string'}\n```\n\n## Greedy mode tries to validate as much as possible\n\nBy default is-my-json-valid bails on first validation error but when greedy is\nset to true it tries to validate as much as possible:\n\n``` js\nvar validate = validator({\n  type: 'object',\n  properties: {\n    x: {\n      type: 'number'\n    }\n  },\n  required: ['x', 'y']\n}, {\n  greedy: true\n});\n\nvalidate({x: 'string'});\nconsole.log(validate.errors) // [{field: 'data.y', message: 'is required'},\n                             //  {field: 'data.x', message: 'is the wrong type'}]\n```\n\n## Performance\n\nis-my-json-valid uses code generation to turn your JSON schema into basic javascript code that is easily optimizeable by v8.\n\nAt the time of writing, is-my-json-valid is the __fastest validator__ when running\n\n* [json-schema-benchmark](https://github.com/Muscula/json-schema-benchmark)\n* [cosmicreals.com benchmark](http://cosmicrealms.com/blog/2014/08/29/benchmark-of-node-dot-js-json-validation-modules-part-3/)\n* [jsck benchmark](https://github.com/pandastrike/jsck/issues/72#issuecomment-70992684)\n* [themis benchmark](https://cdn.rawgit.com/playlyfe/themis/master/benchmark/results.html)\n* [z-schema benchmark](https://rawgit.com/zaggino/z-schema/master/benchmark/results.html)\n\nIf you know any other relevant benchmarks open a PR and I'll add them.\n\n## License\n\nMIT\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/mafintosh/is-my-json-valid.git"
-  },
-  "scripts": {
-    "test": "tape test/*.js"
-  },
-  "version": "2.13.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/require.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/require.js
deleted file mode 100644
index 0bfb8a29d47efae6d234db84e7858c4d14f1dee0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/require.js
+++ /dev/null
@@ -1,12 +0,0 @@
-var fs = require('fs')
-var path = require('path')
-var compile = require('./')
-
-delete require.cache[require.resolve(__filename)]
-
-module.exports = function(file, opts) {
-  file = path.join(path.dirname(module.parent.filename), file)
-  if (!fs.existsSync(file) && fs.existsSync(file+'.schema')) file += '.schema'
-  if (!fs.existsSync(file) && fs.existsSync(file+'.json')) file += '.json'
-  return compile(fs.readFileSync(file, 'utf-8'), opts)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/fixtures/cosmic.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/fixtures/cosmic.js
deleted file mode 100644
index 4e0a34b210c52b4ba8769556fcc8128be4678d6e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/fixtures/cosmic.js
+++ /dev/null
@@ -1,84 +0,0 @@
-exports.valid = {
-  fullName : "John Doe",
-  age : 47,
-  state : "Massachusetts",
-  city : "Boston",
-  zip : 16417,
-  married : false,
-  dozen : 12,
-  dozenOrBakersDozen : 13,
-  favoriteEvenNumber : 14,
-  topThreeFavoriteColors : [ "red", "blue", "green" ],
-  favoriteSingleDigitWholeNumbers : [ 7 ],
-  favoriteFiveLetterWord : "coder",
-  emailAddresses :
-  [
-    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@letters-in-local.org",
-    "01234567890@numbers-in-local.net",
-    "&'*+-./=?^_{}~@other-valid-characters-in-local.net",
-    "mixed-1234-in-{+^}-local@sld.net",
-    "a@single-character-in-local.org",
-    "\"quoted\"@sld.com",
-    "\"\\e\\s\\c\\a\\p\\e\\d\"@sld.com",
-    "\"quoted-at-sign@sld.org\"@sld.com",
-    "\"escaped\\\"quote\"@sld.com",
-    "\"back\\slash\"@sld.com",
-    "one-character-third-level@a.example.com",
-    "single-character-in-sld@x.org",
-    "local@dash-in-sld.com",
-    "letters-in-sld@123.com",
-    "one-letter-sld@x.org",
-    "uncommon-tld@sld.museum",
-    "uncommon-tld@sld.travel",
-    "uncommon-tld@sld.mobi",
-    "country-code-tld@sld.uk",
-    "country-code-tld@sld.rw",
-    "local@sld.newTLD",
-    "the-total-length@of-an-entire-address.cannot-be-longer-than-two-hundred-and-fifty-four-characters.and-this-address-is-254-characters-exactly.so-it-should-be-valid.and-im-going-to-add-some-more-words-here.to-increase-the-lenght-blah-blah-blah-blah-bla.org",
-    "the-character-limit@for-each-part.of-the-domain.is-sixty-three-characters.this-is-exactly-sixty-three-characters-so-it-is-valid-blah-blah.com",
-    "local@sub.domains.com"
-  ],
-  ipAddresses : [ "127.0.0.1", "24.48.64.2", "192.168.1.1", "209.68.44.3", "2.2.2.2" ]
-}
-
-exports.invalid = {
-  fullName : null,
-  age : -1,
-  state : 47,
-  city : false,
-  zip : [null],
-  married : "yes",
-  dozen : 50,
-  dozenOrBakersDozen : "over 9000",
-  favoriteEvenNumber : 15,
-  topThreeFavoriteColors : [ "red", 5 ],
-  favoriteSingleDigitWholeNumbers : [ 78, 2, 999 ],
-  favoriteFiveLetterWord : "codernaut",
-  emailAddresses : [],
-  ipAddresses : [ "999.0.099.1", "294.48.64.2346", false, "2221409.64214128.42414.235233", "124124.12412412" ]
-}
-
-exports.schema = { // from cosmic thingy
-    name : "test",
-    type : "object",
-    additionalProperties : false,
-    required : ["fullName", "age", "zip", "married", "dozen", "dozenOrBakersDozen", "favoriteEvenNumber", "topThreeFavoriteColors", "favoriteSingleDigitWholeNumbers", "favoriteFiveLetterWord", "emailAddresses", "ipAddresses"],
-    properties :
-    {
-      fullName                        : { type : "string" },
-      age                             : { type : "integer", minimum : 0 },
-      optionalItem                    : { type : "string" },
-      state                           : { type : "string" },
-      city                            : { type : "string" },
-      zip                             : { type : "integer", minimum : 0, maximum : 99999 },
-      married                         : { type : "boolean" },
-      dozen                           : { type : "integer", minimum : 12, maximum : 12 },
-      dozenOrBakersDozen              : { type : "integer", minimum : 12, maximum : 13 },
-      favoriteEvenNumber              : { type : "integer", multipleOf : 2 },
-      topThreeFavoriteColors          : { type : "array", minItems : 3, maxItems : 3, uniqueItems : true, items : { type : "string" }},
-      favoriteSingleDigitWholeNumbers : { type : "array", minItems : 1, maxItems : 10, uniqueItems : true, items : { type : "integer", minimum : 0, maximum : 9 }},
-      favoriteFiveLetterWord          : { type : "string", minLength : 5, maxLength : 5 },
-      emailAddresses                  : { type : "array", minItems : 1, uniqueItems : true, items : { type : "string", format : "email" }},
-      ipAddresses                     : { type : "array", uniqueItems : true, items : { type : "string", format : "ipv4" }},
-    }
-  }
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/additionalItems.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/additionalItems.json
deleted file mode 100644
index 521745c8d6ed50c5fe078269f9f93be333b5f805..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/additionalItems.json
+++ /dev/null
@@ -1,82 +0,0 @@
-[
-    {
-        "description": "additionalItems as schema",
-        "schema": {
-            "items": [{}],
-            "additionalItems": {"type": "integer"}
-        },
-        "tests": [
-            {
-                "description": "additional items match schema",
-                "data": [ null, 2, 3, 4 ],
-                "valid": true
-            },
-            {
-                "description": "additional items do not match schema",
-                "data": [ null, 2, 3, "foo" ],
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "items is schema, no additionalItems",
-        "schema": {
-            "items": {},
-            "additionalItems": false
-        },
-        "tests": [
-            {
-                "description": "all items match schema",
-                "data": [ 1, 2, 3, 4, 5 ],
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "array of items with no additionalItems",
-        "schema": {
-            "items": [{}, {}, {}],
-            "additionalItems": false
-        },
-        "tests": [
-            {
-                "description": "no additional items present",
-                "data": [ 1, 2, 3 ],
-                "valid": true
-            },
-            {
-                "description": "additional items are not permitted",
-                "data": [ 1, 2, 3, 4 ],
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "additionalItems as false without items",
-        "schema": {"additionalItems": false},
-        "tests": [
-            {
-                "description":
-                    "items defaults to empty schema so everything is valid",
-                "data": [ 1, 2, 3, 4, 5 ],
-                "valid": true
-            },
-            {
-                "description": "ignores non-arrays",
-                "data": {"foo" : "bar"},
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "additionalItems are allowed by default",
-        "schema": {"items": [{"type": "integer"}]},
-        "tests": [
-            {
-                "description": "only the first item is validated",
-                "data": [1, "foo", false],
-                "valid": true
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/additionalProperties.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/additionalProperties.json
deleted file mode 100644
index 40831f9e9aa135fbd9b698b3a212cea5276e72c7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/additionalProperties.json
+++ /dev/null
@@ -1,88 +0,0 @@
-[
-    {
-        "description":
-            "additionalProperties being false does not allow other properties",
-        "schema": {
-            "properties": {"foo": {}, "bar": {}},
-            "patternProperties": { "^v": {} },
-            "additionalProperties": false
-        },
-        "tests": [
-            {
-                "description": "no additional properties is valid",
-                "data": {"foo": 1},
-                "valid": true
-            },
-            {
-                "description": "an additional property is invalid",
-                "data": {"foo" : 1, "bar" : 2, "quux" : "boom"},
-                "valid": false
-            },
-            {
-                "description": "ignores non-objects",
-                "data": [1, 2, 3],
-                "valid": true
-            },
-            {
-                "description": "patternProperties are not additional properties",
-                "data": {"foo":1, "vroom": 2},
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description":
-            "additionalProperties allows a schema which should validate",
-        "schema": {
-            "properties": {"foo": {}, "bar": {}},
-            "additionalProperties": {"type": "boolean"}
-        },
-        "tests": [
-            {
-                "description": "no additional properties is valid",
-                "data": {"foo": 1},
-                "valid": true
-            },
-            {
-                "description": "an additional valid property is valid",
-                "data": {"foo" : 1, "bar" : 2, "quux" : true},
-                "valid": true
-            },
-            {
-                "description": "an additional invalid property is invalid",
-                "data": {"foo" : 1, "bar" : 2, "quux" : 12},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description":
-            "additionalProperties can exist by itself",
-        "schema": {
-            "additionalProperties": {"type": "boolean"}
-        },
-        "tests": [
-            {
-                "description": "an additional valid property is valid",
-                "data": {"foo" : true},
-                "valid": true
-            },
-            {
-                "description": "an additional invalid property is invalid",
-                "data": {"foo" : 1},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "additionalProperties are allowed by default",
-        "schema": {"properties": {"foo": {}, "bar": {}}},
-        "tests": [
-            {
-                "description": "additional properties are allowed",
-                "data": {"foo": 1, "bar": 2, "quux": true},
-                "valid": true
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/allOf.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/allOf.json
deleted file mode 100644
index bbb5f89e4bc5e105f848126ca731201f32d2c5b8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/allOf.json
+++ /dev/null
@@ -1,112 +0,0 @@
-[
-    {
-        "description": "allOf",
-        "schema": {
-            "allOf": [
-                {
-                    "properties": {
-                        "bar": {"type": "integer"}
-                    },
-                    "required": ["bar"]
-                },
-                {
-                    "properties": {
-                        "foo": {"type": "string"}
-                    },
-                    "required": ["foo"]
-                }
-            ]
-        },
-        "tests": [
-            {
-                "description": "allOf",
-                "data": {"foo": "baz", "bar": 2},
-                "valid": true
-            },
-            {
-                "description": "mismatch second",
-                "data": {"foo": "baz"},
-                "valid": false
-            },
-            {
-                "description": "mismatch first",
-                "data": {"bar": 2},
-                "valid": false
-            },
-            {
-                "description": "wrong type",
-                "data": {"foo": "baz", "bar": "quux"},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "allOf with base schema",
-        "schema": {
-            "properties": {"bar": {"type": "integer"}},
-            "required": ["bar"],
-            "allOf" : [
-                {
-                    "properties": {
-                        "foo": {"type": "string"}
-                    },
-                    "required": ["foo"]
-                },
-                {
-                    "properties": {
-                        "baz": {"type": "null"}
-                    },
-                    "required": ["baz"]
-                }
-            ]
-        },
-        "tests": [
-            {
-                "description": "valid",
-                "data": {"foo": "quux", "bar": 2, "baz": null},
-                "valid": true
-            },
-            {
-                "description": "mismatch base schema",
-                "data": {"foo": "quux", "baz": null},
-                "valid": false
-            },
-            {
-                "description": "mismatch first allOf",
-                "data": {"bar": 2, "baz": null},
-                "valid": false
-            },
-            {
-                "description": "mismatch second allOf",
-                "data": {"foo": "quux", "bar": 2},
-                "valid": false
-            },
-            {
-                "description": "mismatch both",
-                "data": {"bar": 2},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "allOf simple types",
-        "schema": {
-            "allOf": [
-                {"maximum": 30},
-                {"minimum": 20}
-            ]
-        },
-        "tests": [
-            {
-                "description": "valid",
-                "data": 25,
-                "valid": true
-            },
-            {
-                "description": "mismatch one",
-                "data": 35,
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/anyOf.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/anyOf.json
deleted file mode 100644
index a58714afd89277abdb180d592a3a38a1465de731..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/anyOf.json
+++ /dev/null
@@ -1,68 +0,0 @@
-[
-    {
-        "description": "anyOf",
-        "schema": {
-            "anyOf": [
-                {
-                    "type": "integer"
-                },
-                {
-                    "minimum": 2
-                }
-            ]
-        },
-        "tests": [
-            {
-                "description": "first anyOf valid",
-                "data": 1,
-                "valid": true
-            },
-            {
-                "description": "second anyOf valid",
-                "data": 2.5,
-                "valid": true
-            },
-            {
-                "description": "both anyOf valid",
-                "data": 3,
-                "valid": true
-            },
-            {
-                "description": "neither anyOf valid",
-                "data": 1.5,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "anyOf with base schema",
-        "schema": {
-            "type": "string",
-            "anyOf" : [
-                {
-                    "maxLength": 2
-                },
-                {
-                    "minLength": 4
-                }
-            ]
-        },
-        "tests": [
-            {
-                "description": "mismatch base schema",
-                "data": 3,
-                "valid": false
-            },
-            {
-                "description": "one anyOf valid",
-                "data": "foobar",
-                "valid": true
-            },
-            {
-                "description": "both anyOf invalid",
-                "data": "foo",
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/bignum.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/bignum.json
deleted file mode 100644
index ccc7c17fe8d504002d8f6100b6cfd3e15d8aca46..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/bignum.json
+++ /dev/null
@@ -1,107 +0,0 @@
-[
-    {
-        "description": "integer",
-        "schema": {"type": "integer"},
-        "tests": [
-            {
-                "description": "a bignum is an integer",
-                "data": 12345678910111213141516171819202122232425262728293031,
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "number",
-        "schema": {"type": "number"},
-        "tests": [
-            {
-                "description": "a bignum is a number",
-                "data": 98249283749234923498293171823948729348710298301928331,
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "integer",
-        "schema": {"type": "integer"},
-        "tests": [
-            {
-                "description": "a negative bignum is an integer",
-                "data": -12345678910111213141516171819202122232425262728293031,
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "number",
-        "schema": {"type": "number"},
-        "tests": [
-            {
-                "description": "a negative bignum is a number",
-                "data": -98249283749234923498293171823948729348710298301928331,
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "string",
-        "schema": {"type": "string"},
-        "tests": [
-            {
-                "description": "a bignum is not a string",
-                "data": 98249283749234923498293171823948729348710298301928331,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "integer comparison",
-        "schema": {"maximum": 18446744073709551615},
-        "tests": [
-            {
-                "description": "comparison works for high numbers",
-                "data": 18446744073709551600,
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "float comparison with high precision",
-        "schema": {
-            "maximum": 972783798187987123879878123.18878137,
-            "exclusiveMaximum": true
-        },
-        "tests": [
-            {
-                "description": "comparison works for high numbers",
-                "data": 972783798187987123879878123.188781371,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "integer comparison",
-        "schema": {"minimum": -18446744073709551615},
-        "tests": [
-            {
-                "description": "comparison works for very negative numbers",
-                "data": -18446744073709551600,
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "float comparison with high precision on negative numbers",
-        "schema": {
-            "minimum": -972783798187987123879878123.18878137,
-            "exclusiveMinimum": true
-        },
-        "tests": [
-            {
-                "description": "comparison works for very negative numbers",
-                "data": -972783798187987123879878123.188781371,
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/default.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/default.json
deleted file mode 100644
index 17629779fbeabea738a101fba2b305990e096466..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/default.json
+++ /dev/null
@@ -1,49 +0,0 @@
-[
-    {
-        "description": "invalid type for default",
-        "schema": {
-            "properties": {
-                "foo": {
-                    "type": "integer",
-                    "default": []
-                }
-            }
-        },
-        "tests": [
-            {
-                "description": "valid when property is specified",
-                "data": {"foo": 13},
-                "valid": true
-            },
-            {
-                "description": "still valid when the invalid default is used",
-                "data": {},
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "invalid string value for default",
-        "schema": {
-            "properties": {
-                "bar": {
-                    "type": "string",
-                    "minLength": 4,
-                    "default": "bad"
-                }
-            }
-        },
-        "tests": [
-            {
-                "description": "valid when property is specified",
-                "data": {"bar": "good"},
-                "valid": true
-            },
-            {
-                "description": "still valid when the invalid default is used",
-                "data": {},
-                "valid": true
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/definitions.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/definitions.json
deleted file mode 100644
index cf935a321532a6bd7e801437f765bd9ce88a390b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/definitions.json
+++ /dev/null
@@ -1,32 +0,0 @@
-[
-    {
-        "description": "valid definition",
-        "schema": {"$ref": "http://json-schema.org/draft-04/schema#"},
-        "tests": [
-            {
-                "description": "valid definition schema",
-                "data": {
-                    "definitions": {
-                        "foo": {"type": "integer"}
-                    }
-                },
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "invalid definition",
-        "schema": {"$ref": "http://json-schema.org/draft-04/schema#"},
-        "tests": [
-            {
-                "description": "invalid definition schema",
-                "data": {
-                    "definitions": {
-                        "foo": {"type": 1}
-                    }
-                },
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/dependencies.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/dependencies.json
deleted file mode 100644
index 7b9b16a7e125ff69ac1f52032dffab9e880a426c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/dependencies.json
+++ /dev/null
@@ -1,113 +0,0 @@
-[
-    {
-        "description": "dependencies",
-        "schema": {
-            "dependencies": {"bar": ["foo"]}
-        },
-        "tests": [
-            {
-                "description": "neither",
-                "data": {},
-                "valid": true
-            },
-            {
-                "description": "nondependant",
-                "data": {"foo": 1},
-                "valid": true
-            },
-            {
-                "description": "with dependency",
-                "data": {"foo": 1, "bar": 2},
-                "valid": true
-            },
-            {
-                "description": "missing dependency",
-                "data": {"bar": 2},
-                "valid": false
-            },
-            {
-                "description": "ignores non-objects",
-                "data": "foo",
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "multiple dependencies",
-        "schema": {
-            "dependencies": {"quux": ["foo", "bar"]}
-        },
-        "tests": [
-            {
-                "description": "neither",
-                "data": {},
-                "valid": true
-            },
-            {
-                "description": "nondependants",
-                "data": {"foo": 1, "bar": 2},
-                "valid": true
-            },
-            {
-                "description": "with dependencies",
-                "data": {"foo": 1, "bar": 2, "quux": 3},
-                "valid": true
-            },
-            {
-                "description": "missing dependency",
-                "data": {"foo": 1, "quux": 2},
-                "valid": false
-            },
-            {
-                "description": "missing other dependency",
-                "data": {"bar": 1, "quux": 2},
-                "valid": false
-            },
-            {
-                "description": "missing both dependencies",
-                "data": {"quux": 1},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "multiple dependencies subschema",
-        "schema": {
-            "dependencies": {
-                "bar": {
-                    "properties": {
-                        "foo": {"type": "integer"},
-                        "bar": {"type": "integer"}
-                    }
-                }
-            }
-        },
-        "tests": [
-            {
-                "description": "valid",
-                "data": {"foo": 1, "bar": 2},
-                "valid": true
-            },
-            {
-                "description": "no dependency",
-                "data": {"foo": "quux"},
-                "valid": true
-            },
-            {
-                "description": "wrong type",
-                "data": {"foo": "quux", "bar": 2},
-                "valid": false
-            },
-            {
-                "description": "wrong type other",
-                "data": {"foo": 2, "bar": "quux"},
-                "valid": false
-            },
-            {
-                "description": "wrong type both",
-                "data": {"foo": "quux", "bar": "quux"},
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/enum.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/enum.json
deleted file mode 100644
index f124436a7d9040e44bb08f930f2e56945acd8027..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/enum.json
+++ /dev/null
@@ -1,72 +0,0 @@
-[
-    {
-        "description": "simple enum validation",
-        "schema": {"enum": [1, 2, 3]},
-        "tests": [
-            {
-                "description": "one of the enum is valid",
-                "data": 1,
-                "valid": true
-            },
-            {
-                "description": "something else is invalid",
-                "data": 4,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "heterogeneous enum validation",
-        "schema": {"enum": [6, "foo", [], true, {"foo": 12}]},
-        "tests": [
-            {
-                "description": "one of the enum is valid",
-                "data": [],
-                "valid": true
-            },
-            {
-                "description": "something else is invalid",
-                "data": null,
-                "valid": false
-            },
-            {
-                "description": "objects are deep compared",
-                "data": {"foo": false},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "enums in properties",
-        "schema": {
-           "type":"object",
-		     "properties": {
-		        "foo": {"enum":["foo"]},
-		        "bar": {"enum":["bar"]}
-		     },
-		     "required": ["bar"]
-		  },
-        "tests": [
-            {
-                "description": "both properties are valid",
-                "data": {"foo":"foo", "bar":"bar"},
-                "valid": true
-            },
-            {
-                "description": "missing optional property is valid",
-                "data": {"bar":"bar"},
-                "valid": true
-            },
-            {
-                "description": "missing required property is invalid",
-                "data": {"foo":"foo"},
-                "valid": false
-            },
-            {
-                "description": "missing all properties is invalid",
-                "data": {},
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/format.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/format.json
deleted file mode 100644
index 53c5d2519056c62773afe23b2cdccf1c9a8d3ede..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/format.json
+++ /dev/null
@@ -1,143 +0,0 @@
-[
-    {
-        "description": "validation of date-time strings",
-        "schema": {"format": "date-time"},
-        "tests": [
-            {
-                "description": "a valid date-time string",
-                "data": "1963-06-19T08:30:06.283185Z",
-                "valid": true
-            },
-            {
-                "description": "an invalid date-time string",
-                "data": "06/19/1963 08:30:06 PST",
-                "valid": false
-            },
-            {
-                "description": "only RFC3339 not all of ISO 8601 are valid",
-                "data": "2013-350T01:01:01",
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "validation of URIs",
-        "schema": {"format": "uri"},
-        "tests": [
-            {
-                "description": "a valid URI",
-                "data": "http://foo.bar/?baz=qux#quux",
-                "valid": true
-            },
-            {
-                "description": "an invalid URI",
-                "data": "\\\\WINDOWS\\fileshare",
-                "valid": false
-            },
-            {
-                "description": "an invalid URI though valid URI reference",
-                "data": "abc",
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "validation of e-mail addresses",
-        "schema": {"format": "email"},
-        "tests": [
-            {
-                "description": "a valid e-mail address",
-                "data": "joe.bloggs@example.com",
-                "valid": true
-            },
-            {
-                "description": "an invalid e-mail address",
-                "data": "2962",
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "validation of IP addresses",
-        "schema": {"format": "ipv4"},
-        "tests": [
-            {
-                "description": "a valid IP address",
-                "data": "192.168.0.1",
-                "valid": true
-            },
-            {
-                "description": "an IP address with too many components",
-                "data": "127.0.0.0.1",
-                "valid": false
-            },
-            {
-                "description": "an IP address with out-of-range values",
-                "data": "256.256.256.256",
-                "valid": false
-            },
-            {
-                "description": "an IP address without 4 components",
-                "data": "127.0",
-                "valid": false
-            },
-            {
-                "description": "an IP address as an integer",
-                "data": "0x7f000001",
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "validation of IPv6 addresses",
-        "schema": {"format": "ipv6"},
-        "tests": [
-            {
-                "description": "a valid IPv6 address",
-                "data": "::1",
-                "valid": true
-            },
-            {
-                "description": "an IPv6 address with out-of-range values",
-                "data": "12345::",
-                "valid": false
-            },
-            {
-                "description": "an IPv6 address with too many components",
-                "data": "1:1:1:1:1:1:1:1:1:1:1:1:1:1:1:1",
-                "valid": false
-            },
-            {
-                "description": "an IPv6 address containing illegal characters",
-                "data": "::laptop",
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "validation of host names",
-        "schema": {"format": "hostname"},
-        "tests": [
-            {
-                "description": "a valid host name",
-                "data": "www.example.com",
-                "valid": true
-            },
-            {
-                "description": "a host name starting with an illegal character",
-                "data": "-a-host-name-that-starts-with--",
-                "valid": false
-            },
-            {
-                "description": "a host name containing illegal characters",
-                "data": "not_a_valid_host_name",
-                "valid": false
-            },
-            {
-                "description": "a host name with a component too long",
-                "data": "a-vvvvvvvvvvvvvvvveeeeeeeeeeeeeeeerrrrrrrrrrrrrrrryyyyyyyyyyyyyyyy-long-host-name-component",
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/items.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/items.json
deleted file mode 100644
index f5e18a13848f71f7f7056144d302bb178664982d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/items.json
+++ /dev/null
@@ -1,46 +0,0 @@
-[
-    {
-        "description": "a schema given for items",
-        "schema": {
-            "items": {"type": "integer"}
-        },
-        "tests": [
-            {
-                "description": "valid items",
-                "data": [ 1, 2, 3 ],
-                "valid": true
-            },
-            {
-                "description": "wrong type of items",
-                "data": [1, "x"],
-                "valid": false
-            },
-            {
-                "description": "ignores non-arrays",
-                "data": {"foo" : "bar"},
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "an array of schemas for items",
-        "schema": {
-            "items": [
-                {"type": "integer"},
-                {"type": "string"}
-            ]
-        },
-        "tests": [
-            {
-                "description": "correct types",
-                "data": [ 1, "foo" ],
-                "valid": true
-            },
-            {
-                "description": "wrong types",
-                "data": [ "foo", 1 ],
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxItems.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxItems.json
deleted file mode 100644
index 3b53a6b371a7b6b45ed28dd8eb352703bd58bd0b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxItems.json
+++ /dev/null
@@ -1,28 +0,0 @@
-[
-    {
-        "description": "maxItems validation",
-        "schema": {"maxItems": 2},
-        "tests": [
-            {
-                "description": "shorter is valid",
-                "data": [1],
-                "valid": true
-            },
-            {
-                "description": "exact length is valid",
-                "data": [1, 2],
-                "valid": true
-            },
-            {
-                "description": "too long is invalid",
-                "data": [1, 2, 3],
-                "valid": false
-            },
-            {
-                "description": "ignores non-arrays",
-                "data": "foobar",
-                "valid": true
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxLength.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxLength.json
deleted file mode 100644
index 48eb1296d2e420a7ceabe2571af9a837b638c788..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxLength.json
+++ /dev/null
@@ -1,28 +0,0 @@
-[
-    {
-        "description": "maxLength validation",
-        "schema": {"maxLength": 2},
-        "tests": [
-            {
-                "description": "shorter is valid",
-                "data": "f",
-                "valid": true
-            },
-            {
-                "description": "exact length is valid",
-                "data": "fo",
-                "valid": true
-            },
-            {
-                "description": "too long is invalid",
-                "data": "foo",
-                "valid": false
-            },
-            {
-                "description": "ignores non-strings",
-                "data": 100,
-                "valid": true
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxProperties.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxProperties.json
deleted file mode 100644
index d282446ad6978d58856d453ca1d5ba42994ff0eb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maxProperties.json
+++ /dev/null
@@ -1,28 +0,0 @@
-[
-    {
-        "description": "maxProperties validation",
-        "schema": {"maxProperties": 2},
-        "tests": [
-            {
-                "description": "shorter is valid",
-                "data": {"foo": 1},
-                "valid": true
-            },
-            {
-                "description": "exact length is valid",
-                "data": {"foo": 1, "bar": 2},
-                "valid": true
-            },
-            {
-                "description": "too long is invalid",
-                "data": {"foo": 1, "bar": 2, "baz": 3},
-                "valid": false
-            },
-            {
-                "description": "ignores non-objects",
-                "data": "foobar",
-                "valid": true
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maximum.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maximum.json
deleted file mode 100644
index 86c7b89c9a9047347e408cbbaaf194b3995f9db0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/maximum.json
+++ /dev/null
@@ -1,42 +0,0 @@
-[
-    {
-        "description": "maximum validation",
-        "schema": {"maximum": 3.0},
-        "tests": [
-            {
-                "description": "below the maximum is valid",
-                "data": 2.6,
-                "valid": true
-            },
-            {
-                "description": "above the maximum is invalid",
-                "data": 3.5,
-                "valid": false
-            },
-            {
-                "description": "ignores non-numbers",
-                "data": "x",
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "exclusiveMaximum validation",
-        "schema": {
-            "maximum": 3.0,
-            "exclusiveMaximum": true
-        },
-        "tests": [
-            {
-                "description": "below the maximum is still valid",
-                "data": 2.2,
-                "valid": true
-            },
-            {
-                "description": "boundary point is invalid",
-                "data": 3.0,
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minItems.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minItems.json
deleted file mode 100644
index ed5118815ee933dabd490e6de54d103e59100f08..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minItems.json
+++ /dev/null
@@ -1,28 +0,0 @@
-[
-    {
-        "description": "minItems validation",
-        "schema": {"minItems": 1},
-        "tests": [
-            {
-                "description": "longer is valid",
-                "data": [1, 2],
-                "valid": true
-            },
-            {
-                "description": "exact length is valid",
-                "data": [1],
-                "valid": true
-            },
-            {
-                "description": "too short is invalid",
-                "data": [],
-                "valid": false
-            },
-            {
-                "description": "ignores non-arrays",
-                "data": "",
-                "valid": true
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minLength.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minLength.json
deleted file mode 100644
index e9c14b1723efd93e04a531f1f7110577e505faba..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minLength.json
+++ /dev/null
@@ -1,28 +0,0 @@
-[
-    {
-        "description": "minLength validation",
-        "schema": {"minLength": 2},
-        "tests": [
-            {
-                "description": "longer is valid",
-                "data": "foo",
-                "valid": true
-            },
-            {
-                "description": "exact length is valid",
-                "data": "fo",
-                "valid": true
-            },
-            {
-                "description": "too short is invalid",
-                "data": "f",
-                "valid": false
-            },
-            {
-                "description": "ignores non-strings",
-                "data": 1,
-                "valid": true
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minProperties.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minProperties.json
deleted file mode 100644
index a72c7d293e6c3e910e3bc980b9405492b203b932..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minProperties.json
+++ /dev/null
@@ -1,28 +0,0 @@
-[
-    {
-        "description": "minProperties validation",
-        "schema": {"minProperties": 1},
-        "tests": [
-            {
-                "description": "longer is valid",
-                "data": {"foo": 1, "bar": 2},
-                "valid": true
-            },
-            {
-                "description": "exact length is valid",
-                "data": {"foo": 1},
-                "valid": true
-            },
-            {
-                "description": "too short is invalid",
-                "data": {},
-                "valid": false
-            },
-            {
-                "description": "ignores non-objects",
-                "data": "",
-                "valid": true
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minimum.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minimum.json
deleted file mode 100644
index d5bf000bcc66f8d9c90a47ee087f239c1fdcf6a9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/minimum.json
+++ /dev/null
@@ -1,42 +0,0 @@
-[
-    {
-        "description": "minimum validation",
-        "schema": {"minimum": 1.1},
-        "tests": [
-            {
-                "description": "above the minimum is valid",
-                "data": 2.6,
-                "valid": true
-            },
-            {
-                "description": "below the minimum is invalid",
-                "data": 0.6,
-                "valid": false
-            },
-            {
-                "description": "ignores non-numbers",
-                "data": "x",
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "exclusiveMinimum validation",
-        "schema": {
-            "minimum": 1.1,
-            "exclusiveMinimum": true
-        },
-        "tests": [
-            {
-                "description": "above the minimum is still valid",
-                "data": 1.2,
-                "valid": true
-            },
-            {
-                "description": "boundary point is invalid",
-                "data": 1.1,
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/multipleOf.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/multipleOf.json
deleted file mode 100644
index c13b2670b9dd9a86c822745996bf75448d6563e1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/multipleOf.json
+++ /dev/null
@@ -1,96 +0,0 @@
-[
-    {
-        "description": "by int",
-        "schema": {"multipleOf": 2},
-        "tests": [
-            {
-                "description": "int by int",
-                "data": 10,
-                "valid": true
-            },
-            {
-                "description": "int by int fail",
-                "data": 7,
-                "valid": false
-            },
-            {
-                "description": "ignores non-numbers",
-                "data": "foo",
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "by number",
-        "schema": {"multipleOf": 1.5},
-        "tests": [
-            {
-                "description": "zero is multiple of anything",
-                "data": 0,
-                "valid": true
-            },
-            {
-                "description": "4.5 is multiple of 1.5",
-                "data": 4.5,
-                "valid": true
-            },
-            {
-                "description": "35 is not multiple of 1.5",
-                "data": 35,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "by small number",
-        "schema": {"multipleOf": 0.0001},
-        "tests": [
-            {
-                "description": "0.0075 is multiple of 0.0001",
-                "data": 0.0075,
-                "valid": true
-            },
-            {
-                "description": "0.00751 is not multiple of 0.0001",
-                "data": 0.00751,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "by decimal number where floating point precision is wrong",
-        "schema": {"multipleOf": 0.01},
-        "tests": [
-            {
-                "description": "Number 2 is multiple of 0.01",
-                "data": 2,
-                "valid": true
-            },
-            {
-                "description": "Number 2.1 is multiple of 0.01",
-                "data": 2.1,
-                "valid": true
-            },
-            {
-                "description": "Number 2.2 is multiple of 0.01",
-                "data": 2.2,
-                "valid": true
-            },
-            {
-                "description": "Number 2.3 is multiple of 0.01",
-                "data": 2.3,
-                "valid": true
-            },
-            {
-                "description": "Number 2.4 is multiple of 0.01",
-                "data": 2.4,
-                "valid": true
-            },
-            {
-                "description": "Number 1.211 is not multiple of 0.01",
-                "data": 1.211,
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/not.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/not.json
deleted file mode 100644
index cbb7f46bf8bc5b4890bcae5e27c27599ef1922d2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/not.json
+++ /dev/null
@@ -1,96 +0,0 @@
-[
-    {
-        "description": "not",
-        "schema": {
-            "not": {"type": "integer"}
-        },
-        "tests": [
-            {
-                "description": "allowed",
-                "data": "foo",
-                "valid": true
-            },
-            {
-                "description": "disallowed",
-                "data": 1,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "not multiple types",
-        "schema": {
-            "not": {"type": ["integer", "boolean"]}
-        },
-        "tests": [
-            {
-                "description": "valid",
-                "data": "foo",
-                "valid": true
-            },
-            {
-                "description": "mismatch",
-                "data": 1,
-                "valid": false
-            },
-            {
-                "description": "other mismatch",
-                "data": true,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "not more complex schema",
-        "schema": {
-            "not": {
-                "type": "object",
-                "properties": {
-                    "foo": {
-                        "type": "string"
-                    }
-                }
-             }
-        },
-        "tests": [
-            {
-                "description": "match",
-                "data": 1,
-                "valid": true
-            },
-            {
-                "description": "other match",
-                "data": {"foo": 1},
-                "valid": true
-            },
-            {
-                "description": "mismatch",
-                "data": {"foo": "bar"},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "forbidden property",
-        "schema": {
-            "properties": {
-                "foo": { 
-                    "not": {}
-                }
-            }
-        },
-        "tests": [
-            {
-                "description": "property present",
-                "data": {"foo": 1, "bar": 2},
-                "valid": false
-            },
-            {
-                "description": "property absent",
-                "data": {"bar": 1, "baz": 2},
-                "valid": true
-            }
-        ]
-    }
-
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/nullAndFormat.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/nullAndFormat.json
deleted file mode 100644
index d7fce9f50907a06dd9bf045ea3071981bdc8d8d8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/nullAndFormat.json
+++ /dev/null
@@ -1,18 +0,0 @@
-[
-  {
-    "description": "validation of null and format",
-    "schema": {"type": ["null", "string"], "format": "date-time"},
-    "tests": [
-      {
-        "description": "a valid date-time string",
-        "data": "1963-06-19T08:30:06.283185Z",
-        "valid": true
-      },
-      {
-        "description": "allow null",
-        "data": null,
-        "valid": true
-      }
-    ]
-  }
-]
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/nullAndObject.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/nullAndObject.json
deleted file mode 100644
index c65c02c36f97062a1700ce93a2a5e6cb36ef242a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/nullAndObject.json
+++ /dev/null
@@ -1,18 +0,0 @@
-[
-  {
-    "description": "multiple types of null and object containing properties",
-    "schema": {
-      "type": ["null", "object"],
-      "properties": {
-        "foo": {}
-      }
-    },
-    "tests": [
-      {
-        "description": "null is valid",
-        "data": null,
-        "valid": true
-      }
-    ]
-  }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/oneOf.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/oneOf.json
deleted file mode 100644
index 1eaa4e47949dc312875bc492377d581a98201a2c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/oneOf.json
+++ /dev/null
@@ -1,68 +0,0 @@
-[
-    {
-        "description": "oneOf",
-        "schema": {
-            "oneOf": [
-                {
-                    "type": "integer"
-                },
-                {
-                    "minimum": 2
-                }
-            ]
-        },
-        "tests": [
-            {
-                "description": "first oneOf valid",
-                "data": 1,
-                "valid": true
-            },
-            {
-                "description": "second oneOf valid",
-                "data": 2.5,
-                "valid": true
-            },
-            {
-                "description": "both oneOf valid",
-                "data": 3,
-                "valid": false
-            },
-            {
-                "description": "neither oneOf valid",
-                "data": 1.5,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "oneOf with base schema",
-        "schema": {
-            "type": "string",
-            "oneOf" : [
-                {
-                    "minLength": 2
-                },
-                {
-                    "maxLength": 4
-                }
-            ]
-        },
-        "tests": [
-            {
-                "description": "mismatch base schema",
-                "data": 3,
-                "valid": false
-            },
-            {
-                "description": "one oneOf valid",
-                "data": "foobar",
-                "valid": true
-            },
-            {
-                "description": "both oneOf valid",
-                "data": "foo",
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/pattern.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/pattern.json
deleted file mode 100644
index befc4b560f7c332a101f28790c3f7fbc2b093b2e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/pattern.json
+++ /dev/null
@@ -1,23 +0,0 @@
-[
-    {
-        "description": "pattern validation",
-        "schema": {"pattern": "^a*$"},
-        "tests": [
-            {
-                "description": "a matching pattern is valid",
-                "data": "aaa",
-                "valid": true
-            },
-            {
-                "description": "a non-matching pattern is invalid",
-                "data": "abc",
-                "valid": false
-            },
-            {
-                "description": "ignores non-strings",
-                "data": true,
-                "valid": true
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/patternProperties.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/patternProperties.json
deleted file mode 100644
index 18586e5daba6021b4ad659ee3649a6940ec99ad6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/patternProperties.json
+++ /dev/null
@@ -1,110 +0,0 @@
-[
-    {
-        "description":
-            "patternProperties validates properties matching a regex",
-        "schema": {
-            "patternProperties": {
-                "f.*o": {"type": "integer"}
-            }
-        },
-        "tests": [
-            {
-                "description": "a single valid match is valid",
-                "data": {"foo": 1},
-                "valid": true
-            },
-            {
-                "description": "multiple valid matches is valid",
-                "data": {"foo": 1, "foooooo" : 2},
-                "valid": true
-            },
-            {
-                "description": "a single invalid match is invalid",
-                "data": {"foo": "bar", "fooooo": 2},
-                "valid": false
-            },
-            {
-                "description": "multiple invalid matches is invalid",
-                "data": {"foo": "bar", "foooooo" : "baz"},
-                "valid": false
-            },
-            {
-                "description": "ignores non-objects",
-                "data": 12,
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "multiple simultaneous patternProperties are validated",
-        "schema": {
-            "patternProperties": {
-                "a*": {"type": "integer"},
-                "aaa*": {"maximum": 20}
-            }
-        },
-        "tests": [
-            {
-                "description": "a single valid match is valid",
-                "data": {"a": 21},
-                "valid": true
-            },
-            {
-                "description": "a simultaneous match is valid",
-                "data": {"aaaa": 18},
-                "valid": true
-            },
-            {
-                "description": "multiple matches is valid",
-                "data": {"a": 21, "aaaa": 18},
-                "valid": true
-            },
-            {
-                "description": "an invalid due to one is invalid",
-                "data": {"a": "bar"},
-                "valid": false
-            },
-            {
-                "description": "an invalid due to the other is invalid",
-                "data": {"aaaa": 31},
-                "valid": false
-            },
-            {
-                "description": "an invalid due to both is invalid",
-                "data": {"aaa": "foo", "aaaa": 31},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "regexes are not anchored by default and are case sensitive",
-        "schema": {
-            "patternProperties": {
-                "[0-9]{2,}": { "type": "boolean" },
-                "X_": { "type": "string" }
-            }
-        },
-        "tests": [
-            {
-                "description": "non recognized members are ignored",
-                "data": { "answer 1": "42" },
-                "valid": true
-            },
-            {
-                "description": "recognized members are accounted for",
-                "data": { "a31b": null },
-                "valid": false
-            },
-            {
-                "description": "regexes are case sensitive",
-                "data": { "a_x_3": 3 },
-                "valid": true
-            },
-            {
-                "description": "regexes are case sensitive, 2",
-                "data": { "a_X_3": 3 },
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/properties.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/properties.json
deleted file mode 100644
index cd1644dcd91fe0428ef298776051c1d9284e4278..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/properties.json
+++ /dev/null
@@ -1,92 +0,0 @@
-[
-    {
-        "description": "object properties validation",
-        "schema": {
-            "properties": {
-                "foo": {"type": "integer"},
-                "bar": {"type": "string"}
-            }
-        },
-        "tests": [
-            {
-                "description": "both properties present and valid is valid",
-                "data": {"foo": 1, "bar": "baz"},
-                "valid": true
-            },
-            {
-                "description": "one property invalid is invalid",
-                "data": {"foo": 1, "bar": {}},
-                "valid": false
-            },
-            {
-                "description": "both properties invalid is invalid",
-                "data": {"foo": [], "bar": {}},
-                "valid": false
-            },
-            {
-                "description": "doesn't invalidate other properties",
-                "data": {"quux": []},
-                "valid": true
-            },
-            {
-                "description": "ignores non-objects",
-                "data": [],
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description":
-            "properties, patternProperties, additionalProperties interaction",
-        "schema": {
-            "properties": {
-                "foo": {"type": "array", "maxItems": 3},
-                "bar": {"type": "array"}
-            },
-            "patternProperties": {"f.o": {"minItems": 2}},
-            "additionalProperties": {"type": "integer"}
-        },
-        "tests": [
-            {
-                "description": "property validates property",
-                "data": {"foo": [1, 2]},
-                "valid": true
-            },
-            {
-                "description": "property invalidates property",
-                "data": {"foo": [1, 2, 3, 4]},
-                "valid": false
-            },
-            {
-                "description": "patternProperty invalidates property",
-                "data": {"foo": []},
-                "valid": false
-            },
-            {
-                "description": "patternProperty validates nonproperty",
-                "data": {"fxo": [1, 2]},
-                "valid": true
-            },
-            {
-                "description": "patternProperty invalidates nonproperty",
-                "data": {"fxo": []},
-                "valid": false
-            },
-            {
-                "description": "additionalProperty ignores property",
-                "data": {"bar": []},
-                "valid": true
-            },
-            {
-                "description": "additionalProperty validates others",
-                "data": {"quux": 3},
-                "valid": true
-            },
-            {
-                "description": "additionalProperty invalidates others",
-                "data": {"quux": "foo"},
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/ref.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/ref.json
deleted file mode 100644
index d8214bc2b30c1f5226e15a5705084f600524c4cf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/ref.json
+++ /dev/null
@@ -1,128 +0,0 @@
-[
-    {
-        "description": "root pointer ref",
-        "schema": {
-            "properties": {
-                "foo": {"$ref": "#"}
-            },
-            "additionalProperties": false
-        },
-        "tests": [
-            {
-                "description": "match",
-                "data": {"foo": false},
-                "valid": true
-            },
-            {
-                "description": "recursive match",
-                "data": {"foo": {"foo": false}},
-                "valid": true
-            },
-            {
-                "description": "mismatch",
-                "data": {"bar": false},
-                "valid": false
-            },
-            {
-                "description": "recursive mismatch",
-                "data": {"foo": {"bar": false}},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "relative pointer ref to object",
-        "schema": {
-            "properties": {
-                "foo": {"type": "integer"},
-                "bar": {"$ref": "#/properties/foo"}
-            }
-        },
-        "tests": [
-            {
-                "description": "match",
-                "data": {"bar": 3},
-                "valid": true
-            },
-            {
-                "description": "mismatch",
-                "data": {"bar": true},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "relative pointer ref to array",
-        "schema": {
-            "items": [
-                {"type": "integer"},
-                {"$ref": "#/items/0"}
-            ]
-        },
-        "tests": [
-            {
-                "description": "match array",
-                "data": [1, 2],
-                "valid": true
-            },
-            {
-                "description": "mismatch array",
-                "data": [1, "foo"],
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "escaped pointer ref",
-        "schema": {
-            "tilda~field": {"type": "integer"},
-            "slash/field": {"type": "integer"},
-            "percent%field": {"type": "integer"},
-            "properties": {
-                "tilda": {"$ref": "#/tilda~0field"},
-                "slash": {"$ref": "#/slash~1field"},
-                "percent": {"$ref": "#/percent%25field"}
-            }
-        },
-        "tests": [
-            {
-                "description": "slash",
-                "data": {"slash": "aoeu"},
-                "valid": false
-            },
-            {
-                "description": "tilda",
-                "data": {"tilda": "aoeu"},
-                "valid": false
-            },
-            {
-                "description": "percent",
-                "data": {"percent": "aoeu"},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "nested refs",
-        "schema": {
-            "definitions": {
-                "a": {"type": "integer"},
-                "b": {"$ref": "#/definitions/a"},
-                "c": {"$ref": "#/definitions/b"}
-            },
-            "$ref": "#/definitions/c"
-        },
-        "tests": [
-            {
-                "description": "nested ref valid",
-                "data": 5,
-                "valid": true
-            },
-            {
-                "description": "nested ref invalid",
-                "data": "a",
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/refRemote.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/refRemote.json
deleted file mode 100644
index 4ca804732c9754142d89284fad3ea5bdd3d6b64d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/refRemote.json
+++ /dev/null
@@ -1,74 +0,0 @@
-[
-    {
-        "description": "remote ref",
-        "schema": {"$ref": "http://localhost:1234/integer.json"},
-        "tests": [
-            {
-                "description": "remote ref valid",
-                "data": 1,
-                "valid": true
-            },
-            {
-                "description": "remote ref invalid",
-                "data": "a",
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "fragment within remote ref",
-        "schema": {"$ref": "http://localhost:1234/subSchemas.json#/integer"},
-        "tests": [
-            {
-                "description": "remote fragment valid",
-                "data": 1,
-                "valid": true
-            },
-            {
-                "description": "remote fragment invalid",
-                "data": "a",
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "ref within remote ref",
-        "schema": {
-            "$ref": "http://localhost:1234/subSchemas.json#/refToInteger"
-        },
-        "tests": [
-            {
-                "description": "ref within ref valid",
-                "data": 1,
-                "valid": true
-            },
-            {
-                "description": "ref within ref invalid",
-                "data": "a",
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "change resolution scope",
-        "schema": {
-            "id": "http://localhost:1234/",
-            "items": {
-                "id": "folder/",
-                "items": {"$ref": "folderInteger.json"}
-            }
-        },
-        "tests": [
-            {
-                "description": "changed scope ref valid",
-                "data": [[1]],
-                "valid": true
-            },
-            {
-                "description": "changed scope ref invalid",
-                "data": [["a"]],
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/required.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/required.json
deleted file mode 100644
index 612f73f3472bc0a5c42e4012aa3b3669a8d31ed6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/required.json
+++ /dev/null
@@ -1,39 +0,0 @@
-[
-    {
-        "description": "required validation",
-        "schema": {
-            "properties": {
-                "foo": {},
-                "bar": {}
-            },
-            "required": ["foo"]
-        },
-        "tests": [
-            {
-                "description": "present required property is valid",
-                "data": {"foo": 1},
-                "valid": true
-            },
-            {
-                "description": "non-present required property is invalid",
-                "data": {"bar": 1},
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "required default validation",
-        "schema": {
-            "properties": {
-                "foo": {}
-            }
-        },
-        "tests": [
-            {
-                "description": "not required by default",
-                "data": {},
-                "valid": true
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/type.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/type.json
deleted file mode 100644
index 257f05129279faf53d2fba1f5db9651c17f0bd64..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/type.json
+++ /dev/null
@@ -1,330 +0,0 @@
-[
-    {
-        "description": "integer type matches integers",
-        "schema": {"type": "integer"},
-        "tests": [
-            {
-                "description": "an integer is an integer",
-                "data": 1,
-                "valid": true
-            },
-            {
-                "description": "a float is not an integer",
-                "data": 1.1,
-                "valid": false
-            },
-            {
-                "description": "a string is not an integer",
-                "data": "foo",
-                "valid": false
-            },
-            {
-                "description": "an object is not an integer",
-                "data": {},
-                "valid": false
-            },
-            {
-                "description": "an array is not an integer",
-                "data": [],
-                "valid": false
-            },
-            {
-                "description": "a boolean is not an integer",
-                "data": true,
-                "valid": false
-            },
-            {
-                "description": "null is not an integer",
-                "data": null,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "number type matches numbers",
-        "schema": {"type": "number"},
-        "tests": [
-            {
-                "description": "an integer is a number",
-                "data": 1,
-                "valid": true
-            },
-            {
-                "description": "a float is a number",
-                "data": 1.1,
-                "valid": true
-            },
-            {
-                "description": "a string is not a number",
-                "data": "foo",
-                "valid": false
-            },
-            {
-                "description": "an object is not a number",
-                "data": {},
-                "valid": false
-            },
-            {
-                "description": "an array is not a number",
-                "data": [],
-                "valid": false
-            },
-            {
-                "description": "a boolean is not a number",
-                "data": true,
-                "valid": false
-            },
-            {
-                "description": "null is not a number",
-                "data": null,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "string type matches strings",
-        "schema": {"type": "string"},
-        "tests": [
-            {
-                "description": "1 is not a string",
-                "data": 1,
-                "valid": false
-            },
-            {
-                "description": "a float is not a string",
-                "data": 1.1,
-                "valid": false
-            },
-            {
-                "description": "a string is a string",
-                "data": "foo",
-                "valid": true
-            },
-            {
-                "description": "an object is not a string",
-                "data": {},
-                "valid": false
-            },
-            {
-                "description": "an array is not a string",
-                "data": [],
-                "valid": false
-            },
-            {
-                "description": "a boolean is not a string",
-                "data": true,
-                "valid": false
-            },
-            {
-                "description": "null is not a string",
-                "data": null,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "object type matches objects",
-        "schema": {"type": "object"},
-        "tests": [
-            {
-                "description": "an integer is not an object",
-                "data": 1,
-                "valid": false
-            },
-            {
-                "description": "a float is not an object",
-                "data": 1.1,
-                "valid": false
-            },
-            {
-                "description": "a string is not an object",
-                "data": "foo",
-                "valid": false
-            },
-            {
-                "description": "an object is an object",
-                "data": {},
-                "valid": true
-            },
-            {
-                "description": "an array is not an object",
-                "data": [],
-                "valid": false
-            },
-            {
-                "description": "a boolean is not an object",
-                "data": true,
-                "valid": false
-            },
-            {
-                "description": "null is not an object",
-                "data": null,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "array type matches arrays",
-        "schema": {"type": "array"},
-        "tests": [
-            {
-                "description": "an integer is not an array",
-                "data": 1,
-                "valid": false
-            },
-            {
-                "description": "a float is not an array",
-                "data": 1.1,
-                "valid": false
-            },
-            {
-                "description": "a string is not an array",
-                "data": "foo",
-                "valid": false
-            },
-            {
-                "description": "an object is not an array",
-                "data": {},
-                "valid": false
-            },
-            {
-                "description": "an array is not an array",
-                "data": [],
-                "valid": true
-            },
-            {
-                "description": "a boolean is not an array",
-                "data": true,
-                "valid": false
-            },
-            {
-                "description": "null is not an array",
-                "data": null,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "boolean type matches booleans",
-        "schema": {"type": "boolean"},
-        "tests": [
-            {
-                "description": "an integer is not a boolean",
-                "data": 1,
-                "valid": false
-            },
-            {
-                "description": "a float is not a boolean",
-                "data": 1.1,
-                "valid": false
-            },
-            {
-                "description": "a string is not a boolean",
-                "data": "foo",
-                "valid": false
-            },
-            {
-                "description": "an object is not a boolean",
-                "data": {},
-                "valid": false
-            },
-            {
-                "description": "an array is not a boolean",
-                "data": [],
-                "valid": false
-            },
-            {
-                "description": "a boolean is not a boolean",
-                "data": true,
-                "valid": true
-            },
-            {
-                "description": "null is not a boolean",
-                "data": null,
-                "valid": false
-            }
-        ]
-    },
-    {
-        "description": "null type matches only the null object",
-        "schema": {"type": "null"},
-        "tests": [
-            {
-                "description": "an integer is not null",
-                "data": 1,
-                "valid": false
-            },
-            {
-                "description": "a float is not null",
-                "data": 1.1,
-                "valid": false
-            },
-            {
-                "description": "a string is not null",
-                "data": "foo",
-                "valid": false
-            },
-            {
-                "description": "an object is not null",
-                "data": {},
-                "valid": false
-            },
-            {
-                "description": "an array is not null",
-                "data": [],
-                "valid": false
-            },
-            {
-                "description": "a boolean is not null",
-                "data": true,
-                "valid": false
-            },
-            {
-                "description": "null is null",
-                "data": null,
-                "valid": true
-            }
-        ]
-    },
-    {
-        "description": "multiple types can be specified in an array",
-        "schema": {"type": ["integer", "string"]},
-        "tests": [
-            {
-                "description": "an integer is valid",
-                "data": 1,
-                "valid": true
-            },
-            {
-                "description": "a string is valid",
-                "data": "foo",
-                "valid": true
-            },
-            {
-                "description": "a float is invalid",
-                "data": 1.1,
-                "valid": false
-            },
-            {
-                "description": "an object is invalid",
-                "data": {},
-                "valid": false
-            },
-            {
-                "description": "an array is invalid",
-                "data": [],
-                "valid": false
-            },
-            {
-                "description": "a boolean is invalid",
-                "data": true,
-                "valid": false
-            },
-            {
-                "description": "null is invalid",
-                "data": null,
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/uniqueItems.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/uniqueItems.json
deleted file mode 100644
index c1f4ab99c9a485d4d8a9d9f97b4945899cbcd4b5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema-draft4/uniqueItems.json
+++ /dev/null
@@ -1,79 +0,0 @@
-[
-    {
-        "description": "uniqueItems validation",
-        "schema": {"uniqueItems": true},
-        "tests": [
-            {
-                "description": "unique array of integers is valid",
-                "data": [1, 2],
-                "valid": true
-            },
-            {
-                "description": "non-unique array of integers is invalid",
-                "data": [1, 1],
-                "valid": false
-            },
-            {
-                "description": "numbers are unique if mathematically unequal",
-                "data": [1.0, 1.00, 1],
-                "valid": false
-            },
-            {
-                "description": "unique array of objects is valid",
-                "data": [{"foo": "bar"}, {"foo": "baz"}],
-                "valid": true
-            },
-            {
-                "description": "non-unique array of objects is invalid",
-                "data": [{"foo": "bar"}, {"foo": "bar"}],
-                "valid": false
-            },
-            {
-                "description": "unique array of nested objects is valid",
-                "data": [
-                    {"foo": {"bar" : {"baz" : true}}},
-                    {"foo": {"bar" : {"baz" : false}}}
-                ],
-                "valid": true
-            },
-            {
-                "description": "non-unique array of nested objects is invalid",
-                "data": [
-                    {"foo": {"bar" : {"baz" : true}}},
-                    {"foo": {"bar" : {"baz" : true}}}
-                ],
-                "valid": false
-            },
-            {
-                "description": "unique array of arrays is valid",
-                "data": [["foo"], ["bar"]],
-                "valid": true
-            },
-            {
-                "description": "non-unique array of arrays is invalid",
-                "data": [["foo"], ["foo"]],
-                "valid": false
-            },
-            {
-                "description": "1 and true are unique",
-                "data": [1, true],
-                "valid": true
-            },
-            {
-                "description": "0 and false are unique",
-                "data": [0, false],
-                "valid": true
-            },
-            {
-                "description": "unique heterogeneous types are valid",
-                "data": [{}, [1], true, null, 1],
-                "valid": true
-            },
-            {
-                "description": "non-unique heterogeneous types are invalid",
-                "data": [{}, [1], true, null, {}, 1],
-                "valid": false
-            }
-        ]
-    }
-]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema.js
deleted file mode 100644
index e68a263a27921816e1199cb1725953669908e08c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/json-schema.js
+++ /dev/null
@@ -1,23 +0,0 @@
-var tape = require('tape')
-var fs = require('fs')
-var validator = require('../')
-
-var files = fs.readdirSync(__dirname+'/json-schema-draft4')
-  .map(function(file) {
-    if (file === 'definitions.json') return null
-    if (file === 'refRemote.json') return null
-    return require('./json-schema-draft4/'+file)
-  })
-  .filter(Boolean)
-
-files.forEach(function(file) {
-  file.forEach(function(f) {
-    tape('json-schema-test-suite '+f.description, function(t) {
-      var validate = validator(f.schema)
-      f.tests.forEach(function(test) {
-        t.same(validate(test.data), test.valid, test.description)
-      })
-      t.end()
-    })
-  })
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js
deleted file mode 100644
index 275f2ac72f3877ed457de4389dbcf6cf8dd147e8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/is-my-json-valid/test/misc.js
+++ /dev/null
@@ -1,447 +0,0 @@
-var tape = require('tape')
-var cosmic = require('./fixtures/cosmic')
-var validator = require('../')
-var validatorRequire = require('../require')
-
-tape('simple', function(t) {
-  var schema = {
-    required: true,
-    type: 'object',
-    properties: {
-      hello: {type:'string', required:true}
-    }
-  }
-
-  var validate = validator(schema)
-
-  t.ok(validate({hello: 'world'}), 'should be valid')
-  t.notOk(validate(), 'should be invalid')
-  t.notOk(validate({}), 'should be invalid')
-  t.end()
-})
-
-tape('advanced', function(t) {
-  var validate = validator(cosmic.schema)
-
-  t.ok(validate(cosmic.valid), 'should be valid')
-  t.notOk(validate(cosmic.invalid), 'should be invalid')
-  t.end()
-})
-
-tape('greedy/false', function(t) {
-  var validate = validator({
-    type: 'object',
-    properties: {
-      x: {
-        type: 'number'
-      }
-    },
-    required: ['x', 'y']
-  });
-  t.notOk(validate({}), 'should be invalid')
-  t.strictEqual(validate.errors.length, 2);
-  t.strictEqual(validate.errors[0].field, 'data.x')
-  t.strictEqual(validate.errors[0].message, 'is required')
-  t.strictEqual(validate.errors[1].field, 'data.y')
-  t.strictEqual(validate.errors[1].message, 'is required')
-  t.notOk(validate({x: 'string'}), 'should be invalid')
-  t.strictEqual(validate.errors.length, 1);
-  t.strictEqual(validate.errors[0].field, 'data.y')
-  t.strictEqual(validate.errors[0].message, 'is required')
-  t.notOk(validate({x: 'string', y: 'value'}), 'should be invalid')
-  t.strictEqual(validate.errors.length, 1);
-  t.strictEqual(validate.errors[0].field, 'data.x')
-  t.strictEqual(validate.errors[0].message, 'is the wrong type')
-  t.end();
-});
-
-tape('greedy/true', function(t) {
-  var validate = validator({
-    type: 'object',
-    properties: {
-      x: {
-        type: 'number'
-      }
-    },
-    required: ['x', 'y']
-  }, {
-    greedy: true
-  });
-  t.notOk(validate({}), 'should be invalid')
-  t.strictEqual(validate.errors.length, 2);
-  t.strictEqual(validate.errors[0].field, 'data.x')
-  t.strictEqual(validate.errors[0].message, 'is required')
-  t.strictEqual(validate.errors[1].field, 'data.y')
-  t.strictEqual(validate.errors[1].message, 'is required')
-  t.notOk(validate({x: 'string'}), 'should be invalid')
-  t.strictEqual(validate.errors.length, 2);
-  t.strictEqual(validate.errors[0].field, 'data.y')
-  t.strictEqual(validate.errors[0].message, 'is required')
-  t.strictEqual(validate.errors[1].field, 'data.x')
-  t.strictEqual(validate.errors[1].message, 'is the wrong type')
-  t.notOk(validate({x: 'string', y: 'value'}), 'should be invalid')
-  t.strictEqual(validate.errors.length, 1);
-  t.strictEqual(validate.errors[0].field, 'data.x')
-  t.strictEqual(validate.errors[0].message, 'is the wrong type')
-  t.ok(validate({x: 1, y: 'value'}), 'should be invalid')
-  t.end();
-});
-
-tape('additional props', function(t) {
-  var validate = validator({
-    type: 'object',
-    additionalProperties: false
-  }, {
-    verbose: true
-  })
-
-  t.ok(validate({}))
-  t.notOk(validate({foo:'bar'}))
-  t.ok(validate.errors[0].value === 'data.foo', 'should output the property not allowed in verbose mode')
-  t.strictEqual(validate.errors[0].type, 'object', 'error object should contain the type')
-  t.end()
-})
-
-tape('array', function(t) {
-  var validate = validator({
-    type: 'array',
-    required: true,
-    items: {
-      type: 'string'
-    }
-  })
-
-  t.notOk(validate({}), 'wrong type')
-  t.notOk(validate(), 'is required')
-  t.ok(validate(['test']))
-  t.end()
-})
-
-tape('nested array', function(t) {
-  var validate = validator({
-    type: 'object',
-    properties: {
-      list: {
-        type: 'array',
-        required: true,
-        items: {
-          type: 'string'
-        }
-      }
-    }
-  })
-
-  t.notOk(validate({}), 'is required')
-  t.ok(validate({list:['test']}))
-  t.notOk(validate({list:[1]}))
-  t.end()
-})
-
-tape('enum', function(t) {
-  var validate = validator({
-    type: 'object',
-    properties: {
-      foo: {
-        type: 'number',
-        required: true,
-        enum: [42]
-      }
-    }
-  })
-
-  t.notOk(validate({}), 'is required')
-  t.ok(validate({foo:42}))
-  t.notOk(validate({foo:43}))
-  t.end()
-})
-
-tape('minimum/maximum', function(t) {
-  var validate = validator({
-    type: 'object',
-    properties: {
-      foo: {
-        type: 'number',
-        minimum: 0,
-        maximum: 0
-      }
-    }
-  })
-
-  t.notOk(validate({foo:-42}))
-  t.ok(validate({foo:0}))
-  t.notOk(validate({foo:42}))
-  t.end()
-})
-
-tape('exclusiveMinimum/exclusiveMaximum', function(t) {
-  var validate = validator({
-    type: 'object',
-    properties: {
-      foo: {
-        type: 'number',
-        minimum: 10,
-        maximum: 20,
-        exclusiveMinimum: true,
-        exclusiveMaximum: true
-      }
-    }
-  })
-
-  t.notOk(validate({foo:10}))
-  t.ok(validate({foo:11}))
-  t.notOk(validate({foo:20}))
-  t.ok(validate({foo:19}))
-  t.end()
-})
-
-tape('custom format', function(t) {
-  var validate = validator({
-    type: 'object',
-    properties: {
-      foo: {
-        type: 'string',
-        format: 'as'
-      }
-    }
-  }, {formats: {as:/^a+$/}})
-
-  t.notOk(validate({foo:''}), 'not as')
-  t.notOk(validate({foo:'b'}), 'not as')
-  t.notOk(validate({foo:'aaab'}), 'not as')
-  t.ok(validate({foo:'a'}), 'as')
-  t.ok(validate({foo:'aaaaaa'}), 'as')
-  t.end()
-})
-
-tape('custom format function', function(t) {
-  var validate = validator({
-    type: 'object',
-    properties: {
-      foo: {
-        type: 'string',
-        format: 'as'
-      }
-    }
-  }, {formats: {as:function(s) { return /^a+$/.test(s) } }})
-
-  t.notOk(validate({foo:''}), 'not as')
-  t.notOk(validate({foo:'b'}), 'not as')
-  t.notOk(validate({foo:'aaab'}), 'not as')
-  t.ok(validate({foo:'a'}), 'as')
-  t.ok(validate({foo:'aaaaaa'}), 'as')
-  t.end()
-})
-
-tape('do not mutate schema', function(t) {
-  var sch = {
-    items: [
-      {}
-    ],
-    additionalItems: {
-      type: 'integer'
-    }
-  }
-
-  var copy = JSON.parse(JSON.stringify(sch))
-
-  validator(sch)
-
-  t.same(sch, copy, 'did not mutate')
-  t.end()
-})
-
-tape('#toJSON()', function(t) {
-  var schema = {
-    required: true,
-    type: 'object',
-    properties: {
-      hello: {type:'string', required:true}
-    }
-  }
-
-  var validate = validator(schema)
-
-  t.deepEqual(validate.toJSON(), schema, 'should return original schema')
-  t.end()
-})
-
-tape('external schemas', function(t) {
-  var ext = {type: 'string'}
-  var schema = {
-    required: true,
-    $ref: '#ext'
-  }
-
-  var validate = validator(schema, {schemas: {ext:ext}})
-
-  t.ok(validate('hello string'), 'is a string')
-  t.notOk(validate(42), 'not a string')
-  t.end()
-})
-
-tape('external schema URIs', function(t) {
-  var ext = {type: 'string'}
-  var schema = {
-    required: true,
-    $ref: 'http://example.com/schemas/schemaURIs'
-  }
-
-  var opts = {schemas:{}};
-  opts.schemas['http://example.com/schemas/schemaURIs'] = ext;
-  var validate = validator(schema, opts)
-
-  t.ok(validate('hello string'), 'is a string')
-  t.notOk(validate(42), 'not a string')
-  t.end()
-})
-
-tape('top-level external schema', function(t) {
-  var defs = {
-    "string": {
-      type: "string"
-    },
-    "sex": {
-      type: "string",
-      enum: ["male", "female", "other"]
-    }
-  }
-  var schema = {
-    type: "object",
-    properties: {
-      "name": { $ref: "definitions.json#/string" },
-      "sex": { $ref: "definitions.json#/sex" }
-    },
-    required: ["name", "sex"]
-  }
-
-  var validate = validator(schema, {
-    schemas: {
-      "definitions.json": defs
-    }
-  })
-  t.ok(validate({name:"alice", sex:"female"}), 'is an object')
-  t.notOk(validate({name:"alice", sex: "bob"}), 'recognizes external schema')
-  t.notOk(validate({name:2, sex: "female"}), 'recognizes external schema')
-  t.end()
-})
-
-tape('nested required array decl', function(t) {
-  var schema = {
-    properties: {
-      x: {
-        type: 'object',
-        properties: {
-          y: {
-            type: 'object',
-            properties: {
-              z: {
-                type: 'string'
-              }
-            },
-            required: ['z']
-          }
-        }
-      }
-    },
-    required: ['x']
-  }
-
-  var validate = validator(schema)
-
-  t.ok(validate({x: {}}), 'should be valid')
-  t.notOk(validate({}), 'should not be valid')
-  t.strictEqual(validate.errors[0].field, 'data.x', 'should output the missing field')
-  t.end()
-})
-
-tape('verbose mode', function(t) {
-  var schema = {
-    required: true,
-    type: 'object',
-    properties: {
-      hello: {
-        required: true,
-        type: 'string'
-      }
-    }
-  };
-
-  var validate = validator(schema, {verbose: true})
-
-  t.ok(validate({hello: 'string'}), 'should be valid')
-  t.notOk(validate({hello: 100}), 'should not be valid')
-  t.strictEqual(validate.errors[0].value, 100, 'error object should contain the invalid value')
-  t.strictEqual(validate.errors[0].type, 'string', 'error object should contain the type')
-  t.end()
-})
-
-tape('additional props in verbose mode', function(t) {
-  var schema = {
-    type: 'object',
-    required: true,
-    additionalProperties: false,
-    properties: {
-      foo: {
-        type: 'string'
-      },
-      'hello world': {
-        type: 'object',
-        required: true,
-        additionalProperties: false,
-        properties: {
-          foo: {
-            type: 'string'
-          }
-        }
-      }
-    }
-  };
-
-  var validate = validator(schema, {verbose: true})
-
-  validate({'hello world': {bar: 'string'}});
-
-  t.strictEqual(validate.errors[0].value, 'data["hello world"].bar', 'should output the path to the additional prop in the error')
-  t.end()
-})
-
-tape('Date.now() is an integer', function(t) {
-  var schema = {type: 'integer'}
-  var validate = validator(schema)
-
-  t.ok(validate(Date.now()), 'is integer')
-  t.end()
-})
-
-tape('field shows item index in arrays', function(t) {
-  var schema = {
-    type: 'array',
-    items: {
-      type: 'array',
-      items: {
-        properties: {
-          foo: {
-            type: 'string',
-            required: true
-          }
-        }
-      }
-    }
-  }
-
-  var validate = validator(schema)
-
-  validate([
-    [
-      { foo: 'test' },
-      { foo: 'test' }
-    ],
-    [
-      { foo: 'test' },
-      { baz: 'test' }
-    ]
-  ])
-
-  t.strictEqual(validate.errors[0].field, 'data.1.1.foo', 'should output the field with specific index of failing item in the error')
-  t.end()
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/index.js
deleted file mode 100644
index 777377a1f777b166a5b116e1a87f99d21fbea75d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-'use strict';
-
-module.exports = typeof Promise === 'function' ? Promise : require('pinkie');
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/license
deleted file mode 100644
index 1aeb74fd25e1715d8129a1babc8113f7c4deb7e3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Vsevolod Strukchinsky <floatdrop@gmail.com> (github.com/floatdrop)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/index.js
deleted file mode 100644
index 14ce1bfe3d4918cf790b4f247d9f536f3a8eb3c2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/index.js
+++ /dev/null
@@ -1,292 +0,0 @@
-'use strict';
-
-var PENDING = 'pending';
-var SETTLED = 'settled';
-var FULFILLED = 'fulfilled';
-var REJECTED = 'rejected';
-var NOOP = function () {};
-var isNode = typeof global !== 'undefined' && typeof global.process !== 'undefined' && typeof global.process.emit === 'function';
-
-var asyncSetTimer = typeof setImmediate === 'undefined' ? setTimeout : setImmediate;
-var asyncQueue = [];
-var asyncTimer;
-
-function asyncFlush() {
-	// run promise callbacks
-	for (var i = 0; i < asyncQueue.length; i++) {
-		asyncQueue[i][0](asyncQueue[i][1]);
-	}
-
-	// reset async asyncQueue
-	asyncQueue = [];
-	asyncTimer = false;
-}
-
-function asyncCall(callback, arg) {
-	asyncQueue.push([callback, arg]);
-
-	if (!asyncTimer) {
-		asyncTimer = true;
-		asyncSetTimer(asyncFlush, 0);
-	}
-}
-
-function invokeResolver(resolver, promise) {
-	function resolvePromise(value) {
-		resolve(promise, value);
-	}
-
-	function rejectPromise(reason) {
-		reject(promise, reason);
-	}
-
-	try {
-		resolver(resolvePromise, rejectPromise);
-	} catch (e) {
-		rejectPromise(e);
-	}
-}
-
-function invokeCallback(subscriber) {
-	var owner = subscriber.owner;
-	var settled = owner._state;
-	var value = owner._data;
-	var callback = subscriber[settled];
-	var promise = subscriber.then;
-
-	if (typeof callback === 'function') {
-		settled = FULFILLED;
-		try {
-			value = callback(value);
-		} catch (e) {
-			reject(promise, e);
-		}
-	}
-
-	if (!handleThenable(promise, value)) {
-		if (settled === FULFILLED) {
-			resolve(promise, value);
-		}
-
-		if (settled === REJECTED) {
-			reject(promise, value);
-		}
-	}
-}
-
-function handleThenable(promise, value) {
-	var resolved;
-
-	try {
-		if (promise === value) {
-			throw new TypeError('A promises callback cannot return that same promise.');
-		}
-
-		if (value && (typeof value === 'function' || typeof value === 'object')) {
-			// then should be retrieved only once
-			var then = value.then;
-
-			if (typeof then === 'function') {
-				then.call(value, function (val) {
-					if (!resolved) {
-						resolved = true;
-
-						if (value === val) {
-							fulfill(promise, val);
-						} else {
-							resolve(promise, val);
-						}
-					}
-				}, function (reason) {
-					if (!resolved) {
-						resolved = true;
-
-						reject(promise, reason);
-					}
-				});
-
-				return true;
-			}
-		}
-	} catch (e) {
-		if (!resolved) {
-			reject(promise, e);
-		}
-
-		return true;
-	}
-
-	return false;
-}
-
-function resolve(promise, value) {
-	if (promise === value || !handleThenable(promise, value)) {
-		fulfill(promise, value);
-	}
-}
-
-function fulfill(promise, value) {
-	if (promise._state === PENDING) {
-		promise._state = SETTLED;
-		promise._data = value;
-
-		asyncCall(publishFulfillment, promise);
-	}
-}
-
-function reject(promise, reason) {
-	if (promise._state === PENDING) {
-		promise._state = SETTLED;
-		promise._data = reason;
-
-		asyncCall(publishRejection, promise);
-	}
-}
-
-function publish(promise) {
-	promise._then = promise._then.forEach(invokeCallback);
-}
-
-function publishFulfillment(promise) {
-	promise._state = FULFILLED;
-	publish(promise);
-}
-
-function publishRejection(promise) {
-	promise._state = REJECTED;
-	publish(promise);
-	if (!promise._handled && isNode) {
-		global.process.emit('unhandledRejection', promise._data, promise);
-	}
-}
-
-function notifyRejectionHandled(promise) {
-	global.process.emit('rejectionHandled', promise);
-}
-
-/**
- * @class
- */
-function Promise(resolver) {
-	if (typeof resolver !== 'function') {
-		throw new TypeError('Promise resolver ' + resolver + ' is not a function');
-	}
-
-	if (this instanceof Promise === false) {
-		throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.');
-	}
-
-	this._then = [];
-
-	invokeResolver(resolver, this);
-}
-
-Promise.prototype = {
-	constructor: Promise,
-
-	_state: PENDING,
-	_then: null,
-	_data: undefined,
-	_handled: false,
-
-	then: function (onFulfillment, onRejection) {
-		var subscriber = {
-			owner: this,
-			then: new this.constructor(NOOP),
-			fulfilled: onFulfillment,
-			rejected: onRejection
-		};
-
-		if ((onRejection || onFulfillment) && !this._handled) {
-			this._handled = true;
-			if (this._state === REJECTED && isNode) {
-				asyncCall(notifyRejectionHandled, this);
-			}
-		}
-
-		if (this._state === FULFILLED || this._state === REJECTED) {
-			// already resolved, call callback async
-			asyncCall(invokeCallback, subscriber);
-		} else {
-			// subscribe
-			this._then.push(subscriber);
-		}
-
-		return subscriber.then;
-	},
-
-	catch: function (onRejection) {
-		return this.then(null, onRejection);
-	}
-};
-
-Promise.all = function (promises) {
-	if (!Array.isArray(promises)) {
-		throw new TypeError('You must pass an array to Promise.all().');
-	}
-
-	return new Promise(function (resolve, reject) {
-		var results = [];
-		var remaining = 0;
-
-		function resolver(index) {
-			remaining++;
-			return function (value) {
-				results[index] = value;
-				if (!--remaining) {
-					resolve(results);
-				}
-			};
-		}
-
-		for (var i = 0, promise; i < promises.length; i++) {
-			promise = promises[i];
-
-			if (promise && typeof promise.then === 'function') {
-				promise.then(resolver(i), reject);
-			} else {
-				results[i] = promise;
-			}
-		}
-
-		if (!remaining) {
-			resolve(results);
-		}
-	});
-};
-
-Promise.race = function (promises) {
-	if (!Array.isArray(promises)) {
-		throw new TypeError('You must pass an array to Promise.race().');
-	}
-
-	return new Promise(function (resolve, reject) {
-		for (var i = 0, promise; i < promises.length; i++) {
-			promise = promises[i];
-
-			if (promise && typeof promise.then === 'function') {
-				promise.then(resolve, reject);
-			} else {
-				resolve(promise);
-			}
-		}
-	});
-};
-
-Promise.resolve = function (value) {
-	if (value && typeof value === 'object' && value.constructor === Promise) {
-		return value;
-	}
-
-	return new Promise(function (resolve) {
-		resolve(value);
-	});
-};
-
-Promise.reject = function (reason) {
-	return new Promise(function (resolve, reject) {
-		reject(reason);
-	});
-};
-
-module.exports = Promise;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/license
deleted file mode 100644
index 1aeb74fd25e1715d8129a1babc8113f7c4deb7e3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Vsevolod Strukchinsky <floatdrop@gmail.com> (github.com/floatdrop)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/package.json
deleted file mode 100644
index 28a4af370a800bf483bcd5f6bce55fa521d10188..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/package.json
+++ /dev/null
@@ -1,57 +0,0 @@
-{
-  "_from": "pinkie@>=2.0.0 <3.0.0",
-  "_id": "pinkie@2.0.4",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/pinkie-promise/pinkie",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator/pinkie-promise"
-  ],
-  "_resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-  "_shasum": "72556b80cfa0d48a974e80e77248e80ed4f7f870",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "floatdrop@gmail.com",
-    "name": "Vsevolod Strukchinsky",
-    "url": "github.com/floatdrop"
-  },
-  "bugs": {
-    "url": "https://github.com/floatdrop/pinkie/issues"
-  },
-  "dependencies": {},
-  "description": "Itty bitty little widdle twinkie pinkie ES2015 Promise implementation",
-  "devDependencies": {
-    "core-assert": "^0.1.1",
-    "coveralls": "^2.11.4",
-    "mocha": "*",
-    "nyc": "^3.2.2",
-    "promises-aplus-tests": "*",
-    "xo": "^0.10.1"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/floatdrop/pinkie#readme",
-  "keywords": [
-    "es2015",
-    "es6",
-    "promise",
-    "promises"
-  ],
-  "license": "MIT",
-  "name": "pinkie",
-  "optionalDependencies": {},
-  "readme": "<h1 align=\"center\">\n\t<br>\n\t<img width=\"256\" src=\"media/logo.png\" alt=\"pinkie\">\n\t<br>\n\t<br>\n</h1>\n\n> Itty bitty little widdle twinkie pinkie [ES2015 Promise](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-objects) implementation\n\n[![Build Status](https://travis-ci.org/floatdrop/pinkie.svg?branch=master)](https://travis-ci.org/floatdrop/pinkie)  [![Coverage Status](https://coveralls.io/repos/floatdrop/pinkie/badge.svg?branch=master&service=github)](https://coveralls.io/github/floatdrop/pinkie?branch=master)\n\nThere are [tons of Promise implementations](https://github.com/promises-aplus/promises-spec/blob/master/implementations.md#standalone) out there, but all of them focus on browser compatibility and are often bloated with functionality.\n\nThis module is an exact Promise specification polyfill (like [native-promise-only](https://github.com/getify/native-promise-only)), but in Node.js land (it should be browserify-able though).\n\n\n## Install\n\n```\n$ npm install --save pinkie\n```\n\n\n## Usage\n\n```js\nvar fs = require('fs');\nvar Promise = require('pinkie');\n\nnew Promise(function (resolve, reject) {\n\tfs.readFile('foo.json', 'utf8', function (err, data) {\n\t\tif (err) {\n\t\t\treject(err);\n\t\t\treturn;\n\t\t}\n\n\t\tresolve(data);\n\t});\n});\n//=> Promise\n```\n\n\n### API\n\n`pinkie` exports bare [ES2015 Promise](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-objects) implementation and polyfills [Node.js rejection events](https://nodejs.org/api/process.html#process_event_unhandledrejection). In case you forgot:\n\n#### new Promise(executor)\n\nReturns new instance of `Promise`.\n\n##### executor\n\n*Required*  \nType: `function`\n\nFunction with two arguments `resolve` and `reject`. The first argument fulfills the promise, the second argument rejects it.\n\n#### pinkie.all(promises)\n\nReturns a promise that resolves when all of the promises in the `promises` Array argument have resolved.\n\n#### pinkie.race(promises)\n\nReturns a promise that resolves or rejects as soon as one of the promises in the `promises` Array resolves or rejects, with the value or reason from that promise.\n\n#### pinkie.reject(reason)\n\nReturns a Promise object that is rejected with the given `reason`.\n\n#### pinkie.resolve(value)\n\nReturns a Promise object that is resolved with the given `value`. If the `value` is a thenable (i.e. has a then method), the returned promise will \"follow\" that thenable, adopting its eventual state; otherwise the returned promise will be fulfilled with the `value`.\n\n\n## Related\n\n- [pinkie-promise](https://github.com/floatdrop/pinkie-promise) - Returns the native Promise or this module\n\n\n## License\n\nMIT © [Vsevolod Strukchinsky](http://github.com/floatdrop)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/floatdrop/pinkie.git"
-  },
-  "scripts": {
-    "coverage": "nyc report --reporter=text-lcov | coveralls",
-    "test": "xo && nyc mocha"
-  },
-  "version": "2.0.4"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/readme.md
deleted file mode 100644
index 1565f95889661b0d3f28573d36e64a0fe251b291..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/node_modules/pinkie/readme.md
+++ /dev/null
@@ -1,83 +0,0 @@
-<h1 align="center">
-	<br>
-	<img width="256" src="media/logo.png" alt="pinkie">
-	<br>
-	<br>
-</h1>
-
-> Itty bitty little widdle twinkie pinkie [ES2015 Promise](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-objects) implementation
-
-[![Build Status](https://travis-ci.org/floatdrop/pinkie.svg?branch=master)](https://travis-ci.org/floatdrop/pinkie)  [![Coverage Status](https://coveralls.io/repos/floatdrop/pinkie/badge.svg?branch=master&service=github)](https://coveralls.io/github/floatdrop/pinkie?branch=master)
-
-There are [tons of Promise implementations](https://github.com/promises-aplus/promises-spec/blob/master/implementations.md#standalone) out there, but all of them focus on browser compatibility and are often bloated with functionality.
-
-This module is an exact Promise specification polyfill (like [native-promise-only](https://github.com/getify/native-promise-only)), but in Node.js land (it should be browserify-able though).
-
-
-## Install
-
-```
-$ npm install --save pinkie
-```
-
-
-## Usage
-
-```js
-var fs = require('fs');
-var Promise = require('pinkie');
-
-new Promise(function (resolve, reject) {
-	fs.readFile('foo.json', 'utf8', function (err, data) {
-		if (err) {
-			reject(err);
-			return;
-		}
-
-		resolve(data);
-	});
-});
-//=> Promise
-```
-
-
-### API
-
-`pinkie` exports bare [ES2015 Promise](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-objects) implementation and polyfills [Node.js rejection events](https://nodejs.org/api/process.html#process_event_unhandledrejection). In case you forgot:
-
-#### new Promise(executor)
-
-Returns new instance of `Promise`.
-
-##### executor
-
-*Required*  
-Type: `function`
-
-Function with two arguments `resolve` and `reject`. The first argument fulfills the promise, the second argument rejects it.
-
-#### pinkie.all(promises)
-
-Returns a promise that resolves when all of the promises in the `promises` Array argument have resolved.
-
-#### pinkie.race(promises)
-
-Returns a promise that resolves or rejects as soon as one of the promises in the `promises` Array resolves or rejects, with the value or reason from that promise.
-
-#### pinkie.reject(reason)
-
-Returns a Promise object that is rejected with the given `reason`.
-
-#### pinkie.resolve(value)
-
-Returns a Promise object that is resolved with the given `value`. If the `value` is a thenable (i.e. has a then method), the returned promise will "follow" that thenable, adopting its eventual state; otherwise the returned promise will be fulfilled with the `value`.
-
-
-## Related
-
-- [pinkie-promise](https://github.com/floatdrop/pinkie-promise) - Returns the native Promise or this module
-
-
-## License
-
-MIT © [Vsevolod Strukchinsky](http://github.com/floatdrop)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/package.json
deleted file mode 100644
index cd16b660e268b262f21af991bf3a47d22fba27ab..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-  "_from": "pinkie-promise@>=2.0.0 <3.0.0",
-  "_id": "pinkie-promise@2.0.1",
-  "_location": "/serialport/node-pre-gyp/request/har-validator/pinkie-promise",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/har-validator"
-  ],
-  "_resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-  "_shasum": "2135d6dfa7a358c069ac9b178776288228450ffa",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "floatdrop@gmail.com",
-    "name": "Vsevolod Strukchinsky",
-    "url": "github.com/floatdrop"
-  },
-  "bugs": {
-    "url": "https://github.com/floatdrop/pinkie-promise/issues"
-  },
-  "dependencies": {
-    "pinkie": "^2.0.0"
-  },
-  "description": "ES2015 Promise ponyfill",
-  "devDependencies": {
-    "mocha": "*"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/floatdrop/pinkie-promise#readme",
-  "keywords": [
-    "es2015",
-    "es6",
-    "polyfill",
-    "ponyfill",
-    "promise",
-    "promises"
-  ],
-  "license": "MIT",
-  "name": "pinkie-promise",
-  "optionalDependencies": {},
-  "readme": "# pinkie-promise [![Build Status](https://travis-ci.org/floatdrop/pinkie-promise.svg?branch=master)](https://travis-ci.org/floatdrop/pinkie-promise)\n\n> [ES2015 Promise](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-objects) ponyfill\n\nModule exports global Promise object (if available) or [`pinkie`](http://github.com/floatdrop/pinkie) Promise polyfill.\n\n## Install\n\n```\n$ npm install --save pinkie-promise\n```\n\n## Usage\n\n```js\nvar Promise = require('pinkie-promise');\n\nnew Promise(function (resolve) { resolve('unicorns'); });\n//=> Promise { 'unicorns' }\n```\n\n## Related\n\n- [pify](https://github.com/sindresorhus/pify) - Promisify a callback-style function\n\n## License\n\nMIT © [Vsevolod Strukchinsky](http://github.com/floatdrop)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/floatdrop/pinkie-promise.git"
-  },
-  "scripts": {
-    "test": "mocha"
-  },
-  "version": "2.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/readme.md
deleted file mode 100644
index 78477f4297d677bbfa9579042216bf797284e922..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/node_modules/pinkie-promise/readme.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# pinkie-promise [![Build Status](https://travis-ci.org/floatdrop/pinkie-promise.svg?branch=master)](https://travis-ci.org/floatdrop/pinkie-promise)
-
-> [ES2015 Promise](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-promise-objects) ponyfill
-
-Module exports global Promise object (if available) or [`pinkie`](http://github.com/floatdrop/pinkie) Promise polyfill.
-
-## Install
-
-```
-$ npm install --save pinkie-promise
-```
-
-## Usage
-
-```js
-var Promise = require('pinkie-promise');
-
-new Promise(function (resolve) { resolve('unicorns'); });
-//=> Promise { 'unicorns' }
-```
-
-## Related
-
-- [pify](https://github.com/sindresorhus/pify) - Promisify a callback-style function
-
-## License
-
-MIT © [Vsevolod Strukchinsky](http://github.com/floatdrop)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/package.json
deleted file mode 100644
index d96ec3e58dab503a32a45e588c0cad917f659e22..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/har-validator/package.json
+++ /dev/null
@@ -1,94 +0,0 @@
-{
-  "_from": "har-validator@>=2.0.6 <2.1.0",
-  "_id": "har-validator@2.0.6",
-  "_location": "/serialport/node-pre-gyp/request/har-validator",
-  "_nodeVersion": "5.2.0",
-  "_npmUser": {
-    "email": "ahmad@ahmadnassri.com",
-    "name": "ahmadnassri"
-  },
-  "_npmVersion": "3.3.12",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
-  "_shasum": "cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "ahmad@ahmadnassri.com",
-    "name": "Ahmad Nassri",
-    "url": "https://www.ahmadnassri.com/"
-  },
-  "bin": {
-    "har-validator": "bin/har-validator"
-  },
-  "bugs": {
-    "url": "https://github.com/ahmadnassri/har-validator/issues"
-  },
-  "dependencies": {
-    "chalk": "^1.1.1",
-    "commander": "^2.9.0",
-    "is-my-json-valid": "^2.12.4",
-    "pinkie-promise": "^2.0.0"
-  },
-  "description": "Extremely fast HTTP Archive (HAR) validator using JSON Schema",
-  "devDependencies": {
-    "codeclimate-test-reporter": "0.2.1",
-    "echint": "^1.5.1",
-    "istanbul": "^0.4.2",
-    "mocha": "^2.3.4",
-    "require-directory": "^2.1.1",
-    "should": "^8.1.1",
-    "standard": "^5.4.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d",
-    "tarball": "http://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz"
-  },
-  "echint": {
-    "ignore": [
-      "coverage/**"
-    ]
-  },
-  "engines": {
-    "node": ">=0.10"
-  },
-  "files": [
-    "bin",
-    "lib"
-  ],
-  "gitHead": "92ccddad2e5d13e6e32c764e06c347d67805b211",
-  "homepage": "https://github.com/ahmadnassri/har-validator",
-  "keywords": [
-    "archive",
-    "har",
-    "http",
-    "validate",
-    "validator"
-  ],
-  "license": "ISC",
-  "main": "lib/index",
-  "maintainers": [
-    {
-      "name": "ahmadnassri",
-      "email": "ahmad@ahmadnassri.com"
-    }
-  ],
-  "name": "har-validator",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/ahmadnassri/har-validator.git"
-  },
-  "scripts": {
-    "codeclimate": "codeclimate < coverage/lcov.info",
-    "coverage": "istanbul cover --dir coverage _mocha -- -R dot",
-    "posttest": "npm run coverage",
-    "pretest": "standard && echint",
-    "test": "mocha"
-  },
-  "version": "2.0.6"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/.npmignore
deleted file mode 100644
index 96ed0910bcb696cc07cf902c1cf1057b0d60ff81..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/.npmignore
+++ /dev/null
@@ -1,20 +0,0 @@
-.idea
-*.iml
-npm-debug.log
-dump.rdb
-node_modules
-components
-build
-results.tap
-results.xml
-npm-shrinkwrap.json
-config.json
-.DS_Store
-*/.DS_Store
-*/*/.DS_Store
-._*
-*/._*
-*/*/._*
-coverage.*
-lib-cov
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/.travis.yml
deleted file mode 100755
index 40ca59eeebdd3a6b57da226c32e3feba45a267f9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-
-node_js:
-  - 0.10
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/LICENSE
deleted file mode 100755
index 78809368472fce4d2fc27c183610ccddebddc5d2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/LICENSE
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (c) 2012-2014, Eran Hammer and other contributors.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * The names of any contributors may not be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-                                  *   *   *
-
-The complete list of contributors can be found at: https://github.com/hueniverse/hawk/graphs/contributors
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/README.md
deleted file mode 100755
index b92cd7c439d71538c52ceec2511576ca6d26e9b5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/README.md
+++ /dev/null
@@ -1,634 +0,0 @@
-![hawk Logo](https://raw.github.com/hueniverse/hawk/master/images/hawk.png)
-
-<img align="right" src="https://raw.github.com/hueniverse/hawk/master/images/logo.png" /> **Hawk** is an HTTP authentication scheme using a message authentication code (MAC) algorithm to provide partial
-HTTP request cryptographic verification. For more complex use cases such as access delegation, see [Oz](https://github.com/hueniverse/oz).
-
-Current version: **3.x**
-
-Note: 3.x and 2.x are the same exact protocol as 1.1. The version increments reflect changes in the node API.
-
-[![Build Status](https://secure.travis-ci.org/hueniverse/hawk.png)](http://travis-ci.org/hueniverse/hawk)
-
-# Table of Content
-
-- [**Introduction**](#introduction)
-  - [Replay Protection](#replay-protection)
-  - [Usage Example](#usage-example)
-  - [Protocol Example](#protocol-example)
-    - [Payload Validation](#payload-validation)
-    - [Response Payload Validation](#response-payload-validation)
-  - [Browser Support and Considerations](#browser-support-and-considerations)
-<p></p>
-- [**Single URI Authorization**](#single-uri-authorization)
-  - [Usage Example](#bewit-usage-example)
-<p></p>
-- [**Security Considerations**](#security-considerations)
-  - [MAC Keys Transmission](#mac-keys-transmission)
-  - [Confidentiality of Requests](#confidentiality-of-requests)
-  - [Spoofing by Counterfeit Servers](#spoofing-by-counterfeit-servers)
-  - [Plaintext Storage of Credentials](#plaintext-storage-of-credentials)
-  - [Entropy of Keys](#entropy-of-keys)
-  - [Coverage Limitations](#coverage-limitations)
-  - [Future Time Manipulation](#future-time-manipulation)
-  - [Client Clock Poisoning](#client-clock-poisoning)
-  - [Bewit Limitations](#bewit-limitations)
-  - [Host Header Forgery](#host-header-forgery)
-<p></p>
-- [**Frequently Asked Questions**](#frequently-asked-questions)
-<p></p>
-- [**Implementations**](#implementations)
-- [**Acknowledgements**](#acknowledgements)
-
-# Introduction
-
-**Hawk** is an HTTP authentication scheme providing mechanisms for making authenticated HTTP requests with
-partial cryptographic verification of the request and response, covering the HTTP method, request URI, host,
-and optionally the request payload.
-
-Similar to the HTTP [Digest access authentication schemes](http://www.ietf.org/rfc/rfc2617.txt), **Hawk** uses a set of
-client credentials which include an identifier (e.g. username) and key (e.g. password). Likewise, just as with the Digest scheme,
-the key is never included in authenticated requests. Instead, it is used to calculate a request MAC value which is
-included in its place.
-
-However, **Hawk** has several differences from Digest. In particular, while both use a nonce to limit the possibility of
-replay attacks, in **Hawk** the client generates the nonce and uses it in combination with a timestamp, leading to less
-"chattiness" (interaction with the server).
-
-Also unlike Digest, this scheme is not intended to protect the key itself (the password in Digest) because
-the client and server must both have access to the key material in the clear.
-
-The primary design goals of this scheme are to:
-* simplify and improve HTTP authentication for services that are unwilling or unable to deploy TLS for all resources,
-* secure credentials against leakage (e.g., when the client uses some form of dynamic configuration to determine where
-  to send an authenticated request), and
-* avoid the exposure of credentials sent to a malicious server over an unauthenticated secure channel due to client
-  failure to validate the server's identity as part of its TLS handshake.
-
-In addition, **Hawk** supports a method for granting third-parties temporary access to individual resources using
-a query parameter called _bewit_ (in falconry, a leather strap used to attach a tracking device to the leg of a hawk).
-
-The **Hawk** scheme requires the establishment of a shared symmetric key between the client and the server,
-which is beyond the scope of this module. Typically, the shared credentials are established via an initial
-TLS-protected phase or derived from some other shared confidential information available to both the client
-and the server.
-
-
-## Replay Protection
-
-Without replay protection, an attacker can use a compromised (but otherwise valid and authenticated) request more 
-than once, gaining access to a protected resource. To mitigate this, clients include both a nonce and a timestamp when 
-making requests. This gives the server enough information to prevent replay attacks.
-
-The nonce is generated by the client, and is a string unique across all requests with the same timestamp and
-key identifier combination. 
-
-The timestamp enables the server to restrict the validity period of the credentials where requests occuring afterwards
-are rejected. It also removes the need for the server to retain an unbounded number of nonce values for future checks.
-By default, **Hawk** uses a time window of 1 minute to allow for time skew between the client and server (which in
-practice translates to a maximum of 2 minutes as the skew can be positive or negative).
-
-Using a timestamp requires the client's clock to be in sync with the server's clock. **Hawk** requires both the client
-clock and the server clock to use NTP to ensure synchronization. However, given the limitations of some client types
-(e.g. browsers) to deploy NTP, the server provides the client with its current time (in seconds precision) in response
-to a bad timestamp.
-
-There is no expectation that the client will adjust its system clock to match the server (in fact, this would be a
-potential attack vector). Instead, the client only uses the server's time to calculate an offset used only
-for communications with that particular server. The protocol rewards clients with synchronized clocks by reducing
-the number of round trips required to authenticate the first request.
-
-
-## Usage Example
-
-Server code:
-
-```javascript
-var Http = require('http');
-var Hawk = require('hawk');
-
-
-// Credentials lookup function
-
-var credentialsFunc = function (id, callback) {
-
-    var credentials = {
-        key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-        algorithm: 'sha256',
-        user: 'Steve'
-    };
-
-    return callback(null, credentials);
-};
-
-// Create HTTP server
-
-var handler = function (req, res) {
-
-    // Authenticate incoming request
-
-    Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
-
-        // Prepare response
-
-        var payload = (!err ? 'Hello ' + credentials.user + ' ' + artifacts.ext : 'Shoosh!');
-        var headers = { 'Content-Type': 'text/plain' };
-
-        // Generate Server-Authorization response header
-
-        var header = Hawk.server.header(credentials, artifacts, { payload: payload, contentType: headers['Content-Type'] });
-        headers['Server-Authorization'] = header;
-
-        // Send the response back
-
-        res.writeHead(!err ? 200 : 401, headers);
-        res.end(payload);
-    });
-};
-
-// Start server
-
-Http.createServer(handler).listen(8000, 'example.com');
-```
-
-Client code:
-
-```javascript
-var Request = require('request');
-var Hawk = require('hawk');
-
-
-// Client credentials
-
-var credentials = {
-    id: 'dh37fgj492je',
-    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-    algorithm: 'sha256'
-}
-
-// Request options
-
-var requestOptions = {
-    uri: 'http://example.com:8000/resource/1?b=1&a=2',
-    method: 'GET',
-    headers: {}
-};
-
-// Generate Authorization request header
-
-var header = Hawk.client.header('http://example.com:8000/resource/1?b=1&a=2', 'GET', { credentials: credentials, ext: 'some-app-data' });
-requestOptions.headers.Authorization = header.field;
-
-// Send authenticated request
-
-Request(requestOptions, function (error, response, body) {
-
-    // Authenticate the server's response
-
-    var isValid = Hawk.client.authenticate(response, credentials, header.artifacts, { payload: body });
-
-    // Output results
-
-    console.log(response.statusCode + ': ' + body + (isValid ? ' (valid)' : ' (invalid)'));
-});
-```
-
-**Hawk** utilized the [**SNTP**](https://github.com/hueniverse/sntp) module for time sync management. By default, the local
-machine time is used. To automatically retrieve and synchronice the clock within the application, use the SNTP 'start()' method.
-
-```javascript
-Hawk.sntp.start();
-```
-
-
-## Protocol Example
-
-The client attempts to access a protected resource without authentication, sending the following HTTP request to
-the resource server:
-
-```
-GET /resource/1?b=1&a=2 HTTP/1.1
-Host: example.com:8000
-```
-
-The resource server returns an authentication challenge.
-
-```
-HTTP/1.1 401 Unauthorized
-WWW-Authenticate: Hawk
-```
-
-The client has previously obtained a set of **Hawk** credentials for accessing resources on the "http://example.com/"
-server. The **Hawk** credentials issued to the client include the following attributes:
-
-* Key identifier: dh37fgj492je
-* Key: werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn
-* Algorithm: sha256
-
-The client generates the authentication header by calculating a timestamp (e.g. the number of seconds since January 1,
-1970 00:00:00 GMT), generating a nonce, and constructing the normalized request string (each value followed by a newline
-character):
-
-```
-hawk.1.header
-1353832234
-j4h3g2
-GET
-/resource/1?b=1&a=2
-example.com
-8000
-
-some-app-ext-data
-
-```
-
-The request MAC is calculated using HMAC with the specified hash algorithm "sha256" and the key over the normalized request string.
-The result is base64-encoded to produce the request MAC:
-
-```
-6R4rV5iE+NPoym+WwjeHzjAGXUtLNIxmo1vpMofpLAE=
-```
-
-The client includes the **Hawk** key identifier, timestamp, nonce, application specific data, and request MAC with the request using
-the HTTP `Authorization` request header field:
-
-```
-GET /resource/1?b=1&a=2 HTTP/1.1
-Host: example.com:8000
-Authorization: Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", ext="some-app-ext-data", mac="6R4rV5iE+NPoym+WwjeHzjAGXUtLNIxmo1vpMofpLAE="
-```
-
-The server validates the request by calculating the request MAC again based on the request received and verifies the validity
-and scope of the **Hawk** credentials. If valid, the server responds with the requested resource.
-
-
-### Payload Validation
-
-**Hawk** provides optional payload validation. When generating the authentication header, the client calculates a payload hash
-using the specified hash algorithm. The hash is calculated over the concatenated value of (each followed by a newline character):
-* `hawk.1.payload`
-* the content-type in lowercase, without any parameters (e.g. `application/json`)
-* the request payload prior to any content encoding (the exact representation requirements should be specified by the server for payloads other than simple single-part ascii to ensure interoperability)
-
-For example:
-
-* Payload: `Thank you for flying Hawk`
-* Content Type: `text/plain`
-* Hash (sha256): `Yi9LfIIFRtBEPt74PVmbTF/xVAwPn7ub15ePICfgnuY=`
-
-Results in the following input to the payload hash function (newline terminated values):
-
-```
-hawk.1.payload
-text/plain
-Thank you for flying Hawk
-
-```
-
-Which produces the following hash value:
-
-```
-Yi9LfIIFRtBEPt74PVmbTF/xVAwPn7ub15ePICfgnuY=
-```
-
-The client constructs the normalized request string (newline terminated values):
-
-```
-hawk.1.header
-1353832234
-j4h3g2
-POST
-/resource/1?a=1&b=2
-example.com
-8000
-Yi9LfIIFRtBEPt74PVmbTF/xVAwPn7ub15ePICfgnuY=
-some-app-ext-data
-
-```
-
-Then calculates the request MAC and includes the **Hawk** key identifier, timestamp, nonce, payload hash, application specific data,
-and request MAC, with the request using the HTTP `Authorization` request header field:
-
-```
-POST /resource/1?a=1&b=2 HTTP/1.1
-Host: example.com:8000
-Authorization: Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", hash="Yi9LfIIFRtBEPt74PVmbTF/xVAwPn7ub15ePICfgnuY=", ext="some-app-ext-data", mac="aSe1DERmZuRl3pI36/9BdZmnErTw3sNzOOAUlfeKjVw="
-```
-
-It is up to the server if and when it validates the payload for any given request, based solely on it's security policy
-and the nature of the data included.
-
-If the payload is available at the time of authentication, the server uses the hash value provided by the client to construct
-the normalized string and validates the MAC. If the MAC is valid, the server calculates the payload hash and compares the value
-with the provided payload hash in the header. In many cases, checking the MAC first is faster than calculating the payload hash.
-
-However, if the payload is not available at authentication time (e.g. too large to fit in memory, streamed elsewhere, or processed
-at a different stage in the application), the server may choose to defer payload validation for later by retaining the hash value
-provided by the client after validating the MAC.
-
-It is important to note that MAC validation does not mean the hash value provided by the client is valid, only that the value
-included in the header was not modified. Without calculating the payload hash on the server and comparing it to the value provided
-by the client, the payload may be modified by an attacker.
-
-
-## Response Payload Validation
-
-**Hawk** provides partial response payload validation. The server includes the `Server-Authorization` response header which enables the
-client to authenticate the response and ensure it is talking to the right server. **Hawk** defines the HTTP `Server-Authorization` header
-as a response header using the exact same syntax as the `Authorization` request header field.
-
-The header is contructed using the same process as the client's request header. The server uses the same credentials and other
-artifacts provided by the client to constructs the normalized request string. The `ext` and `hash` values are replaced with
-new values based on the server response. The rest as identical to those used by the client.
-
-The result MAC digest is included with the optional `hash` and `ext` values:
-
-```
-Server-Authorization: Hawk mac="XIJRsMl/4oL+nn+vKoeVZPdCHXB4yJkNnBbTbHFZUYE=", hash="f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=", ext="response-specific"
-```
-
-
-## Browser Support and Considerations
-
-A browser script is provided for including using a `<script>` tag in [lib/browser.js](/lib/browser.js). It's also a [component](http://component.io/hueniverse/hawk).
-
-**Hawk** relies on the _Server-Authorization_ and _WWW-Authenticate_ headers in its response to communicate with the client.
-Therefore, in case of CORS requests, it is important to consider sending _Access-Control-Expose-Headers_ with the value
-_"WWW-Authenticate, Server-Authorization"_ on each response from your server. As explained in the
-[specifications](http://www.w3.org/TR/cors/#access-control-expose-headers-response-header), it will indicate that these headers
-can safely be accessed by the client (using getResponseHeader() on the XmlHttpRequest object). Otherwise you will be met with a
-["simple response header"](http://www.w3.org/TR/cors/#simple-response-header) which excludes these fields and would prevent the
-Hawk client from authenticating the requests.You can read more about the why and how in this
-[article](http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server)
-
-
-# Single URI Authorization
-
-There are cases in which limited and short-term access to a protected resource is granted to a third party which does not
-have access to the shared credentials. For example, displaying a protected image on a web page accessed by anyone. **Hawk**
-provides limited support for such URIs in the form of a _bewit_ - a URI query parameter appended to the request URI which contains
-the necessary credentials to authenticate the request.
-
-Because of the significant security risks involved in issuing such access, bewit usage is purposely limited only to GET requests
-and for a finite period of time. Both the client and server can issue bewit credentials, however, the server should not use the same
-credentials as the client to maintain clear traceability as to who issued which credentials.
-
-In order to simplify implementation, bewit credentials do not support single-use policy and can be replayed multiple times within
-the granted access timeframe. 
-
-
-## Bewit Usage Example
-
-Server code:
-
-```javascript
-var Http = require('http');
-var Hawk = require('hawk');
-
-
-// Credentials lookup function
-
-var credentialsFunc = function (id, callback) {
-
-    var credentials = {
-        key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-        algorithm: 'sha256'
-    };
-
-    return callback(null, credentials);
-};
-
-// Create HTTP server
-
-var handler = function (req, res) {
-
-    Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-        res.writeHead(!err ? 200 : 401, { 'Content-Type': 'text/plain' });
-        res.end(!err ? 'Access granted' : 'Shoosh!');
-    });
-};
-
-Http.createServer(handler).listen(8000, 'example.com');
-```
-
-Bewit code generation:
-
-```javascript
-var Request = require('request');
-var Hawk = require('hawk');
-
-
-// Client credentials
-
-var credentials = {
-    id: 'dh37fgj492je',
-    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-    algorithm: 'sha256'
-}
-
-// Generate bewit
-
-var duration = 60 * 5;      // 5 Minutes
-var bewit = Hawk.uri.getBewit('http://example.com:8080/resource/1?b=1&a=2', { credentials: credentials, ttlSec: duration, ext: 'some-app-data' });
-var uri = 'http://example.com:8000/resource/1?b=1&a=2' + '&bewit=' + bewit;
-```
-
-
-# Security Considerations
-
-The greatest sources of security risks are usually found not in **Hawk** but in the policies and procedures surrounding its use.
-Implementers are strongly encouraged to assess how this module addresses their security requirements. This section includes
-an incomplete list of security considerations that must be reviewed and understood before deploying **Hawk** on the server.
-Many of the protections provided in **Hawk** depends on whether and how they are used.
-
-### MAC Keys Transmission
-
-**Hawk** does not provide any mechanism for obtaining or transmitting the set of shared credentials required. Any mechanism used
-to obtain **Hawk** credentials must ensure that these transmissions are protected using transport-layer mechanisms such as TLS.
-
-### Confidentiality of Requests
-
-While **Hawk** provides a mechanism for verifying the integrity of HTTP requests, it provides no guarantee of request
-confidentiality. Unless other precautions are taken, eavesdroppers will have full access to the request content. Servers should
-carefully consider the types of data likely to be sent as part of such requests, and employ transport-layer security mechanisms
-to protect sensitive resources.
-
-### Spoofing by Counterfeit Servers
-
-**Hawk** provides limited verification of the server authenticity. When receiving a response back from the server, the server
-may choose to include a response `Server-Authorization` header which the client can use to verify the response. However, it is up to
-the server to determine when such measure is included, to up to the client to enforce that policy.
-
-A hostile party could take advantage of this by intercepting the client's requests and returning misleading or otherwise
-incorrect responses. Service providers should consider such attacks when developing services using this protocol, and should
-require transport-layer security for any requests where the authenticity of the resource server or of server responses is an issue.
-
-### Plaintext Storage of Credentials
-
-The **Hawk** key functions the same way passwords do in traditional authentication systems. In order to compute the request MAC,
-the server must have access to the key in plaintext form. This is in contrast, for example, to modern operating systems, which
-store only a one-way hash of user credentials.
-
-If an attacker were to gain access to these keys - or worse, to the server's database of all such keys - he or she would be able
-to perform any action on behalf of any resource owner. Accordingly, it is critical that servers protect these keys from unauthorized
-access.
-
-### Entropy of Keys
-
-Unless a transport-layer security protocol is used, eavesdroppers will have full access to authenticated requests and request
-MAC values, and will thus be able to mount offline brute-force attacks to recover the key used. Servers should be careful to
-assign keys which are long enough, and random enough, to resist such attacks for at least the length of time that the **Hawk**
-credentials are valid.
-
-For example, if the credentials are valid for two weeks, servers should ensure that it is not possible to mount a brute force
-attack that recovers the key in less than two weeks. Of course, servers are urged to err on the side of caution, and use the
-longest key reasonable.
-
-It is equally important that the pseudo-random number generator (PRNG) used to generate these keys be of sufficiently high
-quality. Many PRNG implementations generate number sequences that may appear to be random, but which nevertheless exhibit
-patterns or other weaknesses which make cryptanalysis or brute force attacks easier. Implementers should be careful to use
-cryptographically secure PRNGs to avoid these problems.
-
-### Coverage Limitations
-
-The request MAC only covers the HTTP `Host` header and optionally the `Content-Type` header. It does not cover any other headers
-which can often affect how the request body is interpreted by the server. If the server behavior is influenced by the presence
-or value of such headers, an attacker can manipulate the request headers without being detected. Implementers should use the
-`ext` feature to pass application-specific information via the `Authorization` header which is protected by the request MAC.
-
-The response authentication, when performed, only covers the response payload, content-type, and the request information 
-provided by the client in it's request (method, resource, timestamp, nonce, etc.). It does not cover the HTTP status code or
-any other response header field (e.g. Location) which can affect the client's behaviour.
-
-### Future Time Manipulation
-
-The protocol relies on a clock sync between the client and server. To accomplish this, the server informs the client of its
-current time when an invalid timestamp is received.
-
-If an attacker is able to manipulate this information and cause the client to use an incorrect time, it would be able to cause
-the client to generate authenticated requests using time in the future. Such requests will fail when sent by the client, and will
-not likely leave a trace on the server (given the common implementation of nonce, if at all enforced). The attacker will then
-be able to replay the request at the correct time without detection.
-
-The client must only use the time information provided by the server if:
-* it was delivered over a TLS connection and the server identity has been verified, or
-* the `tsm` MAC digest calculated using the same client credentials over the timestamp has been verified.
-
-### Client Clock Poisoning
-
-When receiving a request with a bad timestamp, the server provides the client with its current time. The client must never use
-the time received from the server to adjust its own clock, and must only use it to calculate an offset for communicating with
-that particular server.
-
-### Bewit Limitations
-
-Special care must be taken when issuing bewit credentials to third parties. Bewit credentials are valid until expiration and cannot
-be revoked or limited without using other means. Whatever resource they grant access to will be completely exposed to anyone with
-access to the bewit credentials which act as bearer credentials for that particular resource. While bewit usage is limited to GET
-requests only and therefore cannot be used to perform transactions or change server state, it can still be used to expose private
-and sensitive information.
-
-### Host Header Forgery
-
-Hawk validates the incoming request MAC against the incoming HTTP Host header. However, unless the optional `host` and `port`
-options are used with `server.authenticate()`, a malicous client can mint new host names pointing to the server's IP address and
-use that to craft an attack by sending a valid request that's meant for another hostname than the one used by the server. Server
-implementors must manually verify that the host header received matches their expectation (or use the options mentioned above).
-
-# Frequently Asked Questions
-
-### Where is the protocol specification?
-
-If you are looking for some prose explaining how all this works, **this is it**. **Hawk** is being developed as an open source
-project instead of a standard. In other words, the [code](/hueniverse/hawk/tree/master/lib) is the specification. Not sure about
-something? Open an issue!
-
-### Is it done?
-
-As of version 0.10.0, **Hawk** is feature-complete. However, until this module reaches version 1.0.0 it is considered experimental
-and is likely to change. This also means your feedback and contribution are very welcome. Feel free to open issues with questions
-and suggestions.
-
-### Where can I find **Hawk** implementations in other languages?
-
-**Hawk**'s only reference implementation is provided in JavaScript as a node.js module. However, it has been ported to other languages.
-The full list is maintained [here](https://github.com/hueniverse/hawk/issues?labels=port&state=closed). Please add an issue if you are
-working on another port. A cross-platform test-suite is in the works.
-
-### Why isn't the algorithm part of the challenge or dynamically negotiated?
-
-The algorithm used is closely related to the key issued as different algorithms require different key sizes (and other
-requirements). While some keys can be used for multiple algorithm, the protocol is designed to closely bind the key and algorithm
-together as part of the issued credentials.
-
-### Why is Host and Content-Type the only headers covered by the request MAC?
-
-It is really hard to include other headers. Headers can be changed by proxies and other intermediaries and there is no
-well-established way to normalize them. Many platforms change the case of header field names and values. The only
-straight-forward solution is to include the headers in some blob (say, base64 encoded JSON) and include that with the request,
-an approach taken by JWT and other such formats. However, that design violates the HTTP header boundaries, repeats information,
-and introduces other security issues because firewalls will not be aware of these "hidden" headers. In addition, any information
-repeated must be compared to the duplicated information in the header and therefore only moves the problem elsewhere.
-
-### Why not just use HTTP Digest?
-
-Digest requires pre-negotiation to establish a nonce. This means you can't just make a request - you must first send
-a protocol handshake to the server. This pattern has become unacceptable for most web services, especially mobile
-where extra round-trip are costly.
-
-### Why bother with all this nonce and timestamp business?
-
-**Hawk** is an attempt to find a reasonable, practical compromise between security and usability. OAuth 1.0 got timestamp
-and nonces halfway right but failed when it came to scalability and consistent developer experience. **Hawk** addresses
-it by requiring the client to sync its clock, but provides it with tools to accomplish it.
-
-In general, replay protection is a matter of application-specific threat model. It is less of an issue on a TLS-protected
-system where the clients are implemented using best practices and are under the control of the server. Instead of dropping
-replay protection, **Hawk** offers a required time window and an optional nonce verification. Together, it provides developers
-with the ability to decide how to enforce their security policy without impacting the client's implementation.
-
-### What are `app` and `dlg` in the authorization header and normalized mac string?
-
-The original motivation for **Hawk** was to replace the OAuth 1.0 use cases. This included both a simple client-server mode which
-this module is specifically designed for, and a delegated access mode which is being developed separately in
-[Oz](https://github.com/hueniverse/oz). In addition to the **Hawk** use cases, Oz requires another attribute: the application id `app`.
-This provides binding between the credentials and the application in a way that prevents an attacker from tricking an application
-to use credentials issued to someone else. It also has an optional 'delegated-by' attribute `dlg` which is the application id of the
-application the credentials were directly issued to. The goal of these two additions is to allow Oz to utilize **Hawk** directly,
-but with the additional security of delegated credentials.
-
-### What is the purpose of the static strings used in each normalized MAC input?
-
-When calculating a hash or MAC, a static prefix (tag) is added. The prefix is used to prevent MAC values from being
-used or reused for a purpose other than what they were created for (i.e. prevents switching MAC values between a request,
-response, and a bewit use cases). It also protects against exploits created after a potential change in how the protocol
-creates the normalized string. For example, if a future version would switch the order of nonce and timestamp, it
-can create an exploit opportunity for cases where the nonce is similar in format to a timestamp.
-
-### Does **Hawk** have anything to do with OAuth?
-
-Short answer: no.
-
-**Hawk** was originally proposed as the OAuth MAC Token specification. However, the OAuth working group in its consistent
-incompetence failed to produce a final, usable solution to address one of the most popular use cases of OAuth 1.0 - using it
-to authenticate simple client-server transactions (i.e. two-legged). As you can guess, the OAuth working group is still hard
-at work to produce more garbage.
-
-**Hawk** provides a simple HTTP authentication scheme for making client-server requests. It does not address the OAuth use case
-of delegating access to a third party. If you are looking for an OAuth alternative, check out [Oz](https://github.com/hueniverse/oz).
-
-# Implementations
-
-- [Logibit Hawk in F#/.Net](https://github.com/logibit/logibit.hawk/)
-- [Tent Hawk in Ruby](https://github.com/tent/hawk-ruby)
-- [Wealdtech in Java](https://github.com/wealdtech/hawk)
-- [Kumar's Mohawk in Python](https://github.com/kumar303/mohawk/)
-
-# Acknowledgements
-
-**Hawk** is a derivative work of the [HTTP MAC Authentication Scheme](http://tools.ietf.org/html/draft-hammer-oauth-v2-mac-token-05) proposal
-co-authored by Ben Adida, Adam Barth, and Eran Hammer, which in turn was based on the OAuth 1.0 community specification.
-
-Special thanks to Ben Laurie for his always insightful feedback and advice.
-
-The **Hawk** logo was created by [Chris Carrasco](http://chriscarrasco.com).
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/bower.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/bower.json
deleted file mode 100644
index 02729c5dcac7ecb06fd8cbd308e3ae2b7641588a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/bower.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
-  "name": "hawk",
-  "main": "lib/browser.js",
-  "license": "./LICENSE",
-  "ignore": [
-    "!lib",
-    "lib/*",
-    "!lib/browser.js",
-    "index.js"
-  ],
-  "keywords": [
-    "http",
-    "authentication",
-    "scheme",
-    "hawk"
-  ],
-  "authors": [
-    "Eran Hammer <eran@hammer.io>"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/hueniverse/hawk.git"
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/component.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/component.json
deleted file mode 100644
index 57be3ebf2e5b09325e7d519c966a369546ec0a25..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/component.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name": "hawk",
-  "repo": "hueniverse/hawk",
-  "description": "HTTP Hawk Authentication Scheme",
-  "version": "1.0.0",
-  "keywords": [
-    "http",
-    "authentication",
-    "scheme",
-    "hawk"
-  ],
-  "dependencies": {},
-  "development": {},
-  "license": "BSD",
-  "main": "lib/browser.js",
-  "scripts": [
-    "lib/browser.js"
-  ]
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/dist/client.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/dist/client.js
deleted file mode 100644
index 1827386ed269eab98a58139cc7933bbac4e8e0f1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/dist/client.js
+++ /dev/null
@@ -1,343 +0,0 @@
-'use strict'
-
-// Load modules
-
-;
-
-var _typeof = function (obj) {
-
-    return obj && typeof Symbol !== 'undefined' && obj.constructor === Symbol ? 'symbol' : typeof obj;
-};
-
-var Url = require('url');
-var Hoek = require('hoek');
-var Cryptiles = require('cryptiles');
-var Crypto = require('./crypto');
-var Utils = require('./utils');
-
-// Declare internals
-
-var internals = {};
-
-// Generate an Authorization header for a given request
-
-/*
-    uri: 'http://example.com/resource?a=b' or object from Url.parse()
-    method: HTTP verb (e.g. 'GET', 'POST')
-    options: {
-
-        // Required
-
-        credentials: {
-            id: 'dh37fgj492je',
-            key: 'aoijedoaijsdlaksjdl',
-            algorithm: 'sha256'                                 // 'sha1', 'sha256'
-        },
-
-        // Optional
-
-        ext: 'application-specific',                        // Application specific data sent via the ext attribute
-        timestamp: Date.now(),                              // A pre-calculated timestamp
-        nonce: '2334f34f',                                  // A pre-generated nonce
-        localtimeOffsetMsec: 400,                           // Time offset to sync with server time (ignored if timestamp provided)
-        payload: '{"some":"payload"}',                      // UTF-8 encoded string for body hash generation (ignored if hash provided)
-        contentType: 'application/json',                    // Payload content-type (ignored if hash provided)
-        hash: 'U4MKKSmiVxk37JCCrAVIjV=',                    // Pre-calculated payload hash
-        app: '24s23423f34dx',                               // Oz application id
-        dlg: '234sz34tww3sd'                                // Oz delegated-by application id
-    }
-*/
-
-exports.header = function (uri, method, options) {
-
-    var result = {
-        field: '',
-        artifacts: {}
-    };
-
-    // Validate inputs
-
-    if (!uri || typeof uri !== 'string' && (typeof uri === 'undefined' ? 'undefined' : _typeof(uri)) !== 'object' || !method || typeof method !== 'string' || !options || (typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') {
-
-        result.err = 'Invalid argument type';
-        return result;
-    }
-
-    // Application time
-
-    var timestamp = options.timestamp || Utils.nowSecs(options.localtimeOffsetMsec);
-
-    // Validate credentials
-
-    var credentials = options.credentials;
-    if (!credentials || !credentials.id || !credentials.key || !credentials.algorithm) {
-
-        result.err = 'Invalid credential object';
-        return result;
-    }
-
-    if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-        result.err = 'Unknown algorithm';
-        return result;
-    }
-
-    // Parse URI
-
-    if (typeof uri === 'string') {
-        uri = Url.parse(uri);
-    }
-
-    // Calculate signature
-
-    var artifacts = {
-        ts: timestamp,
-        nonce: options.nonce || Cryptiles.randomString(6),
-        method: method,
-        resource: uri.pathname + (uri.search || ''), // Maintain trailing '?'
-        host: uri.hostname,
-        port: uri.port || (uri.protocol === 'http:' ? 80 : 443),
-        hash: options.hash,
-        ext: options.ext,
-        app: options.app,
-        dlg: options.dlg
-    };
-
-    result.artifacts = artifacts;
-
-    // Calculate payload hash
-
-    if (!artifacts.hash && (options.payload || options.payload === '')) {
-
-        artifacts.hash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
-    }
-
-    var mac = Crypto.calculateMac('header', credentials, artifacts);
-
-    // Construct header
-
-    var hasExt = artifacts.ext !== null && artifacts.ext !== undefined && artifacts.ext !== ''; // Other falsey values allowed
-    var header = 'Hawk id="' + credentials.id + '", ts="' + artifacts.ts + '", nonce="' + artifacts.nonce + (artifacts.hash ? '", hash="' + artifacts.hash : '') + (hasExt ? '", ext="' + Hoek.escapeHeaderAttribute(artifacts.ext) : '') + '", mac="' + mac + '"';
-
-    if (artifacts.app) {
-        header = header + ', app="' + artifacts.app + (artifacts.dlg ? '", dlg="' + artifacts.dlg : '') + '"';
-    }
-
-    result.field = header;
-
-    return result;
-};
-
-// Validate server response
-
-/*
-    res:        node's response object
-    artifacts:  object received from header().artifacts
-    options: {
-        payload:    optional payload received
-        required:   specifies if a Server-Authorization header is required. Defaults to 'false'
-    }
-*/
-
-exports.authenticate = function (res, credentials, artifacts, options) {
-
-    artifacts = Hoek.clone(artifacts);
-    options = options || {};
-
-    if (res.headers['www-authenticate']) {
-
-        // Parse HTTP WWW-Authenticate header
-
-        var wwwAttributes = Utils.parseAuthorizationHeader(res.headers['www-authenticate'], ['ts', 'tsm', 'error']);
-        if (wwwAttributes instanceof Error) {
-            return false;
-        }
-
-        // Validate server timestamp (not used to update clock since it is done via the SNPT client)
-
-        if (wwwAttributes.ts) {
-            var tsm = Crypto.calculateTsMac(wwwAttributes.ts, credentials);
-            if (tsm !== wwwAttributes.tsm) {
-                return false;
-            }
-        }
-    }
-
-    // Parse HTTP Server-Authorization header
-
-    if (!res.headers['server-authorization'] && !options.required) {
-
-        return true;
-    }
-
-    var attributes = Utils.parseAuthorizationHeader(res.headers['server-authorization'], ['mac', 'ext', 'hash']);
-    if (attributes instanceof Error) {
-        return false;
-    }
-
-    artifacts.ext = attributes.ext;
-    artifacts.hash = attributes.hash;
-
-    var mac = Crypto.calculateMac('response', credentials, artifacts);
-    if (mac !== attributes.mac) {
-        return false;
-    }
-
-    if (!options.payload && options.payload !== '') {
-
-        return true;
-    }
-
-    if (!attributes.hash) {
-        return false;
-    }
-
-    var calculatedHash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, res.headers['content-type']);
-    return calculatedHash === attributes.hash;
-};
-
-// Generate a bewit value for a given URI
-
-/*
-    uri: 'http://example.com/resource?a=b' or object from Url.parse()
-    options: {
-
-        // Required
-
-        credentials: {
-            id: 'dh37fgj492je',
-            key: 'aoijedoaijsdlaksjdl',
-            algorithm: 'sha256'                             // 'sha1', 'sha256'
-        },
-        ttlSec: 60 * 60,                                    // TTL in seconds
-
-        // Optional
-
-        ext: 'application-specific',                        // Application specific data sent via the ext attribute
-        localtimeOffsetMsec: 400                            // Time offset to sync with server time
-    };
-*/
-
-exports.getBewit = function (uri, options) {
-
-    // Validate inputs
-
-    if (!uri || typeof uri !== 'string' && (typeof uri === 'undefined' ? 'undefined' : _typeof(uri)) !== 'object' || !options || (typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object' || !options.ttlSec) {
-
-        return '';
-    }
-
-    options.ext = options.ext === null || options.ext === undefined ? '' : options.ext; // Zero is valid value
-
-    // Application time
-
-    var now = Utils.now(options.localtimeOffsetMsec);
-
-    // Validate credentials
-
-    var credentials = options.credentials;
-    if (!credentials || !credentials.id || !credentials.key || !credentials.algorithm) {
-
-        return '';
-    }
-
-    if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-        return '';
-    }
-
-    // Parse URI
-
-    if (typeof uri === 'string') {
-        uri = Url.parse(uri);
-    }
-
-    // Calculate signature
-
-    var exp = Math.floor(now / 1000) + options.ttlSec;
-    var mac = Crypto.calculateMac('bewit', credentials, {
-        ts: exp,
-        nonce: '',
-        method: 'GET',
-        resource: uri.pathname + (uri.search || ''), // Maintain trailing '?'
-        host: uri.hostname,
-        port: uri.port || (uri.protocol === 'http:' ? 80 : 443),
-        ext: options.ext
-    });
-
-    // Construct bewit: id\exp\mac\ext
-
-    var bewit = credentials.id + '\\' + exp + '\\' + mac + '\\' + options.ext;
-    return Hoek.base64urlEncode(bewit);
-};
-
-// Generate an authorization string for a message
-
-/*
-    host: 'example.com',
-    port: 8000,
-    message: '{"some":"payload"}',                          // UTF-8 encoded string for body hash generation
-    options: {
-
-        // Required
-
-        credentials: {
-            id: 'dh37fgj492je',
-            key: 'aoijedoaijsdlaksjdl',
-            algorithm: 'sha256'                             // 'sha1', 'sha256'
-        },
-
-        // Optional
-
-        timestamp: Date.now(),                              // A pre-calculated timestamp
-        nonce: '2334f34f',                                  // A pre-generated nonce
-        localtimeOffsetMsec: 400,                           // Time offset to sync with server time (ignored if timestamp provided)
-    }
-*/
-
-exports.message = function (host, port, message, options) {
-
-    // Validate inputs
-
-    if (!host || typeof host !== 'string' || !port || typeof port !== 'number' || message === null || message === undefined || typeof message !== 'string' || !options || (typeof options === 'undefined' ? 'undefined' : _typeof(options)) !== 'object') {
-
-        return null;
-    }
-
-    // Application time
-
-    var timestamp = options.timestamp || Utils.nowSecs(options.localtimeOffsetMsec);
-
-    // Validate credentials
-
-    var credentials = options.credentials;
-    if (!credentials || !credentials.id || !credentials.key || !credentials.algorithm) {
-
-        // Invalid credential object
-        return null;
-    }
-
-    if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-        return null;
-    }
-
-    // Calculate signature
-
-    var artifacts = {
-        ts: timestamp,
-        nonce: options.nonce || Cryptiles.randomString(6),
-        host: host,
-        port: port,
-        hash: Crypto.calculatePayloadHash(message, credentials.algorithm)
-    };
-
-    // Construct authorization
-
-    var result = {
-        id: credentials.id,
-        ts: artifacts.ts,
-        nonce: artifacts.nonce,
-        hash: artifacts.hash,
-        mac: Crypto.calculateMac('message', credentials, artifacts)
-    };
-
-    return result;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/example/usage.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/example/usage.js
deleted file mode 100755
index f55af03cd8dc4fa52b3bab49cf8656b8ed013223..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/example/usage.js
+++ /dev/null
@@ -1,78 +0,0 @@
-// Load modules
-
-var Http = require('http');
-var Request = require('request');
-var Hawk = require('../lib');
-
-
-// Declare internals
-
-var internals = {
-    credentials: {
-        dh37fgj492je: {
-            id: 'dh37fgj492je',                                             // Required by Hawk.client.header
-            key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-            algorithm: 'sha256',
-            user: 'Steve'
-        }
-    }
-};
-
-
-// Credentials lookup function
-
-var credentialsFunc = function (id, callback) {
-
-    return callback(null, internals.credentials[id]);
-};
-
-
-// Create HTTP server
-
-var handler = function (req, res) {
-
-    Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
-
-        var payload = (!err ? 'Hello ' + credentials.user + ' ' + artifacts.ext : 'Shoosh!');
-        var headers = {
-            'Content-Type': 'text/plain',
-            'Server-Authorization': Hawk.server.header(credentials, artifacts, { payload: payload, contentType: 'text/plain' })
-        };
-
-        res.writeHead(!err ? 200 : 401, headers);
-        res.end(payload);
-    });
-};
-
-Http.createServer(handler).listen(8000, '127.0.0.1');
-
-
-// Send unauthenticated request
-
-Request('http://127.0.0.1:8000/resource/1?b=1&a=2', function (error, response, body) {
-
-    console.log(response.statusCode + ': ' + body);
-});
-
-
-// Send authenticated request
-
-credentialsFunc('dh37fgj492je', function (err, credentials) {
-
-    var header = Hawk.client.header('http://127.0.0.1:8000/resource/1?b=1&a=2', 'GET', { credentials: credentials, ext: 'and welcome!' });
-    var options = {
-        uri: 'http://127.0.0.1:8000/resource/1?b=1&a=2',
-        method: 'GET',
-        headers: {
-            authorization: header.field
-        }
-    };
-
-    Request(options, function (error, response, body) {
-
-        var isValid = Hawk.client.authenticate(response, credentials, header.artifacts, { payload: body });
-        console.log(response.statusCode + ': ' + body + (isValid ? ' (valid)' : ' (invalid)'));
-        process.exit(0);
-    });
-});
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/images/hawk.png b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/images/hawk.png
deleted file mode 100755
index a0e15cda0144a7d7ed222e74a2ea4afbab32555c..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/images/hawk.png and /dev/null differ
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/images/logo.png b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/images/logo.png
deleted file mode 100755
index b8ff5901718a8a5529d25602a4a581d2f68d67cb..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/images/logo.png and /dev/null differ
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/browser.js
deleted file mode 100755
index 3f6e85d07046cb335be04303cf990232d4d01ad0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/browser.js
+++ /dev/null
@@ -1,637 +0,0 @@
-/*
-    HTTP Hawk Authentication Scheme
-    Copyright (c) 2012-2014, Eran Hammer <eran@hammer.io>
-    BSD Licensed
-*/
-
-
-// Declare namespace
-
-var hawk = {
-    internals: {}
-};
-
-
-hawk.client = {
-
-    // Generate an Authorization header for a given request
-
-    /*
-        uri: 'http://example.com/resource?a=b' or object generated by hawk.utils.parseUri()
-        method: HTTP verb (e.g. 'GET', 'POST')
-        options: {
-
-            // Required
-
-            credentials: {
-                id: 'dh37fgj492je',
-                key: 'aoijedoaijsdlaksjdl',
-                algorithm: 'sha256'                                 // 'sha1', 'sha256'
-            },
-
-            // Optional
-
-            ext: 'application-specific',                        // Application specific data sent via the ext attribute
-            timestamp: Date.now() / 1000,                       // A pre-calculated timestamp in seconds
-            nonce: '2334f34f',                                  // A pre-generated nonce
-            localtimeOffsetMsec: 400,                           // Time offset to sync with server time (ignored if timestamp provided)
-            payload: '{"some":"payload"}',                      // UTF-8 encoded string for body hash generation (ignored if hash provided)
-            contentType: 'application/json',                    // Payload content-type (ignored if hash provided)
-            hash: 'U4MKKSmiVxk37JCCrAVIjV=',                    // Pre-calculated payload hash
-            app: '24s23423f34dx',                               // Oz application id
-            dlg: '234sz34tww3sd'                                // Oz delegated-by application id
-        }
-    */
-
-    header: function (uri, method, options) {
-
-        var result = {
-            field: '',
-            artifacts: {}
-        };
-
-        // Validate inputs
-
-        if (!uri || (typeof uri !== 'string' && typeof uri !== 'object') ||
-            !method || typeof method !== 'string' ||
-            !options || typeof options !== 'object') {
-
-            result.err = 'Invalid argument type';
-            return result;
-        }
-
-        // Application time
-
-        var timestamp = options.timestamp || hawk.utils.now(options.localtimeOffsetMsec);
-
-        // Validate credentials
-
-        var credentials = options.credentials;
-        if (!credentials ||
-            !credentials.id ||
-            !credentials.key ||
-            !credentials.algorithm) {
-
-            result.err = 'Invalid credentials object';
-            return result;
-        }
-
-        if (hawk.crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-            result.err = 'Unknown algorithm';
-            return result;
-        }
-
-        // Parse URI
-
-        if (typeof uri === 'string') {
-            uri = hawk.utils.parseUri(uri);
-        }
-
-        // Calculate signature
-
-        var artifacts = {
-            ts: timestamp,
-            nonce: options.nonce || hawk.utils.randomString(6),
-            method: method,
-            resource: uri.resource,
-            host: uri.host,
-            port: uri.port,
-            hash: options.hash,
-            ext: options.ext,
-            app: options.app,
-            dlg: options.dlg
-        };
-
-        result.artifacts = artifacts;
-
-        // Calculate payload hash
-
-        if (!artifacts.hash &&
-            (options.payload || options.payload === '')) {
-
-            artifacts.hash = hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
-        }
-
-        var mac = hawk.crypto.calculateMac('header', credentials, artifacts);
-
-        // Construct header
-
-        var hasExt = artifacts.ext !== null && artifacts.ext !== undefined && artifacts.ext !== '';       // Other falsey values allowed
-        var header = 'Hawk id="' + credentials.id +
-                     '", ts="' + artifacts.ts +
-                     '", nonce="' + artifacts.nonce +
-                     (artifacts.hash ? '", hash="' + artifacts.hash : '') +
-                     (hasExt ? '", ext="' + hawk.utils.escapeHeaderAttribute(artifacts.ext) : '') +
-                     '", mac="' + mac + '"';
-
-        if (artifacts.app) {
-            header += ', app="' + artifacts.app +
-                      (artifacts.dlg ? '", dlg="' + artifacts.dlg : '') + '"';
-        }
-
-        result.field = header;
-
-        return result;
-    },
-
-    // Generate a bewit value for a given URI
-
-    /*
-        uri: 'http://example.com/resource?a=b'
-        options: {
-
-            // Required
-
-            credentials: {
-            id: 'dh37fgj492je',
-            key: 'aoijedoaijsdlaksjdl',
-            algorithm: 'sha256'                             // 'sha1', 'sha256'
-            },
-            ttlSec: 60 * 60,                                    // TTL in seconds
-
-            // Optional
-
-            ext: 'application-specific',                        // Application specific data sent via the ext attribute
-            localtimeOffsetMsec: 400                            // Time offset to sync with server time
-         };
-    */
-
-    bewit: function (uri, options) {
-
-        // Validate inputs
-
-        if (!uri ||
-            (typeof uri !== 'string') ||
-            !options ||
-            typeof options !== 'object' ||
-            !options.ttlSec) {
-
-            return '';
-        }
-
-        options.ext = (options.ext === null || options.ext === undefined ? '' : options.ext);       // Zero is valid value
-
-        // Application time
-
-        var now = hawk.utils.now(options.localtimeOffsetMsec);
-
-        // Validate credentials
-
-        var credentials = options.credentials;
-        if (!credentials ||
-            !credentials.id ||
-            !credentials.key ||
-            !credentials.algorithm) {
-
-            return '';
-        }
-
-        if (hawk.crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-            return '';
-        }
-
-        // Parse URI
-
-        uri = hawk.utils.parseUri(uri);
-
-        // Calculate signature
-
-        var exp = now + options.ttlSec;
-        var mac = hawk.crypto.calculateMac('bewit', credentials, {
-            ts: exp,
-            nonce: '',
-            method: 'GET',
-            resource: uri.resource,                            // Maintain trailing '?' and query params
-            host: uri.host,
-            port: uri.port,
-            ext: options.ext
-        });
-
-        // Construct bewit: id\exp\mac\ext
-
-        var bewit = credentials.id + '\\' + exp + '\\' + mac + '\\' + options.ext;
-        return hawk.utils.base64urlEncode(bewit);
-    },
-
-    // Validate server response
-
-    /*
-        request:    object created via 'new XMLHttpRequest()' after response received
-        artifacts:  object received from header().artifacts
-        options: {
-            payload:    optional payload received
-            required:   specifies if a Server-Authorization header is required. Defaults to 'false'
-        }
-    */
-
-    authenticate: function (request, credentials, artifacts, options) {
-
-        options = options || {};
-
-        var getHeader = function (name) {
-
-            return request.getResponseHeader ? request.getResponseHeader(name) : request.getHeader(name);
-        };
-
-        var wwwAuthenticate = getHeader('www-authenticate');
-        if (wwwAuthenticate) {
-
-            // Parse HTTP WWW-Authenticate header
-
-            var wwwAttributes = hawk.utils.parseAuthorizationHeader(wwwAuthenticate, ['ts', 'tsm', 'error']);
-            if (!wwwAttributes) {
-                return false;
-            }
-
-            if (wwwAttributes.ts) {
-                var tsm = hawk.crypto.calculateTsMac(wwwAttributes.ts, credentials);
-                if (tsm !== wwwAttributes.tsm) {
-                    return false;
-                }
-
-                hawk.utils.setNtpOffset(wwwAttributes.ts - Math.floor((new Date()).getTime() / 1000));     // Keep offset at 1 second precision
-            }
-        }
-
-        // Parse HTTP Server-Authorization header
-
-        var serverAuthorization = getHeader('server-authorization');
-        if (!serverAuthorization &&
-            !options.required) {
-
-            return true;
-        }
-
-        var attributes = hawk.utils.parseAuthorizationHeader(serverAuthorization, ['mac', 'ext', 'hash']);
-        if (!attributes) {
-            return false;
-        }
-
-        var modArtifacts = {
-            ts: artifacts.ts,
-            nonce: artifacts.nonce,
-            method: artifacts.method,
-            resource: artifacts.resource,
-            host: artifacts.host,
-            port: artifacts.port,
-            hash: attributes.hash,
-            ext: attributes.ext,
-            app: artifacts.app,
-            dlg: artifacts.dlg
-        };
-
-        var mac = hawk.crypto.calculateMac('response', credentials, modArtifacts);
-        if (mac !== attributes.mac) {
-            return false;
-        }
-
-        if (!options.payload &&
-            options.payload !== '') {
-
-            return true;
-        }
-
-        if (!attributes.hash) {
-            return false;
-        }
-
-        var calculatedHash = hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, getHeader('content-type'));
-        return (calculatedHash === attributes.hash);
-    },
-
-    message: function (host, port, message, options) {
-
-        // Validate inputs
-
-        if (!host || typeof host !== 'string' ||
-            !port || typeof port !== 'number' ||
-            message === null || message === undefined || typeof message !== 'string' ||
-            !options || typeof options !== 'object') {
-
-            return null;
-        }
-
-        // Application time
-
-        var timestamp = options.timestamp || hawk.utils.now(options.localtimeOffsetMsec);
-
-        // Validate credentials
-
-        var credentials = options.credentials;
-        if (!credentials ||
-            !credentials.id ||
-            !credentials.key ||
-            !credentials.algorithm) {
-
-            // Invalid credential object
-            return null;
-        }
-
-        if (hawk.crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-            return null;
-        }
-
-        // Calculate signature
-
-        var artifacts = {
-            ts: timestamp,
-            nonce: options.nonce || hawk.utils.randomString(6),
-            host: host,
-            port: port,
-            hash: hawk.crypto.calculatePayloadHash(message, credentials.algorithm)
-        };
-
-        // Construct authorization
-
-        var result = {
-            id: credentials.id,
-            ts: artifacts.ts,
-            nonce: artifacts.nonce,
-            hash: artifacts.hash,
-            mac: hawk.crypto.calculateMac('message', credentials, artifacts)
-        };
-
-        return result;
-    },
-
-    authenticateTimestamp: function (message, credentials, updateClock) {           // updateClock defaults to true
-
-        var tsm = hawk.crypto.calculateTsMac(message.ts, credentials);
-        if (tsm !== message.tsm) {
-            return false;
-        }
-
-        if (updateClock !== false) {
-            hawk.utils.setNtpOffset(message.ts - Math.floor((new Date()).getTime() / 1000));    // Keep offset at 1 second precision
-        }
-
-        return true;
-    }
-};
-
-
-hawk.crypto = {
-
-    headerVersion: '1',
-
-    algorithms: ['sha1', 'sha256'],
-
-    calculateMac: function (type, credentials, options) {
-
-        var normalized = hawk.crypto.generateNormalizedString(type, options);
-
-        var hmac = CryptoJS['Hmac' + credentials.algorithm.toUpperCase()](normalized, credentials.key);
-        return hmac.toString(CryptoJS.enc.Base64);
-    },
-
-    generateNormalizedString: function (type, options) {
-
-        var normalized = 'hawk.' + hawk.crypto.headerVersion + '.' + type + '\n' +
-                         options.ts + '\n' +
-                         options.nonce + '\n' +
-                         (options.method || '').toUpperCase() + '\n' +
-                         (options.resource || '') + '\n' +
-                         options.host.toLowerCase() + '\n' +
-                         options.port + '\n' +
-                         (options.hash || '') + '\n';
-
-        if (options.ext) {
-            normalized += options.ext.replace('\\', '\\\\').replace('\n', '\\n');
-        }
-
-        normalized += '\n';
-
-        if (options.app) {
-            normalized += options.app + '\n' +
-                          (options.dlg || '') + '\n';
-        }
-
-        return normalized;
-    },
-
-    calculatePayloadHash: function (payload, algorithm, contentType) {
-
-        var hash = CryptoJS.algo[algorithm.toUpperCase()].create();
-        hash.update('hawk.' + hawk.crypto.headerVersion + '.payload\n');
-        hash.update(hawk.utils.parseContentType(contentType) + '\n');
-        hash.update(payload);
-        hash.update('\n');
-        return hash.finalize().toString(CryptoJS.enc.Base64);
-    },
-
-    calculateTsMac: function (ts, credentials) {
-
-        var hash = CryptoJS['Hmac' + credentials.algorithm.toUpperCase()]('hawk.' + hawk.crypto.headerVersion + '.ts\n' + ts + '\n', credentials.key);
-        return hash.toString(CryptoJS.enc.Base64);
-    }
-};
-
-
-// localStorage compatible interface
-
-hawk.internals.LocalStorage = function () {
-
-    this._cache = {};
-    this.length = 0;
-
-    this.getItem = function (key) {
-
-        return this._cache.hasOwnProperty(key) ? String(this._cache[key]) : null;
-    };
-
-    this.setItem = function (key, value) {
-
-        this._cache[key] = String(value);
-        this.length = Object.keys(this._cache).length;
-    };
-
-    this.removeItem = function (key) {
-
-        delete this._cache[key];
-        this.length = Object.keys(this._cache).length;
-    };
-
-    this.clear = function () {
-
-        this._cache = {};
-        this.length = 0;
-    };
-
-    this.key = function (i) {
-
-        return Object.keys(this._cache)[i || 0];
-    };
-};
-
-
-hawk.utils = {
-
-    storage: new hawk.internals.LocalStorage(),
-
-    setStorage: function (storage) {
-
-        var ntpOffset = hawk.utils.storage.getItem('hawk_ntp_offset');
-        hawk.utils.storage = storage;
-        if (ntpOffset) {
-            hawk.utils.setNtpOffset(ntpOffset);
-        }
-    },
-
-    setNtpOffset: function (offset) {
-
-        try {
-            hawk.utils.storage.setItem('hawk_ntp_offset', offset);
-        }
-        catch (err) {
-            console.error('[hawk] could not write to storage.');
-            console.error(err);
-        }
-    },
-
-    getNtpOffset: function () {
-
-        var offset = hawk.utils.storage.getItem('hawk_ntp_offset');
-        if (!offset) {
-            return 0;
-        }
-
-        return parseInt(offset, 10);
-    },
-
-    now: function (localtimeOffsetMsec) {
-
-        return Math.floor(((new Date()).getTime() + (localtimeOffsetMsec || 0)) / 1000) + hawk.utils.getNtpOffset();
-    },
-
-    escapeHeaderAttribute: function (attribute) {
-
-        return attribute.replace(/\\/g, '\\\\').replace(/\"/g, '\\"');
-    },
-
-    parseContentType: function (header) {
-
-        if (!header) {
-            return '';
-        }
-
-        return header.split(';')[0].replace(/^\s+|\s+$/g, '').toLowerCase();
-    },
-
-    parseAuthorizationHeader: function (header, keys) {
-
-        if (!header) {
-            return null;
-        }
-
-        var headerParts = header.match(/^(\w+)(?:\s+(.*))?$/);       // Header: scheme[ something]
-        if (!headerParts) {
-            return null;
-        }
-
-        var scheme = headerParts[1];
-        if (scheme.toLowerCase() !== 'hawk') {
-            return null;
-        }
-
-        var attributesString = headerParts[2];
-        if (!attributesString) {
-            return null;
-        }
-
-        var attributes = {};
-        var verify = attributesString.replace(/(\w+)="([^"\\]*)"\s*(?:,\s*|$)/g, function ($0, $1, $2) {
-
-            // Check valid attribute names
-
-            if (keys.indexOf($1) === -1) {
-                return;
-            }
-
-            // Allowed attribute value characters: !#$%&'()*+,-./:;<=>?@[]^_`{|}~ and space, a-z, A-Z, 0-9
-
-            if ($2.match(/^[ \w\!#\$%&'\(\)\*\+,\-\.\/\:;<\=>\?@\[\]\^`\{\|\}~]+$/) === null) {
-                return;
-            }
-
-            // Check for duplicates
-
-            if (attributes.hasOwnProperty($1)) {
-                return;
-            }
-
-            attributes[$1] = $2;
-            return '';
-        });
-
-        if (verify !== '') {
-            return null;
-        }
-
-        return attributes;
-    },
-
-    randomString: function (size) {
-
-        var randomSource = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
-        var len = randomSource.length;
-
-        var result = [];
-        for (var i = 0; i < size; ++i) {
-            result[i] = randomSource[Math.floor(Math.random() * len)];
-        }
-
-        return result.join('');
-    },
-
-    uriRegex: /^([^:]+)\:\/\/(?:[^@]*@)?([^\/:]+)(?:\:(\d+))?([^#]*)(?:#.*)?$/,       // scheme://credentials@host:port/resource#fragment
-    parseUri: function (input) {
-
-        var parts = input.match(hawk.utils.uriRegex);
-        if (!parts) {
-            return { host: '', port: '', resource: '' };
-        }
-
-        var scheme = parts[1].toLowerCase();
-        var uri = {
-            host: parts[2],
-            port: parts[3] || (scheme === 'http' ? '80' : (scheme === 'https' ? '443' : '')),
-            resource: parts[4]
-        };
-
-        return uri;
-    },
-
-    base64urlEncode: function (value) {
-
-        var wordArray = CryptoJS.enc.Utf8.parse(value);
-        var encoded = CryptoJS.enc.Base64.stringify(wordArray);
-        return encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');
-    }
-};
-
-
-// $lab:coverage:off$
-/* eslint-disable */
-
-// Based on: Crypto-JS v3.1.2
-// Copyright (c) 2009-2013, Jeff Mott. All rights reserved.
-// http://code.google.com/p/crypto-js/
-// http://code.google.com/p/crypto-js/wiki/License
-
-var CryptoJS = CryptoJS || function (h, r) { var k = {}, l = k.lib = {}, n = function () { }, f = l.Base = { extend: function (a) { n.prototype = this; var b = new n; a && b.mixIn(a); b.hasOwnProperty("init") || (b.init = function () { b.$super.init.apply(this, arguments) }); b.init.prototype = b; b.$super = this; return b }, create: function () { var a = this.extend(); a.init.apply(a, arguments); return a }, init: function () { }, mixIn: function (a) { for (var b in a) a.hasOwnProperty(b) && (this[b] = a[b]); a.hasOwnProperty("toString") && (this.toString = a.toString) }, clone: function () { return this.init.prototype.extend(this) } }, j = l.WordArray = f.extend({ init: function (a, b) { a = this.words = a || []; this.sigBytes = b != r ? b : 4 * a.length }, toString: function (a) { return (a || s).stringify(this) }, concat: function (a) { var b = this.words, d = a.words, c = this.sigBytes; a = a.sigBytes; this.clamp(); if (c % 4) for (var e = 0; e < a; e++) b[c + e >>> 2] |= (d[e >>> 2] >>> 24 - 8 * (e % 4) & 255) << 24 - 8 * ((c + e) % 4); else if (65535 < d.length) for (e = 0; e < a; e += 4) b[c + e >>> 2] = d[e >>> 2]; else b.push.apply(b, d); this.sigBytes += a; return this }, clamp: function () { var a = this.words, b = this.sigBytes; a[b >>> 2] &= 4294967295 << 32 - 8 * (b % 4); a.length = h.ceil(b / 4) }, clone: function () { var a = f.clone.call(this); a.words = this.words.slice(0); return a }, random: function (a) { for (var b = [], d = 0; d < a; d += 4) b.push(4294967296 * h.random() | 0); return new j.init(b, a) } }), m = k.enc = {}, s = m.Hex = { stringify: function (a) { var b = a.words; a = a.sigBytes; for (var d = [], c = 0; c < a; c++) { var e = b[c >>> 2] >>> 24 - 8 * (c % 4) & 255; d.push((e >>> 4).toString(16)); d.push((e & 15).toString(16)) } return d.join("") }, parse: function (a) { for (var b = a.length, d = [], c = 0; c < b; c += 2) d[c >>> 3] |= parseInt(a.substr(c, 2), 16) << 24 - 4 * (c % 8); return new j.init(d, b / 2) } }, p = m.Latin1 = { stringify: function (a) { var b = a.words; a = a.sigBytes; for (var d = [], c = 0; c < a; c++) d.push(String.fromCharCode(b[c >>> 2] >>> 24 - 8 * (c % 4) & 255)); return d.join("") }, parse: function (a) { for (var b = a.length, d = [], c = 0; c < b; c++) d[c >>> 2] |= (a.charCodeAt(c) & 255) << 24 - 8 * (c % 4); return new j.init(d, b) } }, t = m.Utf8 = { stringify: function (a) { try { return decodeURIComponent(escape(p.stringify(a))) } catch (b) { throw Error("Malformed UTF-8 data"); } }, parse: function (a) { return p.parse(unescape(encodeURIComponent(a))) } }, q = l.BufferedBlockAlgorithm = f.extend({ reset: function () { this._data = new j.init; this._nDataBytes = 0 }, _append: function (a) { "string" == typeof a && (a = t.parse(a)); this._data.concat(a); this._nDataBytes += a.sigBytes }, _process: function (a) { var b = this._data, d = b.words, c = b.sigBytes, e = this.blockSize, f = c / (4 * e), f = a ? h.ceil(f) : h.max((f | 0) - this._minBufferSize, 0); a = f * e; c = h.min(4 * a, c); if (a) { for (var g = 0; g < a; g += e) this._doProcessBlock(d, g); g = d.splice(0, a); b.sigBytes -= c } return new j.init(g, c) }, clone: function () { var a = f.clone.call(this); a._data = this._data.clone(); return a }, _minBufferSize: 0 }); l.Hasher = q.extend({ cfg: f.extend(), init: function (a) { this.cfg = this.cfg.extend(a); this.reset() }, reset: function () { q.reset.call(this); this._doReset() }, update: function (a) { this._append(a); this._process(); return this }, finalize: function (a) { a && this._append(a); return this._doFinalize() }, blockSize: 16, _createHelper: function (a) { return function (b, d) { return (new a.init(d)).finalize(b) } }, _createHmacHelper: function (a) { return function (b, d) { return (new u.HMAC.init(a, d)).finalize(b) } } }); var u = k.algo = {}; return k }(Math);
-(function () { var k = CryptoJS, b = k.lib, m = b.WordArray, l = b.Hasher, d = [], b = k.algo.SHA1 = l.extend({ _doReset: function () { this._hash = new m.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520]) }, _doProcessBlock: function (n, p) { for (var a = this._hash.words, e = a[0], f = a[1], h = a[2], j = a[3], b = a[4], c = 0; 80 > c; c++) { if (16 > c) d[c] = n[p + c] | 0; else { var g = d[c - 3] ^ d[c - 8] ^ d[c - 14] ^ d[c - 16]; d[c] = g << 1 | g >>> 31 } g = (e << 5 | e >>> 27) + b + d[c]; g = 20 > c ? g + ((f & h | ~f & j) + 1518500249) : 40 > c ? g + ((f ^ h ^ j) + 1859775393) : 60 > c ? g + ((f & h | f & j | h & j) - 1894007588) : g + ((f ^ h ^ j) - 899497514); b = j; j = h; h = f << 30 | f >>> 2; f = e; e = g } a[0] = a[0] + e | 0; a[1] = a[1] + f | 0; a[2] = a[2] + h | 0; a[3] = a[3] + j | 0; a[4] = a[4] + b | 0 }, _doFinalize: function () { var b = this._data, d = b.words, a = 8 * this._nDataBytes, e = 8 * b.sigBytes; d[e >>> 5] |= 128 << 24 - e % 32; d[(e + 64 >>> 9 << 4) + 14] = Math.floor(a / 4294967296); d[(e + 64 >>> 9 << 4) + 15] = a; b.sigBytes = 4 * d.length; this._process(); return this._hash }, clone: function () { var b = l.clone.call(this); b._hash = this._hash.clone(); return b } }); k.SHA1 = l._createHelper(b); k.HmacSHA1 = l._createHmacHelper(b) })();
-(function (k) { for (var g = CryptoJS, h = g.lib, v = h.WordArray, j = h.Hasher, h = g.algo, s = [], t = [], u = function (q) { return 4294967296 * (q - (q | 0)) | 0 }, l = 2, b = 0; 64 > b;) { var d; a: { d = l; for (var w = k.sqrt(d), r = 2; r <= w; r++) if (!(d % r)) { d = !1; break a } d = !0 } d && (8 > b && (s[b] = u(k.pow(l, 0.5))), t[b] = u(k.pow(l, 1 / 3)), b++); l++ } var n = [], h = h.SHA256 = j.extend({ _doReset: function () { this._hash = new v.init(s.slice(0)) }, _doProcessBlock: function (q, h) { for (var a = this._hash.words, c = a[0], d = a[1], b = a[2], k = a[3], f = a[4], g = a[5], j = a[6], l = a[7], e = 0; 64 > e; e++) { if (16 > e) n[e] = q[h + e] | 0; else { var m = n[e - 15], p = n[e - 2]; n[e] = ((m << 25 | m >>> 7) ^ (m << 14 | m >>> 18) ^ m >>> 3) + n[e - 7] + ((p << 15 | p >>> 17) ^ (p << 13 | p >>> 19) ^ p >>> 10) + n[e - 16] } m = l + ((f << 26 | f >>> 6) ^ (f << 21 | f >>> 11) ^ (f << 7 | f >>> 25)) + (f & g ^ ~f & j) + t[e] + n[e]; p = ((c << 30 | c >>> 2) ^ (c << 19 | c >>> 13) ^ (c << 10 | c >>> 22)) + (c & d ^ c & b ^ d & b); l = j; j = g; g = f; f = k + m | 0; k = b; b = d; d = c; c = m + p | 0 } a[0] = a[0] + c | 0; a[1] = a[1] + d | 0; a[2] = a[2] + b | 0; a[3] = a[3] + k | 0; a[4] = a[4] + f | 0; a[5] = a[5] + g | 0; a[6] = a[6] + j | 0; a[7] = a[7] + l | 0 }, _doFinalize: function () { var d = this._data, b = d.words, a = 8 * this._nDataBytes, c = 8 * d.sigBytes; b[c >>> 5] |= 128 << 24 - c % 32; b[(c + 64 >>> 9 << 4) + 14] = k.floor(a / 4294967296); b[(c + 64 >>> 9 << 4) + 15] = a; d.sigBytes = 4 * b.length; this._process(); return this._hash }, clone: function () { var b = j.clone.call(this); b._hash = this._hash.clone(); return b } }); g.SHA256 = j._createHelper(h); g.HmacSHA256 = j._createHmacHelper(h) })(Math);
-(function () { var c = CryptoJS, k = c.enc.Utf8; c.algo.HMAC = c.lib.Base.extend({ init: function (a, b) { a = this._hasher = new a.init; "string" == typeof b && (b = k.parse(b)); var c = a.blockSize, e = 4 * c; b.sigBytes > e && (b = a.finalize(b)); b.clamp(); for (var f = this._oKey = b.clone(), g = this._iKey = b.clone(), h = f.words, j = g.words, d = 0; d < c; d++) h[d] ^= 1549556828, j[d] ^= 909522486; f.sigBytes = g.sigBytes = e; this.reset() }, reset: function () { var a = this._hasher; a.reset(); a.update(this._iKey) }, update: function (a) { this._hasher.update(a); return this }, finalize: function (a) { var b = this._hasher; a = b.finalize(a); b.reset(); return b.finalize(this._oKey.clone().concat(a)) } }) })();
-(function () { var h = CryptoJS, j = h.lib.WordArray; h.enc.Base64 = { stringify: function (b) { var e = b.words, f = b.sigBytes, c = this._map; b.clamp(); b = []; for (var a = 0; a < f; a += 3) for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) b.push(c.charAt(d >>> 6 * (3 - g) & 63)); if (e = c.charAt(64)) for (; b.length % 4;) b.push(e); return b.join("") }, parse: function (b) { var e = b.length, f = this._map, c = f.charAt(64); c && (c = b.indexOf(c), -1 != c && (e = c)); for (var c = [], a = 0, d = 0; d < e; d++) if (d % 4) { var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4), h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4); c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4); a++ } return j.create(c, a) }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=" } })();
-
-hawk.crypto.internals = CryptoJS;
-
-
-// Export if used as a module
-
-if (typeof module !== 'undefined' && module.exports) {
-    module.exports = hawk;
-}
-
-/* eslint-enable */
-// $lab:coverage:on$
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/client.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/client.js
deleted file mode 100755
index 601f51ca1183aaa5fd95849ad717a6f01f88db81..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/client.js
+++ /dev/null
@@ -1,369 +0,0 @@
-// Load modules
-
-var Url = require('url');
-var Hoek = require('hoek');
-var Cryptiles = require('cryptiles');
-var Crypto = require('./crypto');
-var Utils = require('./utils');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Generate an Authorization header for a given request
-
-/*
-    uri: 'http://example.com/resource?a=b' or object from Url.parse()
-    method: HTTP verb (e.g. 'GET', 'POST')
-    options: {
-
-        // Required
-
-        credentials: {
-            id: 'dh37fgj492je',
-            key: 'aoijedoaijsdlaksjdl',
-            algorithm: 'sha256'                                 // 'sha1', 'sha256'
-        },
-
-        // Optional
-
-        ext: 'application-specific',                        // Application specific data sent via the ext attribute
-        timestamp: Date.now(),                              // A pre-calculated timestamp
-        nonce: '2334f34f',                                  // A pre-generated nonce
-        localtimeOffsetMsec: 400,                           // Time offset to sync with server time (ignored if timestamp provided)
-        payload: '{"some":"payload"}',                      // UTF-8 encoded string for body hash generation (ignored if hash provided)
-        contentType: 'application/json',                    // Payload content-type (ignored if hash provided)
-        hash: 'U4MKKSmiVxk37JCCrAVIjV=',                    // Pre-calculated payload hash
-        app: '24s23423f34dx',                               // Oz application id
-        dlg: '234sz34tww3sd'                                // Oz delegated-by application id
-    }
-*/
-
-exports.header = function (uri, method, options) {
-
-    var result = {
-        field: '',
-        artifacts: {}
-    };
-
-    // Validate inputs
-
-    if (!uri || (typeof uri !== 'string' && typeof uri !== 'object') ||
-        !method || typeof method !== 'string' ||
-        !options || typeof options !== 'object') {
-
-        result.err = 'Invalid argument type';
-        return result;
-    }
-
-    // Application time
-
-    var timestamp = options.timestamp || Utils.nowSecs(options.localtimeOffsetMsec);
-
-    // Validate credentials
-
-    var credentials = options.credentials;
-    if (!credentials ||
-        !credentials.id ||
-        !credentials.key ||
-        !credentials.algorithm) {
-
-        result.err = 'Invalid credential object';
-        return result;
-    }
-
-    if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-        result.err = 'Unknown algorithm';
-        return result;
-    }
-
-    // Parse URI
-
-    if (typeof uri === 'string') {
-        uri = Url.parse(uri);
-    }
-
-    // Calculate signature
-
-    var artifacts = {
-        ts: timestamp,
-        nonce: options.nonce || Cryptiles.randomString(6),
-        method: method,
-        resource: uri.pathname + (uri.search || ''),                            // Maintain trailing '?'
-        host: uri.hostname,
-        port: uri.port || (uri.protocol === 'http:' ? 80 : 443),
-        hash: options.hash,
-        ext: options.ext,
-        app: options.app,
-        dlg: options.dlg
-    };
-
-    result.artifacts = artifacts;
-
-    // Calculate payload hash
-
-    if (!artifacts.hash &&
-        (options.payload || options.payload === '')) {
-
-        artifacts.hash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
-    }
-
-    var mac = Crypto.calculateMac('header', credentials, artifacts);
-
-    // Construct header
-
-    var hasExt = artifacts.ext !== null && artifacts.ext !== undefined && artifacts.ext !== '';       // Other falsey values allowed
-    var header = 'Hawk id="' + credentials.id +
-                 '", ts="' + artifacts.ts +
-                 '", nonce="' + artifacts.nonce +
-                 (artifacts.hash ? '", hash="' + artifacts.hash : '') +
-                 (hasExt ? '", ext="' + Hoek.escapeHeaderAttribute(artifacts.ext) : '') +
-                 '", mac="' + mac + '"';
-
-    if (artifacts.app) {
-        header += ', app="' + artifacts.app +
-                  (artifacts.dlg ? '", dlg="' + artifacts.dlg : '') + '"';
-    }
-
-    result.field = header;
-
-    return result;
-};
-
-
-// Validate server response
-
-/*
-    res:        node's response object
-    artifacts:  object received from header().artifacts
-    options: {
-        payload:    optional payload received
-        required:   specifies if a Server-Authorization header is required. Defaults to 'false'
-    }
-*/
-
-exports.authenticate = function (res, credentials, artifacts, options) {
-
-    artifacts = Hoek.clone(artifacts);
-    options = options || {};
-
-    if (res.headers['www-authenticate']) {
-
-        // Parse HTTP WWW-Authenticate header
-
-        var wwwAttributes = Utils.parseAuthorizationHeader(res.headers['www-authenticate'], ['ts', 'tsm', 'error']);
-        if (wwwAttributes instanceof Error) {
-            return false;
-        }
-
-        // Validate server timestamp (not used to update clock since it is done via the SNPT client)
-
-        if (wwwAttributes.ts) {
-            var tsm = Crypto.calculateTsMac(wwwAttributes.ts, credentials);
-            if (tsm !== wwwAttributes.tsm) {
-                return false;
-            }
-        }
-    }
-
-    // Parse HTTP Server-Authorization header
-
-    if (!res.headers['server-authorization'] &&
-        !options.required) {
-
-        return true;
-    }
-
-    var attributes = Utils.parseAuthorizationHeader(res.headers['server-authorization'], ['mac', 'ext', 'hash']);
-    if (attributes instanceof Error) {
-        return false;
-    }
-
-    artifacts.ext = attributes.ext;
-    artifacts.hash = attributes.hash;
-
-    var mac = Crypto.calculateMac('response', credentials, artifacts);
-    if (mac !== attributes.mac) {
-        return false;
-    }
-
-    if (!options.payload &&
-        options.payload !== '') {
-
-        return true;
-    }
-
-    if (!attributes.hash) {
-        return false;
-    }
-
-    var calculatedHash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, res.headers['content-type']);
-    return (calculatedHash === attributes.hash);
-};
-
-
-// Generate a bewit value for a given URI
-
-/*
-    uri: 'http://example.com/resource?a=b' or object from Url.parse()
-    options: {
-
-        // Required
-
-        credentials: {
-            id: 'dh37fgj492je',
-            key: 'aoijedoaijsdlaksjdl',
-            algorithm: 'sha256'                             // 'sha1', 'sha256'
-        },
-        ttlSec: 60 * 60,                                    // TTL in seconds
-
-        // Optional
-
-        ext: 'application-specific',                        // Application specific data sent via the ext attribute
-        localtimeOffsetMsec: 400                            // Time offset to sync with server time
-    };
-*/
-
-exports.getBewit = function (uri, options) {
-
-    // Validate inputs
-
-    if (!uri ||
-        (typeof uri !== 'string' && typeof uri !== 'object') ||
-        !options ||
-        typeof options !== 'object' ||
-        !options.ttlSec) {
-
-        return '';
-    }
-
-    options.ext = (options.ext === null || options.ext === undefined ? '' : options.ext);       // Zero is valid value
-
-    // Application time
-
-    var now = Utils.now(options.localtimeOffsetMsec);
-
-    // Validate credentials
-
-    var credentials = options.credentials;
-    if (!credentials ||
-        !credentials.id ||
-        !credentials.key ||
-        !credentials.algorithm) {
-
-        return '';
-    }
-
-    if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-        return '';
-    }
-
-    // Parse URI
-
-    if (typeof uri === 'string') {
-        uri = Url.parse(uri);
-    }
-
-    // Calculate signature
-
-    var exp = Math.floor(now / 1000) + options.ttlSec;
-    var mac = Crypto.calculateMac('bewit', credentials, {
-        ts: exp,
-        nonce: '',
-        method: 'GET',
-        resource: uri.pathname + (uri.search || ''),                            // Maintain trailing '?'
-        host: uri.hostname,
-        port: uri.port || (uri.protocol === 'http:' ? 80 : 443),
-        ext: options.ext
-    });
-
-    // Construct bewit: id\exp\mac\ext
-
-    var bewit = credentials.id + '\\' + exp + '\\' + mac + '\\' + options.ext;
-    return Hoek.base64urlEncode(bewit);
-};
-
-
-// Generate an authorization string for a message
-
-/*
-    host: 'example.com',
-    port: 8000,
-    message: '{"some":"payload"}',                          // UTF-8 encoded string for body hash generation
-    options: {
-
-        // Required
-
-        credentials: {
-            id: 'dh37fgj492je',
-            key: 'aoijedoaijsdlaksjdl',
-            algorithm: 'sha256'                             // 'sha1', 'sha256'
-        },
-
-        // Optional
-
-        timestamp: Date.now(),                              // A pre-calculated timestamp
-        nonce: '2334f34f',                                  // A pre-generated nonce
-        localtimeOffsetMsec: 400,                           // Time offset to sync with server time (ignored if timestamp provided)
-    }
-*/
-
-exports.message = function (host, port, message, options) {
-
-    // Validate inputs
-
-    if (!host || typeof host !== 'string' ||
-        !port || typeof port !== 'number' ||
-        message === null || message === undefined || typeof message !== 'string' ||
-        !options || typeof options !== 'object') {
-
-        return null;
-    }
-
-    // Application time
-
-    var timestamp = options.timestamp || Utils.nowSecs(options.localtimeOffsetMsec);
-
-    // Validate credentials
-
-    var credentials = options.credentials;
-    if (!credentials ||
-        !credentials.id ||
-        !credentials.key ||
-        !credentials.algorithm) {
-
-        // Invalid credential object
-        return null;
-    }
-
-    if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-        return null;
-    }
-
-    // Calculate signature
-
-    var artifacts = {
-        ts: timestamp,
-        nonce: options.nonce || Cryptiles.randomString(6),
-        host: host,
-        port: port,
-        hash: Crypto.calculatePayloadHash(message, credentials.algorithm)
-    };
-
-    // Construct authorization
-
-    var result = {
-        id: credentials.id,
-        ts: artifacts.ts,
-        nonce: artifacts.nonce,
-        hash: artifacts.hash,
-        mac: Crypto.calculateMac('message', credentials, artifacts)
-    };
-
-    return result;
-};
-
-
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/crypto.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/crypto.js
deleted file mode 100755
index 565ae496cb412aa19c749d3924012b55c003c303..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/crypto.js
+++ /dev/null
@@ -1,126 +0,0 @@
-// Load modules
-
-var Crypto = require('crypto');
-var Url = require('url');
-var Utils = require('./utils');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// MAC normalization format version
-
-exports.headerVersion = '1';                        // Prevent comparison of mac values generated with different normalized string formats
-
-
-// Supported HMAC algorithms
-
-exports.algorithms = ['sha1', 'sha256'];
-
-
-// Calculate the request MAC
-
-/*
-    type: 'header',                                 // 'header', 'bewit', 'response'
-    credentials: {
-        key: 'aoijedoaijsdlaksjdl',
-        algorithm: 'sha256'                         // 'sha1', 'sha256'
-    },
-    options: {
-        method: 'GET',
-        resource: '/resource?a=1&b=2',
-        host: 'example.com',
-        port: 8080,
-        ts: 1357718381034,
-        nonce: 'd3d345f',
-        hash: 'U4MKKSmiVxk37JCCrAVIjV/OhB3y+NdwoCr6RShbVkE=',
-        ext: 'app-specific-data',
-        app: 'hf48hd83qwkj',                        // Application id (Oz)
-        dlg: 'd8djwekds9cj'                         // Delegated by application id (Oz), requires options.app
-    }
-*/
-
-exports.calculateMac = function (type, credentials, options) {
-
-    var normalized = exports.generateNormalizedString(type, options);
-
-    var hmac = Crypto.createHmac(credentials.algorithm, credentials.key).update(normalized);
-    var digest = hmac.digest('base64');
-    return digest;
-};
-
-
-exports.generateNormalizedString = function (type, options) {
-
-    var resource = options.resource || '';
-    if (resource &&
-        resource[0] !== '/') {
-
-        var url = Url.parse(resource, false);
-        resource = url.path;                        // Includes query
-    }
-
-    var normalized = 'hawk.' + exports.headerVersion + '.' + type + '\n' +
-                     options.ts + '\n' +
-                     options.nonce + '\n' +
-                     (options.method || '').toUpperCase() + '\n' +
-                     resource + '\n' +
-                     options.host.toLowerCase() + '\n' +
-                     options.port + '\n' +
-                     (options.hash || '') + '\n';
-
-    if (options.ext) {
-        normalized += options.ext.replace('\\', '\\\\').replace('\n', '\\n');
-    }
-
-    normalized += '\n';
-
-    if (options.app) {
-        normalized += options.app + '\n' +
-                      (options.dlg || '') + '\n';
-    }
-
-    return normalized;
-};
-
-
-exports.calculatePayloadHash = function (payload, algorithm, contentType) {
-
-    var hash = exports.initializePayloadHash(algorithm, contentType);
-    hash.update(payload || '');
-    return exports.finalizePayloadHash(hash);
-};
-
-
-exports.initializePayloadHash = function (algorithm, contentType) {
-
-    var hash = Crypto.createHash(algorithm);
-    hash.update('hawk.' + exports.headerVersion + '.payload\n');
-    hash.update(Utils.parseContentType(contentType) + '\n');
-    return hash;
-};
-
-
-exports.finalizePayloadHash = function (hash) {
-
-    hash.update('\n');
-    return hash.digest('base64');
-};
-
-
-exports.calculateTsMac = function (ts, credentials) {
-
-    var hmac = Crypto.createHmac(credentials.algorithm, credentials.key);
-    hmac.update('hawk.' + exports.headerVersion + '.ts\n' + ts + '\n');
-    return hmac.digest('base64');
-};
-
-
-exports.timestampMessage = function (credentials, localtimeOffsetMsec) {
-
-    var now = Utils.nowSecs(localtimeOffsetMsec);
-    var tsm = exports.calculateTsMac(now, credentials);
-    return { ts: now, tsm: tsm };
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/index.js
deleted file mode 100755
index 58b5bc38e193e5e9fa375548aa466e824d704fde..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/index.js
+++ /dev/null
@@ -1,15 +0,0 @@
-// Export sub-modules
-
-exports.error = exports.Error = require('boom');
-exports.sntp = require('sntp');
-
-exports.server = require('./server');
-exports.client = require('./client');
-exports.crypto = require('./crypto');
-exports.utils = require('./utils');
-
-exports.uri = {
-    authenticate: exports.server.authenticateBewit,
-    getBewit: exports.client.getBewit
-};
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/server.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/server.js
deleted file mode 100755
index 67e1a069bbf68540b8b06fd0fe2b5dc48bea69ad..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/server.js
+++ /dev/null
@@ -1,548 +0,0 @@
-// Load modules
-
-var Boom = require('boom');
-var Hoek = require('hoek');
-var Cryptiles = require('cryptiles');
-var Crypto = require('./crypto');
-var Utils = require('./utils');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Hawk authentication
-
-/*
-   req:                 node's HTTP request object or an object as follows:
-
-                        var request = {
-                            method: 'GET',
-                            url: '/resource/4?a=1&b=2',
-                            host: 'example.com',
-                            port: 8080,
-                            authorization: 'Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", ext="some-app-ext-data", mac="6R4rV5iE+NPoym+WwjeHzjAGXUtLNIxmo1vpMofpLAE="'
-                        };
-
-   credentialsFunc:     required function to lookup the set of Hawk credentials based on the provided credentials id.
-                        The credentials include the MAC key, MAC algorithm, and other attributes (such as username)
-                        needed by the application. This function is the equivalent of verifying the username and
-                        password in Basic authentication.
-
-                        var credentialsFunc = function (id, callback) {
-
-                            // Lookup credentials in database
-                            db.lookup(id, function (err, item) {
-
-                                if (err || !item) {
-                                    return callback(err);
-                                }
-
-                                var credentials = {
-                                    // Required
-                                    key: item.key,
-                                    algorithm: item.algorithm,
-                                    // Application specific
-                                    user: item.user
-                                };
-
-                                return callback(null, credentials);
-                            });
-                        };
-
-   options: {
-
-        hostHeaderName:        optional header field name, used to override the default 'Host' header when used
-                               behind a cache of a proxy. Apache2 changes the value of the 'Host' header while preserving
-                               the original (which is what the module must verify) in the 'x-forwarded-host' header field.
-                               Only used when passed a node Http.ServerRequest object.
-
-        nonceFunc:             optional nonce validation function. The function signature is function(key, nonce, ts, callback)
-                               where 'callback' must be called using the signature function(err).
-
-        timestampSkewSec:      optional number of seconds of permitted clock skew for incoming timestamps. Defaults to 60 seconds.
-                               Provides a +/- skew which means actual allowed window is double the number of seconds.
-
-        localtimeOffsetMsec:   optional local clock time offset express in a number of milliseconds (positive or negative).
-                               Defaults to 0.
-
-        payload:               optional payload for validation. The client calculates the hash value and includes it via the 'hash'
-                               header attribute. The server always ensures the value provided has been included in the request
-                               MAC. When this option is provided, it validates the hash value itself. Validation is done by calculating
-                               a hash value over the entire payload (assuming it has already be normalized to the same format and
-                               encoding used by the client to calculate the hash on request). If the payload is not available at the time
-                               of authentication, the authenticatePayload() method can be used by passing it the credentials and
-                               attributes.hash returned in the authenticate callback.
-
-        host:                  optional host name override. Only used when passed a node request object.
-        port:                  optional port override. Only used when passed a node request object.
-    }
-
-    callback: function (err, credentials, artifacts) { }
- */
-
-exports.authenticate = function (req, credentialsFunc, options, callback) {
-
-    callback = Hoek.nextTick(callback);
-
-    // Default options
-
-    options.nonceFunc = options.nonceFunc || internals.nonceFunc;
-    options.timestampSkewSec = options.timestampSkewSec || 60;                                                  // 60 seconds
-
-    // Application time
-
-    var now = Utils.now(options.localtimeOffsetMsec);                           // Measure now before any other processing
-
-    // Convert node Http request object to a request configuration object
-
-    var request = Utils.parseRequest(req, options);
-    if (request instanceof Error) {
-        return callback(Boom.badRequest(request.message));
-    }
-
-    // Parse HTTP Authorization header
-
-    var attributes = Utils.parseAuthorizationHeader(request.authorization);
-    if (attributes instanceof Error) {
-        return callback(attributes);
-    }
-
-    // Construct artifacts container
-
-    var artifacts = {
-        method: request.method,
-        host: request.host,
-        port: request.port,
-        resource: request.url,
-        ts: attributes.ts,
-        nonce: attributes.nonce,
-        hash: attributes.hash,
-        ext: attributes.ext,
-        app: attributes.app,
-        dlg: attributes.dlg,
-        mac: attributes.mac,
-        id: attributes.id
-    };
-
-    // Verify required header attributes
-
-    if (!attributes.id ||
-        !attributes.ts ||
-        !attributes.nonce ||
-        !attributes.mac) {
-
-        return callback(Boom.badRequest('Missing attributes'), null, artifacts);
-    }
-
-    // Fetch Hawk credentials
-
-    credentialsFunc(attributes.id, function (err, credentials) {
-
-        if (err) {
-            return callback(err, credentials || null, artifacts);
-        }
-
-        if (!credentials) {
-            return callback(Boom.unauthorized('Unknown credentials', 'Hawk'), null, artifacts);
-        }
-
-        if (!credentials.key ||
-            !credentials.algorithm) {
-
-            return callback(Boom.internal('Invalid credentials'), credentials, artifacts);
-        }
-
-        if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-            return callback(Boom.internal('Unknown algorithm'), credentials, artifacts);
-        }
-
-        // Calculate MAC
-
-        var mac = Crypto.calculateMac('header', credentials, artifacts);
-        if (!Cryptiles.fixedTimeComparison(mac, attributes.mac)) {
-            return callback(Boom.unauthorized('Bad mac', 'Hawk'), credentials, artifacts);
-        }
-
-        // Check payload hash
-
-        if (options.payload ||
-            options.payload === '') {
-
-            if (!attributes.hash) {
-                return callback(Boom.unauthorized('Missing required payload hash', 'Hawk'), credentials, artifacts);
-            }
-
-            var hash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, request.contentType);
-            if (!Cryptiles.fixedTimeComparison(hash, attributes.hash)) {
-                return callback(Boom.unauthorized('Bad payload hash', 'Hawk'), credentials, artifacts);
-            }
-        }
-
-        // Check nonce
-
-        options.nonceFunc(credentials.key, attributes.nonce, attributes.ts, function (err) {
-
-            if (err) {
-                return callback(Boom.unauthorized('Invalid nonce', 'Hawk'), credentials, artifacts);
-            }
-
-            // Check timestamp staleness
-
-            if (Math.abs((attributes.ts * 1000) - now) > (options.timestampSkewSec * 1000)) {
-                var tsm = Crypto.timestampMessage(credentials, options.localtimeOffsetMsec);
-                return callback(Boom.unauthorized('Stale timestamp', 'Hawk', tsm), credentials, artifacts);
-            }
-
-            // Successful authentication
-
-            return callback(null, credentials, artifacts);
-        });
-    });
-};
-
-
-// Authenticate payload hash - used when payload cannot be provided during authenticate()
-
-/*
-    payload:        raw request payload
-    credentials:    from authenticate callback
-    artifacts:      from authenticate callback
-    contentType:    req.headers['content-type']
-*/
-
-exports.authenticatePayload = function (payload, credentials, artifacts, contentType) {
-
-    var calculatedHash = Crypto.calculatePayloadHash(payload, credentials.algorithm, contentType);
-    return Cryptiles.fixedTimeComparison(calculatedHash, artifacts.hash);
-};
-
-
-// Authenticate payload hash - used when payload cannot be provided during authenticate()
-
-/*
-    calculatedHash: the payload hash calculated using Crypto.calculatePayloadHash()
-    artifacts:      from authenticate callback
-*/
-
-exports.authenticatePayloadHash = function (calculatedHash, artifacts) {
-
-    return Cryptiles.fixedTimeComparison(calculatedHash, artifacts.hash);
-};
-
-
-// Generate a Server-Authorization header for a given response
-
-/*
-    credentials: {},                                        // Object received from authenticate()
-    artifacts: {}                                           // Object received from authenticate(); 'mac', 'hash', and 'ext' - ignored
-    options: {
-        ext: 'application-specific',                        // Application specific data sent via the ext attribute
-        payload: '{"some":"payload"}',                      // UTF-8 encoded string for body hash generation (ignored if hash provided)
-        contentType: 'application/json',                    // Payload content-type (ignored if hash provided)
-        hash: 'U4MKKSmiVxk37JCCrAVIjV='                     // Pre-calculated payload hash
-    }
-*/
-
-exports.header = function (credentials, artifacts, options) {
-
-    // Prepare inputs
-
-    options = options || {};
-
-    if (!artifacts ||
-        typeof artifacts !== 'object' ||
-        typeof options !== 'object') {
-
-        return '';
-    }
-
-    artifacts = Hoek.clone(artifacts);
-    delete artifacts.mac;
-    artifacts.hash = options.hash;
-    artifacts.ext = options.ext;
-
-    // Validate credentials
-
-    if (!credentials ||
-        !credentials.key ||
-        !credentials.algorithm) {
-
-        // Invalid credential object
-        return '';
-    }
-
-    if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-        return '';
-    }
-
-    // Calculate payload hash
-
-    if (!artifacts.hash &&
-        (options.payload || options.payload === '')) {
-
-        artifacts.hash = Crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
-    }
-
-    var mac = Crypto.calculateMac('response', credentials, artifacts);
-
-    // Construct header
-
-    var header = 'Hawk mac="' + mac + '"' +
-                 (artifacts.hash ? ', hash="' + artifacts.hash + '"' : '');
-
-    if (artifacts.ext !== null &&
-        artifacts.ext !== undefined &&
-        artifacts.ext !== '') {                       // Other falsey values allowed
-
-        header += ', ext="' + Hoek.escapeHeaderAttribute(artifacts.ext) + '"';
-    }
-
-    return header;
-};
-
-
-/*
- * Arguments and options are the same as authenticate() with the exception that the only supported options are:
- * 'hostHeaderName', 'localtimeOffsetMsec', 'host', 'port'
- */
-
-
-//                       1     2             3           4
-internals.bewitRegex = /^(\/.*)([\?&])bewit\=([^&$]*)(?:&(.+))?$/;
-
-
-exports.authenticateBewit = function (req, credentialsFunc, options, callback) {
-
-    callback = Hoek.nextTick(callback);
-
-    // Application time
-
-    var now = Utils.now(options.localtimeOffsetMsec);
-
-    // Convert node Http request object to a request configuration object
-
-    var request = Utils.parseRequest(req, options);
-    if (request instanceof Error) {
-        return callback(Boom.badRequest(request.message));
-    }
-
-    // Extract bewit
-
-    if (request.url.length > Utils.limits.maxMatchLength) {
-        return callback(Boom.badRequest('Resource path exceeds max length'));
-    }
-
-    var resource = request.url.match(internals.bewitRegex);
-    if (!resource) {
-        return callback(Boom.unauthorized(null, 'Hawk'));
-    }
-
-    // Bewit not empty
-
-    if (!resource[3]) {
-        return callback(Boom.unauthorized('Empty bewit', 'Hawk'));
-    }
-
-    // Verify method is GET
-
-    if (request.method !== 'GET' &&
-        request.method !== 'HEAD') {
-
-        return callback(Boom.unauthorized('Invalid method', 'Hawk'));
-    }
-
-    // No other authentication
-
-    if (request.authorization) {
-        return callback(Boom.badRequest('Multiple authentications'));
-    }
-
-    // Parse bewit
-
-    var bewitString = Hoek.base64urlDecode(resource[3]);
-    if (bewitString instanceof Error) {
-        return callback(Boom.badRequest('Invalid bewit encoding'));
-    }
-
-    // Bewit format: id\exp\mac\ext ('\' is used because it is a reserved header attribute character)
-
-    var bewitParts = bewitString.split('\\');
-    if (bewitParts.length !== 4) {
-        return callback(Boom.badRequest('Invalid bewit structure'));
-    }
-
-    var bewit = {
-        id: bewitParts[0],
-        exp: parseInt(bewitParts[1], 10),
-        mac: bewitParts[2],
-        ext: bewitParts[3] || ''
-    };
-
-    if (!bewit.id ||
-        !bewit.exp ||
-        !bewit.mac) {
-
-        return callback(Boom.badRequest('Missing bewit attributes'));
-    }
-
-    // Construct URL without bewit
-
-    var url = resource[1];
-    if (resource[4]) {
-        url += resource[2] + resource[4];
-    }
-
-    // Check expiration
-
-    if (bewit.exp * 1000 <= now) {
-        return callback(Boom.unauthorized('Access expired', 'Hawk'), null, bewit);
-    }
-
-    // Fetch Hawk credentials
-
-    credentialsFunc(bewit.id, function (err, credentials) {
-
-        if (err) {
-            return callback(err, credentials || null, bewit.ext);
-        }
-
-        if (!credentials) {
-            return callback(Boom.unauthorized('Unknown credentials', 'Hawk'), null, bewit);
-        }
-
-        if (!credentials.key ||
-            !credentials.algorithm) {
-
-            return callback(Boom.internal('Invalid credentials'), credentials, bewit);
-        }
-
-        if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-            return callback(Boom.internal('Unknown algorithm'), credentials, bewit);
-        }
-
-        // Calculate MAC
-
-        var mac = Crypto.calculateMac('bewit', credentials, {
-            ts: bewit.exp,
-            nonce: '',
-            method: 'GET',
-            resource: url,
-            host: request.host,
-            port: request.port,
-            ext: bewit.ext
-        });
-
-        if (!Cryptiles.fixedTimeComparison(mac, bewit.mac)) {
-            return callback(Boom.unauthorized('Bad mac', 'Hawk'), credentials, bewit);
-        }
-
-        // Successful authentication
-
-        return callback(null, credentials, bewit);
-    });
-};
-
-
-/*
- *  options are the same as authenticate() with the exception that the only supported options are:
- * 'nonceFunc', 'timestampSkewSec', 'localtimeOffsetMsec'
- */
-
-exports.authenticateMessage = function (host, port, message, authorization, credentialsFunc, options, callback) {
-
-    callback = Hoek.nextTick(callback);
-
-    // Default options
-
-    options.nonceFunc = options.nonceFunc || internals.nonceFunc;
-    options.timestampSkewSec = options.timestampSkewSec || 60;                                                  // 60 seconds
-
-    // Application time
-
-    var now = Utils.now(options.localtimeOffsetMsec);                       // Measure now before any other processing
-
-    // Validate authorization
-
-    if (!authorization.id ||
-        !authorization.ts ||
-        !authorization.nonce ||
-        !authorization.hash ||
-        !authorization.mac) {
-
-        return callback(Boom.badRequest('Invalid authorization'));
-    }
-
-    // Fetch Hawk credentials
-
-    credentialsFunc(authorization.id, function (err, credentials) {
-
-        if (err) {
-            return callback(err, credentials || null);
-        }
-
-        if (!credentials) {
-            return callback(Boom.unauthorized('Unknown credentials', 'Hawk'));
-        }
-
-        if (!credentials.key ||
-            !credentials.algorithm) {
-
-            return callback(Boom.internal('Invalid credentials'), credentials);
-        }
-
-        if (Crypto.algorithms.indexOf(credentials.algorithm) === -1) {
-            return callback(Boom.internal('Unknown algorithm'), credentials);
-        }
-
-        // Construct artifacts container
-
-        var artifacts = {
-            ts: authorization.ts,
-            nonce: authorization.nonce,
-            host: host,
-            port: port,
-            hash: authorization.hash
-        };
-
-        // Calculate MAC
-
-        var mac = Crypto.calculateMac('message', credentials, artifacts);
-        if (!Cryptiles.fixedTimeComparison(mac, authorization.mac)) {
-            return callback(Boom.unauthorized('Bad mac', 'Hawk'), credentials);
-        }
-
-        // Check payload hash
-
-        var hash = Crypto.calculatePayloadHash(message, credentials.algorithm);
-        if (!Cryptiles.fixedTimeComparison(hash, authorization.hash)) {
-            return callback(Boom.unauthorized('Bad message hash', 'Hawk'), credentials);
-        }
-
-        // Check nonce
-
-        options.nonceFunc(credentials.key, authorization.nonce, authorization.ts, function (err) {
-
-            if (err) {
-                return callback(Boom.unauthorized('Invalid nonce', 'Hawk'), credentials);
-            }
-
-            // Check timestamp staleness
-
-            if (Math.abs((authorization.ts * 1000) - now) > (options.timestampSkewSec * 1000)) {
-                return callback(Boom.unauthorized('Stale timestamp'), credentials);
-            }
-
-            // Successful authentication
-
-            return callback(null, credentials);
-        });
-    });
-};
-
-
-internals.nonceFunc = function (key, nonce, ts, nonceCallback) {
-
-    return nonceCallback();         // No validation
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/utils.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/utils.js
deleted file mode 100755
index 1df97c0e0232479df9fb8a7750efd5df90f451eb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/lib/utils.js
+++ /dev/null
@@ -1,184 +0,0 @@
-// Load modules
-
-var Sntp = require('sntp');
-var Boom = require('boom');
-
-
-// Declare internals
-
-var internals = {};
-
-
-exports.version = function () {
-
-    return require('../package.json').version;
-};
-
-
-exports.limits = {
-    maxMatchLength: 4096            // Limit the length of uris and headers to avoid a DoS attack on string matching
-};
-
-
-// Extract host and port from request
-
-//                                            $1                            $2
-internals.hostHeaderRegex = /^(?:(?:\r\n)?\s)*((?:[^:]+)|(?:\[[^\]]+\]))(?::(\d+))?(?:(?:\r\n)?\s)*$/;              // (IPv4, hostname)|(IPv6)
-
-
-exports.parseHost = function (req, hostHeaderName) {
-
-    hostHeaderName = (hostHeaderName ? hostHeaderName.toLowerCase() : 'host');
-    var hostHeader = req.headers[hostHeaderName];
-    if (!hostHeader) {
-        return null;
-    }
-
-    if (hostHeader.length > exports.limits.maxMatchLength) {
-        return null;
-    }
-
-    var hostParts = hostHeader.match(internals.hostHeaderRegex);
-    if (!hostParts) {
-        return null;
-    }
-
-    return {
-        name: hostParts[1],
-        port: (hostParts[2] ? hostParts[2] : (req.connection && req.connection.encrypted ? 443 : 80))
-    };
-};
-
-
-// Parse Content-Type header content
-
-exports.parseContentType = function (header) {
-
-    if (!header) {
-        return '';
-    }
-
-    return header.split(';')[0].trim().toLowerCase();
-};
-
-
-// Convert node's  to request configuration object
-
-exports.parseRequest = function (req, options) {
-
-    if (!req.headers) {
-        return req;
-    }
-
-    // Obtain host and port information
-
-    var host;
-    if (!options.host ||
-        !options.port) {
-
-        host = exports.parseHost(req, options.hostHeaderName);
-        if (!host) {
-            return new Error('Invalid Host header');
-        }
-    }
-
-    var request = {
-        method: req.method,
-        url: req.url,
-        host: options.host || host.name,
-        port: options.port || host.port,
-        authorization: req.headers.authorization,
-        contentType: req.headers['content-type'] || ''
-    };
-
-    return request;
-};
-
-
-exports.now = function (localtimeOffsetMsec) {
-
-    return Sntp.now() + (localtimeOffsetMsec || 0);
-};
-
-
-exports.nowSecs = function (localtimeOffsetMsec) {
-
-    return Math.floor(exports.now(localtimeOffsetMsec) / 1000);
-};
-
-
-internals.authHeaderRegex = /^(\w+)(?:\s+(.*))?$/;                                      // Header: scheme[ something]
-internals.attributeRegex = /^[ \w\!#\$%&'\(\)\*\+,\-\.\/\:;<\=>\?@\[\]\^`\{\|\}~]+$/;   // !#$%&'()*+,-./:;<=>?@[]^_`{|}~ and space, a-z, A-Z, 0-9
-
-
-// Parse Hawk HTTP Authorization header
-
-exports.parseAuthorizationHeader = function (header, keys) {
-
-    keys = keys || ['id', 'ts', 'nonce', 'hash', 'ext', 'mac', 'app', 'dlg'];
-
-    if (!header) {
-        return Boom.unauthorized(null, 'Hawk');
-    }
-
-    if (header.length > exports.limits.maxMatchLength) {
-        return Boom.badRequest('Header length too long');
-    }
-
-    var headerParts = header.match(internals.authHeaderRegex);
-    if (!headerParts) {
-        return Boom.badRequest('Invalid header syntax');
-    }
-
-    var scheme = headerParts[1];
-    if (scheme.toLowerCase() !== 'hawk') {
-        return Boom.unauthorized(null, 'Hawk');
-    }
-
-    var attributesString = headerParts[2];
-    if (!attributesString) {
-        return Boom.badRequest('Invalid header syntax');
-    }
-
-    var attributes = {};
-    var errorMessage = '';
-    var verify = attributesString.replace(/(\w+)="([^"\\]*)"\s*(?:,\s*|$)/g, function ($0, $1, $2) {
-
-        // Check valid attribute names
-
-        if (keys.indexOf($1) === -1) {
-            errorMessage = 'Unknown attribute: ' + $1;
-            return;
-        }
-
-        // Allowed attribute value characters
-
-        if ($2.match(internals.attributeRegex) === null) {
-            errorMessage = 'Bad attribute value: ' + $1;
-            return;
-        }
-
-        // Check for duplicates
-
-        if (attributes.hasOwnProperty($1)) {
-            errorMessage = 'Duplicate attribute: ' + $1;
-            return;
-        }
-
-        attributes[$1] = $2;
-        return '';
-    });
-
-    if (verify !== '') {
-        return Boom.badRequest(errorMessage || 'Bad header format');
-    }
-
-    return attributes;
-};
-
-
-exports.unauthorized = function (message, attributes) {
-
-    return Boom.unauthorized(message, 'Hawk', attributes);
-};
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/.npmignore
deleted file mode 100644
index 77ba16cb055ca541749d23cb973e1cdfc41504e1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/.npmignore
+++ /dev/null
@@ -1,18 +0,0 @@
-.idea
-*.iml
-npm-debug.log
-dump.rdb
-node_modules
-results.tap
-results.xml
-npm-shrinkwrap.json
-config.json
-.DS_Store
-*/.DS_Store
-*/*/.DS_Store
-._*
-*/._*
-*/*/._*
-coverage.*
-lib-cov
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/.travis.yml
deleted file mode 100755
index dd1b24f13ac1f8ad02a29423927d1b5442a36bcb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: node_js
-
-node_js:
-  - 0.10
-  - 4.0
-
-sudo: false
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/CONTRIBUTING.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/CONTRIBUTING.md
deleted file mode 100644
index 892836159ba3c787e7502ce70ed9c5ffe5f9d023..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/CONTRIBUTING.md
+++ /dev/null
@@ -1 +0,0 @@
-Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md).
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/LICENSE
deleted file mode 100755
index 394688939d321d27d2e787a86ea4d17263348a37..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/LICENSE
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (c) 2012-2014, Walmart and other contributors.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * The names of any contributors may not be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-                                  *   *   *
-
-The complete list of contributors can be found at: https://github.com/hapijs/boom/graphs/contributors
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/README.md
deleted file mode 100755
index cbd91c93190b628d47dc681be911e95f8695869e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/README.md
+++ /dev/null
@@ -1,652 +0,0 @@
-![boom Logo](https://raw.github.com/hapijs/boom/master/images/boom.png)
-
-HTTP-friendly error objects
-
-[![Build Status](https://secure.travis-ci.org/hapijs/boom.png)](http://travis-ci.org/hapijs/boom)
-[![Current Version](https://img.shields.io/npm/v/boom.svg)](https://www.npmjs.com/package/boom)
-
-Lead Maintainer: [Adam Bretz](https://github.com/arb)
-
-**boom** provides a set of utilities for returning HTTP errors. Each utility returns a `Boom` error response
-object (instance of `Error`) which includes the following properties:
-- `isBoom` - if `true`, indicates this is a `Boom` object instance.
-- `isServer` - convenience bool indicating status code >= 500.
-- `message` - the error message.
-- `output` - the formatted response. Can be directly manipulated after object construction to return a custom
-  error response. Allowed root keys:
-    - `statusCode` - the HTTP status code (typically 4xx or 5xx).
-    - `headers` - an object containing any HTTP headers where each key is a header name and value is the header content.
-    - `payload` - the formatted object used as the response payload (stringified). Can be directly manipulated but any
-      changes will be lost
-      if `reformat()` is called. Any content allowed and by default includes the following content:
-        - `statusCode` - the HTTP status code, derived from `error.output.statusCode`.
-        - `error` - the HTTP status message (e.g. 'Bad Request', 'Internal Server Error') derived from `statusCode`.
-        - `message` - the error message derived from `error.message`.
-- inherited `Error` properties.
-
-The `Boom` object also supports the following method:
-- `reformat()` - rebuilds `error.output` using the other object properties.
-
-## Overview
-
-- Helper methods
-  - [`wrap(error, [statusCode], [message])`](#wraperror-statuscode-message)
-  - [`create(statusCode, [message], [data])`](#createstatuscode-message-data)
-- HTTP 4xx Errors
-  - 400: [`Boom.badRequest([message], [data])`](#boombadrequestmessage-data)
-  - 401: [`Boom.unauthorized([message], [scheme], [attributes])`](#boomunauthorizedmessage-scheme-attributes)
-  - 403: [`Boom.forbidden([message], [data])`](#boomforbiddenmessage-data)
-  - 404: [`Boom.notFound([message], [data])`](#boomnotfoundmessage-data)
-  - 405: [`Boom.methodNotAllowed([message], [data])`](#boommethodnotallowedmessage-data)
-  - 406: [`Boom.notAcceptable([message], [data])`](#boomnotacceptablemessage-data)
-  - 407: [`Boom.proxyAuthRequired([message], [data])`](#boomproxyauthrequiredmessage-data)
-  - 408: [`Boom.clientTimeout([message], [data])`](#boomclienttimeoutmessage-data)
-  - 409: [`Boom.conflict([message], [data])`](#boomconflictmessage-data)
-  - 410: [`Boom.resourceGone([message], [data])`](#boomresourcegonemessage-data)
-  - 411: [`Boom.lengthRequired([message], [data])`](#boomlengthrequiredmessage-data)
-  - 412: [`Boom.preconditionFailed([message], [data])`](#boompreconditionfailedmessage-data)
-  - 413: [`Boom.entityTooLarge([message], [data])`](#boomentitytoolargemessage-data)
-  - 414: [`Boom.uriTooLong([message], [data])`](#boomuritoolongmessage-data)
-  - 415: [`Boom.unsupportedMediaType([message], [data])`](#boomunsupportedmediatypemessage-data)
-  - 416: [`Boom.rangeNotSatisfiable([message], [data])`](#boomrangenotsatisfiablemessage-data)
-  - 417: [`Boom.expectationFailed([message], [data])`](#boomexpectationfailedmessage-data)
-  - 422: [`Boom.badData([message], [data])`](#boombaddatamessage-data)
-  - 428: [`Boom.preconditionRequired([message], [data])`](#boompreconditionrequiredmessage-data)
-  - 429: [`Boom.tooManyRequests([message], [data])`](#boomtoomanyrequestsmessage-data)
-- HTTP 5xx Errors
-  - 500: [`Boom.badImplementation([message], [data])`](#boombadimplementationmessage-data)
-  - 501: [`Boom.notImplemented([message], [data])`](#boomnotimplementedmessage-data)
-  - 502: [`Boom.badGateway([message], [data])`](#boombadgatewaymessage-data)
-  - 503: [`Boom.serverTimeout([message], [data])`](#boomservertimeoutmessage-data)
-  - 504: [`Boom.gatewayTimeout([message], [data])`](#boomgatewaytimeoutmessage-data)
-- [FAQ](#faq)
-
-
-## Helper Methods
-
-### `wrap(error, [statusCode], [message])`
-
-Decorates an error with the **boom** properties where:
-- `error` - the error object to wrap. If `error` is already a **boom** object, returns back the same object.
-- `statusCode` - optional HTTP status code. Defaults to `500`.
-- `message` - optional message string. If the error already has a message, it adds the message as a prefix.
-  Defaults to no message.
-
-```js
-var error = new Error('Unexpected input');
-Boom.wrap(error, 400);
-```
-
-### `create(statusCode, [message], [data])`
-
-Generates an `Error` object with the **boom** decorations where:
-- `statusCode` - an HTTP error code number. Must be greater or equal 400.
-- `message` - optional message string.
-- `data` - additional error data set to `error.data` property.
-
-```js
-var error = Boom.create(400, 'Bad request', { timestamp: Date.now() });
-```
-
-## HTTP 4xx Errors
-
-### `Boom.badRequest([message], [data])`
-
-Returns a 400 Bad Request error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.badRequest('invalid query');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 400,
-    "error": "Bad Request",
-    "message": "invalid query"
-}
-```
-
-### `Boom.unauthorized([message], [scheme], [attributes])`
-
-Returns a 401 Unauthorized error where:
-- `message` - optional message.
-- `scheme` can be one of the following:
-  - an authentication scheme name
-  - an array of string values. These values will be separated by ', ' and set to the 'WWW-Authenticate' header.
-- `attributes` - an object of values to use while setting the 'WWW-Authenticate' header. This value is only used
-  when `schema` is a string, otherwise it is ignored. Every key/value pair will be included in the
-  'WWW-Authenticate' in the format of 'key="value"' as well as in the response payload under the `attributes` key.
-  `null` and `undefined` will be replaced with an empty string. If `attributes` is set, `message` will be used as
-  the 'error' segment of the 'WWW-Authenticate' header. If `message` is unset, the 'error' segment of the header
-  will not be present and `isMissing` will be true on the error object.
-
-If either `scheme` or `attributes` are set, the resultant `Boom` object will have the 'WWW-Authenticate' header set for the response.
-
-```js
-Boom.unauthorized('invalid password');
-```
-
-Generates the following response:
-
-```json
-"payload": {
-    "statusCode": 401,
-    "error": "Unauthorized",
-    "message": "invalid password"
-},
-"headers" {}
-```
-
-```js
-Boom.unauthorized('invalid password', 'sample');
-```
-
-Generates the following response:
-
-```json
-"payload": {
-    "statusCode": 401,
-    "error": "Unauthorized",
-    "message": "invalid password",
-    "attributes": {
-        "error": "invalid password"
-    }
-},
-"headers" {
-  "WWW-Authenticate": "sample error=\"invalid password\""
-}
-```
-
-```js
-Boom.unauthorized('invalid password', 'sample', { ttl: 0, cache: null, foo: 'bar' });
-```
-
-Generates the following response:
-
-```json
-"payload": {
-    "statusCode": 401,
-    "error": "Unauthorized",
-    "message": "invalid password",
-    "attributes": {
-        "error": "invalid password",
-        "ttl": 0,
-        "cache": "",
-        "foo": "bar"
-    }
-},
-"headers" {
-  "WWW-Authenticate": "sample ttl=\"0\", cache=\"\", foo=\"bar\", error=\"invalid password\""
-}
-```
-
-### `Boom.forbidden([message], [data])`
-
-Returns a 403 Forbidden error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.forbidden('try again some time');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 403,
-    "error": "Forbidden",
-    "message": "try again some time"
-}
-```
-
-### `Boom.notFound([message], [data])`
-
-Returns a 404 Not Found error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.notFound('missing');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 404,
-    "error": "Not Found",
-    "message": "missing"
-}
-```
-
-### `Boom.methodNotAllowed([message], [data])`
-
-Returns a 405 Method Not Allowed error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.methodNotAllowed('that method is not allowed');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 405,
-    "error": "Method Not Allowed",
-    "message": "that method is not allowed"
-}
-```
-
-### `Boom.notAcceptable([message], [data])`
-
-Returns a 406 Not Acceptable error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.notAcceptable('unacceptable');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 406,
-    "error": "Not Acceptable",
-    "message": "unacceptable"
-}
-```
-
-### `Boom.proxyAuthRequired([message], [data])`
-
-Returns a 407 Proxy Authentication Required error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.proxyAuthRequired('auth missing');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 407,
-    "error": "Proxy Authentication Required",
-    "message": "auth missing"
-}
-```
-
-### `Boom.clientTimeout([message], [data])`
-
-Returns a 408 Request Time-out error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.clientTimeout('timed out');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 408,
-    "error": "Request Time-out",
-    "message": "timed out"
-}
-```
-
-### `Boom.conflict([message], [data])`
-
-Returns a 409 Conflict error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.conflict('there was a conflict');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 409,
-    "error": "Conflict",
-    "message": "there was a conflict"
-}
-```
-
-### `Boom.resourceGone([message], [data])`
-
-Returns a 410 Gone error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.resourceGone('it is gone');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 410,
-    "error": "Gone",
-    "message": "it is gone"
-}
-```
-
-### `Boom.lengthRequired([message], [data])`
-
-Returns a 411 Length Required error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.lengthRequired('length needed');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 411,
-    "error": "Length Required",
-    "message": "length needed"
-}
-```
-
-### `Boom.preconditionFailed([message], [data])`
-
-Returns a 412 Precondition Failed error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.preconditionFailed();
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 412,
-    "error": "Precondition Failed"
-}
-```
-
-### `Boom.entityTooLarge([message], [data])`
-
-Returns a 413 Request Entity Too Large error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.entityTooLarge('too big');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 413,
-    "error": "Request Entity Too Large",
-    "message": "too big"
-}
-```
-
-### `Boom.uriTooLong([message], [data])`
-
-Returns a 414 Request-URI Too Large error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.uriTooLong('uri is too long');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 414,
-    "error": "Request-URI Too Large",
-    "message": "uri is too long"
-}
-```
-
-### `Boom.unsupportedMediaType([message], [data])`
-
-Returns a 415 Unsupported Media Type error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.unsupportedMediaType('that media is not supported');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 415,
-    "error": "Unsupported Media Type",
-    "message": "that media is not supported"
-}
-```
-
-### `Boom.rangeNotSatisfiable([message], [data])`
-
-Returns a 416 Requested Range Not Satisfiable error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.rangeNotSatisfiable();
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 416,
-    "error": "Requested Range Not Satisfiable"
-}
-```
-
-### `Boom.expectationFailed([message], [data])`
-
-Returns a 417 Expectation Failed error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.expectationFailed('expected this to work');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 417,
-    "error": "Expectation Failed",
-    "message": "expected this to work"
-}
-```
-
-### `Boom.badData([message], [data])`
-
-Returns a 422 Unprocessable Entity error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.badData('your data is bad and you should feel bad');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 422,
-    "error": "Unprocessable Entity",
-    "message": "your data is bad and you should feel bad"
-}
-```
-
-### `Boom.preconditionRequired([message], [data])`
-
-Returns a 428 Precondition Required error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.preconditionRequired('you must supply an If-Match header');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 428,
-    "error": "Precondition Required",
-    "message": "you must supply an If-Match header"
-}
-```
-
-### `Boom.tooManyRequests([message], [data])`
-
-Returns a 429 Too Many Requests error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.tooManyRequests('you have exceeded your request limit');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 429,
-    "error": "Too Many Requests",
-    "message": "you have exceeded your request limit"
-}
-```
-
-## HTTP 5xx Errors
-
-All 500 errors hide your message from the end user. Your message is recorded in the server log.
-
-### `Boom.badImplementation([message], [data])`
-
-Returns a 500 Internal Server Error error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.badImplementation('terrible implementation');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 500,
-    "error": "Internal Server Error",
-    "message": "An internal server error occurred"
-}
-```
-
-### `Boom.notImplemented([message], [data])`
-
-Returns a 501 Not Implemented error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.notImplemented('method not implemented');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 501,
-    "error": "Not Implemented",
-    "message": "method not implemented"
-}
-```
-
-### `Boom.badGateway([message], [data])`
-
-Returns a 502 Bad Gateway error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.badGateway('that is a bad gateway');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 502,
-    "error": "Bad Gateway",
-    "message": "that is a bad gateway"
-}
-```
-
-### `Boom.serverTimeout([message], [data])`
-
-Returns a 503 Service Unavailable error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.serverTimeout('unavailable');
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 503,
-    "error": "Service Unavailable",
-    "message": "unavailable"
-}
-```
-
-### `Boom.gatewayTimeout([message], [data])`
-
-Returns a 504 Gateway Time-out error where:
-- `message` - optional message.
-- `data` - optional additional error data.
-
-```js
-Boom.gatewayTimeout();
-```
-
-Generates the following response payload:
-
-```json
-{
-    "statusCode": 504,
-    "error": "Gateway Time-out"
-}
-```
-
-## F.A.Q.
-
-###### How do I include extra information in my responses? `output.payload` is missing `data`, what gives?
-
-There is a reason the values passed back in the response payloads are pretty locked down. It's mostly for security and to not leak any important information back to the client. This means you will need to put in a little more effort to include extra information about your custom error. Check out the ["Error transformation"](https://github.com/hapijs/hapi/blob/master/API.md#error-transformation) section in the hapi documentation.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/images/boom.png b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/images/boom.png
deleted file mode 100755
index 373bc13455bc0a71a6a4538158aee59c6994b761..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/images/boom.png and /dev/null differ
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js
deleted file mode 100755
index 6bdea693688ed3d31f2f5ebe89d3f4e87de7c849..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/lib/index.js
+++ /dev/null
@@ -1,318 +0,0 @@
-// Load modules
-
-var Http = require('http');
-var Hoek = require('hoek');
-
-
-// Declare internals
-
-var internals = {};
-
-exports.wrap = function (error, statusCode, message) {
-
-    Hoek.assert(error instanceof Error, 'Cannot wrap non-Error object');
-    return (error.isBoom ? error : internals.initialize(error, statusCode || 500, message));
-};
-
-
-exports.create = function (statusCode, message, data) {
-
-    return internals.create(statusCode, message, data, exports.create);
-};
-
-internals.create = function (statusCode, message, data, ctor) {
-
-    var error = new Error(message ? message : undefined);       // Avoids settings null message
-    Error.captureStackTrace(error, ctor);                       // Filter the stack to our external API
-    error.data = data || null;
-    internals.initialize(error, statusCode);
-    return error;
-};
-
-internals.initialize = function (error, statusCode, message) {
-
-    var numberCode = parseInt(statusCode, 10);
-    Hoek.assert(!isNaN(numberCode) && numberCode >= 400, 'First argument must be a number (400+):', statusCode);
-
-    error.isBoom = true;
-    error.isServer = numberCode >= 500;
-
-    if (!error.hasOwnProperty('data')) {
-        error.data = null;
-    }
-
-    error.output = {
-        statusCode: numberCode,
-        payload: {},
-        headers: {}
-    };
-
-    error.reformat = internals.reformat;
-    error.reformat();
-
-    if (!message &&
-        !error.message) {
-
-        message = error.output.payload.error;
-    }
-
-    if (message) {
-        error.message = (message + (error.message ? ': ' + error.message : ''));
-    }
-
-    return error;
-};
-
-
-internals.reformat = function () {
-
-    this.output.payload.statusCode = this.output.statusCode;
-    this.output.payload.error = Http.STATUS_CODES[this.output.statusCode] || 'Unknown';
-
-    if (this.output.statusCode === 500) {
-        this.output.payload.message = 'An internal server error occurred';              // Hide actual error from user
-    }
-    else if (this.message) {
-        this.output.payload.message = this.message;
-    }
-};
-
-
-// 4xx Client Errors
-
-exports.badRequest = function (message, data) {
-
-    return internals.create(400, message, data, exports.badRequest);
-};
-
-
-exports.unauthorized = function (message, scheme, attributes) {          // Or function (message, wwwAuthenticate[])
-
-    var err = internals.create(401, message, undefined, exports.unauthorized);
-
-    if (!scheme) {
-        return err;
-    }
-
-    var wwwAuthenticate = '';
-    var i = 0;
-    var il = 0;
-
-    if (typeof scheme === 'string') {
-
-        // function (message, scheme, attributes)
-
-        wwwAuthenticate = scheme;
-
-        if (attributes || message) {
-            err.output.payload.attributes = {};
-        }
-
-        if (attributes) {
-            var names = Object.keys(attributes);
-            for (i = 0, il = names.length; i < il; ++i) {
-                var name = names[i];
-                if (i) {
-                    wwwAuthenticate += ',';
-                }
-
-                var value = attributes[name];
-                if (value === null ||
-                    value === undefined) {              // Value can be zero
-
-                    value = '';
-                }
-                wwwAuthenticate += ' ' + name + '="' + Hoek.escapeHeaderAttribute(value.toString()) + '"';
-                err.output.payload.attributes[name] = value;
-            }
-        }
-
-        if (message) {
-            if (attributes) {
-                wwwAuthenticate += ',';
-            }
-            wwwAuthenticate += ' error="' + Hoek.escapeHeaderAttribute(message) + '"';
-            err.output.payload.attributes.error = message;
-        }
-        else {
-            err.isMissing = true;
-        }
-    }
-    else {
-
-        // function (message, wwwAuthenticate[])
-
-        var wwwArray = scheme;
-        for (i = 0, il = wwwArray.length; i < il; ++i) {
-            if (i) {
-                wwwAuthenticate += ', ';
-            }
-
-            wwwAuthenticate += wwwArray[i];
-        }
-    }
-
-    err.output.headers['WWW-Authenticate'] = wwwAuthenticate;
-
-    return err;
-};
-
-
-exports.forbidden = function (message, data) {
-
-    return internals.create(403, message, data, exports.forbidden);
-};
-
-
-exports.notFound = function (message, data) {
-
-    return internals.create(404, message, data, exports.notFound);
-};
-
-
-exports.methodNotAllowed = function (message, data) {
-
-    return internals.create(405, message, data, exports.methodNotAllowed);
-};
-
-
-exports.notAcceptable = function (message, data) {
-
-    return internals.create(406, message, data, exports.notAcceptable);
-};
-
-
-exports.proxyAuthRequired = function (message, data) {
-
-    return internals.create(407, message, data, exports.proxyAuthRequired);
-};
-
-
-exports.clientTimeout = function (message, data) {
-
-    return internals.create(408, message, data, exports.clientTimeout);
-};
-
-
-exports.conflict = function (message, data) {
-
-    return internals.create(409, message, data, exports.conflict);
-};
-
-
-exports.resourceGone = function (message, data) {
-
-    return internals.create(410, message, data, exports.resourceGone);
-};
-
-
-exports.lengthRequired = function (message, data) {
-
-    return internals.create(411, message, data, exports.lengthRequired);
-};
-
-
-exports.preconditionFailed = function (message, data) {
-
-    return internals.create(412, message, data, exports.preconditionFailed);
-};
-
-
-exports.entityTooLarge = function (message, data) {
-
-    return internals.create(413, message, data, exports.entityTooLarge);
-};
-
-
-exports.uriTooLong = function (message, data) {
-
-    return internals.create(414, message, data, exports.uriTooLong);
-};
-
-
-exports.unsupportedMediaType = function (message, data) {
-
-    return internals.create(415, message, data, exports.unsupportedMediaType);
-};
-
-
-exports.rangeNotSatisfiable = function (message, data) {
-
-    return internals.create(416, message, data, exports.rangeNotSatisfiable);
-};
-
-
-exports.expectationFailed = function (message, data) {
-
-    return internals.create(417, message, data, exports.expectationFailed);
-};
-
-exports.badData = function (message, data) {
-
-    return internals.create(422, message, data, exports.badData);
-};
-
-
-exports.preconditionRequired = function (message, data) {
-
-    return internals.create(428, message, data, exports.preconditionRequired);
-};
-
-
-exports.tooManyRequests = function (message, data) {
-
-    return internals.create(429, message, data, exports.tooManyRequests);
-};
-
-
-// 5xx Server Errors
-
-exports.internal = function (message, data, statusCode) {
-
-    return internals.serverError(message, data, statusCode, exports.internal);
-};
-
-internals.serverError = function (message, data, statusCode, ctor) {
-
-    var error;
-    if (data instanceof Error) {
-        error = exports.wrap(data, statusCode, message);
-    } else {
-        error = internals.create(statusCode || 500, message, undefined, ctor);
-        error.data = data;
-    }
-
-    return error;
-};
-
-
-exports.notImplemented = function (message, data) {
-
-    return internals.serverError(message, data, 501, exports.notImplemented);
-};
-
-
-exports.badGateway = function (message, data) {
-
-    return internals.serverError(message, data, 502, exports.badGateway);
-};
-
-
-exports.serverTimeout = function (message, data) {
-
-    return internals.serverError(message, data, 503, exports.serverTimeout);
-};
-
-
-exports.gatewayTimeout = function (message, data) {
-
-    return internals.serverError(message, data, 504, exports.gatewayTimeout);
-};
-
-
-exports.badImplementation = function (message, data) {
-
-    var err = internals.serverError(message, data, 500, exports.badImplementation);
-    err.isDeveloperError = true;
-    return err;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/package.json
deleted file mode 100644
index 432e43eba1751343fc0917674ff4bf98ec4df430..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/package.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
-  "_from": "boom@>=2.0.0 <3.0.0",
-  "_id": "boom@2.10.1",
-  "_location": "/serialport/node-pre-gyp/request/hawk/boom",
-  "_nodeVersion": "0.10.40",
-  "_npmUser": {
-    "email": "arbretz@gmail.com",
-    "name": "arb"
-  },
-  "_npmVersion": "2.11.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/hawk",
-    "/serialport/node-pre-gyp/request/hawk/cryptiles"
-  ],
-  "_resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
-  "_shasum": "39c8918ceff5799f83f9492a848f625add0c766f",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/hapijs/boom/issues"
-  },
-  "dependencies": {
-    "hoek": "2.x.x"
-  },
-  "description": "HTTP-friendly error objects",
-  "devDependencies": {
-    "code": "1.x.x",
-    "lab": "7.x.x"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "39c8918ceff5799f83f9492a848f625add0c766f",
-    "tarball": "http://registry.npmjs.org/boom/-/boom-2.10.1.tgz"
-  },
-  "engines": {
-    "node": ">=0.10.40"
-  },
-  "gitHead": "ff1a662a86b39426cdd18f4441b112d307a34a6f",
-  "homepage": "https://github.com/hapijs/boom#readme",
-  "keywords": [
-    "error",
-    "http"
-  ],
-  "license": "BSD-3-Clause",
-  "main": "lib/index.js",
-  "maintainers": [
-    {
-      "name": "hueniverse",
-      "email": "eran@hueniverse.com"
-    },
-    {
-      "name": "wyatt",
-      "email": "wpreul@gmail.com"
-    },
-    {
-      "name": "arb",
-      "email": "arbretz@gmail.com"
-    }
-  ],
-  "name": "boom",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/hapijs/boom.git"
-  },
-  "scripts": {
-    "test": "lab -a code -t 100 -L",
-    "test-cov-html": "lab -a code -r html -o coverage.html -L"
-  },
-  "version": "2.10.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js
deleted file mode 100755
index 79a59e9f46623f83536e9d563fa85c46d564bc3e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/boom/test/index.js
+++ /dev/null
@@ -1,654 +0,0 @@
-// Load modules
-
-var Code = require('code');
-var Boom = require('../lib');
-var Lab = require('lab');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.describe;
-var it = lab.it;
-var expect = Code.expect;
-
-
-it('returns the same object when already boom', function (done) {
-
-    var error = Boom.badRequest();
-    var wrapped = Boom.wrap(error);
-    expect(error).to.equal(wrapped);
-    done();
-});
-
-it('returns an error with info when constructed using another error', function (done) {
-
-    var error = new Error('ka-boom');
-    error.xyz = 123;
-    var err = Boom.wrap(error);
-    expect(err.xyz).to.equal(123);
-    expect(err.message).to.equal('ka-boom');
-    expect(err.output).to.deep.equal({
-        statusCode: 500,
-        payload: {
-            statusCode: 500,
-            error: 'Internal Server Error',
-            message: 'An internal server error occurred'
-        },
-        headers: {}
-    });
-    expect(err.data).to.equal(null);
-    done();
-});
-
-it('does not override data when constructed using another error', function (done) {
-
-    var error = new Error('ka-boom');
-    error.data = { useful: 'data' };
-    var err = Boom.wrap(error);
-    expect(err.data).to.equal(error.data);
-    done();
-});
-
-it('sets new message when none exists', function (done) {
-
-    var error = new Error();
-    var wrapped = Boom.wrap(error, 400, 'something bad');
-    expect(wrapped.message).to.equal('something bad');
-    done();
-});
-
-it('throws when statusCode is not a number', function (done) {
-
-    expect(function () {
-
-        Boom.create('x');
-    }).to.throw('First argument must be a number (400+): x');
-    done();
-});
-
-it('will cast a number-string to an integer', function (done) {
-
-    var codes = [
-        { input: '404', result: 404 },
-        { input: '404.1', result: 404 },
-        { input: 400, result: 400 },
-        { input: 400.123, result: 400 }];
-    for (var i = 0, il = codes.length; i < il; ++i) {
-        var code = codes[i];
-        var err = Boom.create(code.input);
-        expect(err.output.statusCode).to.equal(code.result);
-    }
-
-    done();
-});
-
-it('throws when statusCode is not finite', function (done) {
-
-    expect(function () {
-
-        Boom.create(1 / 0);
-    }).to.throw('First argument must be a number (400+): null');
-    done();
-});
-
-it('sets error code to unknown', function (done) {
-
-    var err = Boom.create(999);
-    expect(err.output.payload.error).to.equal('Unknown');
-    done();
-});
-
-describe('create()', function () {
-
-    it('does not sets null message', function (done) {
-
-        var error = Boom.unauthorized(null);
-        expect(error.output.payload.message).to.not.exist();
-        expect(error.isServer).to.be.false();
-        done();
-    });
-
-    it('sets message and data', function (done) {
-
-        var error = Boom.badRequest('Missing data', { type: 'user' });
-        expect(error.data.type).to.equal('user');
-        expect(error.output.payload.message).to.equal('Missing data');
-        done();
-    });
-});
-
-describe('isBoom()', function () {
-
-    it('returns true for Boom object', function (done) {
-
-        expect(Boom.badRequest().isBoom).to.equal(true);
-        done();
-    });
-
-    it('returns false for Error object', function (done) {
-
-        expect((new Error()).isBoom).to.not.exist();
-        done();
-    });
-});
-
-describe('badRequest()', function () {
-
-    it('returns a 400 error statusCode', function (done) {
-
-        var error = Boom.badRequest();
-
-        expect(error.output.statusCode).to.equal(400);
-        expect(error.isServer).to.be.false();
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.badRequest('my message').message).to.equal('my message');
-        done();
-    });
-
-    it('sets the message to HTTP status if none provided', function (done) {
-
-        expect(Boom.badRequest().message).to.equal('Bad Request');
-        done();
-    });
-});
-
-describe('unauthorized()', function () {
-
-    it('returns a 401 error statusCode', function (done) {
-
-        var err = Boom.unauthorized();
-        expect(err.output.statusCode).to.equal(401);
-        expect(err.output.headers).to.deep.equal({});
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.unauthorized('my message').message).to.equal('my message');
-        done();
-    });
-
-    it('returns a WWW-Authenticate header when passed a scheme', function (done) {
-
-        var err = Boom.unauthorized('boom', 'Test');
-        expect(err.output.statusCode).to.equal(401);
-        expect(err.output.headers['WWW-Authenticate']).to.equal('Test error="boom"');
-        done();
-    });
-
-    it('returns a WWW-Authenticate header set to the schema array value', function (done) {
-
-        var err = Boom.unauthorized(null, ['Test','one','two']);
-        expect(err.output.statusCode).to.equal(401);
-        expect(err.output.headers['WWW-Authenticate']).to.equal('Test, one, two');
-        done();
-    });
-
-    it('returns a WWW-Authenticate header when passed a scheme and attributes', function (done) {
-
-        var err = Boom.unauthorized('boom', 'Test', { a: 1, b: 'something', c: null, d: 0 });
-        expect(err.output.statusCode).to.equal(401);
-        expect(err.output.headers['WWW-Authenticate']).to.equal('Test a="1", b="something", c="", d="0", error="boom"');
-        expect(err.output.payload.attributes).to.deep.equal({ a: 1, b: 'something', c: '', d: 0, error: 'boom' });
-        done();
-    });
-
-    it('returns a WWW-Authenticate header when passed attributes, missing error', function (done) {
-
-        var err = Boom.unauthorized(null, 'Test', { a: 1, b: 'something', c: null, d: 0 });
-        expect(err.output.statusCode).to.equal(401);
-        expect(err.output.headers['WWW-Authenticate']).to.equal('Test a="1", b="something", c="", d="0"');
-        expect(err.isMissing).to.equal(true);
-        done();
-    });
-
-    it('sets the isMissing flag when error message is empty', function (done) {
-
-        var err = Boom.unauthorized('', 'Basic');
-        expect(err.isMissing).to.equal(true);
-        done();
-    });
-
-    it('does not set the isMissing flag when error message is not empty', function (done) {
-
-        var err = Boom.unauthorized('message', 'Basic');
-        expect(err.isMissing).to.equal(undefined);
-        done();
-    });
-
-    it('sets a WWW-Authenticate when passed as an array', function (done) {
-
-        var err = Boom.unauthorized('message', ['Basic', 'Example e="1"', 'Another x="3", y="4"']);
-        expect(err.output.headers['WWW-Authenticate']).to.equal('Basic, Example e="1", Another x="3", y="4"');
-        done();
-    });
-});
-
-
-describe('methodNotAllowed()', function () {
-
-    it('returns a 405 error statusCode', function (done) {
-
-        expect(Boom.methodNotAllowed().output.statusCode).to.equal(405);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.methodNotAllowed('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('notAcceptable()', function () {
-
-    it('returns a 406 error statusCode', function (done) {
-
-        expect(Boom.notAcceptable().output.statusCode).to.equal(406);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.notAcceptable('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('proxyAuthRequired()', function () {
-
-    it('returns a 407 error statusCode', function (done) {
-
-        expect(Boom.proxyAuthRequired().output.statusCode).to.equal(407);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.proxyAuthRequired('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('clientTimeout()', function () {
-
-    it('returns a 408 error statusCode', function (done) {
-
-        expect(Boom.clientTimeout().output.statusCode).to.equal(408);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.clientTimeout('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('conflict()', function () {
-
-    it('returns a 409 error statusCode', function (done) {
-
-        expect(Boom.conflict().output.statusCode).to.equal(409);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.conflict('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('resourceGone()', function () {
-
-    it('returns a 410 error statusCode', function (done) {
-
-        expect(Boom.resourceGone().output.statusCode).to.equal(410);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.resourceGone('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('lengthRequired()', function () {
-
-    it('returns a 411 error statusCode', function (done) {
-
-        expect(Boom.lengthRequired().output.statusCode).to.equal(411);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.lengthRequired('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('preconditionFailed()', function () {
-
-    it('returns a 412 error statusCode', function (done) {
-
-        expect(Boom.preconditionFailed().output.statusCode).to.equal(412);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.preconditionFailed('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('entityTooLarge()', function () {
-
-    it('returns a 413 error statusCode', function (done) {
-
-        expect(Boom.entityTooLarge().output.statusCode).to.equal(413);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.entityTooLarge('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('uriTooLong()', function () {
-
-    it('returns a 414 error statusCode', function (done) {
-
-        expect(Boom.uriTooLong().output.statusCode).to.equal(414);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.uriTooLong('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('unsupportedMediaType()', function () {
-
-    it('returns a 415 error statusCode', function (done) {
-
-        expect(Boom.unsupportedMediaType().output.statusCode).to.equal(415);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.unsupportedMediaType('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('rangeNotSatisfiable()', function () {
-
-    it('returns a 416 error statusCode', function (done) {
-
-        expect(Boom.rangeNotSatisfiable().output.statusCode).to.equal(416);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.rangeNotSatisfiable('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('expectationFailed()', function () {
-
-    it('returns a 417 error statusCode', function (done) {
-
-        expect(Boom.expectationFailed().output.statusCode).to.equal(417);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.expectationFailed('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('badData()', function () {
-
-    it('returns a 422 error statusCode', function (done) {
-
-        expect(Boom.badData().output.statusCode).to.equal(422);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.badData('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('preconditionRequired()', function () {
-
-    it('returns a 428 error statusCode', function (done) {
-
-        expect(Boom.preconditionRequired().output.statusCode).to.equal(428);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.preconditionRequired('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('tooManyRequests()', function () {
-
-    it('returns a 429 error statusCode', function (done) {
-
-        expect(Boom.tooManyRequests().output.statusCode).to.equal(429);
-        done();
-    });
-
-    it('sets the message with the passed-in message', function (done) {
-
-        expect(Boom.tooManyRequests('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-describe('serverTimeout()', function () {
-
-    it('returns a 503 error statusCode', function (done) {
-
-        expect(Boom.serverTimeout().output.statusCode).to.equal(503);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.serverTimeout('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-describe('forbidden()', function () {
-
-    it('returns a 403 error statusCode', function (done) {
-
-        expect(Boom.forbidden().output.statusCode).to.equal(403);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.forbidden('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-describe('notFound()', function () {
-
-    it('returns a 404 error statusCode', function (done) {
-
-        expect(Boom.notFound().output.statusCode).to.equal(404);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.notFound('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-describe('internal()', function () {
-
-    it('returns a 500 error statusCode', function (done) {
-
-        expect(Boom.internal().output.statusCode).to.equal(500);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        var err = Boom.internal('my message');
-        expect(err.message).to.equal('my message');
-        expect(err.isServer).to.true();
-        expect(err.output.payload.message).to.equal('An internal server error occurred');
-        done();
-    });
-
-    it('passes data on the callback if its passed in', function (done) {
-
-        expect(Boom.internal('my message', { my: 'data' }).data.my).to.equal('data');
-        done();
-    });
-
-    it('returns an error with composite message', function (done) {
-
-        try {
-            JSON.parse('{');
-        }
-        catch (err) {
-            var boom = Boom.internal('Someting bad', err);
-            expect(boom.message).to.equal('Someting bad: Unexpected end of input');
-            expect(boom.isServer).to.be.true();
-            done();
-        }
-    });
-});
-
-describe('notImplemented()', function () {
-
-    it('returns a 501 error statusCode', function (done) {
-
-        expect(Boom.notImplemented().output.statusCode).to.equal(501);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.notImplemented('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-
-describe('badGateway()', function () {
-
-    it('returns a 502 error statusCode', function (done) {
-
-        expect(Boom.badGateway().output.statusCode).to.equal(502);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.badGateway('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-describe('gatewayTimeout()', function () {
-
-    it('returns a 504 error statusCode', function (done) {
-
-        expect(Boom.gatewayTimeout().output.statusCode).to.equal(504);
-        done();
-    });
-
-    it('sets the message with the passed in message', function (done) {
-
-        expect(Boom.gatewayTimeout('my message').message).to.equal('my message');
-        done();
-    });
-});
-
-describe('badImplementation()', function () {
-
-    it('returns a 500 error statusCode', function (done) {
-
-        var err = Boom.badImplementation();
-        expect(err.output.statusCode).to.equal(500);
-        expect(err.isDeveloperError).to.equal(true);
-        expect(err.isServer).to.be.true();
-        done();
-    });
-});
-
-describe('stack trace', function () {
-
-    it('should omit lib', function (done) {
-
-        ['badRequest', 'unauthorized', 'forbidden', 'notFound', 'methodNotAllowed',
-            'notAcceptable', 'proxyAuthRequired', 'clientTimeout', 'conflict',
-            'resourceGone', 'lengthRequired', 'preconditionFailed', 'entityTooLarge',
-            'uriTooLong', 'unsupportedMediaType', 'rangeNotSatisfiable', 'expectationFailed',
-            'badData', 'preconditionRequired', 'tooManyRequests',
-
-            // 500s
-            'internal', 'notImplemented', 'badGateway', 'serverTimeout', 'gatewayTimeout',
-            'badImplementation'
-        ].forEach(function (name) {
-
-            var err = Boom[name]();
-            expect(err.stack).to.not.match(/\/lib\/index\.js/);
-        });
-
-        done();
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore
deleted file mode 100644
index b3bb51763052d2523f4d9fa6148084ea19d95a67..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/.npmignore
+++ /dev/null
@@ -1,18 +0,0 @@
-.idea
-*.iml
-npm-debug.log
-dump.rdb
-node_modules
-results.tap
-results.xml
-npm-shrinkwrap.json
-config.json
-.DS_Store
-*/.DS_Store
-*/*/.DS_Store
-._*
-*/._*
-*/*/._*
-coverage.*
-lib-cov
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml
deleted file mode 100755
index 4d8269258d0d722b75931e269785f7fc36e40b7b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/.travis.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-language: node_js
-
-node_js:
-  - 0.10
-  - 4.0
-
-sudo: false
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/LICENSE
deleted file mode 100755
index cda44736af05da7b3ed74cf6b3b172f8bd357d11..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/LICENSE
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (c) 2014, Eran Hammer and other contributors.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * The names of any contributors may not be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-                                  *   *   *
-
-The complete list of contributors can be found at: https://github.com/hueniverse/cryptiles/graphs/contributors
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/README.md
deleted file mode 100644
index 40083050171f73c3c8b397d770a803fe34f57538..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-cryptiles
-=========
-
-General purpose crypto utilities
-
-[![Build Status](https://secure.travis-ci.org/hapijs/cryptiles.png)](http://travis-ci.org/hapijs/cryptiles)
-
-Lead Maintainer - [C J Silverio](https://github.com/ceejbot)
-
-## Methods
-
-### `randomString(<Number> size)`
-Returns a cryptographically strong pseudo-random data string. Takes a size argument for the length of the string.
-
-### `fixedTimeComparison(<String> a, <String> b)`
-Compare two strings using fixed time algorithm (to prevent time-based analysis of MAC digest match). Returns `true` if the strings match, `false` if they differ.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js
deleted file mode 100755
index f385870ee68e3a17f8cfc99f08131482d1c9dfea..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/lib/index.js
+++ /dev/null
@@ -1,68 +0,0 @@
-// Load modules
-
-var Crypto = require('crypto');
-var Boom = require('boom');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Generate a cryptographically strong pseudo-random data
-
-exports.randomString = function (size) {
-
-    var buffer = exports.randomBits((size + 1) * 6);
-    if (buffer instanceof Error) {
-        return buffer;
-    }
-
-    var string = buffer.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');
-    return string.slice(0, size);
-};
-
-
-exports.randomBits = function (bits) {
-
-    if (!bits ||
-        bits < 0) {
-
-        return Boom.internal('Invalid random bits count');
-    }
-
-    var bytes = Math.ceil(bits / 8);
-    try {
-        return Crypto.randomBytes(bytes);
-    }
-    catch (err) {
-        return Boom.internal('Failed generating random bits: ' + err.message);
-    }
-};
-
-
-// Compare two strings using fixed time algorithm (to prevent time-based analysis of MAC digest match)
-
-exports.fixedTimeComparison = function (a, b) {
-
-    if (typeof a !== 'string' ||
-        typeof b !== 'string') {
-
-        return false;
-    }
-
-    var mismatch = (a.length === b.length ? 0 : 1);
-    if (mismatch) {
-        b = a;
-    }
-
-    for (var i = 0, il = a.length; i < il; ++i) {
-        var ac = a.charCodeAt(i);
-        var bc = b.charCodeAt(i);
-        mismatch |= (ac ^ bc);
-    }
-
-    return (mismatch === 0);
-};
-
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json
deleted file mode 100644
index 8046c4f8f14b30887791278f514b4e43781d2da3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/package.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-  "_from": "cryptiles@>=2.0.0 <3.0.0",
-  "_id": "cryptiles@2.0.5",
-  "_location": "/serialport/node-pre-gyp/request/hawk/cryptiles",
-  "_nodeVersion": "4.0.0",
-  "_npmUser": {
-    "email": "eran@hammer.io",
-    "name": "hueniverse"
-  },
-  "_npmVersion": "2.14.2",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/hawk"
-  ],
-  "_resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
-  "_shasum": "3bdfecdc608147c1c67202fa291e7dca59eaa3b8",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/hapijs/cryptiles/issues"
-  },
-  "dependencies": {
-    "boom": "2.x.x"
-  },
-  "description": "General purpose crypto utilities",
-  "devDependencies": {
-    "code": "1.x.x",
-    "lab": "5.x.x"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "3bdfecdc608147c1c67202fa291e7dca59eaa3b8",
-    "tarball": "http://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz"
-  },
-  "engines": {
-    "node": ">=0.10.40"
-  },
-  "gitHead": "9bc5a852f01cd51e615814e1cb255fe2df810649",
-  "homepage": "https://github.com/hapijs/cryptiles#readme",
-  "keywords": [
-    "cryptography",
-    "security",
-    "utilites"
-  ],
-  "license": "BSD-3-Clause",
-  "main": "lib/index.js",
-  "maintainers": [
-    {
-      "name": "hueniverse",
-      "email": "eran@hueniverse.com"
-    },
-    {
-      "name": "ceejbot",
-      "email": "ceejceej@gmail.com"
-    }
-  ],
-  "name": "cryptiles",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/hapijs/cryptiles.git"
-  },
-  "scripts": {
-    "test": "lab -a code -t 100 -L",
-    "test-cov-html": "lab -a code -r html -o coverage.html"
-  },
-  "version": "2.0.5"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/test/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/test/index.js
deleted file mode 100755
index 170393f9b5b77f99f27b02605af3bfa07fb87d42..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/cryptiles/test/index.js
+++ /dev/null
@@ -1,102 +0,0 @@
-// Load modules
-
-var Code = require('code');
-var Cryptiles = require('..');
-var Lab = require('lab');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.describe;
-var it = lab.it;
-var expect = Code.expect;
-
-
-describe('randomString()', function () {
-
-    it('should generate the right length string', function (done) {
-
-        for (var i = 1; i <= 1000; ++i) {
-            expect(Cryptiles.randomString(i).length).to.equal(i);
-        }
-
-        done();
-    });
-
-    it('returns an error on invalid bits size', function (done) {
-
-        expect(Cryptiles.randomString(99999999999999999999).message).to.match(/Failed generating random bits/);
-        done();
-    });
-});
-
-describe('randomBits()', function () {
-
-    it('returns an error on invalid input', function (done) {
-
-        expect(Cryptiles.randomBits(0).message).to.equal('Invalid random bits count');
-        done();
-    });
-});
-
-describe('fixedTimeComparison()', function () {
-
-    var a = Cryptiles.randomString(50000);
-    var b = Cryptiles.randomString(150000);
-
-    it('should take the same amount of time comparing different string sizes', function (done) {
-
-        var now = Date.now();
-        Cryptiles.fixedTimeComparison(b, a);
-        var t1 = Date.now() - now;
-
-        now = Date.now();
-        Cryptiles.fixedTimeComparison(b, b);
-        var t2 = Date.now() - now;
-
-        expect(t2 - t1).to.be.within(-20, 20);
-        done();
-    });
-
-    it('should return true for equal strings', function (done) {
-
-        expect(Cryptiles.fixedTimeComparison(a, a)).to.equal(true);
-        done();
-    });
-
-    it('should return false for different strings (size, a < b)', function (done) {
-
-        expect(Cryptiles.fixedTimeComparison(a, a + 'x')).to.equal(false);
-        done();
-    });
-
-    it('should return false for different strings (size, a > b)', function (done) {
-
-        expect(Cryptiles.fixedTimeComparison(a + 'x', a)).to.equal(false);
-        done();
-    });
-
-    it('should return false for different strings (size, a = b)', function (done) {
-
-        expect(Cryptiles.fixedTimeComparison(a + 'x', a + 'y')).to.equal(false);
-        done();
-    });
-
-    it('should return false when not a string', function (done) {
-
-        expect(Cryptiles.fixedTimeComparison('x', null)).to.equal(false);
-        done();
-    });
-
-    it('should return false when not a string (left)', function (done) {
-
-        expect(Cryptiles.fixedTimeComparison(null, 'x')).to.equal(false);
-        done();
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/.npmignore
deleted file mode 100644
index 7e1574dc5c3c81d41c152e95b3c538613e69f19f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/.npmignore
+++ /dev/null
@@ -1,18 +0,0 @@
-.idea
-*.iml
-npm-debug.log
-dump.rdb
-node_modules
-results.tap
-results.xml
-npm-shrinkwrap.json
-config.json
-.DS_Store
-*/.DS_Store
-*/*/.DS_Store
-._*
-*/._*
-*/*/._*
-coverage.*
-lib-cov
-complexity.md
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/.travis.yml
deleted file mode 100644
index 7a64dd2210cb10d8cbe178cebf5f9adf59380d2f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: node_js
-
-node_js:
-  - 0.10
-  - 4.0
-
-sudo: false
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/CONTRIBUTING.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/CONTRIBUTING.md
deleted file mode 100644
index 892836159ba3c787e7502ce70ed9c5ffe5f9d023..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/CONTRIBUTING.md
+++ /dev/null
@@ -1 +0,0 @@
-Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md).
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/LICENSE
deleted file mode 100644
index 5530904255022c91f7bc5e09b0aa3dc0307d451d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/LICENSE
+++ /dev/null
@@ -1,31 +0,0 @@
-Copyright (c) 2011-2014, Walmart and other contributors.
-Copyright (c) 2011, Yahoo Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * The names of any contributors may not be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-                                  *   *   *
-
-The complete list of contributors can be found at: https://github.com/hapijs/hapi/graphs/contributors
-Portions of this project were initially based on the Yahoo! Inc. Postmile project,
-published at https://github.com/yahoo/postmile.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/README.md
deleted file mode 100644
index 92c4912c7e7c6c231d76fbcec3e0573f2ba41fd9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/README.md
+++ /dev/null
@@ -1,584 +0,0 @@
-![hoek Logo](https://raw.github.com/hapijs/hoek/master/images/hoek.png)
-
-Utility methods for the hapi ecosystem. This module is not intended to solve every problem for everyone, but rather as a central place to store hapi-specific methods. If you're looking for a general purpose utility module, check out [lodash](https://github.com/lodash/lodash) or [underscore](https://github.com/jashkenas/underscore).
-
-[![Build Status](https://secure.travis-ci.org/hapijs/hoek.svg)](http://travis-ci.org/hapijs/hoek)
-
-Lead Maintainer: [Nathan LaFreniere](https://github.com/nlf)
-
-# Table of Contents
-
-* [Introduction](#introduction "Introduction")
-* [Object](#object "Object")
-  * [clone](#cloneobj "clone")
-  * [cloneWithShallow](#clonewithshallowobj-keys "cloneWithShallow")
-  * [merge](#mergetarget-source-isnulloverride-ismergearrays "merge")
-  * [applyToDefaults](#applytodefaultsdefaults-options-isnulloverride "applyToDefaults")
-  * [applyToDefaultsWithShallow](#applytodefaultswithshallowdefaults-options-keys "applyToDefaultsWithShallow")
-  * [deepEqual](#deepequala-b "deepEqual")
-  * [unique](#uniquearray-key "unique")
-  * [mapToObject](#maptoobjectarray-key "mapToObject")
-  * [intersect](#intersectarray1-array2 "intersect")
-  * [contain](#containref-values-options "contain")
-  * [flatten](#flattenarray-target "flatten")
-  * [reach](#reachobj-chain-options "reach")
-  * [reachTemplate](#reachtemplateobj-template-options "reachTemplate")
-  * [transform](#transformobj-transform-options "transform")
-  * [shallow](#shallowobj "shallow")
-  * [stringify](#stringifyobj "stringify")
-* [Timer](#timer "Timer")
-* [Bench](#bench "Bench")
-* [Binary Encoding/Decoding](#binary-encodingdecoding "Binary Encoding/Decoding")
-  * [base64urlEncode](#base64urlencodevalue "binary64urlEncode")
-  * [base64urlDecode](#base64urldecodevalue "binary64urlDecode")
-* [Escaping Characters](#escaping-characters "Escaping Characters")
-  * [escapeHtml](#escapehtmlstring "escapeHtml")
-  * [escapeHeaderAttribute](#escapeheaderattributeattribute "escapeHeaderAttribute")
-  * [escapeRegex](#escaperegexstring "escapeRegex")
-* [Errors](#errors "Errors")
-  * [assert](#assertcondition-message "assert")
-  * [abort](#abortmessage "abort")
-  * [displayStack](#displaystackslice "displayStack")
-  * [callStack](#callstackslice "callStack")
-* [Function](#function "Function")
-  * [nextTick](#nexttickfn "nextTick")
-  * [once](#oncefn "once")
-  * [ignore](#ignore "ignore")
-* [Miscellaneous](#miscellaneous "Miscellaneous")
-  * [uniqueFilename](#uniquefilenamepath-extension "uniqueFilename")
-  * [isAbsolutePath](#isabsolutepathpath-platform "isAbsolutePath")
-  * [isInteger](#isintegervalue "isInteger")
-
-
-
-# Introduction
-
-The *Hoek* library contains some common functions used within the hapi ecosystem. It comes with useful methods for Arrays (clone, merge, applyToDefaults), Objects (removeKeys, copy), Asserting and more.
-
-For example, to use Hoek to set configuration with default options:
-```javascript
-var Hoek = require('hoek');
-
-var default = {url : "www.github.com", port : "8000", debug : true};
-
-var config = Hoek.applyToDefaults(default, {port : "3000", admin : true});
-
-// In this case, config would be { url: 'www.github.com', port: '3000', debug: true, admin: true }
-```
-
-Under each of the sections (such as Array), there are subsections which correspond to Hoek methods. Each subsection will explain how to use the corresponding method. In each js excerpt below, the `var Hoek = require('hoek');` is omitted for brevity.
-
-## Object
-
-Hoek provides several helpful methods for objects and arrays.
-
-### clone(obj)
-
-This method is used to clone an object or an array. A *deep copy* is made (duplicates everything, including values that are objects, as well as non-enumerable properties).
-
-```javascript
-
-var nestedObj = {
-        w: /^something$/ig,
-        x: {
-            a: [1, 2, 3],
-            b: 123456,
-            c: new Date()
-        },
-        y: 'y',
-        z: new Date()
-    };
-
-var copy = Hoek.clone(nestedObj);
-
-copy.x.b = 100;
-
-console.log(copy.y);        // results in 'y'
-console.log(nestedObj.x.b); // results in 123456
-console.log(copy.x.b);      // results in 100
-```
-
-### cloneWithShallow(obj, keys)
-keys is an array of key names to shallow copy
-
-This method is also used to clone an object or array, however any keys listed in the `keys` array are shallow copied while those not listed are deep copied.
-
-```javascript
-
-var nestedObj = {
-        w: /^something$/ig,
-        x: {
-            a: [1, 2, 3],
-            b: 123456,
-            c: new Date()
-        },
-        y: 'y',
-        z: new Date()
-    };
-
-var copy = Hoek.cloneWithShallow(nestedObj, ['x']);
-
-copy.x.b = 100;
-
-console.log(copy.y);        // results in 'y'
-console.log(nestedObj.x.b); // results in 100
-console.log(copy.x.b);      // results in 100
-```
-
-### merge(target, source, isNullOverride, isMergeArrays)
-isNullOverride, isMergeArrays default to true
-
-Merge all the properties of source into target, source wins in conflict, and by default null and undefined from source are applied.
-Merge is destructive where the target is modified. For non destructive merge, use `applyToDefaults`.
-
-
-```javascript
-
-var target = {a: 1, b : 2};
-var source = {a: 0, c: 5};
-var source2 = {a: null, c: 5};
-
-Hoek.merge(target, source);         // results in {a: 0, b: 2, c: 5}
-Hoek.merge(target, source2);        // results in {a: null, b: 2, c: 5}
-Hoek.merge(target, source2, false); // results in {a: 1, b: 2, c: 5}
-
-var targetArray = [1, 2, 3];
-var sourceArray = [4, 5];
-
-Hoek.merge(targetArray, sourceArray);              // results in [1, 2, 3, 4, 5]
-Hoek.merge(targetArray, sourceArray, true, false); // results in [4, 5]
-```
-
-### applyToDefaults(defaults, options, isNullOverride)
-isNullOverride defaults to false
-
-Apply options to a copy of the defaults
-
-```javascript
-
-var defaults = { host: "localhost", port: 8000 };
-var options = { port: 8080 };
-
-var config = Hoek.applyToDefaults(defaults, options); // results in { host: "localhost", port: 8080 }
-```
-
-Apply options with a null value to a copy of the defaults
-
-```javascript
-
-var defaults = { host: "localhost", port: 8000 };
-var options = { host: null, port: 8080 };
-
-var config = Hoek.applyToDefaults(defaults, options, true); // results in { host: null, port: 8080 }
-```
-
-### applyToDefaultsWithShallow(defaults, options, keys)
-keys is an array of key names to shallow copy
-
-Apply options to a copy of the defaults. Keys specified in the last parameter are shallow copied from options instead of merged.
-
-```javascript
-
-var defaults = {
-        server: {
-            host: "localhost",
-            port: 8000
-        },
-        name: 'example'
-    };
-
-var options = { server: { port: 8080 } };
-
-var config = Hoek.applyToDefaultsWithShallow(defaults, options, ['server']); // results in { server: { port: 8080 }, name: 'example' }
-```
-
-### deepEqual(b, a, [options])
-
-Performs a deep comparison of the two values including support for circular dependencies, prototype, and properties. To skip prototype comparisons, use `options.prototype = false`
-
-```javascript
-Hoek.deepEqual({ a: [1, 2], b: 'string', c: { d: true } }, { a: [1, 2], b: 'string', c: { d: true } }); //results in true
-Hoek.deepEqual(Object.create(null), {}, { prototype: false }); //results in true
-Hoek.deepEqual(Object.create(null), {}); //results in false
-```
-
-### unique(array, key)
-
-Remove duplicate items from Array
-
-```javascript
-
-var array = [1, 2, 2, 3, 3, 4, 5, 6];
-
-var newArray = Hoek.unique(array);    // results in [1,2,3,4,5,6]
-
-array = [{id: 1}, {id: 1}, {id: 2}];
-
-newArray = Hoek.unique(array, "id");  // results in [{id: 1}, {id: 2}]
-```
-
-### mapToObject(array, key)
-
-Convert an Array into an Object
-
-```javascript
-
-var array = [1,2,3];
-var newObject = Hoek.mapToObject(array);   // results in [{"1": true}, {"2": true}, {"3": true}]
-
-array = [{id: 1}, {id: 2}];
-newObject = Hoek.mapToObject(array, "id"); // results in [{"id": 1}, {"id": 2}]
-```
-
-### intersect(array1, array2)
-
-Find the common unique items in two arrays
-
-```javascript
-
-var array1 = [1, 2, 3];
-var array2 = [1, 4, 5];
-
-var newArray = Hoek.intersect(array1, array2); // results in [1]
-```
-
-### contain(ref, values, [options])
-
-Tests if the reference value contains the provided values where:
-- `ref` - the reference string, array, or object.
-- `values` - a single or array of values to find within the `ref` value. If `ref` is an object, `values` can be a key name,
-  an array of key names, or an object with key-value pairs to compare.
-- `options` - an optional object with the following optional settings:
-    - `deep` - if `true`, performed a deep comparison of the values.
-    - `once` - if `true`, allows only one occurrence of each value.
-    - `only` - if `true`, does not allow values not explicitly listed.
-    - `part` - if `true`, allows partial match of the values (at least one must always match).
-
-Note: comparing a string to overlapping values will result in failed comparison (e.g. `contain('abc', ['ab', 'bc'])`).
-Also, if an object key's value does not match the provided value, `false` is returned even when `part` is specified.
-
-```javascript
-Hoek.contain('aaa', 'a', { only: true });							// true
-Hoek.contain([{ a: 1 }], [{ a: 1 }], { deep: true });				// true
-Hoek.contain([1, 2, 2], [1, 2], { once: true });					// false
-Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 4 }, { part: true }); // true
-```
-
-### flatten(array, [target])
-
-Flatten an array
-
-```javascript
-
-var array = [1, [2, 3]];
-
-var flattenedArray = Hoek.flatten(array); // results in [1, 2, 3]
-
-array = [1, [2, 3]];
-target = [4, [5]];
-
-flattenedArray = Hoek.flatten(array, target); // results in [4, [5], 1, 2, 3]
-```
-
-### reach(obj, chain, [options])
-
-Converts an object key chain string to reference
-
-- `options` - optional settings
-    - `separator` - string to split chain path on, defaults to '.'
-    - `default` - value to return if the path or value is not present, default is `undefined`
-    - `strict` - if `true`, will throw an error on missing member, default is `false`
-    - `functions` - if `true` allow traversing functions for properties. `false` will throw an error if a function is part of the chain.
-
-A chain including negative numbers will work like negative indices on an
-array.
-
-If chain is `null`, `undefined` or `false`, the object itself will be returned.
-
-```javascript
-
-var chain = 'a.b.c';
-var obj = {a : {b : { c : 1}}};
-
-Hoek.reach(obj, chain); // returns 1
-
-var chain = 'a.b.-1';
-var obj = {a : {b : [2,3,6]}};
-
-Hoek.reach(obj, chain); // returns 6
-```
-
-### reachTemplate(obj, template, [options])
-
-Replaces string parameters (`{name}`) with their corresponding object key values by applying the
-(`reach()`)[#reachobj-chain-options] method where:
-
-- `obj` - the context object used for key lookup.
-- `template` - a string containing `{}` parameters.
-- `options` - optional (`reach()`)[#reachobj-chain-options] options.
-
-```javascript
-
-var chain = 'a.b.c';
-var obj = {a : {b : { c : 1}}};
-
-Hoek.reachTemplate(obj, '1+{a.b.c}=2'); // returns '1+1=2'
-```
-
-### transform(obj, transform, [options])
-
-Transforms an existing object into a new one based on the supplied `obj` and `transform` map. `options` are the same as the `reach` options. The first argument can also be an array of objects. In that case the method will return an array of transformed objects.
-
-```javascript
-var source = {
-    address: {
-        one: '123 main street',
-        two: 'PO Box 1234'
-    },
-    title: 'Warehouse',
-    state: 'CA'
-};
-
-var result = Hoek.transform(source, {
-    'person.address.lineOne': 'address.one',
-    'person.address.lineTwo': 'address.two',
-    'title': 'title',
-    'person.address.region': 'state'
-});
-// Results in
-// {
-//     person: {
-//         address: {
-//             lineOne: '123 main street',
-//             lineTwo: 'PO Box 1234',
-//             region: 'CA'
-//         }
-//     },
-//     title: 'Warehouse'
-// }
-```
-
-### shallow(obj)
-
-Performs a shallow copy by copying the references of all the top level children where:
-- `obj` - the object to be copied.
-
-```javascript
-var shallow = Hoek.shallow({ a: { b: 1 } });
-```
-
-### stringify(obj)
-
-Converts an object to string using the built-in `JSON.stringify()` method with the difference that any errors are caught
-and reported back in the form of the returned string. Used as a shortcut for displaying information to the console (e.g. in
-error message) without the need to worry about invalid conversion.
-
-```javascript
-var a = {};
-a.b = a;
-Hoek.stringify(a);		// Returns '[Cannot display object: Converting circular structure to JSON]'
-```
-
-# Timer
-
-A Timer object. Initializing a new timer object sets the ts to the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.
-
-```javascript
-
-var timerObj = new Hoek.Timer();
-console.log("Time is now: " + timerObj.ts);
-console.log("Elapsed time from initialization: " + timerObj.elapsed() + 'milliseconds');
-```
-
-
-# Bench
-
-Same as Timer with the exception that `ts` stores the internal node clock which is not related to `Date.now()` and cannot be used to display
-human-readable timestamps. More accurate for benchmarking or internal timers.
-
-# Binary Encoding/Decoding
-
-### base64urlEncode(value)
-
-Encodes value in Base64 or URL encoding
-
-### base64urlDecode(value)
-
-Decodes data in Base64 or URL encoding.
-# Escaping Characters
-
-Hoek provides convenient methods for escaping html characters. The escaped characters are as followed:
-
-```javascript
-
-internals.htmlEscaped = {
-    '&': '&amp;',
-    '<': '&lt;',
-    '>': '&gt;',
-    '"': '&quot;',
-    "'": '&#x27;',
-    '`': '&#x60;'
-};
-```
-
-### escapeHtml(string)
-
-```javascript
-
-var string = '<html> hey </html>';
-var escapedString = Hoek.escapeHtml(string); // returns &lt;html&gt; hey &lt;/html&gt;
-```
-
-### escapeHeaderAttribute(attribute)
-
-Escape attribute value for use in HTTP header
-
-```javascript
-
-var a = Hoek.escapeHeaderAttribute('I said "go w\\o me"');  //returns I said \"go w\\o me\"
-```
-
-
-### escapeRegex(string)
-
-Escape string for Regex construction
-
-```javascript
-
-var a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\/`"(>)[<]d{}s,');  // returns 4\^f\$s\.4\*5\+\-_\?%\=#\!\:@\|~\\\/`"\(>\)\[<\]d\{\}s\,
-```
-
-# Errors
-
-### assert(condition, message)
-
-```javascript
-
-var a = 1, b = 2;
-
-Hoek.assert(a === b, 'a should equal b');  // Throws 'a should equal b'
-```
-
-Note that you may also pass an already created Error object as the second parameter, and `assert` will throw that object.
-
-```javascript
-
-var a = 1, b = 2;
-
-Hoek.assert(a === b, new Error('a should equal b')); // Throws the given error object
-```
-
-### abort(message)
-
-First checks if `process.env.NODE_ENV === 'test'`, and if so, throws error message. Otherwise,
-displays most recent stack and then exits process.
-
-
-
-### displayStack(slice)
-
-Displays the trace stack
-
-```javascript
-
-var stack = Hoek.displayStack();
-console.log(stack); // returns something like:
-
-[ 'null (/Users/user/Desktop/hoek/test.js:4:18)',
-  'Module._compile (module.js:449:26)',
-  'Module._extensions..js (module.js:467:10)',
-  'Module.load (module.js:356:32)',
-  'Module._load (module.js:312:12)',
-  'Module.runMain (module.js:492:10)',
-  'startup.processNextTick.process._tickCallback (node.js:244:9)' ]
-```
-
-### callStack(slice)
-
-Returns a trace stack array.
-
-```javascript
-
-var stack = Hoek.callStack();
-console.log(stack);  // returns something like:
-
-[ [ '/Users/user/Desktop/hoek/test.js', 4, 18, null, false ],
-  [ 'module.js', 449, 26, 'Module._compile', false ],
-  [ 'module.js', 467, 10, 'Module._extensions..js', false ],
-  [ 'module.js', 356, 32, 'Module.load', false ],
-  [ 'module.js', 312, 12, 'Module._load', false ],
-  [ 'module.js', 492, 10, 'Module.runMain', false ],
-  [ 'node.js',
-    244,
-    9,
-    'startup.processNextTick.process._tickCallback',
-    false ] ]
-```
-
-## Function
-
-### nextTick(fn)
-
-Returns a new function that wraps `fn` in `process.nextTick`.
-
-```javascript
-
-var myFn = function () {
-    console.log('Do this later');
-};
-
-var nextFn = Hoek.nextTick(myFn);
-
-nextFn();
-console.log('Do this first');
-
-// Results in:
-//
-// Do this first
-// Do this later
-```
-
-### once(fn)
-
-Returns a new function that can be run multiple times, but makes sure `fn` is only run once.
-
-```javascript
-
-var myFn = function () {
-    console.log('Ran myFn');
-};
-
-var onceFn = Hoek.once(myFn);
-onceFn(); // results in "Ran myFn"
-onceFn(); // results in undefined
-```
-
-### ignore
-
-A simple no-op function. It does nothing at all.
-
-## Miscellaneous
-
-### uniqueFilename(path, extension)
-`path` to prepend with the randomly generated file name. `extension` is the optional file extension, defaults to `''`.
-
-Returns a randomly generated file name at the specified `path`. The result is a fully resolved path to a file.
-
-```javascript
-var result = Hoek.uniqueFilename('./test/modules', 'txt'); // results in "full/path/test/modules/{random}.txt"
-```
-
-### isAbsolutePath(path, [platform])
-
-Determines whether `path` is an absolute path. Returns `true` or `false`.
-
-- `path` - A file path to test for whether it is absolute or not.
-- `platform` - An optional parameter used for specifying the platform. Defaults to `process.platform`.
-
-### isInteger(value)
-
-Check `value` to see if it is an integer.  Returns true/false.
-
-```javascript
-var result = Hoek.isInteger('23')
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/images/hoek.png b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/images/hoek.png
deleted file mode 100644
index 6ccfcb12be76a7a8331428c87337b20b901e869c..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/images/hoek.png and /dev/null differ
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js
deleted file mode 100644
index 9ecde6666b1263339b563df9a9ce177ba83600c6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/lib/escape.js
+++ /dev/null
@@ -1,132 +0,0 @@
-// Declare internals
-
-var internals = {};
-
-
-exports.escapeJavaScript = function (input) {
-
-    if (!input) {
-        return '';
-    }
-
-    var escaped = '';
-
-    for (var i = 0, il = input.length; i < il; ++i) {
-
-        var charCode = input.charCodeAt(i);
-
-        if (internals.isSafe(charCode)) {
-            escaped += input[i];
-        }
-        else {
-            escaped += internals.escapeJavaScriptChar(charCode);
-        }
-    }
-
-    return escaped;
-};
-
-
-exports.escapeHtml = function (input) {
-
-    if (!input) {
-        return '';
-    }
-
-    var escaped = '';
-
-    for (var i = 0, il = input.length; i < il; ++i) {
-
-        var charCode = input.charCodeAt(i);
-
-        if (internals.isSafe(charCode)) {
-            escaped += input[i];
-        }
-        else {
-            escaped += internals.escapeHtmlChar(charCode);
-        }
-    }
-
-    return escaped;
-};
-
-
-internals.escapeJavaScriptChar = function (charCode) {
-
-    if (charCode >= 256) {
-        return '\\u' + internals.padLeft('' + charCode, 4);
-    }
-
-    var hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex');
-    return '\\x' + internals.padLeft(hexValue, 2);
-};
-
-
-internals.escapeHtmlChar = function (charCode) {
-
-    var namedEscape = internals.namedHtml[charCode];
-    if (typeof namedEscape !== 'undefined') {
-        return namedEscape;
-    }
-
-    if (charCode >= 256) {
-        return '&#' + charCode + ';';
-    }
-
-    var hexValue = new Buffer(String.fromCharCode(charCode), 'ascii').toString('hex');
-    return '&#x' + internals.padLeft(hexValue, 2) + ';';
-};
-
-
-internals.padLeft = function (str, len) {
-
-    while (str.length < len) {
-        str = '0' + str;
-    }
-
-    return str;
-};
-
-
-internals.isSafe = function (charCode) {
-
-    return (typeof internals.safeCharCodes[charCode] !== 'undefined');
-};
-
-
-internals.namedHtml = {
-    '38': '&amp;',
-    '60': '&lt;',
-    '62': '&gt;',
-    '34': '&quot;',
-    '160': '&nbsp;',
-    '162': '&cent;',
-    '163': '&pound;',
-    '164': '&curren;',
-    '169': '&copy;',
-    '174': '&reg;'
-};
-
-
-internals.safeCharCodes = (function () {
-
-    var safe = {};
-
-    for (var i = 32; i < 123; ++i) {
-
-        if ((i >= 97) ||                    // a-z
-            (i >= 65 && i <= 90) ||         // A-Z
-            (i >= 48 && i <= 57) ||         // 0-9
-            i === 32 ||                     // space
-            i === 46 ||                     // .
-            i === 44 ||                     // ,
-            i === 45 ||                     // -
-            i === 58 ||                     // :
-            i === 95) {                     // _
-
-            safe[i] = null;
-        }
-    }
-
-    return safe;
-}());
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js
deleted file mode 100644
index 9a5ffe18f4cd1f7fd03bb2c8227a40705fc138dc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/lib/index.js
+++ /dev/null
@@ -1,993 +0,0 @@
-// Load modules
-
-var Crypto = require('crypto');
-var Path = require('path');
-var Util = require('util');
-var Escape = require('./escape');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Clone object or array
-
-exports.clone = function (obj, seen) {
-
-    if (typeof obj !== 'object' ||
-        obj === null) {
-
-        return obj;
-    }
-
-    seen = seen || { orig: [], copy: [] };
-
-    var lookup = seen.orig.indexOf(obj);
-    if (lookup !== -1) {
-        return seen.copy[lookup];
-    }
-
-    var newObj;
-    var cloneDeep = false;
-
-    if (!Array.isArray(obj)) {
-        if (Buffer.isBuffer(obj)) {
-            newObj = new Buffer(obj);
-        }
-        else if (obj instanceof Date) {
-            newObj = new Date(obj.getTime());
-        }
-        else if (obj instanceof RegExp) {
-            newObj = new RegExp(obj);
-        }
-        else {
-            var proto = Object.getPrototypeOf(obj);
-            if (proto &&
-                proto.isImmutable) {
-
-                newObj = obj;
-            }
-            else {
-                newObj = Object.create(proto);
-                cloneDeep = true;
-            }
-        }
-    }
-    else {
-        newObj = [];
-        cloneDeep = true;
-    }
-
-    seen.orig.push(obj);
-    seen.copy.push(newObj);
-
-    if (cloneDeep) {
-        var keys = Object.getOwnPropertyNames(obj);
-        for (var i = 0, il = keys.length; i < il; ++i) {
-            var key = keys[i];
-            var descriptor = Object.getOwnPropertyDescriptor(obj, key);
-            if (descriptor &&
-                (descriptor.get ||
-                 descriptor.set)) {
-
-                Object.defineProperty(newObj, key, descriptor);
-            }
-            else {
-                newObj[key] = exports.clone(obj[key], seen);
-            }
-        }
-    }
-
-    return newObj;
-};
-
-
-// Merge all the properties of source into target, source wins in conflict, and by default null and undefined from source are applied
-/*eslint-disable */
-exports.merge = function (target, source, isNullOverride /* = true */, isMergeArrays /* = true */) {
-/*eslint-enable */
-    exports.assert(target && typeof target === 'object', 'Invalid target value: must be an object');
-    exports.assert(source === null || source === undefined || typeof source === 'object', 'Invalid source value: must be null, undefined, or an object');
-
-    if (!source) {
-        return target;
-    }
-
-    if (Array.isArray(source)) {
-        exports.assert(Array.isArray(target), 'Cannot merge array onto an object');
-        if (isMergeArrays === false) {                                                  // isMergeArrays defaults to true
-            target.length = 0;                                                          // Must not change target assignment
-        }
-
-        for (var i = 0, il = source.length; i < il; ++i) {
-            target.push(exports.clone(source[i]));
-        }
-
-        return target;
-    }
-
-    var keys = Object.keys(source);
-    for (var k = 0, kl = keys.length; k < kl; ++k) {
-        var key = keys[k];
-        var value = source[key];
-        if (value &&
-            typeof value === 'object') {
-
-            if (!target[key] ||
-                typeof target[key] !== 'object' ||
-                (Array.isArray(target[key]) ^ Array.isArray(value)) ||
-                value instanceof Date ||
-                Buffer.isBuffer(value) ||
-                value instanceof RegExp) {
-
-                target[key] = exports.clone(value);
-            }
-            else {
-                exports.merge(target[key], value, isNullOverride, isMergeArrays);
-            }
-        }
-        else {
-            if (value !== null &&
-                value !== undefined) {                              // Explicit to preserve empty strings
-
-                target[key] = value;
-            }
-            else if (isNullOverride !== false) {                    // Defaults to true
-                target[key] = value;
-            }
-        }
-    }
-
-    return target;
-};
-
-
-// Apply options to a copy of the defaults
-
-exports.applyToDefaults = function (defaults, options, isNullOverride) {
-
-    exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object');
-    exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object');
-
-    if (!options) {                                                 // If no options, return null
-        return null;
-    }
-
-    var copy = exports.clone(defaults);
-
-    if (options === true) {                                         // If options is set to true, use defaults
-        return copy;
-    }
-
-    return exports.merge(copy, options, isNullOverride === true, false);
-};
-
-
-// Clone an object except for the listed keys which are shallow copied
-
-exports.cloneWithShallow = function (source, keys) {
-
-    if (!source ||
-        typeof source !== 'object') {
-
-        return source;
-    }
-
-    var storage = internals.store(source, keys);    // Move shallow copy items to storage
-    var copy = exports.clone(source);               // Deep copy the rest
-    internals.restore(copy, source, storage);       // Shallow copy the stored items and restore
-    return copy;
-};
-
-
-internals.store = function (source, keys) {
-
-    var storage = {};
-    for (var i = 0, il = keys.length; i < il; ++i) {
-        var key = keys[i];
-        var value = exports.reach(source, key);
-        if (value !== undefined) {
-            storage[key] = value;
-            internals.reachSet(source, key, undefined);
-        }
-    }
-
-    return storage;
-};
-
-
-internals.restore = function (copy, source, storage) {
-
-    var keys = Object.keys(storage);
-    for (var i = 0, il = keys.length; i < il; ++i) {
-        var key = keys[i];
-        internals.reachSet(copy, key, storage[key]);
-        internals.reachSet(source, key, storage[key]);
-    }
-};
-
-
-internals.reachSet = function (obj, key, value) {
-
-    var path = key.split('.');
-    var ref = obj;
-    for (var i = 0, il = path.length; i < il; ++i) {
-        var segment = path[i];
-        if (i + 1 === il) {
-            ref[segment] = value;
-        }
-
-        ref = ref[segment];
-    }
-};
-
-
-// Apply options to defaults except for the listed keys which are shallow copied from option without merging
-
-exports.applyToDefaultsWithShallow = function (defaults, options, keys) {
-
-    exports.assert(defaults && typeof defaults === 'object', 'Invalid defaults value: must be an object');
-    exports.assert(!options || options === true || typeof options === 'object', 'Invalid options value: must be true, falsy or an object');
-    exports.assert(keys && Array.isArray(keys), 'Invalid keys');
-
-    if (!options) {                                                 // If no options, return null
-        return null;
-    }
-
-    var copy = exports.cloneWithShallow(defaults, keys);
-
-    if (options === true) {                                         // If options is set to true, use defaults
-        return copy;
-    }
-
-    var storage = internals.store(options, keys);   // Move shallow copy items to storage
-    exports.merge(copy, options, false, false);     // Deep copy the rest
-    internals.restore(copy, options, storage);      // Shallow copy the stored items and restore
-    return copy;
-};
-
-
-// Deep object or array comparison
-
-exports.deepEqual = function (obj, ref, options, seen) {
-
-    options = options || { prototype: true };
-
-    var type = typeof obj;
-
-    if (type !== typeof ref) {
-        return false;
-    }
-
-    if (type !== 'object' ||
-        obj === null ||
-        ref === null) {
-
-        if (obj === ref) {                                                      // Copied from Deep-eql, copyright(c) 2013 Jake Luer, jake@alogicalparadox.com, MIT Licensed, https://github.com/chaijs/deep-eql
-            return obj !== 0 || 1 / obj === 1 / ref;        // -0 / +0
-        }
-
-        return obj !== obj && ref !== ref;                  // NaN
-    }
-
-    seen = seen || [];
-    if (seen.indexOf(obj) !== -1) {
-        return true;                            // If previous comparison failed, it would have stopped execution
-    }
-
-    seen.push(obj);
-
-    if (Array.isArray(obj)) {
-        if (!Array.isArray(ref)) {
-            return false;
-        }
-
-        if (!options.part && obj.length !== ref.length) {
-            return false;
-        }
-
-        for (var i = 0, il = obj.length; i < il; ++i) {
-            if (options.part) {
-                var found = false;
-                for (var r = 0, rl = ref.length; r < rl; ++r) {
-                    if (exports.deepEqual(obj[i], ref[r], options, seen)) {
-                        found = true;
-                        break;
-                    }
-                }
-
-                return found;
-            }
-
-            if (!exports.deepEqual(obj[i], ref[i], options, seen)) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    if (Buffer.isBuffer(obj)) {
-        if (!Buffer.isBuffer(ref)) {
-            return false;
-        }
-
-        if (obj.length !== ref.length) {
-            return false;
-        }
-
-        for (var j = 0, jl = obj.length; j < jl; ++j) {
-            if (obj[j] !== ref[j]) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    if (obj instanceof Date) {
-        return (ref instanceof Date && obj.getTime() === ref.getTime());
-    }
-
-    if (obj instanceof RegExp) {
-        return (ref instanceof RegExp && obj.toString() === ref.toString());
-    }
-
-    if (options.prototype) {
-        if (Object.getPrototypeOf(obj) !== Object.getPrototypeOf(ref)) {
-            return false;
-        }
-    }
-
-    var keys = Object.getOwnPropertyNames(obj);
-
-    if (!options.part && keys.length !== Object.getOwnPropertyNames(ref).length) {
-        return false;
-    }
-
-    for (var k = 0, kl = keys.length; k < kl; ++k) {
-        var key = keys[k];
-        var descriptor = Object.getOwnPropertyDescriptor(obj, key);
-        if (descriptor.get) {
-            if (!exports.deepEqual(descriptor, Object.getOwnPropertyDescriptor(ref, key), options, seen)) {
-                return false;
-            }
-        }
-        else if (!exports.deepEqual(obj[key], ref[key], options, seen)) {
-            return false;
-        }
-    }
-
-    return true;
-};
-
-
-// Remove duplicate items from array
-
-exports.unique = function (array, key) {
-
-    var index = {};
-    var result = [];
-
-    for (var i = 0, il = array.length; i < il; ++i) {
-        var id = (key ? array[i][key] : array[i]);
-        if (index[id] !== true) {
-
-            result.push(array[i]);
-            index[id] = true;
-        }
-    }
-
-    return result;
-};
-
-
-// Convert array into object
-
-exports.mapToObject = function (array, key) {
-
-    if (!array) {
-        return null;
-    }
-
-    var obj = {};
-    for (var i = 0, il = array.length; i < il; ++i) {
-        if (key) {
-            if (array[i][key]) {
-                obj[array[i][key]] = true;
-            }
-        }
-        else {
-            obj[array[i]] = true;
-        }
-    }
-
-    return obj;
-};
-
-
-// Find the common unique items in two arrays
-
-exports.intersect = function (array1, array2, justFirst) {
-
-    if (!array1 || !array2) {
-        return [];
-    }
-
-    var common = [];
-    var hash = (Array.isArray(array1) ? exports.mapToObject(array1) : array1);
-    var found = {};
-    for (var i = 0, il = array2.length; i < il; ++i) {
-        if (hash[array2[i]] && !found[array2[i]]) {
-            if (justFirst) {
-                return array2[i];
-            }
-
-            common.push(array2[i]);
-            found[array2[i]] = true;
-        }
-    }
-
-    return (justFirst ? null : common);
-};
-
-
-// Test if the reference contains the values
-
-exports.contain = function (ref, values, options) {
-
-    /*
-        string -> string(s)
-        array -> item(s)
-        object -> key(s)
-        object -> object (key:value)
-    */
-
-    var valuePairs = null;
-    if (typeof ref === 'object' &&
-        typeof values === 'object' &&
-        !Array.isArray(ref) &&
-        !Array.isArray(values)) {
-
-        valuePairs = values;
-        values = Object.keys(values);
-    }
-    else {
-        values = [].concat(values);
-    }
-
-    options = options || {};            // deep, once, only, part
-
-    exports.assert(arguments.length >= 2, 'Insufficient arguments');
-    exports.assert(typeof ref === 'string' || typeof ref === 'object', 'Reference must be string or an object');
-    exports.assert(values.length, 'Values array cannot be empty');
-
-    var compare, compareFlags;
-    if (options.deep) {
-        compare = exports.deepEqual;
-
-        var hasOnly = options.hasOwnProperty('only'), hasPart = options.hasOwnProperty('part');
-
-        compareFlags = {
-            prototype: hasOnly ? options.only : hasPart ? !options.part : false,
-            part: hasOnly ? !options.only : hasPart ? options.part : true
-        };
-    }
-    else {
-        compare = function (a, b) {
-
-            return a === b;
-        };
-    }
-
-    var misses = false;
-    var matches = new Array(values.length);
-    for (var i = 0, il = matches.length; i < il; ++i) {
-        matches[i] = 0;
-    }
-
-    if (typeof ref === 'string') {
-        var pattern = '(';
-        for (i = 0, il = values.length; i < il; ++i) {
-            var value = values[i];
-            exports.assert(typeof value === 'string', 'Cannot compare string reference to non-string value');
-            pattern += (i ? '|' : '') + exports.escapeRegex(value);
-        }
-
-        var regex = new RegExp(pattern + ')', 'g');
-        var leftovers = ref.replace(regex, function ($0, $1) {
-
-            var index = values.indexOf($1);
-            ++matches[index];
-            return '';          // Remove from string
-        });
-
-        misses = !!leftovers;
-    }
-    else if (Array.isArray(ref)) {
-        for (i = 0, il = ref.length; i < il; ++i) {
-            for (var j = 0, jl = values.length, matched = false; j < jl && matched === false; ++j) {
-                matched = compare(values[j], ref[i], compareFlags) && j;
-            }
-
-            if (matched !== false) {
-                ++matches[matched];
-            }
-            else {
-                misses = true;
-            }
-        }
-    }
-    else {
-        var keys = Object.keys(ref);
-        for (i = 0, il = keys.length; i < il; ++i) {
-            var key = keys[i];
-            var pos = values.indexOf(key);
-            if (pos !== -1) {
-                if (valuePairs &&
-                    !compare(valuePairs[key], ref[key], compareFlags)) {
-
-                    return false;
-                }
-
-                ++matches[pos];
-            }
-            else {
-                misses = true;
-            }
-        }
-    }
-
-    var result = false;
-    for (i = 0, il = matches.length; i < il; ++i) {
-        result = result || !!matches[i];
-        if ((options.once && matches[i] > 1) ||
-            (!options.part && !matches[i])) {
-
-            return false;
-        }
-    }
-
-    if (options.only &&
-        misses) {
-
-        return false;
-    }
-
-    return result;
-};
-
-
-// Flatten array
-
-exports.flatten = function (array, target) {
-
-    var result = target || [];
-
-    for (var i = 0, il = array.length; i < il; ++i) {
-        if (Array.isArray(array[i])) {
-            exports.flatten(array[i], result);
-        }
-        else {
-            result.push(array[i]);
-        }
-    }
-
-    return result;
-};
-
-
-// Convert an object key chain string ('a.b.c') to reference (object[a][b][c])
-
-exports.reach = function (obj, chain, options) {
-
-    if (chain === false ||
-        chain === null ||
-        typeof chain === 'undefined') {
-
-        return obj;
-    }
-
-    options = options || {};
-    if (typeof options === 'string') {
-        options = { separator: options };
-    }
-
-    var path = chain.split(options.separator || '.');
-    var ref = obj;
-    for (var i = 0, il = path.length; i < il; ++i) {
-        var key = path[i];
-        if (key[0] === '-' && Array.isArray(ref)) {
-            key = key.slice(1, key.length);
-            key = ref.length - key;
-        }
-
-        if (!ref ||
-            !ref.hasOwnProperty(key) ||
-            (typeof ref !== 'object' && options.functions === false)) {         // Only object and function can have properties
-
-            exports.assert(!options.strict || i + 1 === il, 'Missing segment', key, 'in reach path ', chain);
-            exports.assert(typeof ref === 'object' || options.functions === true || typeof ref !== 'function', 'Invalid segment', key, 'in reach path ', chain);
-            ref = options.default;
-            break;
-        }
-
-        ref = ref[key];
-    }
-
-    return ref;
-};
-
-
-exports.reachTemplate = function (obj, template, options) {
-
-    return template.replace(/{([^}]+)}/g, function ($0, chain) {
-
-        var value = exports.reach(obj, chain, options);
-        return (value === undefined || value === null ? '' : value);
-    });
-};
-
-
-exports.formatStack = function (stack) {
-
-    var trace = [];
-    for (var i = 0, il = stack.length; i < il; ++i) {
-        var item = stack[i];
-        trace.push([item.getFileName(), item.getLineNumber(), item.getColumnNumber(), item.getFunctionName(), item.isConstructor()]);
-    }
-
-    return trace;
-};
-
-
-exports.formatTrace = function (trace) {
-
-    var display = [];
-
-    for (var i = 0, il = trace.length; i < il; ++i) {
-        var row = trace[i];
-        display.push((row[4] ? 'new ' : '') + row[3] + ' (' + row[0] + ':' + row[1] + ':' + row[2] + ')');
-    }
-
-    return display;
-};
-
-
-exports.callStack = function (slice) {
-
-    // http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi
-
-    var v8 = Error.prepareStackTrace;
-    Error.prepareStackTrace = function (err, stack) {
-
-        return stack;
-    };
-
-    var capture = {};
-    Error.captureStackTrace(capture, arguments.callee);     /*eslint no-caller:0 */
-    var stack = capture.stack;
-
-    Error.prepareStackTrace = v8;
-
-    var trace = exports.formatStack(stack);
-
-    if (slice) {
-        return trace.slice(slice);
-    }
-
-    return trace;
-};
-
-
-exports.displayStack = function (slice) {
-
-    var trace = exports.callStack(slice === undefined ? 1 : slice + 1);
-
-    return exports.formatTrace(trace);
-};
-
-
-exports.abortThrow = false;
-
-
-exports.abort = function (message, hideStack) {
-
-    if (process.env.NODE_ENV === 'test' || exports.abortThrow === true) {
-        throw new Error(message || 'Unknown error');
-    }
-
-    var stack = '';
-    if (!hideStack) {
-        stack = exports.displayStack(1).join('\n\t');
-    }
-    console.log('ABORT: ' + message + '\n\t' + stack);
-    process.exit(1);
-};
-
-
-exports.assert = function (condition /*, msg1, msg2, msg3 */) {
-
-    if (condition) {
-        return;
-    }
-
-    if (arguments.length === 2 && arguments[1] instanceof Error) {
-        throw arguments[1];
-    }
-
-    var msgs = [];
-    for (var i = 1, il = arguments.length; i < il; ++i) {
-        if (arguments[i] !== '') {
-            msgs.push(arguments[i]);            // Avoids Array.slice arguments leak, allowing for V8 optimizations
-        }
-    }
-
-    msgs = msgs.map(function (msg) {
-
-        return typeof msg === 'string' ? msg : msg instanceof Error ? msg.message : exports.stringify(msg);
-    });
-    throw new Error(msgs.join(' ') || 'Unknown error');
-};
-
-
-exports.Timer = function () {
-
-    this.ts = 0;
-    this.reset();
-};
-
-
-exports.Timer.prototype.reset = function () {
-
-    this.ts = Date.now();
-};
-
-
-exports.Timer.prototype.elapsed = function () {
-
-    return Date.now() - this.ts;
-};
-
-
-exports.Bench = function () {
-
-    this.ts = 0;
-    this.reset();
-};
-
-
-exports.Bench.prototype.reset = function () {
-
-    this.ts = exports.Bench.now();
-};
-
-
-exports.Bench.prototype.elapsed = function () {
-
-    return exports.Bench.now() - this.ts;
-};
-
-
-exports.Bench.now = function () {
-
-    var ts = process.hrtime();
-    return (ts[0] * 1e3) + (ts[1] / 1e6);
-};
-
-
-// Escape string for Regex construction
-
-exports.escapeRegex = function (string) {
-
-    // Escape ^$.*+-?=!:|\/()[]{},
-    return string.replace(/[\^\$\.\*\+\-\?\=\!\:\|\\\/\(\)\[\]\{\}\,]/g, '\\$&');
-};
-
-
-// Base64url (RFC 4648) encode
-
-exports.base64urlEncode = function (value, encoding) {
-
-    var buf = (Buffer.isBuffer(value) ? value : new Buffer(value, encoding || 'binary'));
-    return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/\=/g, '');
-};
-
-
-// Base64url (RFC 4648) decode
-
-exports.base64urlDecode = function (value, encoding) {
-
-    if (value &&
-        !/^[\w\-]*$/.test(value)) {
-
-        return new Error('Invalid character');
-    }
-
-    try {
-        var buf = new Buffer(value, 'base64');
-        return (encoding === 'buffer' ? buf : buf.toString(encoding || 'binary'));
-    }
-    catch (err) {
-        return err;
-    }
-};
-
-
-// Escape attribute value for use in HTTP header
-
-exports.escapeHeaderAttribute = function (attribute) {
-
-    // Allowed value characters: !#$%&'()*+,-./:;<=>?@[]^_`{|}~ and space, a-z, A-Z, 0-9, \, "
-
-    exports.assert(/^[ \w\!#\$%&'\(\)\*\+,\-\.\/\:;<\=>\?@\[\]\^`\{\|\}~\"\\]*$/.test(attribute), 'Bad attribute value (' + attribute + ')');
-
-    return attribute.replace(/\\/g, '\\\\').replace(/\"/g, '\\"');                             // Escape quotes and slash
-};
-
-
-exports.escapeHtml = function (string) {
-
-    return Escape.escapeHtml(string);
-};
-
-
-exports.escapeJavaScript = function (string) {
-
-    return Escape.escapeJavaScript(string);
-};
-
-
-exports.nextTick = function (callback) {
-
-    return function () {
-
-        var args = arguments;
-        process.nextTick(function () {
-
-            callback.apply(null, args);
-        });
-    };
-};
-
-
-exports.once = function (method) {
-
-    if (method._hoekOnce) {
-        return method;
-    }
-
-    var once = false;
-    var wrapped = function () {
-
-        if (!once) {
-            once = true;
-            method.apply(null, arguments);
-        }
-    };
-
-    wrapped._hoekOnce = true;
-
-    return wrapped;
-};
-
-
-exports.isAbsolutePath = function (path, platform) {
-
-    if (!path) {
-        return false;
-    }
-
-    if (Path.isAbsolute) {                      // node >= 0.11
-        return Path.isAbsolute(path);
-    }
-
-    platform = platform || process.platform;
-
-    // Unix
-
-    if (platform !== 'win32') {
-        return path[0] === '/';
-    }
-
-    // Windows
-
-    return !!/^(?:[a-zA-Z]:[\\\/])|(?:[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/])/.test(path);        // C:\ or \\something\something
-};
-
-
-exports.isInteger = function (value) {
-
-    return (typeof value === 'number' &&
-            parseFloat(value) === parseInt(value, 10) &&
-            !isNaN(value));
-};
-
-
-exports.ignore = function () { };
-
-
-exports.inherits = Util.inherits;
-
-
-exports.format = Util.format;
-
-
-exports.transform = function (source, transform, options) {
-
-    exports.assert(source === null || source === undefined || typeof source === 'object' || Array.isArray(source), 'Invalid source object: must be null, undefined, an object, or an array');
-
-    if (Array.isArray(source)) {
-        var results = [];
-        for (var i = 0, il = source.length; i < il; ++i) {
-            results.push(exports.transform(source[i], transform, options));
-        }
-        return results;
-    }
-
-    var result = {};
-    var keys = Object.keys(transform);
-
-    for (var k = 0, kl = keys.length; k < kl; ++k) {
-        var key = keys[k];
-        var path = key.split('.');
-        var sourcePath = transform[key];
-
-        exports.assert(typeof sourcePath === 'string', 'All mappings must be "." delineated strings');
-
-        var segment;
-        var res = result;
-
-        while (path.length > 1) {
-            segment = path.shift();
-            if (!res[segment]) {
-                res[segment] = {};
-            }
-            res = res[segment];
-        }
-        segment = path.shift();
-        res[segment] = exports.reach(source, sourcePath, options);
-    }
-
-    return result;
-};
-
-
-exports.uniqueFilename = function (path, extension) {
-
-    if (extension) {
-        extension = extension[0] !== '.' ? '.' + extension : extension;
-    }
-    else {
-        extension = '';
-    }
-
-    path = Path.resolve(path);
-    var name = [Date.now(), process.pid, Crypto.randomBytes(8).toString('hex')].join('-') + extension;
-    return Path.join(path, name);
-};
-
-
-exports.stringify = function () {
-
-    try {
-        return JSON.stringify.apply(null, arguments);
-    }
-    catch (err) {
-        return '[Cannot display object: ' + err.message + ']';
-    }
-};
-
-
-exports.shallow = function (source) {
-
-    var target = {};
-    var keys = Object.keys(source);
-    for (var i = 0, il = keys.length; i < il; ++i) {
-        var key = keys[i];
-        target[key] = source[key];
-    }
-
-    return target;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/package.json
deleted file mode 100644
index f995ff0cb3502b87a547dc0170c4f386f16eb33f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/package.json
+++ /dev/null
@@ -1,70 +0,0 @@
-{
-  "_from": "hoek@>=2.0.0 <3.0.0",
-  "_id": "hoek@2.16.3",
-  "_location": "/serialport/node-pre-gyp/request/hawk/hoek",
-  "_nodeVersion": "4.1.0",
-  "_npmUser": {
-    "email": "quitlahok@gmail.com",
-    "name": "nlf"
-  },
-  "_npmVersion": "3.3.3",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/hawk",
-    "/serialport/node-pre-gyp/request/hawk/boom",
-    "/serialport/node-pre-gyp/request/hawk/sntp"
-  ],
-  "_resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
-  "_shasum": "20bb7403d3cea398e91dc4710a8ff1b8274a25ed",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/hapijs/hoek/issues"
-  },
-  "dependencies": {},
-  "description": "General purpose node utilities",
-  "devDependencies": {
-    "code": "1.x.x",
-    "lab": "5.x.x"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "20bb7403d3cea398e91dc4710a8ff1b8274a25ed",
-    "tarball": "http://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz"
-  },
-  "engines": {
-    "node": ">=0.10.40"
-  },
-  "gitHead": "20f36e85616264d4b73a64a374803175213a9121",
-  "homepage": "https://github.com/hapijs/hoek#readme",
-  "keywords": [
-    "utilities"
-  ],
-  "license": "BSD-3-Clause",
-  "main": "lib/index.js",
-  "maintainers": [
-    {
-      "name": "hueniverse",
-      "email": "eran@hueniverse.com"
-    },
-    {
-      "name": "wyatt",
-      "email": "wpreul@gmail.com"
-    },
-    {
-      "name": "nlf",
-      "email": "quitlahok@gmail.com"
-    }
-  ],
-  "name": "hoek",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/hapijs/hoek.git"
-  },
-  "scripts": {
-    "test": "lab -a code -t 100 -L",
-    "test-cov-html": "lab -a code -t 100 -L -r html -o coverage.html"
-  },
-  "version": "2.16.3"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/escaper.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/escaper.js
deleted file mode 100644
index a5d048f7bcbca3c4c436b442c523aff702909aaa..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/escaper.js
+++ /dev/null
@@ -1,88 +0,0 @@
-// Load modules
-
-var Code = require('code');
-var Hoek = require('../lib');
-var Lab = require('lab');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.experiment;
-var it = lab.test;
-var expect = Code.expect;
-
-
-describe('escapeJavaScript()', function () {
-
-    it('encodes / characters', function (done) {
-
-        var encoded = Hoek.escapeJavaScript('<script>alert(1)</script>');
-        expect(encoded).to.equal('\\x3cscript\\x3ealert\\x281\\x29\\x3c\\x2fscript\\x3e');
-        done();
-    });
-
-    it('encodes \' characters', function (done) {
-
-        var encoded = Hoek.escapeJavaScript('something(\'param\')');
-        expect(encoded).to.equal('something\\x28\\x27param\\x27\\x29');
-        done();
-    });
-
-    it('encodes large unicode characters with the correct padding', function (done) {
-
-        var encoded = Hoek.escapeJavaScript(String.fromCharCode(500) + String.fromCharCode(1000));
-        expect(encoded).to.equal('\\u0500\\u1000');
-        done();
-    });
-
-    it('doesn\'t throw an exception when passed null', function (done) {
-
-        var encoded = Hoek.escapeJavaScript(null);
-        expect(encoded).to.equal('');
-        done();
-    });
-});
-
-describe('escapeHtml()', function () {
-
-    it('encodes / characters', function (done) {
-
-        var encoded = Hoek.escapeHtml('<script>alert(1)</script>');
-        expect(encoded).to.equal('&lt;script&gt;alert&#x28;1&#x29;&lt;&#x2f;script&gt;');
-        done();
-    });
-
-    it('encodes < and > as named characters', function (done) {
-
-        var encoded = Hoek.escapeHtml('<script><>');
-        expect(encoded).to.equal('&lt;script&gt;&lt;&gt;');
-        done();
-    });
-
-    it('encodes large unicode characters', function (done) {
-
-        var encoded = Hoek.escapeHtml(String.fromCharCode(500) + String.fromCharCode(1000));
-        expect(encoded).to.equal('&#500;&#1000;');
-        done();
-    });
-
-    it('doesn\'t throw an exception when passed null', function (done) {
-
-        var encoded = Hoek.escapeHtml(null);
-        expect(encoded).to.equal('');
-        done();
-    });
-
-    it('encodes {} characters', function (done) {
-
-        var encoded = Hoek.escapeHtml('{}');
-        expect(encoded).to.equal('&#x7b;&#x7d;');
-        done();
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js
deleted file mode 100644
index 1e8ef620f361a2c6d425ebc4ff6858487c396aa4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/index.js
+++ /dev/null
@@ -1,2513 +0,0 @@
-// Load modules
-
-var Fs = require('fs');
-var Path = require('path');
-var Code = require('code');
-var Hoek = require('../lib');
-var Lab = require('lab');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.experiment;
-var it = lab.test;
-var expect = Code.expect;
-
-
-var nestedObj = {
-    v: [7, 8, 9],
-    w: /^something$/igm,
-    x: {
-        a: [1, 2, 3],
-        b: 123456,
-        c: new Date(),
-        d: /hi/igm,
-        e: /hello/
-    },
-    y: 'y',
-    z: new Date(1378775452757)
-};
-
-var dupsArray = [nestedObj, { z: 'z' }, nestedObj];
-var reducedDupsArray = [nestedObj, { z: 'z' }];
-
-describe('clone()', function () {
-
-    it('clones a nested object', function (done) {
-
-        var a = nestedObj;
-        var b = Hoek.clone(a);
-
-        expect(a).to.deep.equal(b);
-        expect(a.z.getTime()).to.equal(b.z.getTime());
-        done();
-    });
-
-    it('clones a null object', function (done) {
-
-        var b = Hoek.clone(null);
-
-        expect(b).to.equal(null);
-        done();
-    });
-
-    it('should not convert undefined properties to null', function (done) {
-
-        var obj = { something: undefined };
-        var b = Hoek.clone(obj);
-
-        expect(typeof b.something).to.equal('undefined');
-        done();
-    });
-
-    it('should not throw on circular reference', function (done) {
-
-        var a = {};
-        a.x = a;
-
-        var test = function () {
-
-            var b = Hoek.clone(a);
-        };
-
-        expect(test).to.not.throw();
-        done();
-    });
-
-    it('clones circular reference', function (done) {
-
-        var x = {
-            'z': new Date()
-        };
-        x.y = x;
-
-        var b = Hoek.clone(x);
-        expect(Object.keys(b.y)).to.deep.equal(Object.keys(x));
-        expect(b.z).to.not.equal(x.z);
-        expect(b.y).to.not.equal(x.y);
-        expect(b.y.z).to.not.equal(x.y.z);
-        expect(b.y).to.equal(b);
-        expect(b.y.y.y.y).to.equal(b);
-        done();
-    });
-
-    it('clones an object with a null prototype', function (done) {
-
-        var obj = Object.create(null);
-        var b = Hoek.clone(obj);
-
-        expect(b).to.deep.equal(obj);
-        done();
-    });
-
-    it('clones deeply nested object', function (done) {
-
-        var a = {
-            x: {
-                y: {
-                    a: [1, 2, 3],
-                    b: 123456,
-                    c: new Date(),
-                    d: /hi/igm,
-                    e: /hello/
-                }
-            }
-        };
-
-        var b = Hoek.clone(a);
-
-        expect(a).to.deep.equal(b);
-        expect(a.x.y.c.getTime()).to.equal(b.x.y.c.getTime());
-        done();
-    });
-
-    it('clones arrays', function (done) {
-
-        var a = [1, 2, 3];
-
-        var b = Hoek.clone(a);
-
-        expect(a).to.deep.equal(b);
-        done();
-    });
-
-    it('performs actual copy for shallow keys (no pass by reference)', function (done) {
-
-        var x = Hoek.clone(nestedObj);
-        var y = Hoek.clone(nestedObj);
-
-        // Date
-        expect(x.z).to.not.equal(nestedObj.z);
-        expect(x.z).to.not.equal(y.z);
-
-        // Regex
-        expect(x.w).to.not.equal(nestedObj.w);
-        expect(x.w).to.not.equal(y.w);
-
-        // Array
-        expect(x.v).to.not.equal(nestedObj.v);
-        expect(x.v).to.not.equal(y.v);
-
-        // Immutable(s)
-        x.y = 5;
-        expect(x.y).to.not.equal(nestedObj.y);
-        expect(x.y).to.not.equal(y.y);
-
-        done();
-    });
-
-    it('performs actual copy for deep keys (no pass by reference)', function (done) {
-
-        var x = Hoek.clone(nestedObj);
-        var y = Hoek.clone(nestedObj);
-
-        expect(x.x.c).to.not.equal(nestedObj.x.c);
-        expect(x.x.c).to.not.equal(y.x.c);
-
-        expect(x.x.c.getTime()).to.equal(nestedObj.x.c.getTime());
-        expect(x.x.c.getTime()).to.equal(y.x.c.getTime());
-        done();
-    });
-
-    it('copies functions with properties', function (done) {
-
-        var a = {
-            x: function () {
-
-                return 1;
-            },
-            y: {}
-        };
-        a.x.z = 'string in function';
-        a.x.v = function () {
-
-            return 2;
-        };
-        a.y.u = a.x;
-
-        var b = Hoek.clone(a);
-        expect(b.x()).to.equal(1);
-        expect(b.x.v()).to.equal(2);
-        expect(b.y.u).to.equal(b.x);
-        expect(b.x.z).to.equal('string in function');
-        done();
-    });
-
-    it('should copy a buffer', function (done) {
-
-        var tls = {
-            key: new Buffer([1, 2, 3, 4, 5]),
-            cert: new Buffer([1, 2, 3, 4, 5, 6, 10])
-        };
-
-        var copiedTls = Hoek.clone(tls);
-        expect(Buffer.isBuffer(copiedTls.key)).to.equal(true);
-        expect(JSON.stringify(copiedTls.key)).to.equal(JSON.stringify(tls.key));
-        expect(Buffer.isBuffer(copiedTls.cert)).to.equal(true);
-        expect(JSON.stringify(copiedTls.cert)).to.equal(JSON.stringify(tls.cert));
-        done();
-    });
-
-    it('clones an object with a prototype', function (done) {
-
-        var Obj = function () {
-
-            this.a = 5;
-        };
-
-        Obj.prototype.b = function () {
-
-            return 'c';
-        };
-
-        var a = new Obj();
-        var b = Hoek.clone(a);
-
-        expect(b.a).to.equal(5);
-        expect(b.b()).to.equal('c');
-        expect(a).to.deep.equal(b);
-        done();
-    });
-
-    it('reuses cloned Date object', function (done) {
-
-        var obj = {
-            a: new Date()
-        };
-
-        obj.b = obj.a;
-
-        var copy = Hoek.clone(obj);
-        expect(copy.a).to.equal(copy.b);
-        done();
-    });
-
-    it('shallow copies an object with a prototype and isImmutable flag', function (done) {
-
-        var Obj = function () {
-
-            this.value = 5;
-        };
-
-        Obj.prototype.b = function () {
-
-            return 'c';
-        };
-
-        Obj.prototype.isImmutable = true;
-
-        var obj = {
-            a: new Obj()
-        };
-
-        var copy = Hoek.clone(obj);
-
-        expect(obj.a.value).to.equal(5);
-        expect(copy.a.value).to.equal(5);
-        expect(copy.a.b()).to.equal('c');
-        expect(obj.a).to.equal(copy.a);
-        done();
-    });
-
-    it('clones an object with property getter without executing it', function (done) {
-
-        var obj = {};
-        var value = 1;
-        var execCount = 0;
-
-        Object.defineProperty(obj, 'test', {
-            enumerable: true,
-            configurable: true,
-            get: function () {
-
-                ++execCount;
-                return value;
-            }
-        });
-
-        var copy = Hoek.clone(obj);
-        expect(execCount).to.equal(0);
-        expect(copy.test).to.equal(1);
-        expect(execCount).to.equal(1);
-        done();
-    });
-
-    it('clones an object with property getter and setter', function (done) {
-
-        var obj = {
-            _test: 0
-        };
-
-        Object.defineProperty(obj, 'test', {
-            enumerable: true,
-            configurable: true,
-            get: function () {
-
-                return this._test;
-            },
-            set: function (value) {
-
-                this._test = value - 1;
-            }
-        });
-
-        var copy = Hoek.clone(obj);
-        expect(copy.test).to.equal(0);
-        copy.test = 5;
-        expect(copy.test).to.equal(4);
-        done();
-    });
-
-    it('clones an object with only property setter', function (done) {
-
-        var obj = {
-            _test: 0
-        };
-
-        Object.defineProperty(obj, 'test', {
-            enumerable: true,
-            configurable: true,
-            set: function (value) {
-
-                this._test = value - 1;
-            }
-        });
-
-        var copy = Hoek.clone(obj);
-        expect(copy._test).to.equal(0);
-        copy.test = 5;
-        expect(copy._test).to.equal(4);
-        done();
-    });
-
-    it('clones an object with non-enumerable properties', function (done) {
-
-        var obj = {
-            _test: 0
-        };
-
-        Object.defineProperty(obj, 'test', {
-            enumerable: false,
-            configurable: true,
-            set: function (value) {
-
-                this._test = value - 1;
-            }
-        });
-
-        var copy = Hoek.clone(obj);
-        expect(copy._test).to.equal(0);
-        copy.test = 5;
-        expect(copy._test).to.equal(4);
-        done();
-    });
-
-    it('clones an object where getOwnPropertyDescriptor returns undefined', function (done) {
-
-        var oldGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
-        var obj = { a: 'b' };
-        Object.getOwnPropertyDescriptor = function () {
-
-            return undefined;
-        };
-
-        var copy = Hoek.clone(obj);
-        Object.getOwnPropertyDescriptor = oldGetOwnPropertyDescriptor;
-        expect(copy).to.deep.equal(obj);
-        done();
-    });
-});
-
-describe('merge()', function () {
-
-    it('deep copies source items', function (done) {
-
-        var target = {
-            b: 3,
-            d: []
-        };
-
-        var source = {
-            c: {
-                d: 1
-            },
-            d: [{ e: 1 }]
-        };
-
-        Hoek.merge(target, source);
-        expect(target.c).to.not.equal(source.c);
-        expect(target.c).to.deep.equal(source.c);
-        expect(target.d).to.not.equal(source.d);
-        expect(target.d[0]).to.not.equal(source.d[0]);
-        expect(target.d).to.deep.equal(source.d);
-        done();
-    });
-
-    it('merges array over an object', function (done) {
-
-        var a = {
-            x: ['n', 'm']
-        };
-
-        var b = {
-            x: {
-                n: '1',
-                m: '2'
-            }
-        };
-
-        Hoek.merge(b, a);
-        expect(a.x[0]).to.equal('n');
-        expect(a.x.n).to.not.exist();
-        done();
-    });
-
-    it('merges object over an array', function (done) {
-
-        var a = {
-            x: ['n', 'm']
-        };
-
-        var b = {
-            x: {
-                n: '1',
-                m: '2'
-            }
-        };
-
-        Hoek.merge(a, b);
-        expect(a.x.n).to.equal('1');
-        expect(a.x[0]).to.not.exist();
-        done();
-    });
-
-    it('does not throw if source is null', function (done) {
-
-        var a = {};
-        var b = null;
-        var c = null;
-
-        expect(function () {
-
-            c = Hoek.merge(a, b);
-        }).to.not.throw();
-
-        expect(c).to.equal(a);
-        done();
-    });
-
-    it('does not throw if source is undefined', function (done) {
-
-        var a = {};
-        var b;
-        var c = null;
-
-        expect(function () {
-
-            c = Hoek.merge(a, b);
-        }).to.not.throw();
-
-        expect(c).to.equal(a);
-        done();
-    });
-
-    it('throws if source is not an object', function (done) {
-
-        expect(function () {
-
-            var a = {};
-            var b = 0;
-
-            Hoek.merge(a, b);
-        }).to.throw('Invalid source value: must be null, undefined, or an object');
-        done();
-    });
-
-    it('throws if target is not an object', function (done) {
-
-        expect(function () {
-
-            var a = 0;
-            var b = {};
-
-            Hoek.merge(a, b);
-        }).to.throw('Invalid target value: must be an object');
-        done();
-    });
-
-    it('throws if target is not an array and source is', function (done) {
-
-        expect(function () {
-
-            var a = {};
-            var b = [1, 2];
-
-            Hoek.merge(a, b);
-        }).to.throw('Cannot merge array onto an object');
-        done();
-    });
-
-    it('returns the same object when merging arrays', function (done) {
-
-        var a = [];
-        var b = [1, 2];
-
-        expect(Hoek.merge(a, b)).to.equal(a);
-        done();
-    });
-
-    it('combines an empty object with a non-empty object', function (done) {
-
-        var a = {};
-        var b = nestedObj;
-
-        var c = Hoek.merge(a, b);
-        expect(a).to.deep.equal(b);
-        expect(c).to.deep.equal(b);
-        done();
-    });
-
-    it('overrides values in target', function (done) {
-
-        var a = { x: 1, y: 2, z: 3, v: 5, t: 'test', m: 'abc' };
-        var b = { x: null, z: 4, v: 0, t: { u: 6 }, m: '123' };
-
-        var c = Hoek.merge(a, b);
-        expect(c.x).to.equal(null);
-        expect(c.y).to.equal(2);
-        expect(c.z).to.equal(4);
-        expect(c.v).to.equal(0);
-        expect(c.m).to.equal('123');
-        expect(c.t).to.deep.equal({ u: 6 });
-        done();
-    });
-
-    it('overrides values in target (flip)', function (done) {
-
-        var a = { x: 1, y: 2, z: 3, v: 5, t: 'test', m: 'abc' };
-        var b = { x: null, z: 4, v: 0, t: { u: 6 }, m: '123' };
-
-        var d = Hoek.merge(b, a);
-        expect(d.x).to.equal(1);
-        expect(d.y).to.equal(2);
-        expect(d.z).to.equal(3);
-        expect(d.v).to.equal(5);
-        expect(d.m).to.equal('abc');
-        expect(d.t).to.deep.equal('test');
-        done();
-    });
-
-    it('retains Date properties', function (done) {
-
-        var a = { x: new Date(1378776452757) };
-
-        var b = Hoek.merge({}, a);
-        expect(a.x.getTime()).to.equal(b.x.getTime());
-        done();
-    });
-
-    it('retains Date properties when merging keys', function (done) {
-
-        var a = { x: new Date(1378776452757) };
-
-        var b = Hoek.merge({ x: {} }, a);
-        expect(a.x.getTime()).to.equal(b.x.getTime());
-        done();
-    });
-
-    it('overrides Buffer', function (done) {
-
-        var a = { x: new Buffer('abc') };
-
-        var b = Hoek.merge({ x: {} }, a);
-        expect(a.x.toString()).to.equal('abc');
-        done();
-    });
-});
-
-describe('applyToDefaults()', function () {
-
-    var defaults = {
-        a: 1,
-        b: 2,
-        c: {
-            d: 3,
-            e: [5, 6]
-        },
-        f: 6,
-        g: 'test'
-    };
-
-    it('throws when target is null', function (done) {
-
-        expect(function () {
-
-            Hoek.applyToDefaults(null, {});
-        }).to.throw('Invalid defaults value: must be an object');
-        done();
-    });
-
-    it('returns null if options is false', function (done) {
-
-        var result = Hoek.applyToDefaults(defaults, false);
-        expect(result).to.equal(null);
-        done();
-    });
-
-    it('returns null if options is null', function (done) {
-
-        var result = Hoek.applyToDefaults(defaults, null);
-        expect(result).to.equal(null);
-        done();
-    });
-
-    it('returns null if options is undefined', function (done) {
-
-        var result = Hoek.applyToDefaults(defaults, undefined);
-        expect(result).to.equal(null);
-        done();
-    });
-
-    it('returns a copy of defaults if options is true', function (done) {
-
-        var result = Hoek.applyToDefaults(defaults, true);
-        expect(result).to.deep.equal(defaults);
-        done();
-    });
-
-    it('applies object to defaults', function (done) {
-
-        var obj = {
-            a: null,
-            c: {
-                e: [4]
-            },
-            f: 0,
-            g: {
-                h: 5
-            }
-        };
-
-        var result = Hoek.applyToDefaults(defaults, obj);
-        expect(result.c.e).to.deep.equal([4]);
-        expect(result.a).to.equal(1);
-        expect(result.b).to.equal(2);
-        expect(result.f).to.equal(0);
-        expect(result.g).to.deep.equal({ h: 5 });
-        done();
-    });
-
-    it('applies object to defaults with null', function (done) {
-
-        var obj = {
-            a: null,
-            c: {
-                e: [4]
-            },
-            f: 0,
-            g: {
-                h: 5
-            }
-        };
-
-        var result = Hoek.applyToDefaults(defaults, obj, true);
-        expect(result.c.e).to.deep.equal([4]);
-        expect(result.a).to.equal(null);
-        expect(result.b).to.equal(2);
-        expect(result.f).to.equal(0);
-        expect(result.g).to.deep.equal({ h: 5 });
-        done();
-    });
-});
-
-describe('cloneWithShallow()', function () {
-
-    it('deep clones except for listed keys', function (done) {
-
-        var source = {
-            a: {
-                b: 5
-            },
-            c: {
-                d: 6
-            }
-        };
-
-        var copy = Hoek.cloneWithShallow(source, ['c']);
-        expect(copy).to.deep.equal(source);
-        expect(copy).to.not.equal(source);
-        expect(copy.a).to.not.equal(source.a);
-        expect(copy.b).to.equal(source.b);
-        done();
-    });
-
-    it('returns immutable value', function (done) {
-
-        expect(Hoek.cloneWithShallow(5)).to.equal(5);
-        done();
-    });
-
-    it('returns null value', function (done) {
-
-        expect(Hoek.cloneWithShallow(null)).to.equal(null);
-        done();
-    });
-
-    it('returns undefined value', function (done) {
-
-        expect(Hoek.cloneWithShallow(undefined)).to.equal(undefined);
-        done();
-    });
-
-    it('deep clones except for listed keys (including missing keys)', function (done) {
-
-        var source = {
-            a: {
-                b: 5
-            },
-            c: {
-                d: 6
-            }
-        };
-
-        var copy = Hoek.cloneWithShallow(source, ['c', 'v']);
-        expect(copy).to.deep.equal(source);
-        expect(copy).to.not.equal(source);
-        expect(copy.a).to.not.equal(source.a);
-        expect(copy.b).to.equal(source.b);
-        done();
-    });
-});
-
-describe('applyToDefaultsWithShallow()', function () {
-
-    it('shallow copies the listed keys from options without merging', function (done) {
-
-        var defaults = {
-            a: {
-                b: 5,
-                e: 3
-            },
-            c: {
-                d: 7,
-                g: 1
-            }
-        };
-
-        var options = {
-            a: {
-                b: 4
-            },
-            c: {
-                d: 6,
-                f: 7
-            }
-        };
-
-        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['a']);
-        expect(merged).to.deep.equal({ a: { b: 4 }, c: { d: 6, g: 1, f: 7 } });
-        expect(merged.a).to.equal(options.a);
-        expect(merged.a).to.not.equal(defaults.a);
-        expect(merged.c).to.not.equal(options.c);
-        expect(merged.c).to.not.equal(defaults.c);
-        done();
-    });
-
-    it('shallow copies the nested keys (override)', function (done) {
-
-        var defaults = {
-            a: {
-                b: 5
-            },
-            c: {
-                d: 7,
-                g: 1
-            }
-        };
-
-        var options = {
-            a: {
-                b: 4
-            },
-            c: {
-                d: 6,
-                g: {
-                    h: 8
-                }
-            }
-        };
-
-        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g']);
-        expect(merged).to.deep.equal({ a: { b: 4 }, c: { d: 6, g: { h: 8 } } });
-        expect(merged.c.g).to.equal(options.c.g);
-        done();
-    });
-
-    it('shallow copies the nested keys (missing)', function (done) {
-
-        var defaults = {
-            a: {
-                b: 5
-            }
-        };
-
-        var options = {
-            a: {
-                b: 4
-            },
-            c: {
-                g: {
-                    h: 8
-                }
-            }
-        };
-
-        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g']);
-        expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { h: 8 } } });
-        expect(merged.c.g).to.equal(options.c.g);
-        done();
-    });
-
-    it('shallow copies the nested keys (override)', function (done) {
-
-        var defaults = {
-            a: {
-                b: 5
-            },
-            c: {
-                g: {
-                    d: 7
-                }
-            }
-        };
-
-        var options = {
-            a: {
-                b: 4
-            },
-            c: {
-                g: {
-                    h: 8
-                }
-            }
-        };
-
-        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g']);
-        expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { h: 8 } } });
-        expect(merged.c.g).to.equal(options.c.g);
-        done();
-    });
-
-    it('shallow copies the nested keys (deeper)', function (done) {
-
-        var defaults = {
-            a: {
-                b: 5
-            }
-        };
-
-        var options = {
-            a: {
-                b: 4
-            },
-            c: {
-                g: {
-                    r: {
-                        h: 8
-                    }
-                }
-            }
-        };
-
-        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['c.g.r']);
-        expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { r: { h: 8 } } } });
-        expect(merged.c.g.r).to.equal(options.c.g.r);
-        done();
-    });
-
-    it('shallow copies the nested keys (not present)', function (done) {
-
-        var defaults = {
-            a: {
-                b: 5
-            }
-        };
-
-        var options = {
-            a: {
-                b: 4
-            },
-            c: {
-                g: {
-                    r: {
-                        h: 8
-                    }
-                }
-            }
-        };
-
-        var merged = Hoek.applyToDefaultsWithShallow(defaults, options, ['x.y']);
-        expect(merged).to.deep.equal({ a: { b: 4 }, c: { g: { r: { h: 8 } } } });
-        done();
-    });
-
-    it('shallow copies the listed keys in the defaults', function (done) {
-
-        var defaults = {
-            a: {
-                b: 1
-            }
-        };
-
-        var merged = Hoek.applyToDefaultsWithShallow(defaults, {}, ['a']);
-        expect(merged.a).to.equal(defaults.a);
-        done();
-    });
-
-    it('shallow copies the listed keys in the defaults (true)', function (done) {
-
-        var defaults = {
-            a: {
-                b: 1
-            }
-        };
-
-        var merged = Hoek.applyToDefaultsWithShallow(defaults, true, ['a']);
-        expect(merged.a).to.equal(defaults.a);
-        done();
-    });
-
-    it('returns null on false', function (done) {
-
-        var defaults = {
-            a: {
-                b: 1
-            }
-        };
-
-        var merged = Hoek.applyToDefaultsWithShallow(defaults, false, ['a']);
-        expect(merged).to.equal(null);
-        done();
-    });
-
-    it('throws on missing defaults', function (done) {
-
-        expect(function () {
-
-            Hoek.applyToDefaultsWithShallow(null, {}, ['a']);
-        }).to.throw('Invalid defaults value: must be an object');
-        done();
-    });
-
-    it('throws on invalid defaults', function (done) {
-
-        expect(function () {
-
-            Hoek.applyToDefaultsWithShallow('abc', {}, ['a']);
-        }).to.throw('Invalid defaults value: must be an object');
-        done();
-    });
-
-    it('throws on invalid options', function (done) {
-
-        expect(function () {
-
-            Hoek.applyToDefaultsWithShallow({}, 'abc', ['a']);
-        }).to.throw('Invalid options value: must be true, falsy or an object');
-        done();
-    });
-
-    it('throws on missing keys', function (done) {
-
-        expect(function () {
-
-            Hoek.applyToDefaultsWithShallow({}, true);
-        }).to.throw('Invalid keys');
-        done();
-    });
-
-    it('throws on invalid keys', function (done) {
-
-        expect(function () {
-
-            Hoek.applyToDefaultsWithShallow({}, true, 'a');
-        }).to.throw('Invalid keys');
-        done();
-    });
-});
-
-describe('deepEqual()', function () {
-
-    it('compares simple values', function (done) {
-
-        expect(Hoek.deepEqual('x', 'x')).to.be.true();
-        expect(Hoek.deepEqual('x', 'y')).to.be.false();
-        expect(Hoek.deepEqual('x1', 'x')).to.be.false();
-        expect(Hoek.deepEqual(-0, +0)).to.be.false();
-        expect(Hoek.deepEqual(-0, -0)).to.be.true();
-        expect(Hoek.deepEqual(+0, +0)).to.be.true();
-        expect(Hoek.deepEqual(+0, -0)).to.be.false();
-        expect(Hoek.deepEqual(1, 1)).to.be.true();
-        expect(Hoek.deepEqual(0, 0)).to.be.true();
-        expect(Hoek.deepEqual(-1, 1)).to.be.false();
-        expect(Hoek.deepEqual(NaN, 0)).to.be.false();
-        expect(Hoek.deepEqual(NaN, NaN)).to.be.true();
-        done();
-    });
-
-    it('compares different types', function (done) {
-
-        expect(Hoek.deepEqual([], 5)).to.be.false();
-        expect(Hoek.deepEqual(5, [])).to.be.false();
-        expect(Hoek.deepEqual({}, null)).to.be.false();
-        expect(Hoek.deepEqual(null, {})).to.be.false();
-        expect(Hoek.deepEqual('abc', {})).to.be.false();
-        expect(Hoek.deepEqual({}, 'abc')).to.be.false();
-        done();
-    });
-
-    it('compares empty structures', function (done) {
-
-        expect(Hoek.deepEqual([], [])).to.be.true();
-        expect(Hoek.deepEqual({}, {})).to.be.true();
-        expect(Hoek.deepEqual([], {})).to.be.false();
-        done();
-    });
-
-    it('compares empty arguments object', function (done) {
-
-        var compare = function () {
-
-            expect(Hoek.deepEqual([], arguments)).to.be.false();
-        };
-
-        compare();
-        done();
-    });
-
-    it('compares empty arguments objects', function (done) {
-
-        var compare = function () {
-
-            var arg1 = arguments;
-
-            var inner = function () {
-
-                expect(Hoek.deepEqual(arg1, arguments)).to.be.false(); // callee is not the same
-            };
-
-            inner();
-        };
-
-        compare();
-        done();
-    });
-
-    it('compares dates', function (done) {
-
-        expect(Hoek.deepEqual(new Date(2015, 1, 1), new Date(2015, 1, 1))).to.be.true();
-        expect(Hoek.deepEqual(new Date(100), new Date(101))).to.be.false();
-        expect(Hoek.deepEqual(new Date(), {})).to.be.false();
-        done();
-    });
-
-    it('compares regular expressions', function (done) {
-
-        expect(Hoek.deepEqual(/\s/, new RegExp('\\\s'))).to.be.true();
-        expect(Hoek.deepEqual(/\s/g, /\s/g)).to.be.true();
-        expect(Hoek.deepEqual(/a/, {})).to.be.false();
-        expect(Hoek.deepEqual(/\s/g, /\s/i)).to.be.false();
-        expect(Hoek.deepEqual(/a/g, /b/g)).to.be.false();
-        done();
-    });
-
-    it('compares arrays', function (done) {
-
-        expect(Hoek.deepEqual([[1]], [[1]])).to.be.true();
-        expect(Hoek.deepEqual([1, 2, 3], [1, 2, 3])).to.be.true();
-        expect(Hoek.deepEqual([1, 2, 3], [1, 3, 2])).to.be.false();
-        expect(Hoek.deepEqual([1, 2, 3], [1, 2])).to.be.false();
-        expect(Hoek.deepEqual([1], [1])).to.be.true();
-        done();
-    });
-
-    it('compares buffers', function (done) {
-
-        expect(Hoek.deepEqual(new Buffer([1, 2, 3]), new Buffer([1, 2, 3]))).to.be.true();
-        expect(Hoek.deepEqual(new Buffer([1, 2, 3]), new Buffer([1, 3, 2]))).to.be.false();
-        expect(Hoek.deepEqual(new Buffer([1, 2, 3]), new Buffer([1, 2]))).to.be.false();
-        expect(Hoek.deepEqual(new Buffer([1, 2, 3]), {})).to.be.false();
-        expect(Hoek.deepEqual(new Buffer([1, 2, 3]), [1, 2, 3])).to.be.false();
-        done();
-    });
-
-    it('compares objects', function (done) {
-
-        expect(Hoek.deepEqual({ a: 1, b: 2, c: 3 }, { a: 1, b: 2, c: 3 })).to.be.true();
-        expect(Hoek.deepEqual({ foo: 'bar' }, { foo: 'baz' })).to.be.false();
-        expect(Hoek.deepEqual({ foo: { bar: 'foo' } }, { foo: { bar: 'baz' } })).to.be.false();
-        done();
-    });
-
-    it('handles circular dependency', function (done) {
-
-        var a = {};
-        a.x = a;
-
-        var b = Hoek.clone(a);
-        expect(Hoek.deepEqual(a, b)).to.be.true();
-        done();
-    });
-
-    it('compares an object with property getter without executing it', function (done) {
-
-        var obj = {};
-        var value = 1;
-        var execCount = 0;
-
-        Object.defineProperty(obj, 'test', {
-            enumerable: true,
-            configurable: true,
-            get: function () {
-
-                ++execCount;
-                return value;
-            }
-        });
-
-        var copy = Hoek.clone(obj);
-        expect(Hoek.deepEqual(obj, copy)).to.be.true();
-        expect(execCount).to.equal(0);
-        expect(copy.test).to.equal(1);
-        expect(execCount).to.equal(1);
-        done();
-    });
-
-    it('compares objects with property getters', function (done) {
-
-        var obj = {};
-        Object.defineProperty(obj, 'test', {
-            enumerable: true,
-            configurable: true,
-            get: function () {
-
-                return 1;
-            }
-        });
-
-        var ref = {};
-        Object.defineProperty(ref, 'test', {
-            enumerable: true,
-            configurable: true,
-            get: function () {
-
-                return 2;
-            }
-        });
-
-        expect(Hoek.deepEqual(obj, ref)).to.be.false();
-        done();
-    });
-
-    it('compares object prototypes', function (done) {
-
-        var Obj = function () {
-
-            this.a = 5;
-        };
-
-        Obj.prototype.b = function () {
-
-            return this.a;
-        };
-
-        var Ref = function () {
-
-            this.a = 5;
-        };
-
-        Ref.prototype.b = function () {
-
-            return this.a;
-        };
-
-        expect(Hoek.deepEqual(new Obj(), new Ref())).to.be.false();
-        expect(Hoek.deepEqual(new Obj(), new Obj())).to.be.true();
-        expect(Hoek.deepEqual(new Ref(), new Ref())).to.be.true();
-        done();
-    });
-
-    it('compares plain objects', function (done) {
-
-        var a = Object.create(null);
-        var b = Object.create(null);
-
-        a.b = 'c';
-        b.b = 'c';
-
-        expect(Hoek.deepEqual(a, b)).to.be.true();
-        expect(Hoek.deepEqual(a, { b: 'c' })).to.be.false();
-        done();
-    });
-
-    it('compares an object with an empty object', function (done) {
-
-        var a = { a: 1, b: 2 };
-
-        expect(Hoek.deepEqual({}, a)).to.be.false();
-        expect(Hoek.deepEqual(a, {})).to.be.false();
-        done();
-    });
-
-    it('compares an object ignoring the prototype', function (done) {
-
-        var a = Object.create(null);
-        var b = {};
-
-        expect(Hoek.deepEqual(a, b, { prototype: false })).to.be.true();
-        done();
-    });
-
-    it('compares an object ignoring the prototype recursively', function (done) {
-
-        var a = [Object.create(null)];
-        var b = [{}];
-
-        expect(Hoek.deepEqual(a, b, { prototype: false })).to.be.true();
-        done();
-    });
-});
-
-describe('unique()', function () {
-
-    it('ensures uniqueness within array of objects based on subkey', function (done) {
-
-        var a = Hoek.unique(dupsArray, 'x');
-        expect(a).to.deep.equal(reducedDupsArray);
-        done();
-    });
-
-    it('removes duplicated without key', function (done) {
-
-        expect(Hoek.unique([1, 2, 3, 4, 2, 1, 5])).to.deep.equal([1, 2, 3, 4, 5]);
-        done();
-    });
-});
-
-describe('mapToObject()', function () {
-
-    it('returns null on null array', function (done) {
-
-        var a = Hoek.mapToObject(null);
-        expect(a).to.equal(null);
-        done();
-    });
-
-    it('converts basic array to existential object', function (done) {
-
-        var keys = [1, 2, 3, 4];
-        var a = Hoek.mapToObject(keys);
-        for (var i in keys) {
-            expect(a[keys[i]]).to.equal(true);
-        }
-        done();
-    });
-
-    it('converts array of objects to existential object', function (done) {
-
-        var keys = [{ x: 1 }, { x: 2 }, { x: 3 }, { y: 4 }];
-        var subkey = 'x';
-        var a = Hoek.mapToObject(keys, subkey);
-        expect(a).to.deep.equal({ 1: true, 2: true, 3: true });
-        done();
-    });
-});
-
-describe('intersect()', function () {
-
-    it('returns the common objects of two arrays', function (done) {
-
-        var array1 = [1, 2, 3, 4, 4, 5, 5];
-        var array2 = [5, 4, 5, 6, 7];
-        var common = Hoek.intersect(array1, array2);
-        expect(common.length).to.equal(2);
-        done();
-    });
-
-    it('returns just the first common object of two arrays', function (done) {
-
-        var array1 = [1, 2, 3, 4, 4, 5, 5];
-        var array2 = [5, 4, 5, 6, 7];
-        var common = Hoek.intersect(array1, array2, true);
-        expect(common).to.equal(5);
-        done();
-    });
-
-    it('returns null when no common and returning just the first common object of two arrays', function (done) {
-
-        var array1 = [1, 2, 3, 4, 4, 5, 5];
-        var array2 = [6, 7];
-        var common = Hoek.intersect(array1, array2, true);
-        expect(common).to.equal(null);
-        done();
-    });
-
-    it('returns an empty array if either input is null', function (done) {
-
-        expect(Hoek.intersect([1], null).length).to.equal(0);
-        expect(Hoek.intersect(null, [1]).length).to.equal(0);
-        done();
-    });
-
-    it('returns the common objects of object and array', function (done) {
-
-        var array1 = [1, 2, 3, 4, 4, 5, 5];
-        var array2 = [5, 4, 5, 6, 7];
-        var common = Hoek.intersect(Hoek.mapToObject(array1), array2);
-        expect(common.length).to.equal(2);
-        done();
-    });
-});
-
-describe('contain()', function () {
-
-    it('tests strings', function (done) {
-
-        expect(Hoek.contain('abc', 'ab')).to.be.true();
-        expect(Hoek.contain('abc', 'abc', { only: true })).to.be.true();
-        expect(Hoek.contain('aaa', 'a', { only: true })).to.be.true();
-        expect(Hoek.contain('abc', 'b', { once: true })).to.be.true();
-        expect(Hoek.contain('abc', ['a', 'c'])).to.be.true();
-        expect(Hoek.contain('abc', ['a', 'd'], { part: true })).to.be.true();
-
-        expect(Hoek.contain('abc', 'ac')).to.be.false();
-        expect(Hoek.contain('abcd', 'abc', { only: true })).to.be.false();
-        expect(Hoek.contain('aab', 'a', { only: true })).to.be.false();
-        expect(Hoek.contain('abb', 'b', { once: true })).to.be.false();
-        expect(Hoek.contain('abc', ['a', 'd'])).to.be.false();
-        expect(Hoek.contain('abc', ['ab', 'bc'])).to.be.false();                      // Overlapping values not supported
-        done();
-    });
-
-    it('tests arrays', function (done) {
-
-        expect(Hoek.contain([1, 2, 3], 1)).to.be.true();
-        expect(Hoek.contain([{ a: 1 }], { a: 1 }, { deep: true })).to.be.true();
-        expect(Hoek.contain([1, 2, 3], [1, 2])).to.be.true();
-        expect(Hoek.contain([{ a: 1 }], [{ a: 1 }], { deep: true })).to.be.true();
-        expect(Hoek.contain([1, 1, 2], [1, 2], { only: true })).to.be.true();
-        expect(Hoek.contain([1, 2], [1, 2], { once: true })).to.be.true();
-        expect(Hoek.contain([1, 2, 3], [1, 4], { part: true })).to.be.true();
-        expect(Hoek.contain([[1], [2]], [[1]], { deep: true })).to.be.true();
-
-        expect(Hoek.contain([1, 2, 3], 4)).to.be.false();
-        expect(Hoek.contain([{ a: 1 }], { a: 2 }, { deep: true })).to.be.false();
-        expect(Hoek.contain([{ a: 1 }], { a: 1 })).to.be.false();
-        expect(Hoek.contain([1, 2, 3], [4, 5])).to.be.false();
-        expect(Hoek.contain([[3], [2]], [[1]])).to.be.false();
-        expect(Hoek.contain([[1], [2]], [[1]])).to.be.false();
-        expect(Hoek.contain([{ a: 1 }], [{ a: 2 }], { deep: true })).to.be.false();
-        expect(Hoek.contain([1, 3, 2], [1, 2], { only: true })).to.be.false();
-        expect(Hoek.contain([1, 2, 2], [1, 2], { once: true })).to.be.false();
-        expect(Hoek.contain([0, 2, 3], [1, 4], { part: true })).to.be.false();
-        done();
-    });
-
-    it('tests objects', function (done) {
-
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, 'a')).to.be.true();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, ['a', 'c'])).to.be.true();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, ['a', 'b', 'c'], { only: true })).to.be.true();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1 })).to.be.true();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, c: 3 })).to.be.true();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 4 }, { part: true })).to.be.true();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, b: 2, c: 3 }, { only: true })).to.be.true();
-        expect(Hoek.contain({ a: [1], b: [2], c: [3] }, { a: [1], c: [3] }, { deep: true })).to.be.true();
-        expect(Hoek.contain({ a: [{ b: 1 }, { c: 2 }, { d: 3, e: 4 }] }, { a: [{ b: 1 }, { d: 3 }] }, { deep: true })).to.be.true();
-        expect(Hoek.contain({ a: [{ b: 1 }, { c: 2 }, { d: 3, e: 4 }] }, { a: [{ b: 1 }, { d: 3 }] }, { deep: true, part: true })).to.be.true();
-        expect(Hoek.contain({ a: [{ b: 1 }, { c: 2 }, { d: 3, e: 4 }] }, { a: [{ b: 1 }, { d: 3 }] }, { deep: true, part: false })).to.be.false();
-        expect(Hoek.contain({ a: [{ b: 1 }, { c: 2 }, { d: 3, e: 4 }] }, { a: [{ b: 1 }, { d: 3 }] }, { deep: true, only: true })).to.be.false();
-        expect(Hoek.contain({ a: [{ b: 1 }, { c: 2 }, { d: 3, e: 4 }] }, { a: [{ b: 1 }, { d: 3 }] }, { deep: true, only: false })).to.be.true();
-
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, 'd')).to.be.false();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, ['a', 'd'])).to.be.false();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3, d: 4 }, ['a', 'b', 'c'], { only: true })).to.be.false();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 2 })).to.be.false();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 2, b: 2 }, { part: true })).to.be.false();             // part does not ignore bad value
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 3 })).to.be.false();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, d: 4 })).to.be.false();
-        expect(Hoek.contain({ a: 1, b: 2, c: 3 }, { a: 1, b: 2 }, { only: true })).to.be.false();
-        expect(Hoek.contain({ a: [1], b: [2], c: [3] }, { a: [1], c: [3] })).to.be.false();
-        expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } })).to.be.false();
-        expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } }, { deep: true })).to.be.true();
-        expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } }, { deep: true, only: true })).to.be.false();
-        expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } }, { deep: true, only: false })).to.be.true();
-        expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } }, { deep: true, part: true })).to.be.true();
-        expect(Hoek.contain({ a: { b: { c: 1, d: 2 } } }, { a: { b: { c: 1 } } }, { deep: true, part: false })).to.be.false();
-
-        // Getter check
-        var Foo = function (bar) {
-
-            this.bar = bar;
-        };
-
-        Object.defineProperty(Foo.prototype, 'baz', {
-            enumerable: true,
-            get: function () {
-
-                return this.bar;
-            }
-        });
-
-        expect(Hoek.contain({ a: new Foo('b') }, { a: new Foo('b') }, { deep: true })).to.be.true();
-        expect(Hoek.contain({ a: new Foo('b') }, { a: new Foo('b') }, { deep: true, part: true })).to.be.true();
-        expect(Hoek.contain({ a: new Foo('b') }, { a: { baz: 'b' } }, { deep: true })).to.be.true();
-        expect(Hoek.contain({ a: new Foo('b') }, { a: { baz: 'b' } }, { deep: true, only: true })).to.be.false();
-        expect(Hoek.contain({ a: new Foo('b') }, { a: { baz: 'b' } }, { deep: true, part: false })).to.be.false();
-        expect(Hoek.contain({ a: new Foo('b') }, { a: { baz: 'b' } }, { deep: true, part: true })).to.be.true();
-
-        done();
-    });
-});
-
-describe('flatten()', function () {
-
-    it('returns a flat array', function (done) {
-
-        var result = Hoek.flatten([1, 2, [3, 4, [5, 6], [7], 8], [9], [10, [11, 12]], 13]);
-        expect(result.length).to.equal(13);
-        expect(result).to.deep.equal([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]);
-        done();
-    });
-});
-
-describe('reach()', function () {
-
-    var obj = {
-        a: {
-            b: {
-                c: {
-                    d: 1,
-                    e: 2
-                },
-                f: 'hello'
-            },
-            g: {
-                h: 3
-            }
-        },
-        i: function () { },
-        j: null,
-        k: [4, 8, 9, 1]
-    };
-
-    obj.i.x = 5;
-
-    it('returns object itself', function (done) {
-
-        expect(Hoek.reach(obj, null)).to.equal(obj);
-        expect(Hoek.reach(obj, false)).to.equal(obj);
-        expect(Hoek.reach(obj)).to.equal(obj);
-        done();
-    });
-
-    it('returns first value of array', function (done) {
-
-        expect(Hoek.reach(obj, 'k.0')).to.equal(4);
-        done();
-    });
-
-    it('returns last value of array using negative index', function (done) {
-
-        expect(Hoek.reach(obj, 'k.-2')).to.equal(9);
-        done();
-    });
-
-    it('returns a valid member', function (done) {
-
-        expect(Hoek.reach(obj, 'a.b.c.d')).to.equal(1);
-        done();
-    });
-
-    it('returns a valid member with separator override', function (done) {
-
-        expect(Hoek.reach(obj, 'a/b/c/d', '/')).to.equal(1);
-        done();
-    });
-
-    it('returns undefined on null object', function (done) {
-
-        expect(Hoek.reach(null, 'a.b.c.d')).to.equal(undefined);
-        done();
-    });
-
-    it('returns undefined on missing object member', function (done) {
-
-        expect(Hoek.reach(obj, 'a.b.c.d.x')).to.equal(undefined);
-        done();
-    });
-
-    it('returns undefined on missing function member', function (done) {
-
-        expect(Hoek.reach(obj, 'i.y', { functions: true })).to.equal(undefined);
-        done();
-    });
-
-    it('throws on missing member in strict mode', function (done) {
-
-        expect(function () {
-
-            Hoek.reach(obj, 'a.b.c.o.x', { strict: true });
-        }).to.throw('Missing segment o in reach path  a.b.c.o.x');
-
-        done();
-    });
-
-    it('returns undefined on invalid member', function (done) {
-
-        expect(Hoek.reach(obj, 'a.b.c.d-.x')).to.equal(undefined);
-        done();
-    });
-
-    it('returns function member', function (done) {
-
-        expect(typeof Hoek.reach(obj, 'i')).to.equal('function');
-        done();
-    });
-
-    it('returns function property', function (done) {
-
-        expect(Hoek.reach(obj, 'i.x')).to.equal(5);
-        done();
-    });
-
-    it('returns null', function (done) {
-
-        expect(Hoek.reach(obj, 'j')).to.equal(null);
-        done();
-    });
-
-    it('throws on function property when functions not allowed', function (done) {
-
-        expect(function () {
-
-            Hoek.reach(obj, 'i.x', { functions: false });
-        }).to.throw('Invalid segment x in reach path  i.x');
-
-        done();
-    });
-
-    it('will return a default value if property is not found', function (done) {
-
-        expect(Hoek.reach(obj, 'a.b.q', { default: 'defaultValue' })).to.equal('defaultValue');
-        done();
-    });
-
-    it('will return a default value if path is not found', function (done) {
-
-        expect(Hoek.reach(obj, 'q', { default: 'defaultValue' })).to.equal('defaultValue');
-        done();
-    });
-
-    it('allows a falsey value to be used as the default value', function (done) {
-
-        expect(Hoek.reach(obj, 'q', { default: '' })).to.equal('');
-        done();
-    });
-});
-
-describe('reachTemplate()', function () {
-
-    it('applies object to template', function (done) {
-
-        var obj = {
-            a: {
-                b: {
-                    c: {
-                        d: 1
-                    }
-                }
-            },
-            j: null,
-            k: [4, 8, 9, 1]
-        };
-
-        var template = '{k.0}:{k.-2}:{a.b.c.d}:{x.y}:{j}';
-
-        expect(Hoek.reachTemplate(obj, template)).to.equal('4:9:1::');
-        done();
-    });
-
-    it('applies object to template (options)', function (done) {
-
-        var obj = {
-            a: {
-                b: {
-                    c: {
-                        d: 1
-                    }
-                }
-            },
-            j: null,
-            k: [4, 8, 9, 1]
-        };
-
-        var template = '{k/0}:{k/-2}:{a/b/c/d}:{x/y}:{j}';
-
-        expect(Hoek.reachTemplate(obj, template, '/')).to.equal('4:9:1::');
-        done();
-    });
-});
-
-describe('callStack()', function () {
-
-    it('returns the full call stack', function (done) {
-
-        var stack = Hoek.callStack();
-        expect(stack[0][0]).to.contain('index.js');
-        expect(stack[0][2]).to.equal(26);
-        done();
-    });
-});
-
-describe('displayStack ()', function () {
-
-    it('returns the full call stack for display', function (done) {
-
-        var stack = Hoek.displayStack();
-        expect(stack[0]).to.contain(Path.normalize('/test/index.js') + ':');
-        done();
-    });
-
-    it('includes constructor functions correctly', function (done) {
-
-        var Something = function (next) {
-
-            next();
-        };
-
-        var something = new Something(function () {
-
-            var stack = Hoek.displayStack();
-            expect(stack[1]).to.contain('new Something');
-            done();
-        });
-    });
-});
-
-describe('abort()', function () {
-
-    it('exits process when not in test mode', function (done) {
-
-        var env = process.env.NODE_ENV;
-        var write = process.stdout.write;
-        var exit = process.exit;
-
-        process.env.NODE_ENV = 'nottatest';
-        process.stdout.write = function () { };
-        process.exit = function (state) {
-
-            process.exit = exit;
-            process.env.NODE_ENV = env;
-            process.stdout.write = write;
-
-            expect(state).to.equal(1);
-            done();
-        };
-
-        Hoek.abort('Boom');
-    });
-
-    it('throws when not in test mode and abortThrow is true', function (done) {
-
-        var env = process.env.NODE_ENV;
-        process.env.NODE_ENV = 'nottatest';
-        Hoek.abortThrow = true;
-
-        var fn = function () {
-
-            Hoek.abort('my error message');
-        };
-
-        expect(fn).to.throw('my error message');
-        Hoek.abortThrow = false;
-        process.env.NODE_ENV = env;
-
-        done();
-    });
-
-    it('respects hideStack argument', function (done) {
-
-        var env = process.env.NODE_ENV;
-        var write = process.stdout.write;
-        var exit = process.exit;
-        var output = '';
-
-        process.exit = function () { };
-        process.env.NODE_ENV = '';
-        process.stdout.write = function (message) {
-
-            output = message;
-        };
-
-        Hoek.abort('my error message', true);
-
-        process.env.NODE_ENV = env;
-        process.stdout.write = write;
-        process.exit = exit;
-
-        expect(output).to.equal('ABORT: my error message\n\t\n');
-
-        done();
-    });
-
-    it('throws in test mode', function (done) {
-
-        var env = process.env.NODE_ENV;
-        process.env.NODE_ENV = 'test';
-
-        expect(function () {
-
-            Hoek.abort('my error message', true);
-        }).to.throw('my error message');
-
-        process.env.NODE_ENV = env;
-        done();
-    });
-
-    it('throws in test mode with default message', function (done) {
-
-        var env = process.env.NODE_ENV;
-        process.env.NODE_ENV = 'test';
-
-        expect(function () {
-
-            Hoek.abort('', true);
-        }).to.throw('Unknown error');
-
-        process.env.NODE_ENV = env;
-        done();
-    });
-
-    it('defaults to showing stack', function (done) {
-
-        var env = process.env.NODE_ENV;
-        var write = process.stdout.write;
-        var exit = process.exit;
-        var output = '';
-
-        process.exit = function () { };
-        process.env.NODE_ENV = '';
-        process.stdout.write = function (message) {
-
-            output = message;
-        };
-
-        Hoek.abort('my error message');
-
-        process.env.NODE_ENV = env;
-        process.stdout.write = write;
-        process.exit = exit;
-
-        expect(output).to.contain('index.js');
-
-        done();
-    });
-});
-
-describe('assert()', function () {
-
-    it('throws an Error when using assert in a test', function (done) {
-
-        var fn = function () {
-
-            Hoek.assert(false, 'my error message');
-        };
-
-        expect(fn).to.throw('my error message');
-        done();
-    });
-
-    it('throws an Error when using assert in a test with no message', function (done) {
-
-        var fn = function () {
-
-            Hoek.assert(false);
-        };
-
-        expect(fn).to.throw('Unknown error');
-        done();
-    });
-
-    it('throws an Error when using assert in a test with multipart message', function (done) {
-
-        var fn = function () {
-
-            Hoek.assert(false, 'This', 'is', 'my message');
-        };
-
-        expect(fn).to.throw('This is my message');
-        done();
-    });
-
-    it('throws an Error when using assert in a test with multipart message (empty)', function (done) {
-
-        var fn = function () {
-
-            Hoek.assert(false, 'This', 'is', '', 'my message');
-        };
-
-        expect(fn).to.throw('This is my message');
-        done();
-    });
-
-    it('throws an Error when using assert in a test with object message', function (done) {
-
-        var fn = function () {
-
-            Hoek.assert(false, 'This', 'is', { spinal: 'tap' });
-        };
-
-        expect(fn).to.throw('This is {"spinal":"tap"}');
-        done();
-    });
-
-    it('throws an Error when using assert in a test with multipart string and error messages', function (done) {
-
-        var fn = function () {
-
-            Hoek.assert(false, 'This', 'is', new Error('spinal'), new Error('tap'));
-        };
-
-        expect(fn).to.throw('This is spinal tap');
-        done();
-    });
-
-    it('throws an Error when using assert in a test with error object message', function (done) {
-
-        var fn = function () {
-
-            Hoek.assert(false, new Error('This is spinal tap'));
-        };
-
-        expect(fn).to.throw('This is spinal tap');
-        done();
-    });
-
-    it('throws the same Error that is passed to it if there is only one error passed', function (done) {
-
-        var error = new Error('ruh roh');
-        var error2 = new Error('ruh roh');
-
-        var fn = function () {
-
-            Hoek.assert(false, error);
-        };
-
-        try {
-            fn();
-        } catch (err) {
-            expect(error).to.equal(error);  // should be the same reference
-            expect(error).to.not.equal(error2); // error with the same message should not match
-        }
-
-        done();
-    });
-});
-
-describe('Timer', function () {
-
-    it('returns time elapsed', function (done) {
-
-        var timer = new Hoek.Timer();
-        setTimeout(function () {
-
-            expect(timer.elapsed()).to.be.above(9);
-            done();
-        }, 12);
-    });
-});
-
-describe('Bench', function () {
-
-    it('returns time elapsed', function (done) {
-
-        var timer = new Hoek.Bench();
-        setTimeout(function () {
-
-            expect(timer.elapsed()).to.be.above(9);
-            done();
-        }, 12);
-    });
-});
-
-describe('escapeRegex()', function () {
-
-    it('escapes all special regular expression characters', function (done) {
-
-        var a = Hoek.escapeRegex('4^f$s.4*5+-_?%=#!:@|~\\/`"(>)[<]d{}s,');
-        expect(a).to.equal('4\\^f\\$s\\.4\\*5\\+\\-_\\?%\\=#\\!\\:@\\|~\\\\\\/`"\\(>\\)\\[<\\]d\\{\\}s\\,');
-        done();
-    });
-});
-
-describe('Base64Url', function () {
-
-    var base64str = 'AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0-P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn-AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq-wsbKztLW2t7i5uru8vb6_wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t_g4eLj5OXm5-jp6uvs7e7v8PHy8_T19vf4-fr7_P3-_w';
-    var str = unescape('%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29*+%2C-./0123456789%3A%3B%3C%3D%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF');
-
-    describe('base64urlEncode()', function () {
-
-        it('should base64 URL-safe a string', function (done) {
-
-            expect(Hoek.base64urlEncode(str)).to.equal(base64str);
-            done();
-        });
-
-        it('encodes a buffer', function (done) {
-
-            expect(Hoek.base64urlEncode(new Buffer(str, 'binary'))).to.equal(base64str);
-            done();
-        });
-
-        it('should base64 URL-safe a hex string', function (done) {
-
-            var buffer = new Buffer(str, 'binary');
-            expect(Hoek.base64urlEncode(buffer.toString('hex'), 'hex')).to.equal(base64str);
-            done();
-        });
-
-        it('works on larger input strings', function (done) {
-
-            var input = Fs.readFileSync(Path.join(__dirname, 'index.js')).toString();
-            var encoded = Hoek.base64urlEncode(input);
-
-            expect(encoded).to.not.contain('+');
-            expect(encoded).to.not.contain('/');
-
-            var decoded = Hoek.base64urlDecode(encoded);
-
-            expect(decoded).to.equal(input);
-            done();
-        });
-    });
-
-    describe('base64urlDecode()', function () {
-
-        it('should un-base64 URL-safe a string', function (done) {
-
-            expect(Hoek.base64urlDecode(base64str)).to.equal(str);
-            done();
-        });
-
-        it('should un-base64 URL-safe a string into hex', function (done) {
-
-            expect(Hoek.base64urlDecode(base64str, 'hex')).to.equal(new Buffer(str, 'binary').toString('hex'));
-            done();
-        });
-
-        it('should un-base64 URL-safe a string and return a buffer', function (done) {
-
-            var buf = Hoek.base64urlDecode(base64str, 'buffer');
-            expect(buf instanceof Buffer).to.equal(true);
-            expect(buf.toString('binary')).to.equal(str);
-            done();
-        });
-
-        it('returns error on undefined input', function (done) {
-
-            expect(Hoek.base64urlDecode().message).to.exist();
-            done();
-        });
-
-        it('returns error on invalid input', function (done) {
-
-            expect(Hoek.base64urlDecode('*').message).to.exist();
-            done();
-        });
-    });
-});
-
-describe('escapeHeaderAttribute()', function () {
-
-    it('should not alter ascii values', function (done) {
-
-        var a = Hoek.escapeHeaderAttribute('My Value');
-        expect(a).to.equal('My Value');
-        done();
-    });
-
-    it('escapes all special HTTP header attribute characters', function (done) {
-
-        var a = Hoek.escapeHeaderAttribute('I said go!!!#"' + String.fromCharCode(92));
-        expect(a).to.equal('I said go!!!#\\"\\\\');
-        done();
-    });
-
-    it('throws on large unicode characters', function (done) {
-
-        var fn = function () {
-
-            Hoek.escapeHeaderAttribute('this is a test' + String.fromCharCode(500) + String.fromCharCode(300));
-        };
-
-        expect(fn).to.throw(Error);
-        done();
-    });
-
-    it('throws on CRLF to prevent response splitting', function (done) {
-
-        var fn = function () {
-
-            Hoek.escapeHeaderAttribute('this is a test\r\n');
-        };
-
-        expect(fn).to.throw(Error);
-        done();
-    });
-});
-
-describe('escapeHtml()', function () {
-
-    it('escapes all special HTML characters', function (done) {
-
-        var a = Hoek.escapeHtml('&<>"\'`');
-        expect(a).to.equal('&amp;&lt;&gt;&quot;&#x27;&#x60;');
-        done();
-    });
-
-    it('returns empty string on falsy input', function (done) {
-
-        var a = Hoek.escapeHtml('');
-        expect(a).to.equal('');
-        done();
-    });
-
-    it('returns unchanged string on no reserved input', function (done) {
-
-        var a = Hoek.escapeHtml('abc');
-        expect(a).to.equal('abc');
-        done();
-    });
-});
-
-describe('nextTick()', function () {
-
-    it('calls the provided callback on nextTick', function (done) {
-
-        var a = 0;
-
-        var inc = function (step, next) {
-
-            a += step;
-            next();
-        };
-
-        var ticked = Hoek.nextTick(inc);
-
-        ticked(5, function () {
-
-            expect(a).to.equal(6);
-            done();
-        });
-
-        expect(a).to.equal(0);
-        inc(1, function () {
-
-            expect(a).to.equal(1);
-        });
-    });
-});
-
-describe('once()', function () {
-
-    it('allows function to only execute once', function (done) {
-
-        var gen = 0;
-        var add = function (x) {
-
-            gen += x;
-        };
-
-        add(5);
-        expect(gen).to.equal(5);
-        add = Hoek.once(add);
-        add(5);
-        expect(gen).to.equal(10);
-        add(5);
-        expect(gen).to.equal(10);
-        done();
-    });
-
-    it('double once wraps one time', function (done) {
-
-        var method = function () { };
-        method = Hoek.once(method);
-        method.x = 1;
-        method = Hoek.once(method);
-        expect(method.x).to.equal(1);
-        done();
-    });
-});
-
-describe('isAbsoltePath()', function () {
-
-    it('identifies if path is absolute on Unix without node support', { parallel: false }, function (done) {
-
-        var orig = Path.isAbsolute;
-        Path.isAbsolute = undefined;
-
-        expect(Hoek.isAbsolutePath('')).to.equal(false);
-        expect(Hoek.isAbsolutePath('a')).to.equal(false);
-        expect(Hoek.isAbsolutePath('./a')).to.equal(false);
-        expect(Hoek.isAbsolutePath('/a')).to.equal(true);
-        expect(Hoek.isAbsolutePath('/')).to.equal(true);
-
-        Path.isAbsolute = orig;
-
-        done();
-    });
-
-    it('identifies if path is absolute with fake node support', { parallel: false }, function (done) {
-
-        var orig = Path.isAbsolute;
-        Path.isAbsolute = function (path) {
-
-            return path[0] === '/';
-        };
-
-        expect(Hoek.isAbsolutePath('', 'linux')).to.equal(false);
-        expect(Hoek.isAbsolutePath('a', 'linux')).to.equal(false);
-        expect(Hoek.isAbsolutePath('./a', 'linux')).to.equal(false);
-        expect(Hoek.isAbsolutePath('/a', 'linux')).to.equal(true);
-        expect(Hoek.isAbsolutePath('/', 'linux')).to.equal(true);
-
-        Path.isAbsolute = orig;
-
-        done();
-    });
-
-    it('identifies if path is absolute on Windows without node support', { parallel: false }, function (done) {
-
-        var orig = Path.isAbsolute;
-        Path.isAbsolute = undefined;
-
-        expect(Hoek.isAbsolutePath('//server/file', 'win32')).to.equal(true);
-        expect(Hoek.isAbsolutePath('//server/file', 'win32')).to.equal(true);
-        expect(Hoek.isAbsolutePath('\\\\server\\file', 'win32')).to.equal(true);
-        expect(Hoek.isAbsolutePath('C:/Users/', 'win32')).to.equal(true);
-        expect(Hoek.isAbsolutePath('C:\\Users\\', 'win32')).to.equal(true);
-        expect(Hoek.isAbsolutePath('C:cwd/another', 'win32')).to.equal(false);
-        expect(Hoek.isAbsolutePath('C:cwd\\another', 'win32')).to.equal(false);
-        expect(Hoek.isAbsolutePath('directory/directory', 'win32')).to.equal(false);
-        expect(Hoek.isAbsolutePath('directory\\directory', 'win32')).to.equal(false);
-
-        Path.isAbsolute = orig;
-
-        done();
-    });
-});
-
-describe('isInteger()', function () {
-
-    it('validates integers', function (done) {
-
-        expect(Hoek.isInteger(0)).to.equal(true);
-        expect(Hoek.isInteger(1)).to.equal(true);
-        expect(Hoek.isInteger(1394035612500)).to.equal(true);
-        expect(Hoek.isInteger('0')).to.equal(false);
-        expect(Hoek.isInteger(1.0)).to.equal(true);
-        expect(Hoek.isInteger(1.1)).to.equal(false);
-        done();
-    });
-});
-
-describe('ignore()', function () {
-
-    it('exists', function (done) {
-
-        expect(Hoek.ignore).to.exist();
-        expect(typeof Hoek.ignore).to.equal('function');
-        done();
-    });
-});
-
-describe('inherits()', function () {
-
-    it('exists', function (done) {
-
-        expect(Hoek.inherits).to.exist();
-        expect(typeof Hoek.inherits).to.equal('function');
-        done();
-    });
-});
-
-describe('format()', function () {
-
-    it('exists', function (done) {
-
-        expect(Hoek.format).to.exist();
-        expect(typeof Hoek.format).to.equal('function');
-        done();
-    });
-
-    it('is a reference to Util.format', function (done) {
-
-        expect(Hoek.format('hello %s', 'world')).to.equal('hello world');
-        done();
-    });
-});
-
-describe('transform()', function () {
-
-    var source = {
-        address: {
-            one: '123 main street',
-            two: 'PO Box 1234'
-        },
-        zip: {
-            code: 3321232,
-            province: null
-        },
-        title: 'Warehouse',
-        state: 'CA'
-    };
-
-    var sourcesArray = [{
-        address: {
-            one: '123 main street',
-            two: 'PO Box 1234'
-        },
-        zip: {
-            code: 3321232,
-            province: null
-        },
-        title: 'Warehouse',
-        state: 'CA'
-    }, {
-        address: {
-            one: '456 market street',
-            two: 'PO Box 5678'
-        },
-        zip: {
-            code: 9876,
-            province: null
-        },
-        title: 'Garage',
-        state: 'NY'
-    }];
-
-    it('transforms an object based on the input object', function (done) {
-
-        var result = Hoek.transform(source, {
-            'person.address.lineOne': 'address.one',
-            'person.address.lineTwo': 'address.two',
-            'title': 'title',
-            'person.address.region': 'state',
-            'person.address.zip': 'zip.code',
-            'person.address.location': 'zip.province'
-        });
-
-        expect(result).to.deep.equal({
-            person: {
-                address: {
-                    lineOne: '123 main street',
-                    lineTwo: 'PO Box 1234',
-                    region: 'CA',
-                    zip: 3321232,
-                    location: null
-                }
-            },
-            title: 'Warehouse'
-        });
-
-        done();
-    });
-
-    it('transforms an array of objects based on the input object', function (done) {
-
-        var result = Hoek.transform(sourcesArray, {
-            'person.address.lineOne': 'address.one',
-            'person.address.lineTwo': 'address.two',
-            'title': 'title',
-            'person.address.region': 'state',
-            'person.address.zip': 'zip.code',
-            'person.address.location': 'zip.province'
-        });
-
-        expect(result).to.deep.equal([
-            {
-                person: {
-                    address: {
-                        lineOne: '123 main street',
-                        lineTwo: 'PO Box 1234',
-                        region: 'CA',
-                        zip: 3321232,
-                        location: null
-                    }
-                },
-                title: 'Warehouse'
-            },
-            {
-                person: {
-                    address: {
-                        lineOne: '456 market street',
-                        lineTwo: 'PO Box 5678',
-                        region: 'NY',
-                        zip: 9876,
-                        location: null
-                    }
-                },
-                title: 'Garage'
-            }
-        ]);
-
-        done();
-    });
-
-    it('uses the reach options passed into it', function (done) {
-
-        var schema = {
-            'person.address.lineOne': 'address-one',
-            'person.address.lineTwo': 'address-two',
-            'title': 'title',
-            'person.address.region': 'state',
-            'person.prefix': 'person-title',
-            'person.zip': 'zip-code'
-        };
-        var options = {
-            separator: '-',
-            default: 'unknown'
-        };
-        var result = Hoek.transform(source, schema, options);
-
-        expect(result).to.deep.equal({
-            person: {
-                address: {
-                    lineOne: '123 main street',
-                    lineTwo: 'PO Box 1234',
-                    region: 'CA'
-                },
-                prefix: 'unknown',
-                zip: 3321232
-            },
-            title: 'Warehouse'
-        });
-
-        done();
-    });
-
-    it('works to create shallow objects', function (done) {
-
-        var result = Hoek.transform(source, {
-            lineOne: 'address.one',
-            lineTwo: 'address.two',
-            title: 'title',
-            region: 'state',
-            province: 'zip.province'
-        });
-
-        expect(result).to.deep.equal({
-            lineOne: '123 main street',
-            lineTwo: 'PO Box 1234',
-            title: 'Warehouse',
-            region: 'CA',
-            province: null
-        });
-
-        done();
-    });
-
-    it('only allows strings in the map', function (done) {
-
-        expect(function () {
-
-            var result = Hoek.transform(source, {
-                lineOne: {}
-            });
-        }).to.throw('All mappings must be "." delineated strings');
-
-        done();
-    });
-
-    it('throws an error on invalid arguments', function (done) {
-
-        expect(function () {
-
-            var result = Hoek.transform(NaN, {});
-        }).to.throw('Invalid source object: must be null, undefined, an object, or an array');
-
-        done();
-    });
-
-    it('is safe to pass null', function (done) {
-
-        var result = Hoek.transform(null, {});
-        expect(result).to.deep.equal({});
-
-        done();
-    });
-
-    it('is safe to pass undefined', function (done) {
-
-        var result = Hoek.transform(undefined, {});
-        expect(result).to.deep.equal({});
-
-        done();
-    });
-});
-
-describe('uniqueFilename()', function () {
-
-    it('generates a random file path', function (done) {
-
-        var result = Hoek.uniqueFilename('./test/modules');
-
-        expect(result).to.exist();
-        expect(result).to.be.a.string();
-        expect(result).to.contain('test/modules');
-        done();
-    });
-
-    it('is random enough to use in fast loops', function (done) {
-
-        var results = [];
-
-        for (var i = 0; i < 10; ++i) {
-            results[i] = Hoek.uniqueFilename('./test/modules');
-        }
-
-        var filter = results.filter(function (item, index, array) {
-
-            return array.indexOf(item) === index;
-        });
-
-        expect(filter.length).to.equal(10);
-        expect(results.length).to.equal(10);
-        done();
-
-    });
-
-    it('combines the random elements with a supplied character', function (done) {
-
-        var result = Hoek.uniqueFilename('./test', 'txt');
-
-        expect(result).to.contain('test/');
-        expect(result).to.contain('.txt');
-
-        done();
-    });
-
-    it('accepts extensions with a "." in it', function (done) {
-
-        var result = Hoek.uniqueFilename('./test', '.mp3');
-
-        expect(result).to.contain('test/');
-        expect(result).to.contain('.mp3');
-
-        done();
-    });
-});
-
-describe('stringify()', function (done) {
-
-    it('converts object to string', function (done) {
-
-        var obj = { a: 1 };
-        expect(Hoek.stringify(obj)).to.equal('{"a":1}');
-        done();
-    });
-
-    it('returns error in result string', function (done) {
-
-        var obj = { a: 1 };
-        obj.b = obj;
-        expect(Hoek.stringify(obj)).to.equal('[Cannot display object: Converting circular structure to JSON]');
-        done();
-    });
-});
-
-describe('shallow()', function (done) {
-
-    it('shallow copies an object', function (done) {
-
-        var obj = {
-            a: 5,
-            b: {
-                c: 6
-            }
-        };
-
-        var shallow = Hoek.shallow(obj);
-        expect(shallow).to.not.equal(obj);
-        expect(shallow).to.deep.equal(obj);
-        expect(shallow.b).to.equal(obj.b);
-        done();
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/ignore.txt b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/ignore.txt
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test1.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test1.js
deleted file mode 100644
index fa4e06abe0a02696daf6f5cb27e854e7c5404fe7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test1.js
+++ /dev/null
@@ -1 +0,0 @@
-exports.x = 1;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test2.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test2.js
deleted file mode 100644
index 88e9166e860ebc85b4e7215d492c80668fe84f25..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test2.js
+++ /dev/null
@@ -1 +0,0 @@
-exports.y = 2;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test3.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test3.js
deleted file mode 100644
index 670e724a6e6463ca0ce02615e3ebb24335d886e1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/hoek/test/modules/test3.js
+++ /dev/null
@@ -1 +0,0 @@
-exports.z = 3;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/.npmignore
deleted file mode 100644
index 77ba16cb055ca541749d23cb973e1cdfc41504e1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/.npmignore
+++ /dev/null
@@ -1,18 +0,0 @@
-.idea
-*.iml
-npm-debug.log
-dump.rdb
-node_modules
-results.tap
-results.xml
-npm-shrinkwrap.json
-config.json
-.DS_Store
-*/.DS_Store
-*/*/.DS_Store
-._*
-*/._*
-*/*/._*
-coverage.*
-lib-cov
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/.travis.yml
deleted file mode 100755
index 047f7e3d5e1e39a877ae1c4b37d5786d5ee588aa..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/.travis.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-language: node_js
-
-node_js:
-  - 0.10
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/LICENSE
deleted file mode 100755
index b0d877439ead0d0b8422a4ebe75038e75b638938..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/LICENSE
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (c) 2012-2014, Eran Hammer and other contributors.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * The names of any contributors may not be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-                                  *   *   *
-
-The complete list of contributors can be found at: https://github.com/hueniverse/sntp/graphs/contributors
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/Makefile b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/Makefile
deleted file mode 100755
index 417fd93708605f0a88b4cf36f0eab46d9eb653ca..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-test:
-	@node node_modules/lab/bin/lab
-test-cov: 
-	@node node_modules/lab/bin/lab -t 100 -m 3000
-test-cov-html:
-	@node node_modules/lab/bin/lab -r html -o coverage.html
-
-.PHONY: test test-cov test-cov-html
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/README.md
deleted file mode 100755
index 98a6e025dba0b5abf304facb20ab660569c6c06e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/README.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# sntp
-
-An SNTP v4 client (RFC4330) for node. Simpy connects to the NTP or SNTP server requested and returns the server time
-along with the roundtrip duration and clock offset. To adjust the local time to the NTP time, add the returned `t` offset
-to the local time.
-
-[![Build Status](https://secure.travis-ci.org/hueniverse/sntp.png)](http://travis-ci.org/hueniverse/sntp)
-
-# Usage
-
-```javascript
-var Sntp = require('sntp');
-
-// All options are optional
-
-var options = {
-    host: 'nist1-sj.ustiming.org',  // Defaults to pool.ntp.org
-    port: 123,                      // Defaults to 123 (NTP)
-    resolveReference: true,         // Default to false (not resolving)
-    timeout: 1000                   // Defaults to zero (no timeout)
-};
-
-// Request server time
-
-Sntp.time(options, function (err, time) {
-
-    if (err) {
-        console.log('Failed: ' + err.message);
-        process.exit(1);
-    }
-
-    console.log('Local clock is off by: ' + time.t + ' milliseconds');
-    process.exit(0);
-});
-```
-
-If an application needs to maintain continuous time synchronization, the module provides a stateful method for
-querying the current offset only when the last one is too old (defaults to daily).
-
-```javascript
-// Request offset once
-
-Sntp.offset(function (err, offset) {
-
-    console.log(offset);                    // New (served fresh)
-
-    // Request offset again
-
-    Sntp.offset(function (err, offset) {
-
-        console.log(offset);                // Identical (served from cache)
-    });
-});
-```
-
-To set a background offset refresh, start the interval and use the provided now() method. If for any reason the
-client fails to obtain an up-to-date offset, the current system clock is used.
-
-```javascript
-var before = Sntp.now();                    // System time without offset
-
-Sntp.start(function () {
-
-    var now = Sntp.now();                   // With offset
-    Sntp.stop();
-});
-```
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/examples/offset.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/examples/offset.js
deleted file mode 100755
index 0303f6dcfa76231936cbe958ee5558c6eab4d2a3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/examples/offset.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var Sntp = require('../lib');
-
-// Request offset once
-
-Sntp.offset(function (err, offset) {
-
-    console.log(offset);                    // New (served fresh)
-
-    // Request offset again
-
-    Sntp.offset(function (err, offset) {
-
-        console.log(offset);                // Identical (served from cache)
-    });
-});
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/examples/time.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/examples/time.js
deleted file mode 100755
index bd70d0e6a516f4b01fd1d180edd2f0d4aa9dd8d4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/examples/time.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var Sntp = require('../lib');
-
-// All options are optional
-
-var options = {
-    host: 'nist1-sj.ustiming.org',  // Defaults to pool.ntp.org
-    port: 123,                      // Defaults to 123 (NTP)
-    resolveReference: true,         // Default to false (not resolving)
-    timeout: 1000                   // Defaults to zero (no timeout)
-};
-
-// Request server time
-
-Sntp.time(options, function (err, time) {
-
-    if (err) {
-        console.log('Failed: ' + err.message);
-        process.exit(1);
-    }
-
-    console.log(time);
-    console.log('Local clock is off by: ' + time.t + ' milliseconds');
-    process.exit(0);
-});
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/index.js
deleted file mode 100755
index 4cc88b35877b9345761466cf2c4115d76094498c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/index.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('./lib');
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js
deleted file mode 100755
index e91718b4ff5503185a23d419bca0062d7b60d20f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/lib/index.js
+++ /dev/null
@@ -1,412 +0,0 @@
-// Load modules
-
-var Dgram = require('dgram');
-var Dns = require('dns');
-var Hoek = require('hoek');
-
-
-// Declare internals
-
-var internals = {};
-
-
-exports.time = function (options, callback) {
-
-    if (arguments.length !== 2) {
-        callback = arguments[0];
-        options = {};
-    }
-
-    var settings = Hoek.clone(options);
-    settings.host = settings.host || 'pool.ntp.org';
-    settings.port = settings.port || 123;
-    settings.resolveReference = settings.resolveReference || false;
-
-    // Declare variables used by callback
-
-    var timeoutId = 0;
-    var sent = 0;
-
-    // Ensure callback is only called once
-
-    var finish = function (err, result) {
-
-        if (timeoutId) {
-            clearTimeout(timeoutId);
-            timeoutId = 0;
-        }
-
-        socket.removeAllListeners();
-        socket.once('error', internals.ignore);
-        socket.close();
-        return callback(err, result);
-    };
-
-    finish = Hoek.once(finish);
-
-    // Create UDP socket
-
-    var socket = Dgram.createSocket('udp4');
-
-    socket.once('error', function (err) {
-
-        return finish(err);
-    });
-
-    // Listen to incoming messages
-
-    socket.on('message', function (buffer, rinfo) {
-
-        var received = Date.now();
-
-        var message = new internals.NtpMessage(buffer);
-        if (!message.isValid) {
-            return finish(new Error('Invalid server response'), message);
-        }
-
-        if (message.originateTimestamp !== sent) {
-            return finish(new Error('Wrong originate timestamp'), message);
-        }
-
-        // Timestamp Name          ID   When Generated
-        // ------------------------------------------------------------
-        // Originate Timestamp     T1   time request sent by client
-        // Receive Timestamp       T2   time request received by server
-        // Transmit Timestamp      T3   time reply sent by server
-        // Destination Timestamp   T4   time reply received by client
-        //
-        // The roundtrip delay d and system clock offset t are defined as:
-        //
-        // d = (T4 - T1) - (T3 - T2)     t = ((T2 - T1) + (T3 - T4)) / 2
-
-        var T1 = message.originateTimestamp;
-        var T2 = message.receiveTimestamp;
-        var T3 = message.transmitTimestamp;
-        var T4 = received;
-
-        message.d = (T4 - T1) - (T3 - T2);
-        message.t = ((T2 - T1) + (T3 - T4)) / 2;
-        message.receivedLocally = received;
-
-        if (!settings.resolveReference ||
-            message.stratum !== 'secondary') {
-
-            return finish(null, message);
-        }
-
-        // Resolve reference IP address
-
-        Dns.reverse(message.referenceId, function (err, domains) {
-
-            if (/* $lab:coverage:off$ */ !err /* $lab:coverage:on$ */) {
-                message.referenceHost = domains[0];
-            }
-
-            return finish(null, message);
-        });
-    });
-
-    // Set timeout
-
-    if (settings.timeout) {
-        timeoutId = setTimeout(function () {
-
-            timeoutId = 0;
-            return finish(new Error('Timeout'));
-        }, settings.timeout);
-    }
-
-    // Construct NTP message
-
-    var message = new Buffer(48);
-    for (var i = 0; i < 48; i++) {                      // Zero message
-        message[i] = 0;
-    }
-
-    message[0] = (0 << 6) + (4 << 3) + (3 << 0)         // Set version number to 4 and Mode to 3 (client)
-    sent = Date.now();
-    internals.fromMsecs(sent, message, 40);               // Set transmit timestamp (returns as originate)
-
-    // Send NTP request
-
-    socket.send(message, 0, message.length, settings.port, settings.host, function (err, bytes) {
-
-        if (err ||
-            bytes !== 48) {
-
-            return finish(err || new Error('Could not send entire message'));
-        }
-    });
-};
-
-
-internals.NtpMessage = function (buffer) {
-
-    this.isValid = false;
-
-    // Validate
-
-    if (buffer.length !== 48) {
-        return;
-    }
-
-    // Leap indicator
-
-    var li = (buffer[0] >> 6);
-    switch (li) {
-        case 0: this.leapIndicator = 'no-warning'; break;
-        case 1: this.leapIndicator = 'last-minute-61'; break;
-        case 2: this.leapIndicator = 'last-minute-59'; break;
-        case 3: this.leapIndicator = 'alarm'; break;
-    }
-
-    // Version
-
-    var vn = ((buffer[0] & 0x38) >> 3);
-    this.version = vn;
-
-    // Mode
-
-    var mode = (buffer[0] & 0x7);
-    switch (mode) {
-        case 1: this.mode = 'symmetric-active'; break;
-        case 2: this.mode = 'symmetric-passive'; break;
-        case 3: this.mode = 'client'; break;
-        case 4: this.mode = 'server'; break;
-        case 5: this.mode = 'broadcast'; break;
-        case 0:
-        case 6:
-        case 7: this.mode = 'reserved'; break;
-    }
-
-    // Stratum
-
-    var stratum = buffer[1];
-    if (stratum === 0) {
-        this.stratum = 'death';
-    }
-    else if (stratum === 1) {
-        this.stratum = 'primary';
-    }
-    else if (stratum <= 15) {
-        this.stratum = 'secondary';
-    }
-    else {
-        this.stratum = 'reserved';
-    }
-
-    // Poll interval (msec)
-
-    this.pollInterval = Math.round(Math.pow(2, buffer[2])) * 1000;
-
-    // Precision (msecs)
-
-    this.precision = Math.pow(2, buffer[3]) * 1000;
-
-    // Root delay (msecs)
-
-    var rootDelay = 256 * (256 * (256 * buffer[4] + buffer[5]) + buffer[6]) + buffer[7];
-    this.rootDelay = 1000 * (rootDelay / 0x10000);
-
-    // Root dispersion (msecs)
-
-    this.rootDispersion = ((buffer[8] << 8) + buffer[9] + ((buffer[10] << 8) + buffer[11]) / Math.pow(2, 16)) * 1000;
-
-    // Reference identifier
-
-    this.referenceId = '';
-    switch (this.stratum) {
-        case 'death':
-        case 'primary':
-            this.referenceId = String.fromCharCode(buffer[12]) + String.fromCharCode(buffer[13]) + String.fromCharCode(buffer[14]) + String.fromCharCode(buffer[15]);
-            break;
-        case 'secondary':
-            this.referenceId = '' + buffer[12] + '.' + buffer[13] + '.' + buffer[14] + '.' + buffer[15];
-            break;
-    }
-
-    // Reference timestamp
-
-    this.referenceTimestamp = internals.toMsecs(buffer, 16);
-
-    // Originate timestamp
-
-    this.originateTimestamp = internals.toMsecs(buffer, 24);
-
-    // Receive timestamp
-
-    this.receiveTimestamp = internals.toMsecs(buffer, 32);
-
-    // Transmit timestamp
-
-    this.transmitTimestamp = internals.toMsecs(buffer, 40);
-
-    // Validate
-
-    if (this.version === 4 &&
-        this.stratum !== 'reserved' &&
-        this.mode === 'server' &&
-        this.originateTimestamp &&
-        this.receiveTimestamp &&
-        this.transmitTimestamp) {
-
-        this.isValid = true;
-    }
-
-    return this;
-};
-
-
-internals.toMsecs = function (buffer, offset) {
-
-    var seconds = 0;
-    var fraction = 0;
-
-    for (var i = 0; i < 4; ++i) {
-        seconds = (seconds * 256) + buffer[offset + i];
-    }
-
-    for (i = 4; i < 8; ++i) {
-        fraction = (fraction * 256) + buffer[offset + i];
-    }
-
-    return ((seconds - 2208988800 + (fraction / Math.pow(2, 32))) * 1000);
-};
-
-
-internals.fromMsecs = function (ts, buffer, offset) {
-
-    var seconds = Math.floor(ts / 1000) + 2208988800;
-    var fraction = Math.round((ts % 1000) / 1000 * Math.pow(2, 32));
-
-    buffer[offset + 0] = (seconds & 0xFF000000) >> 24;
-    buffer[offset + 1] = (seconds & 0x00FF0000) >> 16;
-    buffer[offset + 2] = (seconds & 0x0000FF00) >> 8;
-    buffer[offset + 3] = (seconds & 0x000000FF);
-
-    buffer[offset + 4] = (fraction & 0xFF000000) >> 24;
-    buffer[offset + 5] = (fraction & 0x00FF0000) >> 16;
-    buffer[offset + 6] = (fraction & 0x0000FF00) >> 8;
-    buffer[offset + 7] = (fraction & 0x000000FF);
-};
-
-
-// Offset singleton
-
-internals.last = {
-    offset: 0,
-    expires: 0,
-    host: '',
-    port: 0
-};
-
-
-exports.offset = function (options, callback) {
-
-    if (arguments.length !== 2) {
-        callback = arguments[0];
-        options = {};
-    }
-
-    var now = Date.now();
-    var clockSyncRefresh = options.clockSyncRefresh || 24 * 60 * 60 * 1000;                    // Daily
-
-    if (internals.last.offset &&
-        internals.last.host === options.host &&
-        internals.last.port === options.port &&
-        now < internals.last.expires) {
-
-        process.nextTick(function () {
-
-            callback(null, internals.last.offset);
-        });
-
-        return;
-    }
-
-    exports.time(options, function (err, time) {
-
-        if (err) {
-            return callback(err, 0);
-        }
-
-        internals.last = {
-            offset: Math.round(time.t),
-            expires: now + clockSyncRefresh,
-            host: options.host,
-            port: options.port
-        };
-
-        return callback(null, internals.last.offset);
-    });
-};
-
-
-// Now singleton
-
-internals.now = {
-    intervalId: 0
-};
-
-
-exports.start = function (options, callback) {
-
-    if (arguments.length !== 2) {
-        callback = arguments[0];
-        options = {};
-    }
-
-    if (internals.now.intervalId) {
-        process.nextTick(function () {
-
-            callback();
-        });
-
-        return;
-    }
-
-    exports.offset(options, function (err, offset) {
-
-        internals.now.intervalId = setInterval(function () {
-
-            exports.offset(options, function () { });
-        }, options.clockSyncRefresh || 24 * 60 * 60 * 1000);                                // Daily
-
-        return callback();
-    });
-};
-
-
-exports.stop = function () {
-
-    if (!internals.now.intervalId) {
-        return;
-    }
-
-    clearInterval(internals.now.intervalId);
-    internals.now.intervalId = 0;
-};
-
-
-exports.isLive = function () {
-
-    return !!internals.now.intervalId;
-};
-
-
-exports.now = function () {
-
-    var now = Date.now();
-    if (!exports.isLive() ||
-        now >= internals.last.expires) {
-
-        return now;
-    }
-
-    return now + internals.last.offset;
-};
-
-
-internals.ignore = function () {
-
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/package.json
deleted file mode 100644
index 9daa0a784cfb1be9edf12bc0f28d1f5336c1e8ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/package.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
-  "_from": "sntp@>=1.0.0 <2.0.0",
-  "_id": "sntp@1.0.9",
-  "_location": "/serialport/node-pre-gyp/request/hawk/sntp",
-  "_npmUser": {
-    "email": "eran@hueniverse.com",
-    "name": "hueniverse"
-  },
-  "_npmVersion": "1.4.23",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/hawk"
-  ],
-  "_resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
-  "_shasum": "6541184cc90aeea6c6e7b35e2659082443c66198",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "eran@hammer.io",
-    "name": "Eran Hammer",
-    "url": "http://hueniverse.com"
-  },
-  "bugs": {
-    "url": "https://github.com/hueniverse/sntp/issues"
-  },
-  "contributors": [],
-  "dependencies": {
-    "hoek": "2.x.x"
-  },
-  "description": "SNTP Client",
-  "devDependencies": {
-    "lab": "4.x.x"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "6541184cc90aeea6c6e7b35e2659082443c66198",
-    "tarball": "http://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz"
-  },
-  "engines": {
-    "node": ">=0.8.0"
-  },
-  "gitHead": "ee2e35284f684609990681734d39010cd356d7da",
-  "homepage": "https://github.com/hueniverse/sntp",
-  "keywords": [
-    "ntp",
-    "sntp",
-    "time"
-  ],
-  "licenses": [
-    {
-      "type": "BSD",
-      "url": "http://github.com/hueniverse/sntp/raw/master/LICENSE"
-    }
-  ],
-  "main": "index",
-  "maintainers": [
-    {
-      "name": "hueniverse",
-      "email": "eran@hueniverse.com"
-    }
-  ],
-  "name": "sntp",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/hueniverse/sntp.git"
-  },
-  "scripts": {
-    "test": "make test-cov"
-  },
-  "version": "1.0.9"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/test/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/test/index.js
deleted file mode 100755
index f1d1cdabf5bb6689b68846140ae438caa8c2a2ff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/node_modules/sntp/test/index.js
+++ /dev/null
@@ -1,435 +0,0 @@
-// Load modules
-
-var Dns = require('dns');
-var Dgram = require('dgram');
-var Lab = require('lab');
-var Sntp = require('../lib');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var before = lab.before;
-var after = lab.after;
-var describe = lab.experiment;
-var it = lab.test;
-var expect = Lab.expect;
-
-
-describe('SNTP', function () {
-
-    describe('#time', function () {
-
-        it('returns consistent result over multiple tries', function (done) {
-
-            Sntp.time(function (err, time) {
-
-                expect(err).to.not.exist;
-                expect(time).to.exist;
-                var t1 = time.t;
-
-                Sntp.time(function (err, time) {
-
-                    expect(err).to.not.exist;
-                    expect(time).to.exist;
-                    var t2 = time.t;
-                    expect(Math.abs(t1 - t2)).is.below(200);
-                    done();
-                });
-            });
-        });
-
-        it('resolves reference IP', function (done) {
-
-            Sntp.time({ host: 'ntp.exnet.com', resolveReference: true }, function (err, time) {
-
-                expect(err).to.not.exist;
-                expect(time).to.exist;
-                expect(time.referenceHost).to.exist;
-                done();
-            });
-        });
-
-        it('times out on no response', function (done) {
-
-            Sntp.time({ port: 124, timeout: 100 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(time).to.not.exist;
-                expect(err.message).to.equal('Timeout');
-                done();
-            });
-        });
-
-        it('errors on error event', { parallel: false }, function (done) {
-
-            var orig = Dgram.createSocket;
-            Dgram.createSocket = function (type) {
-
-                Dgram.createSocket = orig;
-                var socket = Dgram.createSocket(type);
-                setImmediate(function () { socket.emit('error', new Error('Fake')) });
-                return socket;
-            };
-
-            Sntp.time(function (err, time) {
-
-                expect(err).to.exist;
-                expect(time).to.not.exist;
-                expect(err.message).to.equal('Fake');
-                done();
-            });
-        });
-
-        it('errors on incorrect sent size', { parallel: false }, function (done) {
-
-            var orig = Dgram.Socket.prototype.send;
-            Dgram.Socket.prototype.send = function (buf, offset, length, port, address, callback) {
-
-                Dgram.Socket.prototype.send = orig;
-                return callback(null, 40);
-            };
-
-            Sntp.time(function (err, time) {
-
-                expect(err).to.exist;
-                expect(time).to.not.exist;
-                expect(err.message).to.equal('Could not send entire message');
-                done();
-            });
-        });
-
-        it('times out on invalid host', function (done) {
-
-            Sntp.time({ host: 'error', timeout: 10000 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(time).to.not.exist;
-                expect(err.message).to.contain('getaddrinfo');
-                done();
-            });
-        });
-
-        it('fails on bad response buffer size', function (done) {
-
-            var server = Dgram.createSocket('udp4');
-            server.on('message', function (message, remote) {
-                var message = new Buffer(10);
-                server.send(message, 0, message.length, remote.port, remote.address, function (err, bytes) {
-
-                    server.close();
-                });
-            });
-
-            server.bind(49123);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(err.message).to.equal('Invalid server response');
-                done();
-            });
-        });
-
-        var messup = function (bytes) {
-
-            var server = Dgram.createSocket('udp4');
-            server.on('message', function (message, remote) {
-
-                var message = new Buffer([
-                    0x24, 0x01, 0x00, 0xe3,
-                    0x00, 0x00, 0x00, 0x00,
-                    0x00, 0x00, 0x00, 0x00,
-                    0x41, 0x43, 0x54, 0x53,
-                    0xd4, 0xa8, 0x2d, 0xc7,
-                    0x1c, 0x5d, 0x49, 0x1b,
-                    0xd4, 0xa8, 0x2d, 0xe6,
-                    0x67, 0xef, 0x9d, 0xb2,
-                    0xd4, 0xa8, 0x2d, 0xe6,
-                    0x71, 0xed, 0xb5, 0xfb,
-                    0xd4, 0xa8, 0x2d, 0xe6,
-                    0x71, 0xee, 0x6c, 0xc5
-                ]);
-
-                for (var i = 0, il = bytes.length; i < il; ++i) {
-                    message[bytes[i][0]] = bytes[i][1];
-                }
-
-                server.send(message, 0, message.length, remote.port, remote.address, function (err, bytes) {
-
-                    server.close();
-                });
-            });
-
-            server.bind(49123);
-        };
-
-        it('fails on bad version', function (done) {
-
-            messup([[0, (0 << 6) + (3 << 3) + (4 << 0)]]);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(time.version).to.equal(3);
-                expect(err.message).to.equal('Invalid server response');
-                done();
-            });
-        });
-
-        it('fails on bad originateTimestamp', function (done) {
-
-            messup([[24, 0x83], [25, 0xaa], [26, 0x7e], [27, 0x80], [28, 0], [29, 0], [30, 0], [31, 0]]);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(err.message).to.equal('Invalid server response');
-                done();
-            });
-        });
-
-        it('fails on bad receiveTimestamp', function (done) {
-
-            messup([[32, 0x83], [33, 0xaa], [34, 0x7e], [35, 0x80], [36, 0], [37, 0], [38, 0], [39, 0]]);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(err.message).to.equal('Invalid server response');
-                done();
-            });
-        });
-
-        it('fails on bad originate timestamp and alarm li', function (done) {
-
-            messup([[0, (3 << 6) + (4 << 3) + (4 << 0)]]);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(err.message).to.equal('Wrong originate timestamp');
-                expect(time.leapIndicator).to.equal('alarm');
-                done();
-            });
-        });
-
-        it('returns time with death stratum and last61 li', function (done) {
-
-            messup([[0, (1 << 6) + (4 << 3) + (4 << 0)], [1, 0]]);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(time.stratum).to.equal('death');
-                expect(time.leapIndicator).to.equal('last-minute-61');
-                done();
-            });
-        });
-
-        it('returns time with reserved stratum and last59 li', function (done) {
-
-            messup([[0, (2 << 6) + (4 << 3) + (4 << 0)], [1, 0x1f]]);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(time.stratum).to.equal('reserved');
-                expect(time.leapIndicator).to.equal('last-minute-59');
-                done();
-            });
-        });
-
-        it('fails on bad mode (symmetric-active)', function (done) {
-
-            messup([[0, (0 << 6) + (4 << 3) + (1 << 0)]]);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(time.mode).to.equal('symmetric-active');
-                done();
-            });
-        });
-
-        it('fails on bad mode (symmetric-passive)', function (done) {
-
-            messup([[0, (0 << 6) + (4 << 3) + (2 << 0)]]);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(time.mode).to.equal('symmetric-passive');
-                done();
-            });
-        });
-
-        it('fails on bad mode (client)', function (done) {
-
-            messup([[0, (0 << 6) + (4 << 3) + (3 << 0)]]);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(time.mode).to.equal('client');
-                done();
-            });
-        });
-
-        it('fails on bad mode (broadcast)', function (done) {
-
-            messup([[0, (0 << 6) + (4 << 3) + (5 << 0)]]);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(time.mode).to.equal('broadcast');
-                done();
-            });
-        });
-
-        it('fails on bad mode (reserved)', function (done) {
-
-            messup([[0, (0 << 6) + (4 << 3) + (6 << 0)]]);
-
-            Sntp.time({ host: 'localhost', port: 49123 }, function (err, time) {
-
-                expect(err).to.exist;
-                expect(time.mode).to.equal('reserved');
-                done();
-            });
-        });
-    });
-
-    describe('#offset', function () {
-
-        it('gets the current offset', function (done) {
-
-            Sntp.offset(function (err, offset) {
-
-                expect(err).to.not.exist;
-                expect(offset).to.not.equal(0);
-                done();
-            });
-        });
-
-        it('gets the current offset from cache', function (done) {
-
-            Sntp.offset(function (err, offset) {
-
-                expect(err).to.not.exist;
-                expect(offset).to.not.equal(0);
-                var offset1 = offset;
-                Sntp.offset({}, function (err, offset) {
-
-                    expect(err).to.not.exist;
-                    expect(offset).to.equal(offset1);
-                    done();
-                });
-            });
-        });
-
-        it('gets the new offset on different server', function (done) {
-
-            Sntp.offset(function (err, offset) {
-
-                expect(err).to.not.exist;
-                expect(offset).to.not.equal(0);
-                var offset1 = offset;
-                Sntp.offset({ host: 'nist1-sj.ustiming.org' }, function (err, offset) {
-
-                    expect(err).to.not.exist;
-                    expect(offset).to.not.equal(offset1);
-                    done();
-                });
-            });
-        });
-
-        it('gets the new offset on different server', function (done) {
-
-            Sntp.offset(function (err, offset) {
-
-                expect(err).to.not.exist;
-                expect(offset).to.not.equal(0);
-                var offset1 = offset;
-                Sntp.offset({ port: 123 }, function (err, offset) {
-
-                    expect(err).to.not.exist;
-                    expect(offset).to.not.equal(offset1);
-                    done();
-                });
-            });
-        });
-
-        it('fails getting the current offset on invalid server', function (done) {
-
-            Sntp.offset({ host: 'error' }, function (err, offset) {
-
-                expect(err).to.exist;
-                expect(offset).to.equal(0);
-                done();
-            });
-        });
-    });
-
-    describe('#now', function () {
-
-        it('starts auto-sync, gets now, then stops', function (done) {
-
-            Sntp.stop();
-
-            var before = Sntp.now();
-            expect(before).to.equal(Date.now());
-
-            Sntp.start(function () {
-
-                var now = Sntp.now();
-                expect(now).to.not.equal(Date.now());
-                Sntp.stop();
-
-                done();
-            });
-        });
-
-        it('starts twice', function (done) {
-
-            Sntp.start(function () {
-
-                Sntp.start(function () {
-
-                    var now = Sntp.now();
-                    expect(now).to.not.equal(Date.now());
-                    Sntp.stop();
-
-                    done();
-                });
-            });
-        });
-
-        it('starts auto-sync, gets now, waits, gets again after timeout', function (done) {
-
-            Sntp.stop();
-
-            var before = Sntp.now();
-            expect(before).to.equal(Date.now());
-
-            Sntp.start({ clockSyncRefresh: 100 }, function () {
-
-                var now = Sntp.now();
-                expect(now).to.not.equal(Date.now());
-                expect(now).to.equal(Sntp.now());
-
-                setTimeout(function () {
-
-                    expect(Sntp.now()).to.not.equal(now);
-                    Sntp.stop();
-                    done();
-                }, 110);
-            });
-        });
-    });
-});
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/package.json
deleted file mode 100644
index 88601a00e742c43756603611b1cadc40574ad04d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/package.json
+++ /dev/null
@@ -1,75 +0,0 @@
-{
-  "_from": "hawk@>=3.1.0 <3.2.0",
-  "_id": "hawk@3.1.3",
-  "_location": "/serialport/node-pre-gyp/request/hawk",
-  "_nodeVersion": "5.4.1",
-  "_npmUser": {
-    "email": "eran@hammer.io",
-    "name": "hueniverse"
-  },
-  "_npmVersion": "3.3.12",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
-  "_shasum": "078444bd7c1640b0fe540d2c9b73d59678e8e1c4",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "eran@hammer.io",
-    "name": "Eran Hammer",
-    "url": "http://hueniverse.com"
-  },
-  "browser": "./lib/browser.js",
-  "bugs": {
-    "url": "https://github.com/hueniverse/hawk/issues"
-  },
-  "contributors": [],
-  "dependencies": {
-    "boom": "2.x.x",
-    "cryptiles": "2.x.x",
-    "hoek": "2.x.x",
-    "sntp": "1.x.x"
-  },
-  "description": "HTTP Hawk Authentication Scheme",
-  "devDependencies": {
-    "code": "1.x.x",
-    "lab": "5.x.x"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "078444bd7c1640b0fe540d2c9b73d59678e8e1c4",
-    "tarball": "http://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz"
-  },
-  "engines": {
-    "node": ">=0.10.32"
-  },
-  "gitHead": "2f0b93b34ed9b0ebc865838ef70c6a4035591430",
-  "homepage": "https://github.com/hueniverse/hawk#readme",
-  "keywords": [
-    "authentication",
-    "hawk",
-    "http",
-    "scheme"
-  ],
-  "license": "BSD-3-Clause",
-  "main": "lib/index.js",
-  "maintainers": [
-    {
-      "name": "hueniverse",
-      "email": "eran@hueniverse.com"
-    }
-  ],
-  "name": "hawk",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/hueniverse/hawk.git"
-  },
-  "scripts": {
-    "test": "lab -a code -t 100 -L",
-    "test-cov-html": "lab -a code -r html -o coverage.html"
-  },
-  "version": "3.1.3"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/browser.js
deleted file mode 100755
index e18edf78a439c01fff34a08e400e9841b3f8f79a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/browser.js
+++ /dev/null
@@ -1,1492 +0,0 @@
-// Load modules
-
-var Url = require('url');
-var Code = require('code');
-var Hawk = require('../lib');
-var Hoek = require('hoek');
-var Lab = require('lab');
-var Browser = require('../lib/browser');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.experiment;
-var it = lab.test;
-var expect = Code.expect;
-
-
-describe('Browser', function () {
-
-    var credentialsFunc = function (id, callback) {
-
-        var credentials = {
-            id: id,
-            key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-            algorithm: (id === '1' ? 'sha1' : 'sha256'),
-            user: 'steve'
-        };
-
-        return callback(null, credentials);
-    };
-
-    it('should generate a bewit then successfully authenticate it', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?a=1&b=2',
-            host: 'example.com',
-            port: 80
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var bewit = Browser.client.bewit('http://example.com/resource/4?a=1&b=2', { credentials: credentials1, ttlSec: 60 * 60 * 24 * 365 * 100, ext: 'some-app-data' });
-            req.url += '&bewit=' + bewit;
-
-            Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials2, attributes) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(attributes.ext).to.equal('some-app-data');
-                done();
-            });
-        });
-    });
-
-    it('should generate a bewit then successfully authenticate it (no ext)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?a=1&b=2',
-            host: 'example.com',
-            port: 80
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var bewit = Browser.client.bewit('http://example.com/resource/4?a=1&b=2', { credentials: credentials1, ttlSec: 60 * 60 * 24 * 365 * 100 });
-            req.url += '&bewit=' + bewit;
-
-            Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials2, attributes) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                done();
-            });
-        });
-    });
-
-    describe('bewit()', function () {
-
-        it('returns a valid bewit value', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
-            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdca3NjeHdOUjJ0SnBQMVQxekRMTlBiQjVVaUtJVTl0T1NKWFRVZEc3WDloOD1ceGFuZHlhbmR6');
-            done();
-        });
-
-        it('returns a valid bewit value (explicit HTTP port)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Browser.client.bewit('http://example.com:8080/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
-            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcaFpiSjNQMmNLRW80a3kwQzhqa1pBa1J5Q1p1ZWc0V1NOYnhWN3ZxM3hIVT1ceGFuZHlhbmR6');
-            done();
-        });
-
-        it('returns a valid bewit value (explicit HTTPS port)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Browser.client.bewit('https://example.com:8043/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
-            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcL2t4UjhwK0xSaTdvQTRnUXc3cWlxa3BiVHRKYkR4OEtRMC9HRUwvVytTUT1ceGFuZHlhbmR6');
-            done();
-        });
-
-        it('returns a valid bewit value (null ext)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: null });
-            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcSUdZbUxnSXFMckNlOEN4dktQczRKbFdJQStValdKSm91d2dBUmlWaENBZz1c');
-            done();
-        });
-
-        it('errors on invalid options', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', 4);
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on missing uri', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Browser.client.bewit('', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on invalid uri', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Browser.client.bewit(5, { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on invalid credentials (id)', function (done) {
-
-            var credentials = {
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 3000, ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on missing credentials', function (done) {
-
-            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { ttlSec: 3000, ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on invalid credentials (key)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 3000, ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on invalid algorithm', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'hmac-sha-0'
-            };
-
-            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on missing options', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'hmac-sha-0'
-            };
-
-            var bewit = Browser.client.bewit('https://example.com/somewhere/over/the/rainbow');
-            expect(bewit).to.equal('');
-            done();
-        });
-    });
-
-    it('generates a header then successfully parse it (configuration)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data' }).field;
-            expect(req.authorization).to.exist();
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (node request)', function (done) {
-
-        var req = {
-            method: 'POST',
-            url: '/resource/4?filter=a',
-            headers: {
-                host: 'example.com:8080',
-                'content-type': 'text/plain;x=y'
-            }
-        };
-
-        var payload = 'some not so random text';
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var reqHeader = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', payload: payload, contentType: req.headers['content-type'] });
-            req.headers.authorization = reqHeader.field;
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload(payload, credentials2, artifacts, req.headers['content-type'])).to.equal(true);
-
-                var res = {
-                    headers: {
-                        'content-type': 'text/plain'
-                    },
-                    getResponseHeader: function (header) {
-
-                        return res.headers[header.toLowerCase()];
-                    }
-                };
-
-                res.headers['server-authorization'] = Hawk.server.header(credentials2, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-                expect(res.headers['server-authorization']).to.exist();
-
-                expect(Browser.client.authenticate(res, credentials2, artifacts, { payload: 'some reply' })).to.equal(true);
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (browserify)', function (done) {
-
-        var req = {
-            method: 'POST',
-            url: '/resource/4?filter=a',
-            headers: {
-                host: 'example.com:8080',
-                'content-type': 'text/plain;x=y'
-            }
-        };
-
-        var payload = 'some not so random text';
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var reqHeader = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', payload: payload, contentType: req.headers['content-type'] });
-            req.headers.authorization = reqHeader.field;
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload(payload, credentials2, artifacts, req.headers['content-type'])).to.equal(true);
-
-                var res = {
-                    headers: {
-                        'content-type': 'text/plain'
-                    },
-                    getHeader: function (header) {
-
-                        return res.headers[header.toLowerCase()];
-                    }
-                };
-
-                res.headers['server-authorization'] = Hawk.server.header(credentials2, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-                expect(res.headers['server-authorization']).to.exist();
-
-                expect(Browser.client.authenticate(res, credentials2, artifacts, { payload: 'some reply' })).to.equal(true);
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (time offset)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', localtimeOffsetMsec: 100000 }).field;
-            expect(req.authorization).to.exist();
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 100000 }, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (no server header options)', function (done) {
-
-        var req = {
-            method: 'POST',
-            url: '/resource/4?filter=a',
-            headers: {
-                host: 'example.com:8080',
-                'content-type': 'text/plain;x=y'
-            }
-        };
-
-        var payload = 'some not so random text';
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var reqHeader = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', payload: payload, contentType: req.headers['content-type'] });
-            req.headers.authorization = reqHeader.field;
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload(payload, credentials2, artifacts, req.headers['content-type'])).to.equal(true);
-
-                var res = {
-                    headers: {
-                        'content-type': 'text/plain'
-                    },
-                    getResponseHeader: function (header) {
-
-                        return res.headers[header.toLowerCase()];
-                    }
-                };
-
-                res.headers['server-authorization'] = Hawk.server.header(credentials2, artifacts);
-                expect(res.headers['server-authorization']).to.exist();
-
-                expect(Browser.client.authenticate(res, credentials2, artifacts)).to.equal(true);
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (no server header)', function (done) {
-
-        var req = {
-            method: 'POST',
-            url: '/resource/4?filter=a',
-            headers: {
-                host: 'example.com:8080',
-                'content-type': 'text/plain;x=y'
-            }
-        };
-
-        var payload = 'some not so random text';
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var reqHeader = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', payload: payload, contentType: req.headers['content-type'] });
-            req.headers.authorization = reqHeader.field;
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload(payload, credentials2, artifacts, req.headers['content-type'])).to.equal(true);
-
-                var res = {
-                    headers: {
-                        'content-type': 'text/plain'
-                    },
-                    getResponseHeader: function (header) {
-
-                        return res.headers[header.toLowerCase()];
-                    }
-                };
-
-                expect(Browser.client.authenticate(res, credentials2, artifacts)).to.equal(true);
-                done();
-            });
-        });
-    });
-
-    it('generates a header with stale ts and successfully authenticate on second call', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            Browser.utils.setNtpOffset(60 * 60 * 1000);
-            var header = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data' });
-            req.authorization = header.field;
-            expect(req.authorization).to.exist();
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts2) {
-
-                expect(err).to.exist();
-                expect(err.message).to.equal('Stale timestamp');
-
-                var res = {
-                    headers: {
-                        'www-authenticate': err.output.headers['WWW-Authenticate']
-                    },
-                    getResponseHeader: function (lookup) {
-
-                        return res.headers[lookup.toLowerCase()];
-                    }
-                };
-
-                expect(Browser.utils.getNtpOffset()).to.equal(60 * 60 * 1000);
-                expect(Browser.client.authenticate(res, credentials2, header.artifacts)).to.equal(true);
-                expect(Browser.utils.getNtpOffset()).to.equal(0);
-
-                req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials2, ext: 'some-app-data' }).field;
-                expect(req.authorization).to.exist();
-
-                Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials3, artifacts3) {
-
-                    expect(err).to.not.exist();
-                    expect(credentials3.user).to.equal('steve');
-                    expect(artifacts3.ext).to.equal('some-app-data');
-                    done();
-                });
-            });
-        });
-    });
-
-    it('generates a header with stale ts and successfully authenticate on second call (manual localStorage)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var localStorage = new Browser.internals.LocalStorage();
-
-            Browser.utils.setStorage(localStorage);
-
-            Browser.utils.setNtpOffset(60 * 60 * 1000);
-            var header = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data' });
-            req.authorization = header.field;
-            expect(req.authorization).to.exist();
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts2) {
-
-                expect(err).to.exist();
-                expect(err.message).to.equal('Stale timestamp');
-
-                var res = {
-                    headers: {
-                        'www-authenticate': err.output.headers['WWW-Authenticate']
-                    },
-                    getResponseHeader: function (lookup) {
-
-                        return res.headers[lookup.toLowerCase()];
-                    }
-                };
-
-                expect(parseInt(localStorage.getItem('hawk_ntp_offset'))).to.equal(60 * 60 * 1000);
-                expect(Browser.utils.getNtpOffset()).to.equal(60 * 60 * 1000);
-                expect(Browser.client.authenticate(res, credentials2, header.artifacts)).to.equal(true);
-                expect(Browser.utils.getNtpOffset()).to.equal(0);
-                expect(parseInt(localStorage.getItem('hawk_ntp_offset'))).to.equal(0);
-
-                req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials2, ext: 'some-app-data' }).field;
-                expect(req.authorization).to.exist();
-
-                Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials3, artifacts3) {
-
-                    expect(err).to.not.exist();
-                    expect(credentials3.user).to.equal('steve');
-                    expect(artifacts3.ext).to.equal('some-app-data');
-                    done();
-                });
-            });
-        });
-    });
-
-    it('generates a header then fails to parse it (missing server header hash)', function (done) {
-
-        var req = {
-            method: 'POST',
-            url: '/resource/4?filter=a',
-            headers: {
-                host: 'example.com:8080',
-                'content-type': 'text/plain;x=y'
-            }
-        };
-
-        var payload = 'some not so random text';
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var reqHeader = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', payload: payload, contentType: req.headers['content-type'] });
-            req.headers.authorization = reqHeader.field;
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload(payload, credentials2, artifacts, req.headers['content-type'])).to.equal(true);
-
-                var res = {
-                    headers: {
-                        'content-type': 'text/plain'
-                    },
-                    getResponseHeader: function (header) {
-
-                        return res.headers[header.toLowerCase()];
-                    }
-                };
-
-                res.headers['server-authorization'] = Hawk.server.header(credentials2, artifacts);
-                expect(res.headers['server-authorization']).to.exist();
-
-                expect(Browser.client.authenticate(res, credentials2, artifacts, { payload: 'some reply' })).to.equal(false);
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (with hash)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, payload: 'hola!', ext: 'some-app-data' }).field;
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it then validate payload', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, payload: 'hola!', ext: 'some-app-data' }).field;
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload('hola!', credentials2, artifacts)).to.be.true();
-                expect(Hawk.server.authenticatePayload('hello!', credentials2, artifacts)).to.be.false();
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (app)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', app: 'asd23ased' }).field;
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(artifacts.app).to.equal('asd23ased');
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (app, dlg)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', app: 'asd23ased', dlg: '23434szr3q4d' }).field;
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(artifacts.app).to.equal('asd23ased');
-                expect(artifacts.dlg).to.equal('23434szr3q4d');
-                done();
-            });
-        });
-    });
-
-    it('generates a header then fail authentication due to bad hash', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, payload: 'hola!', ext: 'some-app-data' }).field;
-            Hawk.server.authenticate(req, credentialsFunc, { payload: 'byebye!' }, function (err, credentials2, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Bad payload hash');
-                done();
-            });
-        });
-    });
-
-    it('generates a header for one resource then fail to authenticate another', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Browser.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data' }).field;
-            req.url = '/something/else';
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.exist();
-                expect(credentials2).to.exist();
-                done();
-            });
-        });
-    });
-
-    describe('client', function () {
-
-        describe('header()', function () {
-
-            it('returns a valid authorization header (sha1)', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'sha1'
-                };
-
-                var header = Browser.client.header('http://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about' }).field;
-                expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="bsvY3IfUllw6V5rvk4tStEvpBhE=", ext="Bazinga!", mac="qbf1ZPG/r/e06F4ht+T77LXi5vw="');
-                done();
-            });
-
-            it('returns a valid authorization header (sha256)', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'sha256'
-                };
-
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' }).field;
-                expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", ext="Bazinga!", mac="q1CwFoSHzPZSkbIvl0oYlD+91rBUEvFk763nMjMndj8="');
-                done();
-            });
-
-            it('returns a valid authorization header (empty payload)', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'sha1'
-                };
-
-                var header = Browser.client.header('http://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207, nonce: 'Ygvqdz', payload: '' }).field;
-                expect(header).to.equal('Hawk id=\"123456\", ts=\"1353809207\", nonce=\"Ygvqdz\", hash=\"404ghL7K+hfyhByKKejFBRGgTjU=\", ext=\"Bazinga!\", mac=\"Bh1sj1DOfFRWOdi3ww52nLCJdBE=\"');
-                done();
-            });
-
-            it('returns a valid authorization header (no ext)', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'sha256'
-                };
-
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' }).field;
-                expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');
-                done();
-            });
-
-            it('returns a valid authorization header (null ext)', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'sha256'
-                };
-
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain', ext: null }).field;
-                expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');
-                done();
-            });
-
-            it('returns a valid authorization header (uri object)', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'sha256'
-                };
-
-                var uri = Browser.utils.parseUri('https://example.net/somewhere/over/the/rainbow');
-                var header = Browser.client.header(uri, 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' }).field;
-                expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');
-                done();
-            });
-
-            it('errors on missing options', function (done) {
-
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST');
-                expect(header.field).to.equal('');
-                expect(header.err).to.equal('Invalid argument type');
-                done();
-            });
-
-            it('errors on empty uri', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'sha256'
-                };
-
-                var header = Browser.client.header('', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' });
-                expect(header.field).to.equal('');
-                expect(header.err).to.equal('Invalid argument type');
-                done();
-            });
-
-            it('errors on invalid uri', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'sha256'
-                };
-
-                var header = Browser.client.header(4, 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' });
-                expect(header.field).to.equal('');
-                expect(header.err).to.equal('Invalid argument type');
-                done();
-            });
-
-            it('errors on missing method', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'sha256'
-                };
-
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', '', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' });
-                expect(header.field).to.equal('');
-                expect(header.err).to.equal('Invalid argument type');
-                done();
-            });
-
-            it('errors on invalid method', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'sha256'
-                };
-
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 5, { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' });
-                expect(header.field).to.equal('');
-                expect(header.err).to.equal('Invalid argument type');
-                done();
-            });
-
-            it('errors on missing credentials', function (done) {
-
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { ext: 'Bazinga!', timestamp: 1353809207 });
-                expect(header.field).to.equal('');
-                expect(header.err).to.equal('Invalid credentials object');
-                done();
-            });
-
-            it('errors on invalid credentials (id)', function (done) {
-
-                var credentials = {
-                    key: '2983d45yun89q',
-                    algorithm: 'sha256'
-                };
-
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 });
-                expect(header.field).to.equal('');
-                expect(header.err).to.equal('Invalid credentials object');
-                done();
-            });
-
-            it('errors on invalid credentials (key)', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    algorithm: 'sha256'
-                };
-
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 });
-                expect(header.field).to.equal('');
-                expect(header.err).to.equal('Invalid credentials object');
-                done();
-            });
-
-            it('errors on invalid algorithm', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'hmac-sha-0'
-                };
-
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, payload: 'something, anything!', ext: 'Bazinga!', timestamp: 1353809207 });
-                expect(header.field).to.equal('');
-                expect(header.err).to.equal('Unknown algorithm');
-                done();
-            });
-
-            it('uses a pre-calculated payload hash', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: '2983d45yun89q',
-                    algorithm: 'sha256'
-                };
-
-                var options = { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' };
-                options.hash = Browser.crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
-                var header = Browser.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', options).field;
-                expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", ext="Bazinga!", mac="q1CwFoSHzPZSkbIvl0oYlD+91rBUEvFk763nMjMndj8="');
-                done();
-            });
-        });
-
-        describe('authenticate()', function () {
-
-            it('skips tsm validation when missing ts', function (done) {
-
-                var res = {
-                    headers: {
-                        'www-authenticate': 'Hawk error="Stale timestamp"'
-                    },
-                    getResponseHeader: function (header) {
-
-                        return res.headers[header.toLowerCase()];
-                    }
-                };
-
-                var credentials = {
-                    id: '123456',
-                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                    algorithm: 'sha256',
-                    user: 'steve'
-                };
-
-                var artifacts = {
-                    ts: 1402135580,
-                    nonce: 'iBRB6t',
-                    method: 'GET',
-                    resource: '/resource/4?filter=a',
-                    host: 'example.com',
-                    port: '8080',
-                    ext: 'some-app-data'
-                };
-
-                expect(Browser.client.authenticate(res, credentials, artifacts)).to.equal(true);
-                done();
-            });
-
-            it('returns false on invalid header', function (done) {
-
-                var res = {
-                    headers: {
-                        'server-authorization': 'Hawk mac="abc", bad="xyz"'
-                    },
-                    getResponseHeader: function (header) {
-
-                        return res.headers[header.toLowerCase()];
-                    }
-                };
-
-                expect(Browser.client.authenticate(res, {})).to.equal(false);
-                done();
-            });
-
-            it('returns false on invalid mac', function (done) {
-
-                var res = {
-                    headers: {
-                        'content-type': 'text/plain',
-                        'server-authorization': 'Hawk mac="_IJRsMl/4oL+nn+vKoeVZPdCHXB4yJkNnBbTbHFZUYE=", hash="f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=", ext="response-specific"'
-                    },
-                    getResponseHeader: function (header) {
-
-                        return res.headers[header.toLowerCase()];
-                    }
-                };
-
-                var artifacts = {
-                    method: 'POST',
-                    host: 'example.com',
-                    port: '8080',
-                    resource: '/resource/4?filter=a',
-                    ts: '1362336900',
-                    nonce: 'eb5S_L',
-                    hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
-                    ext: 'some-app-data',
-                    app: undefined,
-                    dlg: undefined,
-                    mac: 'BlmSe8K+pbKIb6YsZCnt4E1GrYvY1AaYayNR82dGpIk=',
-                    id: '123456'
-                };
-
-                var credentials = {
-                    id: '123456',
-                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                    algorithm: 'sha256',
-                    user: 'steve'
-                };
-
-                expect(Browser.client.authenticate(res, credentials, artifacts)).to.equal(false);
-                done();
-            });
-
-            it('returns true on ignoring hash', function (done) {
-
-                var res = {
-                    headers: {
-                        'content-type': 'text/plain',
-                        'server-authorization': 'Hawk mac="XIJRsMl/4oL+nn+vKoeVZPdCHXB4yJkNnBbTbHFZUYE=", hash="f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=", ext="response-specific"'
-                    },
-                    getResponseHeader: function (header) {
-
-                        return res.headers[header.toLowerCase()];
-                    }
-                };
-
-                var artifacts = {
-                    method: 'POST',
-                    host: 'example.com',
-                    port: '8080',
-                    resource: '/resource/4?filter=a',
-                    ts: '1362336900',
-                    nonce: 'eb5S_L',
-                    hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
-                    ext: 'some-app-data',
-                    app: undefined,
-                    dlg: undefined,
-                    mac: 'BlmSe8K+pbKIb6YsZCnt4E1GrYvY1AaYayNR82dGpIk=',
-                    id: '123456'
-                };
-
-                var credentials = {
-                    id: '123456',
-                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                    algorithm: 'sha256',
-                    user: 'steve'
-                };
-
-                expect(Browser.client.authenticate(res, credentials, artifacts)).to.equal(true);
-                done();
-            });
-
-            it('errors on invalid WWW-Authenticate header format', function (done) {
-
-                var res = {
-                    headers: {
-                        'www-authenticate': 'Hawk ts="1362346425875", tsm="PhwayS28vtnn3qbv0mqRBYSXebN/zggEtucfeZ620Zo=", x="Stale timestamp"'
-                    },
-                    getResponseHeader: function (header) {
-
-                        return res.headers[header.toLowerCase()];
-                    }
-                };
-
-                expect(Browser.client.authenticate(res, {})).to.equal(false);
-                done();
-            });
-
-            it('errors on invalid WWW-Authenticate header format', function (done) {
-
-                var credentials = {
-                    id: '123456',
-                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                    algorithm: 'sha256',
-                    user: 'steve'
-                };
-
-                var res = {
-                    headers: {
-                        'www-authenticate': 'Hawk ts="1362346425875", tsm="hwayS28vtnn3qbv0mqRBYSXebN/zggEtucfeZ620Zo=", error="Stale timestamp"'
-                    },
-                    getResponseHeader: function (header) {
-
-                        return res.headers[header.toLowerCase()];
-                    }
-                };
-
-                expect(Browser.client.authenticate(res, credentials)).to.equal(false);
-                done();
-            });
-        });
-
-        describe('message()', function () {
-
-            it('generates an authorization then successfully parse it', function (done) {
-
-                credentialsFunc('123456', function (err, credentials1) {
-
-                    var auth = Browser.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                    expect(auth).to.exist();
-
-                    Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                        expect(err).to.not.exist();
-                        expect(credentials2.user).to.equal('steve');
-                        done();
-                    });
-                });
-            });
-
-            it('generates an authorization using custom nonce/timestamp', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var auth = Browser.client.message('example.com', 8080, 'some message', { credentials: credentials, nonce: 'abc123', timestamp: 1398536270957 });
-                    expect(auth).to.exist();
-                    expect(auth.nonce).to.equal('abc123');
-                    expect(auth.ts).to.equal(1398536270957);
-                    done();
-                });
-            });
-
-            it('errors on missing host', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var auth = Browser.client.message(null, 8080, 'some message', { credentials: credentials });
-                    expect(auth).to.not.exist();
-                    done();
-                });
-            });
-
-            it('errors on invalid host', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var auth = Browser.client.message(5, 8080, 'some message', { credentials: credentials });
-                    expect(auth).to.not.exist();
-                    done();
-                });
-            });
-
-            it('errors on missing port', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var auth = Browser.client.message('example.com', 0, 'some message', { credentials: credentials });
-                    expect(auth).to.not.exist();
-                    done();
-                });
-            });
-
-            it('errors on invalid port', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var auth = Browser.client.message('example.com', 'a', 'some message', { credentials: credentials });
-                    expect(auth).to.not.exist();
-                    done();
-                });
-            });
-
-            it('errors on missing message', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var auth = Browser.client.message('example.com', 8080, undefined, { credentials: credentials });
-                    expect(auth).to.not.exist();
-                    done();
-                });
-            });
-
-            it('errors on null message', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var auth = Browser.client.message('example.com', 8080, null, { credentials: credentials });
-                    expect(auth).to.not.exist();
-                    done();
-                });
-            });
-
-            it('errors on invalid message', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var auth = Browser.client.message('example.com', 8080, 5, { credentials: credentials });
-                    expect(auth).to.not.exist();
-                    done();
-                });
-            });
-
-            it('errors on missing credentials', function (done) {
-
-                var auth = Browser.client.message('example.com', 8080, 'some message', {});
-                expect(auth).to.not.exist();
-                done();
-            });
-
-            it('errors on missing options', function (done) {
-
-                var auth = Browser.client.message('example.com', 8080, 'some message');
-                expect(auth).to.not.exist();
-                done();
-            });
-
-            it('errors on invalid credentials (id)', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var creds = Hoek.clone(credentials);
-                    delete creds.id;
-                    var auth = Browser.client.message('example.com', 8080, 'some message', { credentials: creds });
-                    expect(auth).to.not.exist();
-                    done();
-                });
-            });
-
-            it('errors on invalid credentials (key)', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var creds = Hoek.clone(credentials);
-                    delete creds.key;
-                    var auth = Browser.client.message('example.com', 8080, 'some message', { credentials: creds });
-                    expect(auth).to.not.exist();
-                    done();
-                });
-            });
-
-            it('errors on invalid algorithm', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var creds = Hoek.clone(credentials);
-                    creds.algorithm = 'blah';
-                    var auth = Browser.client.message('example.com', 8080, 'some message', { credentials: creds });
-                    expect(auth).to.not.exist();
-                    done();
-                });
-            });
-        });
-
-        describe('authenticateTimestamp()', function (done) {
-
-            it('validates a timestamp', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var tsm = Hawk.crypto.timestampMessage(credentials);
-                    expect(Browser.client.authenticateTimestamp(tsm, credentials)).to.equal(true);
-                    done();
-                });
-            });
-
-            it('validates a timestamp without updating local time', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var offset = Browser.utils.getNtpOffset();
-                    var tsm = Hawk.crypto.timestampMessage(credentials, 10000);
-                    expect(Browser.client.authenticateTimestamp(tsm, credentials, false)).to.equal(true);
-                    expect(offset).to.equal(Browser.utils.getNtpOffset());
-                    done();
-                });
-            });
-
-            it('detects a bad timestamp', function (done) {
-
-                credentialsFunc('123456', function (err, credentials) {
-
-                    var tsm = Hawk.crypto.timestampMessage(credentials);
-                    tsm.ts = 4;
-                    expect(Browser.client.authenticateTimestamp(tsm, credentials)).to.equal(false);
-                    done();
-                });
-            });
-        });
-    });
-
-    describe('internals', function () {
-
-        describe('LocalStorage', function () {
-
-            it('goes through the full lifecycle', function (done) {
-
-                var storage = new Browser.internals.LocalStorage();
-                expect(storage.length).to.equal(0);
-                expect(storage.getItem('a')).to.equal(null);
-                storage.setItem('a', 5);
-                expect(storage.length).to.equal(1);
-                expect(storage.key()).to.equal('a');
-                expect(storage.key(0)).to.equal('a');
-                expect(storage.getItem('a')).to.equal('5');
-                storage.setItem('b', 'test');
-                expect(storage.key()).to.equal('a');
-                expect(storage.key(0)).to.equal('a');
-                expect(storage.key(1)).to.equal('b');
-                expect(storage.length).to.equal(2);
-                expect(storage.getItem('b')).to.equal('test');
-                storage.removeItem('a');
-                expect(storage.length).to.equal(1);
-                expect(storage.getItem('a')).to.equal(null);
-                expect(storage.getItem('b')).to.equal('test');
-                storage.clear();
-                expect(storage.length).to.equal(0);
-                expect(storage.getItem('a')).to.equal(null);
-                expect(storage.getItem('b')).to.equal(null);
-                done();
-            });
-        });
-    });
-
-    describe('utils', function () {
-
-        describe('setStorage()', function () {
-
-            it('sets storage for the first time', function (done) {
-
-                Browser.utils.storage = new Browser.internals.LocalStorage();        // Reset state
-
-                expect(Browser.utils.storage.getItem('hawk_ntp_offset')).to.not.exist();
-                Browser.utils.storage.setItem('test', '1');
-                Browser.utils.setStorage(new Browser.internals.LocalStorage());
-                expect(Browser.utils.storage.getItem('test')).to.not.exist();
-                Browser.utils.storage.setItem('test', '2');
-                expect(Browser.utils.storage.getItem('test')).to.equal('2');
-                done();
-            });
-        });
-
-        describe('setNtpOffset()', function (done) {
-
-            it('catches localStorage errors', { parallel: false }, function (done) {
-
-                var orig = Browser.utils.storage.setItem;
-                var consoleOrig = console.error;
-                var count = 0;
-                console.error = function () {
-
-                    if (count++ === 2) {
-
-                        console.error = consoleOrig;
-                    }
-                };
-
-                Browser.utils.storage.setItem = function () {
-
-                    Browser.utils.storage.setItem = orig;
-                    throw new Error();
-                };
-
-                expect(function () {
-
-                    Browser.utils.setNtpOffset(100);
-                }).not.to.throw();
-
-                done();
-            });
-        });
-
-        describe('parseAuthorizationHeader()', function (done) {
-
-            it('returns null on missing header', function (done) {
-
-                expect(Browser.utils.parseAuthorizationHeader()).to.equal(null);
-                done();
-            });
-
-            it('returns null on bad header syntax (structure)', function (done) {
-
-                expect(Browser.utils.parseAuthorizationHeader('Hawk')).to.equal(null);
-                done();
-            });
-
-            it('returns null on bad header syntax (parts)', function (done) {
-
-                expect(Browser.utils.parseAuthorizationHeader(' ')).to.equal(null);
-                done();
-            });
-
-            it('returns null on bad scheme name', function (done) {
-
-                expect(Browser.utils.parseAuthorizationHeader('Basic asdasd')).to.equal(null);
-                done();
-            });
-
-            it('returns null on bad attribute value', function (done) {
-
-                expect(Browser.utils.parseAuthorizationHeader('Hawk test="\t"', ['test'])).to.equal(null);
-                done();
-            });
-
-            it('returns null on duplicated attribute', function (done) {
-
-                expect(Browser.utils.parseAuthorizationHeader('Hawk test="a", test="b"', ['test'])).to.equal(null);
-                done();
-            });
-        });
-
-        describe('parseUri()', function () {
-
-            it('returns empty object on invalid', function (done) {
-
-                var uri = Browser.utils.parseUri('ftp');
-                expect(uri).to.deep.equal({ host: '', port: '', resource: '' });
-                done();
-            });
-
-            it('returns empty port when unknown scheme', function (done) {
-
-                var uri = Browser.utils.parseUri('ftp://example.com');
-                expect(uri.port).to.equal('');
-                done();
-            });
-
-            it('returns default port when missing', function (done) {
-
-                var uri = Browser.utils.parseUri('http://example.com');
-                expect(uri.port).to.equal('80');
-                done();
-            });
-
-            it('handles unusual characters correctly', function (done) {
-
-                var parts = {
-                    protocol: 'http+vnd.my-extension',
-                    user: 'user!$&\'()*+,;=%40my-domain.com',
-                    password: 'pass!$&\'()*+,;=%40:word',
-                    hostname: 'foo-bar.com',
-                    port: '99',
-                    pathname: '/path/%40/!$&\'()*+,;=:@/',
-                    query: 'query%40/!$&\'()*+,;=:@/?',
-                    fragment: 'fragm%40/!$&\'()*+,;=:@/?'
-                };
-
-                parts.userInfo = parts.user + ':' + parts.password;
-                parts.authority = parts.userInfo + '@' + parts.hostname + ':' + parts.port;
-                parts.relative = parts.pathname + '?' + parts.query;
-                parts.resource = parts.relative + '#' + parts.fragment;
-                parts.source = parts.protocol + '://' + parts.authority + parts.resource;
-
-                var uri = Browser.utils.parseUri(parts.source);
-                expect(uri.host).to.equal('foo-bar.com');
-                expect(uri.port).to.equal('99');
-                expect(uri.resource).to.equal(parts.pathname + '?' + parts.query);
-                done();
-            });
-        });
-
-        var str = 'https://www.google.ca/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=url';
-        var base64str = 'aHR0cHM6Ly93d3cuZ29vZ2xlLmNhL3dlYmhwP3NvdXJjZWlkPWNocm9tZS1pbnN0YW50Jmlvbj0xJmVzcHY9MiZpZT1VVEYtOCNxPXVybA';
-
-        describe('base64urlEncode()', function () {
-
-            it('should base64 URL-safe decode a string', function (done) {
-
-                expect(Browser.utils.base64urlEncode(str)).to.equal(base64str);
-                done();
-            });
-        });
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/client.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/client.js
deleted file mode 100755
index d5ed1c609217bc3db5cc8fce7d657cccdfc5df8f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/client.js
+++ /dev/null
@@ -1,440 +0,0 @@
-// Load modules
-
-var Url = require('url');
-var Code = require('code');
-var Hawk = require('../lib');
-var Lab = require('lab');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.experiment;
-var it = lab.test;
-var expect = Code.expect;
-
-
-describe('Client', function () {
-
-    describe('header()', function () {
-
-        it('returns a valid authorization header (sha1)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha1'
-            };
-
-            var header = Hawk.client.header('http://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about' }).field;
-            expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="bsvY3IfUllw6V5rvk4tStEvpBhE=", ext="Bazinga!", mac="qbf1ZPG/r/e06F4ht+T77LXi5vw="');
-            done();
-        });
-
-        it('returns a valid authorization header (sha256)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' }).field;
-            expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", ext="Bazinga!", mac="q1CwFoSHzPZSkbIvl0oYlD+91rBUEvFk763nMjMndj8="');
-            done();
-        });
-
-        it('returns a valid authorization header (no ext)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' }).field;
-            expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');
-            done();
-        });
-
-        it('returns a valid authorization header (null ext)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain', ext: null }).field;
-            expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');
-            done();
-        });
-
-        it('returns a valid authorization header (empty payload)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: '', contentType: 'text/plain' }).field;
-            expect(header).to.equal('Hawk id=\"123456\", ts=\"1353809207\", nonce=\"Ygvqdz\", hash=\"q/t+NNAkQZNlq/aAD6PlexImwQTxwgT2MahfTa9XRLA=\", mac=\"U5k16YEzn3UnBHKeBzsDXn067Gu3R4YaY6xOt9PYRZM=\"');
-            done();
-        });
-
-        it('returns a valid authorization header (pre hashed payload)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var options = { credentials: credentials, timestamp: 1353809207, nonce: 'Ygvqdz', payload: 'something to write about', contentType: 'text/plain' };
-            options.hash = Hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', options).field;
-            expect(header).to.equal('Hawk id="123456", ts="1353809207", nonce="Ygvqdz", hash="2QfCt3GuY9HQnHWyWD3wX68ZOKbynqlfYmuO2ZBRqtY=", mac="HTgtd0jPI6E4izx8e4OHdO36q00xFCU0FolNq3RiCYs="');
-            done();
-        });
-
-        it('errors on missing uri', function (done) {
-
-            var header = Hawk.client.header('', 'POST');
-            expect(header.field).to.equal('');
-            expect(header.err).to.equal('Invalid argument type');
-            done();
-        });
-
-        it('errors on invalid uri', function (done) {
-
-            var header = Hawk.client.header(4, 'POST');
-            expect(header.field).to.equal('');
-            expect(header.err).to.equal('Invalid argument type');
-            done();
-        });
-
-        it('errors on missing method', function (done) {
-
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', '');
-            expect(header.field).to.equal('');
-            expect(header.err).to.equal('Invalid argument type');
-            done();
-        });
-
-        it('errors on invalid method', function (done) {
-
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 5);
-            expect(header.field).to.equal('');
-            expect(header.err).to.equal('Invalid argument type');
-            done();
-        });
-
-        it('errors on missing options', function (done) {
-
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST');
-            expect(header.field).to.equal('');
-            expect(header.err).to.equal('Invalid argument type');
-            done();
-        });
-
-        it('errors on invalid credentials (id)', function (done) {
-
-            var credentials = {
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 });
-            expect(header.field).to.equal('');
-            expect(header.err).to.equal('Invalid credential object');
-            done();
-        });
-
-        it('errors on missing credentials', function (done) {
-
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { ext: 'Bazinga!', timestamp: 1353809207 });
-            expect(header.field).to.equal('');
-            expect(header.err).to.equal('Invalid credential object');
-            done();
-        });
-
-        it('errors on invalid credentials', function (done) {
-
-            var credentials = {
-                id: '123456',
-                algorithm: 'sha256'
-            };
-
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, ext: 'Bazinga!', timestamp: 1353809207 });
-            expect(header.field).to.equal('');
-            expect(header.err).to.equal('Invalid credential object');
-            done();
-        });
-
-        it('errors on invalid algorithm', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'hmac-sha-0'
-            };
-
-            var header = Hawk.client.header('https://example.net/somewhere/over/the/rainbow', 'POST', { credentials: credentials, payload: 'something, anything!', ext: 'Bazinga!', timestamp: 1353809207 });
-            expect(header.field).to.equal('');
-            expect(header.err).to.equal('Unknown algorithm');
-            done();
-        });
-    });
-
-    describe('authenticate()', function () {
-
-        it('returns false on invalid header', function (done) {
-
-            var res = {
-                headers: {
-                    'server-authorization': 'Hawk mac="abc", bad="xyz"'
-                }
-            };
-
-            expect(Hawk.client.authenticate(res, {})).to.equal(false);
-            done();
-        });
-
-        it('returns false on invalid mac', function (done) {
-
-            var res = {
-                headers: {
-                    'content-type': 'text/plain',
-                    'server-authorization': 'Hawk mac="_IJRsMl/4oL+nn+vKoeVZPdCHXB4yJkNnBbTbHFZUYE=", hash="f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=", ext="response-specific"'
-                }
-            };
-
-            var artifacts = {
-                method: 'POST',
-                host: 'example.com',
-                port: '8080',
-                resource: '/resource/4?filter=a',
-                ts: '1362336900',
-                nonce: 'eb5S_L',
-                hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
-                ext: 'some-app-data',
-                app: undefined,
-                dlg: undefined,
-                mac: 'BlmSe8K+pbKIb6YsZCnt4E1GrYvY1AaYayNR82dGpIk=',
-                id: '123456'
-            };
-
-            var credentials = {
-                id: '123456',
-                key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                algorithm: 'sha256',
-                user: 'steve'
-            };
-
-            expect(Hawk.client.authenticate(res, credentials, artifacts)).to.equal(false);
-            done();
-        });
-
-        it('returns true on ignoring hash', function (done) {
-
-            var res = {
-                headers: {
-                    'content-type': 'text/plain',
-                    'server-authorization': 'Hawk mac="XIJRsMl/4oL+nn+vKoeVZPdCHXB4yJkNnBbTbHFZUYE=", hash="f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=", ext="response-specific"'
-                }
-            };
-
-            var artifacts = {
-                method: 'POST',
-                host: 'example.com',
-                port: '8080',
-                resource: '/resource/4?filter=a',
-                ts: '1362336900',
-                nonce: 'eb5S_L',
-                hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
-                ext: 'some-app-data',
-                app: undefined,
-                dlg: undefined,
-                mac: 'BlmSe8K+pbKIb6YsZCnt4E1GrYvY1AaYayNR82dGpIk=',
-                id: '123456'
-            };
-
-            var credentials = {
-                id: '123456',
-                key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                algorithm: 'sha256',
-                user: 'steve'
-            };
-
-            expect(Hawk.client.authenticate(res, credentials, artifacts)).to.equal(true);
-            done();
-        });
-
-        it('fails on invalid WWW-Authenticate header format', function (done) {
-
-            var header = 'Hawk ts="1362346425875", tsm="PhwayS28vtnn3qbv0mqRBYSXebN/zggEtucfeZ620Zo=", x="Stale timestamp"';
-            expect(Hawk.client.authenticate({ headers: { 'www-authenticate': header } }, {})).to.equal(false);
-            done();
-        });
-
-        it('fails on invalid WWW-Authenticate header format', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                algorithm: 'sha256',
-                user: 'steve'
-            };
-
-            var header = 'Hawk ts="1362346425875", tsm="hwayS28vtnn3qbv0mqRBYSXebN/zggEtucfeZ620Zo=", error="Stale timestamp"';
-            expect(Hawk.client.authenticate({ headers: { 'www-authenticate': header } }, credentials)).to.equal(false);
-            done();
-        });
-
-        it('skips tsm validation when missing ts', function (done) {
-
-            var header = 'Hawk error="Stale timestamp"';
-            expect(Hawk.client.authenticate({ headers: { 'www-authenticate': header } }, {})).to.equal(true);
-            done();
-        });
-    });
-
-    describe('message()', function () {
-
-        it('generates authorization', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha1'
-            };
-
-            var auth = Hawk.client.message('example.com', 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
-            expect(auth).to.exist();
-            expect(auth.ts).to.equal(1353809207);
-            expect(auth.nonce).to.equal('abc123');
-            done();
-        });
-
-        it('errors on invalid host', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha1'
-            };
-
-            var auth = Hawk.client.message(5, 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
-            expect(auth).to.not.exist();
-            done();
-        });
-
-        it('errors on invalid port', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha1'
-            };
-
-            var auth = Hawk.client.message('example.com', '80', 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
-            expect(auth).to.not.exist();
-            done();
-        });
-
-        it('errors on missing host', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha1'
-            };
-
-            var auth = Hawk.client.message('example.com', 0, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
-            expect(auth).to.not.exist();
-            done();
-        });
-
-        it('errors on null message', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha1'
-            };
-
-            var auth = Hawk.client.message('example.com', 80, null, { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
-            expect(auth).to.not.exist();
-            done();
-        });
-
-        it('errors on missing message', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha1'
-            };
-
-            var auth = Hawk.client.message('example.com', 80, undefined, { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
-            expect(auth).to.not.exist();
-            done();
-        });
-
-        it('errors on invalid message', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha1'
-            };
-
-            var auth = Hawk.client.message('example.com', 80, 5, { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
-            expect(auth).to.not.exist();
-            done();
-        });
-
-        it('errors on missing options', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha1'
-            };
-
-            var auth = Hawk.client.message('example.com', 80, 'I am the boodyman');
-            expect(auth).to.not.exist();
-            done();
-        });
-
-        it('errors on invalid credentials (id)', function (done) {
-
-            var credentials = {
-                key: '2983d45yun89q',
-                algorithm: 'sha1'
-            };
-
-            var auth = Hawk.client.message('example.com', 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
-            expect(auth).to.not.exist();
-            done();
-        });
-
-        it('errors on invalid credentials (key)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                algorithm: 'sha1'
-            };
-
-            var auth = Hawk.client.message('example.com', 80, 'I am the boodyman', { credentials: credentials, timestamp: 1353809207, nonce: 'abc123' });
-            expect(auth).to.not.exist();
-            done();
-        });
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/crypto.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/crypto.js
deleted file mode 100755
index a43753b24246d3d957ff54b7f9f0e6a015c4f9d1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/crypto.js
+++ /dev/null
@@ -1,70 +0,0 @@
-// Load modules
-
-var Code = require('code');
-var Hawk = require('../lib');
-var Lab = require('lab');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.experiment;
-var it = lab.test;
-var expect = Code.expect;
-
-
-describe('Crypto', function () {
-
-    describe('generateNormalizedString()', function () {
-
-        it('should return a valid normalized string', function (done) {
-
-            expect(Hawk.crypto.generateNormalizedString('header', {
-                ts: 1357747017,
-                nonce: 'k3k4j5',
-                method: 'GET',
-                resource: '/resource/something',
-                host: 'example.com',
-                port: 8080
-            })).to.equal('hawk.1.header\n1357747017\nk3k4j5\nGET\n/resource/something\nexample.com\n8080\n\n\n');
-
-            done();
-        });
-
-        it('should return a valid normalized string (ext)', function (done) {
-
-            expect(Hawk.crypto.generateNormalizedString('header', {
-                ts: 1357747017,
-                nonce: 'k3k4j5',
-                method: 'GET',
-                resource: '/resource/something',
-                host: 'example.com',
-                port: 8080,
-                ext: 'this is some app data'
-            })).to.equal('hawk.1.header\n1357747017\nk3k4j5\nGET\n/resource/something\nexample.com\n8080\n\nthis is some app data\n');
-
-            done();
-        });
-
-        it('should return a valid normalized string (payload + ext)', function (done) {
-
-            expect(Hawk.crypto.generateNormalizedString('header', {
-                ts: 1357747017,
-                nonce: 'k3k4j5',
-                method: 'GET',
-                resource: '/resource/something',
-                host: 'example.com',
-                port: 8080,
-                hash: 'U4MKKSmiVxk37JCCrAVIjV/OhB3y+NdwoCr6RShbVkE=',
-                ext: 'this is some app data'
-            })).to.equal('hawk.1.header\n1357747017\nk3k4j5\nGET\n/resource/something\nexample.com\n8080\nU4MKKSmiVxk37JCCrAVIjV/OhB3y+NdwoCr6RShbVkE=\nthis is some app data\n');
-
-            done();
-        });
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/index.js
deleted file mode 100755
index 7d1f919690bb9a36d5f1cc784a8c18c5a901fc14..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/index.js
+++ /dev/null
@@ -1,378 +0,0 @@
-// Load modules
-
-var Url = require('url');
-var Code = require('code');
-var Hawk = require('../lib');
-var Lab = require('lab');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.experiment;
-var it = lab.test;
-var expect = Code.expect;
-
-
-describe('Hawk', function () {
-
-    var credentialsFunc = function (id, callback) {
-
-        var credentials = {
-            id: id,
-            key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-            algorithm: (id === '1' ? 'sha1' : 'sha256'),
-            user: 'steve'
-        };
-
-        return callback(null, credentials);
-    };
-
-    it('generates a header then successfully parse it (configuration)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Hawk.client.header(Url.parse('http://example.com:8080/resource/4?filter=a'), req.method, { credentials: credentials1, ext: 'some-app-data' }).field;
-            expect(req.authorization).to.exist();
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (node request)', function (done) {
-
-        var req = {
-            method: 'POST',
-            url: '/resource/4?filter=a',
-            headers: {
-                host: 'example.com:8080',
-                'content-type': 'text/plain;x=y'
-            }
-        };
-
-        var payload = 'some not so random text';
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var reqHeader = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', payload: payload, contentType: req.headers['content-type'] });
-            req.headers.authorization = reqHeader.field;
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload(payload, credentials2, artifacts, req.headers['content-type'])).to.equal(true);
-
-                var res = {
-                    headers: {
-                        'content-type': 'text/plain'
-                    }
-                };
-
-                res.headers['server-authorization'] = Hawk.server.header(credentials2, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-                expect(res.headers['server-authorization']).to.exist();
-
-                expect(Hawk.client.authenticate(res, credentials2, artifacts, { payload: 'some reply' })).to.equal(true);
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (absolute request uri)', function (done) {
-
-        var req = {
-            method: 'POST',
-            url: 'http://example.com:8080/resource/4?filter=a',
-            headers: {
-                host: 'example.com:8080',
-                'content-type': 'text/plain;x=y'
-            }
-        };
-
-        var payload = 'some not so random text';
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var reqHeader = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', payload: payload, contentType: req.headers['content-type'] });
-            req.headers.authorization = reqHeader.field;
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload(payload, credentials2, artifacts, req.headers['content-type'])).to.equal(true);
-
-                var res = {
-                    headers: {
-                        'content-type': 'text/plain'
-                    }
-                };
-
-                res.headers['server-authorization'] = Hawk.server.header(credentials2, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-                expect(res.headers['server-authorization']).to.exist();
-
-                expect(Hawk.client.authenticate(res, credentials2, artifacts, { payload: 'some reply' })).to.equal(true);
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (no server header options)', function (done) {
-
-        var req = {
-            method: 'POST',
-            url: '/resource/4?filter=a',
-            headers: {
-                host: 'example.com:8080',
-                'content-type': 'text/plain;x=y'
-            }
-        };
-
-        var payload = 'some not so random text';
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var reqHeader = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', payload: payload, contentType: req.headers['content-type'] });
-            req.headers.authorization = reqHeader.field;
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload(payload, credentials2, artifacts, req.headers['content-type'])).to.equal(true);
-
-                var res = {
-                    headers: {
-                        'content-type': 'text/plain'
-                    }
-                };
-
-                res.headers['server-authorization'] = Hawk.server.header(credentials2, artifacts);
-                expect(res.headers['server-authorization']).to.exist();
-
-                expect(Hawk.client.authenticate(res, credentials2, artifacts)).to.equal(true);
-                done();
-            });
-        });
-    });
-
-    it('generates a header then fails to parse it (missing server header hash)', function (done) {
-
-        var req = {
-            method: 'POST',
-            url: '/resource/4?filter=a',
-            headers: {
-                host: 'example.com:8080',
-                'content-type': 'text/plain;x=y'
-            }
-        };
-
-        var payload = 'some not so random text';
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var reqHeader = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', payload: payload, contentType: req.headers['content-type'] });
-            req.headers.authorization = reqHeader.field;
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload(payload, credentials2, artifacts, req.headers['content-type'])).to.equal(true);
-
-                var res = {
-                    headers: {
-                        'content-type': 'text/plain'
-                    }
-                };
-
-                res.headers['server-authorization'] = Hawk.server.header(credentials2, artifacts);
-                expect(res.headers['server-authorization']).to.exist();
-
-                expect(Hawk.client.authenticate(res, credentials2, artifacts, { payload: 'some reply' })).to.equal(false);
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (with hash)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, payload: 'hola!', ext: 'some-app-data' }).field;
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it then validate payload', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, payload: 'hola!', ext: 'some-app-data' }).field;
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(Hawk.server.authenticatePayload('hola!', credentials2, artifacts)).to.be.true();
-                expect(Hawk.server.authenticatePayload('hello!', credentials2, artifacts)).to.be.false();
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parses and validates payload', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, payload: 'hola!', ext: 'some-app-data' }).field;
-            Hawk.server.authenticate(req, credentialsFunc, { payload: 'hola!' }, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (app)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', app: 'asd23ased' }).field;
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(artifacts.app).to.equal('asd23ased');
-                done();
-            });
-        });
-    });
-
-    it('generates a header then successfully parse it (app, dlg)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data', app: 'asd23ased', dlg: '23434szr3q4d' }).field;
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(artifacts.ext).to.equal('some-app-data');
-                expect(artifacts.app).to.equal('asd23ased');
-                expect(artifacts.dlg).to.equal('23434szr3q4d');
-                done();
-            });
-        });
-    });
-
-    it('generates a header then fail authentication due to bad hash', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, payload: 'hola!', ext: 'some-app-data' }).field;
-            Hawk.server.authenticate(req, credentialsFunc, { payload: 'byebye!' }, function (err, credentials2, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Bad payload hash');
-                done();
-            });
-        });
-    });
-
-    it('generates a header for one resource then fail to authenticate another', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?filter=a',
-            host: 'example.com',
-            port: 8080
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            req.authorization = Hawk.client.header('http://example.com:8080/resource/4?filter=a', req.method, { credentials: credentials1, ext: 'some-app-data' }).field;
-            req.url = '/something/else';
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials2, artifacts) {
-
-                expect(err).to.exist();
-                expect(credentials2).to.exist();
-                done();
-            });
-        });
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/readme.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/readme.js
deleted file mode 100755
index abc1624458179ed0843ecb79825184100c807b49..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/readme.js
+++ /dev/null
@@ -1,95 +0,0 @@
-// Load modules
-
-var Code = require('code');
-var Hawk = require('../lib');
-var Hoek = require('hoek');
-var Lab = require('lab');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.experiment;
-var it = lab.test;
-var expect = Code.expect;
-
-
-describe('README', function () {
-
-    describe('core', function () {
-
-        var credentials = {
-            id: 'dh37fgj492je',
-            key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-            algorithm: 'sha256'
-        };
-
-        var options = {
-            credentials: credentials,
-            timestamp: 1353832234,
-            nonce: 'j4h3g2',
-            ext: 'some-app-ext-data'
-        };
-
-        it('should generate a header protocol example', function (done) {
-
-            var header = Hawk.client.header('http://example.com:8000/resource/1?b=1&a=2', 'GET', options).field;
-
-            expect(header).to.equal('Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", ext="some-app-ext-data", mac="6R4rV5iE+NPoym+WwjeHzjAGXUtLNIxmo1vpMofpLAE="');
-            done();
-        });
-
-        it('should generate a normalized string protocol example', function (done) {
-
-            var normalized = Hawk.crypto.generateNormalizedString('header', {
-                credentials: credentials,
-                ts: options.timestamp,
-                nonce: options.nonce,
-                method: 'GET',
-                resource: '/resource?a=1&b=2',
-                host: 'example.com',
-                port: 8000,
-                ext: options.ext
-            });
-
-            expect(normalized).to.equal('hawk.1.header\n1353832234\nj4h3g2\nGET\n/resource?a=1&b=2\nexample.com\n8000\n\nsome-app-ext-data\n');
-            done();
-        });
-
-        var payloadOptions = Hoek.clone(options);
-        payloadOptions.payload = 'Thank you for flying Hawk';
-        payloadOptions.contentType = 'text/plain';
-
-        it('should generate a header protocol example (with payload)', function (done) {
-
-            var header = Hawk.client.header('http://example.com:8000/resource/1?b=1&a=2', 'POST', payloadOptions).field;
-
-            expect(header).to.equal('Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", hash="Yi9LfIIFRtBEPt74PVmbTF/xVAwPn7ub15ePICfgnuY=", ext="some-app-ext-data", mac="aSe1DERmZuRl3pI36/9BdZmnErTw3sNzOOAUlfeKjVw="');
-            done();
-        });
-
-        it('should generate a normalized string protocol example (with payload)', function (done) {
-
-            var normalized = Hawk.crypto.generateNormalizedString('header', {
-                credentials: credentials,
-                ts: options.timestamp,
-                nonce: options.nonce,
-                method: 'POST',
-                resource: '/resource?a=1&b=2',
-                host: 'example.com',
-                port: 8000,
-                hash: Hawk.crypto.calculatePayloadHash(payloadOptions.payload, credentials.algorithm, payloadOptions.contentType),
-                ext: options.ext
-            });
-
-            expect(normalized).to.equal('hawk.1.header\n1353832234\nj4h3g2\nPOST\n/resource?a=1&b=2\nexample.com\n8000\nYi9LfIIFRtBEPt74PVmbTF/xVAwPn7ub15ePICfgnuY=\nsome-app-ext-data\n');
-            done();
-        });
-    });
-});
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/server.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/server.js
deleted file mode 100755
index 8c54f0e3098503391982e46ab9296606258e01cc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/server.js
+++ /dev/null
@@ -1,1329 +0,0 @@
-// Load modules
-
-var Url = require('url');
-var Code = require('code');
-var Hawk = require('../lib');
-var Hoek = require('hoek');
-var Lab = require('lab');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.experiment;
-var it = lab.test;
-var expect = Code.expect;
-
-
-describe('Server', function () {
-
-    var credentialsFunc = function (id, callback) {
-
-        var credentials = {
-            id: id,
-            key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-            algorithm: (id === '1' ? 'sha1' : 'sha256'),
-            user: 'steve'
-        };
-
-        return callback(null, credentials);
-    };
-
-    describe('authenticate()', function () {
-
-        it('parses a valid authentication header (sha1)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="1", ts="1353788437", nonce="k3j4h2", mac="zy79QQ5/EYFmQqutVnYb73gAc/U=", ext="hello"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials.user).to.equal('steve');
-                done();
-            });
-        });
-
-        it('parses a valid authentication header (sha256)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/1?b=1&a=2',
-                host: 'example.com',
-                port: 8000,
-                authorization: 'Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", mac="m8r1rHbXN6NgO+KIIhjO7sFRyd78RNGVUwehe8Cp2dU=", ext="some-app-data"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353832234000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials.user).to.equal('steve');
-                done();
-            });
-        });
-
-        it('parses a valid authentication header (host override)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                headers: {
-                    host: 'example1.com:8080',
-                    authorization: 'Hawk id="1", ts="1353788437", nonce="k3j4h2", mac="zy79QQ5/EYFmQqutVnYb73gAc/U=", ext="hello"'
-                }
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { host: 'example.com', localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials.user).to.equal('steve');
-                done();
-            });
-        });
-
-        it('parses a valid authentication header (host port override)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                headers: {
-                    host: 'example1.com:80',
-                    authorization: 'Hawk id="1", ts="1353788437", nonce="k3j4h2", mac="zy79QQ5/EYFmQqutVnYb73gAc/U=", ext="hello"'
-                }
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { host: 'example.com', port: 8080, localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials.user).to.equal('steve');
-                done();
-            });
-        });
-
-        it('parses a valid authentication header (POST with payload)', function (done) {
-
-            var req = {
-                method: 'POST',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123456", ts="1357926341", nonce="1AwuJD", hash="qAiXIVv+yjDATneWxZP2YCTa9aHRgQdnH9b3Wc+o3dg=", ext="some-app-data", mac="UeYcj5UoTVaAWXNvJfLVia7kU3VabxCqrccXP8sUGC4="'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1357926341000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.not.exist();
-                expect(credentials.user).to.equal('steve');
-                done();
-            });
-        });
-
-        it('errors on missing hash', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/1?b=1&a=2',
-                host: 'example.com',
-                port: 8000,
-                authorization: 'Hawk id="dh37fgj492je", ts="1353832234", nonce="j4h3g2", mac="m8r1rHbXN6NgO+KIIhjO7sFRyd78RNGVUwehe8Cp2dU=", ext="some-app-data"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { payload: 'body', localtimeOffsetMsec: 1353832234000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Missing required payload hash');
-                done();
-            });
-        });
-
-        it('errors on a stale timestamp', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123456", ts="1362337299", nonce="UzmxSs", ext="some-app-data", mac="wnNUxchvvryMH2RxckTdZ/gY3ijzvccx4keVvELC61w="'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Stale timestamp');
-                var header = err.output.headers['WWW-Authenticate'];
-                var ts = header.match(/^Hawk ts\=\"(\d+)\"\, tsm\=\"([^\"]+)\"\, error=\"Stale timestamp\"$/);
-                var now = Hawk.utils.now();
-                expect(parseInt(ts[1], 10) * 1000).to.be.within(now - 1000, now + 1000);
-
-                var res = {
-                    headers: {
-                        'www-authenticate': header
-                    }
-                };
-
-                expect(Hawk.client.authenticate(res, credentials, artifacts)).to.equal(true);
-                done();
-            });
-        });
-
-        it('errors on a replay', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="bXx7a7p1h9QYQNZ8x7QhvDQym8ACgab4m3lVSFn4DBw=", ext="hello"'
-            };
-
-            var memoryCache = {};
-            var options = {
-                localtimeOffsetMsec: 1353788437000 - Hawk.utils.now(),
-                nonceFunc: function (key, nonce, ts, callback) {
-
-                    if (memoryCache[key + nonce]) {
-                        return callback(new Error());
-                    }
-
-                    memoryCache[key + nonce] = true;
-                    return callback();
-                }
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, options, function (err, credentials1, artifacts1) {
-
-                expect(err).to.not.exist();
-                expect(credentials1.user).to.equal('steve');
-
-                Hawk.server.authenticate(req, credentialsFunc, options, function (err, credentials2, artifacts2) {
-
-                    expect(err).to.exist();
-                    expect(err.output.payload.message).to.equal('Invalid nonce');
-                    done();
-                });
-            });
-        });
-
-        it('does not error on nonce collision if keys differ', function (done) {
-
-            var reqSteve = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="bXx7a7p1h9QYQNZ8x7QhvDQym8ACgab4m3lVSFn4DBw=", ext="hello"'
-            };
-
-            var reqBob = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="456", ts="1353788437", nonce="k3j4h2", mac="LXfmTnRzrLd9TD7yfH+4se46Bx6AHyhpM94hLCiNia4=", ext="hello"'
-            };
-
-            var credentialsFuncion = function (id, callback) {
-
-                var credentials = {
-                    '123': {
-                        id: id,
-                        key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                        algorithm: (id === '1' ? 'sha1' : 'sha256'),
-                        user: 'steve'
-                    },
-                    '456': {
-                        id: id,
-                        key: 'xrunpaw3489ruxnpa98w4rxnwerxhqb98rpaxn39848',
-                        algorithm: (id === '1' ? 'sha1' : 'sha256'),
-                        user: 'bob'
-                    }
-                };
-
-                return callback(null, credentials[id]);
-            };
-
-            var memoryCache = {};
-            var options = {
-                localtimeOffsetMsec: 1353788437000 - Hawk.utils.now(),
-                nonceFunc: function (key, nonce, ts, callback) {
-
-                    if (memoryCache[key + nonce]) {
-                        return callback(new Error());
-                    }
-
-                    memoryCache[key + nonce] = true;
-                    return callback();
-                }
-            };
-
-            Hawk.server.authenticate(reqSteve, credentialsFuncion, options, function (err, credentials1, artifacts1) {
-
-                expect(err).to.not.exist();
-                expect(credentials1.user).to.equal('steve');
-
-                Hawk.server.authenticate(reqBob, credentialsFuncion, options, function (err, credentials2, artifacts2) {
-
-                    expect(err).to.not.exist();
-                    expect(credentials2.user).to.equal('bob');
-                    done();
-                });
-            });
-        });
-
-        it('errors on an invalid authentication header: wrong scheme', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Basic asdasdasdasd'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.not.exist();
-                done();
-            });
-        });
-
-        it('errors on an invalid authentication header: no scheme', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: '!@#'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Invalid header syntax');
-                done();
-            });
-        });
-
-        it('errors on an missing authorization header', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, {}, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.isMissing).to.equal(true);
-                done();
-            });
-        });
-
-        it('errors on an missing host header', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                headers: {
-                    authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-                }
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Invalid Host header');
-                done();
-            });
-        });
-
-        it('errors on an missing authorization attribute (id)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Missing attributes');
-                done();
-            });
-        });
-
-        it('errors on an missing authorization attribute (ts)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Missing attributes');
-                done();
-            });
-        });
-
-        it('errors on an missing authorization attribute (nonce)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Missing attributes');
-                done();
-            });
-        });
-
-        it('errors on an missing authorization attribute (mac)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", ext="hello"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Missing attributes');
-                done();
-            });
-        });
-
-        it('errors on an unknown authorization attribute', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", x="3", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Unknown attribute: x');
-                done();
-            });
-        });
-
-        it('errors on an bad authorization header format', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123\\", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Bad header format');
-                done();
-            });
-        });
-
-        it('errors on an bad authorization attribute value', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="\t", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Bad attribute value: id');
-                done();
-            });
-        });
-
-        it('errors on an empty authorization attribute value', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Bad attribute value: id');
-                done();
-            });
-        });
-
-        it('errors on duplicated authorization attribute key', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", id="456", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Duplicate attribute: id');
-                done();
-            });
-        });
-
-        it('errors on an invalid authorization header format', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk'
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Invalid header syntax');
-                done();
-            });
-        });
-
-        it('errors on an bad host header (missing host)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                headers: {
-                    host: ':8080',
-                    authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-                }
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Invalid Host header');
-                done();
-            });
-        });
-
-        it('errors on an bad host header (pad port)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                headers: {
-                    host: 'example.com:something',
-                    authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-                }
-            };
-
-            Hawk.server.authenticate(req, credentialsFunc, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Invalid Host header');
-                done();
-            });
-        });
-
-        it('errors on credentialsFunc error', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            var credentialsFuncion = function (id, callback) {
-
-                return callback(new Error('Unknown user'));
-            };
-
-            Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.message).to.equal('Unknown user');
-                done();
-            });
-        });
-
-        it('errors on credentialsFunc error (with credentials)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            var credentialsFuncion = function (id, callback) {
-
-                return callback(new Error('Unknown user'), { some: 'value' });
-            };
-
-            Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.message).to.equal('Unknown user');
-                expect(credentials.some).to.equal('value');
-                done();
-            });
-        });
-
-        it('errors on missing credentials', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            var credentialsFuncion = function (id, callback) {
-
-                return callback(null, null);
-            };
-
-            Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Unknown credentials');
-                done();
-            });
-        });
-
-        it('errors on invalid credentials (id)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            var credentialsFuncion = function (id, callback) {
-
-                var credentials = {
-                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                    user: 'steve'
-                };
-
-                return callback(null, credentials);
-            };
-
-            Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.message).to.equal('Invalid credentials');
-                expect(err.output.payload.message).to.equal('An internal server error occurred');
-                done();
-            });
-        });
-
-        it('errors on invalid credentials (key)', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            var credentialsFuncion = function (id, callback) {
-
-                var credentials = {
-                    id: '23434d3q4d5345d',
-                    user: 'steve'
-                };
-
-                return callback(null, credentials);
-            };
-
-            Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.message).to.equal('Invalid credentials');
-                expect(err.output.payload.message).to.equal('An internal server error occurred');
-                done();
-            });
-        });
-
-        it('errors on unknown credentials algorithm', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcUyW6EEgUH4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            var credentialsFuncion = function (id, callback) {
-
-                var credentials = {
-                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                    algorithm: 'hmac-sha-0',
-                    user: 'steve'
-                };
-
-                return callback(null, credentials);
-            };
-
-            Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.message).to.equal('Unknown algorithm');
-                expect(err.output.payload.message).to.equal('An internal server error occurred');
-                done();
-            });
-        });
-
-        it('errors on unknown bad mac', function (done) {
-
-            var req = {
-                method: 'GET',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="123", ts="1353788437", nonce="k3j4h2", mac="/qwS4UjfVWMcU4jlr7T/wuKe3dKijvTvSos=", ext="hello"'
-            };
-
-            var credentialsFuncion = function (id, callback) {
-
-                var credentials = {
-                    key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                    algorithm: 'sha256',
-                    user: 'steve'
-                };
-
-                return callback(null, credentials);
-            };
-
-            Hawk.server.authenticate(req, credentialsFuncion, { localtimeOffsetMsec: 1353788437000 - Hawk.utils.now() }, function (err, credentials, artifacts) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Bad mac');
-                done();
-            });
-        });
-    });
-
-    describe('header()', function () {
-
-        it('generates header', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                algorithm: 'sha256',
-                user: 'steve'
-            };
-
-            var artifacts = {
-                method: 'POST',
-                host: 'example.com',
-                port: '8080',
-                resource: '/resource/4?filter=a',
-                ts: '1398546787',
-                nonce: 'xUwusx',
-                hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
-                ext: 'some-app-data',
-                mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
-                id: '123456'
-            };
-
-            var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-            expect(header).to.equal('Hawk mac=\"n14wVJK4cOxAytPUMc5bPezQzuJGl5n7MYXhFQgEKsE=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\", ext=\"response-specific\"');
-            done();
-        });
-
-        it('generates header (empty payload)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                algorithm: 'sha256',
-                user: 'steve'
-            };
-
-            var artifacts = {
-                method: 'POST',
-                host: 'example.com',
-                port: '8080',
-                resource: '/resource/4?filter=a',
-                ts: '1398546787',
-                nonce: 'xUwusx',
-                hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
-                ext: 'some-app-data',
-                mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
-                id: '123456'
-            };
-
-            var header = Hawk.server.header(credentials, artifacts, { payload: '', contentType: 'text/plain', ext: 'response-specific' });
-            expect(header).to.equal('Hawk mac=\"i8/kUBDx0QF+PpCtW860kkV/fa9dbwEoe/FpGUXowf0=\", hash=\"q/t+NNAkQZNlq/aAD6PlexImwQTxwgT2MahfTa9XRLA=\", ext=\"response-specific\"');
-            done();
-        });
-
-        it('generates header (pre calculated hash)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                algorithm: 'sha256',
-                user: 'steve'
-            };
-
-            var artifacts = {
-                method: 'POST',
-                host: 'example.com',
-                port: '8080',
-                resource: '/resource/4?filter=a',
-                ts: '1398546787',
-                nonce: 'xUwusx',
-                hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
-                ext: 'some-app-data',
-                mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
-                id: '123456'
-            };
-
-            var options = { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' };
-            options.hash = Hawk.crypto.calculatePayloadHash(options.payload, credentials.algorithm, options.contentType);
-            var header = Hawk.server.header(credentials, artifacts, options);
-            expect(header).to.equal('Hawk mac=\"n14wVJK4cOxAytPUMc5bPezQzuJGl5n7MYXhFQgEKsE=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\", ext=\"response-specific\"');
-            done();
-        });
-
-        it('generates header (null ext)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                algorithm: 'sha256',
-                user: 'steve'
-            };
-
-            var artifacts = {
-                method: 'POST',
-                host: 'example.com',
-                port: '8080',
-                resource: '/resource/4?filter=a',
-                ts: '1398546787',
-                nonce: 'xUwusx',
-                hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
-                mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
-                id: '123456'
-            };
-
-            var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: null });
-            expect(header).to.equal('Hawk mac=\"6PrybJTJs20jsgBw5eilXpcytD8kUbaIKNYXL+6g0ns=\", hash=\"f9cDF/TDm7TkYRLnGwRMfeDzT6LixQVLvrIKhh0vgmM=\"');
-            done();
-        });
-
-        it('errors on missing artifacts', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                algorithm: 'sha256',
-                user: 'steve'
-            };
-
-            var header = Hawk.server.header(credentials, null, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-            expect(header).to.equal('');
-            done();
-        });
-
-        it('errors on invalid artifacts', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                algorithm: 'sha256',
-                user: 'steve'
-            };
-
-            var header = Hawk.server.header(credentials, 5, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-            expect(header).to.equal('');
-            done();
-        });
-
-        it('errors on missing credentials', function (done) {
-
-            var artifacts = {
-                method: 'POST',
-                host: 'example.com',
-                port: '8080',
-                resource: '/resource/4?filter=a',
-                ts: '1398546787',
-                nonce: 'xUwusx',
-                hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
-                ext: 'some-app-data',
-                mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
-                id: '123456'
-            };
-
-            var header = Hawk.server.header(null, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-            expect(header).to.equal('');
-            done();
-        });
-
-        it('errors on invalid credentials (key)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                algorithm: 'sha256',
-                user: 'steve'
-            };
-
-            var artifacts = {
-                method: 'POST',
-                host: 'example.com',
-                port: '8080',
-                resource: '/resource/4?filter=a',
-                ts: '1398546787',
-                nonce: 'xUwusx',
-                hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
-                ext: 'some-app-data',
-                mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
-                id: '123456'
-            };
-
-            var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-            expect(header).to.equal('');
-            done();
-        });
-
-        it('errors on invalid algorithm', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-                algorithm: 'x',
-                user: 'steve'
-            };
-
-            var artifacts = {
-                method: 'POST',
-                host: 'example.com',
-                port: '8080',
-                resource: '/resource/4?filter=a',
-                ts: '1398546787',
-                nonce: 'xUwusx',
-                hash: 'nJjkVtBE5Y/Bk38Aiokwn0jiJxt/0S2WRSUwWLCf5xk=',
-                ext: 'some-app-data',
-                mac: 'dvIvMThwi28J61Jc3P0ryAhuKpanU63GXdx6hkmQkJA=',
-                id: '123456'
-            };
-
-            var header = Hawk.server.header(credentials, artifacts, { payload: 'some reply', contentType: 'text/plain', ext: 'response-specific' });
-            expect(header).to.equal('');
-            done();
-        });
-    });
-
-    describe('authenticateBewit()', function () {
-
-        it('errors on uri too long', function (done) {
-
-            var long = '/';
-            for (var i = 0; i < 5000; ++i) {
-                long += 'x';
-            }
-
-            var req = {
-                method: 'GET',
-                url: long,
-                host: 'example.com',
-                port: 8080,
-                authorization: 'Hawk id="1", ts="1353788437", nonce="k3j4h2", mac="zy79QQ5/EYFmQqutVnYb73gAc/U=", ext="hello"'
-            };
-
-            Hawk.server.authenticateBewit(req, credentialsFunc, {}, function (err, credentials, bewit) {
-
-                expect(err).to.exist();
-                expect(err.output.statusCode).to.equal(400);
-                expect(err.message).to.equal('Resource path exceeds max length');
-                done();
-            });
-        });
-    });
-
-    describe('authenticateMessage()', function () {
-
-        it('errors on invalid authorization (ts)', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                delete auth.ts;
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Invalid authorization');
-                    done();
-                });
-            });
-        });
-
-        it('errors on invalid authorization (nonce)', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                delete auth.nonce;
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Invalid authorization');
-                    done();
-                });
-            });
-        });
-
-        it('errors on invalid authorization (hash)', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                delete auth.hash;
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Invalid authorization');
-                    done();
-                });
-            });
-        });
-
-        it('errors with credentials', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, function (id, callback) {
-
-                    callback(new Error('something'), { some: 'value' });
-                }, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('something');
-                    expect(credentials2.some).to.equal('value');
-                    done();
-                });
-            });
-        });
-
-        it('errors on nonce collision', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {
-                    nonceFunc: function (key, nonce, ts, nonceCallback) {
-
-                        nonceCallback(true);
-                    }
-                }, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Invalid nonce');
-                    done();
-                });
-            });
-        });
-
-        it('should generate an authorization then successfully parse it', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.not.exist();
-                    expect(credentials2.user).to.equal('steve');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on mismatching host', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example1.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Bad mac');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on stale timestamp', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { localtimeOffsetMsec: 100000 }, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Stale timestamp');
-                    done();
-                });
-            });
-        });
-
-        it('overrides timestampSkewSec', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1, localtimeOffsetMsec: 100000 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { timestampSkewSec: 500 }, function (err, credentials2) {
-
-                    expect(err).to.not.exist();
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on invalid authorization', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-                delete auth.id;
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Invalid authorization');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on bad hash', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message1', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Bad message hash');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on nonce error', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {
-                    nonceFunc: function (key, nonce, ts, callback) {
-
-                        callback(new Error('kaboom'));
-                    }
-                }, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Invalid nonce');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on credentials error', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                var errFunc = function (id, callback) {
-
-                    callback(new Error('kablooey'));
-                };
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('kablooey');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on missing credentials', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                var errFunc = function (id, callback) {
-
-                    callback();
-                };
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Unknown credentials');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on invalid credentials', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                var errFunc = function (id, callback) {
-
-                    callback(null, {});
-                };
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Invalid credentials');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on invalid credentials algorithm', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                var errFunc = function (id, callback) {
-
-                    callback(null, { key: '123', algorithm: '456' });
-                };
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Unknown algorithm');
-                    done();
-                });
-            });
-        });
-
-        it('should fail on missing host', function (done) {
-
-            credentialsFunc('123456', function (err, credentials) {
-
-                var auth = Hawk.client.message(null, 8080, 'some message', { credentials: credentials });
-                expect(auth).to.not.exist();
-                done();
-            });
-        });
-
-        it('should fail on missing credentials', function (done) {
-
-            var auth = Hawk.client.message('example.com', 8080, 'some message', {});
-            expect(auth).to.not.exist();
-            done();
-        });
-
-        it('should fail on invalid algorithm', function (done) {
-
-            credentialsFunc('123456', function (err, credentials) {
-
-                var creds = Hoek.clone(credentials);
-                creds.algorithm = 'blah';
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: creds });
-                expect(auth).to.not.exist();
-                done();
-            });
-        });
-    });
-
-    describe('authenticatePayloadHash()', function () {
-
-        it('checks payload hash', function (done) {
-
-            expect(Hawk.server.authenticatePayloadHash('abcdefg', { hash: 'abcdefg' })).to.equal(true);
-            expect(Hawk.server.authenticatePayloadHash('1234567', { hash: 'abcdefg' })).to.equal(false);
-            done();
-        });
-    });
-});
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/uri.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/uri.js
deleted file mode 100755
index dee7c64322e6ad709c4b252bdcafc4a6f9559c1e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/uri.js
+++ /dev/null
@@ -1,838 +0,0 @@
-// Load modules
-
-var Http = require('http');
-var Url = require('url');
-var Code = require('code');
-var Hawk = require('../lib');
-var Hoek = require('hoek');
-var Lab = require('lab');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.experiment;
-var it = lab.test;
-var expect = Code.expect;
-
-
-describe('Uri', function () {
-
-    var credentialsFunc = function (id, callback) {
-
-        var credentials = {
-            id: id,
-            key: 'werxhqb98rpaxn39848xrunpaw3489ruxnpa98w4rxn',
-            algorithm: (id === '1' ? 'sha1' : 'sha256'),
-            user: 'steve'
-        };
-
-        return callback(null, credentials);
-    };
-
-    it('should generate a bewit then successfully authenticate it', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?a=1&b=2',
-            host: 'example.com',
-            port: 80
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var bewit = Hawk.uri.getBewit('http://example.com/resource/4?a=1&b=2', { credentials: credentials1, ttlSec: 60 * 60 * 24 * 365 * 100, ext: 'some-app-data' });
-            req.url += '&bewit=' + bewit;
-
-            Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials2, attributes) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                expect(attributes.ext).to.equal('some-app-data');
-                done();
-            });
-        });
-    });
-
-    it('should generate a bewit then successfully authenticate it (no ext)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?a=1&b=2',
-            host: 'example.com',
-            port: 80
-        };
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var bewit = Hawk.uri.getBewit('http://example.com/resource/4?a=1&b=2', { credentials: credentials1, ttlSec: 60 * 60 * 24 * 365 * 100 });
-            req.url += '&bewit=' + bewit;
-
-            Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials2, attributes) {
-
-                expect(err).to.not.exist();
-                expect(credentials2.user).to.equal('steve');
-                done();
-            });
-        });
-    });
-
-    it('should successfully authenticate a request (last param)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?a=1&b=2&bewit=MTIzNDU2XDQ1MTE0ODQ2MjFcMzFjMmNkbUJFd1NJRVZDOVkva1NFb2c3d3YrdEVNWjZ3RXNmOGNHU2FXQT1cc29tZS1hcHAtZGF0YQ',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.not.exist();
-            expect(credentials.user).to.equal('steve');
-            expect(attributes.ext).to.equal('some-app-data');
-            done();
-        });
-    });
-
-    it('should successfully authenticate a request (first param)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=MTIzNDU2XDQ1MTE0ODQ2MjFcMzFjMmNkbUJFd1NJRVZDOVkva1NFb2c3d3YrdEVNWjZ3RXNmOGNHU2FXQT1cc29tZS1hcHAtZGF0YQ&a=1&b=2',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.not.exist();
-            expect(credentials.user).to.equal('steve');
-            expect(attributes.ext).to.equal('some-app-data');
-            done();
-        });
-    });
-
-    it('should successfully authenticate a request (only param)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=MTIzNDU2XDQ1MTE0ODQ2NDFcZm1CdkNWT3MvcElOTUUxSTIwbWhrejQ3UnBwTmo4Y1VrSHpQd3Q5OXJ1cz1cc29tZS1hcHAtZGF0YQ',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.not.exist();
-            expect(credentials.user).to.equal('steve');
-            expect(attributes.ext).to.equal('some-app-data');
-            done();
-        });
-    });
-
-    it('should fail on multiple authentication', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=MTIzNDU2XDQ1MTE0ODQ2NDFcZm1CdkNWT3MvcElOTUUxSTIwbWhrejQ3UnBwTmo4Y1VrSHpQd3Q5OXJ1cz1cc29tZS1hcHAtZGF0YQ',
-            host: 'example.com',
-            port: 8080,
-            authorization: 'Basic asdasdasdasd'
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Multiple authentications');
-            done();
-        });
-    });
-
-    it('should fail on method other than GET', function (done) {
-
-        credentialsFunc('123456', function (err, credentials1) {
-
-            var req = {
-                method: 'POST',
-                url: '/resource/4?filter=a',
-                host: 'example.com',
-                port: 8080
-            };
-
-            var exp = Math.floor(Hawk.utils.now() / 1000) + 60;
-            var ext = 'some-app-data';
-            var mac = Hawk.crypto.calculateMac('bewit', credentials1, {
-                timestamp: exp,
-                nonce: '',
-                method: req.method,
-                resource: req.url,
-                host: req.host,
-                port: req.port,
-                ext: ext
-            });
-
-            var bewit = credentials1.id + '\\' + exp + '\\' + mac + '\\' + ext;
-
-            req.url += '&bewit=' + Hoek.base64urlEncode(bewit);
-
-            Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials2, attributes) {
-
-                expect(err).to.exist();
-                expect(err.output.payload.message).to.equal('Invalid method');
-                done();
-            });
-        });
-    });
-
-    it('should fail on invalid host header', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',
-            headers: {
-                host: 'example.com:something'
-            }
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Invalid Host header');
-            done();
-        });
-    });
-
-    it('should fail on empty bewit', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Empty bewit');
-            expect(err.isMissing).to.not.exist();
-            done();
-        });
-    });
-
-    it('should fail on invalid bewit', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=*',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Invalid bewit encoding');
-            expect(err.isMissing).to.not.exist();
-            done();
-        });
-    });
-
-    it('should fail on missing bewit', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.not.exist();
-            expect(err.isMissing).to.equal(true);
-            done();
-        });
-    });
-
-    it('should fail on invalid bewit structure', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=abc',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Invalid bewit structure');
-            done();
-        });
-    });
-
-    it('should fail on empty bewit attribute', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=YVxcY1xk',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Missing bewit attributes');
-            done();
-        });
-    });
-
-    it('should fail on missing bewit id attribute', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=XDQ1NTIxNDc2MjJcK0JFbFhQMXhuWjcvd1Nrbm1ldGhlZm5vUTNHVjZNSlFVRHk4NWpTZVJ4VT1cc29tZS1hcHAtZGF0YQ',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Missing bewit attributes');
-            done();
-        });
-    });
-
-    it('should fail on expired access', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?a=1&b=2&bewit=MTIzNDU2XDEzNTY0MTg1ODNcWk1wZlMwWU5KNHV0WHpOMmRucTRydEk3NXNXTjFjeWVITTcrL0tNZFdVQT1cc29tZS1hcHAtZGF0YQ',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, credentialsFunc, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Access expired');
-            done();
-        });
-    });
-
-    it('should fail on credentials function error', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, function (id, callback) {
-
-            callback(Hawk.error.badRequest('Boom'));
-        }, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Boom');
-            done();
-        });
-    });
-
-    it('should fail on credentials function error with credentials', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, function (id, callback) {
-
-            callback(Hawk.error.badRequest('Boom'), { some: 'value' });
-        }, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Boom');
-            expect(credentials.some).to.equal('value');
-            done();
-        });
-    });
-
-    it('should fail on null credentials function response', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, function (id, callback) {
-
-            callback(null, null);
-        }, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Unknown credentials');
-            done();
-        });
-    });
-
-    it('should fail on invalid credentials function response', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, function (id, callback) {
-
-            callback(null, {});
-        }, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.message).to.equal('Invalid credentials');
-            done();
-        });
-    });
-
-    it('should fail on invalid credentials function response (unknown algorithm)', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, function (id, callback) {
-
-            callback(null, { key: 'xxx', algorithm: 'xxx' });
-        }, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.message).to.equal('Unknown algorithm');
-            done();
-        });
-    });
-
-    it('should fail on expired access', function (done) {
-
-        var req = {
-            method: 'GET',
-            url: '/resource/4?bewit=MTIzNDU2XDQ1MDk5OTE3MTlcTUE2eWkwRWRwR0pEcWRwb0JkYVdvVDJrL0hDSzA1T0Y3MkhuZlVmVy96Zz1cc29tZS1hcHAtZGF0YQ',
-            host: 'example.com',
-            port: 8080
-        };
-
-        Hawk.uri.authenticate(req, function (id, callback) {
-
-            callback(null, { key: 'xxx', algorithm: 'sha256' });
-        }, {}, function (err, credentials, attributes) {
-
-            expect(err).to.exist();
-            expect(err.output.payload.message).to.equal('Bad mac');
-            done();
-        });
-    });
-
-    describe('getBewit()', function () {
-
-        it('returns a valid bewit value', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
-            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdca3NjeHdOUjJ0SnBQMVQxekRMTlBiQjVVaUtJVTl0T1NKWFRVZEc3WDloOD1ceGFuZHlhbmR6');
-            done();
-        });
-
-        it('returns a valid bewit value (explicit port)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Hawk.uri.getBewit('https://example.com:8080/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
-            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcaFpiSjNQMmNLRW80a3kwQzhqa1pBa1J5Q1p1ZWc0V1NOYnhWN3ZxM3hIVT1ceGFuZHlhbmR6');
-            done();
-        });
-
-        it('returns a valid bewit value (null ext)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: null });
-            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdcSUdZbUxnSXFMckNlOEN4dktQczRKbFdJQStValdKSm91d2dBUmlWaENBZz1c');
-            done();
-        });
-
-        it('returns a valid bewit value (parsed uri)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Hawk.uri.getBewit(Url.parse('https://example.com/somewhere/over/the/rainbow'), { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
-            expect(bewit).to.equal('MTIzNDU2XDEzNTY0MjA3MDdca3NjeHdOUjJ0SnBQMVQxekRMTlBiQjVVaUtJVTl0T1NKWFRVZEc3WDloOD1ceGFuZHlhbmR6');
-            done();
-        });
-
-        it('errors on invalid options', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', 4);
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on missing uri', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Hawk.uri.getBewit('', { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on invalid uri', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Hawk.uri.getBewit(5, { credentials: credentials, ttlSec: 300, localtimeOffsetMsec: 1356420407232 - Hawk.utils.now(), ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on invalid credentials (id)', function (done) {
-
-            var credentials = {
-                key: '2983d45yun89q',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 3000, ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on missing credentials', function (done) {
-
-            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { ttlSec: 3000, ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on invalid credentials (key)', function (done) {
-
-            var credentials = {
-                id: '123456',
-                algorithm: 'sha256'
-            };
-
-            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 3000, ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on invalid algorithm', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'hmac-sha-0'
-            };
-
-            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow', { credentials: credentials, ttlSec: 300, ext: 'xandyandz' });
-            expect(bewit).to.equal('');
-            done();
-        });
-
-        it('errors on missing options', function (done) {
-
-            var credentials = {
-                id: '123456',
-                key: '2983d45yun89q',
-                algorithm: 'hmac-sha-0'
-            };
-
-            var bewit = Hawk.uri.getBewit('https://example.com/somewhere/over/the/rainbow');
-            expect(bewit).to.equal('');
-            done();
-        });
-    });
-
-    describe('authenticateMessage()', function () {
-
-        it('should generate an authorization then successfully parse it', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.not.exist();
-                    expect(credentials2.user).to.equal('steve');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on mismatching host', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example1.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Bad mac');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on stale timestamp', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { localtimeOffsetMsec: 100000 }, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Stale timestamp');
-                    done();
-                });
-            });
-        });
-
-        it('overrides timestampSkewSec', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1, localtimeOffsetMsec: 100000 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, { timestampSkewSec: 500 }, function (err, credentials2) {
-
-                    expect(err).to.not.exist();
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on invalid authorization', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-                delete auth.id;
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Invalid authorization');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on bad hash', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message1', auth, credentialsFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Bad message hash');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on nonce error', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, credentialsFunc, {
-                    nonceFunc: function (key, nonce, ts, callback) {
-
-                        callback(new Error('kaboom'));
-                    }
-                }, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Invalid nonce');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on credentials error', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                var errFunc = function (id, callback) {
-
-                    callback(new Error('kablooey'));
-                };
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('kablooey');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on missing credentials', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                var errFunc = function (id, callback) {
-
-                    callback();
-                };
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Unknown credentials');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on invalid credentials', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                var errFunc = function (id, callback) {
-
-                    callback(null, {});
-                };
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Invalid credentials');
-                    done();
-                });
-            });
-        });
-
-        it('should fail authorization on invalid credentials algorithm', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.exist();
-
-                var errFunc = function (id, callback) {
-
-                    callback(null, { key: '123', algorithm: '456' });
-                };
-
-                Hawk.server.authenticateMessage('example.com', 8080, 'some message', auth, errFunc, {}, function (err, credentials2) {
-
-                    expect(err).to.exist();
-                    expect(err.message).to.equal('Unknown algorithm');
-                    done();
-                });
-            });
-        });
-
-        it('should fail on missing host', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var auth = Hawk.client.message(null, 8080, 'some message', { credentials: credentials1 });
-                expect(auth).to.not.exist();
-                done();
-            });
-        });
-
-        it('should fail on missing credentials', function (done) {
-
-            var auth = Hawk.client.message('example.com', 8080, 'some message', {});
-            expect(auth).to.not.exist();
-            done();
-        });
-
-        it('should fail on invalid algorithm', function (done) {
-
-            credentialsFunc('123456', function (err, credentials1) {
-
-                var creds = Hoek.clone(credentials1);
-                creds.algorithm = 'blah';
-                var auth = Hawk.client.message('example.com', 8080, 'some message', { credentials: creds });
-                expect(auth).to.not.exist();
-                done();
-            });
-        });
-    });
-});
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/utils.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/utils.js
deleted file mode 100755
index ccfcd412aaf886bfe0c1c8e1822c7b72ecf70b12..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/hawk/test/utils.js
+++ /dev/null
@@ -1,149 +0,0 @@
-// Load modules
-
-var Code = require('code');
-var Hawk = require('../lib');
-var Lab = require('lab');
-var Package = require('../package.json');
-
-
-// Declare internals
-
-var internals = {};
-
-
-// Test shortcuts
-
-var lab = exports.lab = Lab.script();
-var describe = lab.experiment;
-var it = lab.test;
-var expect = Code.expect;
-
-
-describe('Utils', function () {
-
-    describe('parseHost()', function () {
-
-        it('returns port 80 for non tls node request', function (done) {
-
-            var req = {
-                method: 'POST',
-                url: '/resource/4?filter=a',
-                headers: {
-                    host: 'example.com',
-                    'content-type': 'text/plain;x=y'
-                }
-            };
-
-            expect(Hawk.utils.parseHost(req, 'Host').port).to.equal(80);
-            done();
-        });
-
-        it('returns port 443 for non tls node request', function (done) {
-
-            var req = {
-                method: 'POST',
-                url: '/resource/4?filter=a',
-                headers: {
-                    host: 'example.com',
-                    'content-type': 'text/plain;x=y'
-                },
-                connection: {
-                    encrypted: true
-                }
-            };
-
-            expect(Hawk.utils.parseHost(req, 'Host').port).to.equal(443);
-            done();
-        });
-
-        it('returns port 443 for non tls node request (IPv6)', function (done) {
-
-            var req = {
-                method: 'POST',
-                url: '/resource/4?filter=a',
-                headers: {
-                    host: '[123:123:123]',
-                    'content-type': 'text/plain;x=y'
-                },
-                connection: {
-                    encrypted: true
-                }
-            };
-
-            expect(Hawk.utils.parseHost(req, 'Host').port).to.equal(443);
-            done();
-        });
-
-        it('parses IPv6 headers', function (done) {
-
-            var req = {
-                method: 'POST',
-                url: '/resource/4?filter=a',
-                headers: {
-                    host: '[123:123:123]:8000',
-                    'content-type': 'text/plain;x=y'
-                },
-                connection: {
-                    encrypted: true
-                }
-            };
-
-            var host = Hawk.utils.parseHost(req, 'Host');
-            expect(host.port).to.equal('8000');
-            expect(host.name).to.equal('[123:123:123]');
-            done();
-        });
-
-        it('errors on header too long', function (done) {
-
-            var long = '';
-            for (var i = 0; i < 5000; ++i) {
-                long += 'x';
-            }
-
-            expect(Hawk.utils.parseHost({ headers: { host: long } })).to.be.null();
-            done();
-        });
-    });
-
-    describe('parseAuthorizationHeader()', function () {
-
-        it('errors on header too long', function (done) {
-
-            var long = 'Scheme a="';
-            for (var i = 0; i < 5000; ++i) {
-                long += 'x';
-            }
-            long += '"';
-
-            var err = Hawk.utils.parseAuthorizationHeader(long, ['a']);
-            expect(err).to.be.instanceof(Error);
-            expect(err.message).to.equal('Header length too long');
-            done();
-        });
-    });
-
-    describe('version()', function () {
-
-        it('returns the correct package version number', function (done) {
-
-            expect(Hawk.utils.version()).to.equal(Package.version);
-            done();
-        });
-    });
-
-    describe('unauthorized()', function () {
-
-        it('returns a hawk 401', function (done) {
-
-            expect(Hawk.utils.unauthorized('kaboom').output.headers['WWW-Authenticate']).to.equal('Hawk error="kaboom"');
-            done();
-        });
-
-        it('supports attributes', function (done) {
-
-            expect(Hawk.utils.unauthorized('kaboom', { a: 'b' }).output.headers['WWW-Authenticate']).to.equal('Hawk a="b", error="kaboom"');
-            done();
-        });
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/.dir-locals.el b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/.dir-locals.el
deleted file mode 100644
index 3bc9235f2556235596bd1c0300d6230b67175e7e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/.dir-locals.el
+++ /dev/null
@@ -1,6 +0,0 @@
-((nil . ((indent-tabs-mode . nil)
-         (tab-width . 8)
-         (fill-column . 80)))
- (js-mode . ((js-indent-level . 2)
-             (indent-tabs-mode . nil)
-             )))
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/.npmignore
deleted file mode 100644
index c143fb3a46cac24077d3223bdf6fb6314a56489d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/.npmignore
+++ /dev/null
@@ -1,7 +0,0 @@
-.gitmodules
-deps
-docs
-Makefile
-node_modules
-test
-tools
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/CHANGES.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/CHANGES.md
deleted file mode 100644
index 6f69444ba6a0f66ac97319c73222858065b53a64..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/CHANGES.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# node-http-signature changelog
-
-## 1.1.1
-
-- Version of dependency `assert-plus` updated: old version was missing
-  some license information
-- Corrected examples in `http_signing.md`, added auto-tests to
-  automatically validate these examples
-
-## 1.1.0
-
-- Bump version of `sshpk` dependency, remove peerDependency on it since
-  it now supports exchanging objects between multiple versions of itself
-  where possible
-
-## 1.0.2
-
-- Bump min version of `jsprim` dependency, to include fixes for using
-  http-signature with `browserify`
-
-## 1.0.1
-
-- Bump minimum version of `sshpk` dependency, to include fixes for
-  whitespace tolerance in key parsing.
-
-## 1.0.0
-
-- First semver release.
-- #36: Ensure verifySignature does not leak useful timing information
-- #42: Bring the library up to the latest version of the spec (including the 
-       request-target changes)
-- Support for ECDSA keys and signatures.
-- Now uses `sshpk` for key parsing, validation and conversion.
-- Fixes for #21, #47, #39 and compatibility with node 0.8
-
-## 0.11.0
-
-- Split up HMAC and Signature verification to avoid vulnerabilities where a
-  key intended for use with one can be validated against the other method
-  instead.
-
-## 0.10.2
-
-- Updated versions of most dependencies.
-- Utility functions exported for PEM => SSH-RSA conversion.
-- Improvements to tests and examples.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/LICENSE
deleted file mode 100644
index f6d947d2f61c41777fb3bbb66334a93122bf5fdc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright Joyent, Inc. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/README.md
deleted file mode 100644
index de487d3236ac696e8df6a7d07f1c4a308d9cda76..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/README.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# node-http-signature
-
-node-http-signature is a node.js library that has client and server components
-for Joyent's [HTTP Signature Scheme](http_signing.md).
-
-## Usage
-
-Note the example below signs a request with the same key/cert used to start an
-HTTP server. This is almost certainly not what you actually want, but is just
-used to illustrate the API calls; you will need to provide your own key
-management in addition to this library.
-
-### Client
-
-```js
-var fs = require('fs');
-var https = require('https');
-var httpSignature = require('http-signature');
-
-var key = fs.readFileSync('./key.pem', 'ascii');
-
-var options = {
-  host: 'localhost',
-  port: 8443,
-  path: '/',
-  method: 'GET',
-  headers: {}
-};
-
-// Adds a 'Date' header in, signs it, and adds the
-// 'Authorization' header in.
-var req = https.request(options, function(res) {
-  console.log(res.statusCode);
-});
-
-
-httpSignature.sign(req, {
-  key: key,
-  keyId: './cert.pem'
-});
-
-req.end();
-```
-
-### Server
-
-```js
-var fs = require('fs');
-var https = require('https');
-var httpSignature = require('http-signature');
-
-var options = {
-  key: fs.readFileSync('./key.pem'),
-  cert: fs.readFileSync('./cert.pem')
-};
-
-https.createServer(options, function (req, res) {
-  var rc = 200;
-  var parsed = httpSignature.parseRequest(req);
-  var pub = fs.readFileSync(parsed.keyId, 'ascii');
-  if (!httpSignature.verifySignature(parsed, pub))
-    rc = 401;
-
-  res.writeHead(rc);
-  res.end();
-}).listen(8443);
-```
-
-## Installation
-
-    npm install http-signature
-
-## License
-
-MIT.
-
-## Bugs
-
-See <https://github.com/joyent/node-http-signature/issues>.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/http_signing.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/http_signing.md
deleted file mode 100644
index 4f24d28c3c21d77a135ac561775215450fc924a3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/http_signing.md
+++ /dev/null
@@ -1,363 +0,0 @@
-# Abstract
-
-This document describes a way to add origin authentication, message integrity,
-and replay resistance to HTTP REST requests.  It is intended to be used over
-the HTTPS protocol.
-
-# Copyright Notice
-
-Copyright (c) 2011 Joyent, Inc. and the persons identified as document authors.
-All rights reserved.
-
-Code Components extracted from this document must include MIT License text.
-
-# Introduction
-
-This protocol is intended to provide a standard way for clients to sign HTTP
-requests.  RFC2617 (HTTP Authentication) defines Basic and Digest authentication
-mechanisms, and RFC5246 (TLS 1.2) defines client-auth, both of which are widely
-employed on the Internet today.  However, it is common place that the burdens of
-PKI prevent web service operators from deploying that methodology, and so many
-fall back to Basic authentication, which has poor security characteristics.
-
-Additionally, OAuth provides a fully-specified alternative for authorization
-of web service requests, but is not (always) ideal for machine to machine
-communication, as the key acquisition steps (generally) imply a fixed
-infrastructure that may not make sense to a service provider (e.g., symmetric
-keys).
-
-Several web service providers have invented their own schemes for signing
-HTTP requests, but to date, none have been placed in the public domain as a
-standard.  This document serves that purpose.  There are no techniques in this
-proposal that are novel beyond previous art, however, this aims to be a simple
-mechanism for signing these requests.
-
-# Signature Authentication Scheme
-
-The "signature" authentication scheme is based on the model that the client must
-authenticate itself with a digital signature produced by either a private
-asymmetric key (e.g., RSA) or a shared symmetric key (e.g., HMAC).  The scheme
-is parameterized enough such that it is not bound to any particular key type or
-signing algorithm.  However, it does explicitly assume that clients can send an
-HTTP `Date` header.
-
-## Authorization Header
-
-The client is expected to send an Authorization header (as defined in RFC 2617)
-with the following parameterization:
-
-    credentials := "Signature" params
-    params := 1#(keyId | algorithm | [headers] | [ext] | signature)
-    digitalSignature := plain-string
-
-    keyId := "keyId" "=" <"> plain-string <">
-    algorithm := "algorithm" "=" <"> plain-string <">
-    headers := "headers" "=" <"> 1#headers-value <">
-    ext := "ext" "=" <"> plain-string <">
-    signature := "signature" "=" <"> plain-string <">
-
-    headers-value := plain-string
-    plain-string   = 1*( %x20-21 / %x23-5B / %x5D-7E )
-
-### Signature Parameters
-
-#### keyId
-
-REQUIRED.  The `keyId` field is an opaque string that the server can use to look
-up the component they need to validate the signature.  It could be an SSH key
-fingerprint, an LDAP DN, etc.  Management of keys and assignment of `keyId` is
-out of scope for this document.
-
-#### algorithm
-
-REQUIRED. The `algorithm` parameter is used if the client and server agree on a
-non-standard digital signature algorithm.  The full list of supported signature
-mechanisms is listed below.
-
-#### headers
-
-OPTIONAL.  The `headers` parameter is used to specify the list of HTTP headers
-used to sign the request.  If specified, it should be a quoted list of HTTP
-header names, separated by a single space character.  By default, only one
-HTTP header is signed, which is the `Date` header.  Note that the list MUST be
-specified in the order the values are concatenated together during signing. To
-include the HTTP request line in the signature calculation, use the special
-`request-line` value.  While this is overloading the definition of `headers` in
-HTTP linguism, the request-line is defined in RFC 2616, and as the outlier from
-headers in useful signature calculation, it is deemed simpler to simply use
-`request-line` than to add a separate parameter for it.
-
-#### extensions
-
-OPTIONAL.  The `extensions` parameter is used to include additional information
-which is covered by the request.  The content and format of the string is out of
-scope for this document, and expected to be specified by implementors.
-
-#### signature
-
-REQUIRED.  The `signature` parameter is a `Base64` encoded digital signature
-generated by the client. The client uses the `algorithm` and `headers` request
-parameters to form a canonicalized `signing string`.  This `signing string` is
-then signed with the key associated with `keyId` and the algorithm
-corresponding to `algorithm`.  The `signature` parameter is then set to the
-`Base64` encoding of the signature.
-
-### Signing String Composition
-
-In order to generate the string that is signed with a key, the client MUST take
-the values of each HTTP header specified by `headers` in the order they appear.
-
-1. If the header name is not `request-line` then append the lowercased header
-   name followed with an ASCII colon `:` and an ASCII space ` `.
-2. If the header name is `request-line` then append the HTTP request line,
-   otherwise append the header value.
-3. If value is not the last value then append an ASCII newline `\n`. The string
-   MUST NOT include a trailing ASCII newline.
-
-# Example Requests
-
-All requests refer to the following request (body omitted):
-
-    POST /foo HTTP/1.1
-    Host: example.org
-    Date: Tue, 07 Jun 2014 20:51:35 GMT
-    Content-Type: application/json
-    Digest: SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
-    Content-Length: 18
-
-The "rsa-key-1" keyId refers to a private key known to the client and a public
-key known to the server. The "hmac-key-1" keyId refers to key known to the
-client and server.
-
-## Default parameterization
-
-The authorization header and signature would be generated as:
-
-    Authorization: Signature keyId="rsa-key-1",algorithm="rsa-sha256",signature="Base64(RSA-SHA256(signing string))"
-
-The client would compose the signing string as:
-
-    date: Tue, 07 Jun 2014 20:51:35 GMT
-
-## Header List
-
-The authorization header and signature would be generated as:
-
-    Authorization: Signature keyId="rsa-key-1",algorithm="rsa-sha256",headers="(request-target) date content-type digest",signature="Base64(RSA-SHA256(signing string))"
-
-The client would compose the signing string as (`+ "\n"` inserted for
-readability):
-
-    (request-target) post /foo + "\n"
-    date: Tue, 07 Jun 2011 20:51:35 GMT + "\n"
-    content-type: application/json + "\n"
-    digest: SHA-256=Base64(SHA256(Body))
-
-## Algorithm
-
-The authorization header and signature would be generated as:
-
-    Authorization: Signature keyId="hmac-key-1",algorithm="hmac-sha1",signature="Base64(HMAC-SHA1(signing string))"
-
-The client would compose the signing string as:
-
-    date: Tue, 07 Jun 2011 20:51:35 GMT
-
-# Signing Algorithms
-
-Currently supported algorithm names are:
-
-* rsa-sha1
-* rsa-sha256
-* rsa-sha512
-* dsa-sha1
-* hmac-sha1
-* hmac-sha256
-* hmac-sha512
-
-# Security Considerations
-
-## Default Parameters
-
-Note the default parameterization of the `Signature` scheme is only safe if all
-requests are carried over a secure transport (i.e., TLS).  Sending the default
-scheme over a non-secure transport will leave the request vulnerable to
-spoofing, tampering, replay/repudiation, and integrity violations (if using the
-STRIDE threat-modeling methodology).
-
-## Insecure Transports
-
-If sending the request over plain HTTP, service providers SHOULD require clients
-to sign ALL HTTP headers, and the `request-line`.  Additionally, service
-providers SHOULD require `Content-MD5` calculations to be performed to ensure
-against any tampering from clients.
-
-## Nonces
-
-Nonces are out of scope for this document simply because many service providers
-fail to implement them correctly, or do not adopt security specifications
-because of the infrastructure complexity.  Given the `header` parameterization,
-a service provider is fully enabled to add nonce semantics into this scheme by
-using something like an `x-request-nonce` header, and ensuring it is signed
-with the `Date` header.
-
-## Clock Skew
-
-As the default scheme is to sign the `Date` header, service providers SHOULD
-protect against logged replay attacks by enforcing a clock skew.  The server
-SHOULD be synchronized with NTP, and the recommendation in this specification
-is to allow 300s of clock skew (in either direction).
-
-## Required Headers to Sign
-
-It is out of scope for this document to dictate what headers a service provider
-will want to enforce, but service providers SHOULD at minimum include the
-`Date` header.
-
-# References
-
-## Normative References
-
-* [RFC2616] Hypertext Transfer Protocol -- HTTP/1.1
-* [RFC2617] HTTP Authentication: Basic and Digest Access Authentication
-* [RFC5246] The Transport Layer Security (TLS) Protocol Version 1.2
-
-## Informative References
-
-    Name: Mark Cavage (editor)
-    Company: Joyent, Inc.
-    Email: mark.cavage@joyent.com
-    URI: http://www.joyent.com
-
-# Appendix A - Test Values
-
-The following test data uses the RSA (1024b) keys, which we will refer
-to as `keyId=Test` in the following samples:
-
-    -----BEGIN PUBLIC KEY-----
-    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCFENGw33yGihy92pDjZQhl0C3
-    6rPJj+CvfSC8+q28hxA161QFNUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6
-    Z4UMR7EOcpfdUE9Hf3m/hs+FUR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJw
-    oYi+1hqp1fIekaxsyQIDAQAB
-    -----END PUBLIC KEY-----
-
-    -----BEGIN RSA PRIVATE KEY-----
-    MIICXgIBAAKBgQDCFENGw33yGihy92pDjZQhl0C36rPJj+CvfSC8+q28hxA161QF
-    NUd13wuCTUcq0Qd2qsBe/2hFyc2DCJJg0h1L78+6Z4UMR7EOcpfdUE9Hf3m/hs+F
-    UR45uBJeDK1HSFHD8bHKD6kv8FPGfJTotc+2xjJwoYi+1hqp1fIekaxsyQIDAQAB
-    AoGBAJR8ZkCUvx5kzv+utdl7T5MnordT1TvoXXJGXK7ZZ+UuvMNUCdN2QPc4sBiA
-    QWvLw1cSKt5DsKZ8UETpYPy8pPYnnDEz2dDYiaew9+xEpubyeW2oH4Zx71wqBtOK
-    kqwrXa/pzdpiucRRjk6vE6YY7EBBs/g7uanVpGibOVAEsqH1AkEA7DkjVH28WDUg
-    f1nqvfn2Kj6CT7nIcE3jGJsZZ7zlZmBmHFDONMLUrXR/Zm3pR5m0tCmBqa5RK95u
-    412jt1dPIwJBANJT3v8pnkth48bQo/fKel6uEYyboRtA5/uHuHkZ6FQF7OUkGogc
-    mSJluOdc5t6hI1VsLn0QZEjQZMEOWr+wKSMCQQCC4kXJEsHAve77oP6HtG/IiEn7
-    kpyUXRNvFsDE0czpJJBvL/aRFUJxuRK91jhjC68sA7NsKMGg5OXb5I5Jj36xAkEA
-    gIT7aFOYBFwGgQAQkWNKLvySgKbAZRTeLBacpHMuQdl1DfdntvAyqpAZ0lY0RKmW
-    G6aFKaqQfOXKCyWoUiVknQJAXrlgySFci/2ueKlIE1QqIiLSZ8V8OlpFLRnb1pzI
-    7U1yQXnTAEFYM560yJlzUpOb1V4cScGd365tiSMvxLOvTA==
-    -----END RSA PRIVATE KEY-----
-
-And all examples use this request:
-
-<!-- httpreq -->
-
-    POST /foo?param=value&pet=dog HTTP/1.1
-    Host: example.com
-    Date: Thu, 05 Jan 2014 21:31:40 GMT
-    Content-Type: application/json
-    Digest: SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
-    Content-Length: 18
-
-    {"hello": "world"}
-
-<!-- /httpreq -->
-
-### Default
-
-The string to sign would be:
-
-<!-- sign {"name": "Default", "options": {"keyId":"Test", "algorithm": "rsa-sha256"}} -->
-<!-- signstring -->
-
-    date: Thu, 05 Jan 2014 21:31:40 GMT
-
-<!-- /signstring -->
-
-The Authorization header would be:
-
-<!-- authz -->
-
-    Authorization: Signature keyId="Test",algorithm="rsa-sha256",headers="date",signature="jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9HpFQlG7N4YcJPteKTu4MWCLyk+gIr0wDgqtLWf9NLpMAMimdfsH7FSWGfbMFSrsVTHNTk0rK3usrfFnti1dxsM4jl0kYJCKTGI/UWkqiaxwNiKqGcdlEDrTcUhhsFsOIo8VhddmZTZ8w="
-
-<!-- /authz -->
-
-### All Headers
-
-Parameterized to include all headers, the string to sign would be (`+ "\n"`
-inserted for readability):
-
-<!-- sign {"name": "All Headers", "options": {"keyId":"Test", "algorithm": "rsa-sha256", "headers": ["(request-target)", "host", "date", "content-type", "digest", "content-length"]}} -->
-<!-- signstring -->
-
-    (request-target): post /foo?param=value&pet=dog
-    host: example.com
-    date: Thu, 05 Jan 2014 21:31:40 GMT
-    content-type: application/json
-    digest: SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
-    content-length: 18
-
-<!-- /signstring -->
-
-The Authorization header would be:
-
-<!-- authz -->
-
-    Authorization: Signature keyId="Test",algorithm="rsa-sha256",headers="(request-target) host date content-type digest content-length",signature="Ef7MlxLXoBovhil3AlyjtBwAL9g4TN3tibLj7uuNB3CROat/9KaeQ4hW2NiJ+pZ6HQEOx9vYZAyi+7cmIkmJszJCut5kQLAwuX+Ms/mUFvpKlSo9StS2bMXDBNjOh4Auj774GFj4gwjS+3NhFeoqyr/MuN6HsEnkvn6zdgfE2i0="
-
-<!-- /authz -->
-
-## Generating and verifying signatures using `openssl`
-
-The `openssl` commandline tool can be used to generate or verify the signatures listed above.
-
-Compose the signing string as usual, and pipe it into the the `openssl dgst` command, then into `openssl enc -base64`, as follows:
-
-    $ printf 'date: Thu, 05 Jan 2014 21:31:40 GMT' | \
-      openssl dgst -binary -sign /path/to/private.pem -sha256 | \
-      openssl enc -base64
-    jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9Hp...
-    $
-
-The `-sha256` option is necessary to produce an `rsa-sha256` signature. You can select other hash algorithms such as `sha1` by changing this argument.
-
-To verify a signature, first save the signature data, Base64-decoded, into a file, then use `openssl dgst` again with the `-verify` option:
-
-    $ echo 'jKyvPcxB4JbmYY4mByy...' | openssl enc -A -d -base64 > signature
-    $ printf 'date: Thu, 05 Jan 2014 21:31:40 GMT' | \
-      openssl dgst -sha256 -verify /path/to/public.pem -signature ./signature
-    Verified OK
-    $
-
-## Generating and verifying signatures using `sshpk-sign`
-
-You can also generate and check signatures using the `sshpk-sign` tool which is
-included with the `sshpk` package in `npm`.
-
-Compose the signing string as above, and pipe it into `sshpk-sign` as follows:
-
-    $ printf 'date: Thu, 05 Jan 2014 21:31:40 GMT' | \
-      sshpk-sign -i /path/to/private.pem
-    jKyvPcxB4JbmYY4mByyBY7cZfNl4OW9Hp...
-    $
-
-This will produce an `rsa-sha256` signature by default, as you can see using
-the `-v` option:
-
-    sshpk-sign: using rsa-sha256 with a 1024 bit key
-
-You can also use `sshpk-verify` in a similar manner:
-
-    $ printf 'date: Thu, 05 Jan 2014 21:31:40 GMT' | \
-      sshpk-verify -i ./public.pem -s 'jKyvPcxB4JbmYY...'
-    OK
-    $
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/index.js
deleted file mode 100644
index 54d46030f1c152d1f0cc8d729a3137d07a7b9414..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/index.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-var parser = require('./parser');
-var signer = require('./signer');
-var verify = require('./verify');
-var utils = require('./utils');
-
-
-
-///--- API
-
-module.exports = {
-
-  parse: parser.parseRequest,
-  parseRequest: parser.parseRequest,
-
-  sign: signer.signRequest,
-  signRequest: signer.signRequest,
-  createSigner: signer.createSigner,
-  isSigner: signer.isSigner,
-
-  sshKeyToPEM: utils.sshKeyToPEM,
-  sshKeyFingerprint: utils.fingerprint,
-  pemToRsaSSHKey: utils.pemToRsaSSHKey,
-
-  verify: verify.verifySignature,
-  verifySignature: verify.verifySignature,
-  verifyHMAC: verify.verifyHMAC
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/parser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/parser.js
deleted file mode 100644
index 7c841b3171095c9b6eff88fb9a0e2504ab30b481..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/parser.js
+++ /dev/null
@@ -1,318 +0,0 @@
-// Copyright 2012 Joyent, Inc.  All rights reserved.
-
-var assert = require('assert-plus');
-var util = require('util');
-var utils = require('./utils');
-
-
-
-///--- Globals
-
-var HASH_ALGOS = utils.HASH_ALGOS;
-var PK_ALGOS = utils.PK_ALGOS;
-var HttpSignatureError = utils.HttpSignatureError;
-var InvalidAlgorithmError = utils.InvalidAlgorithmError;
-var validateAlgorithm = utils.validateAlgorithm;
-
-var State = {
-  New: 0,
-  Params: 1
-};
-
-var ParamsState = {
-  Name: 0,
-  Quote: 1,
-  Value: 2,
-  Comma: 3
-};
-
-
-///--- Specific Errors
-
-
-function ExpiredRequestError(message) {
-  HttpSignatureError.call(this, message, ExpiredRequestError);
-}
-util.inherits(ExpiredRequestError, HttpSignatureError);
-
-
-function InvalidHeaderError(message) {
-  HttpSignatureError.call(this, message, InvalidHeaderError);
-}
-util.inherits(InvalidHeaderError, HttpSignatureError);
-
-
-function InvalidParamsError(message) {
-  HttpSignatureError.call(this, message, InvalidParamsError);
-}
-util.inherits(InvalidParamsError, HttpSignatureError);
-
-
-function MissingHeaderError(message) {
-  HttpSignatureError.call(this, message, MissingHeaderError);
-}
-util.inherits(MissingHeaderError, HttpSignatureError);
-
-function StrictParsingError(message) {
-  HttpSignatureError.call(this, message, StrictParsingError);
-}
-util.inherits(StrictParsingError, HttpSignatureError);
-
-///--- Exported API
-
-module.exports = {
-
-  /**
-   * Parses the 'Authorization' header out of an http.ServerRequest object.
-   *
-   * Note that this API will fully validate the Authorization header, and throw
-   * on any error.  It will not however check the signature, or the keyId format
-   * as those are specific to your environment.  You can use the options object
-   * to pass in extra constraints.
-   *
-   * As a response object you can expect this:
-   *
-   *     {
-   *       "scheme": "Signature",
-   *       "params": {
-   *         "keyId": "foo",
-   *         "algorithm": "rsa-sha256",
-   *         "headers": [
-   *           "date" or "x-date",
-   *           "digest"
-   *         ],
-   *         "signature": "base64"
-   *       },
-   *       "signingString": "ready to be passed to crypto.verify()"
-   *     }
-   *
-   * @param {Object} request an http.ServerRequest.
-   * @param {Object} options an optional options object with:
-   *                   - clockSkew: allowed clock skew in seconds (default 300).
-   *                   - headers: required header names (def: date or x-date)
-   *                   - algorithms: algorithms to support (default: all).
-   *                   - strict: should enforce latest spec parsing
-   *                             (default: false).
-   * @return {Object} parsed out object (see above).
-   * @throws {TypeError} on invalid input.
-   * @throws {InvalidHeaderError} on an invalid Authorization header error.
-   * @throws {InvalidParamsError} if the params in the scheme are invalid.
-   * @throws {MissingHeaderError} if the params indicate a header not present,
-   *                              either in the request headers from the params,
-   *                              or not in the params from a required header
-   *                              in options.
-   * @throws {StrictParsingError} if old attributes are used in strict parsing
-   *                              mode.
-   * @throws {ExpiredRequestError} if the value of date or x-date exceeds skew.
-   */
-  parseRequest: function parseRequest(request, options) {
-    assert.object(request, 'request');
-    assert.object(request.headers, 'request.headers');
-    if (options === undefined) {
-      options = {};
-    }
-    if (options.headers === undefined) {
-      options.headers = [request.headers['x-date'] ? 'x-date' : 'date'];
-    }
-    assert.object(options, 'options');
-    assert.arrayOfString(options.headers, 'options.headers');
-    assert.optionalNumber(options.clockSkew, 'options.clockSkew');
-
-    if (!request.headers.authorization)
-      throw new MissingHeaderError('no authorization header present in ' +
-                                   'the request');
-
-    options.clockSkew = options.clockSkew || 300;
-
-
-    var i = 0;
-    var state = State.New;
-    var substate = ParamsState.Name;
-    var tmpName = '';
-    var tmpValue = '';
-
-    var parsed = {
-      scheme: '',
-      params: {},
-      signingString: '',
-
-      get algorithm() {
-        return this.params.algorithm.toUpperCase();
-      },
-
-      get keyId() {
-        return this.params.keyId;
-      }
-    };
-
-    var authz = request.headers.authorization;
-    for (i = 0; i < authz.length; i++) {
-      var c = authz.charAt(i);
-
-      switch (Number(state)) {
-
-      case State.New:
-        if (c !== ' ') parsed.scheme += c;
-        else state = State.Params;
-        break;
-
-      case State.Params:
-        switch (Number(substate)) {
-
-        case ParamsState.Name:
-          var code = c.charCodeAt(0);
-          // restricted name of A-Z / a-z
-          if ((code >= 0x41 && code <= 0x5a) || // A-Z
-              (code >= 0x61 && code <= 0x7a)) { // a-z
-            tmpName += c;
-          } else if (c === '=') {
-            if (tmpName.length === 0)
-              throw new InvalidHeaderError('bad param format');
-            substate = ParamsState.Quote;
-          } else {
-            throw new InvalidHeaderError('bad param format');
-          }
-          break;
-
-        case ParamsState.Quote:
-          if (c === '"') {
-            tmpValue = '';
-            substate = ParamsState.Value;
-          } else {
-            throw new InvalidHeaderError('bad param format');
-          }
-          break;
-
-        case ParamsState.Value:
-          if (c === '"') {
-            parsed.params[tmpName] = tmpValue;
-            substate = ParamsState.Comma;
-          } else {
-            tmpValue += c;
-          }
-          break;
-
-        case ParamsState.Comma:
-          if (c === ',') {
-            tmpName = '';
-            substate = ParamsState.Name;
-          } else {
-            throw new InvalidHeaderError('bad param format');
-          }
-          break;
-
-        default:
-          throw new Error('Invalid substate');
-        }
-        break;
-
-      default:
-        throw new Error('Invalid substate');
-      }
-
-    }
-
-    if (!parsed.params.headers || parsed.params.headers === '') {
-      if (request.headers['x-date']) {
-        parsed.params.headers = ['x-date'];
-      } else {
-        parsed.params.headers = ['date'];
-      }
-    } else {
-      parsed.params.headers = parsed.params.headers.split(' ');
-    }
-
-    // Minimally validate the parsed object
-    if (!parsed.scheme || parsed.scheme !== 'Signature')
-      throw new InvalidHeaderError('scheme was not "Signature"');
-
-    if (!parsed.params.keyId)
-      throw new InvalidHeaderError('keyId was not specified');
-
-    if (!parsed.params.algorithm)
-      throw new InvalidHeaderError('algorithm was not specified');
-
-    if (!parsed.params.signature)
-      throw new InvalidHeaderError('signature was not specified');
-
-    // Check the algorithm against the official list
-    parsed.params.algorithm = parsed.params.algorithm.toLowerCase();
-    try {
-      validateAlgorithm(parsed.params.algorithm);
-    } catch (e) {
-      if (e instanceof InvalidAlgorithmError)
-        throw (new InvalidParamsError(parsed.params.algorithm + ' is not ' +
-          'supported'));
-      else
-        throw (e);
-    }
-
-    // Build the signingString
-    for (i = 0; i < parsed.params.headers.length; i++) {
-      var h = parsed.params.headers[i].toLowerCase();
-      parsed.params.headers[i] = h;
-
-      if (h === 'request-line') {
-        if (!options.strict) {
-          /*
-           * We allow headers from the older spec drafts if strict parsing isn't
-           * specified in options.
-           */
-          parsed.signingString +=
-            request.method + ' ' + request.url + ' HTTP/' + request.httpVersion;
-        } else {
-          /* Strict parsing doesn't allow older draft headers. */
-          throw (new StrictParsingError('request-line is not a valid header ' +
-            'with strict parsing enabled.'));
-        }
-      } else if (h === '(request-target)') {
-        parsed.signingString +=
-          '(request-target): ' + request.method.toLowerCase() + ' ' +
-          request.url;
-      } else {
-        var value = request.headers[h];
-        if (value === undefined)
-          throw new MissingHeaderError(h + ' was not in the request');
-        parsed.signingString += h + ': ' + value;
-      }
-
-      if ((i + 1) < parsed.params.headers.length)
-        parsed.signingString += '\n';
-    }
-
-    // Check against the constraints
-    var date;
-    if (request.headers.date || request.headers['x-date']) {
-        if (request.headers['x-date']) {
-          date = new Date(request.headers['x-date']);
-        } else {
-          date = new Date(request.headers.date);
-        }
-      var now = new Date();
-      var skew = Math.abs(now.getTime() - date.getTime());
-
-      if (skew > options.clockSkew * 1000) {
-        throw new ExpiredRequestError('clock skew of ' +
-                                      (skew / 1000) +
-                                      's was greater than ' +
-                                      options.clockSkew + 's');
-      }
-    }
-
-    options.headers.forEach(function (hdr) {
-      // Remember that we already checked any headers in the params
-      // were in the request, so if this passes we're good.
-      if (parsed.params.headers.indexOf(hdr) < 0)
-        throw new MissingHeaderError(hdr + ' was not a signed header');
-    });
-
-    if (options.algorithms) {
-      if (options.algorithms.indexOf(parsed.params.algorithm) === -1)
-        throw new InvalidParamsError(parsed.params.algorithm +
-                                     ' is not a supported algorithm');
-    }
-
-    return parsed;
-  }
-
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/signer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/signer.js
deleted file mode 100644
index ef9946f77ccc8386d6b4aa394c4a66e319b063cc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/signer.js
+++ /dev/null
@@ -1,399 +0,0 @@
-// Copyright 2012 Joyent, Inc.  All rights reserved.
-
-var assert = require('assert-plus');
-var crypto = require('crypto');
-var http = require('http');
-var util = require('util');
-var sshpk = require('sshpk');
-var jsprim = require('jsprim');
-var utils = require('./utils');
-
-var sprintf = require('util').format;
-
-var HASH_ALGOS = utils.HASH_ALGOS;
-var PK_ALGOS = utils.PK_ALGOS;
-var InvalidAlgorithmError = utils.InvalidAlgorithmError;
-var HttpSignatureError = utils.HttpSignatureError;
-var validateAlgorithm = utils.validateAlgorithm;
-
-///--- Globals
-
-var AUTHZ_FMT =
-  'Signature keyId="%s",algorithm="%s",headers="%s",signature="%s"';
-
-///--- Specific Errors
-
-function MissingHeaderError(message) {
-  HttpSignatureError.call(this, message, MissingHeaderError);
-}
-util.inherits(MissingHeaderError, HttpSignatureError);
-
-function StrictParsingError(message) {
-  HttpSignatureError.call(this, message, StrictParsingError);
-}
-util.inherits(StrictParsingError, HttpSignatureError);
-
-/* See createSigner() */
-function RequestSigner(options) {
-  assert.object(options, 'options');
-
-  var alg = [];
-  if (options.algorithm !== undefined) {
-    assert.string(options.algorithm, 'options.algorithm');
-    alg = validateAlgorithm(options.algorithm);
-  }
-  this.rs_alg = alg;
-
-  /*
-   * RequestSigners come in two varieties: ones with an rs_signFunc, and ones
-   * with an rs_signer.
-   *
-   * rs_signFunc-based RequestSigners have to build up their entire signing
-   * string within the rs_lines array and give it to rs_signFunc as a single
-   * concat'd blob. rs_signer-based RequestSigners can add a line at a time to
-   * their signing state by using rs_signer.update(), thus only needing to
-   * buffer the hash function state and one line at a time.
-   */
-  if (options.sign !== undefined) {
-    assert.func(options.sign, 'options.sign');
-    this.rs_signFunc = options.sign;
-
-  } else if (alg[0] === 'hmac' && options.key !== undefined) {
-    assert.string(options.keyId, 'options.keyId');
-    this.rs_keyId = options.keyId;
-
-    if (typeof (options.key) !== 'string' && !Buffer.isBuffer(options.key))
-      throw (new TypeError('options.key for HMAC must be a string or Buffer'));
-
-    /*
-     * Make an rs_signer for HMACs, not a rs_signFunc -- HMACs digest their
-     * data in chunks rather than requiring it all to be given in one go
-     * at the end, so they are more similar to signers than signFuncs.
-     */
-    this.rs_signer = crypto.createHmac(alg[1].toUpperCase(), options.key);
-    this.rs_signer.sign = function () {
-      var digest = this.digest('base64');
-      return ({
-        hashAlgorithm: alg[1],
-        toString: function () { return (digest); }
-      });
-    };
-
-  } else if (options.key !== undefined) {
-    var key = options.key;
-    if (typeof (key) === 'string' || Buffer.isBuffer(key))
-      key = sshpk.parsePrivateKey(key);
-
-    assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]),
-      'options.key must be a sshpk.PrivateKey');
-    this.rs_key = key;
-
-    assert.string(options.keyId, 'options.keyId');
-    this.rs_keyId = options.keyId;
-
-    if (!PK_ALGOS[key.type]) {
-      throw (new InvalidAlgorithmError(key.type.toUpperCase() + ' type ' +
-        'keys are not supported'));
-    }
-
-    if (alg[0] !== undefined && key.type !== alg[0]) {
-      throw (new InvalidAlgorithmError('options.key must be a ' +
-        alg[0].toUpperCase() + ' key, was given a ' +
-        key.type.toUpperCase() + ' key instead'));
-    }
-
-    this.rs_signer = key.createSign(alg[1]);
-
-  } else {
-    throw (new TypeError('options.sign (func) or options.key is required'));
-  }
-
-  this.rs_headers = [];
-  this.rs_lines = [];
-}
-
-/**
- * Adds a header to be signed, with its value, into this signer.
- *
- * @param {String} header
- * @param {String} value
- * @return {String} value written
- */
-RequestSigner.prototype.writeHeader = function (header, value) {
-  assert.string(header, 'header');
-  header = header.toLowerCase();
-  assert.string(value, 'value');
-
-  this.rs_headers.push(header);
-
-  if (this.rs_signFunc) {
-    this.rs_lines.push(header + ': ' + value);
-
-  } else {
-    var line = header + ': ' + value;
-    if (this.rs_headers.length > 0)
-      line = '\n' + line;
-    this.rs_signer.update(line);
-  }
-
-  return (value);
-};
-
-/**
- * Adds a default Date header, returning its value.
- *
- * @return {String}
- */
-RequestSigner.prototype.writeDateHeader = function () {
-  return (this.writeHeader('date', jsprim.rfc1123(new Date())));
-};
-
-/**
- * Adds the request target line to be signed.
- *
- * @param {String} method, HTTP method (e.g. 'get', 'post', 'put')
- * @param {String} path
- */
-RequestSigner.prototype.writeTarget = function (method, path) {
-  assert.string(method, 'method');
-  assert.string(path, 'path');
-  method = method.toLowerCase();
-  this.writeHeader('(request-target)', method + ' ' + path);
-};
-
-/**
- * Calculate the value for the Authorization header on this request
- * asynchronously.
- *
- * @param {Func} callback (err, authz)
- */
-RequestSigner.prototype.sign = function (cb) {
-  assert.func(cb, 'callback');
-
-  if (this.rs_headers.length < 1)
-    throw (new Error('At least one header must be signed'));
-
-  var alg, authz;
-  if (this.rs_signFunc) {
-    var data = this.rs_lines.join('\n');
-    var self = this;
-    this.rs_signFunc(data, function (err, sig) {
-      if (err) {
-        cb(err);
-        return;
-      }
-      try {
-        assert.object(sig, 'signature');
-        assert.string(sig.keyId, 'signature.keyId');
-        assert.string(sig.algorithm, 'signature.algorithm');
-        assert.string(sig.signature, 'signature.signature');
-        alg = validateAlgorithm(sig.algorithm);
-
-        authz = sprintf(AUTHZ_FMT,
-          sig.keyId,
-          sig.algorithm,
-          self.rs_headers.join(' '),
-          sig.signature);
-      } catch (e) {
-        cb(e);
-        return;
-      }
-      cb(null, authz);
-    });
-
-  } else {
-    try {
-      var sigObj = this.rs_signer.sign();
-    } catch (e) {
-      cb(e);
-      return;
-    }
-    alg = (this.rs_alg[0] || this.rs_key.type) + '-' + sigObj.hashAlgorithm;
-    var signature = sigObj.toString();
-    authz = sprintf(AUTHZ_FMT,
-      this.rs_keyId,
-      alg,
-      this.rs_headers.join(' '),
-      signature);
-    cb(null, authz);
-  }
-};
-
-///--- Exported API
-
-module.exports = {
-  /**
-   * Identifies whether a given object is a request signer or not.
-   *
-   * @param {Object} object, the object to identify
-   * @returns {Boolean}
-   */
-  isSigner: function (obj) {
-    if (typeof (obj) === 'object' && obj instanceof RequestSigner)
-      return (true);
-    return (false);
-  },
-
-  /**
-   * Creates a request signer, used to asynchronously build a signature
-   * for a request (does not have to be an http.ClientRequest).
-   *
-   * @param {Object} options, either:
-   *                   - {String} keyId
-   *                   - {String|Buffer} key
-   *                   - {String} algorithm (optional, required for HMAC)
-   *                 or:
-   *                   - {Func} sign (data, cb)
-   * @return {RequestSigner}
-   */
-  createSigner: function createSigner(options) {
-    return (new RequestSigner(options));
-  },
-
-  /**
-   * Adds an 'Authorization' header to an http.ClientRequest object.
-   *
-   * Note that this API will add a Date header if it's not already set. Any
-   * other headers in the options.headers array MUST be present, or this
-   * will throw.
-   *
-   * You shouldn't need to check the return type; it's just there if you want
-   * to be pedantic.
-   *
-   * The optional flag indicates whether parsing should use strict enforcement
-   * of the version draft-cavage-http-signatures-04 of the spec or beyond.
-   * The default is to be loose and support
-   * older versions for compatibility.
-   *
-   * @param {Object} request an instance of http.ClientRequest.
-   * @param {Object} options signing parameters object:
-   *                   - {String} keyId required.
-   *                   - {String} key required (either a PEM or HMAC key).
-   *                   - {Array} headers optional; defaults to ['date'].
-   *                   - {String} algorithm optional (unless key is HMAC);
-   *                              default is the same as the sshpk default
-   *                              signing algorithm for the type of key given
-   *                   - {String} httpVersion optional; defaults to '1.1'.
-   *                   - {Boolean} strict optional; defaults to 'false'.
-   * @return {Boolean} true if Authorization (and optionally Date) were added.
-   * @throws {TypeError} on bad parameter types (input).
-   * @throws {InvalidAlgorithmError} if algorithm was bad or incompatible with
-   *                                 the given key.
-   * @throws {sshpk.KeyParseError} if key was bad.
-   * @throws {MissingHeaderError} if a header to be signed was specified but
-   *                              was not present.
-   */
-  signRequest: function signRequest(request, options) {
-    assert.object(request, 'request');
-    assert.object(options, 'options');
-    assert.optionalString(options.algorithm, 'options.algorithm');
-    assert.string(options.keyId, 'options.keyId');
-    assert.optionalArrayOfString(options.headers, 'options.headers');
-    assert.optionalString(options.httpVersion, 'options.httpVersion');
-
-    if (!request.getHeader('Date'))
-      request.setHeader('Date', jsprim.rfc1123(new Date()));
-    if (!options.headers)
-      options.headers = ['date'];
-    if (!options.httpVersion)
-      options.httpVersion = '1.1';
-
-    var alg = [];
-    if (options.algorithm) {
-      options.algorithm = options.algorithm.toLowerCase();
-      alg = validateAlgorithm(options.algorithm);
-    }
-
-    var i;
-    var stringToSign = '';
-    for (i = 0; i < options.headers.length; i++) {
-      if (typeof (options.headers[i]) !== 'string')
-        throw new TypeError('options.headers must be an array of Strings');
-
-      var h = options.headers[i].toLowerCase();
-
-      if (h === 'request-line') {
-        if (!options.strict) {
-          /**
-           * We allow headers from the older spec drafts if strict parsing isn't
-           * specified in options.
-           */
-          stringToSign +=
-            request.method + ' ' + request.path + ' HTTP/' +
-            options.httpVersion;
-        } else {
-          /* Strict parsing doesn't allow older draft headers. */
-          throw (new StrictParsingError('request-line is not a valid header ' +
-            'with strict parsing enabled.'));
-        }
-      } else if (h === '(request-target)') {
-        stringToSign +=
-          '(request-target): ' + request.method.toLowerCase() + ' ' +
-          request.path;
-      } else {
-        var value = request.getHeader(h);
-        if (value === undefined || value === '') {
-          throw new MissingHeaderError(h + ' was not in the request');
-        }
-        stringToSign += h + ': ' + value;
-      }
-
-      if ((i + 1) < options.headers.length)
-        stringToSign += '\n';
-    }
-
-    /* This is just for unit tests. */
-    if (request.hasOwnProperty('_stringToSign')) {
-      request._stringToSign = stringToSign;
-    }
-
-    var signature;
-    if (alg[0] === 'hmac') {
-      if (typeof (options.key) !== 'string' && !Buffer.isBuffer(options.key))
-        throw (new TypeError('options.key must be a string or Buffer'));
-
-      var hmac = crypto.createHmac(alg[1].toUpperCase(), options.key);
-      hmac.update(stringToSign);
-      signature = hmac.digest('base64');
-
-    } else {
-      var key = options.key;
-      if (typeof (key) === 'string' || Buffer.isBuffer(key))
-        key = sshpk.parsePrivateKey(options.key);
-
-      assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]),
-        'options.key must be a sshpk.PrivateKey');
-
-      if (!PK_ALGOS[key.type]) {
-        throw (new InvalidAlgorithmError(key.type.toUpperCase() + ' type ' +
-          'keys are not supported'));
-      }
-
-      if (alg[0] !== undefined && key.type !== alg[0]) {
-        throw (new InvalidAlgorithmError('options.key must be a ' +
-          alg[0].toUpperCase() + ' key, was given a ' +
-          key.type.toUpperCase() + ' key instead'));
-      }
-
-      var signer = key.createSign(alg[1]);
-      signer.update(stringToSign);
-      var sigObj = signer.sign();
-      if (!HASH_ALGOS[sigObj.hashAlgorithm]) {
-        throw (new InvalidAlgorithmError(sigObj.hashAlgorithm.toUpperCase() +
-          ' is not a supported hash algorithm'));
-      }
-      options.algorithm = key.type + '-' + sigObj.hashAlgorithm;
-      signature = sigObj.toString();
-      assert.notStrictEqual(signature, '', 'empty signature produced');
-    }
-
-    request.setHeader('Authorization', sprintf(AUTHZ_FMT,
-                                               options.keyId,
-                                               options.algorithm,
-                                               options.headers.join(' '),
-                                               signature));
-
-    return true;
-  }
-
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/utils.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/utils.js
deleted file mode 100644
index bbf2aa895a0f1730cd2235a327bf9708015691d2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/utils.js
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2012 Joyent, Inc.  All rights reserved.
-
-var assert = require('assert-plus');
-var sshpk = require('sshpk');
-var util = require('util');
-
-var HASH_ALGOS = {
-  'sha1': true,
-  'sha256': true,
-  'sha512': true
-};
-
-var PK_ALGOS = {
-  'rsa': true,
-  'dsa': true,
-  'ecdsa': true
-};
-
-function HttpSignatureError(message, caller) {
-  if (Error.captureStackTrace)
-    Error.captureStackTrace(this, caller || HttpSignatureError);
-
-  this.message = message;
-  this.name = caller.name;
-}
-util.inherits(HttpSignatureError, Error);
-
-function InvalidAlgorithmError(message) {
-  HttpSignatureError.call(this, message, InvalidAlgorithmError);
-}
-util.inherits(InvalidAlgorithmError, HttpSignatureError);
-
-function validateAlgorithm(algorithm) {
-  var alg = algorithm.toLowerCase().split('-');
-
-  if (alg.length !== 2) {
-    throw (new InvalidAlgorithmError(alg[0].toUpperCase() + ' is not a ' +
-      'valid algorithm'));
-  }
-
-  if (alg[0] !== 'hmac' && !PK_ALGOS[alg[0]]) {
-    throw (new InvalidAlgorithmError(alg[0].toUpperCase() + ' type keys ' +
-      'are not supported'));
-  }
-
-  if (!HASH_ALGOS[alg[1]]) {
-    throw (new InvalidAlgorithmError(alg[1].toUpperCase() + ' is not a ' +
-      'supported hash algorithm'));
-  }
-
-  return (alg);
-}
-
-///--- API
-
-module.exports = {
-
-  HASH_ALGOS: HASH_ALGOS,
-  PK_ALGOS: PK_ALGOS,
-
-  HttpSignatureError: HttpSignatureError,
-  InvalidAlgorithmError: InvalidAlgorithmError,
-
-  validateAlgorithm: validateAlgorithm,
-
-  /**
-   * Converts an OpenSSH public key (rsa only) to a PKCS#8 PEM file.
-   *
-   * The intent of this module is to interoperate with OpenSSL only,
-   * specifically the node crypto module's `verify` method.
-   *
-   * @param {String} key an OpenSSH public key.
-   * @return {String} PEM encoded form of the RSA public key.
-   * @throws {TypeError} on bad input.
-   * @throws {Error} on invalid ssh key formatted data.
-   */
-  sshKeyToPEM: function sshKeyToPEM(key) {
-    assert.string(key, 'ssh_key');
-
-    var k = sshpk.parseKey(key, 'ssh');
-    return (k.toString('pem'));
-  },
-
-
-  /**
-   * Generates an OpenSSH fingerprint from an ssh public key.
-   *
-   * @param {String} key an OpenSSH public key.
-   * @return {String} key fingerprint.
-   * @throws {TypeError} on bad input.
-   * @throws {Error} if what you passed doesn't look like an ssh public key.
-   */
-  fingerprint: function fingerprint(key) {
-    assert.string(key, 'ssh_key');
-
-    var k = sshpk.parseKey(key, 'ssh');
-    return (k.fingerprint('md5').toString('hex'));
-  },
-
-  /**
-   * Converts a PKGCS#8 PEM file to an OpenSSH public key (rsa)
-   *
-   * The reverse of the above function.
-   */
-  pemToRsaSSHKey: function pemToRsaSSHKey(pem, comment) {
-    assert.equal('string', typeof (pem), 'typeof pem');
-
-    var k = sshpk.parseKey(pem, 'pem');
-    k.comment = comment;
-    return (k.toString('ssh'));
-  }
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/verify.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/verify.js
deleted file mode 100644
index b053fd6bfb15a0e6419d639e3c7a0e5b815d49ea..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/lib/verify.js
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-var assert = require('assert-plus');
-var crypto = require('crypto');
-var sshpk = require('sshpk');
-var utils = require('./utils');
-
-var HASH_ALGOS = utils.HASH_ALGOS;
-var PK_ALGOS = utils.PK_ALGOS;
-var InvalidAlgorithmError = utils.InvalidAlgorithmError;
-var HttpSignatureError = utils.HttpSignatureError;
-var validateAlgorithm = utils.validateAlgorithm;
-
-///--- Exported API
-
-module.exports = {
-  /**
-   * Verify RSA/DSA signature against public key.  You are expected to pass in
-   * an object that was returned from `parse()`.
-   *
-   * @param {Object} parsedSignature the object you got from `parse`.
-   * @param {String} pubkey RSA/DSA private key PEM.
-   * @return {Boolean} true if valid, false otherwise.
-   * @throws {TypeError} if you pass in bad arguments.
-   * @throws {InvalidAlgorithmError}
-   */
-  verifySignature: function verifySignature(parsedSignature, pubkey) {
-    assert.object(parsedSignature, 'parsedSignature');
-    if (typeof (pubkey) === 'string' || Buffer.isBuffer(pubkey))
-      pubkey = sshpk.parseKey(pubkey);
-    assert.ok(sshpk.Key.isKey(pubkey, [1, 1]), 'pubkey must be a sshpk.Key');
-
-    var alg = validateAlgorithm(parsedSignature.algorithm);
-    if (alg[0] === 'hmac' || alg[0] !== pubkey.type)
-      return (false);
-
-    var v = pubkey.createVerify(alg[1]);
-    v.update(parsedSignature.signingString);
-    return (v.verify(parsedSignature.params.signature, 'base64'));
-  },
-
-  /**
-   * Verify HMAC against shared secret.  You are expected to pass in an object
-   * that was returned from `parse()`.
-   *
-   * @param {Object} parsedSignature the object you got from `parse`.
-   * @param {String} secret HMAC shared secret.
-   * @return {Boolean} true if valid, false otherwise.
-   * @throws {TypeError} if you pass in bad arguments.
-   * @throws {InvalidAlgorithmError}
-   */
-  verifyHMAC: function verifyHMAC(parsedSignature, secret) {
-    assert.object(parsedSignature, 'parsedHMAC');
-    assert.string(secret, 'secret');
-
-    var alg = validateAlgorithm(parsedSignature.algorithm);
-    if (alg[0] !== 'hmac')
-      return (false);
-
-    var hashAlg = alg[1].toUpperCase();
-
-    var hmac = crypto.createHmac(hashAlg, secret);
-    hmac.update(parsedSignature.signingString);
-
-    /*
-     * Now double-hash to avoid leaking timing information - there's
-     * no easy constant-time compare in JS, so we use this approach
-     * instead. See for more info:
-     * https://www.isecpartners.com/blog/2011/february/double-hmac-
-     * verification.aspx
-     */
-    var h1 = crypto.createHmac(hashAlg, secret);
-    h1.update(hmac.digest());
-    h1 = h1.digest();
-    var h2 = crypto.createHmac(hashAlg, secret);
-    h2.update(new Buffer(parsedSignature.params.signature, 'base64'));
-    h2 = h2.digest();
-
-    /* Node 0.8 returns strings from .digest(). */
-    if (typeof (h1) === 'string')
-      return (h1 === h2);
-    /* And node 0.10 lacks the .equals() method on Buffers. */
-    if (Buffer.isBuffer(h1) && !h1.equals)
-      return (h1.toString('binary') === h2.toString('binary'));
-
-    return (h1.equals(h2));
-  }
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/.bin/sshpk-conv b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/.bin/sshpk-conv
deleted file mode 120000
index a2a295c8014c8c4fb4d0a35adf4567bd52cd82e4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/.bin/sshpk-conv
+++ /dev/null
@@ -1 +0,0 @@
-../sshpk/bin/sshpk-conv
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/.bin/sshpk-sign b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/.bin/sshpk-sign
deleted file mode 120000
index 766b9b3a75891df77d3ee028f436f3655fc1391b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/.bin/sshpk-sign
+++ /dev/null
@@ -1 +0,0 @@
-../sshpk/bin/sshpk-sign
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/.bin/sshpk-verify b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/.bin/sshpk-verify
deleted file mode 120000
index bfd7e3ade14c1f05f166aa4fbabb258a1bec7fe3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/.bin/sshpk-verify
+++ /dev/null
@@ -1 +0,0 @@
-../sshpk/bin/sshpk-verify
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/AUTHORS b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/AUTHORS
deleted file mode 100644
index 1923524fe40ddb861d8ea84974cee77b4e26df14..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/AUTHORS
+++ /dev/null
@@ -1,6 +0,0 @@
-Dave Eddy <dave@daveeddy.com>
-Fred Kuo <fred.kuo@joyent.com>
-Lars-Magnus Skog <ralphtheninja@riseup.net>
-Mark Cavage <mcavage@gmail.com>
-Patrick Mooney <pmooney@pfmooney.com>
-Rob Gulewich <robert.gulewich@joyent.com>
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/CHANGES.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/CHANGES.md
deleted file mode 100644
index d249d9b2ab1f218165cb6703fba686d7b9feb454..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/CHANGES.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# assert-plus Changelog
-
-## 0.2.0
-
-- Fix `assert.object(null)` so it throws
-- Fix optional/arrayOf exports for non-type-of asserts
-- Add optiona/arrayOf exports for Stream/Date/Regex/uuid
-- Add basic unit test coverage
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/README.md
deleted file mode 100644
index 0b39593cef48dc640fa52c64f37ddf7cc03b12e4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/README.md
+++ /dev/null
@@ -1,155 +0,0 @@
-# assert-plus
-
-This library is a super small wrapper over node's assert module that has two
-things: (1) the ability to disable assertions with the environment variable
-NODE\_NDEBUG, and (2) some API wrappers for argument testing.  Like
-`assert.string(myArg, 'myArg')`.  As a simple example, most of my code looks
-like this:
-
-```javascript
-    var assert = require('assert-plus');
-
-    function fooAccount(options, callback) {
-        assert.object(options, 'options');
-        assert.number(options.id, 'options.id');
-        assert.bool(options.isManager, 'options.isManager');
-        assert.string(options.name, 'options.name');
-        assert.arrayOfString(options.email, 'options.email');
-        assert.func(callback, 'callback');
-
-        // Do stuff
-        callback(null, {});
-    }
-```
-
-# API
-
-All methods that *aren't* part of node's core assert API are simply assumed to
-take an argument, and then a string 'name' that's not a message; `AssertionError`
-will be thrown if the assertion fails with a message like:
-
-    AssertionError: foo (string) is required
-    at test (/home/mark/work/foo/foo.js:3:9)
-    at Object.<anonymous> (/home/mark/work/foo/foo.js:15:1)
-    at Module._compile (module.js:446:26)
-    at Object..js (module.js:464:10)
-    at Module.load (module.js:353:31)
-    at Function._load (module.js:311:12)
-    at Array.0 (module.js:484:10)
-    at EventEmitter._tickCallback (node.js:190:38)
-
-from:
-
-```javascript
-    function test(foo) {
-        assert.string(foo, 'foo');
-    }
-```
-
-There you go.  You can check that arrays are of a homogeneous type with `Arrayof$Type`:
-
-```javascript
-    function test(foo) {
-        assert.arrayOfString(foo, 'foo');
-    }
-```
-
-You can assert IFF an argument is not `undefined` (i.e., an optional arg):
-
-```javascript
-    assert.optionalString(foo, 'foo');
-```
-
-Lastly, you can opt-out of assertion checking altogether by setting the
-environment variable `NODE_NDEBUG=1`.  This is pseudo-useful if you have
-lots of assertions, and don't want to pay `typeof ()` taxes to v8 in
-production.  Be advised:  The standard functions re-exported from `assert` are
-also disabled in assert-plus if NDEBUG is specified.  Using them directly from
-the `assert` module avoids this behavior.
-
-The complete list of APIs is:
-
-* assert.array
-* assert.bool
-* assert.buffer
-* assert.func
-* assert.number
-* assert.object
-* assert.string
-* assert.stream
-* assert.date
-* assert.regex
-* assert.uuid
-* assert.arrayOfArray
-* assert.arrayOfBool
-* assert.arrayOfBuffer
-* assert.arrayOfFunc
-* assert.arrayOfNumber
-* assert.arrayOfObject
-* assert.arrayOfString
-* assert.arrayOfStream
-* assert.arrayOfDate
-* assert.arrayOfUuid
-* assert.optionalArray
-* assert.optionalBool
-* assert.optionalBuffer
-* assert.optionalFunc
-* assert.optionalNumber
-* assert.optionalObject
-* assert.optionalString
-* assert.optionalStream
-* assert.optionalDate
-* assert.optionalUuid
-* assert.optionalArrayOfArray
-* assert.optionalArrayOfBool
-* assert.optionalArrayOfBuffer
-* assert.optionalArrayOfFunc
-* assert.optionalArrayOfNumber
-* assert.optionalArrayOfObject
-* assert.optionalArrayOfString
-* assert.optionalArrayOfStream
-* assert.optionalArrayOfDate
-* assert.optionalArrayOfUuid
-* assert.AssertionError
-* assert.fail
-* assert.ok
-* assert.equal
-* assert.notEqual
-* assert.deepEqual
-* assert.notDeepEqual
-* assert.strictEqual
-* assert.notStrictEqual
-* assert.throws
-* assert.doesNotThrow
-* assert.ifError
-
-# Installation
-
-    npm install assert-plus
-
-## License
-
-The MIT License (MIT)
-Copyright (c) 2012 Mark Cavage
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-## Bugs
-
-See <https://github.com/mcavage/node-assert-plus/issues>.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js
deleted file mode 100644
index 6bce4d8c6c638bd788e6e4f64412a58537bbf3fa..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/assert.js
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright (c) 2012, Mark Cavage. All rights reserved.
-// Copyright 2015 Joyent, Inc.
-
-var assert = require('assert');
-var Stream = require('stream').Stream;
-var util = require('util');
-
-
-///--- Globals
-
-/* JSSTYLED */
-var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;
-
-
-///--- Internal
-
-function _capitalize(str) {
-    return (str.charAt(0).toUpperCase() + str.slice(1));
-}
-
-function _toss(name, expected, oper, arg, actual) {
-    throw new assert.AssertionError({
-        message: util.format('%s (%s) is required', name, expected),
-        actual: (actual === undefined) ? typeof (arg) : actual(arg),
-        expected: expected,
-        operator: oper || '===',
-        stackStartFunction: _toss.caller
-    });
-}
-
-function _getClass(arg) {
-    return (Object.prototype.toString.call(arg).slice(8, -1));
-}
-
-function noop() {
-    // Why even bother with asserts?
-}
-
-
-///--- Exports
-
-var types = {
-    bool: {
-        check: function (arg) { return typeof (arg) === 'boolean'; }
-    },
-    func: {
-        check: function (arg) { return typeof (arg) === 'function'; }
-    },
-    string: {
-        check: function (arg) { return typeof (arg) === 'string'; }
-    },
-    object: {
-        check: function (arg) {
-            return typeof (arg) === 'object' && arg !== null;
-        }
-    },
-    number: {
-        check: function (arg) {
-            return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg);
-        }
-    },
-    buffer: {
-        check: function (arg) { return Buffer.isBuffer(arg); },
-        operator: 'Buffer.isBuffer'
-    },
-    array: {
-        check: function (arg) { return Array.isArray(arg); },
-        operator: 'Array.isArray'
-    },
-    stream: {
-        check: function (arg) { return arg instanceof Stream; },
-        operator: 'instanceof',
-        actual: _getClass
-    },
-    date: {
-        check: function (arg) { return arg instanceof Date; },
-        operator: 'instanceof',
-        actual: _getClass
-    },
-    regexp: {
-        check: function (arg) { return arg instanceof RegExp; },
-        operator: 'instanceof',
-        actual: _getClass
-    },
-    uuid: {
-        check: function (arg) {
-            return typeof (arg) === 'string' && UUID_REGEXP.test(arg);
-        },
-        operator: 'isUUID'
-    }
-};
-
-function _setExports(ndebug) {
-    var keys = Object.keys(types);
-    var out;
-
-    /* re-export standard assert */
-    if (process.env.NODE_NDEBUG) {
-        out = noop;
-    } else {
-        out = function (arg, msg) {
-            if (!arg) {
-                _toss(msg, 'true', arg);
-            }
-        };
-    }
-
-    /* standard checks */
-    keys.forEach(function (k) {
-        if (ndebug) {
-            out[k] = noop;
-            return;
-        }
-        var type = types[k];
-        out[k] = function (arg, msg) {
-            if (!type.check(arg)) {
-                _toss(msg, k, type.operator, arg, type.actual);
-            }
-        };
-    });
-
-    /* optional checks */
-    keys.forEach(function (k) {
-        var name = 'optional' + _capitalize(k);
-        if (ndebug) {
-            out[name] = noop;
-            return;
-        }
-        var type = types[k];
-        out[name] = function (arg, msg) {
-            if (arg === undefined || arg === null) {
-                return;
-            }
-            if (!type.check(arg)) {
-                _toss(msg, k, type.operator, arg, type.actual);
-            }
-        };
-    });
-
-    /* arrayOf checks */
-    keys.forEach(function (k) {
-        var name = 'arrayOf' + _capitalize(k);
-        if (ndebug) {
-            out[name] = noop;
-            return;
-        }
-        var type = types[k];
-        var expected = '[' + k + ']';
-        out[name] = function (arg, msg) {
-            if (!Array.isArray(arg)) {
-                _toss(msg, expected, type.operator, arg, type.actual);
-            }
-            var i;
-            for (i = 0; i < arg.length; i++) {
-                if (!type.check(arg[i])) {
-                    _toss(msg, expected, type.operator, arg, type.actual);
-                }
-            }
-        };
-    });
-
-    /* optionalArrayOf checks */
-    keys.forEach(function (k) {
-        var name = 'optionalArrayOf' + _capitalize(k);
-        if (ndebug) {
-            out[name] = noop;
-            return;
-        }
-        var type = types[k];
-        var expected = '[' + k + ']';
-        out[name] = function (arg, msg) {
-            if (arg === undefined || arg === null) {
-                return;
-            }
-            if (!Array.isArray(arg)) {
-                _toss(msg, expected, type.operator, arg, type.actual);
-            }
-            var i;
-            for (i = 0; i < arg.length; i++) {
-                if (!type.check(arg[i])) {
-                    _toss(msg, expected, type.operator, arg, type.actual);
-                }
-            }
-        };
-    });
-
-    /* re-export built-in assertions */
-    Object.keys(assert).forEach(function (k) {
-        if (k === 'AssertionError') {
-            out[k] = assert[k];
-            return;
-        }
-        if (ndebug) {
-            out[k] = noop;
-            return;
-        }
-        out[k] = assert[k];
-    });
-
-    /* export ourselves (for unit tests _only_) */
-    out._setExports = _setExports;
-
-    return out;
-}
-
-module.exports = _setExports(process.env.NODE_NDEBUG);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json
deleted file mode 100644
index 1ab7cd5d6317eae947f997ce484196f6056f0012..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/assert-plus/package.json
+++ /dev/null
@@ -1,89 +0,0 @@
-{
-  "_from": "assert-plus@>=0.2.0 <0.3.0",
-  "_id": "assert-plus@0.2.0",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/assert-plus",
-  "_nodeVersion": "0.10.36",
-  "_npmUser": {
-    "email": "patrick.f.mooney@gmail.com",
-    "name": "pfmooney"
-  },
-  "_npmVersion": "3.3.8",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature"
-  ],
-  "_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
-  "_shasum": "d74e1b87e7affc0db8aadb7021f3fe48101ab234",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mcavage@gmail.com",
-    "name": "Mark Cavage"
-  },
-  "bugs": {
-    "url": "https://github.com/mcavage/node-assert-plus/issues"
-  },
-  "contributors": [
-    {
-      "name": "Dave Eddy",
-      "email": "dave@daveeddy.com"
-    },
-    {
-      "name": "Fred Kuo",
-      "email": "fred.kuo@joyent.com"
-    },
-    {
-      "name": "Lars-Magnus Skog",
-      "email": "ralphtheninja@riseup.net"
-    },
-    {
-      "name": "Mark Cavage",
-      "email": "mcavage@gmail.com"
-    },
-    {
-      "name": "Patrick Mooney",
-      "email": "pmooney@pfmooney.com"
-    },
-    {
-      "name": "Rob Gulewich",
-      "email": "robert.gulewich@joyent.com"
-    }
-  ],
-  "dependencies": {},
-  "description": "Extra assertions on top of node's assert module",
-  "devDependencies": {
-    "faucet": "0.0.1",
-    "tape": "4.2.2"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "d74e1b87e7affc0db8aadb7021f3fe48101ab234",
-    "tarball": "http://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz"
-  },
-  "engines": {
-    "node": ">=0.8"
-  },
-  "homepage": "https://github.com/mcavage/node-assert-plus#readme",
-  "license": "MIT",
-  "main": "./assert.js",
-  "maintainers": [
-    {
-      "name": "mcavage",
-      "email": "mcavage@gmail.com"
-    },
-    {
-      "name": "pfmooney",
-      "email": "patrick.f.mooney@gmail.com"
-    }
-  ],
-  "name": "assert-plus",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/mcavage/node-assert-plus.git"
-  },
-  "scripts": {
-    "test": "tape tests/*.js | ./node_modules/.bin/faucet"
-  },
-  "version": "0.2.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/CHANGES.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/CHANGES.md
deleted file mode 100644
index ab3a66417a6fa6648a559f31a4b003d8a99fe1b6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/CHANGES.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# Changelog
-
-## not yet released
-
-None yet.
-
-## v1.3.0 (2016-06-22)
-
-* #14 add safer version of hasOwnProperty()
-* #15 forEachKey() should ignore inherited properties
-
-## v1.2.2 (2015-10-15)
-
-* #11 NPM package shouldn't include any code that does `require('JSV')`
-* #12 jsl.node.conf missing definition for "module"
-
-## v1.2.1 (2015-10-14)
-
-* #8 odd date parsing behaviour
-
-## v1.2.0 (2015-10-13)
-
-* #9 want function for returning RFC1123 dates
-
-## v1.1.0 (2015-09-02)
-
-* #6 a new suite of hrtime manipulation routines: `hrtimeAdd()`,
-  `hrtimeAccum()`, `hrtimeNanosec()`, `hrtimeMicrosec()` and
-  `hrtimeMillisec()`.
-
-## v1.0.0 (2015-09-01)
-
-First tracked release.  Includes everything in previous releases, plus:
-
-* #4 want function for merging objects
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/LICENSE
deleted file mode 100644
index cbc0bb3ba3b0629c66c042111fe01c664a6f812f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2012, Joyent, Inc. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/README.md
deleted file mode 100644
index 7303642e016487b9f4216a23aae74b33c53562f5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/README.md
+++ /dev/null
@@ -1,237 +0,0 @@
-# jsprim: utilities for primitive JavaScript types
-
-This module provides miscellaneous facilities for working with strings,
-numbers, dates, and objects and arrays of these basic types.
-
-
-### deepCopy(obj)
-
-Creates a deep copy of a primitive type, object, or array of primitive types.
-
-
-### deepEqual(obj1, obj2)
-
-Returns whether two objects are equal.
-
-
-### isEmpty(obj)
-
-Returns true if the given object has no properties and false otherwise.  This
-is O(1) (unlike `Object.keys(obj).length === 0`, which is O(N)).
-
-### hasKey(obj, key)
-
-Returns true if the given object has an enumerable, non-inherited property
-called `key`.  [For information on enumerability and ownership of properties, see
-the MDN
-documentation.](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Enumerability_and_ownership_of_properties)
-
-### forEachKey(obj, callback)
-
-Like Array.forEach, but iterates enumerable, owned properties of an object
-rather than elements of an array.  Equivalent to:
-
-    for (var key in obj) {
-            if (Object.prototype.hasOwnProperty.call(obj, key)) {
-                    callback(key, obj[key]);
-            }
-    }
-
-
-### flattenObject(obj, depth)
-
-Flattens an object up to a given level of nesting, returning an array of arrays
-of length "depth + 1", where the first "depth" elements correspond to flattened
-columns and the last element contains the remaining object .  For example:
-
-    flattenObject({
-        'I': {
-            'A': {
-                'i': {
-                    'datum1': [ 1, 2 ],
-                    'datum2': [ 3, 4 ]
-                },
-                'ii': {
-                    'datum1': [ 3, 4 ]
-                }
-            },
-            'B': {
-                'i': {
-                    'datum1': [ 5, 6 ]
-                },
-                'ii': {
-                    'datum1': [ 7, 8 ],
-                    'datum2': [ 3, 4 ],
-                },
-                'iii': {
-                }
-            }
-        },
-        'II': {
-            'A': {
-                'i': {
-                    'datum1': [ 1, 2 ],
-                    'datum2': [ 3, 4 ]
-                }
-            }
-        }
-    }, 3)
-
-becomes:
-
-    [
-        [ 'I',  'A', 'i',   { 'datum1': [ 1, 2 ], 'datum2': [ 3, 4 ] } ],
-        [ 'I',  'A', 'ii',  { 'datum1': [ 3, 4 ] } ],
-        [ 'I',  'B', 'i',   { 'datum1': [ 5, 6 ] } ],
-        [ 'I',  'B', 'ii',  { 'datum1': [ 7, 8 ], 'datum2': [ 3, 4 ] } ],
-        [ 'I',  'B', 'iii', {} ],
-        [ 'II', 'A', 'i',   { 'datum1': [ 1, 2 ], 'datum2': [ 3, 4 ] } ]
-    ]
-
-This function is strict: "depth" must be a non-negative integer and "obj" must
-be a non-null object with at least "depth" levels of nesting under all keys.
-
-
-### flattenIter(obj, depth, func)
-
-This is similar to `flattenObject` except that instead of returning an array,
-this function invokes `func(entry)` for each `entry` in the array that
-`flattenObject` would return.  `flattenIter(obj, depth, func)` is logically
-equivalent to `flattenObject(obj, depth).forEach(func)`.  Importantly, this
-version never constructs the full array.  Its memory usage is O(depth) rather
-than O(n) (where `n` is the number of flattened elements).
-
-There's another difference between `flattenObject` and `flattenIter` that's
-related to the special case where `depth === 0`.  In this case, `flattenObject`
-omits the array wrapping `obj` (which is regrettable).
-
-
-### pluck(obj, key)
-
-Fetch nested property "key" from object "obj", traversing objects as needed.
-For example, `pluck(obj, "foo.bar.baz")` is roughly equivalent to
-`obj.foo.bar.baz`, except that:
-
-1. If traversal fails, the resulting value is undefined, and no error is
-   thrown.  For example, `pluck({}, "foo.bar")` is just undefined.
-2. If "obj" has property "key" directly (without traversing), the
-   corresponding property is returned.  For example,
-   `pluck({ 'foo.bar': 1 }, 'foo.bar')` is 1, not undefined.  This is also
-   true recursively, so `pluck({ 'a': { 'foo.bar': 1 } }, 'a.foo.bar')` is
-   also 1, not undefined.
-
-
-### randElt(array)
-
-Returns an element from "array" selected uniformly at random.  If "array" is
-empty, throws an Error.
-
-
-### startsWith(str, prefix)
-
-Returns true if the given string starts with the given prefix and false
-otherwise.
-
-
-### endsWith(str, suffix)
-
-Returns true if the given string ends with the given suffix and false
-otherwise.
-
-
-### iso8601(date)
-
-Converts a Date object to an ISO8601 date string of the form
-"YYYY-MM-DDTHH:MM:SS.sssZ".  This format is not customizable.
-
-
-### parseDateTime(str)
-
-Parses a date expressed as a string, as either a number of milliseconds since
-the epoch or any string format that Date accepts, giving preference to the
-former where these two sets overlap (e.g., strings containing small numbers).
-
-
-### hrtimeDiff(timeA, timeB)
-
-Given two hrtime readings (as from Node's `process.hrtime()`), where timeA is
-later than timeB, compute the difference and return that as an hrtime.  It is
-illegal to invoke this for a pair of times where timeB is newer than timeA.
-
-### hrtimeAdd(timeA, timeB)
-
-Add two hrtime intervals (as from Node's `process.hrtime()`), returning a new
-hrtime interval array.  This function does not modify either input argument.
-
-
-### hrtimeAccum(timeA, timeB)
-
-Add two hrtime intervals (as from Node's `process.hrtime()`), storing the
-result in `timeA`.  This function overwrites (and returns) the first argument
-passed in.
-
-
-### hrtimeNanosec(timeA), hrtimeMicrosec(timeA), hrtimeMillisec(timeA)
-
-This suite of functions converts a hrtime interval (as from Node's
-`process.hrtime()`) into a scalar number of nanoseconds, microseconds or
-milliseconds.  Results are truncated, as with `Math.floor()`.
-
-
-### validateJsonObject(schema, object)
-
-Uses JSON validation (via JSV) to validate the given object against the given
-schema.  On success, returns null.  On failure, *returns* (does not throw) a
-useful Error object.
-
-
-### extraProperties(object, allowed)
-
-Check an object for unexpected properties.  Accepts the object to check, and an
-array of allowed property name strings.  If extra properties are detected, an
-array of extra property names is returned.  If no properties other than those
-in the allowed list are present on the object, the returned array will be of
-zero length.
-
-### mergeObjects(provided, overrides, defaults)
-
-Merge properties from objects "provided", "overrides", and "defaults".  The
-intended use case is for functions that accept named arguments in an "args"
-object, but want to provide some default values and override other values.  In
-that case, "provided" is what the caller specified, "overrides" are what the
-function wants to override, and "defaults" contains default values.
-
-The function starts with the values in "defaults", overrides them with the
-values in "provided", and then overrides those with the values in "overrides".
-For convenience, any of these objects may be falsey, in which case they will be
-ignored.  The input objects are never modified, but properties in the returned
-object are not deep-copied.
-
-For example:
-
-    mergeObjects(undefined, { 'objectMode': true }, { 'highWaterMark': 0 })
-
-returns:
-
-    { 'objectMode': true, 'highWaterMark': 0 }
-
-For another example:
-
-    mergeObjects(
-        { 'highWaterMark': 16, 'objectMode': 7 }, /* from caller */
-        { 'objectMode': true },                   /* overrides */
-        { 'highWaterMark': 0 });                  /* default */
-
-returns:
-
-    { 'objectMode': true, 'highWaterMark': 16 }
-
-
-# Contributing
-
-Code should be "make check" clean.  This target assumes that
-[jsl](http://github.com/davepacheco/javascriptlint) and
-[jsstyle](http://github.com/davepacheco/jsstyle) are on your path.
-
-New tests should generally accompany new functions and bug fixes.  The tests
-should pass cleanly (run tests/basic.js).
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/lib/jsprim.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/lib/jsprim.js
deleted file mode 100644
index 26c3ba1c076f3f9f1cff1a13f0bd4d7535586c6d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/lib/jsprim.js
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- * lib/jsprim.js: utilities for primitive JavaScript types
- */
-
-var mod_assert = require('assert');
-var mod_util = require('util');
-
-var mod_extsprintf = require('extsprintf');
-var mod_verror = require('verror');
-var mod_jsonschema = require('json-schema');
-
-/*
- * Public interface
- */
-exports.deepCopy = deepCopy;
-exports.deepEqual = deepEqual;
-exports.isEmpty = isEmpty;
-exports.hasKey = hasKey;
-exports.forEachKey = forEachKey;
-exports.pluck = pluck;
-exports.flattenObject = flattenObject;
-exports.flattenIter = flattenIter;
-exports.validateJsonObject = validateJsonObjectJS;
-exports.validateJsonObjectJS = validateJsonObjectJS;
-exports.randElt = randElt;
-exports.extraProperties = extraProperties;
-exports.mergeObjects = mergeObjects;
-
-exports.startsWith = startsWith;
-exports.endsWith = endsWith;
-
-exports.iso8601 = iso8601;
-exports.rfc1123 = rfc1123;
-exports.parseDateTime = parseDateTime;
-
-exports.hrtimediff = hrtimeDiff;
-exports.hrtimeDiff = hrtimeDiff;
-exports.hrtimeAccum = hrtimeAccum;
-exports.hrtimeAdd = hrtimeAdd;
-exports.hrtimeNanosec = hrtimeNanosec;
-exports.hrtimeMicrosec = hrtimeMicrosec;
-exports.hrtimeMillisec = hrtimeMillisec;
-
-
-/*
- * Deep copy an acyclic *basic* Javascript object.  This only handles basic
- * scalars (strings, numbers, booleans) and arbitrarily deep arrays and objects
- * containing these.  This does *not* handle instances of other classes.
- */
-function deepCopy(obj)
-{
-	var ret, key;
-	var marker = '__deepCopy';
-
-	if (obj && obj[marker])
-		throw (new Error('attempted deep copy of cyclic object'));
-
-	if (obj && obj.constructor == Object) {
-		ret = {};
-		obj[marker] = true;
-
-		for (key in obj) {
-			if (key == marker)
-				continue;
-
-			ret[key] = deepCopy(obj[key]);
-		}
-
-		delete (obj[marker]);
-		return (ret);
-	}
-
-	if (obj && obj.constructor == Array) {
-		ret = [];
-		obj[marker] = true;
-
-		for (key = 0; key < obj.length; key++)
-			ret.push(deepCopy(obj[key]));
-
-		delete (obj[marker]);
-		return (ret);
-	}
-
-	/*
-	 * It must be a primitive type -- just return it.
-	 */
-	return (obj);
-}
-
-function deepEqual(obj1, obj2)
-{
-	if (typeof (obj1) != typeof (obj2))
-		return (false);
-
-	if (obj1 === null || obj2 === null || typeof (obj1) != 'object')
-		return (obj1 === obj2);
-
-	if (obj1.constructor != obj2.constructor)
-		return (false);
-
-	var k;
-	for (k in obj1) {
-		if (!obj2.hasOwnProperty(k))
-			return (false);
-
-		if (!deepEqual(obj1[k], obj2[k]))
-			return (false);
-	}
-
-	for (k in obj2) {
-		if (!obj1.hasOwnProperty(k))
-			return (false);
-	}
-
-	return (true);
-}
-
-function isEmpty(obj)
-{
-	var key;
-	for (key in obj)
-		return (false);
-	return (true);
-}
-
-function hasKey(obj, key)
-{
-	mod_assert.equal(typeof (key), 'string');
-	return (Object.prototype.hasOwnProperty.call(obj, key));
-}
-
-function forEachKey(obj, callback)
-{
-	for (var key in obj) {
-		if (hasKey(obj, key)) {
-			callback(key, obj[key]);
-		}
-	}
-}
-
-function pluck(obj, key)
-{
-	mod_assert.equal(typeof (key), 'string');
-	return (pluckv(obj, key));
-}
-
-function pluckv(obj, key)
-{
-	if (obj === null || typeof (obj) !== 'object')
-		return (undefined);
-
-	if (obj.hasOwnProperty(key))
-		return (obj[key]);
-
-	var i = key.indexOf('.');
-	if (i == -1)
-		return (undefined);
-
-	var key1 = key.substr(0, i);
-	if (!obj.hasOwnProperty(key1))
-		return (undefined);
-
-	return (pluckv(obj[key1], key.substr(i + 1)));
-}
-
-/*
- * Invoke callback(row) for each entry in the array that would be returned by
- * flattenObject(data, depth).  This is just like flattenObject(data,
- * depth).forEach(callback), except that the intermediate array is never
- * created.
- */
-function flattenIter(data, depth, callback)
-{
-	doFlattenIter(data, depth, [], callback);
-}
-
-function doFlattenIter(data, depth, accum, callback)
-{
-	var each;
-	var key;
-
-	if (depth === 0) {
-		each = accum.slice(0);
-		each.push(data);
-		callback(each);
-		return;
-	}
-
-	mod_assert.ok(data !== null);
-	mod_assert.equal(typeof (data), 'object');
-	mod_assert.equal(typeof (depth), 'number');
-	mod_assert.ok(depth >= 0);
-
-	for (key in data) {
-		each = accum.slice(0);
-		each.push(key);
-		doFlattenIter(data[key], depth - 1, each, callback);
-	}
-}
-
-function flattenObject(data, depth)
-{
-	if (depth === 0)
-		return ([ data ]);
-
-	mod_assert.ok(data !== null);
-	mod_assert.equal(typeof (data), 'object');
-	mod_assert.equal(typeof (depth), 'number');
-	mod_assert.ok(depth >= 0);
-
-	var rv = [];
-	var key;
-
-	for (key in data) {
-		flattenObject(data[key], depth - 1).forEach(function (p) {
-			rv.push([ key ].concat(p));
-		});
-	}
-
-	return (rv);
-}
-
-function startsWith(str, prefix)
-{
-	return (str.substr(0, prefix.length) == prefix);
-}
-
-function endsWith(str, suffix)
-{
-	return (str.substr(
-	    str.length - suffix.length, suffix.length) == suffix);
-}
-
-function iso8601(d)
-{
-	if (typeof (d) == 'number')
-		d = new Date(d);
-	mod_assert.ok(d.constructor === Date);
-	return (mod_extsprintf.sprintf('%4d-%02d-%02dT%02d:%02d:%02d.%03dZ',
-	    d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(),
-	    d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(),
-	    d.getUTCMilliseconds()));
-}
-
-var RFC1123_MONTHS = [
-    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
-    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
-var RFC1123_DAYS = [
-    'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
-
-function rfc1123(date) {
-	return (mod_extsprintf.sprintf('%s, %02d %s %04d %02d:%02d:%02d GMT',
-	    RFC1123_DAYS[date.getUTCDay()], date.getUTCDate(),
-	    RFC1123_MONTHS[date.getUTCMonth()], date.getUTCFullYear(),
-	    date.getUTCHours(), date.getUTCMinutes(),
-	    date.getUTCSeconds()));
-}
-
-/*
- * Parses a date expressed as a string, as either a number of milliseconds since
- * the epoch or any string format that Date accepts, giving preference to the
- * former where these two sets overlap (e.g., small numbers).
- */
-function parseDateTime(str)
-{
-	/*
-	 * This is irritatingly implicit, but significantly more concise than
-	 * alternatives.  The "+str" will convert a string containing only a
-	 * number directly to a Number, or NaN for other strings.  Thus, if the
-	 * conversion succeeds, we use it (this is the milliseconds-since-epoch
-	 * case).  Otherwise, we pass the string directly to the Date
-	 * constructor to parse.
-	 */
-	var numeric = +str;
-	if (!isNaN(numeric)) {
-		return (new Date(numeric));
-	} else {
-		return (new Date(str));
-	}
-}
-
-function validateJsonObjectJS(schema, input)
-{
-	var report = mod_jsonschema.validate(input, schema);
-
-	if (report.errors.length === 0)
-		return (null);
-
-	/* Currently, we only do anything useful with the first error. */
-	var error = report.errors[0];
-
-	/* The failed property is given by a URI with an irrelevant prefix. */
-	var propname = error['property'];
-	var reason = error['message'].toLowerCase();
-	var i, j;
-
-	/*
-	 * There's at least one case where the property error message is
-	 * confusing at best.  We work around this here.
-	 */
-	if ((i = reason.indexOf('the property ')) != -1 &&
-	    (j = reason.indexOf(' is not defined in the schema and the ' +
-	    'schema does not allow additional properties')) != -1) {
-		i += 'the property '.length;
-		if (propname === '')
-			propname = reason.substr(i, j - i);
-		else
-			propname = propname + '.' + reason.substr(i, j - i);
-
-		reason = 'unsupported property';
-	}
-
-	var rv = new mod_verror.VError('property "%s": %s', propname, reason);
-	rv.jsv_details = error;
-	return (rv);
-}
-
-function randElt(arr)
-{
-	mod_assert.ok(Array.isArray(arr) && arr.length > 0,
-	    'randElt argument must be a non-empty array');
-
-	return (arr[Math.floor(Math.random() * arr.length)]);
-}
-
-function assertHrtime(a)
-{
-	mod_assert.ok(a[0] >= 0 && a[1] >= 0,
-	    'negative numbers not allowed in hrtimes');
-	mod_assert.ok(a[1] < 1e9, 'nanoseconds column overflow');
-}
-
-/*
- * Compute the time elapsed between hrtime readings A and B, where A is later
- * than B.  hrtime readings come from Node's process.hrtime().  There is no
- * defined way to represent negative deltas, so it's illegal to diff B from A
- * where the time denoted by B is later than the time denoted by A.  If this
- * becomes valuable, we can define a representation and extend the
- * implementation to support it.
- */
-function hrtimeDiff(a, b)
-{
-	assertHrtime(a);
-	assertHrtime(b);
-	mod_assert.ok(a[0] > b[0] || (a[0] == b[0] && a[1] >= b[1]),
-	    'negative differences not allowed');
-
-	var rv = [ a[0] - b[0], 0 ];
-
-	if (a[1] >= b[1]) {
-		rv[1] = a[1] - b[1];
-	} else {
-		rv[0]--;
-		rv[1] = 1e9 - (b[1] - a[1]);
-	}
-
-	return (rv);
-}
-
-/*
- * Convert a hrtime reading from the array format returned by Node's
- * process.hrtime() into a scalar number of nanoseconds.
- */
-function hrtimeNanosec(a)
-{
-	assertHrtime(a);
-
-	return (Math.floor(a[0] * 1e9 + a[1]));
-}
-
-/*
- * Convert a hrtime reading from the array format returned by Node's
- * process.hrtime() into a scalar number of microseconds.
- */
-function hrtimeMicrosec(a)
-{
-	assertHrtime(a);
-
-	return (Math.floor(a[0] * 1e6 + a[1] / 1e3));
-}
-
-/*
- * Convert a hrtime reading from the array format returned by Node's
- * process.hrtime() into a scalar number of milliseconds.
- */
-function hrtimeMillisec(a)
-{
-	assertHrtime(a);
-
-	return (Math.floor(a[0] * 1e3 + a[1] / 1e6));
-}
-
-/*
- * Add two hrtime readings A and B, overwriting A with the result of the
- * addition.  This function is useful for accumulating several hrtime intervals
- * into a counter.  Returns A.
- */
-function hrtimeAccum(a, b)
-{
-	assertHrtime(a);
-	assertHrtime(b);
-
-	/*
-	 * Accumulate the nanosecond component.
-	 */
-	a[1] += b[1];
-	if (a[1] >= 1e9) {
-		/*
-		 * The nanosecond component overflowed, so carry to the seconds
-		 * field.
-		 */
-		a[0]++;
-		a[1] -= 1e9;
-	}
-
-	/*
-	 * Accumulate the seconds component.
-	 */
-	a[0] += b[0];
-
-	return (a);
-}
-
-/*
- * Add two hrtime readings A and B, returning the result as a new hrtime array.
- * Does not modify either input argument.
- */
-function hrtimeAdd(a, b)
-{
-	assertHrtime(a);
-
-	var rv = [ a[0], a[1] ];
-
-	return (hrtimeAccum(rv, b));
-}
-
-
-/*
- * Check an object for unexpected properties.  Accepts the object to check, and
- * an array of allowed property names (strings).  Returns an array of key names
- * that were found on the object, but did not appear in the list of allowed
- * properties.  If no properties were found, the returned array will be of
- * zero length.
- */
-function extraProperties(obj, allowed)
-{
-	mod_assert.ok(typeof (obj) === 'object' && obj !== null,
-	    'obj argument must be a non-null object');
-	mod_assert.ok(Array.isArray(allowed),
-	    'allowed argument must be an array of strings');
-	for (var i = 0; i < allowed.length; i++) {
-		mod_assert.ok(typeof (allowed[i]) === 'string',
-		    'allowed argument must be an array of strings');
-	}
-
-	return (Object.keys(obj).filter(function (key) {
-		return (allowed.indexOf(key) === -1);
-	}));
-}
-
-/*
- * Given three sets of properties "provided" (may be undefined), "overrides"
- * (required), and "defaults" (may be undefined), construct an object containing
- * the union of these sets with "overrides" overriding "provided", and
- * "provided" overriding "defaults".  None of the input objects are modified.
- */
-function mergeObjects(provided, overrides, defaults)
-{
-	var rv, k;
-
-	rv = {};
-	if (defaults) {
-		for (k in defaults)
-			rv[k] = defaults[k];
-	}
-
-	if (provided) {
-		for (k in provided)
-			rv[k] = provided[k];
-	}
-
-	if (overrides) {
-		for (k in overrides)
-			rv[k] = overrides[k];
-	}
-
-	return (rv);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/.gitmodules b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/.gitmodules
deleted file mode 100644
index 4e0f5e29d19213168752b6e8e38db86c44d4dbfc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/.gitmodules
+++ /dev/null
@@ -1,6 +0,0 @@
-[submodule "deps/jsstyle"]
-	path = deps/jsstyle
-	url = git://github.com/davepacheco/jsstyle
-[submodule "deps/javascriptlint"]
-	path = deps/javascriptlint
-	url = git://github.com/davepacheco/javascriptlint
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/LICENSE
deleted file mode 100644
index cbc0bb3ba3b0629c66c042111fe01c664a6f812f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2012, Joyent, Inc. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/Makefile b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/Makefile
deleted file mode 100644
index 1deeb5fdff465f865d5a1ad58e4b223df4a712fd..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/Makefile
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# Copyright (c) 2012, Joyent, Inc. All rights reserved.
-#
-# Makefile: top-level Makefile
-#
-# This Makefile contains only repo-specific logic and uses included makefiles
-# to supply common targets (javascriptlint, jsstyle, restdown, etc.), which are
-# used by other repos as well.
-#
-
-#
-# Files
-#
-JS_FILES	:= $(shell find lib -name '*.js')
-JSL_FILES_NODE   = $(JS_FILES)
-JSSTYLE_FILES	 = $(JS_FILES)
-JSL_CONF_NODE	 = jsl.node.conf
-
-# Default target is "check"
-check:
-
-include ./Makefile.deps
-include ./Makefile.targ
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/Makefile.deps b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/Makefile.deps
deleted file mode 100644
index 2811bde17a4f07a360da2943d0cf4e4880aa34d7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/Makefile.deps
+++ /dev/null
@@ -1,39 +0,0 @@
-# -*- mode: makefile -*-
-#
-# Copyright (c) 2012, Joyent, Inc. All rights reserved.
-#
-# Makefile.deps: Makefile for including common tools as dependencies
-#
-# NOTE: This makefile comes from the "eng" repo. It's designed to be dropped
-# into other repos as-is without requiring any modifications. If you find
-# yourself changing this file, you should instead update the original copy in
-# eng.git and then update your repo to use the new version.
-#
-# This file is separate from Makefile.targ so that teams can choose
-# independently whether to use the common targets in Makefile.targ and the
-# common tools here.
-#
-
-#
-# javascriptlint
-#
-JSL_EXEC	?= deps/javascriptlint/build/install/jsl
-JSL		?= python2.6 $(JSL_EXEC)
-
-$(JSL_EXEC): | deps/javascriptlint/.git
-	cd deps/javascriptlint && make install
-
-#
-# jsstyle
-#
-JSSTYLE_EXEC	?= deps/jsstyle/jsstyle
-JSSTYLE		?= $(JSSTYLE_EXEC)
-
-$(JSSTYLE_EXEC): | deps/jsstyle/.git
-
-#
-# restdown
-#
-RESTDOWN_EXEC	?= deps/restdown/bin/restdown
-RESTDOWN	?= python2.6 $(RESTDOWN_EXEC)
-$(RESTDOWN_EXEC): | deps/restdown/.git
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/Makefile.targ b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/Makefile.targ
deleted file mode 100644
index 2a64fe7e950f41db5e957cd8390318b53ca584db..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/Makefile.targ
+++ /dev/null
@@ -1,285 +0,0 @@
-# -*- mode: makefile -*-
-#
-# Copyright (c) 2012, Joyent, Inc. All rights reserved.
-#
-# Makefile.targ: common targets.
-#
-# NOTE: This makefile comes from the "eng" repo. It's designed to be dropped
-# into other repos as-is without requiring any modifications. If you find
-# yourself changing this file, you should instead update the original copy in
-# eng.git and then update your repo to use the new version.
-#
-# This Makefile defines several useful targets and rules. You can use it by
-# including it from a Makefile that specifies some of the variables below.
-#
-# Targets defined in this Makefile:
-#
-#	check	Checks JavaScript files for lint and style
-#		Checks bash scripts for syntax
-#		Checks SMF manifests for validity against the SMF DTD
-#
-#	clean	Removes built files
-#
-#	docs	Builds restdown documentation in docs/
-#
-#	prepush	Depends on "check" and "test"
-#
-#	test	Does nothing (you should override this)
-#
-#	xref	Generates cscope (source cross-reference index)
-#
-# For details on what these targets are supposed to do, see the Joyent
-# Engineering Guide.
-#
-# To make use of these targets, you'll need to set some of these variables. Any
-# variables left unset will simply not be used.
-#
-#	BASH_FILES	Bash scripts to check for syntax
-#			(paths relative to top-level Makefile)
-#
-#	CLEAN_FILES	Files to remove as part of the "clean" target.  Note
-#			that files generated by targets in this Makefile are
-#			automatically included in CLEAN_FILES.  These include
-#			restdown-generated HTML and JSON files.
-#
-#	DOC_FILES	Restdown (documentation source) files. These are
-#			assumed to be contained in "docs/", and must NOT
-#			contain the "docs/" prefix.
-#
-#	JSL_CONF_NODE	Specify JavaScriptLint configuration files
-#	JSL_CONF_WEB	(paths relative to top-level Makefile)
-#
-#			Node.js and Web configuration files are separate
-#			because you'll usually want different global variable
-#			configurations.  If no file is specified, none is given
-#			to jsl, which causes it to use a default configuration,
-#			which probably isn't what you want.
-#
-#	JSL_FILES_NODE	JavaScript files to check with Node config file.
-#	JSL_FILES_WEB	JavaScript files to check with Web config file.
-#
-# You can also override these variables:
-#
-#	BASH		Path to bash (default: bash)
-#
-#	CSCOPE_DIRS	Directories to search for source files for the cscope
-#			index. (default: ".")
-#
-#	JSL		Path to JavaScriptLint (default: "jsl")
-#
-#	JSL_FLAGS_NODE	Additional flags to pass through to JSL
-#	JSL_FLAGS_WEB
-#	JSL_FLAGS
-#
-#	JSSTYLE		Path to jsstyle (default: jsstyle)
-#
-#	JSSTYLE_FLAGS	Additional flags to pass through to jsstyle
-#
-
-#
-# Defaults for the various tools we use.
-#
-BASH		?= bash
-BASHSTYLE	?= tools/bashstyle
-CP		?= cp
-CSCOPE		?= cscope
-CSCOPE_DIRS	?= .
-JSL		?= jsl
-JSSTYLE		?= jsstyle
-MKDIR		?= mkdir -p
-MV		?= mv
-RESTDOWN_FLAGS	?=
-RMTREE		?= rm -rf
-JSL_FLAGS  	?= --nologo --nosummary
-
-ifeq ($(shell uname -s),SunOS)
-	TAR	?= gtar
-else
-	TAR	?= tar
-endif
-
-
-#
-# Defaults for other fixed values.
-#
-BUILD		= build
-DISTCLEAN_FILES += $(BUILD)
-DOC_BUILD	= $(BUILD)/docs/public
-
-#
-# Configure JSL_FLAGS_{NODE,WEB} based on JSL_CONF_{NODE,WEB}.
-#
-ifneq ($(origin JSL_CONF_NODE), undefined)
-	JSL_FLAGS_NODE += --conf=$(JSL_CONF_NODE)
-endif
-
-ifneq ($(origin JSL_CONF_WEB), undefined)
-	JSL_FLAGS_WEB += --conf=$(JSL_CONF_WEB)
-endif
-
-#
-# Targets. For descriptions on what these are supposed to do, see the
-# Joyent Engineering Guide.
-#
-
-#
-# Instruct make to keep around temporary files. We have rules below that
-# automatically update git submodules as needed, but they employ a deps/*/.git
-# temporary file. Without this directive, make tries to remove these .git
-# directories after the build has completed.
-#
-.SECONDARY: $($(wildcard deps/*):%=%/.git)
-
-#
-# This rule enables other rules that use files from a git submodule to have
-# those files depend on deps/module/.git and have "make" automatically check
-# out the submodule as needed.
-#
-deps/%/.git:
-	git submodule update --init deps/$*
-
-#
-# These recipes make heavy use of dynamically-created phony targets. The parent
-# Makefile defines a list of input files like BASH_FILES. We then say that each
-# of these files depends on a fake target called filename.bashchk, and then we
-# define a pattern rule for those targets that runs bash in check-syntax-only
-# mode. This mechanism has the nice properties that if you specify zero files,
-# the rule becomes a noop (unlike a single rule to check all bash files, which
-# would invoke bash with zero files), and you can check individual files from
-# the command line with "make filename.bashchk".
-#
-.PHONY: check-bash
-check-bash: $(BASH_FILES:%=%.bashchk) $(BASH_FILES:%=%.bashstyle)
-
-%.bashchk: %
-	$(BASH) -n $^
-
-%.bashstyle: %
-	$(BASHSTYLE) $^
-
-.PHONY: check-jsl check-jsl-node check-jsl-web
-check-jsl: check-jsl-node check-jsl-web
-
-check-jsl-node: $(JSL_FILES_NODE:%=%.jslnodechk)
-
-check-jsl-web: $(JSL_FILES_WEB:%=%.jslwebchk)
-
-%.jslnodechk: % $(JSL_EXEC)
-	$(JSL) $(JSL_FLAGS) $(JSL_FLAGS_NODE) $<
-
-%.jslwebchk: % $(JSL_EXEC)
-	$(JSL) $(JSL_FLAGS) $(JSL_FLAGS_WEB) $<
-
-.PHONY: check-jsstyle
-check-jsstyle: $(JSSTYLE_FILES:%=%.jsstylechk)
-
-%.jsstylechk: % $(JSSTYLE_EXEC)
-	$(JSSTYLE) $(JSSTYLE_FLAGS) $<
-
-.PHONY: check
-check: check-jsl check-jsstyle check-bash
-	@echo check ok
-
-.PHONY: clean
-clean::
-	-$(RMTREE) $(CLEAN_FILES)
-
-.PHONY: distclean
-distclean:: clean
-	-$(RMTREE) $(DISTCLEAN_FILES)
-
-CSCOPE_FILES = cscope.in.out cscope.out cscope.po.out
-CLEAN_FILES += $(CSCOPE_FILES)
-
-.PHONY: xref
-xref: cscope.files
-	$(CSCOPE) -bqR
-
-.PHONY: cscope.files
-cscope.files:
-	find $(CSCOPE_DIRS) -name '*.c' -o -name '*.h' -o -name '*.cc' \
-	    -o -name '*.js' -o -name '*.s' -o -name '*.cpp' > $@
-
-#
-# The "docs" target is complicated because we do several things here:
-#
-#    (1) Use restdown to build HTML and JSON files from each of DOC_FILES.
-#
-#    (2) Copy these files into $(DOC_BUILD) (build/docs/public), which
-#        functions as a complete copy of the documentation that could be
-#        mirrored or served over HTTP.
-#
-#    (3) Then copy any directories and media from docs/media into
-#        $(DOC_BUILD)/media. This allows projects to include their own media,
-#        including files that will override same-named files provided by
-#        restdown.
-#
-# Step (3) is the surprisingly complex part: in order to do this, we need to
-# identify the subdirectories in docs/media, recreate them in
-# $(DOC_BUILD)/media, then do the same with the files.
-#
-DOC_MEDIA_DIRS := $(shell find docs/media -type d 2>/dev/null | grep -v "^docs/media$$")
-DOC_MEDIA_DIRS := $(DOC_MEDIA_DIRS:docs/media/%=%)
-DOC_MEDIA_DIRS_BUILD := $(DOC_MEDIA_DIRS:%=$(DOC_BUILD)/media/%)
-
-DOC_MEDIA_FILES := $(shell find docs/media -type f 2>/dev/null)
-DOC_MEDIA_FILES := $(DOC_MEDIA_FILES:docs/media/%=%)
-DOC_MEDIA_FILES_BUILD := $(DOC_MEDIA_FILES:%=$(DOC_BUILD)/media/%)
-
-#
-# Like the other targets, "docs" just depends on the final files we want to
-# create in $(DOC_BUILD), leveraging other targets and recipes to define how
-# to get there.
-#
-.PHONY: docs
-docs:							\
-    $(DOC_FILES:%.restdown=$(DOC_BUILD)/%.html)		\
-    $(DOC_FILES:%.restdown=$(DOC_BUILD)/%.json)		\
-    $(DOC_MEDIA_FILES_BUILD)
-
-#
-# We keep the intermediate files so that the next build can see whether the
-# files in DOC_BUILD are up to date.
-#
-.PRECIOUS:					\
-    $(DOC_FILES:%.restdown=docs/%.html)		\
-    $(DOC_FILES:%.restdown=docs/%json)
-
-#
-# We do clean those intermediate files, as well as all of DOC_BUILD.
-#
-CLEAN_FILES +=					\
-    $(DOC_BUILD)				\
-    $(DOC_FILES:%.restdown=docs/%.html)		\
-    $(DOC_FILES:%.restdown=docs/%.json)
-
-#
-# Before installing the files, we must make sure the directories exist. The |
-# syntax tells make that the dependency need only exist, not be up to date.
-# Otherwise, it might try to rebuild spuriously because the directory itself
-# appears out of date.
-#
-$(DOC_MEDIA_FILES_BUILD): | $(DOC_MEDIA_DIRS_BUILD)
-
-$(DOC_BUILD)/%: docs/% | $(DOC_BUILD)
-	$(CP) $< $@
-
-docs/%.json docs/%.html: docs/%.restdown | $(DOC_BUILD) $(RESTDOWN_EXEC)
-	$(RESTDOWN) $(RESTDOWN_FLAGS) -m $(DOC_BUILD) $<
-
-$(DOC_BUILD):
-	$(MKDIR) $@
-
-$(DOC_MEDIA_DIRS_BUILD):
-	$(MKDIR) $@
-
-#
-# The default "test" target does nothing. This should usually be overridden by
-# the parent Makefile. It's included here so we can define "prepush" without
-# requiring the repo to define "test".
-#
-.PHONY: test
-test:
-
-.PHONY: prepush
-prepush: check test
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/README.md
deleted file mode 100644
index 702e4e221c9dc42b8ec51a461ce6b65588c5b68f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/README.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# extsprintf: extended POSIX-style sprintf
-
-Stripped down version of s[n]printf(3c).  We make a best effort to throw an
-exception when given a format string we don't understand, rather than ignoring
-it, so that we won't break existing programs if/when we go implement the rest
-of this.
-
-This implementation currently supports specifying
-
-* field alignment ('-' flag),
-* zero-pad ('0' flag)
-* always show numeric sign ('+' flag),
-* field width
-* conversions for strings, decimal integers, and floats (numbers).
-* argument size specifiers.  These are all accepted but ignored, since
-  Javascript has no notion of the physical size of an argument.
-
-Everything else is currently unsupported, most notably: precision, unsigned
-numbers, non-decimal numbers, and characters.
-
-Besides the usual POSIX conversions, this implementation supports:
-
-* `%j`: pretty-print a JSON object (using node's "inspect")
-* `%r`: pretty-print an Error object
-
-# Example
-
-First, install it:
-
-    # npm install extsprintf
-
-Now, use it:
-
-    var mod_extsprintf = require('extsprintf');
-    console.log(mod_extsprintf.sprintf('hello %25s', 'world'));
-
-outputs:
-
-    hello                     world
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/examples/simple.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/examples/simple.js
deleted file mode 100644
index 9f342f5b193c03bf81fa6c05c036b48116131841..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/examples/simple.js
+++ /dev/null
@@ -1,2 +0,0 @@
-var mod_extsprintf = require('extsprintf');
-console.log(mod_extsprintf.sprintf('hello %25s', 'world'));
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/jsl.node.conf b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/jsl.node.conf
deleted file mode 100644
index 03f787ffbdee4e63a4e0aa8179da4561337fb316..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/jsl.node.conf
+++ /dev/null
@@ -1,137 +0,0 @@
-#
-# Configuration File for JavaScript Lint 
-#
-# This configuration file can be used to lint a collection of scripts, or to enable
-# or disable warnings for scripts that are linted via the command line.
-#
-
-### Warnings
-# Enable or disable warnings based on requirements.
-# Use "+WarningName" to display or "-WarningName" to suppress.
-#
-+ambiguous_else_stmt          # the else statement could be matched with one of multiple if statements (use curly braces to indicate intent
-+ambiguous_nested_stmt        # block statements containing block statements should use curly braces to resolve ambiguity
-+ambiguous_newline            # unexpected end of line; it is ambiguous whether these lines are part of the same statement
-+anon_no_return_value         # anonymous function does not always return value
-+assign_to_function_call      # assignment to a function call
--block_without_braces         # block statement without curly braces
-+comma_separated_stmts        # multiple statements separated by commas (use semicolons?)
-+comparison_type_conv         # comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==)
-+default_not_at_end           # the default case is not at the end of the switch statement
-+dup_option_explicit          # duplicate "option explicit" control comment
-+duplicate_case_in_switch     # duplicate case in switch statement
-+duplicate_formal             # duplicate formal argument {name}
-+empty_statement              # empty statement or extra semicolon
-+identifier_hides_another     # identifer {name} hides an identifier in a parent scope
--inc_dec_within_stmt          # increment (++) and decrement (--) operators used as part of greater statement
-+incorrect_version            # Expected /*jsl:content-type*/ control comment. The script was parsed with the wrong version.
-+invalid_fallthru             # unexpected "fallthru" control comment
-+invalid_pass                 # unexpected "pass" control comment
-+jsl_cc_not_understood        # couldn't understand control comment using /*jsl:keyword*/ syntax
-+leading_decimal_point        # leading decimal point may indicate a number or an object member
-+legacy_cc_not_understood     # couldn't understand control comment using /*@keyword@*/ syntax
-+meaningless_block            # meaningless block; curly braces have no impact
-+mismatch_ctrl_comments       # mismatched control comment; "ignore" and "end" control comments must have a one-to-one correspondence
-+misplaced_regex              # regular expressions should be preceded by a left parenthesis, assignment, colon, or comma
-+missing_break                # missing break statement
-+missing_break_for_last_case  # missing break statement for last case in switch
-+missing_default_case         # missing default case in switch statement
-+missing_option_explicit      # the "option explicit" control comment is missing
-+missing_semicolon            # missing semicolon
-+missing_semicolon_for_lambda # missing semicolon for lambda assignment
-+multiple_plus_minus          # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs
-+nested_comment               # nested comment
-+no_return_value              # function {name} does not always return a value
-+octal_number                 # leading zeros make an octal number
-+parseint_missing_radix       # parseInt missing radix parameter
-+partial_option_explicit      # the "option explicit" control comment, if used, must be in the first script tag
-+redeclared_var               # redeclaration of {name}
-+trailing_comma_in_array      # extra comma is not recommended in array initializers
-+trailing_decimal_point       # trailing decimal point may indicate a number or an object member
-+undeclared_identifier        # undeclared identifier: {name}
-+unreachable_code             # unreachable code
--unreferenced_argument        # argument declared but never referenced: {name}
--unreferenced_function        # function is declared but never referenced: {name}
-+unreferenced_variable        # variable is declared but never referenced: {name}
-+unsupported_version          # JavaScript {version} is not supported
-+use_of_label                 # use of label
-+useless_assign               # useless assignment
-+useless_comparison           # useless comparison; comparing identical expressions
--useless_quotes               # the quotation marks are unnecessary
-+useless_void                 # use of the void type may be unnecessary (void is always undefined)
-+var_hides_arg                # variable {name} hides argument
-+want_assign_or_call          # expected an assignment or function call
-+with_statement               # with statement hides undeclared variables; use temporary variable instead
-
-
-### Output format
-# Customize the format of the error message.
-#    __FILE__ indicates current file path
-#    __FILENAME__ indicates current file name
-#    __LINE__ indicates current line
-#    __COL__ indicates current column
-#    __ERROR__ indicates error message (__ERROR_PREFIX__: __ERROR_MSG__)
-#    __ERROR_NAME__ indicates error name (used in configuration file)
-#    __ERROR_PREFIX__ indicates error prefix
-#    __ERROR_MSG__ indicates error message
-#
-# For machine-friendly output, the output format can be prefixed with
-# "encode:". If specified, all items will be encoded with C-slashes.
-#
-# Visual Studio syntax (default):
-+output-format __FILE__(__LINE__): __ERROR__
-# Alternative syntax:
-#+output-format __FILE__:__LINE__: __ERROR__
-
-
-### Context
-# Show the in-line position of the error.
-# Use "+context" to display or "-context" to suppress.
-#
-+context
-
-
-### Control Comments
-# Both JavaScript Lint and the JScript interpreter confuse each other with the syntax for
-# the /*@keyword@*/ control comments and JScript conditional comments. (The latter is
-# enabled in JScript with @cc_on@). The /*jsl:keyword*/ syntax is preferred for this reason,
-# although legacy control comments are enabled by default for backward compatibility.
-#
--legacy_control_comments
-
-
-### Defining identifiers
-# By default, "option explicit" is enabled on a per-file basis.
-# To enable this for all files, use "+always_use_option_explicit"
--always_use_option_explicit
-
-# Define certain identifiers of which the lint is not aware.
-# (Use this in conjunction with the "undeclared identifier" warning.)
-#
-# Common uses for webpages might be:
-+define __dirname
-+define clearInterval
-+define clearTimeout
-+define console
-+define exports
-+define global
-+define process
-+define require
-+define setInterval
-+define setTimeout
-+define Buffer
-+define JSON
-+define Math
-
-### JavaScript Version
-# To change the default JavaScript version:
-#+default-type text/javascript;version=1.5
-#+default-type text/javascript;e4x=1
-
-### Files
-# Specify which files to lint
-# Use "+recurse" to enable recursion (disabled by default).
-# To add a set of files, use "+process FileName", "+process Folder\Path\*.js",
-# or "+process Folder\Path\*.htm".
-#
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/lib/extsprintf.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/lib/extsprintf.js
deleted file mode 100644
index 61ff891dede28e0e144c6bfa12396504514ead08..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/lib/extsprintf.js
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * extsprintf.js: extended POSIX-style sprintf
- */
-
-var mod_assert = require('assert');
-var mod_util = require('util');
-
-/*
- * Public interface
- */
-exports.sprintf = jsSprintf;
-
-/*
- * Stripped down version of s[n]printf(3c).  We make a best effort to throw an
- * exception when given a format string we don't understand, rather than
- * ignoring it, so that we won't break existing programs if/when we go implement
- * the rest of this.
- *
- * This implementation currently supports specifying
- *	- field alignment ('-' flag),
- * 	- zero-pad ('0' flag)
- *	- always show numeric sign ('+' flag),
- *	- field width
- *	- conversions for strings, decimal integers, and floats (numbers).
- *	- argument size specifiers.  These are all accepted but ignored, since
- *	  Javascript has no notion of the physical size of an argument.
- *
- * Everything else is currently unsupported, most notably precision, unsigned
- * numbers, non-decimal numbers, and characters.
- */
-function jsSprintf(fmt)
-{
-	var regex = [
-	    '([^%]*)',				/* normal text */
-	    '%',				/* start of format */
-	    '([\'\\-+ #0]*?)',			/* flags (optional) */
-	    '([1-9]\\d*)?',			/* width (optional) */
-	    '(\\.([1-9]\\d*))?',		/* precision (optional) */
-	    '[lhjztL]*?',			/* length mods (ignored) */
-	    '([diouxXfFeEgGaAcCsSp%jr])'	/* conversion */
-	].join('');
-
-	var re = new RegExp(regex);
-	var args = Array.prototype.slice.call(arguments, 1);
-	var flags, width, precision, conversion;
-	var left, pad, sign, arg, match;
-	var ret = '';
-	var argn = 1;
-
-	mod_assert.equal('string', typeof (fmt));
-
-	while ((match = re.exec(fmt)) !== null) {
-		ret += match[1];
-		fmt = fmt.substring(match[0].length);
-
-		flags = match[2] || '';
-		width = match[3] || 0;
-		precision = match[4] || '';
-		conversion = match[6];
-		left = false;
-		sign = false;
-		pad = ' ';
-
-		if (conversion == '%') {
-			ret += '%';
-			continue;
-		}
-
-		if (args.length === 0)
-			throw (new Error('too few args to sprintf'));
-
-		arg = args.shift();
-		argn++;
-
-		if (flags.match(/[\' #]/))
-			throw (new Error(
-			    'unsupported flags: ' + flags));
-
-		if (precision.length > 0)
-			throw (new Error(
-			    'non-zero precision not supported'));
-
-		if (flags.match(/-/))
-			left = true;
-
-		if (flags.match(/0/))
-			pad = '0';
-
-		if (flags.match(/\+/))
-			sign = true;
-
-		switch (conversion) {
-		case 's':
-			if (arg === undefined || arg === null)
-				throw (new Error('argument ' + argn +
-				    ': attempted to print undefined or null ' +
-				    'as a string'));
-			ret += doPad(pad, width, left, arg.toString());
-			break;
-
-		case 'd':
-			arg = Math.floor(arg);
-			/*jsl:fallthru*/
-		case 'f':
-			sign = sign && arg > 0 ? '+' : '';
-			ret += sign + doPad(pad, width, left,
-			    arg.toString());
-			break;
-
-		case 'j': /* non-standard */
-			if (width === 0)
-				width = 10;
-			ret += mod_util.inspect(arg, false, width);
-			break;
-
-		case 'r': /* non-standard */
-			ret += dumpException(arg);
-			break;
-
-		default:
-			throw (new Error('unsupported conversion: ' +
-			    conversion));
-		}
-	}
-
-	ret += fmt;
-	return (ret);
-}
-
-function doPad(chr, width, left, str)
-{
-	var ret = str;
-
-	while (ret.length < width) {
-		if (left)
-			ret += chr;
-		else
-			ret = chr + ret;
-	}
-
-	return (ret);
-}
-
-/*
- * This function dumps long stack traces for exceptions having a cause() method.
- * See node-verror for an example.
- */
-function dumpException(ex)
-{
-	var ret;
-
-	if (!(ex instanceof Error))
-		throw (new Error(jsSprintf('invalid type for %%r: %j', ex)));
-
-	/* Note that V8 prepends "ex.stack" with ex.toString(). */
-	ret = 'EXCEPTION: ' + ex.constructor.name + ': ' + ex.stack;
-
-	if (ex.cause && typeof (ex.cause) === 'function') {
-		var cex = ex.cause();
-		if (cex) {
-			ret += '\nCaused by: ' + dumpException(cex);
-		}
-	}
-
-	return (ret);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/package.json
deleted file mode 100644
index f0bc2040c1c85ece9b9077d0ac923158e0873ecc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/extsprintf/package.json
+++ /dev/null
@@ -1,48 +0,0 @@
-{
-  "_from": "extsprintf@1.0.2",
-  "_id": "extsprintf@1.0.2",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/jsprim/extsprintf",
-  "_npmUser": {
-    "email": "dap@cs.brown.edu",
-    "name": "dap"
-  },
-  "_npmVersion": "1.1.65",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature/jsprim",
-    "/serialport/node-pre-gyp/request/http-signature/jsprim/verror"
-  ],
-  "_resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz",
-  "_shasum": "e1080e0658e300b06294990cc70e1502235fd550",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/davepacheco/node-extsprintf/issues"
-  },
-  "dependencies": {},
-  "description": "extended POSIX-style sprintf",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "e1080e0658e300b06294990cc70e1502235fd550",
-    "tarball": "http://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz"
-  },
-  "engines": [
-    "node >=0.6.0"
-  ],
-  "homepage": "https://github.com/davepacheco/node-extsprintf#readme",
-  "main": "./lib/extsprintf.js",
-  "maintainers": [
-    {
-      "name": "dap",
-      "email": "dap@cs.brown.edu"
-    }
-  ],
-  "name": "extsprintf",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/davepacheco/node-extsprintf.git"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/README.md
deleted file mode 100644
index ccc591b68fc58ce72137e1f2c2f024d2479d5a57..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-JSON Schema is a repository for the JSON Schema specification, reference schemas and a CommonJS implementation of JSON Schema (not the only JavaScript implementation of JSON Schema, JSV is another excellent JavaScript validator).
-
-Code is licensed under the AFL or BSD license as part of the Persevere 
-project which is administered under the Dojo foundation,
-and all contributions require a Dojo CLA.
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/hyper-schema b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/hyper-schema
deleted file mode 100644
index 12fe26b621ae6db1b41e77296d8ee07a4e0b24c2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/hyper-schema
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-00/hyper-schema#",
-	"id" : "http://json-schema.org/draft-00/hyper-schema#",
-
-	"properties" : {
-		"links" : {
-			"type" : "array",
-			"items" : {"$ref" : "http://json-schema.org/draft-00/links#"},
-			"optional" : true
-		},
-		
-		"fragmentResolution" : {
-			"type" : "string",
-			"optional" : true,
-			"default" : "dot-delimited"
-		},
-		
-		"root" : {
-			"type" : "boolean",
-			"optional" : true,
-			"default" : false
-		},
-		
-		"readonly" : {
-			"type" : "boolean",
-			"optional" : true,
-			"default" : false
-		},
-		
-		"pathStart" : {
-			"type" : "string",
-			"optional" : true,
-			"format" : "uri"
-		},
-		
-		"mediaType" : {
-			"type" : "string",
-			"optional" : true,
-			"format" : "media-type"
-		},
-		
-		"alternate" : {
-			"type" : "array",
-			"items" : {"$ref" : "#"},
-			"optional" : true
-		}
-	},
-	
-	"links" : [
-		{
-			"href" : "{$ref}",
-			"rel" : "full"
-		},
-		
-		{
-			"href" : "{$schema}",
-			"rel" : "describedby"
-		},
-		
-		{
-			"href" : "{id}",
-			"rel" : "self"
-		}
-	],
-	
-	"fragmentResolution" : "dot-delimited",
-	"extends" : {"$ref" : "http://json-schema.org/draft-00/schema#"}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/json-ref b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/json-ref
deleted file mode 100644
index 0c825bce4f175ad7020dcd3ac08ebe4126629f4b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/json-ref
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-00/hyper-schema#",
-	"id" : "http://json-schema.org/draft-00/json-ref#",
-	
-	"items" : {"$ref" : "#"},
-	"additionalProperties" : {"$ref" : "#"},
-	
-	"links" : [
-		{
-			"href" : "{$ref}",
-			"rel" : "full"
-		},
-		
-		{
-			"href" : "{$schema}",
-			"rel" : "describedby"
-		},
-		
-		{
-			"href" : "{id}",
-			"rel" : "self"
-		}
-	],
-	
-	"fragmentResolution" : "dot-delimited"
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/links b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/links
deleted file mode 100644
index c9b5517725f4611b7971944ffff9f72d1cb7194d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/links
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-00/hyper-schema#",
-	"id" : "http://json-schema.org/draft-00/links#",
-	"type" : "object",
-	
-	"properties" : {
-		"href" : {
-			"type" : "string"
-		},
-		
-		"rel" : {
-			"type" : "string"
-		},
-		
-		"method" : {
-			"type" : "string",
-			"default" : "GET",
-			"optional" : true
-		},
-		
-		"enctype" : {
-			"type" : "string",
-			"requires" : "method",
-			"optional" : true
-		},
-		
-		"properties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "http://json-schema.org/draft-00/hyper-schema#"},
-			"optional" : true
-		}
-	}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/schema b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/schema
deleted file mode 100644
index a3a214436e4570533241a877742ef2f7493d2f4f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-00/schema
+++ /dev/null
@@ -1,155 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-00/hyper-schema#",
-	"id" : "http://json-schema.org/draft-00/schema#",
-	"type" : "object",
-	
-	"properties" : {
-		"type" : {
-			"type" : ["string", "array"],
-			"items" : {
-				"type" : ["string", {"$ref" : "#"}]
-			},
-			"optional" : true,
-			"default" : "any"
-		},
-		
-		"properties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "#"},
-			"optional" : true,
-			"default" : {}
-		},
-		
-		"items" : {
-			"type" : [{"$ref" : "#"}, "array"],
-			"items" : {"$ref" : "#"},
-			"optional" : true,
-			"default" : {}
-		},
-		
-		"optional" : {
-			"type" : "boolean",
-			"optional" : true,
-			"default" : false
-		},
-		
-		"additionalProperties" : {
-			"type" : [{"$ref" : "#"}, "boolean"],
-			"optional" : true,
-			"default" : {}
-		},
-		
-		"requires" : {
-			"type" : ["string", {"$ref" : "#"}],
-			"optional" : true
-		},
-		
-		"minimum" : {
-			"type" : "number",
-			"optional" : true
-		},
-		
-		"maximum" : {
-			"type" : "number",
-			"optional" : true
-		},
-		
-		"minimumCanEqual" : {
-			"type" : "boolean",
-			"optional" : true,
-			"requires" : "minimum",
-			"default" : true
-		},
-		
-		"maximumCanEqual" : {
-			"type" : "boolean",
-			"optional" : true,
-			"requires" : "maximum",
-			"default" : true
-		},
-		
-		"minItems" : {
-			"type" : "integer",
-			"optional" : true,
-			"minimum" : 0,
-			"default" : 0
-		},
-		
-		"maxItems" : {
-			"type" : "integer",
-			"optional" : true,
-			"minimum" : 0
-		},
-		
-		"pattern" : {
-			"type" : "string",
-			"optional" : true,
-			"format" : "regex"
-		},
-		
-		"minLength" : {
-			"type" : "integer",
-			"optional" : true,
-			"minimum" : 0,
-			"default" : 0
-		},
-		
-		"maxLength" : {
-			"type" : "integer",
-			"optional" : true
-		},
-		
-		"enum" : {
-			"type" : "array",
-			"optional" : true,
-			"minItems" : 1
-		},
-		
-		"title" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"description" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"format" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"contentEncoding" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"default" : {
-			"type" : "any",
-			"optional" : true
-		},
-		
-		"maxDecimal" : {
-			"type" : "integer",
-			"optional" : true,
-			"minimum" : 0
-		},
-		
-		"disallow" : {
-			"type" : ["string", "array"],
-			"items" : {"type" : "string"},
-			"optional" : true
-		},
-		
-		"extends" : {
-			"type" : [{"$ref" : "#"}, "array"],
-			"items" : {"$ref" : "#"},
-			"optional" : true,
-			"default" : {}
-		}
-	},
-	
-	"optional" : true,
-	"default" : {}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/hyper-schema b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/hyper-schema
deleted file mode 100644
index 66e835b655004d47151c394f14446e9f0bbba86b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/hyper-schema
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-01/hyper-schema#",
-	"id" : "http://json-schema.org/draft-01/hyper-schema#",
-
-	"properties" : {
-		"links" : {
-			"type" : "array",
-			"items" : {"$ref" : "http://json-schema.org/draft-01/links#"},
-			"optional" : true
-		},
-		
-		"fragmentResolution" : {
-			"type" : "string",
-			"optional" : true,
-			"default" : "dot-delimited"
-		},
-		
-		"root" : {
-			"type" : "boolean",
-			"optional" : true,
-			"default" : false
-		},
-		
-		"readonly" : {
-			"type" : "boolean",
-			"optional" : true,
-			"default" : false
-		},
-		
-		"pathStart" : {
-			"type" : "string",
-			"optional" : true,
-			"format" : "uri"
-		},
-		
-		"mediaType" : {
-			"type" : "string",
-			"optional" : true,
-			"format" : "media-type"
-		},
-		
-		"alternate" : {
-			"type" : "array",
-			"items" : {"$ref" : "#"},
-			"optional" : true
-		}
-	},
-	
-	"links" : [
-		{
-			"href" : "{$ref}",
-			"rel" : "full"
-		},
-		
-		{
-			"href" : "{$schema}",
-			"rel" : "describedby"
-		},
-		
-		{
-			"href" : "{id}",
-			"rel" : "self"
-		}
-	],
-	
-	"fragmentResolution" : "dot-delimited",
-	"extends" : {"$ref" : "http://json-schema.org/draft-01/schema#"}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/json-ref b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/json-ref
deleted file mode 100644
index f2ad55b1e7de6f229b9773d121dee0c57173f8c1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/json-ref
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-01/hyper-schema#",
-	"id" : "http://json-schema.org/draft-01/json-ref#",
-	
-	"items" : {"$ref" : "#"},
-	"additionalProperties" : {"$ref" : "#"},
-	
-	"links" : [
-		{
-			"href" : "{$ref}",
-			"rel" : "full"
-		},
-		
-		{
-			"href" : "{$schema}",
-			"rel" : "describedby"
-		},
-		
-		{
-			"href" : "{id}",
-			"rel" : "self"
-		}
-	],
-	
-	"fragmentResolution" : "dot-delimited"
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/links b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/links
deleted file mode 100644
index cb183c4d86319a766c85f0912aee49975638b037..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/links
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-01/hyper-schema#",
-	"id" : "http://json-schema.org/draft-01/links#",
-	"type" : "object",
-	
-	"properties" : {
-		"href" : {
-			"type" : "string"
-		},
-		
-		"rel" : {
-			"type" : "string"
-		},
-		
-		"method" : {
-			"type" : "string",
-			"default" : "GET",
-			"optional" : true
-		},
-		
-		"enctype" : {
-			"type" : "string",
-			"requires" : "method",
-			"optional" : true
-		},
-		
-		"properties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "http://json-schema.org/draft-01/hyper-schema#"},
-			"optional" : true
-		}
-	}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/schema b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/schema
deleted file mode 100644
index e6b6aea4ea5d47f3f28523d80ad784280457d4d1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-01/schema
+++ /dev/null
@@ -1,155 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-01/hyper-schema#",
-	"id" : "http://json-schema.org/draft-01/schema#",
-	"type" : "object",
-	
-	"properties" : {
-		"type" : {
-			"type" : ["string", "array"],
-			"items" : {
-				"type" : ["string", {"$ref" : "#"}]
-			},
-			"optional" : true,
-			"default" : "any"
-		},
-		
-		"properties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "#"},
-			"optional" : true,
-			"default" : {}
-		},
-		
-		"items" : {
-			"type" : [{"$ref" : "#"}, "array"],
-			"items" : {"$ref" : "#"},
-			"optional" : true,
-			"default" : {}
-		},
-		
-		"optional" : {
-			"type" : "boolean",
-			"optional" : true,
-			"default" : false
-		},
-		
-		"additionalProperties" : {
-			"type" : [{"$ref" : "#"}, "boolean"],
-			"optional" : true,
-			"default" : {}
-		},
-		
-		"requires" : {
-			"type" : ["string", {"$ref" : "#"}],
-			"optional" : true
-		},
-		
-		"minimum" : {
-			"type" : "number",
-			"optional" : true
-		},
-		
-		"maximum" : {
-			"type" : "number",
-			"optional" : true
-		},
-		
-		"minimumCanEqual" : {
-			"type" : "boolean",
-			"optional" : true,
-			"requires" : "minimum",
-			"default" : true
-		},
-		
-		"maximumCanEqual" : {
-			"type" : "boolean",
-			"optional" : true,
-			"requires" : "maximum",
-			"default" : true
-		},
-		
-		"minItems" : {
-			"type" : "integer",
-			"optional" : true,
-			"minimum" : 0,
-			"default" : 0
-		},
-		
-		"maxItems" : {
-			"type" : "integer",
-			"optional" : true,
-			"minimum" : 0
-		},
-		
-		"pattern" : {
-			"type" : "string",
-			"optional" : true,
-			"format" : "regex"
-		},
-		
-		"minLength" : {
-			"type" : "integer",
-			"optional" : true,
-			"minimum" : 0,
-			"default" : 0
-		},
-		
-		"maxLength" : {
-			"type" : "integer",
-			"optional" : true
-		},
-		
-		"enum" : {
-			"type" : "array",
-			"optional" : true,
-			"minItems" : 1
-		},
-		
-		"title" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"description" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"format" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"contentEncoding" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"default" : {
-			"type" : "any",
-			"optional" : true
-		},
-		
-		"maxDecimal" : {
-			"type" : "integer",
-			"optional" : true,
-			"minimum" : 0
-		},
-		
-		"disallow" : {
-			"type" : ["string", "array"],
-			"items" : {"type" : "string"},
-			"optional" : true
-		},
-		
-		"extends" : {
-			"type" : [{"$ref" : "#"}, "array"],
-			"items" : {"$ref" : "#"},
-			"optional" : true,
-			"default" : {}
-		}
-	},
-	
-	"optional" : true,
-	"default" : {}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/hyper-schema b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/hyper-schema
deleted file mode 100644
index 2d2bc6853e86d3e8363410ad657da22a31441e07..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/hyper-schema
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-02/hyper-schema#",
-	"id" : "http://json-schema.org/draft-02/hyper-schema#",
-
-	"properties" : {
-		"links" : {
-			"type" : "array",
-			"items" : {"$ref" : "http://json-schema.org/draft-02/links#"},
-			"optional" : true
-		},
-		
-		"fragmentResolution" : {
-			"type" : "string",
-			"optional" : true,
-			"default" : "slash-delimited"
-		},
-		
-		"root" : {
-			"type" : "boolean",
-			"optional" : true,
-			"default" : false
-		},
-		
-		"readonly" : {
-			"type" : "boolean",
-			"optional" : true,
-			"default" : false
-		},
-		
-		"pathStart" : {
-			"type" : "string",
-			"optional" : true,
-			"format" : "uri"
-		},
-		
-		"mediaType" : {
-			"type" : "string",
-			"optional" : true,
-			"format" : "media-type"
-		},
-		
-		"alternate" : {
-			"type" : "array",
-			"items" : {"$ref" : "#"},
-			"optional" : true
-		}
-	},
-	
-	"links" : [
-		{
-			"href" : "{$ref}",
-			"rel" : "full"
-		},
-		
-		{
-			"href" : "{$schema}",
-			"rel" : "describedby"
-		},
-		
-		{
-			"href" : "{id}",
-			"rel" : "self"
-		}
-	],
-	
-	"fragmentResolution" : "slash-delimited",
-	"extends" : {"$ref" : "http://json-schema.org/draft-02/schema#"}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/json-ref b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/json-ref
deleted file mode 100644
index 2b23fcdc66ca4863089b42d3223d1064ef596fa8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/json-ref
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-02/hyper-schema#",
-	"id" : "http://json-schema.org/draft-02/json-ref#",
-	
-	"items" : {"$ref" : "#"},
-	"additionalProperties" : {"$ref" : "#"},
-	
-	"links" : [
-		{
-			"href" : "{$ref}",
-			"rel" : "full"
-		},
-		
-		{
-			"href" : "{$schema}",
-			"rel" : "describedby"
-		},
-		
-		{
-			"href" : "{id}",
-			"rel" : "self"
-		}
-	],
-	
-	"fragmentResolution" : "dot-delimited"
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/links b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/links
deleted file mode 100644
index ab971b7c2dc311a63086f8981403dd07efa57a99..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/links
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-02/hyper-schema#",
-	"id" : "http://json-schema.org/draft-02/links#",
-	"type" : "object",
-	
-	"properties" : {
-		"href" : {
-			"type" : "string"
-		},
-		
-		"rel" : {
-			"type" : "string"
-		},
-		
-		"targetSchema" : {"$ref" : "http://json-schema.org/draft-02/hyper-schema#"},
-		
-		"method" : {
-			"type" : "string",
-			"default" : "GET",
-			"optional" : true
-		},
-		
-		"enctype" : {
-			"type" : "string",
-			"requires" : "method",
-			"optional" : true
-		},
-		
-		"properties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "http://json-schema.org/draft-02/hyper-schema#"},
-			"optional" : true
-		}
-	}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/schema b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/schema
deleted file mode 100644
index cc2b6693b9772a2dce6e07efffcecb619826719b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-02/schema
+++ /dev/null
@@ -1,166 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-02/hyper-schema#",
-	"id" : "http://json-schema.org/draft-02/schema#",
-	"type" : "object",
-	
-	"properties" : {
-		"type" : {
-			"type" : ["string", "array"],
-			"items" : {
-				"type" : ["string", {"$ref" : "#"}]
-			},
-			"optional" : true,
-			"uniqueItems" : true,
-			"default" : "any"
-		},
-		
-		"properties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "#"},
-			"optional" : true,
-			"default" : {}
-		},
-		
-		"items" : {
-			"type" : [{"$ref" : "#"}, "array"],
-			"items" : {"$ref" : "#"},
-			"optional" : true,
-			"default" : {}
-		},
-		
-		"optional" : {
-			"type" : "boolean",
-			"optional" : true,
-			"default" : false
-		},
-		
-		"additionalProperties" : {
-			"type" : [{"$ref" : "#"}, "boolean"],
-			"optional" : true,
-			"default" : {}
-		},
-		
-		"requires" : {
-			"type" : ["string", {"$ref" : "#"}],
-			"optional" : true
-		},
-		
-		"minimum" : {
-			"type" : "number",
-			"optional" : true
-		},
-		
-		"maximum" : {
-			"type" : "number",
-			"optional" : true
-		},
-		
-		"minimumCanEqual" : {
-			"type" : "boolean",
-			"optional" : true,
-			"requires" : "minimum",
-			"default" : true
-		},
-		
-		"maximumCanEqual" : {
-			"type" : "boolean",
-			"optional" : true,
-			"requires" : "maximum",
-			"default" : true
-		},
-		
-		"minItems" : {
-			"type" : "integer",
-			"optional" : true,
-			"minimum" : 0,
-			"default" : 0
-		},
-		
-		"maxItems" : {
-			"type" : "integer",
-			"optional" : true,
-			"minimum" : 0
-		},
-		
-		"uniqueItems" : {
-			"type" : "boolean",
-			"optional" : true,
-			"default" : false
-		},
-		
-		"pattern" : {
-			"type" : "string",
-			"optional" : true,
-			"format" : "regex"
-		},
-		
-		"minLength" : {
-			"type" : "integer",
-			"optional" : true,
-			"minimum" : 0,
-			"default" : 0
-		},
-		
-		"maxLength" : {
-			"type" : "integer",
-			"optional" : true
-		},
-		
-		"enum" : {
-			"type" : "array",
-			"optional" : true,
-			"minItems" : 1,
-			"uniqueItems" : true
-		},
-		
-		"title" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"description" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"format" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"contentEncoding" : {
-			"type" : "string",
-			"optional" : true
-		},
-		
-		"default" : {
-			"type" : "any",
-			"optional" : true
-		},
-		
-		"divisibleBy" : {
-			"type" : "number",
-			"minimum" : 0,
-			"minimumCanEqual" : false,
-			"optional" : true,
-			"default" : 1
-		},
-		
-		"disallow" : {
-			"type" : ["string", "array"],
-			"items" : {"type" : "string"},
-			"optional" : true,
-			"uniqueItems" : true
-		},
-		
-		"extends" : {
-			"type" : [{"$ref" : "#"}, "array"],
-			"items" : {"$ref" : "#"},
-			"optional" : true,
-			"default" : {}
-		}
-	},
-	
-	"optional" : true,
-	"default" : {}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/address b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/address
deleted file mode 100644
index 401f20f1c4bfefdb25207e14969d9def2b1936ac..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/address
+++ /dev/null
@@ -1,20 +0,0 @@
-{
-	"description" : "An Address following the convention of http://microformats.org/wiki/hcard",
-	"type" : "object",
-	"properties" : {
-		"post-office-box" : { "type" : "string" },
-		"extended-address" : { "type" : "string" },
-		"street-address" : { "type":"string" },
-		"locality" : { "type" : "string", "required" : true },
-		"region" : { "type" : "string", "required" : true },
-		"postal-code" : { "type" : "string" },
-		"country-name" : { "type" : "string", "required" : true }
-	},
-	"dependencies" : {
-		"post-office-box" : "street-address",
-		"extended-address" : "street-address",
-		"street-address" : "region",
-		"locality" : "region",
-		"region" : "country-name"
-	}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/calendar b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/calendar
deleted file mode 100644
index 0ec47c23c3fa07f81053fbc3d0c35c47373ef6f1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/calendar
+++ /dev/null
@@ -1,53 +0,0 @@
-{
-	"description" : "A representation of an event",
-	"type" : "object",
-	"properties" : {
-		"dtstart" : {
-			"format" : "date-time",
-			"type" : "string",
-			"description" : "Event starting time",
-			"required":true
-		},
-		"summary" : {
-			"type":"string",
-			"required":true
-		},
-		"location" : { 
-			"type" : "string" 
-		},
-		"url" : {
-			"type" : "string", 
-			"format" : "url" 
-		},
-		"dtend" : {
-			"format" : "date-time",
-			"type" : "string",
-			"description" : "Event ending time"
-		},
-		"duration" : {
-			"format" : "date",
-			"type" : "string",
-			"description" : "Event duration"
-		},
-		"rdate" : {
-			"format" : "date-time",
-			"type" : "string",
-			"description" : "Recurrence date"
-		},
-		"rrule" : {
-			"type" : "string",
-			"description" : "Recurrence rule"
-		},
-		"category" : {
-			"type" : "string"
-		},
-		"description" : {
-			"type" : "string"
-		},
-		"geo" : { "$ref" : "http://json-schema.org/draft-03/geo" }
-	}
-}
-		
-			
-			
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/card b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/card
deleted file mode 100644
index a5667ffdd73535eb181e45d16944523741edaf61..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/card
+++ /dev/null
@@ -1,105 +0,0 @@
-{
-   "description":"A representation of a person, company, organization, or place",
-   "type":"object",
-   "properties":{
-      "fn":{
-         "description":"Formatted Name",
-         "type":"string"
-      },
-      "familyName":{
-         "type":"string",
-         "required":true
-      },
-      "givenName":{
-         "type":"string",
-         "required":true
-      },
-      "additionalName":{
-         "type":"array",
-         "items":{
-            "type":"string"
-         }
-      },
-      "honorificPrefix":{
-         "type":"array",
-         "items":{
-            "type":"string"
-         }
-      },
-      "honorificSuffix":{
-         "type":"array",
-         "items":{
-            "type":"string"
-         }
-      },
-      "nickname":{
-         "type":"string"
-      },
-      "url":{
-         "type":"string",
-         "format":"url"
-      },
-      "email":{
-         "type":"object",
-         "properties":{
-            "type":{
-               "type":"string"
-            },
-            "value":{
-               "type":"string",
-               "format":"email"
-            }
-         }
-      },
-      "tel":{
-         "type":"object",
-         "properties":{
-            "type":{
-               "type":"string"
-            },
-            "value":{
-               "type":"string",
-               "format":"phone"
-            }
-         }
-      },
-      "adr":{"$ref" : "http://json-schema.org/address"},
-      "geo":{"$ref" : "http://json-schema.org/geo"},
-      "tz":{
-         "type":"string"
-      },
-      "photo":{
-         "format":"image",
-         "type":"string"
-      },
-      "logo":{
-         "format":"image",
-         "type":"string"
-      },
-      "sound":{
-         "format":"attachment",
-         "type":"string"
-      },
-      "bday":{
-         "type":"string",
-         "format":"date"
-      },
-      "title":{
-         "type":"string"
-      },
-      "role":{
-         "type":"string"
-      },
-      "org":{
-         "type":"object",
-         "properties":{
-            "organizationName":{
-               "type":"string"
-            },
-            "organizationUnit":{
-               "type":"string"
-            }
-         }
-      }
-   }
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/geo b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/geo
deleted file mode 100644
index 4357a909ae06ed9d6aa70b9165834ef201a33197..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/geo
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-	"description" : "A geographical coordinate",
-	"type" : "object",
-	"properties" : {
-		"latitude" : { "type" : "number" },
-		"longitude" : { "type" : "number" }
-	}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/interfaces b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/interfaces
deleted file mode 100644
index b8532f2974b0b11c38f7983487b17c4732c4d41e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/examples/interfaces
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-    "extends":"http://json-schema.org/hyper-schema",
-    "description":"A schema for schema interface definitions that describe programmatic class structures using JSON schema syntax",
-    "properties":{
-        "methods":{
-            "type":"object",
-            "description":"This defines the set of methods available to the class instances",
-            "additionalProperties":{
-            	"type":"object",
-            	"description":"The definition of the method",
-            	"properties":{
-            		"parameters":{
-            			"type":"array",
-            			"description":"The set of parameters that should be passed to the method when it is called",
-            			"items":{"$ref":"#"},
-            			"required": true
-            		},
-            		"returns":{"$ref":"#"}
-            	}
-            }
-        }    
-    }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/hyper-schema b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/hyper-schema
deleted file mode 100644
index 38ca2e103f2139a30f0ffc7c45001ddd7eafb69e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/hyper-schema
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-03/hyper-schema#",
-	"extends" : {"$ref" : "http://json-schema.org/draft-03/schema#"},
-	"id" : "http://json-schema.org/draft-03/hyper-schema#",
-
-	"properties" : {
-		"links" : {
-			"type" : "array",
-			"items" : {"$ref" : "http://json-schema.org/draft-03/links#"}
-		},
-
-		"fragmentResolution" : {
-			"type" : "string",
-			"default" : "slash-delimited"
-		},
-
-		"root" : {
-			"type" : "boolean",
-			"default" : false
-		},
-
-		"readonly" : {
-			"type" : "boolean",
-			"default" : false
-		},
-
-		"contentEncoding" : {
-			"type" : "string"
-		},
-
-		"pathStart" : {
-			"type" : "string",
-			"format" : "uri"
-		},
-
-		"mediaType" : {
-			"type" : "string",
-			"format" : "media-type"
-		}
-	},
-
-	"links" : [
-		{
-			"href" : "{id}",
-			"rel" : "self"
-		},
-
-		{
-			"href" : "{$ref}",
-			"rel" : "full"
-		},
-
-		{
-			"href" : "{$schema}",
-			"rel" : "describedby"
-		}
-	],
-
-	"fragmentResolution" : "slash-delimited"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/json-ref b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/json-ref
deleted file mode 100644
index 66e08f26078bf1720fd6566f0cc9d37a9e7fa0ec..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/json-ref
+++ /dev/null
@@ -1,26 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-03/hyper-schema#",
-	"id" : "http://json-schema.org/draft-03/json-ref#",
-	
-	"additionalItems" : {"$ref" : "#"},
-	"additionalProperties" : {"$ref" : "#"},
-	
-	"links" : [
-		{
-			"href" : "{id}",
-			"rel" : "self"
-		},
-		
-		{
-			"href" : "{$ref}",
-			"rel" : "full"
-		},
-		
-		{
-			"href" : "{$schema}",
-			"rel" : "describedby"
-		}
-	],
-	
-	"fragmentResolution" : "dot-delimited"
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/links b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/links
deleted file mode 100644
index 9fa63f987948a3540836b69e06422883115ef7a5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/links
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-03/hyper-schema#",
-	"id" : "http://json-schema.org/draft-03/links#",
-	"type" : "object",
-	
-	"properties" : {
-		"href" : {
-			"type" : "string",
-			"required" : true,
-			"format" : "link-description-object-template"
-		},
-		
-		"rel" : {
-			"type" : "string",
-			"required" : true
-		},
-		
-		"targetSchema" : {"$ref" : "http://json-schema.org/draft-03/hyper-schema#"},
-		
-		"method" : {
-			"type" : "string",
-			"default" : "GET"
-		},
-		
-		"enctype" : {
-			"type" : "string",
-			"requires" : "method"
-		},
-		
-		"properties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "http://json-schema.org/draft-03/hyper-schema#"}
-		}
-	}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/schema b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/schema
deleted file mode 100644
index 29d9469f9fb50a3f2deba8c4d393dfb6fd7b6d82..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-03/schema
+++ /dev/null
@@ -1,174 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-03/schema#",
-	"id" : "http://json-schema.org/draft-03/schema#",
-	"type" : "object",
-	
-	"properties" : {
-		"type" : {
-			"type" : ["string", "array"],
-			"items" : {
-				"type" : ["string", {"$ref" : "#"}]
-			},
-			"uniqueItems" : true,
-			"default" : "any"
-		},
-		
-		"properties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "#"},
-			"default" : {}
-		},
-		
-		"patternProperties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "#"},
-			"default" : {}
-		},
-		
-		"additionalProperties" : {
-			"type" : [{"$ref" : "#"}, "boolean"],
-			"default" : {}
-		},
-		
-		"items" : {
-			"type" : [{"$ref" : "#"}, "array"],
-			"items" : {"$ref" : "#"},
-			"default" : {}
-		},
-		
-		"additionalItems" : {
-			"type" : [{"$ref" : "#"}, "boolean"],
-			"default" : {}
-		},
-		
-		"required" : {
-			"type" : "boolean",
-			"default" : false
-		},
-		
-		"dependencies" : {
-			"type" : "object",
-			"additionalProperties" : {
-				"type" : ["string", "array", {"$ref" : "#"}],
-				"items" : {
-					"type" : "string"
-				}
-			},
-			"default" : {}
-		},
-		
-		"minimum" : {
-			"type" : "number"
-		},
-		
-		"maximum" : {
-			"type" : "number"
-		},
-		
-		"exclusiveMinimum" : {
-			"type" : "boolean",
-			"default" : false
-		},
-		
-		"exclusiveMaximum" : {
-			"type" : "boolean",
-			"default" : false
-		},
-		
-		"minItems" : {
-			"type" : "integer",
-			"minimum" : 0,
-			"default" : 0
-		},
-		
-		"maxItems" : {
-			"type" : "integer",
-			"minimum" : 0
-		},
-		
-		"uniqueItems" : {
-			"type" : "boolean",
-			"default" : false
-		},
-		
-		"pattern" : {
-			"type" : "string",
-			"format" : "regex"
-		},
-		
-		"minLength" : {
-			"type" : "integer",
-			"minimum" : 0,
-			"default" : 0
-		},
-		
-		"maxLength" : {
-			"type" : "integer"
-		},
-		
-		"enum" : {
-			"type" : "array",
-			"minItems" : 1,
-			"uniqueItems" : true
-		},
-		
-		"default" : {
-			"type" : "any"
-		},
-		
-		"title" : {
-			"type" : "string"
-		},
-		
-		"description" : {
-			"type" : "string"
-		},
-		
-		"format" : {
-			"type" : "string"
-		},
-		
-		"divisibleBy" : {
-			"type" : "number",
-			"minimum" : 0,
-			"exclusiveMinimum" : true,
-			"default" : 1
-		},
-		
-		"disallow" : {
-			"type" : ["string", "array"],
-			"items" : {
-				"type" : ["string", {"$ref" : "#"}]
-			},
-			"uniqueItems" : true
-		},
-		
-		"extends" : {
-			"type" : [{"$ref" : "#"}, "array"],
-			"items" : {"$ref" : "#"},
-			"default" : {}
-		},
-		
-		"id" : {
-			"type" : "string",
-			"format" : "uri"
-		},
-		
-		"$ref" : {
-			"type" : "string",
-			"format" : "uri"
-		},
-		
-		"$schema" : {
-			"type" : "string",
-			"format" : "uri"
-		}
-	},
-	
-	"dependencies" : {
-		"exclusiveMinimum" : "minimum",
-		"exclusiveMaximum" : "maximum"
-	},
-	
-	"default" : {}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/hyper-schema b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/hyper-schema
deleted file mode 100644
index 63fb34d93e84fae813ee4090d08c753d8be45cb0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/hyper-schema
+++ /dev/null
@@ -1,60 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-04/hyper-schema#",
-	"extends" : {"$ref" : "http://json-schema.org/draft-04/schema#"},
-	"id" : "http://json-schema.org/draft-04/hyper-schema#",
-
-	"properties" : {
-		"links" : {
-			"type" : "array",
-			"items" : {"$ref" : "http://json-schema.org/draft-04/links#"}
-		},
-
-		"fragmentResolution" : {
-			"type" : "string",
-			"default" : "json-pointer"
-		},
-
-		"root" : {
-			"type" : "boolean",
-			"default" : false
-		},
-
-		"readonly" : {
-			"type" : "boolean",
-			"default" : false
-		},
-
-		"contentEncoding" : {
-			"type" : "string"
-		},
-
-		"pathStart" : {
-			"type" : "string",
-			"format" : "uri"
-		},
-
-		"mediaType" : {
-			"type" : "string",
-			"format" : "media-type"
-		}
-	},
-
-	"links" : [
-		{
-			"href" : "{id}",
-			"rel" : "self"
-		},
-
-		{
-			"href" : "{$ref}",
-			"rel" : "full"
-		},
-
-		{
-			"href" : "{$schema}",
-			"rel" : "describedby"
-		}
-	],
-
-	"fragmentResolution" : "json-pointer"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/links b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/links
deleted file mode 100644
index 6c06d2930f71e6d7a99c0addb871afec8ca084bf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/links
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-04/hyper-schema#",
-	"id" : "http://json-schema.org/draft-04/links#",
-	"type" : "object",
-	
-	"properties" : {
-		"rel" : {
-			"type" : "string"
-		},
-
-		"href" : {
-			"type" : "string"
-		},
-
-		"template" : {
-			"type" : "string"
-		},
-		
-		"targetSchema" : {"$ref" : "http://json-schema.org/draft-04/hyper-schema#"},
-		
-		"method" : {
-			"type" : "string",
-			"default" : "GET"
-		},
-		
-		"enctype" : {
-			"type" : "string"
-		},
-		
-		"properties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "http://json-schema.org/draft-04/hyper-schema#"}
-		}
-	},
-	
-	"required" : ["rel", "href"],
-	
-	"dependencies" : {
-		"enctype" : "method"
-	}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/schema b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/schema
deleted file mode 100644
index 4231b1692178c563defe00b065bb2c663cb669f9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-04/schema
+++ /dev/null
@@ -1,189 +0,0 @@
-{
-	"$schema" : "http://json-schema.org/draft-04/schema#",
-	"id" : "http://json-schema.org/draft-04/schema#",
-	"type" : "object",
-	
-	"properties" : {
-		"type" : {
-			"type" : [
-				{
-					"id" : "#simple-type",
-					"type" : "string",
-					"enum" : ["object", "array", "string", "number", "boolean", "null", "any"]
-				}, 
-				"array"
-			],
-			"items" : {
-				"type" : [
-					{"$ref" : "#simple-type"}, 
-					{"$ref" : "#"}
-				]
-			},
-			"uniqueItems" : true,
-			"default" : "any"
-		},
-		
-		"disallow" : {
-			"type" : ["string", "array"],
-			"items" : {
-				"type" : ["string", {"$ref" : "#"}]
-			},
-			"uniqueItems" : true
-		},
-		
-		"extends" : {
-			"type" : [{"$ref" : "#"}, "array"],
-			"items" : {"$ref" : "#"},
-			"default" : {}
-		},
-
-		"enum" : {
-			"type" : "array",
-			"minItems" : 1,
-			"uniqueItems" : true
-		},
-	
-		"minimum" : {
-			"type" : "number"
-		},
-		
-		"maximum" : {
-			"type" : "number"
-		},
-		
-		"exclusiveMinimum" : {
-			"type" : "boolean",
-			"default" : false
-		},
-		
-		"exclusiveMaximum" : {
-			"type" : "boolean",
-			"default" : false
-		},
-		
-		"divisibleBy" : {
-			"type" : "number",
-			"minimum" : 0,
-			"exclusiveMinimum" : true,
-			"default" : 1
-		},
-		
-		"minLength" : {
-			"type" : "integer",
-			"minimum" : 0,
-			"default" : 0
-		},
-		
-		"maxLength" : {
-			"type" : "integer"
-		},
-		
-		"pattern" : {
-			"type" : "string"
-		},
-		
-		"items" : {
-			"type" : [{"$ref" : "#"}, "array"],
-			"items" : {"$ref" : "#"},
-			"default" : {}
-		},
-		
-		"additionalItems" : {
-			"type" : [{"$ref" : "#"}, "boolean"],
-			"default" : {}
-		},
-		
-		"minItems" : {
-			"type" : "integer",
-			"minimum" : 0,
-			"default" : 0
-		},
-		
-		"maxItems" : {
-			"type" : "integer",
-			"minimum" : 0
-		},
-		
-		"uniqueItems" : {
-			"type" : "boolean",
-			"default" : false
-		},
-		
-		"properties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "#"},
-			"default" : {}
-		},
-		
-		"patternProperties" : {
-			"type" : "object",
-			"additionalProperties" : {"$ref" : "#"},
-			"default" : {}
-		},
-		
-		"additionalProperties" : {
-			"type" : [{"$ref" : "#"}, "boolean"],
-			"default" : {}
-		},
-		
-		"minProperties" : {
-			"type" : "integer",
-			"minimum" : 0,
-			"default" : 0
-		},
-		
-		"maxProperties" : {
-			"type" : "integer",
-			"minimum" : 0
-		},
-		
-		"required" : {
-			"type" : "array",
-			"items" : {
-				"type" : "string"
-			}
-		},
-		
-		"dependencies" : {
-			"type" : "object",
-			"additionalProperties" : {
-				"type" : ["string", "array", {"$ref" : "#"}],
-				"items" : {
-					"type" : "string"
-				}
-			},
-			"default" : {}
-		},
-		
-		"id" : {
-			"type" : "string"
-		},
-		
-		"$ref" : {
-			"type" : "string"
-		},
-		
-		"$schema" : {
-			"type" : "string"
-		},
-		
-		"title" : {
-			"type" : "string"
-		},
-		
-		"description" : {
-			"type" : "string"
-		},
-		
-		"default" : {
-			"type" : "any"
-		}
-	},
-	
-	"dependencies" : {
-		"exclusiveMinimum" : "minimum",
-		"exclusiveMaximum" : "maximum"
-	},
-	
-	"default" : {}
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-03.xml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-03.xml
deleted file mode 100644
index cf606208197a4c607998f853823cdc719d73355e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-03.xml
+++ /dev/null
@@ -1,1120 +0,0 @@
-<?xml version="1.0" encoding="US-ASCII"?>
-<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
-<!ENTITY rfc4627 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4627.xml">
-<!ENTITY rfc3986 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3986.xml">
-<!ENTITY rfc2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
-<!ENTITY rfc4287 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4287.xml">
-<!ENTITY rfc2616 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2616.xml">
-<!ENTITY rfc3339 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3339.xml">
-<!ENTITY rfc2045 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2045.xml">
-<!ENTITY rfc5226 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5226.xml">
-<!ENTITY rfc2396 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2396.xml">
-<!ENTITY iddiscovery SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.hammer-discovery.xml">
-<!ENTITY uritemplate SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.gregorio-uritemplate.xml">
-<!ENTITY linkheader SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.nottingham-http-link-header.xml">
-<!ENTITY html401 SYSTEM "http://xml.resource.org/public/rfc/bibxml4/reference.W3C.REC-html401-19991224.xml">
-<!ENTITY css21 SYSTEM "http://xml.resource.org/public/rfc/bibxml4/reference.W3C.CR-CSS21-20070719.xml">
-]>
-<?rfc toc="yes"?>
-<?rfc symrefs="yes"?>
-<?rfc compact="yes"?>
-<?rfc subcompact="no"?>
-<?rfc strict="no"?>
-<?rfc rfcedstyle="yes"?>
-<rfc category="info" docName="draft-zyp-json-schema-03" ipr="trust200902">
-	<front>
-		<title abbrev="JSON Schema Media Type">A JSON Media Type for Describing the Structure and Meaning of JSON Documents</title>
-		
-		<author fullname="Kris Zyp" initials="K" role="editor" surname="Zyp">
-			<organization>SitePen (USA)</organization>
-			<address>
-				<postal>
-					<street>530 Lytton Avenue</street>
-					<city>Palo Alto, CA 94301</city>
-					<country>USA</country>
-				</postal>
-				<phone>+1 650 968 8787</phone>
-				<email>kris@sitepen.com</email>
-			</address>
-		</author>
-		
-		<author fullname="Gary Court" initials="G" surname="Court">
-			<address>
-				<postal>
-					<street></street>
-					<city>Calgary, AB</city>
-					<country>Canada</country>
-				</postal>
-				<email>gary.court@gmail.com</email>
-			</address>
-		</author>
-		
-		<date year="2011" />
-		<workgroup>Internet Engineering Task Force</workgroup>
-		<keyword>JSON</keyword>
-		<keyword>Schema</keyword>
-		<keyword>JavaScript</keyword>
-		<keyword>Object</keyword>
-		<keyword>Notation</keyword>
-		<keyword>Hyper Schema</keyword>
-		<keyword>Hypermedia</keyword>
-		
-		<abstract>
-			<t>
-				JSON (JavaScript Object Notation) Schema defines the media type "application/schema+json", 
-				a JSON based format for defining 
-				the structure of JSON data. JSON Schema provides a contract for what JSON 
-				data is required for a given application and how to interact with it. JSON 
-				Schema is intended to define validation, documentation, hyperlink 
-				navigation, and interaction control of JSON data. 
-			</t>
-		</abstract>
-	</front>
-	
-	<middle>
-		<section title="Introduction">
-			<t>
-				JSON (JavaScript Object Notation) Schema is a JSON media type for defining 
-				the structure of JSON data. JSON Schema provides a contract for what JSON 
-				data is required for a given application and how to interact with it. JSON 
-				Schema is intended to define validation, documentation, hyperlink 
-				navigation, and interaction control of JSON data. 
-			</t>
-		</section>
-		
-		<section title="Conventions">
-			<t>
-				<!-- The text in this section has been copied from the official boilerplate, 
-				and should not be modified.-->
-				
-				The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", 
-				"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
-				interpreted as described in <xref target="RFC2119">RFC 2119</xref>.
-			</t>
-		</section>
-		
-		<!-- ********************************************* -->
-		
-		<section title="Overview">
-			<t>
-				JSON Schema defines the media type "application/schema+json" for 
-				describing the structure of other
-				JSON documents. JSON Schema is JSON-based and includes facilities 
-				for describing the structure of JSON documents in terms of
-				allowable values, descriptions, and interpreting relations with other resources.
-			</t>
-			<t>
-				JSON Schema format is organized into several separate definitions. The first 
-				definition is the core schema specification. This definition is primary 
-				concerned with describing a JSON structure and specifying valid elements
-				in the structure. The second definition is the Hyper Schema specification
-				which is intended define elements in a structure that can be interpreted as
-				hyperlinks.
-				Hyper Schema builds on JSON Schema to describe the hyperlink structure of 
-				other JSON documents and elements of interaction. This allows user agents to be able to successfully navigate
-				JSON documents based on their schemas.
-			</t>
-			<t>
-				Cumulatively JSON Schema acts as a meta-document that can be used to define the required type and constraints on
-				property values, as well as define the meaning of the property values
-				for the purpose of describing a resource and determining hyperlinks
-				within the representation. 
-			</t>
-			<figure>
-				<preamble>An example JSON Schema that describes products might look like:</preamble>
-				<artwork>
-<![CDATA[	
-{
-	"title": "Product",
-	"properties": {
-		"id": {
-			"type": "number",
-			"description": "Product identifier",
-			"required": true
-		},
-		"name": {
-			"description": "Name of the product",
-			"type": "string",
-			"required": true
-		},
-		"price": {
-			"required": true,
-			"type": "number",
-			"minimum": 0,
-			"required": true
-		},
-		"tags": {
-			"type": "array",
-			"items": {
-				"type": "string"
-			}
-		}
-	},
-	"links": [{
-		"rel": "full",
-		"href": "{id}"
-	}, {
-		"rel": "comments",
-		"href": "comments/?id={id}"
-	}]
-}
-]]>
-				</artwork>
-				<postamble>
-					This schema defines the properties of the instance JSON documents, 
-					the required properties (id, name, and price), as well as an optional
-					property (tags). This also defines the link relations of the instance
-					JSON documents.
-				</postamble>
-			</figure>
-			
-			<section title="Terminology">
-				<t>
-					For this specification, <spanx style="strong">schema</spanx> will be used to denote a JSON Schema 
-					definition, and an <spanx style="strong">instance</spanx> refers to a JSON value that the schema 
-					will be describing and validating.
-				</t>
-			</section>
-			
-			<section title="Design Considerations">
-				<t>
-					The JSON Schema media type does not attempt to dictate the structure of JSON
-					representations that contain data, but rather provides a separate format
-					for flexibly communicating how a JSON representation should be
-					interpreted and validated, such that user agents can properly understand
-					acceptable structures and extrapolate hyperlink information
-					with the JSON document. It is acknowledged that JSON documents come
-					in a variety of structures, and JSON is unique in that the structure
-					of stored data structures often prescribes a non-ambiguous definite
-					JSON representation. Attempting to force a specific structure is generally
-					not viable, and therefore JSON Schema allows for a great flexibility
-					in the structure of the JSON data that it describes.
-				</t>
-				<t>
-					This specification is protocol agnostic.
-					The underlying protocol (such as HTTP) should sufficiently define the
-					semantics of the client-server interface, the retrieval of resource
-					representations linked to by JSON representations, and modification of 
-					those resources. The goal of this
-					format is to sufficiently describe JSON structures such that one can
-					utilize existing information available in existing JSON
-					representations from a large variety of services that leverage a representational state transfer
-					architecture using existing protocols.
-				</t>
-			</section>
-		</section>
-		
-		<section title="Schema/Instance Association">
-			<t>
-				JSON Schema instances are correlated to their schema by the "describedby"
-				relation, where the schema is defined to be the target of the relation.
-				Instance representations may be of the "application/json" media type or
-				any other subtype. Consequently, dictating how an instance
-				representation should specify the relation to the schema is beyond the normative scope
-				of this document (since this document specifically defines the JSON
-				Schema media type, and no other), but it is recommended that instances
-				specify their schema so that user agents can interpret the instance
-				representation and messages may retain the self-descriptive
-				characteristic, avoiding the need for out-of-band information about
-				instance data. Two approaches are recommended for declaring the
-				relation to the schema that describes the meaning of a JSON instance's (or collection 
-				of instances) structure. A MIME type parameter named
-				"profile" or a relation of "describedby" (which could be defined by a Link header) may be used:
-				
-				<figure>
-					<artwork>
-<![CDATA[	
-Content-Type: application/my-media-type+json;
-              profile=http://json.com/my-hyper-schema
-]]>
-					</artwork>
-				</figure>
-				
-				or if the content is being transferred by a protocol (such as HTTP) that
-				provides headers, a Link header can be used:
-				
-				<figure>
-					<artwork>
-<![CDATA[
-Link: <http://json.com/my-hyper-schema>; rel="describedby"
-]]>
-					</artwork>
-				</figure>
-				
-				Instances MAY specify multiple schemas, to indicate all the schemas that 
-				are applicable to the data, and the data SHOULD be valid by all the schemas. 
-				The instance data MAY have multiple schemas 
-				that it is defined by (the instance data SHOULD be valid for those schemas). 
-				Or if the document is a collection of instances, the collection MAY contain 
-				instances from different schemas. When collections contain heterogeneous 
-				instances, the "pathStart" attribute MAY be specified in the 
-				schema to disambiguate which schema should be applied for each item in the 
-				collection. However, ultimately, the mechanism for referencing a schema is up to the
-				media type of the instance documents (if they choose to specify that schemas
-				can be referenced).
-			</t>
-			
-			<section title="Self-Descriptive Schema">
-				<t>
-					JSON Schemas can themselves be described using JSON Schemas. 
-					A self-describing JSON Schema for the core JSON Schema can
-					be found at <eref target="http://json-schema.org/schema">http://json-schema.org/schema</eref> for the latest version or 
-					<eref target="http://json-schema.org/draft-03/schema">http://json-schema.org/draft-03/schema</eref> for the draft-03 version. The hyper schema 
-					self-description can be found at <eref target="http://json-schema.org/hyper-schema">http://json-schema.org/hyper-schema</eref> 
-					or <eref target="http://json-schema.org/draft-03/hyper-schema">http://json-schema.org/draft-03/hyper-schema</eref>. All schemas
-					used within a protocol with media type definitions
-					SHOULD include a MIME parameter that refers to the self-descriptive
-					hyper schema or another schema that extends this hyper schema:
-					
-					<figure>
-						<artwork>
-<![CDATA[	
-Content-Type: application/json; 
-              profile=http://json-schema.org/draft-03/hyper-schema
-]]>
-						</artwork>
-					</figure>
-				</t>
-			</section>
-		</section>
-		
-		<section title="Core Schema Definition">
-			<t>
-				A JSON Schema is a JSON Object that defines various attributes 
-				(including usage and valid values) of a JSON value. JSON
-				Schema has recursive capabilities; there are a number of elements
-				in the structure that allow for nested JSON Schemas.
-			</t>
-			
-			<figure>
-				<preamble>An example JSON Schema definition could look like:</preamble>
-				<artwork>
-<![CDATA[
-{
-	"description": "A person",
-	"type": "object",
-
-	"properties": {
-		"name": {
-			"type": "string"
-		},
-		"age": {
-			"type": "integer",
-			"maximum": 125
-		}
-	}
-}
-]]>
-				</artwork>
-			</figure>
-			
-			<t>
-				A JSON Schema object may have any of the following properties, called schema
-				attributes (all attributes are optional):
-			</t>
-			
-			<section title="type">
-				<t>
-					This attribute defines what the primitive type or the schema of the instance MUST be in order to validate. 
-					This attribute can take one of two forms:
-
-					<list style="hanging">
-						<t hangText="Simple Types">
-							A string indicating a primitive or simple type. The following are acceptable string values:
-
-							<list style="hanging">
-								<t hangText="string">Value MUST be a string.</t>
-								<t hangText="number">Value MUST be a number, floating point numbers are allowed. </t>
-								<t hangText="integer">Value MUST be an integer, no floating point numbers are allowed. This is a subset of the number type.</t>
-								<t hangText="boolean">Value MUST be a boolean. </t>
-								<t hangText="object">Value MUST be an object.</t>
-								<t hangText="array">Value MUST be an array.</t>
-								<t hangText="null">Value MUST be null. Note this is mainly for purpose of being able use union types to define nullability. If this type is not included in a union, null values are not allowed (the primitives listed above do not allow nulls on their own).</t>
-								<t hangText="any">Value MAY be of any type including null.</t>
-							</list>
-							
-							If the property is not defined or is not in this list, then any type of value is acceptable. 
-							Other type values MAY be used for custom purposes, but minimal validators of the specification 
-							implementation can allow any instance value on unknown type values.
-						</t>
-						
-						<t hangText="Union Types">
-							An array of two or more simple type definitions. Each item in the array MUST be a simple type definition or a schema.
-							The instance value is valid if it is of the same type as one of the simple type definitions, or valid by one of the schemas, in the array. 
-						</t>
-					</list>
-				</t>
-				
-				<figure>
-					<preamble>For example, a schema that defines if an instance can be a string or a number would be:</preamble>
-					<artwork>
-<![CDATA[
-{
-	"type": ["string", "number"]
-}
-]]></artwork>
-				</figure>
-			</section>
-			
-			<section title="properties" anchor="properties">
-				<t>This attribute is an object with property definitions that define the valid values of instance object property values. When the instance value is an object, the property values of the instance object MUST conform to the property definitions in this object. In this object, each property definition's value MUST be a schema, and the property's name MUST be the name of the instance property that it defines. The instance property value MUST be valid according to the schema from the property definition. Properties are considered unordered, the order of the instance properties MAY be in any order.</t>
-			</section>
-			
-			<section title="patternProperties">
-				<t>This attribute is an object that defines the schema for a set of property names of an object instance. The name of each property of this attribute's object is a regular expression pattern in the ECMA 262/Perl 5 format, while the value is a schema. If the pattern matches the name of a property on the instance object, the value of the instance's property MUST be valid against the pattern name's schema value.</t>
-			</section>
-			
-			<section title="additionalProperties" anchor="additionalProperties">
-				<t>This attribute defines a schema for all properties that are not explicitly defined in an object type definition. If specified, the value MUST be a schema or a boolean. If false is provided, no additional properties are allowed beyond the properties defined in the schema. The default value is an empty schema which allows any value for additional properties.</t>
-			</section>
-			
-			<section title="items">
-				<t>This attribute defines the allowed items in an instance array, and MUST be a schema or an array of schemas. The default value is an empty schema which allows any value for items in the instance array.</t>
-				<t>When this attribute value is a schema and the instance value is an array, then all the items in the array MUST be valid according to the schema.</t>
-				<t>When this attribute value is an array of schemas and the instance value is an array, each position in the instance array MUST conform to the schema in the corresponding position for this array. This called tuple typing. When tuple typing is used, additional items are allowed, disallowed, or constrained by the <xref target="additionalItems">"additionalItems"</xref> attribute using the same rules as <xref target="additionalProperties">"additionalProperties"</xref> for objects.</t>
-			</section>
-			
-			<section title="additionalItems" anchor="additionalItems">
-				<t>This provides a definition for additional items in an array instance when tuple definitions of the items is provided. This can be false to indicate additional items in the array are not allowed, or it can be a schema that defines the schema of the additional items.</t>
-			</section>
-			
-			<section title="required">
-				<t>This attribute indicates if the instance must have a value, and not be undefined. This is false by default, making the instance optional.</t>
-			</section>
-			
-			<section title="dependencies">
-				<t>This attribute is an object that defines the requirements of a property on an instance object. If an object instance has a property with the same name as a property in this attribute's object, then the instance must be valid against the attribute's property value (hereafter referred to as the "dependency value").</t>
-				<t>
-					The dependency value can take one of two forms:
-					
-					<list style="hanging">
-						<t hangText="Simple Dependency">
-							If the dependency value is a string, then the instance object MUST have a property with the same name as the dependency value.
-							If the dependency value is an array of strings, then the instance object MUST have a property with the same name as each string in the dependency value's array.
-						</t>
-						<t hangText="Schema Dependency">
-							If the dependency value is a schema, then the instance object MUST be valid against the schema.
-						</t>
-					</list>
-				</t>
-			</section>
-			
-			<section title="minimum">
-				<t>This attribute defines the minimum value of the instance property when the type of the instance value is a number.</t>
-			</section>
-			
-			<section title="maximum">
-				<t>This attribute defines the maximum value of the instance property when the type of the instance value is a number.</t>
-			</section>
-			
-			<section title="exclusiveMinimum">
-				<t>This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "minimum" attribute. This is false by default, meaning the instance value can be greater then or equal to the minimum value.</t>
-			</section>
-			
-			<section title="exclusiveMaximum">
-				<t>This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "maximum" attribute. This is false by default, meaning the instance value can be less then or equal to the maximum value.</t>
-			</section>
-			
-			<section title="minItems">
-				<t>This attribute defines the minimum number of values in an array when the array is the instance value.</t>
-			</section>
-			
-			<section title="maxItems">
-				<t>This attribute defines the maximum number of values in an array when the array is the instance value.</t>
-			</section>
-			
-			<section title="uniqueItems" anchor="uniqueItems">
-				<t>This attribute indicates that all items in an array instance MUST be unique (contains no two identical values).</t>
-				<t>
-					Two instance are consider equal if they are both of the same type and:
-					
-					<list>
-						<t>are null; or</t>
-						<t>are booleans/numbers/strings and have the same value; or</t>
-						<t>are arrays, contains the same number of items, and each item in the array is equal to the corresponding item in the other array; or</t>
-						<t>are objects, contains the same property names, and each property in the object is equal to the corresponding property in the other object.</t>
-					</list>
-				</t>
-			</section>
-			
-			<section title="pattern">
-				<t>When the instance value is a string, this provides a regular expression that a string instance MUST match in order to be valid. Regular expressions SHOULD follow the regular expression specification from ECMA 262/Perl 5</t>
-			</section>
-			
-			<section title="minLength">
-				<t>When the instance value is a string, this defines the minimum length of the string.</t>
-			</section>
-			
-			<section title="maxLength">
-				<t>When the instance value is a string, this defines the maximum length of the string.</t>
-			</section>
-			
-			<section title="enum">
-				<t>This provides an enumeration of all possible values that are valid for the instance property. This MUST be an array, and each item in the array represents a possible value for the instance value. If this attribute is defined, the instance value MUST be one of the values in the array in order for the schema to be valid. Comparison of enum values uses the same algorithm as defined in <xref target="uniqueItems">"uniqueItems"</xref>.</t>
-			</section>
-			
-			<section title="default">
-				<t>This attribute defines the default value of the instance when the instance is undefined.</t>
-			</section>
-			
-			<section title="title">
-				<t>This attribute is a string that provides a short description of the instance property.</t>
-			</section>
-			
-			<section title="description">
-				<t>This attribute is a string that provides a full description of the of purpose the instance property.</t>
-			</section>
-			
-			<section title="format">
-				<t>This property defines the type of data, content type, or microformat to be expected in the instance property values. A format attribute MAY be one of the values listed below, and if so, SHOULD adhere to the semantics describing for the format. A format SHOULD only be used to give meaning to primitive types (string, integer, number, or boolean). Validators MAY (but are not required to) validate that the instance values conform to a format.</t>
-				
-				<t>
-					The following formats are predefined:
-					
-					<list style="hanging">
-						<t hangText="date-time">This SHOULD be a date in ISO 8601 format of YYYY-MM-DDThh:mm:ssZ in UTC time. This is the recommended form of date/timestamp.</t>
-						<t hangText="date">This SHOULD be a date in the format of YYYY-MM-DD. It is recommended that you use the "date-time" format instead of "date" unless you need to transfer only the date part.</t>
-						<t hangText="time">This SHOULD be a time in the format of hh:mm:ss. It is recommended that you use the "date-time" format instead of "time" unless you need to transfer only the time part.</t>
-						<t hangText="utc-millisec">This SHOULD be the difference, measured in milliseconds, between the specified time and midnight, 00:00 of January 1, 1970 UTC. The value SHOULD be a number (integer or float).</t>
-						<t hangText="regex">A regular expression, following the regular expression specification from ECMA 262/Perl 5.</t>
-						<t hangText="color">This is a CSS color (like "#FF0000" or "red"), based on <xref target="W3C.CR-CSS21-20070719">CSS 2.1</xref>.</t>
-						<t hangText="style">This is a CSS style definition (like "color: red; background-color:#FFF"), based on <xref target="W3C.CR-CSS21-20070719">CSS 2.1</xref>.</t>
-						<t hangText="phone">This SHOULD be a phone number (format MAY follow E.123).</t>
-						<t hangText="uri">This value SHOULD be a URI.</t>
-						<t hangText="email">This SHOULD be an email address.</t>
-						<t hangText="ip-address">This SHOULD be an ip version 4 address.</t>
-						<t hangText="ipv6">This SHOULD be an ip version 6 address.</t>
-						<t hangText="host-name">This SHOULD be a host-name.</t>
-					</list>
-				</t>
-				
-				<t>Additional custom formats MAY be created. These custom formats MAY be expressed as an URI, and this URI MAY reference a schema of that format.</t>
-			</section>
-			
-			<section title="divisibleBy">
-				<t>This attribute defines what value the number instance must be divisible by with no remainder (the result of the division must be an integer.) The value of this attribute SHOULD NOT be 0.</t>
-			</section>
-			
-			<section title="disallow">
-				<t>This attribute takes the same values as the "type" attribute, however if the instance matches the type or if this value is an array and the instance matches any type or schema in the array, then this instance is not valid.</t>
-			</section>
-			
-			<section title="extends">
-				<t>The value of this property MUST be another schema which will provide a base schema which the current schema will inherit from. The inheritance rules are such that any instance that is valid according to the current schema MUST be valid according to the referenced schema. This MAY also be an array, in which case, the instance MUST be valid for all the schemas in the array. A schema that extends another schema MAY define additional attributes, constrain existing attributes, or add other constraints.</t>
-				<t>
-					Conceptually, the behavior of extends can be seen as validating an
-					instance against all constraints in the extending schema as well as
-					the extended schema(s). More optimized implementations that merge
-					schemas are possible, but are not required. Some examples of using "extends":
-					
-					<figure>
-						<artwork>
-<![CDATA[
-{
-	"description": "An adult",
-	"properties": {
-		"age": {
-			"minimum": 21
-		}
-	},
-	"extends": {"$ref": "person"}
-}
-]]>
-						</artwork>
-					</figure>
-					
-					<figure>
-						<artwork>
-<![CDATA[
-{
-	"description": "Extended schema",
-	"properties": {
-		"deprecated": {
-			"type": "boolean"
-		}
-	},
-	"extends": {"$ref": "http://json-schema.org/draft-03/schema"}
-}
-]]>
-						</artwork>
-					</figure>
-				</t>
-			</section>
-			
-			<section title="id">
-				<t>
-					This attribute defines the current URI of this schema (this attribute is
-					effectively a "self" link). This URI MAY be relative or absolute. If
-					the URI is relative it is resolved against the current URI of the parent
-					schema it is contained in. If this schema is not contained in any
-					parent schema, the current URI of the parent schema is held to be the
-					URI under which this schema was addressed. If id is missing, the current URI of a schema is
-					defined to be that of the parent schema. The current URI of the schema
-					is also used to construct relative references such as for $ref.
-				</t>
-			</section>
-			
-			<section title="$ref">
-				<t>
-					This attribute defines a URI of a schema that contains the full representation of this schema. 
-					When a validator encounters this attribute, it SHOULD replace the current schema with the schema referenced by the value's URI (if known and available) and re-validate the instance. 
-					This URI MAY be relative or absolute, and relative URIs SHOULD be resolved against the URI of the current schema.
-				</t>
-			</section>
-			
-			<section title="$schema">
-				<t>
-					This attribute defines a URI of a JSON Schema that is the schema of the current schema. 
-					When this attribute is defined, a validator SHOULD use the schema referenced by the value's URI (if known and available) when resolving <xref target="hyper-schema">Hyper Schema</xref><xref target="links">links</xref>.
-				</t>
-				
-				<t>
-					A validator MAY use this attribute's value to determine which version of JSON Schema the current schema is written in, and provide the appropriate validation features and behavior. 
-					Therefore, it is RECOMMENDED that all schema authors include this attribute in their schemas to prevent conflicts with future JSON Schema specification changes.
-				</t>
-			</section>
-		</section>
-		
-		<section title="Hyper Schema" anchor="hyper-schema">
-			<t>
-				The following attributes are specified in addition to those
-				attributes that already provided by the core schema with the specific
-				purpose of informing user agents of relations between resources based
-				on JSON data. Just as with JSON
-				schema attributes, all the attributes in hyper schemas are optional.
-				Therefore, an empty object is a valid (non-informative) schema, and
-				essentially describes plain JSON (no constraints on the structures).
-				Addition of attributes provides additive information for user agents.
-			</t>
-			
-			<section title="links" anchor="links">
-				<t>
-					The value of the links property MUST be an array, where each item 
-					in the array is a link description object which describes the link
-					relations of the instances.
-				</t>
-				
-				<section title="Link Description Object">
-					<t>
-						A link description object is used to describe link relations. In 
-						the context of a schema, it defines the link relations of the 
-						instances of the schema, and can be parameterized by the instance
-						values. The link description format can be used on its own in
-						regular (non-schema documents), and use of this format can
-						be declared by referencing the normative link description
-						schema as the the schema for the data structure that uses the 
-						links. The URI of the normative link description schema is: 
-						<eref target="http://json-schema.org/links">http://json-schema.org/links</eref> (latest version) or
-						<eref target="http://json-schema.org/draft-03/links">http://json-schema.org/draft-03/links</eref> (draft-03 version).
-					</t>
-					
-					<section title="href">
-						<t>
-							The value of the "href" link description property
-							indicates the target URI of the related resource. The value
-							of the instance property SHOULD be resolved as a URI-Reference per <xref target="RFC3986">RFC 3986</xref>
-							and MAY be a relative URI. The base URI to be used for relative resolution
-							SHOULD be the URI used to retrieve the instance object (not the schema)
-							when used within a schema. Also, when links are used within a schema, the URI 
-							SHOULD be parametrized by the property values of the instance 
-							object, if property values exist for the corresponding variables
-							in the template (otherwise they MAY be provided from alternate sources, like user input).
-						</t>
-						
-						<t>
-							Instance property values SHOULD be substituted into the URIs where
-							matching braces ('{', '}') are found surrounding zero or more characters,
-							creating an expanded URI. Instance property value substitutions are resolved
-							by using the text between the braces to denote the property name
-							from the instance to get the value to substitute. 
-							
-							<figure>
-								<preamble>For example, if an href value is defined:</preamble>
-								<artwork>
-<![CDATA[
-http://somesite.com/{id}
-]]>
-								</artwork>
-								<postamble>Then it would be resolved by replace the value of the "id" property value from the instance object.</postamble>
-							</figure>
-							
-							<figure>
-								<preamble>If the value of the "id" property was "45", the expanded URI would be:</preamble>
-								<artwork>
-<![CDATA[
-http://somesite.com/45
-]]>
-								</artwork>
-							</figure>
-							
-							If matching braces are found with the string "@" (no quotes) between the braces, then the 
-							actual instance value SHOULD be used to replace the braces, rather than a property value.
-							This should only be used in situations where the instance is a scalar (string, 
-							boolean, or number), and not for objects or arrays.
-						</t>
-					</section>
-					
-					<section title="rel">
-						<t>
-							The value of the "rel" property indicates the name of the 
-							relation to the target resource. The relation to the target SHOULD be interpreted as specifically from the instance object that the schema (or sub-schema) applies to, not just the top level resource that contains the object within its hierarchy. If a resource JSON representation contains a sub object with a property interpreted as a link, that sub-object holds the relation with the target. A relation to target from the top level resource MUST be indicated with the schema describing the top level JSON representation.
-						</t>
-						
-						<t>
-							Relationship definitions SHOULD NOT be media type dependent, and users are encouraged to utilize existing accepted relation definitions, including those in existing relation registries (see <xref target="RFC4287">RFC 4287</xref>). However, we define these relations here for clarity of normative interpretation within the context of JSON hyper schema defined relations:
-							
-							<list style="hanging">
-								<t hangText="self">
-									If the relation value is "self", when this property is encountered in
-									the instance object, the object represents a resource and the instance object is
-									treated as a full representation of the target resource identified by
-									the specified URI.
-								</t>
-								
-								<t hangText="full">
-									This indicates that the target of the link is the full representation for the instance object. The object that contains this link possibly may not be the full representation.
-								</t>
-								
-								<t hangText="describedby">
-									This indicates the target of the link is the schema for the instance object. This MAY be used to specifically denote the schemas of objects within a JSON object hierarchy, facilitating polymorphic type data structures.
-								</t>
-								
-								<t hangText="root">
-									This relation indicates that the target of the link
-									SHOULD be treated as the root or the body of the representation for the
-									purposes of user agent interaction or fragment resolution. All other
-									properties of the instance objects can be regarded as meta-data
-									descriptions for the data.
-								</t>
-							</list>
-						</t>
-						
-						<t>
-							The following relations are applicable for schemas (the schema as the "from" resource in the relation):
-
-							<list style="hanging">
-								<t hangText="instances">This indicates the target resource that represents collection of instances of a schema.</t>
-								<t hangText="create">This indicates a target to use for creating new instances of a schema. This link definition SHOULD be a submission link with a non-safe method (like POST).</t>
-							</list>
-						</t>
-						
-						<t>
-							<figure>
-								<preamble>For example, if a schema is defined:</preamble>
-								<artwork>
-<![CDATA[
-{
-	"links": [{
-		"rel": "self",
-		"href": "{id}"
-	}, {
-		"rel": "up",
-		"href": "{upId}"
-	}, {
-		"rel": "children",
-		"href": "?upId={id}"
-	}]
-}
-]]>
-								</artwork>
-							</figure>
-							
-							<figure>
-								<preamble>And if a collection of instance resource's JSON representation was retrieved:</preamble>
-								<artwork>
-<![CDATA[
-GET /Resource/
-
-[{
-	"id": "thing",
-	"upId": "parent"
-}, {
-	"id": "thing2",
-	"upId": "parent"
-}]
-]]>
-								</artwork>
-							</figure>
-
-							This would indicate that for the first item in the collection, its own
-							(self) URI would resolve to "/Resource/thing" and the first item's "up"
-							relation SHOULD be resolved to the resource at "/Resource/parent".
-							The "children" collection would be located at "/Resource/?upId=thing".
-						</t>
-					</section>
-					
-					<section title="targetSchema">
-						<t>This property value is a schema that defines the expected structure of the JSON representation of the target of the link.</t>
-					</section>
-					
-					<section title="Submission Link Properties">
-						<t>
-							The following properties also apply to link definition objects, and 
-							provide functionality analogous to HTML forms, in providing a 
-							means for submitting extra (often user supplied) information to send to a server.
-						</t>
-						
-						<section title="method">
-							<t>
-								This attribute defines which method can be used to access the target resource. 
-								In an HTTP environment, this would be "GET" or "POST" (other HTTP methods 
-								such as "PUT" and "DELETE" have semantics that are clearly implied by 
-								accessed resources, and do not need to be defined here). 
-								This defaults to "GET".
-							</t>
-						</section>
-						
-						<section title="enctype">
-							<t>
-								If present, this property indicates a query media type format that the server
-								supports for querying or posting to the collection of instances at the target 
-								resource. The query can be 
-								suffixed to the target URI to query the collection with
-								property-based constraints on the resources that SHOULD be returned from
-								the server or used to post data to the resource (depending on the method).
-								
-								<figure>
-									<preamble>For example, with the following schema:</preamble>
-									<artwork>
-<![CDATA[
-{
-	"links": [{
-		"enctype": "application/x-www-form-urlencoded",
-		"method": "GET",
-		"href": "/Product/",
-		"properties": {
-			"name": {
-				"description": "name of the product"
-			}
-		}
-	}]
-}
-]]>
-									</artwork>
-									<postamble>This indicates that the client can query the server for instances that have a specific name.</postamble>
-								</figure>
-								
-								<figure>
-									<preamble>For example:</preamble>
-									<artwork>
-<![CDATA[
-/Product/?name=Slinky
-]]>
-									</artwork>
-								</figure>
-
-								If no enctype or method is specified, only the single URI specified by 
-								the href property is defined. If the method is POST, "application/json" is 
-								the default media type.
-							</t>
-						</section>
-						
-						<section title="schema">
-							<t>
-								This attribute contains a schema which defines the acceptable structure of the submitted
-								request (for a GET request, this schema would define the properties for the query string 
-								and for a POST request, this would define the body).
-							</t>
-						</section>
-					</section>
-				</section>
-			</section>
-			
-			<section title="fragmentResolution">
-				<t>
-					This property indicates the fragment resolution protocol to use for
-					resolving fragment identifiers in URIs within the instance
-					representations. This applies to the instance object URIs and all
-					children of the instance object's URIs. The default fragment resolution
-					protocol is "slash-delimited", which is defined below. Other fragment
-					resolution protocols MAY be used, but are not defined in this document.
-				</t>
-				
-				<t>
-					The fragment identifier is based on <xref target="RFC2396">RFC 2396, Sec 5</xref>, and defines the
-					mechanism for resolving references to entities within a document.
-				</t>
-				
-				<section title="slash-delimited fragment resolution">
-					<t>
-						With the slash-delimited fragment resolution protocol, the fragment
-						identifier is interpreted as a series of property reference tokens that start with and
-						are delimited by the "/" character (\x2F). Each property reference token
-						is a series of unreserved or escaped URI characters. Each property
-						reference token SHOULD be interpreted, starting from the beginning of
-						the fragment identifier, as a path reference in the target JSON
-						structure. The final target value of the fragment can be determined by
-						starting with the root of the JSON structure from the representation of
-						the resource identified by the pre-fragment URI. If the target is a JSON
-						object, then the new target is the value of the property with the name
-						identified by the next property reference token in the fragment. If the
-						target is a JSON array, then the target is determined by finding the
-						item in array the array with the index defined by the next property
-						reference token (which MUST be a number). The target is successively
-						updated for each property reference token, until the entire fragment has
-						been traversed. 
-					</t>
-					
-					<t>
-						Property names SHOULD be URI-encoded. In particular, any "/" in a 
-						property name MUST be encoded to avoid being interpreted as a property 
-						delimiter.
-					</t>
-					
-					<t>
-						<figure>
-							<preamble>For example, for the following JSON representation:</preamble>
-							<artwork>
-<![CDATA[
-{
-	"foo": {
-		"anArray": [{
-			"prop": 44
-		}],
-		"another prop": {
-			"baz": "A string"
-		}
-	}
-}
-]]>
-							</artwork>
-						</figure>
-						
-						<figure>
-							<preamble>The following fragment identifiers would be resolved:</preamble>
-							<artwork>
-<![CDATA[
-fragment identifier      resolution
--------------------      ----------
-#                        self, the root of the resource itself
-#/foo                    the object referred to by the foo property
-#/foo/another%20prop     the object referred to by the "another prop"
-                         property of the object referred to by the 
-                         "foo" property
-#/foo/another%20prop/baz the string referred to by the value of "baz"
-                         property of the "another prop" property of 
-                         the object referred to by the "foo" property
-#/foo/anArray/0          the first object in the "anArray" array
-]]>
-							</artwork>
-						</figure>
-					</t>
-				</section>
-				
-				<section title="dot-delimited fragment resolution">
-					<t>
-						The dot-delimited fragment resolution protocol is the same as 
-						slash-delimited fragment resolution protocol except that the "." character 
-						(\x2E) is used as the delimiter between property names (instead of "/") and 
-						the path does not need to start with a ".". For example, #.foo and #foo are a valid fragment
-						identifiers for referencing the value of the foo propery.
-					</t>
-				</section>
-			</section>
-			
-			<section title="readonly">
-				<t>This attribute indicates that the instance property SHOULD NOT be changed. Attempts by a user agent to modify the value of this property are expected to be rejected by a server.</t>
-			</section>
-			
-			<section title="contentEncoding">
-				<t>If the instance property value is a string, this attribute defines that the string SHOULD be interpreted as binary data and decoded using the encoding named by this schema property. <xref target="RFC2045">RFC 2045, Sec 6.1</xref> lists the possible values for this property.</t>
-			</section>
-			
-			<section title="pathStart">
-				<t>
-					This attribute is a URI that defines what the instance's URI MUST start with in order to validate. 
-					The value of the "pathStart" attribute MUST be resolved as per <xref target="RFC3986">RFC 3986, Sec 5</xref>, 
-					and is relative to the instance's URI.
-				</t>
-				
-				<t>
-					When multiple schemas have been referenced for an instance, the user agent 
-					can determine if this schema is applicable for a particular instance by 
-					determining if the URI of the instance begins with the the value of the "pathStart"
-					attribute. If the URI of the instance does not start with this URI, 
-					or if another schema specifies a starting URI that is longer and also matches the 
-					instance, this schema SHOULD NOT be applied to the instance. Any schema 
-					that does not have a pathStart attribute SHOULD be considered applicable 
-					to all the instances for which it is referenced.
-				</t>
-			</section>
-			
-			<section title="mediaType">
-				<t>This attribute defines the media type of the instance representations that this schema is defining.</t>
-			</section>
-		</section>
-		
-		<section title="Security Considerations">
-			<t>
-				This specification is a sub-type of the JSON format, and 
-				consequently the security considerations are generally the same as <xref target="RFC4627">RFC 4627</xref>. 
-				However, an additional issue is that when link relation of "self"
-				is used to denote a full representation of an object, the user agent 
-				SHOULD NOT consider the representation to be the authoritative representation
-				of the resource denoted by the target URI if the target URI is not
-				equivalent to or a sub-path of the the URI used to request the resource 
-				representation which contains the target URI with the "self" link.
-				
-				<figure>
-					<preamble>For example, if a hyper schema was defined:</preamble>
-					<artwork>
-<![CDATA[
-{
-	"links": [{
-		"rel": "self",
-		"href": "{id}"
-	}]
-}
-]]>
-					</artwork>
-				</figure>
-				
-				<figure>
-					<preamble>And a resource was requested from somesite.com:</preamble>
-					<artwork>
-<![CDATA[
-GET /foo/
-]]>
-					</artwork>
-				</figure>
-
-				<figure>
-					<preamble>With a response of:</preamble>
-					<artwork>
-<![CDATA[
-Content-Type: application/json; profile=/schema-for-this-data
-
-[{
-	"id": "bar",
-	"name": "This representation can be safely treated \
-		as authoritative "
-}, {
-	"id": "/baz",
-	"name": "This representation should not be treated as \
-		authoritative the user agent should make request the resource\
-		from '/baz' to ensure it has the authoritative representation"
-}, {
-	"id": "http://othersite.com/something",
-	"name": "This representation\
-		should also not be treated as authoritative and the target\
-		resource representation should be retrieved for the\
-		authoritative representation"
-}]
-]]>
-					</artwork>
-				</figure>
-			</t>
-		</section>
-		
-		<section title="IANA Considerations">
-			<t>The proposed MIME media type for JSON Schema is "application/schema+json".</t>
-			<t>Type name: application</t>
-			<t>Subtype name: schema+json</t>
-			<t>Required parameters: profile</t>
-			<t>
-				The value of the profile parameter SHOULD be a URI (relative or absolute) that 
-				refers to the schema used to define the structure of this structure (the 
-				meta-schema). Normally the value would be http://json-schema.org/draft-03/hyper-schema,
-				but it is allowable to use other schemas that extend the hyper schema's meta-
-				schema.
-			</t>
-			<t>Optional parameters: pretty</t>
-			<t>The value of the pretty parameter MAY be true or false to indicate if additional whitespace has been included to make the JSON representation easier to read.</t>
-			
-			<section title="Registry of Link Relations">
-				<t>
-					This registry is maintained by IANA per <xref target="RFC4287">RFC 4287</xref> and this specification adds
-					four values: "full", "create", "instances", "root".  New
-					assignments are subject to IESG Approval, as outlined in <xref target="RFC5226">RFC 5226</xref>.
-					Requests should be made by email to IANA, which will then forward the
-					request to the IESG, requesting approval.
-				</t>
-			</section>
-		</section>
-	</middle>
-	
-	<back>
-		<!-- References Section -->
-		<references title="Normative References">
-			&rfc2045;
-			&rfc2119;
-			&rfc2396;
-			&rfc3339;
-			&rfc3986;
-			&rfc4287;
-		</references>
-		<references title="Informative References">
-			&rfc2616;
-			&rfc4627;
-			&rfc5226;
-			&iddiscovery;
-			&uritemplate;
-			&linkheader;
-			&html401;
-			&css21;
-		</references>
-
-		<section title="Change Log">
-			<t>
-				<list style="hanging">
-					<t hangText="draft-03">
-						<list style="symbols">
-							<t>Added example and verbiage to "extends" attribute.</t>
-							<t>Defined slash-delimited to use a leading slash.</t>
-							<t>Made "root" a relation instead of an attribute.</t>
-							<t>Removed address values, and MIME media type from format to reduce confusion (mediaType already exists, so it can be used for MIME types).</t>
-							<t>Added more explanation of nullability.</t>
-							<t>Removed "alternate" attribute.</t>
-							<t>Upper cased many normative usages of must, may, and should.</t>
-							<t>Replaced the link submission "properties" attribute to "schema" attribute.</t>
-							<t>Replaced "optional" attribute with "required" attribute.</t>
-							<t>Replaced "maximumCanEqual" attribute with "exclusiveMaximum" attribute.</t>
-							<t>Replaced "minimumCanEqual" attribute with "exclusiveMinimum" attribute.</t>
-							<t>Replaced "requires" attribute with "dependencies" attribute.</t>
-							<t>Moved "contentEncoding" attribute to hyper schema.</t>
-							<t>Added "additionalItems" attribute.</t>
-							<t>Added "id" attribute.</t>
-							<t>Switched self-referencing variable substitution from "-this" to "@" to align with reserved characters in URI template.</t>
-							<t>Added "patternProperties" attribute.</t>
-							<t>Schema URIs are now namespace versioned.</t>
-							<t>Added "$ref" and "$schema" attributes.</t>
-						</list>
-					</t>
-					
-					<t hangText="draft-02">
-						<list style="symbols">
-							<t>Replaced "maxDecimal" attribute with "divisibleBy" attribute.</t>
-							<t>Added slash-delimited fragment resolution protocol and made it the default.</t>
-							<t>Added language about using links outside of schemas by referencing its normative URI.</t>
-							<t>Added "uniqueItems" attribute.</t>
-							<t>Added "targetSchema" attribute to link description object.</t>
-						</list>
-					</t>
-					
-					<t hangText="draft-01">
-						<list style="symbols">
-							<t>Fixed category and updates from template.</t>
-						</list>
-					</t>
-					
-					<t hangText="draft-00">
-						<list style="symbols">
-							<t>Initial draft.</t>
-						</list>
-					</t>
-				</list>
-			</t>
-		</section>
-		
-		<section title="Open Issues">
-			<t>
-				<list>
-					<t>Should we give a preference to MIME headers over Link headers (or only use one)?</t>
-					<t>Should "root" be a MIME parameter?</t>
-					<t>Should "format" be renamed to "mediaType" or "contentType" to reflect the usage MIME media types that are allowed?</t>
-					<t>How should dates be handled?</t>
-				</list>
-			</t>
-		</section>
-	</back>
-</rfc>
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-04.xml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-04.xml
deleted file mode 100644
index 8ede6bf9ebdce930aabc18cc926f3f27340e9ca8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/draft-zyp-json-schema-04.xml
+++ /dev/null
@@ -1,1072 +0,0 @@
-<?xml version="1.0" encoding="US-ASCII"?>
-<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
-<!ENTITY rfc4627 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4627.xml">
-<!ENTITY rfc3986 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3986.xml">
-<!ENTITY rfc2119 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml">
-<!ENTITY rfc4287 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4287.xml">
-<!ENTITY rfc2616 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2616.xml">
-<!ENTITY rfc3339 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.3339.xml">
-<!ENTITY rfc2045 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2045.xml">
-<!ENTITY rfc5226 SYSTEM "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5226.xml">
-<!ENTITY iddiscovery SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.hammer-discovery.xml">
-<!ENTITY uritemplate SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.gregorio-uritemplate.xml">
-<!ENTITY linkheader SYSTEM "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.nottingham-http-link-header.xml">
-<!ENTITY html401 SYSTEM "http://xml.resource.org/public/rfc/bibxml4/reference.W3C.REC-html401-19991224.xml">
-<!ENTITY css21 SYSTEM "http://xml.resource.org/public/rfc/bibxml4/reference.W3C.CR-CSS21-20070719.xml">
-]>
-<?rfc toc="yes"?>
-<?rfc symrefs="yes"?>
-<?rfc compact="yes"?>
-<?rfc subcompact="no"?>
-<?rfc strict="no"?>
-<?rfc rfcedstyle="yes"?>
-<rfc category="info" docName="draft-zyp-json-schema-04" ipr="trust200902">
-	<front>
-		<title abbrev="JSON Schema Media Type">A JSON Media Type for Describing the Structure and Meaning of JSON Documents</title>
-		
-		<author fullname="Kris Zyp" initials="K" role="editor" surname="Zyp">
-			<organization>SitePen (USA)</organization>
-			<address>
-				<postal>
-					<street>530 Lytton Avenue</street>
-					<city>Palo Alto, CA 94301</city>
-					<country>USA</country>
-				</postal>
-				<phone>+1 650 968 8787</phone>
-				<email>kris@sitepen.com</email>
-			</address>
-		</author>
-		
-		<author fullname="Gary Court" initials="G" surname="Court">
-			<address>
-				<postal>
-					<street></street>
-					<city>Calgary, AB</city>
-					<country>Canada</country>
-				</postal>
-				<email>gary.court@gmail.com</email>
-			</address>
-		</author>
-		
-		<date year="2011" />
-		<workgroup>Internet Engineering Task Force</workgroup>
-		<keyword>JSON</keyword>
-		<keyword>Schema</keyword>
-		<keyword>JavaScript</keyword>
-		<keyword>Object</keyword>
-		<keyword>Notation</keyword>
-		<keyword>Hyper Schema</keyword>
-		<keyword>Hypermedia</keyword>
-		
-		<abstract>
-			<t>
-				JSON (JavaScript Object Notation) Schema defines the media type "application/schema+json", 
-				a JSON based format for defining the structure of JSON data. JSON Schema provides a contract for what JSON 
-				data is required for a given application and how to interact with it. JSON 
-				Schema is intended to define validation, documentation, hyperlink 
-				navigation, and interaction control of JSON data. 
-			</t>
-		</abstract>
-	</front>
-	
-	<middle>
-		<section title="Introduction">
-			<t>
-				JSON (JavaScript Object Notation) Schema is a JSON media type for defining 
-				the structure of JSON data. JSON Schema provides a contract for what JSON 
-				data is required for a given application and how to interact with it. JSON 
-				Schema is intended to define validation, documentation, hyperlink 
-				navigation, and interaction control of JSON data. 
-			</t>
-		</section>
-		
-		<section title="Conventions and Terminology">
-			<t>
-				<!-- The text in this section has been copied from the official boilerplate, 
-				and should not be modified.-->
-				
-				The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", 
-				"SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be
-				interpreted as described in <xref target="RFC2119">RFC 2119</xref>.
-			</t>
-			
-			<t>
-				The terms "JSON", "JSON text", "JSON value", "member", "element", "object", 
-				"array", "number", "string", "boolean", "true", "false", and "null" in this 
-				document are to be interpreted as defined in <xref target="RFC4627">RFC 4627</xref>.
-			</t>
-			
-			<t>
-				This specification also uses the following defined terms:
-			
-				<list style="hanging">
-					<t hangText="schema">A JSON Schema object.</t>
-					<t hangText="instance">Equivalent to "JSON value" as defined in <xref target="RFC4627">RFC 4627</xref>.</t>
-					<t hangText="property">Equivalent to "member" as defined in <xref target="RFC4627">RFC 4627</xref>.</t>
-					<t hangText="item">Equivalent to "element" as defined in <xref target="RFC4627">RFC 4627</xref>.</t>
-					<t hangText="attribute">A property of a JSON Schema object.</t>
-				</list>
-			</t>
-		</section>
-		
-		<section title="Overview">
-			<t>
-				JSON Schema defines the media type "application/schema+json" for 
-				describing the structure of JSON text. JSON Schemas are also written in JSON and includes facilities 
-				for describing the structure of JSON in terms of
-				allowable values, descriptions, and interpreting relations with other resources.
-			</t>
-			<t>
-				This document is organized into several separate definitions. The first 
-				definition is the core schema specification. This definition is primary 
-				concerned with describing a JSON structure and specifying valid elements
-				in the structure. The second definition is the Hyper Schema specification
-				which is intended to define elements in a structure that can be interpreted as
-				hyperlinks.
-				Hyper Schema builds on JSON Schema to describe the hyperlink structure of 
-				JSON values. This allows user agents to be able to successfully navigate
-				documents containing JSON based on their schemas.
-			</t>
-			<t>
-				Cumulatively JSON Schema acts as meta-JSON that can be used to define the 
-				required type and constraints on JSON values, as well as define the meaning
-				of the JSON values for the purpose of describing a resource and determining
-				hyperlinks within the representation. 
-			</t>
-			<figure>
-				<preamble>An example JSON Schema that describes products might look like:</preamble>
-				<artwork>
-<![CDATA[	
-{
-	"title": "Product",
-	"properties": {
-		"id": {
-			"title": "Product Identifier",
-			"type": "number"
-		},
-		"name": {
-			"title": "Product Name",
-			"type": "string"
-		},
-		"price": {
-			"type": "number",
-			"minimum": 0
-		},
-		"tags": {
-			"type": "array",
-			"items": {
-				"type": "string"
-			}
-		}
-	},
-	"required" : ["id", "name", "price"],
-	"links": [{
-		"rel": "full",
-		"href": "{id}"
-	}, {
-		"rel": "comments",
-		"href": "comments/?id={id}"
-	}]
-}
-]]>
-				</artwork>
-				<postamble>
-					This schema defines the properties of the instance, 
-					the required properties (id, name, and price), as well as an optional
-					property (tags). This also defines the link relations of the instance.
-				</postamble>
-			</figure>
-			
-			<section title="Design Considerations">
-				<t>
-					The JSON Schema media type does not attempt to dictate the structure of JSON
-					values that contain data, but rather provides a separate format
-					for flexibly communicating how a JSON value should be
-					interpreted and validated, such that user agents can properly understand
-					acceptable structures and extrapolate hyperlink information
-					from the JSON. It is acknowledged that JSON values come
-					in a variety of structures, and JSON is unique in that the structure
-					of stored data structures often prescribes a non-ambiguous definite
-					JSON representation. Attempting to force a specific structure is generally
-					not viable, and therefore JSON Schema allows for a great flexibility
-					in the structure of the JSON data that it describes.
-				</t>
-				<t>
-					This specification is protocol agnostic.
-					The underlying protocol (such as HTTP) should sufficiently define the
-					semantics of the client-server interface, the retrieval of resource
-					representations linked to by JSON representations, and modification of 
-					those resources. The goal of this
-					format is to sufficiently describe JSON structures such that one can
-					utilize existing information available in existing JSON
-					representations from a large variety of services that leverage a representational state transfer
-					architecture using existing protocols.
-				</t>
-			</section>
-		</section>
-		
-		<section title="Schema/Instance Association">
-			<t>
-				JSON values are correlated to their schema by the "describedby"
-				relation, where the schema is the target of the relation.
-				JSON values MUST be of the "application/json" media type or
-				any other subtype. Consequently, dictating how a JSON value should 
-				specify the relation to the schema is beyond the normative scope
-				of this document since this document specifically defines the JSON
-				Schema media type, and no other. It is RECOMMNENDED that JSON values
-				specify their schema so that user agents can interpret the instance
-				and retain the self-descriptive	characteristics. This avoides the need for out-of-band information about
-				instance data. Two approaches are recommended for declaring the
-				relation to the schema that describes the meaning of a JSON instance's (or collection 
-				of instances) structure. A MIME type parameter named
-				"profile" or a relation of "describedby" (which could be specified by a Link header) may be used:
-				
-				<figure>
-					<artwork>
-<![CDATA[	
-Content-Type: application/my-media-type+json;
-              profile=http://example.com/my-hyper-schema
-]]>
-					</artwork>
-				</figure>
-				
-				or if the content is being transferred by a protocol (such as HTTP) that
-				provides headers, a Link header can be used:
-				
-				<figure>
-					<artwork>
-<![CDATA[
-Link: <http://example.com/my-hyper-schema>; rel="describedby"
-]]>
-					</artwork>
-				</figure>
-				
-				Instances MAY specify multiple schemas, to indicate all the schemas that 
-				are applicable to the data, and the data SHOULD be valid by all the schemas. 
-				The instance data MAY have multiple schemas 
-				that it is described by (the instance data SHOULD be valid for those schemas). 
-				Or if the document is a collection of instances, the collection MAY contain 
-				instances from different schemas. The mechanism for referencing a schema is 
-				determined by the media type of the instance (if it provides a method for 
-				referencing schemas).
-			</t>
-			
-			<section title="Self-Descriptive Schema">
-				<t>
-					JSON Schemas can themselves be described using JSON Schemas. 
-					A self-describing JSON Schema for the core JSON Schema can
-					be found at <eref target="http://json-schema.org/schema">http://json-schema.org/schema</eref> for the latest version or 
-					<eref target="http://json-schema.org/draft-04/schema">http://json-schema.org/draft-04/schema</eref> for the draft-04 version. The hyper schema 
-					self-description can be found at <eref target="http://json-schema.org/hyper-schema">http://json-schema.org/hyper-schema</eref> 
-					or <eref target="http://json-schema.org/draft-04/hyper-schema">http://json-schema.org/draft-04/hyper-schema</eref>. All schemas
-					used within a protocol with a media type specified SHOULD include a MIME parameter that refers to the self-descriptive
-					hyper schema or another schema that extends this hyper schema:
-					
-					<figure>
-						<artwork>
-<![CDATA[	
-Content-Type: application/json; 
-              profile=http://json-schema.org/draft-04/hyper-schema
-]]>
-						</artwork>
-					</figure>
-				</t>
-			</section>
-		</section>
-		
-		<section title="Core Schema Definition">
-			<t>
-				A JSON Schema is a JSON object that defines various attributes 
-				(including usage and valid values) of a JSON value. JSON
-				Schema has recursive capabilities; there are a number of elements
-				in the structure that allow for nested JSON Schemas.
-			</t>
-			
-			<figure>
-				<preamble>An example JSON Schema could look like:</preamble>
-				<artwork>
-<![CDATA[
-{
-	"description": "A person",
-	"type": "object",
-
-	"properties": {
-		"name": {
-			"type": "string"
-		},
-		"age": {
-			"type": "number",
-			"divisibleBy": 1,
-			"minimum": 0,
-			"maximum": 125
-		}
-	}
-}
-]]>
-				</artwork>
-			</figure>
-			
-			<t>
-				A JSON Schema object MAY have any of the following optional properties:
-			</t>
-			
-			<!-- TODO: Break attributes up into type sections -->
-			<!-- TODO: Add examples for (almost) every attribute -->
-			
-			<section title="type" anchor="type">
-				<t>
-					This attribute defines what the primitive type or the schema of the instance MUST be in order to validate. 
-					This attribute can take one of two forms:
-
-					<list style="hanging">
-						<t hangText="Simple Types">
-							A string indicating a primitive or simple type. The string MUST be one of the following values:
-
-							<list style="hanging">
-								<t hangText="object">Instance MUST be an object.</t>
-								<t hangText="array">Instance MUST be an array.</t>
-								<t hangText="string">Instance MUST be a string.</t>
-								<t hangText="number">Instance MUST be a number, including floating point numbers.</t>
-								<t hangText="boolean">Instance MUST be the JSON literal "true" or "false".</t>
-								<t hangText="null">Instance MUST be the JSON literal "null". Note that without this type, null values are not allowed.</t>
-								<t hangText="any">Instance MAY be of any type, including null.</t>
-							</list>
-						</t>
-						
-						<t hangText="Union Types">
-							An array of one or more simple or schema types.
-							The instance value is valid if it is of the same type as one of the simple types, or valid by one of the schemas, in the array. 
-						</t>
-					</list>
-					
-					If this attribute is not specified, then all value types are accepted. 
-				</t>
-				
-				<figure>
-					<preamble>For example, a schema that defines if an instance can be a string or a number would be:</preamble>
-					<artwork>
-<![CDATA[
-{
-	"type": ["string", "number"]
-}
-]]></artwork>
-				</figure>
-			</section>
-			
-			<section title="properties" anchor="properties">
-				<t>
-					This attribute is an object with properties that specify the schemas for the properties of the instance object.
-					In this attribute's object, each property value MUST be a schema. 
-					When the instance value is an object, the value of the instance's properties MUST be valid according to the schemas with the same property names specified in this attribute.
-					Objects are unordered, so therefore the order of the instance properties or attribute properties MUST NOT determine validation success.
-				</t>
-			</section>
-			
-			<section title="patternProperties" anchor="patternProperties">
-				<t>
-					This attribute is an object that defines the schema for a set of property names of an object instance. 
-					The name of each property of this attribute's object is a regular expression pattern in the ECMA 262/Perl 5 format, while the value is a schema. 
-					If the pattern matches the name of a property on the instance object, the value of the instance's property MUST be valid against the pattern name's schema value.
-				</t>
-			</section>
-			
-			<section title="additionalProperties" anchor="additionalProperties">
-				<t>This attribute specifies how any instance property that is not explicitly defined by either the <xref target="properties">"properties"</xref> or <xref target="patternProperties">"patternProperties"</xref> attributes (hereafter referred to as "additional properties") is handled. If specified, the value MUST be a schema or a boolean.</t> 
-				<t>If a schema is provided, then all additional properties MUST be valid according to the schema.</t>
-				<t>If false is provided, then no additional properties are allowed.</t>
-				<t>The default value is an empty schema, which allows any value for additional properties.</t>
-			</section>
-			
-			<section title="items" anchor="items">
-				<t>This attribute provides the allowed items in an array instance. If specified, this attribute MUST be a schema or an array of schemas.</t>
-				<t>When this attribute value is a schema and the instance value is an array, then all the items in the array MUST be valid according to the schema.</t>
-				<t>When this attribute value is an array of schemas and the instance value is an array, each position in the instance array MUST be valid according to the schema in the corresponding position for this array. This called tuple typing. When tuple typing is used, additional items are allowed, disallowed, or constrained by the <xref target="additionalItems">"additionalItems"</xref> attribute the same way as <xref target="additionalProperties">"additionalProperties"</xref> for objects is.</t>
-			</section>
-			
-			<section title="additionalItems" anchor="additionalItems">
-				<t>This attribute specifies how any item in the array instance that is not explicitly defined by <xref target="items">"items"</xref> (hereafter referred to as "additional items") is handled. If specified, the value MUST be a schema or a boolean.</t>
-				<t>If a schema is provided:
-					<list>
-						<t>If the <xref target="items">"items"</xref> attribute is unspecified, then all items in the array instance must be valid against this schema.</t>
-						<t>If the <xref target="items">"items"</xref> attribute is a schema, then this attribute is ignored.</t>
-						<t>If the <xref target="items">"items"</xref> attribute is an array (during tuple typing), then any additional items MUST be valid against this schema.</t>
-					</list>
-				</t>
-				<t>If false is provided, then any additional items in the array are not allowed.</t>
-				<t>The default value is an empty schema, which allows any value for additional items.</t>
-			</section>
-			
-			<section title="required" anchor="required">
-				<t>This attribute is an array of strings that defines all the property names that must exist on the object instance.</t>
-			</section>
-			
-			<section title="dependencies" anchor="dependencies">
-				<t>This attribute is an object that specifies the requirements of a property on an object instance. If an object instance has a property with the same name as a property in this attribute's object, then the instance must be valid against the attribute's property value (hereafter referred to as the "dependency value").</t>
-				<t>
-					The dependency value can take one of two forms:
-					
-					<list style="hanging">
-						<t hangText="Simple Dependency">
-							If the dependency value is a string, then the instance object MUST have a property with the same name as the dependency value.
-							If the dependency value is an array of strings, then the instance object MUST have a property with the same name as each string in the dependency value's array.
-						</t>
-						<t hangText="Schema Dependency">
-							If the dependency value is a schema, then the instance object MUST be valid against the schema.
-						</t>
-					</list>
-				</t>
-			</section>
-			
-			<section title="minimum" anchor="minimum">
-				<t>This attribute defines the minimum value of the instance property when the type of the instance value is a number.</t>
-			</section>
-			
-			<section title="maximum" anchor="maximum">
-				<t>This attribute defines the maximum value of the instance property when the type of the instance value is a number.</t>
-			</section>
-			
-			<section title="exclusiveMinimum" anchor="exclusiveMinimum">
-				<t>This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "minimum" attribute. This is false by default, meaning the instance value can be greater then or equal to the minimum value.</t>
-			</section>
-			
-			<section title="exclusiveMaximum" anchor="exclusiveMaximum">
-				<t>This attribute indicates if the value of the instance (if the instance is a number) can not equal the number defined by the "maximum" attribute. This is false by default, meaning the instance value can be less then or equal to the maximum value.</t>
-			</section>
-			
-			<section title="minItems" anchor="minItems">
-				<t>This attribute defines the minimum number of values in an array when the array is the instance value.</t>
-			</section>
-			
-			<section title="maxItems" anchor="maxItems">
-				<t>This attribute defines the maximum number of values in an array when the array is the instance value.</t>
-			</section>
-			
-			<section title="minProperties" anchor="minProperties">
-				<t>This attribute defines the minimum number of properties required on an object instance.</t>
-			</section>
-			
-			<section title="maxProperties" anchor="maxProperties">
-				<t>This attribute defines the maximum number of properties the object instance can have.</t>
-			</section>
-			
-			<section title="uniqueItems" anchor="uniqueItems">
-				<t>This attribute indicates that all items in an array instance MUST be unique (contains no two identical values).</t>
-				<t>
-					Two instance are consider equal if they are both of the same type and:
-					
-					<list>
-						<t>are null; or</t>
-						<t>are booleans/numbers/strings and have the same value; or</t>
-						<t>are arrays, contains the same number of items, and each item in the array is equal to the item at the corresponding index in the other array; or</t>
-						<t>are objects, contains the same property names, and each property in the object is equal to the corresponding property in the other object.</t>
-					</list>
-				</t>
-			</section>
-			
-			<section title="pattern" anchor="pattern">
-				<t>When the instance value is a string, this provides a regular expression that a string instance MUST match in order to be valid. Regular expressions SHOULD follow the regular expression specification from ECMA 262/Perl 5</t>
-			</section>
-			
-			<section title="minLength" anchor="minLength">
-				<t>When the instance value is a string, this defines the minimum length of the string.</t>
-			</section>
-			
-			<section title="maxLength" anchor="maxLength">
-				<t>When the instance value is a string, this defines the maximum length of the string.</t>
-			</section>
-			
-			<section title="enum" anchor="enum">
-				<t>This provides an enumeration of all possible values that are valid for the instance property. This MUST be an array, and each item in the array represents a possible value for the instance value. If this attribute is defined, the instance value MUST be one of the values in the array in order for the schema to be valid. Comparison of enum values uses the same algorithm as defined in <xref target="uniqueItems">"uniqueItems"</xref>.</t>
-			</section>
-			
-			<section title="default" anchor="default">
-				<t>This attribute defines the default value of the instance when the instance is undefined.</t>
-			</section>
-			
-			<section title="title" anchor="title">
-				<t>This attribute is a string that provides a short description of the instance property.</t>
-			</section>
-			
-			<section title="description" anchor="description">
-				<t>This attribute is a string that provides a full description of the of purpose the instance property.</t>
-			</section>
-			
-			<section title="divisibleBy" anchor="divisibleBy">
-				<t>This attribute defines what value the number instance must be divisible by with no remainder (the result of the division must be an integer.) The value of this attribute SHOULD NOT be 0.</t>
-			</section>
-			
-			<section title="disallow" anchor="disallow">
-				<t>This attribute takes the same values as the "type" attribute, however if the instance matches the type or if this value is an array and the instance matches any type or schema in the array, then this instance is not valid.</t>
-			</section>
-			
-			<section title="extends" anchor="extends">
-				<t>The value of this property MUST be another schema which will provide a base schema which the current schema will inherit from. The inheritance rules are such that any instance that is valid according to the current schema MUST be valid according to the referenced schema. This MAY also be an array, in which case, the instance MUST be valid for all the schemas in the array. A schema that extends another schema MAY define additional attributes, constrain existing attributes, or add other constraints.</t>
-				<t>
-					Conceptually, the behavior of extends can be seen as validating an
-					instance against all constraints in the extending schema as well as
-					the extended schema(s). More optimized implementations that merge
-					schemas are possible, but are not required. Some examples of using "extends":
-					
-					<figure>
-						<artwork>
-<![CDATA[
-{
-	"description": "An adult",
-	"properties": {
-		"age": {
-			"minimum": 21
-		}
-	},
-	"extends": {"$ref": "person"}
-}
-]]>
-						</artwork>
-					</figure>
-					
-					<figure>
-						<artwork>
-<![CDATA[
-{
-	"description": "Extended schema",
-	"properties": {
-		"deprecated": {
-			"type": "boolean"
-		}
-	},
-	"extends": {"$ref": "http://json-schema.org/draft-04/schema"}
-}
-]]>
-						</artwork>
-					</figure>
-				</t>
-			</section>
-			
-			<section title="id" anchor="id">
-				<t>
-					This attribute defines the current URI of this schema (this attribute is
-					effectively a "self" link). This URI MAY be relative or absolute. If
-					the URI is relative it is resolved against the current URI of the parent
-					schema it is contained in. If this schema is not contained in any
-					parent schema, the current URI of the parent schema is held to be the
-					URI under which this schema was addressed. If id is missing, the current URI of a schema is
-					defined to be that of the parent schema. The current URI of the schema
-					is also used to construct relative references such as for $ref.
-				</t>
-			</section>
-			
-			<section title="$ref" anchor="ref">
-				<t>
-					This attribute defines a URI of a schema that contains the full representation of this schema. 
-					When a validator encounters this attribute, it SHOULD replace the current schema with the schema referenced by the value's URI (if known and available) and re-validate the instance. 
-					This URI MAY be relative or absolute, and relative URIs SHOULD be resolved against the URI of the current schema.
-				</t>
-			</section>
-			
-			<section title="$schema" anchor="schema">
-				<t>
-					This attribute defines a URI of a JSON Schema that is the schema of the current schema. 
-					When this attribute is defined, a validator SHOULD use the schema referenced by the value's URI (if known and available) when resolving <xref target="hyper-schema">Hyper Schema</xref><xref target="links">links</xref>.
-				</t>
-				
-				<t>
-					A validator MAY use this attribute's value to determine which version of JSON Schema the current schema is written in, and provide the appropriate validation features and behavior. 
-					Therefore, it is RECOMMENDED that all schema authors include this attribute in their schemas to prevent conflicts with future JSON Schema specification changes.
-				</t>
-			</section>
-		</section>
-		
-		<section title="Hyper Schema" anchor="hyper-schema">
-			<t>
-				The following attributes are specified in addition to those
-				attributes that already provided by the core schema with the specific
-				purpose of informing user agents of relations between resources based
-				on JSON data. Just as with JSON
-				schema attributes, all the attributes in hyper schemas are optional.
-				Therefore, an empty object is a valid (non-informative) schema, and
-				essentially describes plain JSON (no constraints on the structures).
-				Addition of attributes provides additive information for user agents.
-			</t>
-			
-			<section title="links" anchor="links">
-				<t>
-					The value of the links property MUST be an array, where each item 
-					in the array is a link description object which describes the link
-					relations of the instances.
-				</t>
-				
-				<!-- TODO: Needs more clarification and examples -->
-				
-				<section title="Link Description Object">
-					<t>
-						A link description object is used to describe link relations. In 
-						the context of a schema, it defines the link relations of the 
-						instances of the schema, and can be parameterized by the instance
-						values. The link description format can be used without JSON Schema, 
-						and use of this format can
-						be declared by referencing the normative link description
-						schema as the the schema for the data structure that uses the 
-						links. The URI of the normative link description schema is: 
-						<eref target="http://json-schema.org/links">http://json-schema.org/links</eref> (latest version) or
-						<eref target="http://json-schema.org/draft-04/links">http://json-schema.org/draft-04/links</eref> (draft-04 version).
-					</t>
-					
-					<section title="href" anchor="href">
-						<t>
-							The value of the "href" link description property
-							indicates the target URI of the related resource. The value
-							of the instance property SHOULD be resolved as a URI-Reference per <xref target="RFC3986">RFC 3986</xref>
-							and MAY be a relative URI. The base URI to be used for relative resolution
-							SHOULD be the URI used to retrieve the instance object (not the schema)
-							when used within a schema. Also, when links are used within a schema, the URI 
-							SHOULD be parametrized by the property values of the instance 
-							object, if property values exist for the corresponding variables
-							in the template (otherwise they MAY be provided from alternate sources, like user input).
-						</t>
-						
-						<t>
-							Instance property values SHOULD be substituted into the URIs where
-							matching braces ('{', '}') are found surrounding zero or more characters,
-							creating an expanded URI. Instance property value substitutions are resolved
-							by using the text between the braces to denote the property name
-							from the instance to get the value to substitute. 
-							
-							<figure>
-								<preamble>For example, if an href value is defined:</preamble>
-								<artwork>
-<![CDATA[
-http://somesite.com/{id}
-]]>
-								</artwork>
-								<postamble>Then it would be resolved by replace the value of the "id" property value from the instance object.</postamble>
-							</figure>
-							
-							<figure>
-								<preamble>If the value of the "id" property was "45", the expanded URI would be:</preamble>
-								<artwork>
-<![CDATA[
-http://somesite.com/45
-]]>
-								</artwork>
-							</figure>
-							
-							If matching braces are found with the string "@" (no quotes) between the braces, then the 
-							actual instance value SHOULD be used to replace the braces, rather than a property value.
-							This should only be used in situations where the instance is a scalar (string, 
-							boolean, or number), and not for objects or arrays.
-						</t>
-					</section>
-					
-					<section title="rel">
-						<t>
-							The value of the "rel" property indicates the name of the 
-							relation to the target resource. The relation to the target SHOULD be interpreted as specifically from the instance object that the schema (or sub-schema) applies to, not just the top level resource that contains the object within its hierarchy. If a resource JSON representation contains a sub object with a property interpreted as a link, that sub-object holds the relation with the target. A relation to target from the top level resource MUST be indicated with the schema describing the top level JSON representation.
-						</t>
-						
-						<t>
-							Relationship definitions SHOULD NOT be media type dependent, and users are encouraged to utilize existing accepted relation definitions, including those in existing relation registries (see <xref target="RFC4287">RFC 4287</xref>). However, we define these relations here for clarity of normative interpretation within the context of JSON hyper schema defined relations:
-							
-							<list style="hanging">
-								<t hangText="self">
-									If the relation value is "self", when this property is encountered in
-									the instance object, the object represents a resource and the instance object is
-									treated as a full representation of the target resource identified by
-									the specified URI.
-								</t>
-								
-								<t hangText="full">
-									This indicates that the target of the link is the full representation for the instance object. The object that contains this link possibly may not be the full representation.
-								</t>
-								
-								<t hangText="describedby">
-									This indicates the target of the link is the schema for the instance object. This MAY be used to specifically denote the schemas of objects within a JSON object hierarchy, facilitating polymorphic type data structures.
-								</t>
-								
-								<t hangText="root">
-									This relation indicates that the target of the link
-									SHOULD be treated as the root or the body of the representation for the
-									purposes of user agent interaction or fragment resolution. All other
-									properties of the instance objects can be regarded as meta-data
-									descriptions for the data.
-								</t>
-							</list>
-						</t>
-						
-						<t>
-							The following relations are applicable for schemas (the schema as the "from" resource in the relation):
-
-							<list style="hanging">
-								<t hangText="instances">This indicates the target resource that represents collection of instances of a schema.</t>
-								<t hangText="create">This indicates a target to use for creating new instances of a schema. This link definition SHOULD be a submission link with a non-safe method (like POST).</t>
-							</list>
-						</t>
-						
-						<t>
-							<figure>
-								<preamble>For example, if a schema is defined:</preamble>
-								<artwork>
-<![CDATA[
-{
-	"links": [{
-		"rel": "self",
-		"href": "{id}"
-	}, {
-		"rel": "up",
-		"href": "{upId}"
-	}, {
-		"rel": "children",
-		"href": "?upId={id}"
-	}]
-}
-]]>
-								</artwork>
-							</figure>
-							
-							<figure>
-								<preamble>And if a collection of instance resource's JSON representation was retrieved:</preamble>
-								<artwork>
-<![CDATA[
-GET /Resource/
-
-[{
-	"id": "thing",
-	"upId": "parent"
-}, {
-	"id": "thing2",
-	"upId": "parent"
-}]
-]]>
-								</artwork>
-							</figure>
-
-							This would indicate that for the first item in the collection, its own
-							(self) URI would resolve to "/Resource/thing" and the first item's "up"
-							relation SHOULD be resolved to the resource at "/Resource/parent".
-							The "children" collection would be located at "/Resource/?upId=thing".
-						</t>
-					</section>
-					
-					<section title="template">
-						<t>This property value is a string that defines the templating language used in the <xref target="href">"href"</xref> attribute. If no templating language is defined, then the default <xref target="href">Link Description Object templating langauge</xref> is used.</t>
-					</section>
-					
-					<section title="targetSchema">
-						<t>This property value is a schema that defines the expected structure of the JSON representation of the target of the link.</t>
-					</section>
-					
-					<section title="Submission Link Properties">
-						<t>
-							The following properties also apply to link definition objects, and 
-							provide functionality analogous to HTML forms, in providing a 
-							means for submitting extra (often user supplied) information to send to a server.
-						</t>
-						
-						<section title="method">
-							<t>
-								This attribute defines which method can be used to access the target resource. 
-								In an HTTP environment, this would be "GET" or "POST" (other HTTP methods 
-								such as "PUT" and "DELETE" have semantics that are clearly implied by 
-								accessed resources, and do not need to be defined here). 
-								This defaults to "GET".
-							</t>
-						</section>
-						
-						<section title="enctype">
-							<t>
-								If present, this property indicates a query media type format that the server
-								supports for querying or posting to the collection of instances at the target 
-								resource. The query can be 
-								suffixed to the target URI to query the collection with
-								property-based constraints on the resources that SHOULD be returned from
-								the server or used to post data to the resource (depending on the method).
-								
-								<figure>
-									<preamble>For example, with the following schema:</preamble>
-									<artwork>
-<![CDATA[
-{
-	"links": [{
-		"enctype": "application/x-www-form-urlencoded",
-		"method": "GET",
-		"href": "/Product/",
-		"properties": {
-			"name": {
-				"description": "name of the product"
-			}
-		}
-	}]
-}
-]]>
-									</artwork>
-									<postamble>This indicates that the client can query the server for instances that have a specific name.</postamble>
-								</figure>
-								
-								<figure>
-									<preamble>For example:</preamble>
-									<artwork>
-<![CDATA[
-/Product/?name=Slinky
-]]>
-									</artwork>
-								</figure>
-
-								If no enctype or method is specified, only the single URI specified by 
-								the href property is defined. If the method is POST, "application/json" is 
-								the default media type.
-							</t>
-						</section>
-						
-						<section title="schema">
-							<t>
-								This attribute contains a schema which defines the acceptable structure of the submitted
-								request (for a GET request, this schema would define the properties for the query string 
-								and for a POST request, this would define the body).
-							</t>
-						</section>
-					</section>
-				</section>
-			</section>
-			
-			<section title="fragmentResolution">
-				<t>
-					This property indicates the fragment resolution protocol to use for
-					resolving fragment identifiers in URIs within the instance
-					representations. This applies to the instance object URIs and all
-					children of the instance object's URIs. The default fragment resolution
-					protocol is "json-pointer", which is defined below. Other fragment
-					resolution protocols MAY be used, but are not defined in this document.
-				</t>
-				
-				<t>
-					The fragment identifier is based on <xref target="RFC3986">RFC 3986, Sec 5</xref>, and defines the
-					mechanism for resolving references to entities within a document.
-				</t>
-				
-				<section title="json-pointer fragment resolution">
-					<t>The "json-pointer" fragment resolution protocol uses a <xref target="json-pointer">JSON Pointer</xref> to resolve fragment identifiers in URIs within instance representations.</t>
-				</section>
-			</section>
-			
-			<!-- TODO: Remove this? -->
-			
-			<section title="readonly">
-				<t>This attribute indicates that the instance value SHOULD NOT be changed. Attempts by a user agent to modify the value of this property are expected to be rejected by a server.</t>
-			</section>
-			
-			<section title="contentEncoding">
-				<t>If the instance property value is a string, this attribute defines that the string SHOULD be interpreted as binary data and decoded using the encoding named by this schema property. <xref target="RFC2045">RFC 2045, Sec 6.1</xref> lists the possible values for this property.</t>
-			</section>
-			
-			<section title="pathStart">
-				<t>
-					This attribute is a URI that defines what the instance's URI MUST start with in order to validate. 
-					The value of the "pathStart" attribute MUST be resolved as per <xref target="RFC3986">RFC 3986, Sec 5</xref>, 
-					and is relative to the instance's URI.
-				</t>
-				
-				<t>
-					When multiple schemas have been referenced for an instance, the user agent 
-					can determine if this schema is applicable for a particular instance by 
-					determining if the URI of the instance begins with the the value of the "pathStart"
-					attribute. If the URI of the instance does not start with this URI, 
-					or if another schema specifies a starting URI that is longer and also matches the 
-					instance, this schema SHOULD NOT be applied to the instance. Any schema 
-					that does not have a pathStart attribute SHOULD be considered applicable 
-					to all the instances for which it is referenced.
-				</t>
-			</section>
-			
-			<section title="mediaType">
-				<t>This attribute defines the media type of the instance representations that this schema is defining.</t>
-			</section>
-		</section>
-		
-		<section title="Security Considerations">
-			<t>
-				This specification is a sub-type of the JSON format, and 
-				consequently the security considerations are generally the same as <xref target="RFC4627">RFC 4627</xref>. 
-				However, an additional issue is that when link relation of "self"
-				is used to denote a full representation of an object, the user agent 
-				SHOULD NOT consider the representation to be the authoritative representation
-				of the resource denoted by the target URI if the target URI is not
-				equivalent to or a sub-path of the the URI used to request the resource 
-				representation which contains the target URI with the "self" link.
-				
-				<figure>
-					<preamble>For example, if a hyper schema was defined:</preamble>
-					<artwork>
-<![CDATA[
-{
-	"links": [{
-		"rel": "self",
-		"href": "{id}"
-	}]
-}
-]]>
-					</artwork>
-				</figure>
-				
-				<figure>
-					<preamble>And a resource was requested from somesite.com:</preamble>
-					<artwork>
-<![CDATA[
-GET /foo/
-]]>
-					</artwork>
-				</figure>
-
-				<figure>
-					<preamble>With a response of:</preamble>
-					<artwork>
-<![CDATA[
-Content-Type: application/json; profile=/schema-for-this-data
-
-[{
-	"id": "bar",
-	"name": "This representation can be safely treated \
-		as authoritative "
-}, {
-	"id": "/baz",
-	"name": "This representation should not be treated as \
-		authoritative the user agent should make request the resource\
-		from '/baz' to ensure it has the authoritative representation"
-}, {
-	"id": "http://othersite.com/something",
-	"name": "This representation\
-		should also not be treated as authoritative and the target\
-		resource representation should be retrieved for the\
-		authoritative representation"
-}]
-]]>
-					</artwork>
-				</figure>
-			</t>
-		</section>
-		
-		<section title="IANA Considerations">
-			<t>The proposed MIME media type for JSON Schema is "application/schema+json".</t>
-			<t>Type name: application</t>
-			<t>Subtype name: schema+json</t>
-			<t>Required parameters: profile</t>
-			<t>
-				The value of the profile parameter SHOULD be a URI (relative or absolute) that 
-				refers to the schema used to define the structure of this structure (the 
-				meta-schema). Normally the value would be http://json-schema.org/draft-04/hyper-schema,
-				but it is allowable to use other schemas that extend the hyper schema's meta-
-				schema.
-			</t>
-			<t>Optional parameters: pretty</t>
-			<t>The value of the pretty parameter MAY be true or false to indicate if additional whitespace has been included to make the JSON representation easier to read.</t>
-			
-			<section title="Registry of Link Relations">
-				<t>
-					This registry is maintained by IANA per <xref target="RFC4287">RFC 4287</xref> and this specification adds
-					four values: "full", "create", "instances", "root".  New
-					assignments are subject to IESG Approval, as outlined in <xref target="RFC5226">RFC 5226</xref>.
-					Requests should be made by email to IANA, which will then forward the
-					request to the IESG, requesting approval.
-				</t>
-			</section>
-		</section>
-	</middle>
-	
-	<back>
-		<!-- References Section -->
-		<references title="Normative References">
-			&rfc2045;
-			&rfc2119;
-			&rfc3339;
-			&rfc3986;
-			&rfc4287;
-			<reference anchor="json-pointer" target="http://tools.ietf.org/html/draft-pbryan-zyp-json-pointer-02">
-				<front>
-					<title>JSON Pointer</title>
-					<author initials="P." surname="Bryan">
-						<organization>ForgeRock US, Inc.</organization>
-					</author>
-					<author initials="K." surname="Zyp">
-						<organization>SitePen (USA)</organization>
-					</author>
-					<date year="2011" month="October" />
-				</front>
-			</reference>
-		</references>
-		<references title="Informative References">
-			&rfc2616;
-			&rfc4627;
-			&rfc5226;
-			&iddiscovery;
-			&uritemplate;
-			&linkheader;
-			&html401;
-			&css21;
-		</references>
-
-		<section title="Change Log">
-			<t>
-				<list style="hanging">
-					<t hangText="draft-04">
-						<list style="symbols">
-							<t>Changed "required" attribute to an array of strings.</t>
-							<t>Removed "format" attribute.</t>
-							<t>Added "minProperties" and "maxProperties" attributes.</t>
-							<t>Replaced "slash-delimited" fragment resolution with "json-pointer".</t>
-							<t>Added "template" LDO attribute.</t>
-							<t>Removed irrelevant "Open Issues" section.</t>
-							<t>Merged Conventions and Terminology sections.</t>
-							<t>Defined terms used in specification.</t>
-							<t>Removed "integer" type in favor of {"type":"number", "divisibleBy":1}.</t>
-							<t>Restricted "type" to only the core JSON types.</t>
-							<t>Improved wording of many sections.</t>
-						</list>
-					</t>
-				
-					<t hangText="draft-03">
-						<list style="symbols">
-							<t>Added example and verbiage to "extends" attribute.</t>
-							<t>Defined slash-delimited to use a leading slash.</t>
-							<t>Made "root" a relation instead of an attribute.</t>
-							<t>Removed address values, and MIME media type from format to reduce confusion (mediaType already exists, so it can be used for MIME types).</t>
-							<t>Added more explanation of nullability.</t>
-							<t>Removed "alternate" attribute.</t>
-							<t>Upper cased many normative usages of must, may, and should.</t>
-							<t>Replaced the link submission "properties" attribute to "schema" attribute.</t>
-							<t>Replaced "optional" attribute with "required" attribute.</t>
-							<t>Replaced "maximumCanEqual" attribute with "exclusiveMaximum" attribute.</t>
-							<t>Replaced "minimumCanEqual" attribute with "exclusiveMinimum" attribute.</t>
-							<t>Replaced "requires" attribute with "dependencies" attribute.</t>
-							<t>Moved "contentEncoding" attribute to hyper schema.</t>
-							<t>Added "additionalItems" attribute.</t>
-							<t>Added "id" attribute.</t>
-							<t>Switched self-referencing variable substitution from "-this" to "@" to align with reserved characters in URI template.</t>
-							<t>Added "patternProperties" attribute.</t>
-							<t>Schema URIs are now namespace versioned.</t>
-							<t>Added "$ref" and "$schema" attributes.</t>
-						</list>
-					</t>
-					
-					<t hangText="draft-02">
-						<list style="symbols">
-							<t>Replaced "maxDecimal" attribute with "divisibleBy" attribute.</t>
-							<t>Added slash-delimited fragment resolution protocol and made it the default.</t>
-							<t>Added language about using links outside of schemas by referencing its normative URI.</t>
-							<t>Added "uniqueItems" attribute.</t>
-							<t>Added "targetSchema" attribute to link description object.</t>
-						</list>
-					</t>
-					
-					<t hangText="draft-01">
-						<list style="symbols">
-							<t>Fixed category and updates from template.</t>
-						</list>
-					</t>
-					
-					<t hangText="draft-00">
-						<list style="symbols">
-							<t>Initial draft.</t>
-						</list>
-					</t>
-				</list>
-			</t>
-		</section>
-	</back>
-</rfc>
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/links.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/links.js
deleted file mode 100644
index 1bea0aa36c781ddba3087563f7930bd4f1111417..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/links.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/** 
- * JSON Schema link handler
- * Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com)
- * Licensed under the MIT (MIT-LICENSE.txt) license.
- */
-({define:typeof define!="undefined"?define:function(deps, factory){module.exports = factory();}}).
-define([], function(){
-var exports = {};
-exports.cacheLinks = true;
-exports.getLink = function(relation, instance, schema){
-	// gets the URI of the link for the given relation based on the instance and schema
-	// for example:
-	// getLink(
-	// 		"brother", 
-	// 		{"brother_id":33}, 
-	// 		{links:[{rel:"brother", href:"Brother/{brother_id}"}]}) ->
-	//	"Brother/33"
-	var links = schema.__linkTemplates; 
-	if(!links){
-		links = {};
-		var schemaLinks = schema.links;
-		if(schemaLinks && schemaLinks instanceof Array){
-			schemaLinks.forEach(function(link){
-	/*			// TODO: allow for multiple same-name relations
-				if(links[link.rel]){
-					if(!(links[link.rel] instanceof Array)){
-						links[link.rel] = [links[link.rel]];
-					}
-				}*/
-				links[link.rel] = link.href;
-			});
-		}
-		if(exports.cacheLinks){
-			schema.__linkTemplates = links;
-		}
-	}
-	var linkTemplate = links[relation];
-	return linkTemplate && exports.substitute(linkTemplate, instance);
-};
-
-exports.substitute = function(linkTemplate, instance){
-	return linkTemplate.replace(/\{([^\}]*)\}/g, function(t, property){
-			var value = instance[decodeURIComponent(property)];
-			if(value instanceof Array){
-				// the value is an array, it should produce a URI like /Table/(4,5,8) and store.get() should handle that as an array of values
-				return '(' + value.join(',') + ')';
-			}
-			return value;
-		});
-};
-return exports;
-});
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js
deleted file mode 100644
index 55d4c3aeebea51da32fd32ae750710bc583ce2d2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/lib/validate.js
+++ /dev/null
@@ -1,260 +0,0 @@
-/**
- * JSONSchema Validator - Validates JavaScript objects using JSON Schemas
- *	(http://www.json.com/json-schema-proposal/)
- *
- * Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com)
- * Licensed under the MIT (MIT-LICENSE.txt) license.
-To use the validator call the validate function with an instance object and an optional schema object.
-If a schema is provided, it will be used to validate. If the instance object refers to a schema (self-validating),
-that schema will be used to validate and the schema parameter is not necessary (if both exist,
-both validations will occur).
-The validate method will return an array of validation errors. If there are no errors, then an
-empty list will be returned. A validation error will have two properties:
-"property" which indicates which property had the error
-"message" which indicates what the error was
- */
-({define:typeof define!="undefined"?define:function(deps, factory){module.exports = factory();}}).
-define([], function(){
-var exports = validate;
-// setup primitive classes to be JSON Schema types
-exports.Integer = {type:"integer"};
-var primitiveConstructors = {
-	String: String,
-	Boolean: Boolean,
-	Number: Number,
-	Object: Object,
-	Array: Array,
-	Date: Date
-}
-exports.validate = validate;
-function validate(/*Any*/instance,/*Object*/schema) {
-		// Summary:
-		//  	To use the validator call JSONSchema.validate with an instance object and an optional schema object.
-		// 		If a schema is provided, it will be used to validate. If the instance object refers to a schema (self-validating),
-		// 		that schema will be used to validate and the schema parameter is not necessary (if both exist,
-		// 		both validations will occur).
-		// 		The validate method will return an object with two properties:
-		// 			valid: A boolean indicating if the instance is valid by the schema
-		// 			errors: An array of validation errors. If there are no errors, then an
-		// 					empty list will be returned. A validation error will have two properties:
-		// 						property: which indicates which property had the error
-		// 						message: which indicates what the error was
-		//
-		return validate(instance, schema, {changing: false});//, coerce: false, existingOnly: false});
-	};
-exports.checkPropertyChange = function(/*Any*/value,/*Object*/schema, /*String*/property) {
-		// Summary:
-		// 		The checkPropertyChange method will check to see if an value can legally be in property with the given schema
-		// 		This is slightly different than the validate method in that it will fail if the schema is readonly and it will
-		// 		not check for self-validation, it is assumed that the passed in value is already internally valid.
-		// 		The checkPropertyChange method will return the same object type as validate, see JSONSchema.validate for
-		// 		information.
-		//
-		return validate(value, schema, {changing: property || "property"});
-	};
-var validate = exports._validate = function(/*Any*/instance,/*Object*/schema,/*Object*/options) {
-
-	if (!options) options = {};
-	var _changing = options.changing;
-
-	function getType(schema){
-		return schema.type || (primitiveConstructors[schema.name] == schema && schema.name.toLowerCase());
-	}
-	var errors = [];
-	// validate a value against a property definition
-	function checkProp(value, schema, path,i){
-
-		var l;
-		path += path ? typeof i == 'number' ? '[' + i + ']' : typeof i == 'undefined' ? '' : '.' + i : i;
-		function addError(message){
-			errors.push({property:path,message:message});
-		}
-
-		if((typeof schema != 'object' || schema instanceof Array) && (path || typeof schema != 'function') && !(schema && getType(schema))){
-			if(typeof schema == 'function'){
-				if(!(value instanceof schema)){
-					addError("is not an instance of the class/constructor " + schema.name);
-				}
-			}else if(schema){
-				addError("Invalid schema/property definition " + schema);
-			}
-			return null;
-		}
-		if(_changing && schema.readonly){
-			addError("is a readonly field, it can not be changed");
-		}
-		if(schema['extends']){ // if it extends another schema, it must pass that schema as well
-			checkProp(value,schema['extends'],path,i);
-		}
-		// validate a value against a type definition
-		function checkType(type,value){
-			if(type){
-				if(typeof type == 'string' && type != 'any' &&
-						(type == 'null' ? value !== null : typeof value != type) &&
-						!(value instanceof Array && type == 'array') &&
-						!(value instanceof Date && type == 'date') &&
-						!(type == 'integer' && value%1===0)){
-					return [{property:path,message:(typeof value) + " value found, but a " + type + " is required"}];
-				}
-				if(type instanceof Array){
-					var unionErrors=[];
-					for(var j = 0; j < type.length; j++){ // a union type
-						if(!(unionErrors=checkType(type[j],value)).length){
-							break;
-						}
-					}
-					if(unionErrors.length){
-						return unionErrors;
-					}
-				}else if(typeof type == 'object'){
-					var priorErrors = errors;
-					errors = [];
-					checkProp(value,type,path);
-					var theseErrors = errors;
-					errors = priorErrors;
-					return theseErrors;
-				}
-			}
-			return [];
-		}
-		if(value === undefined){
-			if(schema.required){
-				addError("is missing and it is required");
-			}
-		}else{
-			errors = errors.concat(checkType(getType(schema),value));
-			if(schema.disallow && !checkType(schema.disallow,value).length){
-				addError(" disallowed value was matched");
-			}
-			if(value !== null){
-				if(value instanceof Array){
-					if(schema.items){
-						var itemsIsArray = schema.items instanceof Array;
-						var propDef = schema.items;
-						for (i = 0, l = value.length; i < l; i += 1) {
-							if (itemsIsArray)
-								propDef = schema.items[i];
-							if (options.coerce)
-								value[i] = options.coerce(value[i], propDef);
-							errors.concat(checkProp(value[i],propDef,path,i));
-						}
-					}
-					if(schema.minItems && value.length < schema.minItems){
-						addError("There must be a minimum of " + schema.minItems + " in the array");
-					}
-					if(schema.maxItems && value.length > schema.maxItems){
-						addError("There must be a maximum of " + schema.maxItems + " in the array");
-					}
-				}else if(schema.properties || schema.additionalProperties){
-					errors.concat(checkObj(value, schema.properties, path, schema.additionalProperties));
-				}
-				if(schema.pattern && typeof value == 'string' && !value.match(schema.pattern)){
-					addError("does not match the regex pattern " + schema.pattern);
-				}
-				if(schema.maxLength && typeof value == 'string' && value.length > schema.maxLength){
-					addError("may only be " + schema.maxLength + " characters long");
-				}
-				if(schema.minLength && typeof value == 'string' && value.length < schema.minLength){
-					addError("must be at least " + schema.minLength + " characters long");
-				}
-				if(typeof schema.minimum !== undefined && typeof value == typeof schema.minimum &&
-						schema.minimum > value){
-					addError("must have a minimum value of " + schema.minimum);
-				}
-				if(typeof schema.maximum !== undefined && typeof value == typeof schema.maximum &&
-						schema.maximum < value){
-					addError("must have a maximum value of " + schema.maximum);
-				}
-				if(schema['enum']){
-					var enumer = schema['enum'];
-					l = enumer.length;
-					var found;
-					for(var j = 0; j < l; j++){
-						if(enumer[j]===value){
-							found=1;
-							break;
-						}
-					}
-					if(!found){
-						addError("does not have a value in the enumeration " + enumer.join(", "));
-					}
-				}
-				if(typeof schema.maxDecimal == 'number' &&
-					(value.toString().match(new RegExp("\\.[0-9]{" + (schema.maxDecimal + 1) + ",}")))){
-					addError("may only have " + schema.maxDecimal + " digits of decimal places");
-				}
-			}
-		}
-		return null;
-	}
-	// validate an object against a schema
-	function checkObj(instance,objTypeDef,path,additionalProp){
-
-		if(typeof objTypeDef =='object'){
-			if(typeof instance != 'object' || instance instanceof Array){
-				errors.push({property:path,message:"an object is required"});
-			}
-			
-			for(var i in objTypeDef){ 
-				if(objTypeDef.hasOwnProperty(i)){
-					var value = instance[i];
-					// skip _not_ specified properties
-					if (value === undefined && options.existingOnly) continue;
-					var propDef = objTypeDef[i];
-					// set default
-					if(value === undefined && propDef["default"]){
-						value = instance[i] = propDef["default"];
-					}
-					if(options.coerce && i in instance){
-						value = instance[i] = options.coerce(value, propDef);
-					}
-					checkProp(value,propDef,path,i);
-				}
-			}
-		}
-		for(i in instance){
-			if(instance.hasOwnProperty(i) && !(i.charAt(0) == '_' && i.charAt(1) == '_') && objTypeDef && !objTypeDef[i] && additionalProp===false){
-				if (options.filter) {
-					delete instance[i];
-					continue;
-				} else {
-					errors.push({property:path,message:(typeof value) + "The property " + i +
-						" is not defined in the schema and the schema does not allow additional properties"});
-				}
-			}
-			var requires = objTypeDef && objTypeDef[i] && objTypeDef[i].requires;
-			if(requires && !(requires in instance)){
-				errors.push({property:path,message:"the presence of the property " + i + " requires that " + requires + " also be present"});
-			}
-			value = instance[i];
-			if(additionalProp && (!(objTypeDef && typeof objTypeDef == 'object') || !(i in objTypeDef))){
-				if(options.coerce){
-					value = instance[i] = options.coerce(value, additionalProp);
-				}
-				checkProp(value,additionalProp,path,i);
-			}
-			if(!_changing && value && value.$schema){
-				errors = errors.concat(checkProp(value,value.$schema,path,i));
-			}
-		}
-		return errors;
-	}
-	if(schema){
-		checkProp(instance,schema,'',_changing || '');
-	}
-	if(!_changing && instance && instance.$schema){
-		checkProp(instance,instance.$schema,'','');
-	}
-	return {valid:!errors.length,errors:errors};
-};
-exports.mustBeValid = function(result){
-	//	summary:
-	//		This checks to ensure that the result is valid and will throw an appropriate error message if it is not
-	// result: the result returned from checkPropertyChange or validate
-	if(!result.valid){
-		throw new TypeError(result.errors.map(function(error){return "for property " + error.property + ': ' + error.message;}).join(", \n"));
-	}
-}
-
-return exports;
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/package.json
deleted file mode 100644
index eb0634550eefaec59b4c3ceddc525e61a9e9f15f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/package.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-  "_from": "json-schema@0.2.2",
-  "_id": "json-schema@0.2.2",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/jsprim/json-schema",
-  "_npmUser": {
-    "email": "kriszyp@gmail.com",
-    "name": "kriszyp"
-  },
-  "_npmVersion": "1.1.59",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature/jsprim"
-  ],
-  "_resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz",
-  "_shasum": "50354f19f603917c695f70b85afa77c3b0f23506",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "Kris Zyp"
-  },
-  "bugs": {
-    "url": "https://github.com/kriszyp/json-schema/issues"
-  },
-  "dependencies": {},
-  "description": "JSON Schema validation and specifications",
-  "devDependencies": {
-    "vows": "*"
-  },
-  "directories": {
-    "lib": "./lib"
-  },
-  "dist": {
-    "shasum": "50354f19f603917c695f70b85afa77c3b0f23506",
-    "tarball": "http://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz"
-  },
-  "homepage": "https://github.com/kriszyp/json-schema#readme",
-  "keywords": [
-    "json",
-    "schema"
-  ],
-  "licenses": [
-    {
-      "type": "AFLv2.1",
-      "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L43"
-    },
-    {
-      "type": "BSD",
-      "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L13"
-    }
-  ],
-  "main": "./lib/validate.js",
-  "maintainers": [
-    {
-      "name": "kriszyp",
-      "email": "kriszyp@gmail.com"
-    }
-  ],
-  "name": "json-schema",
-  "optionalDependencies": {},
-  "readme": "JSON Schema is a repository for the JSON Schema specification, reference schemas and a CommonJS implementation of JSON Schema (not the only JavaScript implementation of JSON Schema, JSV is another excellent JavaScript validator).\r\n\r\nCode is licensed under the AFL or BSD license as part of the Persevere \r\nproject which is administered under the Dojo foundation,\r\nand all contributions require a Dojo CLA.",
-  "repository": {
-    "type": "git",
-    "url": "git+ssh://git@github.com/kriszyp/json-schema.git"
-  },
-  "scripts": {
-    "test": "echo TESTS DISABLED vows --spec test/*.js"
-  },
-  "version": "0.2.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/test/tests.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/test/tests.js
deleted file mode 100644
index 2938aea7c7446230497337c0710478990c810753..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/json-schema/test/tests.js
+++ /dev/null
@@ -1,95 +0,0 @@
-var assert = require('assert');
-var vows = require('vows');
-var path = require('path');
-var fs = require('fs');
-
-var validate = require('../lib/validate').validate;
-
-
-var revision = 'draft-03';
-var schemaRoot = path.join(__dirname, '..', revision);
-var schemaNames = ['schema', 'hyper-schema', 'links', 'json-ref' ];
-var schemas = {};
-
-schemaNames.forEach(function(name) {
-    var file = path.join(schemaRoot, name);
-    schemas[name] = loadSchema(file);
-});
-
-schemaNames.forEach(function(name) {
-    var s, n = name+'-nsd', f = path.join(schemaRoot, name);
-    schemas[n] = loadSchema(f);
-    s = schemas[n];
-    delete s['$schema'];
-});
-
-function loadSchema(path) {
-    var data = fs.readFileSync(path, 'utf-8');
-    var schema = JSON.parse(data);
-    return schema;
-}
-
-function resultIsValid() {
-    return function(result) {
-        assert.isObject(result);
-        //assert.isBoolean(result.valid);
-        assert.equal(typeof(result.valid), 'boolean');
-        assert.isArray(result.errors);
-        for (var i = 0; i < result.errors.length; i++) {
-            assert.notEqual(result.errors[i], null, 'errors['+i+'] is null');
-        }
-    }
-}
-
-function assertValidates(doc, schema) {
-    var context = {};
-
-    context[': validate('+doc+', '+schema+')'] = {
-        topic: validate(schemas[doc], schemas[schema]),
-        'returns valid result': resultIsValid(),
-        'with valid=true': function(result) { assert.equal(result.valid, true); },
-        'and no errors':   function(result) {
-            // XXX work-around for bug in vows: [null] chokes it
-            if (result.errors[0] == null) assert.fail('(errors contains null)');
-            assert.length(result.errors, 0);
-        }
-    };
-
-    return context;
-}
-
-function assertSelfValidates(doc) {
-    var context = {};
-
-    context[': validate('+doc+')'] = {
-        topic: validate(schemas[doc]),
-        'returns valid result': resultIsValid(),
-        'with valid=true': function(result) { assert.equal(result.valid, true); },
-        'and no errors':   function(result) { assert.length(result.errors, 0); }
-    };
-
-    return context;
-}
-
-var suite = vows.describe('JSON Schema').addBatch({
-    'Core-NSD self-validates': assertSelfValidates('schema-nsd'),
-    'Core-NSD/Core-NSD': assertValidates('schema-nsd', 'schema-nsd'),
-    'Core-NSD/Core': assertValidates('schema-nsd', 'schema'),
-
-    'Core self-validates': assertSelfValidates('schema'),
-    'Core/Core': assertValidates('schema', 'schema'),
-
-    'Hyper-NSD self-validates': assertSelfValidates('hyper-schema-nsd'),
-    'Hyper self-validates': assertSelfValidates('hyper-schema'),
-    'Hyper/Hyper': assertValidates('hyper-schema', 'hyper-schema'),
-    'Hyper/Core': assertValidates('hyper-schema', 'schema'),
-
-    'Links-NSD self-validates': assertSelfValidates('links-nsd'),
-    'Links self-validates': assertSelfValidates('links'),
-    'Links/Hyper': assertValidates('links', 'hyper-schema'),
-    'Links/Core': assertValidates('links', 'schema'),
-
-    'Json-Ref self-validates': assertSelfValidates('json-ref'),
-    'Json-Ref/Hyper': assertValidates('json-ref', 'hyper-schema'),
-    'Json-Ref/Core': assertValidates('json-ref', 'schema')
-}).export(module);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/.gitmodules b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/.gitmodules
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/.npmignore
deleted file mode 100644
index 3c3629e647f5ddf82548912e337bea9826b434af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/LICENSE
deleted file mode 100644
index cbc0bb3ba3b0629c66c042111fe01c664a6f812f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2012, Joyent, Inc. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/Makefile b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/Makefile
deleted file mode 100644
index 00faa97de520890d9b1fe77fe3184909069d0405..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/Makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-# Copyright (c) 2012, Joyent, Inc. All rights reserved.
-#
-# Makefile: top-level Makefile
-#
-# This Makefile contains only repo-specific logic and uses included makefiles
-# to supply common targets (javascriptlint, jsstyle, restdown, etc.), which are
-# used by other repos as well.
-#
-
-#
-# Tools
-#
-NPM		 = npm
-
-#
-# Files
-#
-JS_FILES	:= $(shell find lib examples tests -name '*.js')
-JSL_FILES_NODE   = $(JS_FILES)
-JSSTYLE_FILES	 = $(JS_FILES)
-JSL_CONF_NODE	 = jsl.node.conf
-
-.PHONY: all
-all:
-	$(NPM) install
-
-.PHONY: test
-test:
-	node tests/tst.inherit.js
-	node tests/tst.verror.js
-	node tests/tst.werror.js
-	@echo all tests passed
-
-include ./Makefile.targ
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/Makefile.targ b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/Makefile.targ
deleted file mode 100644
index 2a64fe7e950f41db5e957cd8390318b53ca584db..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/Makefile.targ
+++ /dev/null
@@ -1,285 +0,0 @@
-# -*- mode: makefile -*-
-#
-# Copyright (c) 2012, Joyent, Inc. All rights reserved.
-#
-# Makefile.targ: common targets.
-#
-# NOTE: This makefile comes from the "eng" repo. It's designed to be dropped
-# into other repos as-is without requiring any modifications. If you find
-# yourself changing this file, you should instead update the original copy in
-# eng.git and then update your repo to use the new version.
-#
-# This Makefile defines several useful targets and rules. You can use it by
-# including it from a Makefile that specifies some of the variables below.
-#
-# Targets defined in this Makefile:
-#
-#	check	Checks JavaScript files for lint and style
-#		Checks bash scripts for syntax
-#		Checks SMF manifests for validity against the SMF DTD
-#
-#	clean	Removes built files
-#
-#	docs	Builds restdown documentation in docs/
-#
-#	prepush	Depends on "check" and "test"
-#
-#	test	Does nothing (you should override this)
-#
-#	xref	Generates cscope (source cross-reference index)
-#
-# For details on what these targets are supposed to do, see the Joyent
-# Engineering Guide.
-#
-# To make use of these targets, you'll need to set some of these variables. Any
-# variables left unset will simply not be used.
-#
-#	BASH_FILES	Bash scripts to check for syntax
-#			(paths relative to top-level Makefile)
-#
-#	CLEAN_FILES	Files to remove as part of the "clean" target.  Note
-#			that files generated by targets in this Makefile are
-#			automatically included in CLEAN_FILES.  These include
-#			restdown-generated HTML and JSON files.
-#
-#	DOC_FILES	Restdown (documentation source) files. These are
-#			assumed to be contained in "docs/", and must NOT
-#			contain the "docs/" prefix.
-#
-#	JSL_CONF_NODE	Specify JavaScriptLint configuration files
-#	JSL_CONF_WEB	(paths relative to top-level Makefile)
-#
-#			Node.js and Web configuration files are separate
-#			because you'll usually want different global variable
-#			configurations.  If no file is specified, none is given
-#			to jsl, which causes it to use a default configuration,
-#			which probably isn't what you want.
-#
-#	JSL_FILES_NODE	JavaScript files to check with Node config file.
-#	JSL_FILES_WEB	JavaScript files to check with Web config file.
-#
-# You can also override these variables:
-#
-#	BASH		Path to bash (default: bash)
-#
-#	CSCOPE_DIRS	Directories to search for source files for the cscope
-#			index. (default: ".")
-#
-#	JSL		Path to JavaScriptLint (default: "jsl")
-#
-#	JSL_FLAGS_NODE	Additional flags to pass through to JSL
-#	JSL_FLAGS_WEB
-#	JSL_FLAGS
-#
-#	JSSTYLE		Path to jsstyle (default: jsstyle)
-#
-#	JSSTYLE_FLAGS	Additional flags to pass through to jsstyle
-#
-
-#
-# Defaults for the various tools we use.
-#
-BASH		?= bash
-BASHSTYLE	?= tools/bashstyle
-CP		?= cp
-CSCOPE		?= cscope
-CSCOPE_DIRS	?= .
-JSL		?= jsl
-JSSTYLE		?= jsstyle
-MKDIR		?= mkdir -p
-MV		?= mv
-RESTDOWN_FLAGS	?=
-RMTREE		?= rm -rf
-JSL_FLAGS  	?= --nologo --nosummary
-
-ifeq ($(shell uname -s),SunOS)
-	TAR	?= gtar
-else
-	TAR	?= tar
-endif
-
-
-#
-# Defaults for other fixed values.
-#
-BUILD		= build
-DISTCLEAN_FILES += $(BUILD)
-DOC_BUILD	= $(BUILD)/docs/public
-
-#
-# Configure JSL_FLAGS_{NODE,WEB} based on JSL_CONF_{NODE,WEB}.
-#
-ifneq ($(origin JSL_CONF_NODE), undefined)
-	JSL_FLAGS_NODE += --conf=$(JSL_CONF_NODE)
-endif
-
-ifneq ($(origin JSL_CONF_WEB), undefined)
-	JSL_FLAGS_WEB += --conf=$(JSL_CONF_WEB)
-endif
-
-#
-# Targets. For descriptions on what these are supposed to do, see the
-# Joyent Engineering Guide.
-#
-
-#
-# Instruct make to keep around temporary files. We have rules below that
-# automatically update git submodules as needed, but they employ a deps/*/.git
-# temporary file. Without this directive, make tries to remove these .git
-# directories after the build has completed.
-#
-.SECONDARY: $($(wildcard deps/*):%=%/.git)
-
-#
-# This rule enables other rules that use files from a git submodule to have
-# those files depend on deps/module/.git and have "make" automatically check
-# out the submodule as needed.
-#
-deps/%/.git:
-	git submodule update --init deps/$*
-
-#
-# These recipes make heavy use of dynamically-created phony targets. The parent
-# Makefile defines a list of input files like BASH_FILES. We then say that each
-# of these files depends on a fake target called filename.bashchk, and then we
-# define a pattern rule for those targets that runs bash in check-syntax-only
-# mode. This mechanism has the nice properties that if you specify zero files,
-# the rule becomes a noop (unlike a single rule to check all bash files, which
-# would invoke bash with zero files), and you can check individual files from
-# the command line with "make filename.bashchk".
-#
-.PHONY: check-bash
-check-bash: $(BASH_FILES:%=%.bashchk) $(BASH_FILES:%=%.bashstyle)
-
-%.bashchk: %
-	$(BASH) -n $^
-
-%.bashstyle: %
-	$(BASHSTYLE) $^
-
-.PHONY: check-jsl check-jsl-node check-jsl-web
-check-jsl: check-jsl-node check-jsl-web
-
-check-jsl-node: $(JSL_FILES_NODE:%=%.jslnodechk)
-
-check-jsl-web: $(JSL_FILES_WEB:%=%.jslwebchk)
-
-%.jslnodechk: % $(JSL_EXEC)
-	$(JSL) $(JSL_FLAGS) $(JSL_FLAGS_NODE) $<
-
-%.jslwebchk: % $(JSL_EXEC)
-	$(JSL) $(JSL_FLAGS) $(JSL_FLAGS_WEB) $<
-
-.PHONY: check-jsstyle
-check-jsstyle: $(JSSTYLE_FILES:%=%.jsstylechk)
-
-%.jsstylechk: % $(JSSTYLE_EXEC)
-	$(JSSTYLE) $(JSSTYLE_FLAGS) $<
-
-.PHONY: check
-check: check-jsl check-jsstyle check-bash
-	@echo check ok
-
-.PHONY: clean
-clean::
-	-$(RMTREE) $(CLEAN_FILES)
-
-.PHONY: distclean
-distclean:: clean
-	-$(RMTREE) $(DISTCLEAN_FILES)
-
-CSCOPE_FILES = cscope.in.out cscope.out cscope.po.out
-CLEAN_FILES += $(CSCOPE_FILES)
-
-.PHONY: xref
-xref: cscope.files
-	$(CSCOPE) -bqR
-
-.PHONY: cscope.files
-cscope.files:
-	find $(CSCOPE_DIRS) -name '*.c' -o -name '*.h' -o -name '*.cc' \
-	    -o -name '*.js' -o -name '*.s' -o -name '*.cpp' > $@
-
-#
-# The "docs" target is complicated because we do several things here:
-#
-#    (1) Use restdown to build HTML and JSON files from each of DOC_FILES.
-#
-#    (2) Copy these files into $(DOC_BUILD) (build/docs/public), which
-#        functions as a complete copy of the documentation that could be
-#        mirrored or served over HTTP.
-#
-#    (3) Then copy any directories and media from docs/media into
-#        $(DOC_BUILD)/media. This allows projects to include their own media,
-#        including files that will override same-named files provided by
-#        restdown.
-#
-# Step (3) is the surprisingly complex part: in order to do this, we need to
-# identify the subdirectories in docs/media, recreate them in
-# $(DOC_BUILD)/media, then do the same with the files.
-#
-DOC_MEDIA_DIRS := $(shell find docs/media -type d 2>/dev/null | grep -v "^docs/media$$")
-DOC_MEDIA_DIRS := $(DOC_MEDIA_DIRS:docs/media/%=%)
-DOC_MEDIA_DIRS_BUILD := $(DOC_MEDIA_DIRS:%=$(DOC_BUILD)/media/%)
-
-DOC_MEDIA_FILES := $(shell find docs/media -type f 2>/dev/null)
-DOC_MEDIA_FILES := $(DOC_MEDIA_FILES:docs/media/%=%)
-DOC_MEDIA_FILES_BUILD := $(DOC_MEDIA_FILES:%=$(DOC_BUILD)/media/%)
-
-#
-# Like the other targets, "docs" just depends on the final files we want to
-# create in $(DOC_BUILD), leveraging other targets and recipes to define how
-# to get there.
-#
-.PHONY: docs
-docs:							\
-    $(DOC_FILES:%.restdown=$(DOC_BUILD)/%.html)		\
-    $(DOC_FILES:%.restdown=$(DOC_BUILD)/%.json)		\
-    $(DOC_MEDIA_FILES_BUILD)
-
-#
-# We keep the intermediate files so that the next build can see whether the
-# files in DOC_BUILD are up to date.
-#
-.PRECIOUS:					\
-    $(DOC_FILES:%.restdown=docs/%.html)		\
-    $(DOC_FILES:%.restdown=docs/%json)
-
-#
-# We do clean those intermediate files, as well as all of DOC_BUILD.
-#
-CLEAN_FILES +=					\
-    $(DOC_BUILD)				\
-    $(DOC_FILES:%.restdown=docs/%.html)		\
-    $(DOC_FILES:%.restdown=docs/%.json)
-
-#
-# Before installing the files, we must make sure the directories exist. The |
-# syntax tells make that the dependency need only exist, not be up to date.
-# Otherwise, it might try to rebuild spuriously because the directory itself
-# appears out of date.
-#
-$(DOC_MEDIA_FILES_BUILD): | $(DOC_MEDIA_DIRS_BUILD)
-
-$(DOC_BUILD)/%: docs/% | $(DOC_BUILD)
-	$(CP) $< $@
-
-docs/%.json docs/%.html: docs/%.restdown | $(DOC_BUILD) $(RESTDOWN_EXEC)
-	$(RESTDOWN) $(RESTDOWN_FLAGS) -m $(DOC_BUILD) $<
-
-$(DOC_BUILD):
-	$(MKDIR) $@
-
-$(DOC_MEDIA_DIRS_BUILD):
-	$(MKDIR) $@
-
-#
-# The default "test" target does nothing. This should usually be overridden by
-# the parent Makefile. It's included here so we can define "prepush" without
-# requiring the repo to define "test".
-#
-.PHONY: test
-test:
-
-.PHONY: prepush
-prepush: check test
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/README.md
deleted file mode 100644
index e9b5497851cc452c431e886e6d0e9bc95670494c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/README.md
+++ /dev/null
@@ -1,120 +0,0 @@
-# verror: richer JavaScript errors
-
-This module provides two classes: VError, for accretive errors, and WError, for
-wrapping errors.  Both support printf-style error messages using extsprintf.
-
-## Printf-style errors
-
-At the most basic level, VError is just like JavaScript's Error class, but with
-printf-style arguments:
-
-    var verror = require('verror');
-
-    var opname = 'read';
-    var err = new verror.VError('"%s" operation failed', opname);
-    console.log(err.message);
-    console.log(err.stack);
-
-This prints:
-
-    "read" operation failed
-    "read" operation failed
-        at Object.<anonymous> (/Users/dap/node-verror/examples/varargs.js:4:11)
-        at Module._compile (module.js:449:26)
-        at Object.Module._extensions..js (module.js:467:10)
-        at Module.load (module.js:356:32)
-        at Function.Module._load (module.js:312:12)
-        at Module.runMain (module.js:492:10)
-        at process.startup.processNextTick.process._tickCallback (node.js:244:9)
-
-
-## VError for accretive error messages
-
-More interestingly, you can use VError to build up an error describing what
-happened at various levels in the stack.  For example, suppose you have a
-request handler that stats a file and fails if it doesn't exist:
-
-    var fs = require('fs');
-    var verror = require('verror');
-
-    function checkFile(filename, callback) {
-        fs.stat(filename, function (err) {
-            if (err)
-		/* Annotate the "stat" error with what we were doing. */
-	    	return (callback(new verror.VError(err,
-		    'failed to check "%s"', filename)));
-
-	    /* ... */
-        });
-    }
-
-    function handleRequest(filename, callback) {
-    	checkFile('/nonexistent', function (err) {
-    	    if (err) {
-    	    	/* Annotate the "checkFile" error with what we were doing. */
-    	    	return (callback(new verror.VError(err, 'request failed')));
-    	    }
-
-    	    /* ... */
-    	});
-    }
-
-    handleRequest('/nonexistent', function (err) {
-	if (err)
-		console.log(err.message);
-	/* ... */
-    });
-
-Since the file "/nonexistent" doesn't exist, this prints out:
-
-    request failed: failed to check "/nonexistent": ENOENT, stat '/nonexistent'
-
-The idea here is that the lowest level (Node's "fs.stat" function) generates an
-arbitrary error, and each higher level (request handler and stat callback)
-creates a new VError that annotates the previous error with what it was doing,
-so that the result is a clear message explaining what failed at each level.
-
-This plays nicely with extsprintf's "%r" specifier, which prints out a
-Java-style stacktrace with the whole chain of exceptions:
-
-    EXCEPTION: VError: request failed: failed to check "/nonexistent": ENOENT, stat '/nonexistent'
-        at /Users/dap/work/node-verror/examples/levels.js:21:21
-        at /Users/dap/work/node-verror/examples/levels.js:9:12
-        at Object.oncomplete (fs.js:297:15)
-    Caused by: EXCEPTION: VError: failed to check "/nonexistent": ENOENT, stat '/nonexistent'
-        at /Users/dap/work/node-verror/examples/levels.js:9:21
-        at Object.oncomplete (fs.js:297:15)
-    Caused by: EXCEPTION: Error: Error: ENOENT, stat '/nonexistent'
-
-
-## WError for wrapped errors
-
-Sometimes you don't want an Error's "message" field to include the details of
-all of the low-level errors, but you still want to be able to get at them
-programmatically.  For example, in an HTTP server, you probably don't want to
-spew all of the low-level errors back to the client, but you do want to include
-them in the audit log entry for the request.  In that case, you can use a
-WError, which is created exactly like VError (and also supports both
-printf-style arguments and an optional cause), but the resulting "message" only
-contains the top-level error.  It's also more verbose, including the class
-associated with each error in the cause chain.  Using the same example above,
-but replacing the VError in handleRequest with WError, we get this output:
-
-    request failed
-
-That's what we wanted -- just a high-level summary for the client.  But we can
-get the object's toString() for the full details:
-
-    WError: request failed; caused by WError: failed to check "/nonexistent";
-    caused by Error: ENOENT, stat '/nonexistent'
-
-# Contributing
-
-Contributions welcome.  Code should be "make check" clean.  To run "make check",
-you'll need these tools:
-
-* https://github.com/davepacheco/jsstyle
-* https://github.com/davepacheco/javascriptlint
-
-If you're changing something non-trivial or user-facing, you may want to submit
-an issue first.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/levels-verror.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/levels-verror.js
deleted file mode 100644
index 53a7022c6cda83459dca7d5f952de0318ed9bdf3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/levels-verror.js
+++ /dev/null
@@ -1,36 +0,0 @@
-var extsprintf = require('extsprintf');
-var fs = require('fs');
-var verror = require('../lib/verror');
-
-function checkFile(filename, callback) {
-	fs.stat(filename, function (err) {
-		if (err)
-			/* Annotate the "stat" error with what we were doing. */
-			return (callback(new verror.VError(err,
-			    'failed to check "%s"', filename)));
-
-		/* ... */
-		return (callback());
-	});
-}
-
-function handleRequest(filename, callback) {
-	checkFile('/nonexistent', function (err) {
-		if (err)
-			/* Annotate the "checkFile" error. */
-			return (callback(new verror.VError(
-			    err, 'request failed')));
-
-		/* ... */
-		return (callback());
-	});
-}
-
-handleRequest('/nonexistent', function (err) {
-	if (err) {
-		console.log(err.message);
-		console.log(extsprintf.sprintf('%r', err));
-	}
-
-    /* ... */
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/levels-werror.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/levels-werror.js
deleted file mode 100644
index 7e570756ebcef9590cf223e369ff9faaad02caf3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/levels-werror.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var extsprintf = require('extsprintf');
-var fs = require('fs');
-var verror = require('../lib/verror');
-
-function checkFile(filename, callback) {
-	fs.stat(filename, function (err) {
-		if (err)
-			/* Annotate the "stat" error with what we were doing. */
-			return (callback(new verror.VError(err,
-			    'failed to check "%s"', filename)));
-
-		/* ... */
-		return (callback());
-	});
-}
-
-function handleRequest(filename, callback) {
-	checkFile('/nonexistent', function (err) {
-		if (err)
-			/* Wrap the "checkFile" error. */
-			return (callback(new verror.WError(
-			    err, 'request failed')));
-
-		/* ... */
-		return (callback());
-	});
-}
-
-handleRequest('/nonexistent', function (err) {
-	if (err) {
-		console.log(err.message);
-		console.log(err.toString());
-	}
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/varargs.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/varargs.js
deleted file mode 100644
index 2e14ee48c5ae98e70c1d7f6b9457f97cc56e8f4e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/varargs.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var verror = require('../lib/verror');
-
-var opname = 'read';
-var err = new verror.VError('"%s" operation failed', opname);
-console.log(err.message);
-console.log(err.stack);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/verror.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/verror.js
deleted file mode 100644
index 887b181b05662fdcbc4857b47f2b2a9ba81a9f68..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/verror.js
+++ /dev/null
@@ -1,13 +0,0 @@
-var mod_fs = require('fs');
-var mod_verror = require('../lib/verror');
-
-var filename = '/nonexistent';
-
-mod_fs.stat(filename, function (err1) {
-	var err2 = new mod_verror.VError(err1, 'failed to stat "%s"', filename);
-
-	/* The following would normally be higher up the stack. */
-	var err3 = new mod_verror.VError(err2, 'failed to handle request');
-	console.log(err3.message);
-	console.log(err3.stack);
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/werror.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/werror.js
deleted file mode 100644
index f55e5322ead86c6ee1acd2705d08628ec1e76940..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/examples/werror.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var mod_fs = require('fs');
-var mod_verror = require('../lib/verror');
-
-var filename = '/nonexistent';
-
-mod_fs.stat(filename, function (err1) {
-	var err2 = new mod_verror.WError(err1, 'failed to stat "%s"', filename);
-
-	/* The following would normally be higher up the stack. */
-	var err3 = new mod_verror.WError(err2, 'failed to handle request');
-	console.log(err3.message);
-	console.log(err3.toString());
-	console.log(err3.stack);
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/jsl.node.conf b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/jsl.node.conf
deleted file mode 100644
index bd724a2c784030c30df5e9842a9f30fbb03da517..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/jsl.node.conf
+++ /dev/null
@@ -1,139 +0,0 @@
-#
-# Configuration File for JavaScript Lint 
-#
-# This configuration file can be used to lint a collection of scripts, or to enable
-# or disable warnings for scripts that are linted via the command line.
-#
-
-### Warnings
-# Enable or disable warnings based on requirements.
-# Use "+WarningName" to display or "-WarningName" to suppress.
-#
-+ambiguous_else_stmt          # the else statement could be matched with one of multiple if statements (use curly braces to indicate intent
-+ambiguous_nested_stmt        # block statements containing block statements should use curly braces to resolve ambiguity
-+ambiguous_newline            # unexpected end of line; it is ambiguous whether these lines are part of the same statement
-+anon_no_return_value         # anonymous function does not always return value
-+assign_to_function_call      # assignment to a function call
--block_without_braces         # block statement without curly braces
-+comma_separated_stmts        # multiple statements separated by commas (use semicolons?)
-+comparison_type_conv         # comparisons against null, 0, true, false, or an empty string allowing implicit type conversion (use === or !==)
-+default_not_at_end           # the default case is not at the end of the switch statement
-+dup_option_explicit          # duplicate "option explicit" control comment
-+duplicate_case_in_switch     # duplicate case in switch statement
-+duplicate_formal             # duplicate formal argument {name}
-+empty_statement              # empty statement or extra semicolon
-+identifier_hides_another     # identifer {name} hides an identifier in a parent scope
--inc_dec_within_stmt          # increment (++) and decrement (--) operators used as part of greater statement
-+incorrect_version            # Expected /*jsl:content-type*/ control comment. The script was parsed with the wrong version.
-+invalid_fallthru             # unexpected "fallthru" control comment
-+invalid_pass                 # unexpected "pass" control comment
-+jsl_cc_not_understood        # couldn't understand control comment using /*jsl:keyword*/ syntax
-+leading_decimal_point        # leading decimal point may indicate a number or an object member
-+legacy_cc_not_understood     # couldn't understand control comment using /*@keyword@*/ syntax
-+meaningless_block            # meaningless block; curly braces have no impact
-+mismatch_ctrl_comments       # mismatched control comment; "ignore" and "end" control comments must have a one-to-one correspondence
-+misplaced_regex              # regular expressions should be preceded by a left parenthesis, assignment, colon, or comma
-+missing_break                # missing break statement
-+missing_break_for_last_case  # missing break statement for last case in switch
-+missing_default_case         # missing default case in switch statement
-+missing_option_explicit      # the "option explicit" control comment is missing
-+missing_semicolon            # missing semicolon
-+missing_semicolon_for_lambda # missing semicolon for lambda assignment
-+multiple_plus_minus          # unknown order of operations for successive plus (e.g. x+++y) or minus (e.g. x---y) signs
-+nested_comment               # nested comment
-+no_return_value              # function {name} does not always return a value
-+octal_number                 # leading zeros make an octal number
-+parseint_missing_radix       # parseInt missing radix parameter
-+partial_option_explicit      # the "option explicit" control comment, if used, must be in the first script tag
-+redeclared_var               # redeclaration of {name}
-+trailing_comma_in_array      # extra comma is not recommended in array initializers
-+trailing_decimal_point       # trailing decimal point may indicate a number or an object member
-+undeclared_identifier        # undeclared identifier: {name}
-+unreachable_code             # unreachable code
--unreferenced_argument        # argument declared but never referenced: {name}
--unreferenced_function        # function is declared but never referenced: {name}
-+unreferenced_variable        # variable is declared but never referenced: {name}
-+unsupported_version          # JavaScript {version} is not supported
-+use_of_label                 # use of label
-+useless_assign               # useless assignment
-+useless_comparison           # useless comparison; comparing identical expressions
--useless_quotes               # the quotation marks are unnecessary
-+useless_void                 # use of the void type may be unnecessary (void is always undefined)
-+var_hides_arg                # variable {name} hides argument
-+want_assign_or_call          # expected an assignment or function call
-+with_statement               # with statement hides undeclared variables; use temporary variable instead
-
-
-### Output format
-# Customize the format of the error message.
-#    __FILE__ indicates current file path
-#    __FILENAME__ indicates current file name
-#    __LINE__ indicates current line
-#    __COL__ indicates current column
-#    __ERROR__ indicates error message (__ERROR_PREFIX__: __ERROR_MSG__)
-#    __ERROR_NAME__ indicates error name (used in configuration file)
-#    __ERROR_PREFIX__ indicates error prefix
-#    __ERROR_MSG__ indicates error message
-#
-# For machine-friendly output, the output format can be prefixed with
-# "encode:". If specified, all items will be encoded with C-slashes.
-#
-# Visual Studio syntax (default):
-+output-format __FILE__(__LINE__): __ERROR__
-# Alternative syntax:
-#+output-format __FILE__:__LINE__: __ERROR__
-
-
-### Context
-# Show the in-line position of the error.
-# Use "+context" to display or "-context" to suppress.
-#
-+context
-
-
-### Control Comments
-# Both JavaScript Lint and the JScript interpreter confuse each other with the syntax for
-# the /*@keyword@*/ control comments and JScript conditional comments. (The latter is
-# enabled in JScript with @cc_on@). The /*jsl:keyword*/ syntax is preferred for this reason,
-# although legacy control comments are enabled by default for backward compatibility.
-#
--legacy_control_comments
-
-
-### Defining identifiers
-# By default, "option explicit" is enabled on a per-file basis.
-# To enable this for all files, use "+always_use_option_explicit"
--always_use_option_explicit
-
-# Define certain identifiers of which the lint is not aware.
-# (Use this in conjunction with the "undeclared identifier" warning.)
-#
-# Common uses for webpages might be:
-+define __dirname
-+define clearInterval
-+define clearTimeout
-+define console
-+define exports
-+define global
-+define process
-+define require
-+define setInterval
-+define setTimeout
-+define Buffer
-+define JSON
-+define Math
-+define __dirname
-+define __filename
-
-### JavaScript Version
-# To change the default JavaScript version:
-#+default-type text/javascript;version=1.5
-#+default-type text/javascript;e4x=1
-
-### Files
-# Specify which files to lint
-# Use "+recurse" to enable recursion (disabled by default).
-# To add a set of files, use "+process FileName", "+process Folder\Path\*.js",
-# or "+process Folder\Path\*.htm".
-#
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/lib/verror.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/lib/verror.js
deleted file mode 100644
index 9ca087b170d6774f28cb4f7005be8a4c517a2e09..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/lib/verror.js
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * verror.js: richer JavaScript errors
- */
-
-var mod_assert = require('assert');
-var mod_util = require('util');
-
-var mod_extsprintf = require('extsprintf');
-
-/*
- * Public interface
- */
-exports.VError = VError;
-exports.WError = WError;
-exports.MultiError = MultiError;
-
-/*
- * Like JavaScript's built-in Error class, but supports a "cause" argument and a
- * printf-style message.  The cause argument can be null.
- */
-function VError(options)
-{
-	var args, causedBy, ctor, tailmsg;
-
-	if (options instanceof Error || typeof (options) === 'object') {
-		args = Array.prototype.slice.call(arguments, 1);
-	} else {
-		args = Array.prototype.slice.call(arguments, 0);
-		options = undefined;
-	}
-
-	tailmsg = args.length > 0 ?
-	    mod_extsprintf.sprintf.apply(null, args) : '';
-	this.jse_shortmsg = tailmsg;
-	this.jse_summary = tailmsg;
-
-	if (options) {
-		causedBy = options.cause;
-
-		if (!causedBy || !(options.cause instanceof Error))
-			causedBy = options;
-
-		if (causedBy && (causedBy instanceof Error)) {
-			this.jse_cause = causedBy;
-			this.jse_summary += ': ' + causedBy.message;
-		}
-	}
-
-	this.message = this.jse_summary;
-	Error.call(this, this.jse_summary);
-
-	if (Error.captureStackTrace) {
-		ctor = options ? options.constructorOpt : undefined;
-		ctor = ctor || arguments.callee;
-		Error.captureStackTrace(this, ctor);
-	}
-}
-
-mod_util.inherits(VError, Error);
-VError.prototype.name = 'VError';
-
-VError.prototype.toString = function ve_toString()
-{
-	var str = (this.hasOwnProperty('name') && this.name ||
-		this.constructor.name || this.constructor.prototype.name);
-	if (this.message)
-		str += ': ' + this.message;
-
-	return (str);
-};
-
-VError.prototype.cause = function ve_cause()
-{
-	return (this.jse_cause);
-};
-
-
-/*
- * Represents a collection of errors for the purpose of consumers that generally
- * only deal with one error.  Callers can extract the individual errors
- * contained in this object, but may also just treat it as a normal single
- * error, in which case a summary message will be printed.
- */
-function MultiError(errors)
-{
-	mod_assert.ok(errors.length > 0);
-	this.ase_errors = errors;
-
-	VError.call(this, errors[0], 'first of %d error%s',
-	    errors.length, errors.length == 1 ? '' : 's');
-}
-
-mod_util.inherits(MultiError, VError);
-
-
-
-/*
- * Like JavaScript's built-in Error class, but supports a "cause" argument which
- * is wrapped, not "folded in" as with VError.	Accepts a printf-style message.
- * The cause argument can be null.
- */
-function WError(options)
-{
-	Error.call(this);
-
-	var args, cause, ctor;
-	if (typeof (options) === 'object') {
-		args = Array.prototype.slice.call(arguments, 1);
-	} else {
-		args = Array.prototype.slice.call(arguments, 0);
-		options = undefined;
-	}
-
-	if (args.length > 0) {
-		this.message = mod_extsprintf.sprintf.apply(null, args);
-	} else {
-		this.message = '';
-	}
-
-	if (options) {
-		if (options instanceof Error) {
-			cause = options;
-		} else {
-			cause = options.cause;
-			ctor = options.constructorOpt;
-		}
-	}
-
-	Error.captureStackTrace(this, ctor || this.constructor);
-	if (cause)
-		this.cause(cause);
-
-}
-
-mod_util.inherits(WError, Error);
-WError.prototype.name = 'WError';
-
-
-WError.prototype.toString = function we_toString()
-{
-	var str = (this.hasOwnProperty('name') && this.name ||
-		this.constructor.name || this.constructor.prototype.name);
-	if (this.message)
-		str += ': ' + this.message;
-	if (this.we_cause && this.we_cause.message)
-		str += '; caused by ' + this.we_cause.toString();
-
-	return (str);
-};
-
-WError.prototype.cause = function we_cause(c)
-{
-	if (c instanceof Error)
-		this.we_cause = c;
-
-	return (this.we_cause);
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/package.json
deleted file mode 100644
index c20dff78455ef038da4dfc193171594428ef1b44..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/package.json
+++ /dev/null
@@ -1,52 +0,0 @@
-{
-  "_from": "verror@1.3.6",
-  "_id": "verror@1.3.6",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/jsprim/verror",
-  "_npmUser": {
-    "email": "dap@cs.brown.edu",
-    "name": "dap"
-  },
-  "_npmVersion": "1.1.65",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature/jsprim"
-  ],
-  "_resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz",
-  "_shasum": "cff5df12946d297d2baaefaa2689e25be01c005c",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/davepacheco/node-verror/issues"
-  },
-  "dependencies": {
-    "extsprintf": "1.0.2"
-  },
-  "description": "richer JavaScript errors",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "cff5df12946d297d2baaefaa2689e25be01c005c",
-    "tarball": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz"
-  },
-  "engines": [
-    "node >=0.6.0"
-  ],
-  "homepage": "https://github.com/davepacheco/node-verror#readme",
-  "main": "./lib/verror.js",
-  "maintainers": [
-    {
-      "name": "dap",
-      "email": "dap@cs.brown.edu"
-    }
-  ],
-  "name": "verror",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/davepacheco/node-verror.git"
-  },
-  "scripts": {
-    "test": "make test"
-  },
-  "version": "1.3.6"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/tests/tst.inherit.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/tests/tst.inherit.js
deleted file mode 100644
index 0f0d70b5f639ed07c16ef7c6e0b846dd0398346e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/tests/tst.inherit.js
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * tst.inherit.js: test that inheriting from VError and WError work as expected.
- */
-
-var mod_assert = require('assert');
-var mod_util = require('util');
-
-var mod_verror = require('../lib/verror');
-
-var VError = mod_verror.VError;
-var WError = mod_verror.WError;
-var err, suberr;
-
-function VErrorChild()
-{
-	VError.apply(this, Array.prototype.slice.call(arguments));
-}
-
-mod_util.inherits(VErrorChild, VError);
-VErrorChild.prototype.name = 'VErrorChild';
-
-
-function WErrorChild()
-{
-	WError.apply(this, Array.prototype.slice.call(arguments));
-}
-
-mod_util.inherits(WErrorChild, WError);
-WErrorChild.prototype.name = 'WErrorChild';
-
-
-suberr = new Error('root cause');
-err = new VErrorChild(suberr, 'top');
-mod_assert.ok(err instanceof Error);
-mod_assert.ok(err instanceof VError);
-mod_assert.ok(err instanceof VErrorChild);
-mod_assert.equal(err.cause(), suberr);
-mod_assert.equal(err.message, 'top: root cause');
-mod_assert.equal(err.toString(), 'VErrorChild: top: root cause');
-mod_assert.equal(err.stack.split('\n')[0], 'VErrorChild: top: root cause');
-
-suberr = new Error('root cause');
-err = new WErrorChild(suberr, 'top');
-mod_assert.ok(err instanceof Error);
-mod_assert.ok(err instanceof WError);
-mod_assert.ok(err instanceof WErrorChild);
-mod_assert.equal(err.cause(), suberr);
-mod_assert.equal(err.message, 'top');
-mod_assert.equal(err.toString(),
-	'WErrorChild: top; caused by Error: root cause');
-mod_assert.equal(err.stack.split('\n')[0],
-	'WErrorChild: top; caused by Error: root cause');
-
-
-// Test that `<Ctor>.toString()` uses the ctor name. I.e. setting
-// `<Ctor>.prototype.name` isn't necessary.
-function VErrorChildNoName() {
-	VError.apply(this, Array.prototype.slice.call(arguments));
-}
-mod_util.inherits(VErrorChildNoName, VError);
-err = new VErrorChildNoName('top');
-mod_assert.equal(err.toString(), 'VErrorChildNoName: top');
-
-function WErrorChildNoName() {
-	WError.apply(this, Array.prototype.slice.call(arguments));
-}
-mod_util.inherits(WErrorChildNoName, WError);
-err = new WErrorChildNoName('top');
-mod_assert.equal(err.toString(), 'WErrorChildNoName: top');
-
-
-// Test that `<Ctor>.prototype.name` can be used for the `.toString()`
-// when the ctor is anonymous.
-var VErrorChildAnon = function () {
-	VError.apply(this, Array.prototype.slice.call(arguments));
-};
-mod_util.inherits(VErrorChildAnon, VError);
-VErrorChildAnon.prototype.name = 'VErrorChildAnon';
-err = new VErrorChildAnon('top');
-mod_assert.equal(err.toString(), 'VErrorChildAnon: top');
-
-var WErrorChildAnon = function () {
-	WError.apply(this, Array.prototype.slice.call(arguments));
-};
-mod_util.inherits(WErrorChildAnon, WError);
-WErrorChildAnon.prototype.name = 'WErrorChildAnon';
-err = new WErrorChildAnon('top');
-mod_assert.equal(err.toString(), 'WErrorChildAnon: top');
-
-
-// Test get appropriate exception name in `.toString()` when reconstituting
-// an error instance a la:
-//    https://github.com/mcavage/node-fast/blob/master/lib/client.js#L215
-err = new VError('top');
-err.name = 'CustomNameError';
-mod_assert.equal(err.toString(), 'CustomNameError: top');
-
-err = new WError('top');
-err.name = 'CustomNameError';
-mod_assert.equal(err.toString(), 'CustomNameError: top');
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/tests/tst.verror.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/tests/tst.verror.js
deleted file mode 100644
index ee937cd00db53f6eca27b9dd782ed42e57be59b5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/tests/tst.verror.js
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * tst.verror.js: tests basic functionality of the VError class.
- */
-
-var mod_assert = require('assert');
-var mod_verror = require('../lib/verror');
-
-var VError = mod_verror.VError;
-var WError = mod_verror.WError;
-
-var err, suberr, stack, substack;
-
-/*
- * Remove full paths and relative line numbers from stack traces so that we can
- * compare against "known-good" output.
- */
-function cleanStack(stacktxt)
-{
-	var re = new RegExp(__filename + ':\\d+:\\d+', 'gm');
-	stacktxt = stacktxt.replace(re, 'tst.verror.js');
-	return (stacktxt);
-}
-
-/*
- * Save the generic parts of all stack traces so we can avoid hardcoding
- * Node-specific implementation details in our testing of stack traces.
- */
-var nodestack = new Error().stack.split('\n').slice(2).join('\n');
-
-/* no arguments */
-err = new VError();
-mod_assert.equal(err.name, 'VError');
-mod_assert.ok(err instanceof Error);
-mod_assert.ok(err instanceof VError);
-mod_assert.equal(err.message, '');
-mod_assert.ok(err.cause() === undefined);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'VError',
-    '    at Object.<anonymous> (tst.verror.js)'
-].join('\n') + '\n' + nodestack);
-
-/* options-argument form */
-err = new VError({});
-mod_assert.equal(err.message, '');
-mod_assert.ok(err.cause() === undefined);
-
-/* simple message */
-err = new VError('my error');
-mod_assert.equal(err.message, 'my error');
-mod_assert.ok(err.cause() === undefined);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'VError: my error',
-    '    at Object.<anonymous> (tst.verror.js)'
-].join('\n') + '\n' + nodestack);
-
-err = new VError({}, 'my error');
-mod_assert.equal(err.message, 'my error');
-mod_assert.ok(err.cause() === undefined);
-
-/* printf-style message */
-err = new VError('%s error: %3d problems', 'very bad', 15);
-mod_assert.equal(err.message, 'very bad error:  15 problems');
-mod_assert.ok(err.cause() === undefined);
-
-err = new VError({}, '%s error: %3d problems', 'very bad', 15);
-mod_assert.equal(err.message, 'very bad error:  15 problems');
-mod_assert.ok(err.cause() === undefined);
-
-/* caused by another error, with no additional message */
-suberr = new Error('root cause');
-err = new VError(suberr);
-mod_assert.equal(err.message, ': root cause');
-mod_assert.ok(err.cause() === suberr);
-
-err = new VError({ 'cause': suberr });
-mod_assert.equal(err.message, ': root cause');
-mod_assert.ok(err.cause() === suberr);
-
-/* caused by another error, with annotation */
-err = new VError(suberr, 'proximate cause: %d issues', 3);
-mod_assert.equal(err.message, 'proximate cause: 3 issues: root cause');
-mod_assert.ok(err.cause() === suberr);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'VError: proximate cause: 3 issues: root cause',
-    '    at Object.<anonymous> (tst.verror.js)'
-].join('\n') + '\n' + nodestack);
-
-err = new VError({ 'cause': suberr }, 'proximate cause: %d issues', 3);
-mod_assert.equal(err.message, 'proximate cause: 3 issues: root cause');
-mod_assert.ok(err.cause() === suberr);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'VError: proximate cause: 3 issues: root cause',
-    '    at Object.<anonymous> (tst.verror.js)'
-].join('\n') + '\n' + nodestack);
-
-/* caused by another VError, with annotation. */
-suberr = err;
-err = new VError(suberr, 'top');
-mod_assert.equal(err.message, 'top: proximate cause: 3 issues: root cause');
-mod_assert.ok(err.cause() === suberr);
-
-err = new VError({ 'cause': suberr }, 'top');
-mod_assert.equal(err.message, 'top: proximate cause: 3 issues: root cause');
-mod_assert.ok(err.cause() === suberr);
-
-/* caused by a WError */
-suberr = new WError(new Error('root cause'), 'mid');
-err = new VError(suberr, 'top');
-mod_assert.equal(err.message, 'top: mid');
-mod_assert.ok(err.cause() === suberr);
-
-/* null cause (for backwards compatibility with older versions) */
-err = new VError(null, 'my error');
-mod_assert.equal(err.message, 'my error');
-mod_assert.ok(err.cause() === undefined);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'VError: my error',
-    '    at Object.<anonymous> (tst.verror.js)'
-].join('\n') + '\n' + nodestack);
-
-err = new VError({ 'cause': null }, 'my error');
-mod_assert.equal(err.message, 'my error');
-mod_assert.ok(err.cause() === undefined);
-
-err = new VError(null);
-mod_assert.equal(err.message, '');
-mod_assert.ok(err.cause() === undefined);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'VError',
-    '    at Object.<anonymous> (tst.verror.js)'
-].join('\n') + '\n' + nodestack);
-
-/* constructorOpt */
-function makeErr(options) {
-	return (new VError(options, 'test error'));
-}
-err = makeErr({});
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'VError: test error',
-    '    at makeErr (tst.verror.js)',
-    '    at Object.<anonymous> (tst.verror.js)'
-].join('\n') + '\n' + nodestack);
-
-err = makeErr({ 'constructorOpt': makeErr });
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'VError: test error',
-    '    at Object.<anonymous> (tst.verror.js)'
-].join('\n') + '\n' + nodestack);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/tests/tst.werror.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/tests/tst.werror.js
deleted file mode 100644
index c8cdc615afaefafb097d74e392a881287d94cfaf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/node_modules/verror/tests/tst.werror.js
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * tst.werror.js: tests basic functionality of the WError class.
- */
-
-var mod_assert = require('assert');
-var mod_verror = require('../lib/verror');
-
-var VError = mod_verror.VError;
-var WError = mod_verror.WError;
-
-var err, suberr, stack, substack;
-
-/*
- * Remove full paths and relative line numbers from stack traces so that we can
- * compare against "known-good" output.
- */
-function cleanStack(stacktxt)
-{
-	var re = new RegExp(__filename + ':\\d+:\\d+', 'gm');
-	stacktxt = stacktxt.replace(re, 'tst.werror.js');
-	return (stacktxt);
-}
-
-/*
- * Save the generic parts of all stack traces so we can avoid hardcoding
- * Node-specific implementation details in our testing of stack traces.
- */
-var nodestack = new Error().stack.split('\n').slice(2).join('\n');
-
-/* no arguments */
-err = new WError();
-mod_assert.equal(err.name, 'WError');
-mod_assert.ok(err instanceof Error);
-mod_assert.ok(err instanceof WError);
-mod_assert.equal(err.message, '');
-mod_assert.equal(err.toString(), 'WError');
-mod_assert.ok(err.cause() === undefined);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'WError',
-    '    at Object.<anonymous> (tst.werror.js)'
-].join('\n') + '\n' + nodestack);
-
-/* options-argument form */
-err = new WError({});
-mod_assert.equal(err.message, '');
-mod_assert.equal(err.toString(), 'WError');
-mod_assert.ok(err.cause() === undefined);
-
-/* simple message */
-err = new WError('my error');
-mod_assert.equal(err.message, 'my error');
-mod_assert.equal(err.toString(), 'WError: my error');
-mod_assert.ok(err.cause() === undefined);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'WError: my error',
-    '    at Object.<anonymous> (tst.werror.js)'
-].join('\n') + '\n' + nodestack);
-
-err = new WError({}, 'my error');
-mod_assert.equal(err.message, 'my error');
-mod_assert.equal(err.toString(), 'WError: my error');
-mod_assert.ok(err.cause() === undefined);
-
-/* printf-style message */
-err = new WError('%s error: %3d problems', 'very bad', 15);
-mod_assert.equal(err.message, 'very bad error:  15 problems');
-mod_assert.equal(err.toString(), 'WError: very bad error:  15 problems');
-mod_assert.ok(err.cause() === undefined);
-
-err = new WError({}, '%s error: %3d problems', 'very bad', 15);
-mod_assert.equal(err.message, 'very bad error:  15 problems');
-mod_assert.equal(err.toString(), 'WError: very bad error:  15 problems');
-mod_assert.ok(err.cause() === undefined);
-
-/* caused by another error, with no additional message */
-suberr = new Error('root cause');
-err = new WError(suberr);
-mod_assert.equal(err.message, '');
-mod_assert.equal(err.toString(), 'WError; caused by Error: root cause');
-mod_assert.ok(err.cause() === suberr);
-
-err = new WError({ 'cause': suberr });
-mod_assert.equal(err.message, '');
-mod_assert.equal(err.toString(), 'WError; caused by Error: root cause');
-mod_assert.ok(err.cause() === suberr);
-
-/* caused by another error, with annotation */
-err = new WError(suberr, 'proximate cause: %d issues', 3);
-mod_assert.equal(err.message, 'proximate cause: 3 issues');
-mod_assert.equal(err.toString(), 'WError: proximate cause: 3 issues; ' +
-    'caused by Error: root cause');
-mod_assert.ok(err.cause() === suberr);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'WError: proximate cause: 3 issues; caused by Error: root cause',
-    '    at Object.<anonymous> (tst.werror.js)'
-].join('\n') + '\n' + nodestack);
-
-err = new WError({ 'cause': suberr }, 'proximate cause: %d issues', 3);
-mod_assert.equal(err.message, 'proximate cause: 3 issues');
-mod_assert.equal(err.toString(), 'WError: proximate cause: 3 issues; ' +
-    'caused by Error: root cause');
-mod_assert.ok(err.cause() === suberr);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'WError: proximate cause: 3 issues; caused by Error: root cause',
-    '    at Object.<anonymous> (tst.werror.js)'
-].join('\n') + '\n' + nodestack);
-
-/* caused by another WError, with annotation. */
-suberr = err;
-err = new WError(suberr, 'top');
-mod_assert.equal(err.message, 'top');
-mod_assert.equal(err.toString(), 'WError: top; caused by WError: ' +
-    'proximate cause: 3 issues; caused by Error: root cause');
-mod_assert.ok(err.cause() === suberr);
-
-err = new WError({ 'cause': suberr }, 'top');
-mod_assert.equal(err.message, 'top');
-mod_assert.equal(err.toString(), 'WError: top; caused by WError: ' +
-    'proximate cause: 3 issues; caused by Error: root cause');
-mod_assert.ok(err.cause() === suberr);
-
-/* caused by a VError */
-suberr = new VError(new Error('root cause'), 'mid');
-err = new WError(suberr, 'top');
-mod_assert.equal(err.message, 'top');
-mod_assert.equal(err.toString(),
-    'WError: top; caused by VError: mid: root cause');
-mod_assert.ok(err.cause() === suberr);
-
-/* null cause (for backwards compatibility with older versions) */
-err = new WError(null, 'my error');
-mod_assert.equal(err.message, 'my error');
-mod_assert.equal(err.toString(), 'WError: my error');
-mod_assert.ok(err.cause() === undefined);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'WError: my error',
-    '    at Object.<anonymous> (tst.werror.js)'
-].join('\n') + '\n' + nodestack);
-
-err = new WError({ 'cause': null }, 'my error');
-mod_assert.equal(err.message, 'my error');
-mod_assert.equal(err.toString(), 'WError: my error');
-mod_assert.ok(err.cause() === undefined);
-
-err = new WError(null);
-mod_assert.equal(err.message, '');
-mod_assert.equal(err.toString(), 'WError');
-mod_assert.ok(err.cause() === undefined);
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'WError',
-    '    at Object.<anonymous> (tst.werror.js)'
-].join('\n') + '\n' + nodestack);
-
-/* constructorOpt */
-function makeErr(options) {
-	return (new WError(options, 'test error'));
-}
-err = makeErr({});
-mod_assert.equal(err.toString(), 'WError: test error');
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'WError: test error',
-    '    at makeErr (tst.werror.js)',
-    '    at Object.<anonymous> (tst.werror.js)'
-].join('\n') + '\n' + nodestack);
-
-err = makeErr({ 'constructorOpt': makeErr });
-mod_assert.equal(err.toString(), 'WError: test error');
-stack = cleanStack(err.stack);
-mod_assert.equal(stack, [
-    'WError: test error',
-    '    at Object.<anonymous> (tst.werror.js)'
-].join('\n') + '\n' + nodestack);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/package.json
deleted file mode 100644
index 8725a58d35062edf0cc8c55d33e45614030e41a5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/jsprim/package.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
-  "_from": "jsprim@>=1.2.2 <2.0.0",
-  "_id": "jsprim@1.3.0",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/jsprim",
-  "_nodeVersion": "0.12.7",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/jsprim-1.3.0.tgz_1466708163640_0.5282344303559512"
-  },
-  "_npmUser": {
-    "email": "dap@cs.brown.edu",
-    "name": "dap"
-  },
-  "_npmVersion": "2.11.3",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature"
-  ],
-  "_resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz",
-  "_shasum": "ce2e1bef835204b4f3099928c602f8b6ae615650",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/davepacheco/node-jsprim/issues"
-  },
-  "dependencies": {
-    "extsprintf": "1.0.2",
-    "json-schema": "0.2.2",
-    "verror": "1.3.6"
-  },
-  "description": "utilities for primitive JavaScript types",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "ce2e1bef835204b4f3099928c602f8b6ae615650",
-    "tarball": "https://registry.npmjs.org/jsprim/-/jsprim-1.3.0.tgz"
-  },
-  "engines": [
-    "node >=0.6.0"
-  ],
-  "gitHead": "694edcb22e2291c21f6c2a23907bf02e1edbfdf4",
-  "homepage": "https://github.com/davepacheco/node-jsprim#readme",
-  "license": "MIT",
-  "main": "./lib/jsprim.js",
-  "maintainers": [
-    {
-      "name": "dap",
-      "email": "dap@cs.brown.edu"
-    }
-  ],
-  "name": "jsprim",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/davepacheco/node-jsprim.git"
-  },
-  "scripts": {},
-  "version": "1.3.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/.npmignore
deleted file mode 100644
index 8000b595bb4e275614b722c506ae37edcde35559..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/.npmignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.gitmodules
-deps
-docs
-Makefile
-node_modules
-test
-tools
-coverage
-man/src
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/.travis.yml
deleted file mode 100644
index c3394c258fc2aac5d0b10958e57c4804bd7038ba..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/.travis.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-language: node_js
-node_js:
-  - "5.10"
-  - "4.4"
-  - "4.1"
-  - "0.12"
-  - "0.10"
-before_install:
-  - "make check"
-after_success:
-  - '[ "${TRAVIS_NODE_VERSION}" = "4.4" ] && make codecovio'
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/LICENSE
deleted file mode 100644
index f6d947d2f61c41777fb3bbb66334a93122bf5fdc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright Joyent, Inc. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/README.md
deleted file mode 100644
index d0fa88dfa29c15c6dd1fb3a7a4a5cf6a6a00a3ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/README.md
+++ /dev/null
@@ -1,455 +0,0 @@
-sshpk
-=========
-
-Parse, convert, fingerprint and use SSH keys (both public and private) in pure
-node -- no `ssh-keygen` or other external dependencies.
-
-Supports RSA, DSA, ECDSA (nistp-\*) and ED25519 key types, in PEM (PKCS#1, 
-PKCS#8) and OpenSSH formats.
-
-This library has been extracted from
-[`node-http-signature`](https://github.com/joyent/node-http-signature)
-(work by [Mark Cavage](https://github.com/mcavage) and
-[Dave Eddy](https://github.com/bahamas10)) and
-[`node-ssh-fingerprint`](https://github.com/bahamas10/node-ssh-fingerprint)
-(work by Dave Eddy), with additions (including ECDSA support) by
-[Alex Wilson](https://github.com/arekinath).
-
-Install
--------
-
-```
-npm install sshpk
-```
-
-Examples
---------
-
-```js
-var sshpk = require('sshpk');
-
-var fs = require('fs');
-
-/* Read in an OpenSSH-format public key */
-var keyPub = fs.readFileSync('id_rsa.pub');
-var key = sshpk.parseKey(keyPub, 'ssh');
-
-/* Get metadata about the key */
-console.log('type => %s', key.type);
-console.log('size => %d bits', key.size);
-console.log('comment => %s', key.comment);
-
-/* Compute key fingerprints, in new OpenSSH (>6.7) format, and old MD5 */
-console.log('fingerprint => %s', key.fingerprint().toString());
-console.log('old-style fingerprint => %s', key.fingerprint('md5').toString());
-```
-
-Example output:
-
-```
-type => rsa
-size => 2048 bits
-comment => foo@foo.com
-fingerprint => SHA256:PYC9kPVC6J873CSIbfp0LwYeczP/W4ffObNCuDJ1u5w
-old-style fingerprint => a0:c8:ad:6c:32:9a:32:fa:59:cc:a9:8c:0a:0d:6e:bd
-```
-
-More examples: converting between formats:
-
-```js
-/* Read in a PEM public key */
-var keyPem = fs.readFileSync('id_rsa.pem');
-var key = sshpk.parseKey(keyPem, 'pem');
-
-/* Convert to PEM PKCS#8 public key format */
-var pemBuf = key.toBuffer('pkcs8');
-
-/* Convert to SSH public key format (and return as a string) */
-var sshKey = key.toString('ssh');
-```
-
-Signing and verifying:
-
-```js
-/* Read in an OpenSSH/PEM *private* key */
-var keyPriv = fs.readFileSync('id_ecdsa');
-var key = sshpk.parsePrivateKey(keyPriv, 'pem');
-
-var data = 'some data';
-
-/* Sign some data with the key */
-var s = key.createSign('sha1');
-s.update(data);
-var signature = s.sign();
-
-/* Now load the public key (could also use just key.toPublic()) */
-var keyPub = fs.readFileSync('id_ecdsa.pub');
-key = sshpk.parseKey(keyPub, 'ssh');
-
-/* Make a crypto.Verifier with this key */
-var v = key.createVerify('sha1');
-v.update(data);
-var valid = v.verify(signature);
-/* => true! */
-```
-
-Matching fingerprints with keys:
-
-```js
-var fp = sshpk.parseFingerprint('SHA256:PYC9kPVC6J873CSIbfp0LwYeczP/W4ffObNCuDJ1u5w');
-
-var keys = [sshpk.parseKey(...), sshpk.parseKey(...), ...];
-
-keys.forEach(function (key) {
-	if (fp.matches(key))
-		console.log('found it!');
-});
-```
-
-Usage
------
-
-## Public keys
-
-### `parseKey(data[, format = 'auto'[, options]])`
-
-Parses a key from a given data format and returns a new `Key` object.
-
-Parameters
-
-- `data` -- Either a Buffer or String, containing the key
-- `format` -- String name of format to use, valid options are:
-  - `auto`: choose automatically from all below
-  - `pem`: supports both PKCS#1 and PKCS#8
-  - `ssh`: standard OpenSSH format,
-  - `pkcs1`, `pkcs8`: variants of `pem`
-  - `rfc4253`: raw OpenSSH wire format
-  - `openssh`: new post-OpenSSH 6.5 internal format, produced by 
-               `ssh-keygen -o`
-- `options` -- Optional Object, extra options, with keys:
-  - `filename` -- Optional String, name for the key being parsed 
-                  (eg. the filename that was opened). Used to generate
-                  Error messages
-  - `passphrase` -- Optional String, encryption passphrase used to decrypt an
-                    encrypted PEM file
-
-### `Key.isKey(obj)`
-
-Returns `true` if the given object is a valid `Key` object created by a version
-of `sshpk` compatible with this one.
-
-Parameters
-
-- `obj` -- Object to identify
-
-### `Key#type`
-
-String, the type of key. Valid options are `rsa`, `dsa`, `ecdsa`.
-
-### `Key#size`
-
-Integer, "size" of the key in bits. For RSA/DSA this is the size of the modulus;
-for ECDSA this is the bit size of the curve in use.
-
-### `Key#comment`
-
-Optional string, a key comment used by some formats (eg the `ssh` format).
-
-### `Key#curve`
-
-Only present if `this.type === 'ecdsa'`, string containing the name of the
-named curve used with this key. Possible values include `nistp256`, `nistp384`
-and `nistp521`.
-
-### `Key#toBuffer([format = 'ssh'])`
-
-Convert the key into a given data format and return the serialized key as
-a Buffer.
-
-Parameters
-
-- `format` -- String name of format to use, for valid options see `parseKey()`
-
-### `Key#toString([format = 'ssh])`
-
-Same as `this.toBuffer(format).toString()`.
-
-### `Key#fingerprint([algorithm = 'sha256'])`
-
-Creates a new `Fingerprint` object representing this Key's fingerprint.
-
-Parameters
-
-- `algorithm` -- String name of hash algorithm to use, valid options are `md5`,
-                 `sha1`, `sha256`, `sha384`, `sha512`
-
-### `Key#createVerify([hashAlgorithm])`
-
-Creates a `crypto.Verifier` specialized to use this Key (and the correct public
-key algorithm to match it). The returned Verifier has the same API as a regular
-one, except that the `verify()` function takes only the target signature as an
-argument.
-
-Parameters
-
-- `hashAlgorithm` -- optional String name of hash algorithm to use, any
-                     supported by OpenSSL are valid, usually including
-                     `sha1`, `sha256`.
-
-`v.verify(signature[, format])` Parameters
-
-- `signature` -- either a Signature object, or a Buffer or String
-- `format` -- optional String, name of format to interpret given String with.
-              Not valid if `signature` is a Signature or Buffer.
-
-### `Key#createDiffieHellman()`
-### `Key#createDH()`
-
-Creates a Diffie-Hellman key exchange object initialized with this key and all
-necessary parameters. This has the same API as a `crypto.DiffieHellman`
-instance, except that functions take `Key` and `PrivateKey` objects as
-arguments, and return them where indicated for.
-
-This is only valid for keys belonging to a cryptosystem that supports DHE
-or a close analogue (i.e. `dsa`, `ecdsa` and `curve25519` keys). An attempt
-to call this function on other keys will yield an `Error`.
-
-## Private keys
-
-### `parsePrivateKey(data[, format = 'auto'[, options]])`
-
-Parses a private key from a given data format and returns a new
-`PrivateKey` object.
-
-Parameters
-
-- `data` -- Either a Buffer or String, containing the key
-- `format` -- String name of format to use, valid options are:
-  - `auto`: choose automatically from all below
-  - `pem`: supports both PKCS#1 and PKCS#8
-  - `ssh`, `openssh`: new post-OpenSSH 6.5 internal format, produced by 
-                      `ssh-keygen -o`
-  - `pkcs1`, `pkcs8`: variants of `pem`
-  - `rfc4253`: raw OpenSSH wire format
-- `options` -- Optional Object, extra options, with keys:
-  - `filename` -- Optional String, name for the key being parsed 
-                  (eg. the filename that was opened). Used to generate
-                  Error messages
-  - `passphrase` -- Optional String, encryption passphrase used to decrypt an
-                    encrypted PEM file
-
-### `PrivateKey.isPrivateKey(obj)`
-
-Returns `true` if the given object is a valid `PrivateKey` object created by a
-version of `sshpk` compatible with this one.
-
-Parameters
-
-- `obj` -- Object to identify
-
-### `PrivateKey#type`
-
-String, the type of key. Valid options are `rsa`, `dsa`, `ecdsa`.
-
-### `PrivateKey#size`
-
-Integer, "size" of the key in bits. For RSA/DSA this is the size of the modulus;
-for ECDSA this is the bit size of the curve in use.
-
-### `PrivateKey#curve`
-
-Only present if `this.type === 'ecdsa'`, string containing the name of the
-named curve used with this key. Possible values include `nistp256`, `nistp384`
-and `nistp521`.
-
-### `PrivateKey#toBuffer([format = 'pkcs1'])`
-
-Convert the key into a given data format and return the serialized key as
-a Buffer.
-
-Parameters
-
-- `format` -- String name of format to use, valid options are listed under 
-              `parsePrivateKey`. Note that ED25519 keys default to `openssh`
-              format instead (as they have no `pkcs1` representation).
-
-### `PrivateKey#toString([format = 'pkcs1'])`
-
-Same as `this.toBuffer(format).toString()`.
-
-### `PrivateKey#toPublic()`
-
-Extract just the public part of this private key, and return it as a `Key`
-object.
-
-### `PrivateKey#fingerprint([algorithm = 'sha256'])`
-
-Same as `this.toPublic().fingerprint()`.
-
-### `PrivateKey#createVerify([hashAlgorithm])`
-
-Same as `this.toPublic().createVerify()`.
-
-### `PrivateKey#createSign([hashAlgorithm])`
-
-Creates a `crypto.Sign` specialized to use this PrivateKey (and the correct
-key algorithm to match it). The returned Signer has the same API as a regular
-one, except that the `sign()` function takes no arguments, and returns a
-`Signature` object.
-
-Parameters
-
-- `hashAlgorithm` -- optional String name of hash algorithm to use, any
-                     supported by OpenSSL are valid, usually including
-                     `sha1`, `sha256`.
-
-`v.sign()` Parameters
-
-- none
-
-### `PrivateKey#derive(newType)`
-
-Derives a related key of type `newType` from this key. Currently this is
-only supported to change between `ed25519` and `curve25519` keys which are
-stored with the same private key (but usually distinct public keys in order
-to avoid degenerate keys that lead to a weak Diffie-Hellman exchange).
-
-Parameters
-
-- `newType` -- String, type of key to derive, either `ed25519` or `curve25519`
-
-## Fingerprints
-
-### `parseFingerprint(fingerprint[, algorithms])`
-
-Pre-parses a fingerprint, creating a `Fingerprint` object that can be used to
-quickly locate a key by using the `Fingerprint#matches` function.
-
-Parameters
-
-- `fingerprint` -- String, the fingerprint value, in any supported format
-- `algorithms` -- Optional list of strings, names of hash algorithms to limit
-                  support to. If `fingerprint` uses a hash algorithm not on
-                  this list, throws `InvalidAlgorithmError`.
-
-### `Fingerprint.isFingerprint(obj)`
-
-Returns `true` if the given object is a valid `Fingerprint` object created by a
-version of `sshpk` compatible with this one.
-
-Parameters
-
-- `obj` -- Object to identify
-
-### `Fingerprint#toString([format])`
-
-Returns a fingerprint as a string, in the given format.
-
-Parameters
-
-- `format` -- Optional String, format to use, valid options are `hex` and
-              `base64`. If this `Fingerprint` uses the `md5` algorithm, the
-              default format is `hex`. Otherwise, the default is `base64`.
-
-### `Fingerprint#matches(key)`
-
-Verifies whether or not this `Fingerprint` matches a given `Key`. This function
-uses double-hashing to avoid leaking timing information. Returns a boolean.
-
-Parameters
-
-- `key` -- a `Key` object, the key to match this fingerprint against
-
-## Signatures
-
-### `parseSignature(signature, algorithm, format)`
-
-Parses a signature in a given format, creating a `Signature` object. Useful
-for converting between the SSH and ASN.1 (PKCS/OpenSSL) signature formats, and
-also returned as output from `PrivateKey#createSign().sign()`.
-
-A Signature object can also be passed to a verifier produced by
-`Key#createVerify()` and it will automatically be converted internally into the
-correct format for verification.
-
-Parameters
-
-- `signature` -- a Buffer (binary) or String (base64), data of the actual
-                 signature in the given format
-- `algorithm` -- a String, name of the algorithm to be used, possible values
-                 are `rsa`, `dsa`, `ecdsa`
-- `format` -- a String, either `asn1` or `ssh`
-
-### `Signature.isSignature(obj)`
-
-Returns `true` if the given object is a valid `Signature` object created by a
-version of `sshpk` compatible with this one.
-
-Parameters
-
-- `obj` -- Object to identify
-
-### `Signature#toBuffer([format = 'asn1'])`
-
-Converts a Signature to the given format and returns it as a Buffer.
-
-Parameters
-
-- `format` -- a String, either `asn1` or `ssh`
-
-### `Signature#toString([format = 'asn1'])`
-
-Same as `this.toBuffer(format).toString('base64')`.
-
-Errors
-------
-
-### `InvalidAlgorithmError`
-
-The specified algorithm is not valid, either because it is not supported, or
-because it was not included on a list of allowed algorithms.
-
-Thrown by `Fingerprint.parse`, `Key#fingerprint`.
-
-Properties
-
-- `algorithm` -- the algorithm that could not be validated
-
-### `FingerprintFormatError`
-
-The fingerprint string given could not be parsed as a supported fingerprint
-format, or the specified fingerprint format is invalid.
-
-Thrown by `Fingerprint.parse`, `Fingerprint#toString`.
-
-Properties
-
-- `fingerprint` -- if caused by a fingerprint, the string value given
-- `format` -- if caused by an invalid format specification, the string value given
-
-### `KeyParseError`
-
-The key data given could not be parsed as a valid key.
-
-Properties
-
-- `keyName` -- `filename` that was given to `Key#parse`
-- `format` -- the `format` that was trying to parse the key
-- `innerErr` -- the inner Error thrown by the format parser
-
-### `KeyEncryptedError`
-
-The key is encrypted with a symmetric key (ie, it is password protected). The
-parsing operation would succeed if it was given the `passphrase` option.
-
-Properties
-
-- `keyName` -- `filename` that was given to `Key#parse`
-- `format` -- the `format` that was trying to parse the key (currently can only
-              be `"pem"`)
-
-Friends of sshpk
-----------------
-
- * [`sshpk-agent`](https://github.com/arekinath/node-sshpk-agent) is a library
-   for speaking the `ssh-agent` protocol from node.js, which uses `sshpk`
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-conv b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-conv
deleted file mode 100755
index a1205a45d5431ff9ff7cef1124b4f62aa129b97f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-conv
+++ /dev/null
@@ -1,195 +0,0 @@
-#!/usr/bin/env node
-// -*- mode: js -*-
-// vim: set filetype=javascript :
-// Copyright 2015 Joyent, Inc.  All rights reserved.
-
-var dashdash = require('dashdash');
-var sshpk = require('../lib/index');
-var fs = require('fs');
-var path = require('path');
-var tty = require('tty');
-var readline = require('readline');
-var getPassword = require('getpass').getPass;
-
-var options = [
-	{
-		names: ['outformat', 't'],
-		type: 'string',
-		help: 'Output format'
-	},
-	{
-		names: ['informat', 'T'],
-		type: 'string',
-		help: 'Input format'
-	},
-	{
-		names: ['file', 'f'],
-		type: 'string',
-		help: 'Input file name (default stdin)'
-	},
-	{
-		names: ['out', 'o'],
-		type: 'string',
-		help: 'Output file name (default stdout)'
-	},
-	{
-		names: ['private', 'p'],
-		type: 'bool',
-		help: 'Produce a private key as output'
-	},
-	{
-		names: ['derive', 'd'],
-		type: 'string',
-		help: 'Output a new key derived from this one, with given algo'
-	},
-	{
-		names: ['identify', 'i'],
-		type: 'bool',
-		help: 'Print key metadata instead of converting'
-	},
-	{
-		names: ['comment', 'c'],
-		type: 'string',
-		help: 'Set key comment, if output format supports'
-	},
-	{
-		names: ['help', 'h'],
-		type: 'bool',
-		help: 'Shows this help text'
-	}
-];
-
-if (require.main === module) {
-	var parser = dashdash.createParser({
-		options: options
-	});
-
-	try {
-		var opts = parser.parse(process.argv);
-	} catch (e) {
-		console.error('sshpk-conv: error: %s', e.message);
-		process.exit(1);
-	}
-
-	if (opts.help || opts._args.length > 1) {
-		var help = parser.help({}).trimRight();
-		console.error('sshpk-conv: converts between SSH key formats\n');
-		console.error(help);
-		console.error('\navailable formats:');
-		console.error('  - pem, pkcs1     eg id_rsa');
-		console.error('  - ssh            eg id_rsa.pub');
-		console.error('  - pkcs8          format you want for openssl');
-		console.error('  - openssh        like output of ssh-keygen -o');
-		console.error('  - rfc4253        raw OpenSSH wire format');
-		process.exit(1);
-	}
-
-	/*
-	 * Key derivation can only be done on private keys, so use of the -d
-	 * option necessarily implies -p.
-	 */
-	if (opts.derive)
-		opts.private = true;
-
-	var inFile = process.stdin;
-	var inFileName = 'stdin';
-
-	var inFilePath;
-	if (opts.file) {
-		inFilePath = opts.file;
-	} else if (opts._args.length === 1) {
-		inFilePath = opts._args[0];
-	}
-
-	if (inFilePath)
-		inFileName = path.basename(inFilePath);
-
-	try {
-		if (inFilePath) {
-			fs.accessSync(inFilePath, fs.R_OK);
-			inFile = fs.createReadStream(inFilePath);
-		}
-	} catch (e) {
-		console.error('sshpk-conv: error opening input file' +
-		     ': ' + e.name + ': ' + e.message);
-		process.exit(1);
-	}
-
-	var outFile = process.stdout;
-
-	try {
-		if (opts.out && !opts.identify) {
-			fs.accessSync(path.dirname(opts.out), fs.W_OK);
-			outFile = fs.createWriteStream(opts.out);
-		}
-	} catch (e) {
-		console.error('sshpk-conv: error opening output file' +
-		    ': ' + e.name + ': ' + e.message);
-		process.exit(1);
-	}
-
-	var bufs = [];
-	inFile.on('readable', function () {
-		var data;
-		while ((data = inFile.read()))
-			bufs.push(data);
-	});
-	var parseOpts = {};
-	parseOpts.filename = inFileName;
-	inFile.on('end', function processKey() {
-		var buf = Buffer.concat(bufs);
-		var fmt = 'auto';
-		if (opts.informat)
-			fmt = opts.informat;
-		var f = sshpk.parseKey;
-		if (opts.private)
-			f = sshpk.parsePrivateKey;
-		try {
-			var key = f(buf, fmt, parseOpts);
-		} catch (e) {
-			if (e.name === 'KeyEncryptedError') {
-				getPassword(function (err, pw) {
-					parseOpts.passphrase = pw;
-					processKey();
-				});
-				return;
-			}
-			console.error('sshpk-conv: ' +
-			    e.name + ': ' + e.message);
-			process.exit(1);
-		}
-
-		if (opts.derive)
-			key = key.derive(opts.derive);
-
-		if (opts.comment)
-			key.comment = opts.comment;
-
-		if (!opts.identify) {
-			fmt = undefined;
-			if (opts.outformat)
-				fmt = opts.outformat;
-			outFile.write(key.toBuffer(fmt));
-			if (fmt === 'ssh' ||
-			    (!opts.private && fmt === undefined))
-				outFile.write('\n');
-			outFile.once('drain', function () {
-				process.exit(0);
-			});
-		} else {
-			var kind = 'public';
-			if (sshpk.PrivateKey.isPrivateKey(key))
-				kind = 'private';
-			console.log('%s: a %d bit %s %s key', inFileName,
-			    key.size, key.type.toUpperCase(), kind);
-			if (key.type === 'ecdsa')
-				console.log('ECDSA curve: %s', key.curve);
-			if (key.comment)
-				console.log('Comment: %s', key.comment);
-			console.log('Fingerprint:');
-			console.log('  ' + key.fingerprint().toString());
-			console.log('  ' + key.fingerprint('md5').toString());
-			process.exit(0);
-		}
-	});
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-sign b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-sign
deleted file mode 100755
index 673fc9864214db61f5d7e6bcb51031aa22df9ea4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-sign
+++ /dev/null
@@ -1,191 +0,0 @@
-#!/usr/bin/env node
-// -*- mode: js -*-
-// vim: set filetype=javascript :
-// Copyright 2015 Joyent, Inc.  All rights reserved.
-
-var dashdash = require('dashdash');
-var sshpk = require('../lib/index');
-var fs = require('fs');
-var path = require('path');
-var getPassword = require('getpass').getPass;
-
-var options = [
-	{
-		names: ['hash', 'H'],
-		type: 'string',
-		help: 'Hash algorithm (sha1, sha256, sha384, sha512)'
-	},
-	{
-		names: ['verbose', 'v'],
-		type: 'bool',
-		help: 'Display verbose info about key and hash used'
-	},
-	{
-		names: ['identity', 'i'],
-		type: 'string',
-		help: 'Path to key to use'
-	},
-	{
-		names: ['file', 'f'],
-		type: 'string',
-		help: 'Input filename'
-	},
-	{
-		names: ['out', 'o'],
-		type: 'string',
-		help: 'Output filename'
-	},
-	{
-		names: ['format', 't'],
-		type: 'string',
-		help: 'Signature format (asn1, ssh, raw)'
-	},
-	{
-		names: ['binary', 'b'],
-		type: 'bool',
-		help: 'Output raw binary instead of base64'
-	},
-	{
-		names: ['help', 'h'],
-		type: 'bool',
-		help: 'Shows this help text'
-	}
-];
-
-var parseOpts = {};
-
-if (require.main === module) {
-	var parser = dashdash.createParser({
-		options: options
-	});
-
-	try {
-		var opts = parser.parse(process.argv);
-	} catch (e) {
-		console.error('sshpk-sign: error: %s', e.message);
-		process.exit(1);
-	}
-
-	if (opts.help || opts._args.length > 1) {
-		var help = parser.help({}).trimRight();
-		console.error('sshpk-sign: sign data using an SSH key\n');
-		console.error(help);
-		process.exit(1);
-	}
-
-	if (!opts.identity) {
-		var help = parser.help({}).trimRight();
-		console.error('sshpk-sign: the -i or --identity option ' +
-		    'is required\n');
-		console.error(help);
-		process.exit(1);
-	}
-
-	var keyData = fs.readFileSync(opts.identity);
-	parseOpts.filename = opts.identity;
-
-	run();
-}
-
-function run() {
-	var key;
-	try {
-		key = sshpk.parsePrivateKey(keyData, 'auto', parseOpts);
-	} catch (e) {
-		if (e.name === 'KeyEncryptedError') {
-			getPassword(function (err, pw) {
-				parseOpts.passphrase = pw;
-				run();
-			});
-			return;
-		}
-		console.error('sshpk-sign: error loading private key "' +
-		    opts.identity + '": ' + e.name + ': ' + e.message);
-		process.exit(1);
-	}
-
-	var hash = opts.hash || key.defaultHashAlgorithm();
-
-	var signer;
-	try {
-		signer = key.createSign(hash);
-	} catch (e) {
-		console.error('sshpk-sign: error creating signer: ' +
-		    e.name + ': ' + e.message);
-		process.exit(1);
-	}
-
-	if (opts.verbose) {
-		console.error('sshpk-sign: using %s-%s with a %d bit key',
-		    key.type, hash, key.size);
-	}
-
-	var inFile = process.stdin;
-	var inFileName = 'stdin';
-
-	var inFilePath;
-	if (opts.file) {
-		inFilePath = opts.file;
-	} else if (opts._args.length === 1) {
-		inFilePath = opts._args[0];
-	}
-
-	if (inFilePath)
-		inFileName = path.basename(inFilePath);
-
-	try {
-		if (inFilePath) {
-			fs.accessSync(inFilePath, fs.R_OK);
-			inFile = fs.createReadStream(inFilePath);
-		}
-	} catch (e) {
-		console.error('sshpk-sign: error opening input file' +
-		     ': ' + e.name + ': ' + e.message);
-		process.exit(1);
-	}
-
-	var outFile = process.stdout;
-
-	try {
-		if (opts.out && !opts.identify) {
-			fs.accessSync(path.dirname(opts.out), fs.W_OK);
-			outFile = fs.createWriteStream(opts.out);
-		}
-	} catch (e) {
-		console.error('sshpk-sign: error opening output file' +
-		    ': ' + e.name + ': ' + e.message);
-		process.exit(1);
-	}
-
-	inFile.pipe(signer);
-	inFile.on('end', function () {
-		var sig;
-		try {
-			sig = signer.sign();
-		} catch (e) {
-			console.error('sshpk-sign: error signing data: ' +
-			    e.name + ': ' + e.message);
-			process.exit(1);
-		}
-
-		var fmt = opts.format || 'asn1';
-		var output;
-		try {
-			output = sig.toBuffer(fmt);
-			if (!opts.binary)
-				output = output.toString('base64');
-		} catch (e) {
-			console.error('sshpk-sign: error converting signature' +
-			    ' to ' + fmt + ' format: ' + e.name + ': ' +
-			    e.message);
-			process.exit(1);
-		}
-
-		outFile.write(output);
-		if (!opts.binary)
-			outFile.write('\n');
-		outFile.once('drain', function () {
-			process.exit(0);
-		});
-	});
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-verify b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-verify
deleted file mode 100755
index a1669f409df2f7feb7f35d5cdee443bce9c77df5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/bin/sshpk-verify
+++ /dev/null
@@ -1,166 +0,0 @@
-#!/usr/bin/env node
-// -*- mode: js -*-
-// vim: set filetype=javascript :
-// Copyright 2015 Joyent, Inc.  All rights reserved.
-
-var dashdash = require('dashdash');
-var sshpk = require('../lib/index');
-var fs = require('fs');
-var path = require('path');
-
-var options = [
-	{
-		names: ['hash', 'H'],
-		type: 'string',
-		help: 'Hash algorithm (sha1, sha256, sha384, sha512)'
-	},
-	{
-		names: ['verbose', 'v'],
-		type: 'bool',
-		help: 'Display verbose info about key and hash used'
-	},
-	{
-		names: ['identity', 'i'],
-		type: 'string',
-		help: 'Path to (public) key to use'
-	},
-	{
-		names: ['file', 'f'],
-		type: 'string',
-		help: 'Input filename'
-	},
-	{
-		names: ['format', 't'],
-		type: 'string',
-		help: 'Signature format (asn1, ssh, raw)'
-	},
-	{
-		names: ['signature', 's'],
-		type: 'string',
-		help: 'base64-encoded signature data'
-	},
-	{
-		names: ['help', 'h'],
-		type: 'bool',
-		help: 'Shows this help text'
-	}
-];
-
-if (require.main === module) {
-	var parser = dashdash.createParser({
-		options: options
-	});
-
-	try {
-		var opts = parser.parse(process.argv);
-	} catch (e) {
-		console.error('sshpk-verify: error: %s', e.message);
-		process.exit(3);
-	}
-
-	if (opts.help || opts._args.length > 1) {
-		var help = parser.help({}).trimRight();
-		console.error('sshpk-verify: sign data using an SSH key\n');
-		console.error(help);
-		process.exit(3);
-	}
-
-	if (!opts.identity) {
-		var help = parser.help({}).trimRight();
-		console.error('sshpk-verify: the -i or --identity option ' +
-		    'is required\n');
-		console.error(help);
-		process.exit(3);
-	}
-
-	if (!opts.signature) {
-		var help = parser.help({}).trimRight();
-		console.error('sshpk-verify: the -s or --signature option ' +
-		    'is required\n');
-		console.error(help);
-		process.exit(3);
-	}
-
-	var keyData = fs.readFileSync(opts.identity);
-
-	var key;
-	try {
-		key = sshpk.parseKey(keyData);
-	} catch (e) {
-		console.error('sshpk-verify: error loading key "' +
-		    opts.identity + '": ' + e.name + ': ' + e.message);
-		process.exit(2);
-	}
-
-	var fmt = opts.format || 'asn1';
-	var sigData = new Buffer(opts.signature, 'base64');
-
-	var sig;
-	try {
-		sig = sshpk.parseSignature(sigData, key.type, fmt);
-	} catch (e) {
-		console.error('sshpk-verify: error parsing signature: ' +
-		    e.name + ': ' + e.message);
-		process.exit(2);
-	}
-
-	var hash = opts.hash || key.defaultHashAlgorithm();
-
-	var verifier;
-	try {
-		verifier = key.createVerify(hash);
-	} catch (e) {
-		console.error('sshpk-verify: error creating verifier: ' +
-		    e.name + ': ' + e.message);
-		process.exit(2);
-	}
-
-	if (opts.verbose) {
-		console.error('sshpk-verify: using %s-%s with a %d bit key',
-		    key.type, hash, key.size);
-	}
-
-	var inFile = process.stdin;
-	var inFileName = 'stdin';
-
-	var inFilePath;
-	if (opts.file) {
-		inFilePath = opts.file;
-	} else if (opts._args.length === 1) {
-		inFilePath = opts._args[0];
-	}
-
-	if (inFilePath)
-		inFileName = path.basename(inFilePath);
-
-	try {
-		if (inFilePath) {
-			fs.accessSync(inFilePath, fs.R_OK);
-			inFile = fs.createReadStream(inFilePath);
-		}
-	} catch (e) {
-		console.error('sshpk-verify: error opening input file' +
-		     ': ' + e.name + ': ' + e.message);
-		process.exit(2);
-	}
-
-	inFile.pipe(verifier);
-	inFile.on('end', function () {
-		var ret;
-		try {
-			ret = verifier.verify(sig);
-		} catch (e) {
-			console.error('sshpk-verify: error verifying data: ' +
-			    e.name + ': ' + e.message);
-			process.exit(1);
-		}
-
-		if (ret) {
-			console.error('OK');
-			process.exit(0);
-		}
-
-		console.error('NOT OK');
-		process.exit(1);
-	});
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/algs.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/algs.js
deleted file mode 100644
index f30af560e3672bc07838e5b2fe2a77aff84b4620..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/algs.js
+++ /dev/null
@@ -1,168 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-var algInfo = {
-	'dsa': {
-		parts: ['p', 'q', 'g', 'y'],
-		sizePart: 'p'
-	},
-	'rsa': {
-		parts: ['e', 'n'],
-		sizePart: 'n'
-	},
-	'ecdsa': {
-		parts: ['curve', 'Q'],
-		sizePart: 'Q'
-	},
-	'ed25519': {
-		parts: ['R'],
-		normalize: false,
-		sizePart: 'R'
-	}
-};
-algInfo['curve25519'] = algInfo['ed25519'];
-
-var algPrivInfo = {
-	'dsa': {
-		parts: ['p', 'q', 'g', 'y', 'x']
-	},
-	'rsa': {
-		parts: ['n', 'e', 'd', 'iqmp', 'p', 'q']
-	},
-	'ecdsa': {
-		parts: ['curve', 'Q', 'd']
-	},
-	'ed25519': {
-		parts: ['R', 'r'],
-		normalize: false
-	}
-};
-algPrivInfo['curve25519'] = algPrivInfo['ed25519'];
-
-var hashAlgs = {
-	'md5': true,
-	'sha1': true,
-	'sha256': true,
-	'sha384': true,
-	'sha512': true
-};
-
-/*
- * Taken from
- * http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf
- */
-var curves = {
-	'nistp256': {
-		size: 256,
-		pkcs8oid: '1.2.840.10045.3.1.7',
-		p: new Buffer(('00' +
-		    'ffffffff 00000001 00000000 00000000' +
-		    '00000000 ffffffff ffffffff ffffffff').
-		    replace(/ /g, ''), 'hex'),
-		a: new Buffer(('00' +
-		    'FFFFFFFF 00000001 00000000 00000000' +
-		    '00000000 FFFFFFFF FFFFFFFF FFFFFFFC').
-		    replace(/ /g, ''), 'hex'),
-		b: new Buffer((
-		    '5ac635d8 aa3a93e7 b3ebbd55 769886bc' +
-		    '651d06b0 cc53b0f6 3bce3c3e 27d2604b').
-		    replace(/ /g, ''), 'hex'),
-		s: new Buffer(('00' +
-		    'c49d3608 86e70493 6a6678e1 139d26b7' +
-		    '819f7e90').
-		    replace(/ /g, ''), 'hex'),
-		n: new Buffer(('00' +
-		    'ffffffff 00000000 ffffffff ffffffff' +
-		    'bce6faad a7179e84 f3b9cac2 fc632551').
-		    replace(/ /g, ''), 'hex'),
-		G: new Buffer(('04' +
-		    '6b17d1f2 e12c4247 f8bce6e5 63a440f2' +
-		    '77037d81 2deb33a0 f4a13945 d898c296' +
-		    '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' +
-		    '2bce3357 6b315ece cbb64068 37bf51f5').
-		    replace(/ /g, ''), 'hex')
-	},
-	'nistp384': {
-		size: 384,
-		pkcs8oid: '1.3.132.0.34',
-		p: new Buffer(('00' +
-		    'ffffffff ffffffff ffffffff ffffffff' +
-		    'ffffffff ffffffff ffffffff fffffffe' +
-		    'ffffffff 00000000 00000000 ffffffff').
-		    replace(/ /g, ''), 'hex'),
-		a: new Buffer(('00' +
-		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
-		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' +
-		    'FFFFFFFF 00000000 00000000 FFFFFFFC').
-		    replace(/ /g, ''), 'hex'),
-		b: new Buffer((
-		    'b3312fa7 e23ee7e4 988e056b e3f82d19' +
-		    '181d9c6e fe814112 0314088f 5013875a' +
-		    'c656398d 8a2ed19d 2a85c8ed d3ec2aef').
-		    replace(/ /g, ''), 'hex'),
-		s: new Buffer(('00' +
-		    'a335926a a319a27a 1d00896a 6773a482' +
-		    '7acdac73').
-		    replace(/ /g, ''), 'hex'),
-		n: new Buffer(('00' +
-		    'ffffffff ffffffff ffffffff ffffffff' +
-		    'ffffffff ffffffff c7634d81 f4372ddf' +
-		    '581a0db2 48b0a77a ecec196a ccc52973').
-		    replace(/ /g, ''), 'hex'),
-		G: new Buffer(('04' +
-		    'aa87ca22 be8b0537 8eb1c71e f320ad74' +
-		    '6e1d3b62 8ba79b98 59f741e0 82542a38' +
-		    '5502f25d bf55296c 3a545e38 72760ab7' +
-		    '3617de4a 96262c6f 5d9e98bf 9292dc29' +
-		    'f8f41dbd 289a147c e9da3113 b5f0b8c0' +
-		    '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f').
-		    replace(/ /g, ''), 'hex')
-	},
-	'nistp521': {
-		size: 521,
-		pkcs8oid: '1.3.132.0.35',
-		p: new Buffer((
-		    '01ffffff ffffffff ffffffff ffffffff' +
-		    'ffffffff ffffffff ffffffff ffffffff' +
-		    'ffffffff ffffffff ffffffff ffffffff' +
-		    'ffffffff ffffffff ffffffff ffffffff' +
-		    'ffff').replace(/ /g, ''), 'hex'),
-		a: new Buffer(('01FF' +
-		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
-		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
-		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +
-		    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC').
-		    replace(/ /g, ''), 'hex'),
-		b: new Buffer(('51' +
-		    '953eb961 8e1c9a1f 929a21a0 b68540ee' +
-		    'a2da725b 99b315f3 b8b48991 8ef109e1' +
-		    '56193951 ec7e937b 1652c0bd 3bb1bf07' +
-		    '3573df88 3d2c34f1 ef451fd4 6b503f00').
-		    replace(/ /g, ''), 'hex'),
-		s: new Buffer(('00' +
-		    'd09e8800 291cb853 96cc6717 393284aa' +
-		    'a0da64ba').replace(/ /g, ''), 'hex'),
-		n: new Buffer(('01ff' +
-		    'ffffffff ffffffff ffffffff ffffffff' +
-		    'ffffffff ffffffff ffffffff fffffffa' +
-		    '51868783 bf2f966b 7fcc0148 f709a5d0' +
-		    '3bb5c9b8 899c47ae bb6fb71e 91386409').
-		    replace(/ /g, ''), 'hex'),
-		G: new Buffer(('04' +
-		    '00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' +
-		         '9c648139 053fb521 f828af60 6b4d3dba' +
-		         'a14b5e77 efe75928 fe1dc127 a2ffa8de' +
-		         '3348b3c1 856a429b f97e7e31 c2e5bd66' +
-		    '0118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9' +
-		         '98f54449 579b4468 17afbd17 273e662c' +
-		         '97ee7299 5ef42640 c550b901 3fad0761' +
-		         '353c7086 a272c240 88be9476 9fd16650').
-		    replace(/ /g, ''), 'hex')
-	}
-};
-
-module.exports = {
-	info: algInfo,
-	privInfo: algPrivInfo,
-	hashAlgs: hashAlgs,
-	curves: curves
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/dhe.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/dhe.js
deleted file mode 100644
index 8f9548ce576a257bbdeb6814909e8bc4e2ecfcc4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/dhe.js
+++ /dev/null
@@ -1,311 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = DiffieHellman;
-
-var assert = require('assert-plus');
-var crypto = require('crypto');
-var algs = require('./algs');
-var utils = require('./utils');
-var ed;
-
-var Key = require('./key');
-var PrivateKey = require('./private-key');
-
-var CRYPTO_HAVE_ECDH = (crypto.createECDH !== undefined);
-
-var ecdh, ec, jsbn;
-
-function DiffieHellman(key) {
-	utils.assertCompatible(key, Key, [1, 4], 'key');
-	this._isPriv = PrivateKey.isPrivateKey(key, [1, 3]);
-	this._algo = key.type;
-	this._curve = key.curve;
-	this._key = key;
-	if (key.type === 'dsa') {
-		if (!CRYPTO_HAVE_ECDH) {
-			throw (new Error('Due to bugs in the node 0.10 ' +
-			    'crypto API, node 0.12.x or later is required ' +
-			    'to use DH'));
-		}
-		this._dh = crypto.createDiffieHellman(
-		    key.part.p.data, undefined,
-		    key.part.g.data, undefined);
-		this._p = key.part.p;
-		this._g = key.part.g;
-		if (this._isPriv)
-			this._dh.setPrivateKey(key.part.x.data);
-		this._dh.setPublicKey(key.part.y.data);
-
-	} else if (key.type === 'ecdsa') {
-		if (!CRYPTO_HAVE_ECDH) {
-			if (ecdh === undefined)
-				ecdh = require('ecc-jsbn');
-			if (ec === undefined)
-				ec = require('ecc-jsbn/lib/ec');
-			if (jsbn === undefined)
-				jsbn = require('jsbn').BigInteger;
-
-			this._ecParams = new X9ECParameters(this._curve);
-
-			if (this._isPriv) {
-				this._priv = new ECPrivate(
-				    this._ecParams, key.part.d.data);
-			}
-			return;
-		}
-
-		var curve = {
-			'nistp256': 'prime256v1',
-			'nistp384': 'secp384r1',
-			'nistp521': 'secp521r1'
-		}[key.curve];
-		this._dh = crypto.createECDH(curve);
-		if (typeof (this._dh) !== 'object' ||
-		    typeof (this._dh.setPrivateKey) !== 'function') {
-			CRYPTO_HAVE_ECDH = false;
-			DiffieHellman.call(this, key);
-			return;
-		}
-		if (this._isPriv)
-			this._dh.setPrivateKey(key.part.d.data);
-		this._dh.setPublicKey(key.part.Q.data);
-
-	} else if (key.type === 'curve25519') {
-		if (ed === undefined)
-			ed = require('jodid25519');
-
-		if (this._isPriv) {
-			this._priv = key.part.r.data;
-			if (this._priv[0] === 0x00)
-				this._priv = this._priv.slice(1);
-			this._priv = this._priv.slice(0, 32);
-		}
-
-	} else {
-		throw (new Error('DH not supported for ' + key.type + ' keys'));
-	}
-}
-
-DiffieHellman.prototype.getPublicKey = function () {
-	if (this._isPriv)
-		return (this._key.toPublic());
-	return (this._key);
-};
-
-DiffieHellman.prototype.getPrivateKey = function () {
-	if (this._isPriv)
-		return (this._key);
-	else
-		return (undefined);
-};
-DiffieHellman.prototype.getKey = DiffieHellman.prototype.getPrivateKey;
-
-DiffieHellman.prototype._keyCheck = function (pk, isPub) {
-	assert.object(pk, 'key');
-	if (!isPub)
-		utils.assertCompatible(pk, PrivateKey, [1, 3], 'key');
-	utils.assertCompatible(pk, Key, [1, 4], 'key');
-
-	if (pk.type !== this._algo) {
-		throw (new Error('A ' + pk.type + ' key cannot be used in ' +
-		    this._algo + ' Diffie-Hellman'));
-	}
-
-	if (pk.curve !== this._curve) {
-		throw (new Error('A key from the ' + pk.curve + ' curve ' +
-		    'cannot be used with a ' + this._curve +
-		    ' Diffie-Hellman'));
-	}
-
-	if (pk.type === 'dsa') {
-		assert.deepEqual(pk.part.p, this._p,
-		    'DSA key prime does not match');
-		assert.deepEqual(pk.part.g, this._g,
-		    'DSA key generator does not match');
-	}
-};
-
-DiffieHellman.prototype.setKey = function (pk) {
-	this._keyCheck(pk);
-
-	if (pk.type === 'dsa') {
-		this._dh.setPrivateKey(pk.part.x.data);
-		this._dh.setPublicKey(pk.part.y.data);
-
-	} else if (pk.type === 'ecdsa') {
-		if (CRYPTO_HAVE_ECDH) {
-			this._dh.setPrivateKey(pk.part.d.data);
-			this._dh.setPublicKey(pk.part.Q.data);
-		} else {
-			this._priv = new ECPrivate(
-			    this._ecParams, pk.part.d.data);
-		}
-
-	} else if (pk.type === 'curve25519') {
-		this._priv = pk.part.r.data;
-		if (this._priv[0] === 0x00)
-			this._priv = this._priv.slice(1);
-		this._priv = this._priv.slice(0, 32);
-	}
-	this._key = pk;
-	this._isPriv = true;
-};
-DiffieHellman.prototype.setPrivateKey = DiffieHellman.prototype.setKey;
-
-DiffieHellman.prototype.computeSecret = function (otherpk) {
-	this._keyCheck(otherpk, true);
-	if (!this._isPriv)
-		throw (new Error('DH exchange has not been initialized with ' +
-		    'a private key yet'));
-
-	var pub;
-	if (this._algo === 'dsa') {
-		return (this._dh.computeSecret(
-		    otherpk.part.y.data));
-
-	} else if (this._algo === 'ecdsa') {
-		if (CRYPTO_HAVE_ECDH) {
-			return (this._dh.computeSecret(
-			    otherpk.part.Q.data));
-		} else {
-			pub = new ECPublic(
-			    this._ecParams, otherpk.part.Q.data);
-			return (this._priv.deriveSharedSecret(pub));
-		}
-
-	} else if (this._algo === 'curve25519') {
-		pub = otherpk.part.R.data;
-		if (pub[0] === 0x00)
-			pub = pub.slice(1);
-
-		var secret = ed.dh.computeKey(
-		    this._priv.toString('binary'),
-		    pub.toString('binary'));
-
-		return (new Buffer(secret, 'binary'));
-	}
-
-	throw (new Error('Invalid algorithm: ' + this._algo));
-};
-
-DiffieHellman.prototype.generateKey = function () {
-	var parts = [];
-	var priv, pub;
-	if (this._algo === 'dsa') {
-		this._dh.generateKeys();
-
-		parts.push({name: 'p', data: this._p.data});
-		parts.push({name: 'q', data: this._key.part.q.data});
-		parts.push({name: 'g', data: this._g.data});
-		parts.push({name: 'y', data: this._dh.getPublicKey()});
-		parts.push({name: 'x', data: this._dh.getPrivateKey()});
-		this._key = new PrivateKey({
-			type: 'dsa',
-			parts: parts
-		});
-		this._isPriv = true;
-		return (this._key);
-
-	} else if (this._algo === 'ecdsa') {
-		if (CRYPTO_HAVE_ECDH) {
-			this._dh.generateKeys();
-
-			parts.push({name: 'curve',
-			    data: new Buffer(this._curve)});
-			parts.push({name: 'Q', data: this._dh.getPublicKey()});
-			parts.push({name: 'd', data: this._dh.getPrivateKey()});
-			this._key = new PrivateKey({
-				type: 'ecdsa',
-				curve: this._curve,
-				parts: parts
-			});
-			this._isPriv = true;
-			return (this._key);
-
-		} else {
-			var n = this._ecParams.getN();
-			var r = new jsbn(crypto.randomBytes(n.bitLength()));
-			var n1 = n.subtract(jsbn.ONE);
-			priv = r.mod(n1).add(jsbn.ONE);
-			pub = this._ecParams.getG().multiply(priv);
-
-			priv = new Buffer(priv.toByteArray());
-			pub = new Buffer(this._ecParams.getCurve().
-			    encodePointHex(pub), 'hex');
-
-			this._priv = new ECPrivate(this._ecParams, priv);
-
-			parts.push({name: 'curve',
-			    data: new Buffer(this._curve)});
-			parts.push({name: 'Q', data: pub});
-			parts.push({name: 'd', data: priv});
-
-			this._key = new PrivateKey({
-				type: 'ecdsa',
-				curve: this._curve,
-				parts: parts
-			});
-			this._isPriv = true;
-			return (this._key);
-		}
-
-	} else if (this._algo === 'curve25519') {
-		priv = ed.dh.generateKey();
-		pub = ed.dh.publicKey(priv);
-		this._priv = priv = new Buffer(priv, 'binary');
-		pub = new Buffer(pub, 'binary');
-
-		parts.push({name: 'R', data: pub});
-		parts.push({name: 'r', data: Buffer.concat([priv, pub])});
-		this._key = new PrivateKey({
-			type: 'curve25519',
-			parts: parts
-		});
-		this._isPriv = true;
-		return (this._key);
-	}
-
-	throw (new Error('Invalid algorithm: ' + this._algo));
-};
-DiffieHellman.prototype.generateKeys = DiffieHellman.prototype.generateKey;
-
-/* These are helpers for using ecc-jsbn (for node 0.10 compatibility). */
-
-function X9ECParameters(name) {
-	var params = algs.curves[name];
-	assert.object(params);
-
-	var p = new jsbn(params.p);
-	var a = new jsbn(params.a);
-	var b = new jsbn(params.b);
-	var n = new jsbn(params.n);
-	var h = jsbn.ONE;
-	var curve = new ec.ECCurveFp(p, a, b);
-	var G = curve.decodePointHex(params.G.toString('hex'));
-
-	this.curve = curve;
-	this.g = G;
-	this.n = n;
-	this.h = h;
-}
-X9ECParameters.prototype.getCurve = function () { return (this.curve); };
-X9ECParameters.prototype.getG = function () { return (this.g); };
-X9ECParameters.prototype.getN = function () { return (this.n); };
-X9ECParameters.prototype.getH = function () { return (this.h); };
-
-function ECPublic(params, buffer) {
-	this._params = params;
-	if (buffer[0] === 0x00)
-		buffer = buffer.slice(1);
-	this._pub = params.getCurve().decodePointHex(buffer.toString('hex'));
-}
-
-function ECPrivate(params, buffer) {
-	this._params = params;
-	this._priv = new jsbn(utils.mpNormalize(buffer));
-}
-ECPrivate.prototype.deriveSharedSecret = function (pubKey) {
-	assert.ok(pubKey instanceof ECPublic);
-	var S = pubKey._pub.multiply(this._priv);
-	return (new Buffer(S.getX().toBigInteger().toByteArray()));
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ed-compat.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ed-compat.js
deleted file mode 100644
index 5365fb14027bfb0c33848a060e60b946952085e3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ed-compat.js
+++ /dev/null
@@ -1,96 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = {
-	Verifier: Verifier,
-	Signer: Signer
-};
-
-var nacl;
-var stream = require('stream');
-var util = require('util');
-var assert = require('assert-plus');
-var Signature = require('./signature');
-
-function Verifier(key, hashAlgo) {
-	if (nacl === undefined)
-		nacl = require('tweetnacl');
-
-	if (hashAlgo.toLowerCase() !== 'sha512')
-		throw (new Error('ED25519 only supports the use of ' +
-		    'SHA-512 hashes'));
-
-	this.key = key;
-	this.chunks = [];
-
-	stream.Writable.call(this, {});
-}
-util.inherits(Verifier, stream.Writable);
-
-Verifier.prototype._write = function (chunk, enc, cb) {
-	this.chunks.push(chunk);
-	cb();
-};
-
-Verifier.prototype.update = function (chunk) {
-	if (typeof (chunk) === 'string')
-		chunk = new Buffer(chunk, 'binary');
-	this.chunks.push(chunk);
-};
-
-Verifier.prototype.verify = function (signature, fmt) {
-	var sig;
-	if (Signature.isSignature(signature, [2, 0])) {
-		if (signature.type !== 'ed25519')
-			return (false);
-		sig = signature.toBuffer('raw');
-
-	} else if (typeof (signature) === 'string') {
-		sig = new Buffer(signature, 'base64');
-
-	} else if (Signature.isSignature(signature, [1, 0])) {
-		throw (new Error('signature was created by too old ' +
-		    'a version of sshpk and cannot be verified'));
-	}
-
-	assert.buffer(sig);
-	return (nacl.sign.detached.verify(
-	    new Uint8Array(Buffer.concat(this.chunks)),
-	    new Uint8Array(sig),
-	    new Uint8Array(this.key.part.R.data)));
-};
-
-function Signer(key, hashAlgo) {
-	if (nacl === undefined)
-		nacl = require('tweetnacl');
-
-	if (hashAlgo.toLowerCase() !== 'sha512')
-		throw (new Error('ED25519 only supports the use of ' +
-		    'SHA-512 hashes'));
-
-	this.key = key;
-	this.chunks = [];
-
-	stream.Writable.call(this, {});
-}
-util.inherits(Signer, stream.Writable);
-
-Signer.prototype._write = function (chunk, enc, cb) {
-	this.chunks.push(chunk);
-	cb();
-};
-
-Signer.prototype.update = function (chunk) {
-	if (typeof (chunk) === 'string')
-		chunk = new Buffer(chunk, 'binary');
-	this.chunks.push(chunk);
-};
-
-Signer.prototype.sign = function () {
-	var sig = nacl.sign.detached(
-	    new Uint8Array(Buffer.concat(this.chunks)),
-	    new Uint8Array(this.key.part.r.data));
-	var sigBuf = new Buffer(sig);
-	var sigObj = Signature.parse(sigBuf, 'ed25519', 'raw');
-	sigObj.hashAlgorithm = 'sha512';
-	return (sigObj);
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/errors.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/errors.js
deleted file mode 100644
index d984f1ac3f66eb8c9e5793b19cb70e33d7bb968f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/errors.js
+++ /dev/null
@@ -1,71 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-var assert = require('assert-plus');
-var util = require('util');
-
-function FingerprintFormatError(fp, format) {
-	if (Error.captureStackTrace)
-		Error.captureStackTrace(this, FingerprintFormatError);
-	this.name = 'FingerprintFormatError';
-	this.fingerprint = fp;
-	this.format = format;
-	this.message = 'Fingerprint format is not supported, or is invalid: ';
-	if (fp !== undefined)
-		this.message += ' fingerprint = ' + fp;
-	if (format !== undefined)
-		this.message += ' format = ' + format;
-}
-util.inherits(FingerprintFormatError, Error);
-
-function InvalidAlgorithmError(alg) {
-	if (Error.captureStackTrace)
-		Error.captureStackTrace(this, InvalidAlgorithmError);
-	this.name = 'InvalidAlgorithmError';
-	this.algorithm = alg;
-	this.message = 'Algorithm "' + alg + '" is not supported';
-}
-util.inherits(InvalidAlgorithmError, Error);
-
-function KeyParseError(name, format, innerErr) {
-	if (Error.captureStackTrace)
-		Error.captureStackTrace(this, KeyParseError);
-	this.name = 'KeyParseError';
-	this.format = format;
-	this.keyName = name;
-	this.innerErr = innerErr;
-	this.message = 'Failed to parse ' + name + ' as a valid ' + format +
-	    ' format key: ' + innerErr.message;
-}
-util.inherits(KeyParseError, Error);
-
-function SignatureParseError(type, format, innerErr) {
-	if (Error.captureStackTrace)
-		Error.captureStackTrace(this, SignatureParseError);
-	this.name = 'SignatureParseError';
-	this.type = type;
-	this.format = format;
-	this.innerErr = innerErr;
-	this.message = 'Failed to parse the given data as a ' + type +
-	    ' signature in ' + format + ' format: ' + innerErr.message;
-}
-util.inherits(SignatureParseError, Error);
-
-function KeyEncryptedError(name, format) {
-	if (Error.captureStackTrace)
-		Error.captureStackTrace(this, KeyEncryptedError);
-	this.name = 'KeyEncryptedError';
-	this.format = format;
-	this.keyName = name;
-	this.message = 'The ' + format + ' format key ' + name + ' is ' +
-	    'encrypted (password-protected), and no passphrase was ' +
-	    'provided in `options`';
-}
-util.inherits(KeyEncryptedError, Error);
-
-module.exports = {
-	FingerprintFormatError: FingerprintFormatError,
-	InvalidAlgorithmError: InvalidAlgorithmError,
-	KeyParseError: KeyParseError,
-	SignatureParseError: SignatureParseError,
-	KeyEncryptedError: KeyEncryptedError
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/fingerprint.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/fingerprint.js
deleted file mode 100644
index c607330e7f5f68f8a585cc9442aff49ea66f3299..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/fingerprint.js
+++ /dev/null
@@ -1,140 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = Fingerprint;
-
-var assert = require('assert-plus');
-var algs = require('./algs');
-var crypto = require('crypto');
-var errs = require('./errors');
-var Key = require('./key');
-var utils = require('./utils');
-
-var FingerprintFormatError = errs.FingerprintFormatError;
-var InvalidAlgorithmError = errs.InvalidAlgorithmError;
-
-function Fingerprint(opts) {
-	assert.object(opts, 'options');
-	assert.buffer(opts.hash, 'options.hash');
-	assert.string(opts.algorithm, 'options.algorithm');
-
-	this.algorithm = opts.algorithm.toLowerCase();
-	if (algs.hashAlgs[this.algorithm] !== true)
-		throw (new InvalidAlgorithmError(this.algorithm));
-
-	this.hash = opts.hash;
-}
-
-Fingerprint.prototype.toString = function (format) {
-	if (format === undefined) {
-		if (this.algorithm === 'md5')
-			format = 'hex';
-		else
-			format = 'base64';
-	}
-	assert.string(format);
-
-	switch (format) {
-	case 'hex':
-		return (addColons(this.hash.toString('hex')));
-	case 'base64':
-		return (sshBase64Format(this.algorithm,
-		    this.hash.toString('base64')));
-	default:
-		throw (new FingerprintFormatError(undefined, format));
-	}
-};
-
-Fingerprint.prototype.matches = function (key) {
-	assert.object(key, 'key');
-	utils.assertCompatible(key, Key, [1, 0], 'key');
-
-	var theirHash = key.hash(this.algorithm);
-	var theirHash2 = crypto.createHash(this.algorithm).
-	    update(theirHash).digest('base64');
-
-	if (this.hash2 === undefined)
-		this.hash2 = crypto.createHash(this.algorithm).
-		    update(this.hash).digest('base64');
-
-	return (this.hash2 === theirHash2);
-};
-
-Fingerprint.parse = function (fp, enAlgs) {
-	assert.string(fp, 'fingerprint');
-
-	var alg, hash;
-	assert.optionalArrayOfString(enAlgs, 'algorithms');
-
-	var parts = fp.split(':');
-	if (parts.length == 2) {
-		alg = parts[0].toLowerCase();
-		/*JSSTYLED*/
-		var base64RE = /^[A-Za-z0-9+\/=]+$/;
-		if (!base64RE.test(parts[1]))
-			throw (new FingerprintFormatError(fp));
-		try {
-			hash = new Buffer(parts[1], 'base64');
-		} catch (e) {
-			throw (new FingerprintFormatError(fp));
-		}
-	} else if (parts.length > 2) {
-		alg = 'md5';
-		if (parts[0].toLowerCase() === 'md5')
-			parts = parts.slice(1);
-		parts = parts.join('');
-		/*JSSTYLED*/
-		var md5RE = /^[a-fA-F0-9]+$/;
-		if (!md5RE.test(parts))
-			throw (new FingerprintFormatError(fp));
-		try {
-			hash = new Buffer(parts, 'hex');
-		} catch (e) {
-			throw (new FingerprintFormatError(fp));
-		}
-	}
-
-	if (alg === undefined)
-		throw (new FingerprintFormatError(fp));
-
-	if (algs.hashAlgs[alg] === undefined)
-		throw (new InvalidAlgorithmError(alg));
-
-	if (enAlgs !== undefined) {
-		enAlgs = enAlgs.map(function (a) { return a.toLowerCase(); });
-		if (enAlgs.indexOf(alg) === -1)
-			throw (new InvalidAlgorithmError(alg));
-	}
-
-	return (new Fingerprint({algorithm: alg, hash: hash}));
-};
-
-function addColons(s) {
-	/*JSSTYLED*/
-	return (s.replace(/(.{2})(?=.)/g, '$1:'));
-}
-
-function base64Strip(s) {
-	/*JSSTYLED*/
-	return (s.replace(/=*$/, ''));
-}
-
-function sshBase64Format(alg, h) {
-	return (alg.toUpperCase() + ':' + base64Strip(h));
-}
-
-Fingerprint.isFingerprint = function (obj, ver) {
-	return (utils.isCompatible(obj, Fingerprint, ver));
-};
-
-/*
- * API versions for Fingerprint:
- * [1,0] -- initial ver
- * [1,1] -- first tagged ver
- */
-Fingerprint.prototype._sshpkApiVersion = [1, 1];
-
-Fingerprint._oldVersionDetect = function (obj) {
-	assert.func(obj.toString);
-	assert.func(obj.matches);
-	return ([1, 0]);
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/auto.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/auto.js
deleted file mode 100644
index 973c03245e38076f75d7522a19b0e1fb2590afd2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/auto.js
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = {
-	read: read,
-	write: write
-};
-
-var assert = require('assert-plus');
-var utils = require('../utils');
-var Key = require('../key');
-var PrivateKey = require('../private-key');
-
-var pem = require('./pem');
-var ssh = require('./ssh');
-var rfc4253 = require('./rfc4253');
-
-function read(buf, options) {
-	if (typeof (buf) === 'string') {
-		if (buf.trim().match(/^[-]+[ ]*BEGIN/))
-			return (pem.read(buf, options));
-		if (buf.match(/^\s*ssh-[a-z]/))
-			return (ssh.read(buf, options));
-		if (buf.match(/^\s*ecdsa-/))
-			return (ssh.read(buf, options));
-		buf = new Buffer(buf, 'binary');
-	} else {
-		assert.buffer(buf);
-		if (findPEMHeader(buf))
-			return (pem.read(buf, options));
-		if (findSSHHeader(buf))
-			return (ssh.read(buf, options));
-	}
-	if (buf.readUInt32BE(0) < buf.length)
-		return (rfc4253.read(buf, options));
-	throw (new Error('Failed to auto-detect format of key'));
-}
-
-function findSSHHeader(buf) {
-	var offset = 0;
-	while (offset < buf.length &&
-	    (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9))
-		++offset;
-	if (offset + 4 <= buf.length &&
-	    buf.slice(offset, offset + 4).toString('ascii') === 'ssh-')
-		return (true);
-	if (offset + 6 <= buf.length &&
-	    buf.slice(offset, offset + 6).toString('ascii') === 'ecdsa-')
-		return (true);
-	return (false);
-}
-
-function findPEMHeader(buf) {
-	var offset = 0;
-	while (offset < buf.length &&
-	    (buf[offset] === 32 || buf[offset] === 10))
-		++offset;
-	if (buf[offset] !== 45)
-		return (false);
-	while (offset < buf.length &&
-	    (buf[offset] === 45))
-		++offset;
-	while (offset < buf.length &&
-	    (buf[offset] === 32))
-		++offset;
-	if (offset + 5 > buf.length ||
-	    buf.slice(offset, offset + 5).toString('ascii') !== 'BEGIN')
-		return (false);
-	return (true);
-}
-
-function write(key, options) {
-	throw (new Error('"auto" format cannot be used for writing'));
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js
deleted file mode 100644
index 5318b35165336d658c72fe94ea8a02dba32bc2af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pem.js
+++ /dev/null
@@ -1,186 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = {
-	read: read,
-	write: write
-};
-
-var assert = require('assert-plus');
-var asn1 = require('asn1');
-var crypto = require('crypto');
-var algs = require('../algs');
-var utils = require('../utils');
-var Key = require('../key');
-var PrivateKey = require('../private-key');
-
-var pkcs1 = require('./pkcs1');
-var pkcs8 = require('./pkcs8');
-var sshpriv = require('./ssh-private');
-var rfc4253 = require('./rfc4253');
-
-var errors = require('../errors');
-
-/*
- * For reading we support both PKCS#1 and PKCS#8. If we find a private key,
- * we just take the public component of it and use that.
- */
-function read(buf, options, forceType) {
-	var input = buf;
-	if (typeof (buf) !== 'string') {
-		assert.buffer(buf, 'buf');
-		buf = buf.toString('ascii');
-	}
-
-	var lines = buf.trim().split('\n');
-
-	var m = lines[0].match(/*JSSTYLED*/
-	    /[-]+[ ]*BEGIN ([A-Z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/);
-	assert.ok(m, 'invalid PEM header');
-
-	var m2 = lines[lines.length - 1].match(/*JSSTYLED*/
-	    /[-]+[ ]*END ([A-Z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/);
-	assert.ok(m2, 'invalid PEM footer');
-
-	/* Begin and end banners must match key type */
-	assert.equal(m[2], m2[2]);
-	var type = m[2].toLowerCase();
-
-	var alg;
-	if (m[1]) {
-		/* They also must match algorithms, if given */
-		assert.equal(m[1], m2[1], 'PEM header and footer mismatch');
-		alg = m[1].trim();
-	}
-
-	var headers = {};
-	while (true) {
-		lines = lines.slice(1);
-		m = lines[0].match(/*JSSTYLED*/
-		    /^([A-Za-z0-9-]+): (.+)$/);
-		if (!m)
-			break;
-		headers[m[1].toLowerCase()] = m[2];
-	}
-
-	var cipher, key, iv;
-	if (headers['proc-type']) {
-		var parts = headers['proc-type'].split(',');
-		if (parts[0] === '4' && parts[1] === 'ENCRYPTED') {
-			if (typeof (options.passphrase) === 'string') {
-				options.passphrase = new Buffer(
-				    options.passphrase, 'utf-8');
-			}
-			if (!Buffer.isBuffer(options.passphrase)) {
-				throw (new errors.KeyEncryptedError(
-				    options.filename, 'PEM'));
-			} else {
-				parts = headers['dek-info'].split(',');
-				assert.ok(parts.length === 2);
-				cipher = parts[0].toLowerCase();
-				iv = new Buffer(parts[1], 'hex');
-				key = utils.opensslKeyDeriv(cipher, iv,
-				    options.passphrase, 1).key;
-			}
-		}
-	}
-
-	/* Chop off the first and last lines */
-	lines = lines.slice(0, -1).join('');
-	buf = new Buffer(lines, 'base64');
-
-	if (cipher && key && iv) {
-		var cipherStream = crypto.createDecipheriv(cipher, key, iv);
-		var chunk, chunks = [];
-		cipherStream.once('error', function (e) {
-			if (e.toString().indexOf('bad decrypt') !== -1) {
-				throw (new Error('Incorrect passphrase ' +
-				    'supplied, could not decrypt key'));
-			}
-			throw (e);
-		});
-		cipherStream.write(buf);
-		cipherStream.end();
-		while ((chunk = cipherStream.read()) !== null)
-			chunks.push(chunk);
-		buf = Buffer.concat(chunks);
-	}
-
-	/* The new OpenSSH internal format abuses PEM headers */
-	if (alg && alg.toLowerCase() === 'openssh')
-		return (sshpriv.readSSHPrivate(type, buf));
-	if (alg && alg.toLowerCase() === 'ssh2')
-		return (rfc4253.readType(type, buf));
-
-	var der = new asn1.BerReader(buf);
-	der.originalInput = input;
-
-	/*
-	 * All of the PEM file types start with a sequence tag, so chop it
-	 * off here
-	 */
-	der.readSequence();
-
-	/* PKCS#1 type keys name an algorithm in the banner explicitly */
-	if (alg) {
-		if (forceType)
-			assert.strictEqual(forceType, 'pkcs1');
-		return (pkcs1.readPkcs1(alg, type, der));
-	} else {
-		if (forceType)
-			assert.strictEqual(forceType, 'pkcs8');
-		return (pkcs8.readPkcs8(alg, type, der));
-	}
-}
-
-function write(key, options, type) {
-	assert.object(key);
-
-	var alg = {'ecdsa': 'EC', 'rsa': 'RSA', 'dsa': 'DSA'}[key.type];
-	var header;
-
-	var der = new asn1.BerWriter();
-
-	if (PrivateKey.isPrivateKey(key)) {
-		if (type && type === 'pkcs8') {
-			header = 'PRIVATE KEY';
-			pkcs8.writePkcs8(der, key);
-		} else {
-			if (type)
-				assert.strictEqual(type, 'pkcs1');
-			header = alg + ' PRIVATE KEY';
-			pkcs1.writePkcs1(der, key);
-		}
-
-	} else if (Key.isKey(key)) {
-		if (type && type === 'pkcs1') {
-			header = alg + ' PUBLIC KEY';
-			pkcs1.writePkcs1(der, key);
-		} else {
-			if (type)
-				assert.strictEqual(type, 'pkcs8');
-			header = 'PUBLIC KEY';
-			pkcs8.writePkcs8(der, key);
-		}
-
-	} else {
-		throw (new Error('key is not a Key or PrivateKey'));
-	}
-
-	var tmp = der.buffer.toString('base64');
-	var len = tmp.length + (tmp.length / 64) +
-	    18 + 16 + header.length*2 + 10;
-	var buf = new Buffer(len);
-	var o = 0;
-	o += buf.write('-----BEGIN ' + header + '-----\n', o);
-	for (var i = 0; i < tmp.length; ) {
-		var limit = i + 64;
-		if (limit > tmp.length)
-			limit = tmp.length;
-		o += buf.write(tmp.slice(i, limit), o);
-		buf[o++] = 10;
-		i = limit;
-	}
-	o += buf.write('-----END ' + header + '-----\n', o);
-
-	return (buf.slice(0, o));
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs1.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs1.js
deleted file mode 100644
index a5676af6ef842032e322f83c8c3047e9f42474c2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs1.js
+++ /dev/null
@@ -1,320 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = {
-	read: read,
-	readPkcs1: readPkcs1,
-	write: write,
-	writePkcs1: writePkcs1
-};
-
-var assert = require('assert-plus');
-var asn1 = require('asn1');
-var algs = require('../algs');
-var utils = require('../utils');
-
-var Key = require('../key');
-var PrivateKey = require('../private-key');
-var pem = require('./pem');
-
-var pkcs8 = require('./pkcs8');
-var readECDSACurve = pkcs8.readECDSACurve;
-
-function read(buf, options) {
-	return (pem.read(buf, options, 'pkcs1'));
-}
-
-function write(key, options) {
-	return (pem.write(key, options, 'pkcs1'));
-}
-
-/* Helper to read in a single mpint */
-function readMPInt(der, nm) {
-	assert.strictEqual(der.peek(), asn1.Ber.Integer,
-	    nm + ' is not an Integer');
-	return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true)));
-}
-
-function readPkcs1(alg, type, der) {
-	switch (alg) {
-	case 'RSA':
-		if (type === 'public')
-			return (readPkcs1RSAPublic(der));
-		else if (type === 'private')
-			return (readPkcs1RSAPrivate(der));
-		throw (new Error('Unknown key type: ' + type));
-	case 'DSA':
-		if (type === 'public')
-			return (readPkcs1DSAPublic(der));
-		else if (type === 'private')
-			return (readPkcs1DSAPrivate(der));
-		throw (new Error('Unknown key type: ' + type));
-	case 'EC':
-	case 'ECDSA':
-		if (type === 'private')
-			return (readPkcs1ECDSAPrivate(der));
-		else if (type === 'public')
-			return (readPkcs1ECDSAPublic(der));
-		throw (new Error('Unknown key type: ' + type));
-	default:
-		throw (new Error('Unknown key algo: ' + alg));
-	}
-}
-
-function readPkcs1RSAPublic(der) {
-	// modulus and exponent
-	var n = readMPInt(der, 'modulus');
-	var e = readMPInt(der, 'exponent');
-
-	// now, make the key
-	var key = {
-		type: 'rsa',
-		parts: [
-			{ name: 'e', data: e },
-			{ name: 'n', data: n }
-		]
-	};
-
-	return (new Key(key));
-}
-
-function readPkcs1RSAPrivate(der) {
-	var version = readMPInt(der, 'version');
-	assert.strictEqual(version[0], 0);
-
-	// modulus then public exponent
-	var n = readMPInt(der, 'modulus');
-	var e = readMPInt(der, 'public exponent');
-	var d = readMPInt(der, 'private exponent');
-	var p = readMPInt(der, 'prime1');
-	var q = readMPInt(der, 'prime2');
-	var dmodp = readMPInt(der, 'exponent1');
-	var dmodq = readMPInt(der, 'exponent2');
-	var iqmp = readMPInt(der, 'iqmp');
-
-	// now, make the key
-	var key = {
-		type: 'rsa',
-		parts: [
-			{ name: 'n', data: n },
-			{ name: 'e', data: e },
-			{ name: 'd', data: d },
-			{ name: 'iqmp', data: iqmp },
-			{ name: 'p', data: p },
-			{ name: 'q', data: q },
-			{ name: 'dmodp', data: dmodp },
-			{ name: 'dmodq', data: dmodq }
-		]
-	};
-
-	return (new PrivateKey(key));
-}
-
-function readPkcs1DSAPrivate(der) {
-	var version = readMPInt(der, 'version');
-	assert.strictEqual(version.readUInt8(0), 0);
-
-	var p = readMPInt(der, 'p');
-	var q = readMPInt(der, 'q');
-	var g = readMPInt(der, 'g');
-	var y = readMPInt(der, 'y');
-	var x = readMPInt(der, 'x');
-
-	// now, make the key
-	var key = {
-		type: 'dsa',
-		parts: [
-			{ name: 'p', data: p },
-			{ name: 'q', data: q },
-			{ name: 'g', data: g },
-			{ name: 'y', data: y },
-			{ name: 'x', data: x }
-		]
-	};
-
-	return (new PrivateKey(key));
-}
-
-function readPkcs1DSAPublic(der) {
-	var y = readMPInt(der, 'y');
-	var p = readMPInt(der, 'p');
-	var q = readMPInt(der, 'q');
-	var g = readMPInt(der, 'g');
-
-	var key = {
-		type: 'dsa',
-		parts: [
-			{ name: 'y', data: y },
-			{ name: 'p', data: p },
-			{ name: 'q', data: q },
-			{ name: 'g', data: g }
-		]
-	};
-
-	return (new Key(key));
-}
-
-function readPkcs1ECDSAPublic(der) {
-	der.readSequence();
-
-	var oid = der.readOID();
-	assert.strictEqual(oid, '1.2.840.10045.2.1', 'must be ecPublicKey');
-
-	var curveOid = der.readOID();
-
-	var curve;
-	var curves = Object.keys(algs.curves);
-	for (var j = 0; j < curves.length; ++j) {
-		var c = curves[j];
-		var cd = algs.curves[c];
-		if (cd.pkcs8oid === curveOid) {
-			curve = c;
-			break;
-		}
-	}
-	assert.string(curve, 'a known ECDSA named curve');
-
-	var Q = der.readString(asn1.Ber.BitString, true);
-	Q = utils.ecNormalize(Q);
-
-	var key = {
-		type: 'ecdsa',
-		parts: [
-			{ name: 'curve', data: new Buffer(curve) },
-			{ name: 'Q', data: Q }
-		]
-	};
-
-	return (new Key(key));
-}
-
-function readPkcs1ECDSAPrivate(der) {
-	var version = readMPInt(der, 'version');
-	assert.strictEqual(version.readUInt8(0), 1);
-
-	// private key
-	var d = der.readString(asn1.Ber.OctetString, true);
-
-	der.readSequence(0xa0);
-	var curve = readECDSACurve(der);
-	assert.string(curve, 'a known elliptic curve');
-
-	der.readSequence(0xa1);
-	var Q = der.readString(asn1.Ber.BitString, true);
-	Q = utils.ecNormalize(Q);
-
-	var key = {
-		type: 'ecdsa',
-		parts: [
-			{ name: 'curve', data: new Buffer(curve) },
-			{ name: 'Q', data: Q },
-			{ name: 'd', data: d }
-		]
-	};
-
-	return (new PrivateKey(key));
-}
-
-function writePkcs1(der, key) {
-	der.startSequence();
-
-	switch (key.type) {
-	case 'rsa':
-		if (PrivateKey.isPrivateKey(key))
-			writePkcs1RSAPrivate(der, key);
-		else
-			writePkcs1RSAPublic(der, key);
-		break;
-	case 'dsa':
-		if (PrivateKey.isPrivateKey(key))
-			writePkcs1DSAPrivate(der, key);
-		else
-			writePkcs1DSAPublic(der, key);
-		break;
-	case 'ecdsa':
-		if (PrivateKey.isPrivateKey(key))
-			writePkcs1ECDSAPrivate(der, key);
-		else
-			writePkcs1ECDSAPublic(der, key);
-		break;
-	default:
-		throw (new Error('Unknown key algo: ' + key.type));
-	}
-
-	der.endSequence();
-}
-
-function writePkcs1RSAPublic(der, key) {
-	der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
-}
-
-function writePkcs1RSAPrivate(der, key) {
-	var ver = new Buffer(1);
-	ver[0] = 0;
-	der.writeBuffer(ver, asn1.Ber.Integer);
-
-	der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.d.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
-	if (!key.part.dmodp || !key.part.dmodq)
-		utils.addRSAMissing(key);
-	der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer);
-}
-
-function writePkcs1DSAPrivate(der, key) {
-	var ver = new Buffer(1);
-	ver[0] = 0;
-	der.writeBuffer(ver, asn1.Ber.Integer);
-
-	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.y.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.x.data, asn1.Ber.Integer);
-}
-
-function writePkcs1DSAPublic(der, key) {
-	der.writeBuffer(key.part.y.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
-}
-
-function writePkcs1ECDSAPublic(der, key) {
-	der.startSequence();
-
-	der.writeOID('1.2.840.10045.2.1'); /* ecPublicKey */
-	var curve = key.part.curve.data.toString();
-	var curveOid = algs.curves[curve].pkcs8oid;
-	assert.string(curveOid, 'a known ECDSA named curve');
-	der.writeOID(curveOid);
-
-	der.endSequence();
-
-	var Q = utils.ecNormalize(key.part.Q.data, true);
-	der.writeBuffer(Q, asn1.Ber.BitString);
-}
-
-function writePkcs1ECDSAPrivate(der, key) {
-	var ver = new Buffer(1);
-	ver[0] = 1;
-	der.writeBuffer(ver, asn1.Ber.Integer);
-
-	der.writeBuffer(key.part.d.data, asn1.Ber.OctetString);
-
-	der.startSequence(0xa0);
-	var curve = key.part.curve.data.toString();
-	var curveOid = algs.curves[curve].pkcs8oid;
-	assert.string(curveOid, 'a known ECDSA named curve');
-	der.writeOID(curveOid);
-	der.endSequence();
-
-	der.startSequence(0xa1);
-	var Q = utils.ecNormalize(key.part.Q.data, true);
-	der.writeBuffer(Q, asn1.Ber.BitString);
-	der.endSequence();
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs8.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs8.js
deleted file mode 100644
index 33fb7cc475923d6e7ac04c1e7f552815704552a6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/pkcs8.js
+++ /dev/null
@@ -1,510 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = {
-	read: read,
-	readPkcs8: readPkcs8,
-	write: write,
-	writePkcs8: writePkcs8,
-
-	readECDSACurve: readECDSACurve,
-	writeECDSACurve: writeECDSACurve
-};
-
-var assert = require('assert-plus');
-var asn1 = require('asn1');
-var algs = require('../algs');
-var utils = require('../utils');
-var Key = require('../key');
-var PrivateKey = require('../private-key');
-var pem = require('./pem');
-
-function read(buf, options) {
-	return (pem.read(buf, options, 'pkcs8'));
-}
-
-function write(key, options) {
-	return (pem.write(key, options, 'pkcs8'));
-}
-
-/* Helper to read in a single mpint */
-function readMPInt(der, nm) {
-	assert.strictEqual(der.peek(), asn1.Ber.Integer,
-	    nm + ' is not an Integer');
-	return (utils.mpNormalize(der.readString(asn1.Ber.Integer, true)));
-}
-
-function readPkcs8(alg, type, der) {
-	/* Private keys in pkcs#8 format have a weird extra int */
-	if (der.peek() === asn1.Ber.Integer) {
-		assert.strictEqual(type, 'private',
-		    'unexpected Integer at start of public key');
-		der.readString(asn1.Ber.Integer, true);
-	}
-
-	der.readSequence();
-
-	var oid = der.readOID();
-	switch (oid) {
-	case '1.2.840.113549.1.1.1':
-		if (type === 'public')
-			return (readPkcs8RSAPublic(der));
-		else
-			return (readPkcs8RSAPrivate(der));
-	case '1.2.840.10040.4.1':
-		if (type === 'public')
-			return (readPkcs8DSAPublic(der));
-		else
-			return (readPkcs8DSAPrivate(der));
-	case '1.2.840.10045.2.1':
-		if (type === 'public')
-			return (readPkcs8ECDSAPublic(der));
-		else
-			return (readPkcs8ECDSAPrivate(der));
-	default:
-		throw (new Error('Unknown key type OID ' + oid));
-	}
-}
-
-function readPkcs8RSAPublic(der) {
-	// Null -- XXX this probably isn't good practice
-	der.readByte();
-	der.readByte();
-
-	// bit string sequence
-	der.readSequence(asn1.Ber.BitString);
-	der.readByte();
-	der.readSequence();
-
-	// modulus
-	var n = readMPInt(der, 'modulus');
-	var e = readMPInt(der, 'exponent');
-
-	// now, make the key
-	var key = {
-		type: 'rsa',
-		source: der.originalInput,
-		parts: [
-			{ name: 'e', data: e },
-			{ name: 'n', data: n }
-		]
-	};
-
-	return (new Key(key));
-}
-
-function readPkcs8RSAPrivate(der) {
-	der.readByte();
-	der.readByte();
-
-	der.readSequence(asn1.Ber.OctetString);
-	der.readSequence();
-
-	var ver = readMPInt(der, 'version');
-	assert.equal(ver[0], 0x0, 'unknown RSA private key version');
-
-	// modulus then public exponent
-	var n = readMPInt(der, 'modulus');
-	var e = readMPInt(der, 'public exponent');
-	var d = readMPInt(der, 'private exponent');
-	var p = readMPInt(der, 'prime1');
-	var q = readMPInt(der, 'prime2');
-	var dmodp = readMPInt(der, 'exponent1');
-	var dmodq = readMPInt(der, 'exponent2');
-	var iqmp = readMPInt(der, 'iqmp');
-
-	// now, make the key
-	var key = {
-		type: 'rsa',
-		parts: [
-			{ name: 'n', data: n },
-			{ name: 'e', data: e },
-			{ name: 'd', data: d },
-			{ name: 'iqmp', data: iqmp },
-			{ name: 'p', data: p },
-			{ name: 'q', data: q },
-			{ name: 'dmodp', data: dmodp },
-			{ name: 'dmodq', data: dmodq }
-		]
-	};
-
-	return (new PrivateKey(key));
-}
-
-function readPkcs8DSAPublic(der) {
-	der.readSequence();
-
-	var p = readMPInt(der, 'p');
-	var q = readMPInt(der, 'q');
-	var g = readMPInt(der, 'g');
-
-	// bit string sequence
-	der.readSequence(asn1.Ber.BitString);
-	der.readByte();
-
-	var y = readMPInt(der, 'y');
-
-	// now, make the key
-	var key = {
-		type: 'dsa',
-		parts: [
-			{ name: 'p', data: p },
-			{ name: 'q', data: q },
-			{ name: 'g', data: g },
-			{ name: 'y', data: y }
-		]
-	};
-
-	return (new Key(key));
-}
-
-function readPkcs8DSAPrivate(der) {
-	der.readSequence();
-
-	var p = readMPInt(der, 'p');
-	var q = readMPInt(der, 'q');
-	var g = readMPInt(der, 'g');
-
-	der.readSequence(asn1.Ber.OctetString);
-	var x = readMPInt(der, 'x');
-
-	/* The pkcs#8 format does not include the public key */
-	var y = utils.calculateDSAPublic(g, p, x);
-
-	var key = {
-		type: 'dsa',
-		parts: [
-			{ name: 'p', data: p },
-			{ name: 'q', data: q },
-			{ name: 'g', data: g },
-			{ name: 'y', data: y },
-			{ name: 'x', data: x }
-		]
-	};
-
-	return (new PrivateKey(key));
-}
-
-function readECDSACurve(der) {
-	var curveName, curveNames;
-	var j, c, cd;
-
-	if (der.peek() === asn1.Ber.OID) {
-		var oid = der.readOID();
-
-		curveNames = Object.keys(algs.curves);
-		for (j = 0; j < curveNames.length; ++j) {
-			c = curveNames[j];
-			cd = algs.curves[c];
-			if (cd.pkcs8oid === oid) {
-				curveName = c;
-				break;
-			}
-		}
-
-	} else {
-		// ECParameters sequence
-		der.readSequence();
-		var version = der.readString(asn1.Ber.Integer, true);
-		assert.strictEqual(version[0], 1, 'ECDSA key not version 1');
-
-		var curve = {};
-
-		// FieldID sequence
-		der.readSequence();
-		var fieldTypeOid = der.readOID();
-		assert.strictEqual(fieldTypeOid, '1.2.840.10045.1.1',
-		    'ECDSA key is not from a prime-field');
-		var p = curve.p = utils.mpNormalize(
-		    der.readString(asn1.Ber.Integer, true));
-		/*
-		 * p always starts with a 1 bit, so count the zeros to get its
-		 * real size.
-		 */
-		curve.size = p.length * 8 - utils.countZeros(p);
-
-		// Curve sequence
-		der.readSequence();
-		curve.a = utils.mpNormalize(
-		    der.readString(asn1.Ber.OctetString, true));
-		curve.b = utils.mpNormalize(
-		    der.readString(asn1.Ber.OctetString, true));
-		if (der.peek() === asn1.Ber.BitString)
-			curve.s = der.readString(asn1.Ber.BitString, true);
-
-		// Combined Gx and Gy
-		curve.G = der.readString(asn1.Ber.OctetString, true);
-		assert.strictEqual(curve.G[0], 0x4,
-		    'uncompressed G is required');
-
-		curve.n = utils.mpNormalize(
-		    der.readString(asn1.Ber.Integer, true));
-		curve.h = utils.mpNormalize(
-		    der.readString(asn1.Ber.Integer, true));
-		assert.strictEqual(curve.h[0], 0x1, 'a cofactor=1 curve is ' +
-		    'required');
-
-		curveNames = Object.keys(algs.curves);
-		var ks = Object.keys(curve);
-		for (j = 0; j < curveNames.length; ++j) {
-			c = curveNames[j];
-			cd = algs.curves[c];
-			var equal = true;
-			for (var i = 0; i < ks.length; ++i) {
-				var k = ks[i];
-				if (cd[k] === undefined)
-					continue;
-				if (typeof (cd[k]) === 'object' &&
-				    cd[k].equals !== undefined) {
-					if (!cd[k].equals(curve[k])) {
-						equal = false;
-						break;
-					}
-				} else if (Buffer.isBuffer(cd[k])) {
-					if (cd[k].toString('binary')
-					    !== curve[k].toString('binary')) {
-						equal = false;
-						break;
-					}
-				} else {
-					if (cd[k] !== curve[k]) {
-						equal = false;
-						break;
-					}
-				}
-			}
-			if (equal) {
-				curveName = c;
-				break;
-			}
-		}
-	}
-	return (curveName);
-}
-
-function readPkcs8ECDSAPrivate(der) {
-	var curveName = readECDSACurve(der);
-	assert.string(curveName, 'a known elliptic curve');
-
-	der.readSequence(asn1.Ber.OctetString);
-	der.readSequence();
-
-	var version = readMPInt(der, 'version');
-	assert.equal(version[0], 1, 'unknown version of ECDSA key');
-
-	var d = der.readString(asn1.Ber.OctetString, true);
-	der.readSequence(0xa1);
-
-	var Q = der.readString(asn1.Ber.BitString, true);
-	Q = utils.ecNormalize(Q);
-
-	var key = {
-		type: 'ecdsa',
-		parts: [
-			{ name: 'curve', data: new Buffer(curveName) },
-			{ name: 'Q', data: Q },
-			{ name: 'd', data: d }
-		]
-	};
-
-	return (new PrivateKey(key));
-}
-
-function readPkcs8ECDSAPublic(der) {
-	var curveName = readECDSACurve(der);
-	assert.string(curveName, 'a known elliptic curve');
-
-	var Q = der.readString(asn1.Ber.BitString, true);
-	Q = utils.ecNormalize(Q);
-
-	var key = {
-		type: 'ecdsa',
-		parts: [
-			{ name: 'curve', data: new Buffer(curveName) },
-			{ name: 'Q', data: Q }
-		]
-	};
-
-	return (new Key(key));
-}
-
-function writePkcs8(der, key) {
-	der.startSequence();
-
-	if (PrivateKey.isPrivateKey(key)) {
-		var sillyInt = new Buffer(1);
-		sillyInt[0] = 0x0;
-		der.writeBuffer(sillyInt, asn1.Ber.Integer);
-	}
-
-	der.startSequence();
-	switch (key.type) {
-	case 'rsa':
-		der.writeOID('1.2.840.113549.1.1.1');
-		if (PrivateKey.isPrivateKey(key))
-			writePkcs8RSAPrivate(key, der);
-		else
-			writePkcs8RSAPublic(key, der);
-		break;
-	case 'dsa':
-		der.writeOID('1.2.840.10040.4.1');
-		if (PrivateKey.isPrivateKey(key))
-			writePkcs8DSAPrivate(key, der);
-		else
-			writePkcs8DSAPublic(key, der);
-		break;
-	case 'ecdsa':
-		der.writeOID('1.2.840.10045.2.1');
-		if (PrivateKey.isPrivateKey(key))
-			writePkcs8ECDSAPrivate(key, der);
-		else
-			writePkcs8ECDSAPublic(key, der);
-		break;
-	default:
-		throw (new Error('Unsupported key type: ' + key.type));
-	}
-
-	der.endSequence();
-}
-
-function writePkcs8RSAPrivate(key, der) {
-	der.writeNull();
-	der.endSequence();
-
-	der.startSequence(asn1.Ber.OctetString);
-	der.startSequence();
-
-	var version = new Buffer(1);
-	version[0] = 0;
-	der.writeBuffer(version, asn1.Ber.Integer);
-
-	der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.d.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
-	if (!key.part.dmodp || !key.part.dmodq)
-		utils.addRSAMissing(key);
-	der.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer);
-
-	der.endSequence();
-	der.endSequence();
-}
-
-function writePkcs8RSAPublic(key, der) {
-	der.writeNull();
-	der.endSequence();
-
-	der.startSequence(asn1.Ber.BitString);
-	der.writeByte(0x00);
-
-	der.startSequence();
-	der.writeBuffer(key.part.n.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.e.data, asn1.Ber.Integer);
-	der.endSequence();
-
-	der.endSequence();
-}
-
-function writePkcs8DSAPrivate(key, der) {
-	der.startSequence();
-	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
-	der.endSequence();
-
-	der.endSequence();
-
-	der.startSequence(asn1.Ber.OctetString);
-	der.writeBuffer(key.part.x.data, asn1.Ber.Integer);
-	der.endSequence();
-}
-
-function writePkcs8DSAPublic(key, der) {
-	der.startSequence();
-	der.writeBuffer(key.part.p.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.q.data, asn1.Ber.Integer);
-	der.writeBuffer(key.part.g.data, asn1.Ber.Integer);
-	der.endSequence();
-	der.endSequence();
-
-	der.startSequence(asn1.Ber.BitString);
-	der.writeByte(0x00);
-	der.writeBuffer(key.part.y.data, asn1.Ber.Integer);
-	der.endSequence();
-}
-
-function writeECDSACurve(key, der) {
-	var curve = algs.curves[key.curve];
-	if (curve.pkcs8oid) {
-		/* This one has a name in pkcs#8, so just write the oid */
-		der.writeOID(curve.pkcs8oid);
-
-	} else {
-		// ECParameters sequence
-		der.startSequence();
-
-		var version = new Buffer(1);
-		version.writeUInt8(1, 0);
-		der.writeBuffer(version, asn1.Ber.Integer);
-
-		// FieldID sequence
-		der.startSequence();
-		der.writeOID('1.2.840.10045.1.1'); // prime-field
-		der.writeBuffer(curve.p, asn1.Ber.Integer);
-		der.endSequence();
-
-		// Curve sequence
-		der.startSequence();
-		var a = curve.p;
-		if (a[0] === 0x0)
-			a = a.slice(1);
-		der.writeBuffer(a, asn1.Ber.OctetString);
-		der.writeBuffer(curve.b, asn1.Ber.OctetString);
-		der.writeBuffer(curve.s, asn1.Ber.BitString);
-		der.endSequence();
-
-		der.writeBuffer(curve.G, asn1.Ber.OctetString);
-		der.writeBuffer(curve.n, asn1.Ber.Integer);
-		var h = curve.h;
-		if (!h) {
-			h = new Buffer(1);
-			h[0] = 1;
-		}
-		der.writeBuffer(h, asn1.Ber.Integer);
-
-		// ECParameters
-		der.endSequence();
-	}
-}
-
-function writePkcs8ECDSAPublic(key, der) {
-	writeECDSACurve(key, der);
-	der.endSequence();
-
-	var Q = utils.ecNormalize(key.part.Q.data, true);
-	der.writeBuffer(Q, asn1.Ber.BitString);
-}
-
-function writePkcs8ECDSAPrivate(key, der) {
-	writeECDSACurve(key, der);
-	der.endSequence();
-
-	der.startSequence(asn1.Ber.OctetString);
-	der.startSequence();
-
-	var version = new Buffer(1);
-	version[0] = 1;
-	der.writeBuffer(version, asn1.Ber.Integer);
-
-	der.writeBuffer(key.part.d.data, asn1.Ber.OctetString);
-
-	der.startSequence(0xa1);
-	var Q = utils.ecNormalize(key.part.Q.data, true);
-	der.writeBuffer(Q, asn1.Ber.BitString);
-	der.endSequence();
-
-	der.endSequence();
-	der.endSequence();
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/rfc4253.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/rfc4253.js
deleted file mode 100644
index 9d436dd92155f6ca70d7d16f3577d45e1319d61c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/rfc4253.js
+++ /dev/null
@@ -1,146 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = {
-	read: read.bind(undefined, false, undefined),
-	readType: read.bind(undefined, false),
-	write: write,
-	/* semi-private api, used by sshpk-agent */
-	readPartial: read.bind(undefined, true),
-
-	/* shared with ssh format */
-	readInternal: read,
-	keyTypeToAlg: keyTypeToAlg,
-	algToKeyType: algToKeyType
-};
-
-var assert = require('assert-plus');
-var algs = require('../algs');
-var utils = require('../utils');
-var Key = require('../key');
-var PrivateKey = require('../private-key');
-var SSHBuffer = require('../ssh-buffer');
-
-function algToKeyType(alg) {
-	assert.string(alg);
-	if (alg === 'ssh-dss')
-		return ('dsa');
-	else if (alg === 'ssh-rsa')
-		return ('rsa');
-	else if (alg === 'ssh-ed25519')
-		return ('ed25519');
-	else if (alg === 'ssh-curve25519')
-		return ('curve25519');
-	else if (alg.match(/^ecdsa-sha2-/))
-		return ('ecdsa');
-	else
-		throw (new Error('Unknown algorithm ' + alg));
-}
-
-function keyTypeToAlg(key) {
-	assert.object(key);
-	if (key.type === 'dsa')
-		return ('ssh-dss');
-	else if (key.type === 'rsa')
-		return ('ssh-rsa');
-	else if (key.type === 'ed25519')
-		return ('ssh-ed25519');
-	else if (key.type === 'curve25519')
-		return ('ssh-curve25519');
-	else if (key.type === 'ecdsa')
-		return ('ecdsa-sha2-' + key.part.curve.data.toString());
-	else
-		throw (new Error('Unknown key type ' + key.type));
-}
-
-function read(partial, type, buf, options) {
-	if (typeof (buf) === 'string')
-		buf = new Buffer(buf);
-	assert.buffer(buf, 'buf');
-
-	var key = {};
-
-	var parts = key.parts = [];
-	var sshbuf = new SSHBuffer({buffer: buf});
-
-	var alg = sshbuf.readString();
-	assert.ok(!sshbuf.atEnd(), 'key must have at least one part');
-
-	key.type = algToKeyType(alg);
-
-	var partCount = algs.info[key.type].parts.length;
-	if (type && type === 'private')
-		partCount = algs.privInfo[key.type].parts.length;
-
-	while (!sshbuf.atEnd() && parts.length < partCount)
-		parts.push(sshbuf.readPart());
-	while (!partial && !sshbuf.atEnd())
-		parts.push(sshbuf.readPart());
-
-	assert.ok(parts.length >= 1,
-	    'key must have at least one part');
-	assert.ok(partial || sshbuf.atEnd(),
-	    'leftover bytes at end of key');
-
-	var Constructor = Key;
-	var algInfo = algs.info[key.type];
-	if (type === 'private' || algInfo.parts.length !== parts.length) {
-		algInfo = algs.privInfo[key.type];
-		Constructor = PrivateKey;
-	}
-	assert.strictEqual(algInfo.parts.length, parts.length);
-
-	if (key.type === 'ecdsa') {
-		var res = /^ecdsa-sha2-(.+)$/.exec(alg);
-		assert.ok(res !== null);
-		assert.strictEqual(res[1], parts[0].data.toString());
-	}
-
-	var normalized = true;
-	for (var i = 0; i < algInfo.parts.length; ++i) {
-		parts[i].name = algInfo.parts[i];
-		if (parts[i].name !== 'curve' &&
-		    algInfo.normalize !== false) {
-			var p = parts[i];
-			var nd = utils.mpNormalize(p.data);
-			if (nd !== p.data) {
-				p.data = nd;
-				normalized = false;
-			}
-		}
-	}
-
-	if (normalized)
-		key._rfc4253Cache = sshbuf.toBuffer();
-
-	if (partial && typeof (partial) === 'object') {
-		partial.remainder = sshbuf.remainder();
-		partial.consumed = sshbuf._offset;
-	}
-
-	return (new Constructor(key));
-}
-
-function write(key, options) {
-	assert.object(key);
-
-	var alg = keyTypeToAlg(key);
-	var i;
-
-	var algInfo = algs.info[key.type];
-	if (PrivateKey.isPrivateKey(key))
-		algInfo = algs.privInfo[key.type];
-	var parts = algInfo.parts;
-
-	var buf = new SSHBuffer({});
-
-	buf.writeString(alg);
-
-	for (i = 0; i < parts.length; ++i) {
-		var data = key.part[parts[i]].data;
-		if (algInfo.normalize !== false)
-			data = utils.mpNormalize(data);
-		buf.writeBuffer(data);
-	}
-
-	return (buf.toBuffer());
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js
deleted file mode 100644
index bfbdab527f9b822d31cec0040248b88fba0cbae7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh-private.js
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = {
-	read: read,
-	readSSHPrivate: readSSHPrivate,
-	write: write
-};
-
-var assert = require('assert-plus');
-var asn1 = require('asn1');
-var algs = require('../algs');
-var utils = require('../utils');
-var crypto = require('crypto');
-
-var Key = require('../key');
-var PrivateKey = require('../private-key');
-var pem = require('./pem');
-var rfc4253 = require('./rfc4253');
-var SSHBuffer = require('../ssh-buffer');
-
-function read(buf, options) {
-	return (pem.read(buf, options));
-}
-
-var MAGIC = 'openssh-key-v1';
-
-function readSSHPrivate(type, buf) {
-	buf = new SSHBuffer({buffer: buf});
-
-	var magic = buf.readCString();
-	assert.strictEqual(magic, MAGIC, 'bad magic string');
-
-	var cipher = buf.readString();
-	var kdf = buf.readString();
-
-	/* We only support unencrypted keys. */
-	if (cipher !== 'none' || kdf !== 'none') {
-		throw (new Error('OpenSSH-format key is encrypted ' +
-		     '(password-protected). Please use the SSH agent ' +
-		     'or decrypt the key.'));
-	}
-
-	/* Skip over kdfoptions. */
-	buf.readString();
-
-	var nkeys = buf.readInt();
-	if (nkeys !== 1) {
-		throw (new Error('OpenSSH-format key file contains ' +
-		    'multiple keys: this is unsupported.'));
-	}
-
-	var pubKey = buf.readBuffer();
-
-	if (type === 'public') {
-		assert.ok(buf.atEnd(), 'excess bytes left after key');
-		return (rfc4253.read(pubKey));
-	}
-
-	var privKeyBlob = buf.readBuffer();
-	assert.ok(buf.atEnd(), 'excess bytes left after key');
-
-	buf = new SSHBuffer({buffer: privKeyBlob});
-
-	var checkInt1 = buf.readInt();
-	var checkInt2 = buf.readInt();
-	assert.strictEqual(checkInt1, checkInt2, 'checkints do not match');
-
-	var ret = {};
-	var key = rfc4253.readInternal(ret, 'private', buf.remainder());
-
-	buf.skip(ret.consumed);
-
-	var comment = buf.readString();
-	key.comment = comment;
-
-	return (key);
-}
-
-function write(key, options) {
-	var pubKey;
-	if (PrivateKey.isPrivateKey(key))
-		pubKey = key.toPublic();
-	else
-		pubKey = key;
-
-	var privBuf;
-	if (PrivateKey.isPrivateKey(key)) {
-		privBuf = new SSHBuffer({});
-		var checkInt = crypto.randomBytes(4).readUInt32BE(0);
-		privBuf.writeInt(checkInt);
-		privBuf.writeInt(checkInt);
-		privBuf.write(key.toBuffer('rfc4253'));
-		privBuf.writeString(key.comment || '');
-
-		var n = 1;
-		while (privBuf._offset % 8 !== 0)
-			privBuf.writeChar(n++);
-	}
-
-	var buf = new SSHBuffer({});
-
-	buf.writeCString(MAGIC);
-	buf.writeString('none');	/* cipher */
-	buf.writeString('none');	/* kdf */
-	buf.writeBuffer(new Buffer(0));	/* kdfoptions */
-
-	buf.writeInt(1);		/* nkeys */
-	buf.writeBuffer(pubKey.toBuffer('rfc4253'));
-
-	if (privBuf)
-		buf.writeBuffer(privBuf.toBuffer());
-
-	buf = buf.toBuffer();
-
-	var header;
-	if (PrivateKey.isPrivateKey(key))
-		header = 'OPENSSH PRIVATE KEY';
-	else
-		header = 'OPENSSH PUBLIC KEY';
-
-	var tmp = buf.toString('base64');
-	var len = tmp.length + (tmp.length / 70) +
-	    18 + 16 + header.length*2 + 10;
-	buf = new Buffer(len);
-	var o = 0;
-	o += buf.write('-----BEGIN ' + header + '-----\n', o);
-	for (var i = 0; i < tmp.length; ) {
-		var limit = i + 70;
-		if (limit > tmp.length)
-			limit = tmp.length;
-		o += buf.write(tmp.slice(i, limit), o);
-		buf[o++] = 10;
-		i = limit;
-	}
-	o += buf.write('-----END ' + header + '-----\n', o);
-
-	return (buf.slice(0, o));
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh.js
deleted file mode 100644
index 655c9eaf3bf7c9aa18e493694c1b17cbd4e95da0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/formats/ssh.js
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = {
-	read: read,
-	write: write
-};
-
-var assert = require('assert-plus');
-var rfc4253 = require('./rfc4253');
-var utils = require('../utils');
-var Key = require('../key');
-var PrivateKey = require('../private-key');
-
-var sshpriv = require('./ssh-private');
-
-/*JSSTYLED*/
-var SSHKEY_RE = /^([a-z0-9-]+)[ \t]+([a-zA-Z0-9+\/]+[=]*)([\n \t]+([^\n]+))?$/;
-/*JSSTYLED*/
-var SSHKEY_RE2 = /^([a-z0-9-]+)[ \t]+([a-zA-Z0-9+\/ \t\n]+[=]*)(.*)$/;
-
-function read(buf, options) {
-	if (typeof (buf) !== 'string') {
-		assert.buffer(buf, 'buf');
-		buf = buf.toString('ascii');
-	}
-
-	var trimmed = buf.trim().replace(/[\\\r]/g, '');
-	var m = trimmed.match(SSHKEY_RE);
-	if (!m)
-		m = trimmed.match(SSHKEY_RE2);
-	assert.ok(m, 'key must match regex');
-
-	var type = rfc4253.algToKeyType(m[1]);
-	var kbuf = new Buffer(m[2], 'base64');
-
-	/*
-	 * This is a bit tricky. If we managed to parse the key and locate the
-	 * key comment with the regex, then do a non-partial read and assert
-	 * that we have consumed all bytes. If we couldn't locate the key
-	 * comment, though, there may be whitespace shenanigans going on that
-	 * have conjoined the comment to the rest of the key. We do a partial
-	 * read in this case to try to make the best out of a sorry situation.
-	 */
-	var key;
-	var ret = {};
-	if (m[4]) {
-		try {
-			key = rfc4253.read(kbuf);
-
-		} catch (e) {
-			m = trimmed.match(SSHKEY_RE2);
-			assert.ok(m, 'key must match regex');
-			kbuf = new Buffer(m[2], 'base64');
-			key = rfc4253.readInternal(ret, 'public', kbuf);
-		}
-	} else {
-		key = rfc4253.readInternal(ret, 'public', kbuf);
-	}
-
-	assert.strictEqual(type, key.type);
-
-	if (m[4] && m[4].length > 0) {
-		key.comment = m[4];
-
-	} else if (ret.consumed) {
-		/*
-		 * Now the magic: trying to recover the key comment when it's
-		 * gotten conjoined to the key or otherwise shenanigan'd.
-		 *
-		 * Work out how much base64 we used, then drop all non-base64
-		 * chars from the beginning up to this point in the the string.
-		 * Then offset in this and try to make up for missing = chars.
-		 */
-		var data = m[2] + m[3];
-		var realOffset = Math.ceil(ret.consumed / 3) * 4;
-		data = data.slice(0, realOffset - 2). /*JSSTYLED*/
-		    replace(/[^a-zA-Z0-9+\/=]/g, '') +
-		    data.slice(realOffset - 2);
-
-		var padding = ret.consumed % 3;
-		if (padding > 0 &&
-		    data.slice(realOffset - 1, realOffset) !== '=')
-			realOffset--;
-		while (data.slice(realOffset, realOffset + 1) === '=')
-			realOffset++;
-
-		/* Finally, grab what we think is the comment & clean it up. */
-		var trailer = data.slice(realOffset);
-		trailer = trailer.replace(/[\r\n]/g, ' ').
-		    replace(/^\s+/, '');
-		if (trailer.match(/^[a-zA-Z0-9]/))
-			key.comment = trailer;
-	}
-
-	return (key);
-}
-
-function write(key, options) {
-	assert.object(key);
-	if (!Key.isKey(key))
-		throw (new Error('Must be a public key'));
-
-	var parts = [];
-	var alg = rfc4253.keyTypeToAlg(key);
-	parts.push(alg);
-
-	var buf = rfc4253.write(key);
-	parts.push(buf.toString('base64'));
-
-	if (key.comment)
-		parts.push(key.comment);
-
-	return (new Buffer(parts.join(' ')));
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/index.js
deleted file mode 100644
index 0b40429c95c21fca0478e767b42f236ae9cde2f3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-var Key = require('./key');
-var Fingerprint = require('./fingerprint');
-var Signature = require('./signature');
-var PrivateKey = require('./private-key');
-var errs = require('./errors');
-
-module.exports = {
-	/* top-level classes */
-	Key: Key,
-	parseKey: Key.parse,
-	Fingerprint: Fingerprint,
-	parseFingerprint: Fingerprint.parse,
-	Signature: Signature,
-	parseSignature: Signature.parse,
-	PrivateKey: PrivateKey,
-	parsePrivateKey: PrivateKey.parse,
-
-	/* errors */
-	FingerprintFormatError: errs.FingerprintFormatError,
-	InvalidAlgorithmError: errs.InvalidAlgorithmError,
-	KeyParseError: errs.KeyParseError,
-	SignatureParseError: errs.SignatureParseError,
-	KeyEncryptedError: errs.KeyEncryptedError
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/key.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/key.js
deleted file mode 100644
index edc5143426a1228706473812615431227c2eea16..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/key.js
+++ /dev/null
@@ -1,269 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = Key;
-
-var assert = require('assert-plus');
-var algs = require('./algs');
-var crypto = require('crypto');
-var Fingerprint = require('./fingerprint');
-var Signature = require('./signature');
-var DiffieHellman = require('./dhe');
-var errs = require('./errors');
-var utils = require('./utils');
-var PrivateKey = require('./private-key');
-var edCompat;
-
-try {
-	edCompat = require('./ed-compat');
-} catch (e) {
-	/* Just continue through, and bail out if we try to use it. */
-}
-
-var InvalidAlgorithmError = errs.InvalidAlgorithmError;
-var KeyParseError = errs.KeyParseError;
-
-var formats = {};
-formats['auto'] = require('./formats/auto');
-formats['pem'] = require('./formats/pem');
-formats['pkcs1'] = require('./formats/pkcs1');
-formats['pkcs8'] = require('./formats/pkcs8');
-formats['rfc4253'] = require('./formats/rfc4253');
-formats['ssh'] = require('./formats/ssh');
-formats['ssh-private'] = require('./formats/ssh-private');
-formats['openssh'] = formats['ssh-private'];
-
-function Key(opts) {
-	assert.object(opts, 'options');
-	assert.arrayOfObject(opts.parts, 'options.parts');
-	assert.string(opts.type, 'options.type');
-	assert.optionalString(opts.comment, 'options.comment');
-
-	var algInfo = algs.info[opts.type];
-	if (typeof (algInfo) !== 'object')
-		throw (new InvalidAlgorithmError(opts.type));
-
-	var partLookup = {};
-	for (var i = 0; i < opts.parts.length; ++i) {
-		var part = opts.parts[i];
-		partLookup[part.name] = part;
-	}
-
-	this.type = opts.type;
-	this.parts = opts.parts;
-	this.part = partLookup;
-	this.comment = undefined;
-	this.source = opts.source;
-
-	/* for speeding up hashing/fingerprint operations */
-	this._rfc4253Cache = opts._rfc4253Cache;
-	this._hashCache = {};
-
-	var sz;
-	this.curve = undefined;
-	if (this.type === 'ecdsa') {
-		var curve = this.part.curve.data.toString();
-		this.curve = curve;
-		sz = algs.curves[curve].size;
-	} else if (this.type === 'ed25519') {
-		sz = 256;
-		this.curve = 'curve25519';
-	} else {
-		var szPart = this.part[algInfo.sizePart];
-		sz = szPart.data.length;
-		sz = sz * 8 - utils.countZeros(szPart.data);
-	}
-	this.size = sz;
-}
-
-Key.formats = formats;
-
-Key.prototype.toBuffer = function (format, options) {
-	if (format === undefined)
-		format = 'ssh';
-	assert.string(format, 'format');
-	assert.object(formats[format], 'formats[format]');
-	assert.optionalObject(options, 'options');
-
-	if (format === 'rfc4253') {
-		if (this._rfc4253Cache === undefined)
-			this._rfc4253Cache = formats['rfc4253'].write(this);
-		return (this._rfc4253Cache);
-	}
-
-	return (formats[format].write(this, options));
-};
-
-Key.prototype.toString = function (format, options) {
-	return (this.toBuffer(format, options).toString());
-};
-
-Key.prototype.hash = function (algo) {
-	assert.string(algo, 'algorithm');
-	algo = algo.toLowerCase();
-	if (algs.hashAlgs[algo] === undefined)
-		throw (new InvalidAlgorithmError(algo));
-
-	if (this._hashCache[algo])
-		return (this._hashCache[algo]);
-
-	var hash = crypto.createHash(algo).
-	    update(this.toBuffer('rfc4253')).digest();
-	this._hashCache[algo] = hash;
-	return (hash);
-};
-
-Key.prototype.fingerprint = function (algo) {
-	if (algo === undefined)
-		algo = 'sha256';
-	assert.string(algo, 'algorithm');
-	var opts = {
-		hash: this.hash(algo),
-		algorithm: algo
-	};
-	return (new Fingerprint(opts));
-};
-
-Key.prototype.defaultHashAlgorithm = function () {
-	var hashAlgo = 'sha1';
-	if (this.type === 'rsa')
-		hashAlgo = 'sha256';
-	if (this.type === 'dsa' && this.size > 1024)
-		hashAlgo = 'sha256';
-	if (this.type === 'ed25519')
-		hashAlgo = 'sha512';
-	if (this.type === 'ecdsa') {
-		if (this.size <= 256)
-			hashAlgo = 'sha256';
-		else if (this.size <= 384)
-			hashAlgo = 'sha384';
-		else
-			hashAlgo = 'sha512';
-	}
-	return (hashAlgo);
-};
-
-Key.prototype.createVerify = function (hashAlgo) {
-	if (hashAlgo === undefined)
-		hashAlgo = this.defaultHashAlgorithm();
-	assert.string(hashAlgo, 'hash algorithm');
-
-	/* ED25519 is not supported by OpenSSL, use a javascript impl. */
-	if (this.type === 'ed25519' && edCompat !== undefined)
-		return (new edCompat.Verifier(this, hashAlgo));
-	if (this.type === 'curve25519')
-		throw (new Error('Curve25519 keys are not suitable for ' +
-		    'signing or verification'));
-
-	var v, nm, err;
-	try {
-		nm = hashAlgo.toUpperCase();
-		v = crypto.createVerify(nm);
-	} catch (e) {
-		err = e;
-	}
-	if (v === undefined || (err instanceof Error &&
-	    err.message.match(/Unknown message digest/))) {
-		nm = 'RSA-';
-		nm += hashAlgo.toUpperCase();
-		v = crypto.createVerify(nm);
-	}
-	assert.ok(v, 'failed to create verifier');
-	var oldVerify = v.verify.bind(v);
-	var key = this.toBuffer('pkcs8');
-	var self = this;
-	v.verify = function (signature, fmt) {
-		if (Signature.isSignature(signature, [2, 0])) {
-			if (signature.type !== self.type)
-				return (false);
-			if (signature.hashAlgorithm &&
-			    signature.hashAlgorithm !== hashAlgo)
-				return (false);
-			return (oldVerify(key, signature.toBuffer('asn1')));
-
-		} else if (typeof (signature) === 'string' ||
-		    Buffer.isBuffer(signature)) {
-			return (oldVerify(key, signature, fmt));
-
-		/*
-		 * Avoid doing this on valid arguments, walking the prototype
-		 * chain can be quite slow.
-		 */
-		} else if (Signature.isSignature(signature, [1, 0])) {
-			throw (new Error('signature was created by too old ' +
-			    'a version of sshpk and cannot be verified'));
-
-		} else {
-			throw (new TypeError('signature must be a string, ' +
-			    'Buffer, or Signature object'));
-		}
-	};
-	return (v);
-};
-
-Key.prototype.createDiffieHellman = function () {
-	if (this.type === 'rsa')
-		throw (new Error('RSA keys do not support Diffie-Hellman'));
-
-	return (new DiffieHellman(this));
-};
-Key.prototype.createDH = Key.prototype.createDiffieHellman;
-
-Key.parse = function (data, format, options) {
-	if (typeof (data) !== 'string')
-		assert.buffer(data, 'data');
-	if (format === undefined)
-		format = 'auto';
-	assert.string(format, 'format');
-	if (typeof (options) === 'string')
-		options = { filename: options };
-	assert.optionalObject(options, 'options');
-	if (options === undefined)
-		options = {};
-	assert.optionalString(options.filename, 'options.filename');
-	if (options.filename === undefined)
-		options.filename = '(unnamed)';
-
-	assert.object(formats[format], 'formats[format]');
-
-	try {
-		var k = formats[format].read(data, options);
-		if (k instanceof PrivateKey)
-			k = k.toPublic();
-		if (!k.comment)
-			k.comment = options.filename;
-		return (k);
-	} catch (e) {
-		if (e.name === 'KeyEncryptedError')
-			throw (e);
-		throw (new KeyParseError(options.filename, format, e));
-	}
-};
-
-Key.isKey = function (obj, ver) {
-	return (utils.isCompatible(obj, Key, ver));
-};
-
-/*
- * API versions for Key:
- * [1,0] -- initial ver, may take Signature for createVerify or may not
- * [1,1] -- added pkcs1, pkcs8 formats
- * [1,2] -- added auto, ssh-private, openssh formats
- * [1,3] -- added defaultHashAlgorithm
- * [1,4] -- added ed support, createDH
- * [1,5] -- first explicitly tagged version
- */
-Key.prototype._sshpkApiVersion = [1, 5];
-
-Key._oldVersionDetect = function (obj) {
-	assert.func(obj.toBuffer);
-	assert.func(obj.fingerprint);
-	if (obj.createDH)
-		return ([1, 4]);
-	if (obj.defaultHashAlgorithm)
-		return ([1, 3]);
-	if (obj.formats['auto'])
-		return ([1, 2]);
-	if (obj.formats['pkcs1'])
-		return ([1, 1]);
-	return ([1, 0]);
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/private-key.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/private-key.js
deleted file mode 100644
index f80d93966286b52fdb861abf7be9d11f439855f2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/private-key.js
+++ /dev/null
@@ -1,231 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = PrivateKey;
-
-var assert = require('assert-plus');
-var algs = require('./algs');
-var crypto = require('crypto');
-var Fingerprint = require('./fingerprint');
-var Signature = require('./signature');
-var errs = require('./errors');
-var util = require('util');
-var utils = require('./utils');
-var edCompat;
-var ed;
-
-try {
-	edCompat = require('./ed-compat');
-} catch (e) {
-	/* Just continue through, and bail out if we try to use it. */
-}
-
-var Key = require('./key');
-
-var InvalidAlgorithmError = errs.InvalidAlgorithmError;
-var KeyParseError = errs.KeyParseError;
-var KeyEncryptedError = errs.KeyEncryptedError;
-
-var formats = {};
-formats['auto'] = require('./formats/auto');
-formats['pem'] = require('./formats/pem');
-formats['pkcs1'] = require('./formats/pkcs1');
-formats['pkcs8'] = require('./formats/pkcs8');
-formats['rfc4253'] = require('./formats/rfc4253');
-formats['ssh-private'] = require('./formats/ssh-private');
-formats['openssh'] = formats['ssh-private'];
-formats['ssh'] = formats['ssh-private'];
-
-function PrivateKey(opts) {
-	assert.object(opts, 'options');
-	Key.call(this, opts);
-
-	this._pubCache = undefined;
-}
-util.inherits(PrivateKey, Key);
-
-PrivateKey.formats = formats;
-
-PrivateKey.prototype.toBuffer = function (format, options) {
-	if (format === undefined)
-		format = 'pkcs1';
-	assert.string(format, 'format');
-	assert.object(formats[format], 'formats[format]');
-	assert.optionalObject(options, 'options');
-
-	return (formats[format].write(this, options));
-};
-
-PrivateKey.prototype.hash = function (algo) {
-	return (this.toPublic().hash(algo));
-};
-
-PrivateKey.prototype.toPublic = function () {
-	if (this._pubCache)
-		return (this._pubCache);
-
-	var algInfo = algs.info[this.type];
-	var pubParts = [];
-	for (var i = 0; i < algInfo.parts.length; ++i) {
-		var p = algInfo.parts[i];
-		pubParts.push(this.part[p]);
-	}
-
-	this._pubCache = new Key({
-		type: this.type,
-		source: this,
-		parts: pubParts
-	});
-	if (this.comment)
-		this._pubCache.comment = this.comment;
-	return (this._pubCache);
-};
-
-PrivateKey.prototype.derive = function (newType, newSize) {
-	assert.string(newType, 'type');
-	assert.optionalNumber(newSize, 'size');
-	var priv, pub;
-
-	if (this.type === 'ed25519' && newType === 'curve25519') {
-		if (ed === undefined)
-			ed = require('jodid25519');
-
-		priv = this.part.r.data;
-		if (priv[0] === 0x00)
-			priv = priv.slice(1);
-		priv = priv.slice(0, 32);
-
-		pub = ed.dh.publicKey(priv);
-		priv = utils.mpNormalize(Buffer.concat([priv, pub]));
-
-		return (new PrivateKey({
-			type: 'curve25519',
-			parts: [
-				{ name: 'R', data: utils.mpNormalize(pub) },
-				{ name: 'r', data: priv }
-			]
-		}));
-	} else if (this.type === 'curve25519' && newType === 'ed25519') {
-		if (ed === undefined)
-			ed = require('jodid25519');
-
-		priv = this.part.r.data;
-		if (priv[0] === 0x00)
-			priv = priv.slice(1);
-		priv = priv.slice(0, 32);
-
-		pub = ed.eddsa.publicKey(priv.toString('binary'));
-		pub = new Buffer(pub, 'binary');
-
-		priv = utils.mpNormalize(Buffer.concat([priv, pub]));
-
-		return (new PrivateKey({
-			type: 'ed25519',
-			parts: [
-				{ name: 'R', data: utils.mpNormalize(pub) },
-				{ name: 'r', data: priv }
-			]
-		}));
-	}
-	throw (new Error('Key derivation not supported from ' + this.type +
-	    ' to ' + newType));
-};
-
-PrivateKey.prototype.createVerify = function (hashAlgo) {
-	return (this.toPublic().createVerify(hashAlgo));
-};
-
-PrivateKey.prototype.createSign = function (hashAlgo) {
-	if (hashAlgo === undefined)
-		hashAlgo = this.defaultHashAlgorithm();
-	assert.string(hashAlgo, 'hash algorithm');
-
-	/* ED25519 is not supported by OpenSSL, use a javascript impl. */
-	if (this.type === 'ed25519' && edCompat !== undefined)
-		return (new edCompat.Signer(this, hashAlgo));
-	if (this.type === 'curve25519')
-		throw (new Error('Curve25519 keys are not suitable for ' +
-		    'signing or verification'));
-
-	var v, nm, err;
-	try {
-		nm = hashAlgo.toUpperCase();
-		v = crypto.createSign(nm);
-	} catch (e) {
-		err = e;
-	}
-	if (v === undefined || (err instanceof Error &&
-	    err.message.match(/Unknown message digest/))) {
-		nm = 'RSA-';
-		nm += hashAlgo.toUpperCase();
-		v = crypto.createSign(nm);
-	}
-	assert.ok(v, 'failed to create verifier');
-	var oldSign = v.sign.bind(v);
-	var key = this.toBuffer('pkcs1');
-	var type = this.type;
-	v.sign = function () {
-		var sig = oldSign(key);
-		if (typeof (sig) === 'string')
-			sig = new Buffer(sig, 'binary');
-		sig = Signature.parse(sig, type, 'asn1');
-		sig.hashAlgorithm = hashAlgo;
-		return (sig);
-	};
-	return (v);
-};
-
-PrivateKey.parse = function (data, format, options) {
-	if (typeof (data) !== 'string')
-		assert.buffer(data, 'data');
-	if (format === undefined)
-		format = 'auto';
-	assert.string(format, 'format');
-	if (typeof (options) === 'string')
-		options = { filename: options };
-	assert.optionalObject(options, 'options');
-	if (options === undefined)
-		options = {};
-	assert.optionalString(options.filename, 'options.filename');
-	if (options.filename === undefined)
-		options.filename = '(unnamed)';
-
-	assert.object(formats[format], 'formats[format]');
-
-	try {
-		var k = formats[format].read(data, options);
-		assert.ok(k instanceof PrivateKey, 'key is not a private key');
-		if (!k.comment)
-			k.comment = options.filename;
-		return (k);
-	} catch (e) {
-		if (e.name === 'KeyEncryptedError')
-			throw (e);
-		throw (new KeyParseError(options.filename, format, e));
-	}
-};
-
-PrivateKey.isPrivateKey = function (obj, ver) {
-	return (utils.isCompatible(obj, PrivateKey, ver));
-};
-
-/*
- * API versions for PrivateKey:
- * [1,0] -- initial ver
- * [1,1] -- added auto, pkcs[18], openssh/ssh-private formats
- * [1,2] -- added defaultHashAlgorithm
- * [1,3] -- added derive, ed, createDH
- * [1,4] -- first tagged version
- */
-PrivateKey.prototype._sshpkApiVersion = [1, 4];
-
-PrivateKey._oldVersionDetect = function (obj) {
-	assert.func(obj.toPublic);
-	assert.func(obj.createSign);
-	if (obj.derive)
-		return ([1, 3]);
-	if (obj.defaultHashAlgorithm)
-		return ([1, 2]);
-	if (obj.formats['auto'])
-		return ([1, 1]);
-	return ([1, 0]);
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/signature.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/signature.js
deleted file mode 100644
index ddf4a8c988c908540cc9bd4f3598bf80809bcd5e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/signature.js
+++ /dev/null
@@ -1,237 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = Signature;
-
-var assert = require('assert-plus');
-var algs = require('./algs');
-var crypto = require('crypto');
-var errs = require('./errors');
-var utils = require('./utils');
-var asn1 = require('asn1');
-var SSHBuffer = require('./ssh-buffer');
-
-var InvalidAlgorithmError = errs.InvalidAlgorithmError;
-var SignatureParseError = errs.SignatureParseError;
-
-function Signature(opts) {
-	assert.object(opts, 'options');
-	assert.arrayOfObject(opts.parts, 'options.parts');
-	assert.string(opts.type, 'options.type');
-
-	var partLookup = {};
-	for (var i = 0; i < opts.parts.length; ++i) {
-		var part = opts.parts[i];
-		partLookup[part.name] = part;
-	}
-
-	this.type = opts.type;
-	this.hashAlgorithm = opts.hashAlgo;
-	this.parts = opts.parts;
-	this.part = partLookup;
-}
-
-Signature.prototype.toBuffer = function (format) {
-	if (format === undefined)
-		format = 'asn1';
-	assert.string(format, 'format');
-
-	var buf;
-
-	switch (this.type) {
-	case 'rsa':
-	case 'ed25519':
-		if (format === 'ssh') {
-			buf = new SSHBuffer({});
-			buf.writeString('ssh-' + this.type);
-			buf.writePart(this.part.sig);
-			return (buf.toBuffer());
-		} else {
-			return (this.part.sig.data);
-		}
-
-	case 'dsa':
-	case 'ecdsa':
-		var r, s;
-		if (format === 'asn1') {
-			var der = new asn1.BerWriter();
-			der.startSequence();
-			r = utils.mpNormalize(this.part.r.data);
-			s = utils.mpNormalize(this.part.s.data);
-			der.writeBuffer(r, asn1.Ber.Integer);
-			der.writeBuffer(s, asn1.Ber.Integer);
-			der.endSequence();
-			return (der.buffer);
-		} else if (format === 'ssh' && this.type === 'dsa') {
-			buf = new SSHBuffer({});
-			buf.writeString('ssh-dss');
-			r = this.part.r.data;
-			if (r[0] === 0x00)
-				r = r.slice(1);
-			s = this.part.s.data;
-			buf.writeBuffer(Buffer.concat([r, s]));
-			return (buf.toBuffer());
-		} else if (format === 'ssh' && this.type === 'ecdsa') {
-			var inner = new SSHBuffer({});
-			r = this.part.r;
-			if (r[0] === 0x00)
-				r = r.slice(1);
-			inner.writePart(r);
-			inner.writePart(this.part.s);
-
-			buf = new SSHBuffer({});
-			/* XXX: find a more proper way to do this? */
-			var curve;
-			var sz = this.part.r.data.length * 8;
-			if (sz === 256)
-				curve = 'nistp256';
-			else if (sz === 384)
-				curve = 'nistp384';
-			else if (sz === 528)
-				curve = 'nistp521';
-			buf.writeString('ecdsa-sha2-' + curve);
-			buf.writeBuffer(inner.toBuffer());
-			return (buf.toBuffer());
-		}
-		throw (new Error('Invalid signature format'));
-	default:
-		throw (new Error('Invalid signature data'));
-	}
-};
-
-Signature.prototype.toString = function (format) {
-	assert.optionalString(format, 'format');
-	return (this.toBuffer(format).toString('base64'));
-};
-
-Signature.parse = function (data, type, format) {
-	if (typeof (data) === 'string')
-		data = new Buffer(data, 'base64');
-	assert.buffer(data, 'data');
-	assert.string(format, 'format');
-	assert.string(type, 'type');
-
-	var opts = {};
-	opts.type = type.toLowerCase();
-	opts.parts = [];
-
-	try {
-		assert.ok(data.length > 0, 'signature must not be empty');
-		switch (opts.type) {
-		case 'rsa':
-			return (parseOneNum(data, type, format, opts,
-			    'ssh-rsa'));
-		case 'ed25519':
-			return (parseOneNum(data, type, format, opts,
-			    'ssh-ed25519'));
-
-		case 'dsa':
-		case 'ecdsa':
-			if (format === 'asn1')
-				return (parseDSAasn1(data, type, format, opts));
-			else if (opts.type === 'dsa')
-				return (parseDSA(data, type, format, opts));
-			else
-				return (parseECDSA(data, type, format, opts));
-
-		default:
-			throw (new InvalidAlgorithmError(type));
-		}
-
-	} catch (e) {
-		if (e instanceof InvalidAlgorithmError)
-			throw (e);
-		throw (new SignatureParseError(type, format, e));
-	}
-};
-
-function parseOneNum(data, type, format, opts, headType) {
-	if (format === 'ssh') {
-		try {
-			var buf = new SSHBuffer({buffer: data});
-			var head = buf.readString();
-		} catch (e) {
-			/* fall through */
-		}
-		if (head === headType) {
-			var sig = buf.readPart();
-			assert.ok(buf.atEnd(), 'extra trailing bytes');
-			sig.name = 'sig';
-			opts.parts.push(sig);
-			return (new Signature(opts));
-		}
-	}
-	opts.parts.push({name: 'sig', data: data});
-	return (new Signature(opts));
-}
-
-function parseDSAasn1(data, type, format, opts) {
-	var der = new asn1.BerReader(data);
-	der.readSequence();
-	var r = der.readString(asn1.Ber.Integer, true);
-	var s = der.readString(asn1.Ber.Integer, true);
-
-	opts.parts.push({name: 'r', data: utils.mpNormalize(r)});
-	opts.parts.push({name: 's', data: utils.mpNormalize(s)});
-
-	return (new Signature(opts));
-}
-
-function parseDSA(data, type, format, opts) {
-	if (data.length != 40) {
-		var buf = new SSHBuffer({buffer: data});
-		var d = buf.readBuffer();
-		if (d.toString('ascii') === 'ssh-dss')
-			d = buf.readBuffer();
-		assert.ok(buf.atEnd(), 'extra trailing bytes');
-		assert.strictEqual(d.length, 40, 'invalid inner length');
-		data = d;
-	}
-	opts.parts.push({name: 'r', data: data.slice(0, 20)});
-	opts.parts.push({name: 's', data: data.slice(20, 40)});
-	return (new Signature(opts));
-}
-
-function parseECDSA(data, type, format, opts) {
-	var buf = new SSHBuffer({buffer: data});
-
-	var r, s;
-	var inner = buf.readBuffer();
-	if (inner.toString('ascii').match(/^ecdsa-/)) {
-		inner = buf.readBuffer();
-		assert.ok(buf.atEnd(), 'extra trailing bytes on outer');
-		buf = new SSHBuffer({buffer: inner});
-		r = buf.readPart();
-	} else {
-		r = {data: inner};
-	}
-
-	s = buf.readPart();
-	assert.ok(buf.atEnd(), 'extra trailing bytes');
-
-	r.name = 'r';
-	s.name = 's';
-
-	opts.parts.push(r);
-	opts.parts.push(s);
-	return (new Signature(opts));
-}
-
-Signature.isSignature = function (obj, ver) {
-	return (utils.isCompatible(obj, Signature, ver));
-};
-
-/*
- * API versions for Signature:
- * [1,0] -- initial ver
- * [2,0] -- support for rsa in full ssh format, compat with sshpk-agent
- *          hashAlgorithm property
- * [2,1] -- first tagged version
- */
-Signature.prototype._sshpkApiVersion = [2, 1];
-
-Signature._oldVersionDetect = function (obj) {
-	assert.func(obj.toBuffer);
-	if (obj.hasOwnProperty('hashAlgorithm'))
-		return ([2, 0]);
-	return ([1, 0]);
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ssh-buffer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ssh-buffer.js
deleted file mode 100644
index 0b0027734959a4c374774965d0deb1ee524e58a5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/ssh-buffer.js
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = SSHBuffer;
-
-var assert = require('assert-plus');
-
-function SSHBuffer(opts) {
-	assert.object(opts, 'options');
-	if (opts.buffer !== undefined)
-		assert.buffer(opts.buffer, 'options.buffer');
-
-	this._size = opts.buffer ? opts.buffer.length : 1024;
-	this._buffer = opts.buffer || (new Buffer(this._size));
-	this._offset = 0;
-}
-
-SSHBuffer.prototype.toBuffer = function () {
-	return (this._buffer.slice(0, this._offset));
-};
-
-SSHBuffer.prototype.atEnd = function () {
-	return (this._offset >= this._buffer.length);
-};
-
-SSHBuffer.prototype.remainder = function () {
-	return (this._buffer.slice(this._offset));
-};
-
-SSHBuffer.prototype.skip = function (n) {
-	this._offset += n;
-};
-
-SSHBuffer.prototype.expand = function () {
-	this._size *= 2;
-	var buf = new Buffer(this._size);
-	this._buffer.copy(buf, 0);
-	this._buffer = buf;
-};
-
-SSHBuffer.prototype.readPart = function () {
-	return ({data: this.readBuffer()});
-};
-
-SSHBuffer.prototype.readBuffer = function () {
-	var len = this._buffer.readUInt32BE(this._offset);
-	this._offset += 4;
-	assert.ok(this._offset + len <= this._buffer.length,
-	    'length out of bounds at +0x' + this._offset.toString(16) +
-	    ' (data truncated?)');
-	var buf = this._buffer.slice(this._offset, this._offset + len);
-	this._offset += len;
-	return (buf);
-};
-
-SSHBuffer.prototype.readString = function () {
-	return (this.readBuffer().toString());
-};
-
-SSHBuffer.prototype.readCString = function () {
-	var offset = this._offset;
-	while (offset < this._buffer.length &&
-	    this._buffer[offset] !== 0x00)
-		offset++;
-	assert.ok(offset < this._buffer.length, 'c string does not terminate');
-	var str = this._buffer.slice(this._offset, offset).toString();
-	this._offset = offset + 1;
-	return (str);
-};
-
-SSHBuffer.prototype.readInt = function () {
-	var v = this._buffer.readUInt32BE(this._offset);
-	this._offset += 4;
-	return (v);
-};
-
-SSHBuffer.prototype.readChar = function () {
-	var v = this._buffer[this._offset++];
-	return (v);
-};
-
-SSHBuffer.prototype.writeBuffer = function (buf) {
-	while (this._offset + 4 + buf.length > this._size)
-		this.expand();
-	this._buffer.writeUInt32BE(buf.length, this._offset);
-	this._offset += 4;
-	buf.copy(this._buffer, this._offset);
-	this._offset += buf.length;
-};
-
-SSHBuffer.prototype.writeString = function (str) {
-	this.writeBuffer(new Buffer(str, 'utf8'));
-};
-
-SSHBuffer.prototype.writeCString = function (str) {
-	while (this._offset + 1 + str.length > this._size)
-		this.expand();
-	this._buffer.write(str, this._offset);
-	this._offset += str.length;
-	this._buffer[this._offset++] = 0;
-};
-
-SSHBuffer.prototype.writeInt = function (v) {
-	while (this._offset + 4 > this._size)
-		this.expand();
-	this._buffer.writeUInt32BE(v, this._offset);
-	this._offset += 4;
-};
-
-SSHBuffer.prototype.writeChar = function (v) {
-	while (this._offset + 1 > this._size)
-		this.expand();
-	this._buffer[this._offset++] = v;
-};
-
-SSHBuffer.prototype.writePart = function (p) {
-	this.writeBuffer(p.data);
-};
-
-SSHBuffer.prototype.write = function (buf) {
-	while (this._offset + buf.length > this._size)
-		this.expand();
-	buf.copy(this._buffer, this._offset);
-	this._offset += buf.length;
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js
deleted file mode 100644
index d57245cc16b41ddcc99197f7386a7b4f917fa093..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/lib/utils.js
+++ /dev/null
@@ -1,246 +0,0 @@
-// Copyright 2015 Joyent, Inc.
-
-module.exports = {
-	bufferSplit: bufferSplit,
-	addRSAMissing: addRSAMissing,
-	calculateDSAPublic: calculateDSAPublic,
-	mpNormalize: mpNormalize,
-	ecNormalize: ecNormalize,
-	countZeros: countZeros,
-	assertCompatible: assertCompatible,
-	isCompatible: isCompatible,
-	opensslKeyDeriv: opensslKeyDeriv
-};
-
-var assert = require('assert-plus');
-var PrivateKey = require('./private-key');
-var crypto = require('crypto');
-
-var MAX_CLASS_DEPTH = 3;
-
-function isCompatible(obj, klass, needVer) {
-	if (obj === null || typeof (obj) !== 'object')
-		return (false);
-	if (needVer === undefined)
-		needVer = klass.prototype._sshpkApiVersion;
-	if (obj instanceof klass &&
-	    klass.prototype._sshpkApiVersion[0] == needVer[0])
-		return (true);
-	var proto = Object.getPrototypeOf(obj);
-	var depth = 0;
-	while (proto.constructor.name !== klass.name) {
-		proto = Object.getPrototypeOf(proto);
-		if (!proto || ++depth > MAX_CLASS_DEPTH)
-			return (false);
-	}
-	if (proto.constructor.name !== klass.name)
-		return (false);
-	var ver = proto._sshpkApiVersion;
-	if (ver === undefined)
-		ver = klass._oldVersionDetect(obj);
-	if (ver[0] != needVer[0] || ver[1] < needVer[1])
-		return (false);
-	return (true);
-}
-
-function assertCompatible(obj, klass, needVer, name) {
-	if (name === undefined)
-		name = 'object';
-	assert.ok(obj, name + ' must not be null');
-	assert.object(obj, name + ' must be an object');
-	if (needVer === undefined)
-		needVer = klass.prototype._sshpkApiVersion;
-	if (obj instanceof klass &&
-	    klass.prototype._sshpkApiVersion[0] == needVer[0])
-		return;
-	var proto = Object.getPrototypeOf(obj);
-	var depth = 0;
-	while (proto.constructor.name !== klass.name) {
-		proto = Object.getPrototypeOf(proto);
-		assert.ok(proto && ++depth <= MAX_CLASS_DEPTH,
-		    name + ' must be a ' + klass.name + ' instance');
-	}
-	assert.strictEqual(proto.constructor.name, klass.name,
-	    name + ' must be a ' + klass.name + ' instance');
-	var ver = proto._sshpkApiVersion;
-	if (ver === undefined)
-		ver = klass._oldVersionDetect(obj);
-	assert.ok(ver[0] == needVer[0] && ver[1] >= needVer[1],
-	    name + ' must be compatible with ' + klass.name + ' klass ' +
-	    'version ' + needVer[0] + '.' + needVer[1]);
-}
-
-var CIPHER_LEN = {
-	'des-ede3-cbc': { key: 7, iv: 8 },
-	'aes-128-cbc': { key: 16, iv: 16 }
-};
-var PKCS5_SALT_LEN = 8;
-
-function opensslKeyDeriv(cipher, salt, passphrase, count) {
-	assert.buffer(salt, 'salt');
-	assert.buffer(passphrase, 'passphrase');
-	assert.number(count, 'iteration count');
-
-	var clen = CIPHER_LEN[cipher];
-	assert.object(clen, 'supported cipher');
-
-	salt = salt.slice(0, PKCS5_SALT_LEN);
-
-	var D, D_prev, bufs;
-	var material = new Buffer(0);
-	while (material.length < clen.key + clen.iv) {
-		bufs = [];
-		if (D_prev)
-			bufs.push(D_prev);
-		bufs.push(passphrase);
-		bufs.push(salt);
-		D = Buffer.concat(bufs);
-		for (var j = 0; j < count; ++j)
-			D = crypto.createHash('md5').update(D).digest();
-		material = Buffer.concat([material, D]);
-		D_prev = D;
-	}
-
-	return ({
-	    key: material.slice(0, clen.key),
-	    iv: material.slice(clen.key, clen.key + clen.iv)
-	});
-}
-
-/* Count leading zero bits on a buffer */
-function countZeros(buf) {
-	var o = 0, obit = 8;
-	while (o < buf.length) {
-		var mask = (1 << obit);
-		if ((buf[o] & mask) === mask)
-			break;
-		obit--;
-		if (obit < 0) {
-			o++;
-			obit = 8;
-		}
-	}
-	return (o*8 + (8 - obit) - 1);
-}
-
-function bufferSplit(buf, chr) {
-	assert.buffer(buf);
-	assert.string(chr);
-
-	var parts = [];
-	var lastPart = 0;
-	var matches = 0;
-	for (var i = 0; i < buf.length; ++i) {
-		if (buf[i] === chr.charCodeAt(matches))
-			++matches;
-		else if (buf[i] === chr.charCodeAt(0))
-			matches = 1;
-		else
-			matches = 0;
-
-		if (matches >= chr.length) {
-			var newPart = i + 1;
-			parts.push(buf.slice(lastPart, newPart - matches));
-			lastPart = newPart;
-			matches = 0;
-		}
-	}
-	if (lastPart <= buf.length)
-		parts.push(buf.slice(lastPart, buf.length));
-
-	return (parts);
-}
-
-function ecNormalize(buf, addZero) {
-	assert.buffer(buf);
-	if (buf[0] === 0x00 && buf[1] === 0x04) {
-		if (addZero)
-			return (buf);
-		return (buf.slice(1));
-	} else if (buf[0] === 0x04) {
-		if (!addZero)
-			return (buf);
-	} else {
-		while (buf[0] === 0x00)
-			buf = buf.slice(1);
-		if (buf[0] === 0x02 || buf[0] === 0x03)
-			throw (new Error('Compressed elliptic curve points ' +
-			    'are not supported'));
-		if (buf[0] !== 0x04)
-			throw (new Error('Not a valid elliptic curve point'));
-		if (!addZero)
-			return (buf);
-	}
-	var b = new Buffer(buf.length + 1);
-	b[0] = 0x0;
-	buf.copy(b, 1);
-	return (b);
-}
-
-function mpNormalize(buf) {
-	assert.buffer(buf);
-	while (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00)
-		buf = buf.slice(1);
-	if ((buf[0] & 0x80) === 0x80) {
-		var b = new Buffer(buf.length + 1);
-		b[0] = 0x00;
-		buf.copy(b, 1);
-		buf = b;
-	}
-	return (buf);
-}
-
-function bigintToMpBuf(bigint) {
-	var buf = new Buffer(bigint.toByteArray());
-	buf = mpNormalize(buf);
-	return (buf);
-}
-
-function calculateDSAPublic(g, p, x) {
-	assert.buffer(g);
-	assert.buffer(p);
-	assert.buffer(x);
-	try {
-		var bigInt = require('jsbn').BigInteger;
-	} catch (e) {
-		throw (new Error('To load a PKCS#8 format DSA private key, ' +
-		    'the node jsbn library is required.'));
-	}
-	g = new bigInt(g);
-	p = new bigInt(p);
-	x = new bigInt(x);
-	var y = g.modPow(x, p);
-	var ybuf = bigintToMpBuf(y);
-	return (ybuf);
-}
-
-function addRSAMissing(key) {
-	assert.object(key);
-	assertCompatible(key, PrivateKey, [1, 1]);
-	try {
-		var bigInt = require('jsbn').BigInteger;
-	} catch (e) {
-		throw (new Error('To write a PEM private key from ' +
-		    'this source, the node jsbn lib is required.'));
-	}
-
-	var d = new bigInt(key.part.d.data);
-	var buf;
-
-	if (!key.part.dmodp) {
-		var p = new bigInt(key.part.p.data);
-		var dmodp = d.mod(p.subtract(1));
-
-		buf = bigintToMpBuf(dmodp);
-		key.part.dmodp = {name: 'dmodp', data: buf};
-		key.parts.push(key.part.dmodp);
-	}
-	if (!key.part.dmodq) {
-		var q = new bigInt(key.part.q.data);
-		var dmodq = d.mod(q.subtract(1));
-
-		buf = bigintToMpBuf(dmodq);
-		key.part.dmodq = {name: 'dmodq', data: buf};
-		key.parts.push(key.part.dmodq);
-	}
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/man/man1/sshpk-conv.1 b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/man/man1/sshpk-conv.1
deleted file mode 100644
index 0887dce2728fb2cfca11dc8f2008aaabca257e5d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/man/man1/sshpk-conv.1
+++ /dev/null
@@ -1,135 +0,0 @@
-.TH sshpk\-conv 1 "Jan 2016" sshpk "sshpk Commands"
-.SH NAME
-.PP
-sshpk\-conv \- convert between key formats
-.SH SYNOPSYS
-.PP
-\fB\fCsshpk\-conv\fR \-t FORMAT [FILENAME] [OPTIONS...]
-.PP
-\fB\fCsshpk\-conv\fR \-i [FILENAME] [OPTIONS...]
-.SH DESCRIPTION
-.PP
-Reads in a public or private key and converts it between different formats,
-particularly formats used in the SSH protocol and the well\-known PEM PKCS#1/7
-formats.
-.PP
-In the second form, with the \fB\fC\-i\fR option given, identifies a key and prints to 
-stderr information about its nature, size and fingerprint.
-.SH EXAMPLES
-.PP
-Assume the following SSH\-format public key in \fB\fCid_ecdsa.pub\fR:
-.PP
-.RS
-.nf
-ecdsa\-sha2\-nistp256 AAAAE2VjZHNhLXNoYTI...9M/4c4= user@host
-.fi
-.RE
-.PP
-Identify it with \fB\fC\-i\fR:
-.PP
-.RS
-.nf
-$ sshpk\-conv \-i id_ecdsa.pub
-id_ecdsa: a 256 bit ECDSA public key
-ECDSA curve: nistp256
-Comment: user@host
-Fingerprint:
-  SHA256:vCNX7eUkdvqqW0m4PoxQAZRv+CM4P4fS8+CbliAvS4k
-  81:ad:d5:57:e5:6f:7d:a2:93:79:56:af:d7:c0:38:51
-.fi
-.RE
-.PP
-Convert it to \fB\fCpkcs8\fR format, for use with e.g. OpenSSL:
-.PP
-.RS
-.nf
-$ sshpk\-conv \-t pkcs8 id_ecdsa
-\-\-\-\-\-BEGIN PUBLIC KEY\-\-\-\-\-
-MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEAsA4R6N6AS3gzaPBeLjG2ObSgUsR
-zOt+kWJoijLnw3ZMYUKmAx+lD0I5XUxdrPcs1vH5f3cn9TvRvO9L0z/hzg==
-\-\-\-\-\-END PUBLIC KEY\-\-\-\-\-
-.fi
-.RE
-.PP
-Retrieve the public half of a private key:
-.PP
-.RS
-.nf
-$ openssl genrsa 2048 | sshpk\-conv \-t ssh \-c foo@bar
-ssh\-rsa AAAAB3NzaC1yc2EAAA...koK7 foo@bar
-.fi
-.RE
-.PP
-Convert a private key to PKCS#1 (OpenSSL) format from a new\-style OpenSSH key
-format (the \fB\fCssh\-keygen \-o\fR format):
-.PP
-.RS
-.nf
-$ ssh\-keygen \-o \-f foobar
-\&...
-$ sshpk\-conv \-p \-t pkcs1 foobar
-\-\-\-\-\-BEGIN RSA PRIVATE KEY\-\-\-\-\-
-MIIDpAIBAAKCAQEA6T/GYJndb1TRH3+NL....
-\-\-\-\-\-END RSA PRIVATE KEY\-\-\-\-\-
-.fi
-.RE
-.SH OPTIONS
-.TP
-\fB\fC\-i, \-\-identify\fR
-Instead of converting the key, output identifying information about it to 
-stderr, including its type, size and fingerprints.
-.TP
-\fB\fC\-p, \-\-private\fR
-Treat the key as a private key instead of a public key (the default). If you
-supply \fB\fCsshpk\-conv\fR with a private key and do not give this option, it will
-extract only the public half of the key from it and work with that.
-.TP
-\fB\fC\-f PATH, \-\-file=PATH\fR
-Input file to take the key from instead of stdin. If a filename is supplied
-as a positional argument, it is equivalent to using this option.
-.TP
-\fB\fC\-o PATH, \-\-out=PATH\fR
-Output file name to use instead of stdout.
-.PP
-\fB\fC\-T FORMAT, \-\-informat=FORMAT\fR
-.TP
-\fB\fC\-t FORMAT, \-\-outformat=FORMAT\fR
-Selects the input and output formats to be used (see FORMATS, below).
-.TP
-\fB\fC\-c TEXT, \-\-comment=TEXT\fR
-Sets the key comment for the output file, if supported.
-.SH FORMATS
-.PP
-Currently supported formats:
-.TP
-\fB\fCpem, pkcs1\fR
-The standard PEM format used by older OpenSSH and most TLS libraries such as
-OpenSSL. The classic \fB\fCid_rsa\fR file is usually in this format. It is an ASN.1
-encoded structure, base64\-encoded and placed between PEM headers.
-.TP
-\fB\fCssh\fR
-The SSH public key text format (the format of an \fB\fCid_rsa.pub\fR file). A single
-line, containing 3 space separated parts: the key type, key body and optional
-key comment.
-.TP
-\fB\fCpkcs8\fR
-A newer PEM format, usually used only for public keys by TLS libraries such
-as OpenSSL. The ASN.1 structure is more generic than that of \fB\fCpkcs1\fR\&.
-.TP
-\fB\fCopenssh\fR
-The new \fB\fCssh\-keygen \-o\fR format from OpenSSH. This can be mistaken for a PEM
-encoding but is actually an OpenSSH internal format.
-.TP
-\fB\fCrfc4253\fR
-The internal binary format of keys when sent over the wire in the SSH
-protocol. This is also the format that the \fB\fCssh\-agent\fR uses in its protocol.
-.SH SEE ALSO
-.PP
-.BR ssh-keygen (1), 
-.BR openssl (1)
-.SH BUGS
-.PP
-Encrypted (password\-protected) keys are not supported.
-.PP
-Report bugs at Github
-\[la]https://github.com/arekinath/node-sshpk/issues\[ra]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/man/man1/sshpk-sign.1 b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/man/man1/sshpk-sign.1
deleted file mode 100644
index 749916ba88745f2b40011253d92ca4c8680e8b38..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/man/man1/sshpk-sign.1
+++ /dev/null
@@ -1,81 +0,0 @@
-.TH sshpk\-sign 1 "Jan 2016" sshpk "sshpk Commands"
-.SH NAME
-.PP
-sshpk\-sign \- sign data using an SSH key
-.SH SYNOPSYS
-.PP
-\fB\fCsshpk\-sign\fR \-i KEYPATH [OPTION...]
-.SH DESCRIPTION
-.PP
-Takes in arbitrary bytes, and signs them using an SSH private key. The key can
-be of any type or format supported by the \fB\fCsshpk\fR library, including the
-standard OpenSSH formats, as well as PEM PKCS#1 and PKCS#8.
-.PP
-The signature is printed out in Base64 encoding, unless the \fB\fC\-\-binary\fR or \fB\fC\-b\fR
-option is given.
-.SH EXAMPLES
-.PP
-Signing with default settings:
-.PP
-.RS
-.nf
-$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa
-MEUCIAMdLS/vXrrtWFepwe...
-.fi
-.RE
-.PP
-Signing in SSH (RFC 4253) format (rather than the default ASN.1):
-.PP
-.RS
-.nf
-$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa \-t ssh
-AAAAFGVjZHNhLXNoYTIt...
-.fi
-.RE
-.PP
-Saving the binary signature to a file:
-.PP
-.RS
-.nf
-$ printf 'foo' | sshpk\-sign \-i ~/.ssh/id_ecdsa \\
-                            \-o signature.bin \-b
-$ cat signature.bin | base64
-MEUCIAMdLS/vXrrtWFepwe...
-.fi
-.RE
-.SH OPTIONS
-.TP
-\fB\fC\-v, \-\-verbose\fR
-Print extra information about the key and signature to stderr when signing.
-.TP
-\fB\fC\-b, \-\-binary\fR
-Don't base64\-encode the signature before outputting it.
-.TP
-\fB\fC\-i KEY, \-\-identity=KEY\fR
-Select the key to be used for signing. \fB\fCKEY\fR must be a relative or absolute
-filesystem path to the key file. Any format supported by the \fB\fCsshpk\fR library
-is supported, including OpenSSH formats and standard PEM PKCS.
-.TP
-\fB\fC\-f PATH, \-\-file=PATH\fR
-Input file to sign instead of stdin.
-.TP
-\fB\fC\-o PATH, \-\-out=PATH\fR
-Output file to save signature in instead of stdout.
-.TP
-\fB\fC\-H HASH, \-\-hash=HASH\fR
-Set the hash algorithm to be used for signing. This should be one of \fB\fCsha1\fR,
-\fB\fCsha256\fR or \fB\fCsha512\fR\&. Some key types may place restrictions on which hash
-algorithms may be used (e.g. ED25519 keys can only use SHA\-512).
-.TP
-\fB\fC\-t FORMAT, \-\-format=FORMAT\fR
-Choose the signature format to use, from \fB\fCasn1\fR, \fB\fCssh\fR or \fB\fCraw\fR (only for
-ED25519 signatures). The \fB\fCasn1\fR format is the default, as it is the format
-used with TLS and typically the standard in most non\-SSH libraries (e.g.
-OpenSSL). The \fB\fCssh\fR format is used in the SSH protocol and by the ssh\-agent.
-.SH SEE ALSO
-.PP
-.BR sshpk-verify (1)
-.SH BUGS
-.PP
-Report bugs at Github
-\[la]https://github.com/arekinath/node-sshpk/issues\[ra]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/man/man1/sshpk-verify.1 b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/man/man1/sshpk-verify.1
deleted file mode 100644
index f79169d27534887de664b80703611aa7707212fb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/man/man1/sshpk-verify.1
+++ /dev/null
@@ -1,68 +0,0 @@
-.TH sshpk\-verify 1 "Jan 2016" sshpk "sshpk Commands"
-.SH NAME
-.PP
-sshpk\-verify \- verify a signature on data using an SSH key
-.SH SYNOPSYS
-.PP
-\fB\fCsshpk\-verify\fR \-i KEYPATH \-s SIGNATURE [OPTION...]
-.SH DESCRIPTION
-.PP
-Takes in arbitrary bytes and a Base64\-encoded signature, and verifies that the
-signature was produced by the private half of the given SSH public key.
-.SH EXAMPLES
-.PP
-.RS
-.nf
-$ printf 'foo' | sshpk\-verify \-i ~/.ssh/id_ecdsa \-s MEUCIQCYp...
-OK
-$ printf 'foo' | sshpk\-verify \-i ~/.ssh/id_ecdsa \-s GARBAGE...
-NOT OK
-.fi
-.RE
-.SH EXIT STATUS
-.TP
-\fB\fC0\fR
-Signature validates and matches the key.
-.TP
-\fB\fC1\fR
-Signature is parseable and the correct length but does not match the key or
-otherwise is invalid.
-.TP
-\fB\fC2\fR
-The signature or key could not be parsed.
-.TP
-\fB\fC3\fR
-Invalid commandline options were supplied.
-.SH OPTIONS
-.TP
-\fB\fC\-v, \-\-verbose\fR
-Print extra information about the key and signature to stderr when verifying.
-.TP
-\fB\fC\-i KEY, \-\-identity=KEY\fR
-Select the key to be used for verification. \fB\fCKEY\fR must be a relative or
-absolute filesystem path to the key file. Any format supported by the \fB\fCsshpk\fR
-library is supported, including OpenSSH formats and standard PEM PKCS.
-.TP
-\fB\fC\-s BASE64, \-\-signature=BASE64\fR
-Supplies the base64\-encoded signature to be verified.
-.TP
-\fB\fC\-f PATH, \-\-file=PATH\fR
-Input file to verify instead of stdin.
-.TP
-\fB\fC\-H HASH, \-\-hash=HASH\fR
-Set the hash algorithm to be used for signing. This should be one of \fB\fCsha1\fR,
-\fB\fCsha256\fR or \fB\fCsha512\fR\&. Some key types may place restrictions on which hash
-algorithms may be used (e.g. ED25519 keys can only use SHA\-512).
-.TP
-\fB\fC\-t FORMAT, \-\-format=FORMAT\fR
-Choose the signature format to use, from \fB\fCasn1\fR, \fB\fCssh\fR or \fB\fCraw\fR (only for
-ED25519 signatures). The \fB\fCasn1\fR format is the default, as it is the format
-used with TLS and typically the standard in most non\-SSH libraries (e.g.
-OpenSSL). The \fB\fCssh\fR format is used in the SSH protocol and by the ssh\-agent.
-.SH SEE ALSO
-.PP
-.BR sshpk-sign (1)
-.SH BUGS
-.PP
-Report bugs at Github
-\[la]https://github.com/arekinath/node-sshpk/issues\[ra]
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/.npmignore
deleted file mode 100644
index eb03e3e1e48673812727cc4d12be152d6a80fc33..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules
-*.log
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/.travis.yml
deleted file mode 100644
index 09d3ef3784204a799bfa07719bdd8564c4ea5537..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - 0.8
-  - 0.10
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/LICENSE
deleted file mode 100644
index 9b5dcdb7f5e1f1bbfd82313297b2e5f7d8fd4482..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright (c) 2011 Mark Cavage, All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/README.md
deleted file mode 100644
index 7cebf7a2e87d566355a6c6547315ef84407aa0ec..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/README.md
+++ /dev/null
@@ -1,50 +0,0 @@
-node-asn1 is a library for encoding and decoding ASN.1 datatypes in pure JS.
-Currently BER encoding is supported; at some point I'll likely have to do DER.
-
-## Usage
-
-Mostly, if you're *actually* needing to read and write ASN.1, you probably don't
-need this readme to explain what and why.  If you have no idea what ASN.1 is,
-see this: ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc
-
-The source is pretty much self-explanatory, and has read/write methods for the
-common types out there.
-
-### Decoding
-
-The following reads an ASN.1 sequence with a boolean.
-
-    var Ber = require('asn1').Ber;
-
-    var reader = new Ber.Reader(new Buffer([0x30, 0x03, 0x01, 0x01, 0xff]));
-
-    reader.readSequence();
-    console.log('Sequence len: ' + reader.length);
-    if (reader.peek() === Ber.Boolean)
-      console.log(reader.readBoolean());
-
-### Encoding
-
-The following generates the same payload as above.
-
-    var Ber = require('asn1').Ber;
-
-    var writer = new Ber.Writer();
-
-    writer.startSequence();
-    writer.writeBoolean(true);
-    writer.endSequence();
-
-    console.log(writer.buffer);
-
-## Installation
-
-    npm install asn1
-
-## License
-
-MIT.
-
-## Bugs
-
-See <https://github.com/mcavage/node-asn1/issues>.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/errors.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/errors.js
deleted file mode 100644
index ff21d4fab352e30a8ab360403c1fc65865c676e7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/errors.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
-
-
-module.exports = {
-
-  newInvalidAsn1Error: function(msg) {
-    var e = new Error();
-    e.name = 'InvalidAsn1Error';
-    e.message = msg || '';
-    return e;
-  }
-
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/index.js
deleted file mode 100644
index 4fb90aea9a099ed6e28dd377c113f1c902c5cc09..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/index.js
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
-
-var errors = require('./errors');
-var types = require('./types');
-
-var Reader = require('./reader');
-var Writer = require('./writer');
-
-
-///--- Exports
-
-module.exports = {
-
-  Reader: Reader,
-
-  Writer: Writer
-
-};
-
-for (var t in types) {
-  if (types.hasOwnProperty(t))
-    module.exports[t] = types[t];
-}
-for (var e in errors) {
-  if (errors.hasOwnProperty(e))
-    module.exports[e] = errors[e];
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/reader.js
deleted file mode 100644
index 0a00e98e33700903831e462f4f7c77e13a50f276..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/reader.js
+++ /dev/null
@@ -1,261 +0,0 @@
-// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
-
-var assert = require('assert');
-
-var ASN1 = require('./types');
-var errors = require('./errors');
-
-
-///--- Globals
-
-var newInvalidAsn1Error = errors.newInvalidAsn1Error;
-
-
-
-///--- API
-
-function Reader(data) {
-  if (!data || !Buffer.isBuffer(data))
-    throw new TypeError('data must be a node Buffer');
-
-  this._buf = data;
-  this._size = data.length;
-
-  // These hold the "current" state
-  this._len = 0;
-  this._offset = 0;
-}
-
-Object.defineProperty(Reader.prototype, 'length', {
-  enumerable: true,
-  get: function () { return (this._len); }
-});
-
-Object.defineProperty(Reader.prototype, 'offset', {
-  enumerable: true,
-  get: function () { return (this._offset); }
-});
-
-Object.defineProperty(Reader.prototype, 'remain', {
-  get: function () { return (this._size - this._offset); }
-});
-
-Object.defineProperty(Reader.prototype, 'buffer', {
-  get: function () { return (this._buf.slice(this._offset)); }
-});
-
-
-/**
- * Reads a single byte and advances offset; you can pass in `true` to make this
- * a "peek" operation (i.e., get the byte, but don't advance the offset).
- *
- * @param {Boolean} peek true means don't move offset.
- * @return {Number} the next byte, null if not enough data.
- */
-Reader.prototype.readByte = function(peek) {
-  if (this._size - this._offset < 1)
-    return null;
-
-  var b = this._buf[this._offset] & 0xff;
-
-  if (!peek)
-    this._offset += 1;
-
-  return b;
-};
-
-
-Reader.prototype.peek = function() {
-  return this.readByte(true);
-};
-
-
-/**
- * Reads a (potentially) variable length off the BER buffer.  This call is
- * not really meant to be called directly, as callers have to manipulate
- * the internal buffer afterwards.
- *
- * As a result of this call, you can call `Reader.length`, until the
- * next thing called that does a readLength.
- *
- * @return {Number} the amount of offset to advance the buffer.
- * @throws {InvalidAsn1Error} on bad ASN.1
- */
-Reader.prototype.readLength = function(offset) {
-  if (offset === undefined)
-    offset = this._offset;
-
-  if (offset >= this._size)
-    return null;
-
-  var lenB = this._buf[offset++] & 0xff;
-  if (lenB === null)
-    return null;
-
-  if ((lenB & 0x80) == 0x80) {
-    lenB &= 0x7f;
-
-    if (lenB == 0)
-      throw newInvalidAsn1Error('Indefinite length not supported');
-
-    if (lenB > 4)
-      throw newInvalidAsn1Error('encoding too long');
-
-    if (this._size - offset < lenB)
-      return null;
-
-    this._len = 0;
-    for (var i = 0; i < lenB; i++)
-      this._len = (this._len << 8) + (this._buf[offset++] & 0xff);
-
-  } else {
-    // Wasn't a variable length
-    this._len = lenB;
-  }
-
-  return offset;
-};
-
-
-/**
- * Parses the next sequence in this BER buffer.
- *
- * To get the length of the sequence, call `Reader.length`.
- *
- * @return {Number} the sequence's tag.
- */
-Reader.prototype.readSequence = function(tag) {
-  var seq = this.peek();
-  if (seq === null)
-    return null;
-  if (tag !== undefined && tag !== seq)
-    throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
-                              ': got 0x' + seq.toString(16));
-
-  var o = this.readLength(this._offset + 1); // stored in `length`
-  if (o === null)
-    return null;
-
-  this._offset = o;
-  return seq;
-};
-
-
-Reader.prototype.readInt = function() {
-  return this._readTag(ASN1.Integer);
-};
-
-
-Reader.prototype.readBoolean = function() {
-  return (this._readTag(ASN1.Boolean) === 0 ? false : true);
-};
-
-
-Reader.prototype.readEnumeration = function() {
-  return this._readTag(ASN1.Enumeration);
-};
-
-
-Reader.prototype.readString = function(tag, retbuf) {
-  if (!tag)
-    tag = ASN1.OctetString;
-
-  var b = this.peek();
-  if (b === null)
-    return null;
-
-  if (b !== tag)
-    throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
-                              ': got 0x' + b.toString(16));
-
-  var o = this.readLength(this._offset + 1); // stored in `length`
-
-  if (o === null)
-    return null;
-
-  if (this.length > this._size - o)
-    return null;
-
-  this._offset = o;
-
-  if (this.length === 0)
-    return retbuf ? new Buffer(0) : '';
-
-  var str = this._buf.slice(this._offset, this._offset + this.length);
-  this._offset += this.length;
-
-  return retbuf ? str : str.toString('utf8');
-};
-
-Reader.prototype.readOID = function(tag) {
-  if (!tag)
-    tag = ASN1.OID;
-
-  var b = this.readString(tag, true);
-  if (b === null)
-    return null;
-
-  var values = [];
-  var value = 0;
-
-  for (var i = 0; i < b.length; i++) {
-    var byte = b[i] & 0xff;
-
-    value <<= 7;
-    value += byte & 0x7f;
-    if ((byte & 0x80) == 0) {
-      values.push(value);
-      value = 0;
-    }
-  }
-
-  value = values.shift();
-  values.unshift(value % 40);
-  values.unshift((value / 40) >> 0);
-
-  return values.join('.');
-};
-
-
-Reader.prototype._readTag = function(tag) {
-  assert.ok(tag !== undefined);
-
-  var b = this.peek();
-
-  if (b === null)
-    return null;
-
-  if (b !== tag)
-    throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +
-                              ': got 0x' + b.toString(16));
-
-  var o = this.readLength(this._offset + 1); // stored in `length`
-  if (o === null)
-    return null;
-
-  if (this.length > 4)
-    throw newInvalidAsn1Error('Integer too long: ' + this.length);
-
-  if (this.length > this._size - o)
-    return null;
-  this._offset = o;
-
-  var fb = this._buf[this._offset];
-  var value = 0;
-
-  for (var i = 0; i < this.length; i++) {
-    value <<= 8;
-    value |= (this._buf[this._offset++] & 0xff);
-  }
-
-  if ((fb & 0x80) == 0x80 && i !== 4)
-    value -= (1 << (i * 8));
-
-  return value >> 0;
-};
-
-
-
-///--- Exported API
-
-module.exports = Reader;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/types.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/types.js
deleted file mode 100644
index 8aea000137c844acd38f0a5baea7477b31e32c62..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/types.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
-
-
-module.exports = {
-  EOC: 0,
-  Boolean: 1,
-  Integer: 2,
-  BitString: 3,
-  OctetString: 4,
-  Null: 5,
-  OID: 6,
-  ObjectDescriptor: 7,
-  External: 8,
-  Real: 9, // float
-  Enumeration: 10,
-  PDV: 11,
-  Utf8String: 12,
-  RelativeOID: 13,
-  Sequence: 16,
-  Set: 17,
-  NumericString: 18,
-  PrintableString: 19,
-  T61String: 20,
-  VideotexString: 21,
-  IA5String: 22,
-  UTCTime: 23,
-  GeneralizedTime: 24,
-  GraphicString: 25,
-  VisibleString: 26,
-  GeneralString: 28,
-  UniversalString: 29,
-  CharacterString: 30,
-  BMPString: 31,
-  Constructor: 32,
-  Context: 128
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/writer.js
deleted file mode 100644
index d9d99af680cf4f86b155b066f5f6548cdf3be5d8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/ber/writer.js
+++ /dev/null
@@ -1,316 +0,0 @@
-// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
-
-var assert = require('assert');
-var ASN1 = require('./types');
-var errors = require('./errors');
-
-
-///--- Globals
-
-var newInvalidAsn1Error = errors.newInvalidAsn1Error;
-
-var DEFAULT_OPTS = {
-  size: 1024,
-  growthFactor: 8
-};
-
-
-///--- Helpers
-
-function merge(from, to) {
-  assert.ok(from);
-  assert.equal(typeof(from), 'object');
-  assert.ok(to);
-  assert.equal(typeof(to), 'object');
-
-  var keys = Object.getOwnPropertyNames(from);
-  keys.forEach(function(key) {
-    if (to[key])
-      return;
-
-    var value = Object.getOwnPropertyDescriptor(from, key);
-    Object.defineProperty(to, key, value);
-  });
-
-  return to;
-}
-
-
-
-///--- API
-
-function Writer(options) {
-  options = merge(DEFAULT_OPTS, options || {});
-
-  this._buf = new Buffer(options.size || 1024);
-  this._size = this._buf.length;
-  this._offset = 0;
-  this._options = options;
-
-  // A list of offsets in the buffer where we need to insert
-  // sequence tag/len pairs.
-  this._seq = [];
-}
-
-Object.defineProperty(Writer.prototype, 'buffer', {
-  get: function () {
-    if (this._seq.length)
-      throw new InvalidAsn1Error(this._seq.length + ' unended sequence(s)');
-
-    return (this._buf.slice(0, this._offset));
-  }
-});
-
-Writer.prototype.writeByte = function(b) {
-  if (typeof(b) !== 'number')
-    throw new TypeError('argument must be a Number');
-
-  this._ensure(1);
-  this._buf[this._offset++] = b;
-};
-
-
-Writer.prototype.writeInt = function(i, tag) {
-  if (typeof(i) !== 'number')
-    throw new TypeError('argument must be a Number');
-  if (typeof(tag) !== 'number')
-    tag = ASN1.Integer;
-
-  var sz = 4;
-
-  while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) &&
-         (sz > 1)) {
-    sz--;
-    i <<= 8;
-  }
-
-  if (sz > 4)
-    throw new InvalidAsn1Error('BER ints cannot be > 0xffffffff');
-
-  this._ensure(2 + sz);
-  this._buf[this._offset++] = tag;
-  this._buf[this._offset++] = sz;
-
-  while (sz-- > 0) {
-    this._buf[this._offset++] = ((i & 0xff000000) >>> 24);
-    i <<= 8;
-  }
-
-};
-
-
-Writer.prototype.writeNull = function() {
-  this.writeByte(ASN1.Null);
-  this.writeByte(0x00);
-};
-
-
-Writer.prototype.writeEnumeration = function(i, tag) {
-  if (typeof(i) !== 'number')
-    throw new TypeError('argument must be a Number');
-  if (typeof(tag) !== 'number')
-    tag = ASN1.Enumeration;
-
-  return this.writeInt(i, tag);
-};
-
-
-Writer.prototype.writeBoolean = function(b, tag) {
-  if (typeof(b) !== 'boolean')
-    throw new TypeError('argument must be a Boolean');
-  if (typeof(tag) !== 'number')
-    tag = ASN1.Boolean;
-
-  this._ensure(3);
-  this._buf[this._offset++] = tag;
-  this._buf[this._offset++] = 0x01;
-  this._buf[this._offset++] = b ? 0xff : 0x00;
-};
-
-
-Writer.prototype.writeString = function(s, tag) {
-  if (typeof(s) !== 'string')
-    throw new TypeError('argument must be a string (was: ' + typeof(s) + ')');
-  if (typeof(tag) !== 'number')
-    tag = ASN1.OctetString;
-
-  var len = Buffer.byteLength(s);
-  this.writeByte(tag);
-  this.writeLength(len);
-  if (len) {
-    this._ensure(len);
-    this._buf.write(s, this._offset);
-    this._offset += len;
-  }
-};
-
-
-Writer.prototype.writeBuffer = function(buf, tag) {
-  if (typeof(tag) !== 'number')
-    throw new TypeError('tag must be a number');
-  if (!Buffer.isBuffer(buf))
-    throw new TypeError('argument must be a buffer');
-
-  this.writeByte(tag);
-  this.writeLength(buf.length);
-  this._ensure(buf.length);
-  buf.copy(this._buf, this._offset, 0, buf.length);
-  this._offset += buf.length;
-};
-
-
-Writer.prototype.writeStringArray = function(strings) {
-  if ((!strings instanceof Array))
-    throw new TypeError('argument must be an Array[String]');
-
-  var self = this;
-  strings.forEach(function(s) {
-    self.writeString(s);
-  });
-};
-
-// This is really to solve DER cases, but whatever for now
-Writer.prototype.writeOID = function(s, tag) {
-  if (typeof(s) !== 'string')
-    throw new TypeError('argument must be a string');
-  if (typeof(tag) !== 'number')
-    tag = ASN1.OID;
-
-  if (!/^([0-9]+\.){3,}[0-9]+$/.test(s))
-    throw new Error('argument is not a valid OID string');
-
-  function encodeOctet(bytes, octet) {
-    if (octet < 128) {
-        bytes.push(octet);
-    } else if (octet < 16384) {
-        bytes.push((octet >>> 7) | 0x80);
-        bytes.push(octet & 0x7F);
-    } else if (octet < 2097152) {
-      bytes.push((octet >>> 14) | 0x80);
-      bytes.push(((octet >>> 7) | 0x80) & 0xFF);
-      bytes.push(octet & 0x7F);
-    } else if (octet < 268435456) {
-      bytes.push((octet >>> 21) | 0x80);
-      bytes.push(((octet >>> 14) | 0x80) & 0xFF);
-      bytes.push(((octet >>> 7) | 0x80) & 0xFF);
-      bytes.push(octet & 0x7F);
-    } else {
-      bytes.push(((octet >>> 28) | 0x80) & 0xFF);
-      bytes.push(((octet >>> 21) | 0x80) & 0xFF);
-      bytes.push(((octet >>> 14) | 0x80) & 0xFF);
-      bytes.push(((octet >>> 7) | 0x80) & 0xFF);
-      bytes.push(octet & 0x7F);
-    }
-  }
-
-  var tmp = s.split('.');
-  var bytes = [];
-  bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10));
-  tmp.slice(2).forEach(function(b) {
-    encodeOctet(bytes, parseInt(b, 10));
-  });
-
-  var self = this;
-  this._ensure(2 + bytes.length);
-  this.writeByte(tag);
-  this.writeLength(bytes.length);
-  bytes.forEach(function(b) {
-    self.writeByte(b);
-  });
-};
-
-
-Writer.prototype.writeLength = function(len) {
-  if (typeof(len) !== 'number')
-    throw new TypeError('argument must be a Number');
-
-  this._ensure(4);
-
-  if (len <= 0x7f) {
-    this._buf[this._offset++] = len;
-  } else if (len <= 0xff) {
-    this._buf[this._offset++] = 0x81;
-    this._buf[this._offset++] = len;
-  } else if (len <= 0xffff) {
-    this._buf[this._offset++] = 0x82;
-    this._buf[this._offset++] = len >> 8;
-    this._buf[this._offset++] = len;
-  } else if (len <= 0xffffff) {
-    this._buf[this._offset++] = 0x83;
-    this._buf[this._offset++] = len >> 16;
-    this._buf[this._offset++] = len >> 8;
-    this._buf[this._offset++] = len;
-  } else {
-    throw new InvalidAsn1ERror('Length too long (> 4 bytes)');
-  }
-};
-
-Writer.prototype.startSequence = function(tag) {
-  if (typeof(tag) !== 'number')
-    tag = ASN1.Sequence | ASN1.Constructor;
-
-  this.writeByte(tag);
-  this._seq.push(this._offset);
-  this._ensure(3);
-  this._offset += 3;
-};
-
-
-Writer.prototype.endSequence = function() {
-  var seq = this._seq.pop();
-  var start = seq + 3;
-  var len = this._offset - start;
-
-  if (len <= 0x7f) {
-    this._shift(start, len, -2);
-    this._buf[seq] = len;
-  } else if (len <= 0xff) {
-    this._shift(start, len, -1);
-    this._buf[seq] = 0x81;
-    this._buf[seq + 1] = len;
-  } else if (len <= 0xffff) {
-    this._buf[seq] = 0x82;
-    this._buf[seq + 1] = len >> 8;
-    this._buf[seq + 2] = len;
-  } else if (len <= 0xffffff) {
-    this._shift(start, len, 1);
-    this._buf[seq] = 0x83;
-    this._buf[seq + 1] = len >> 16;
-    this._buf[seq + 2] = len >> 8;
-    this._buf[seq + 3] = len;
-  } else {
-    throw new InvalidAsn1Error('Sequence too long');
-  }
-};
-
-
-Writer.prototype._shift = function(start, len, shift) {
-  assert.ok(start !== undefined);
-  assert.ok(len !== undefined);
-  assert.ok(shift);
-
-  this._buf.copy(this._buf, start + shift, start, start + len);
-  this._offset += shift;
-};
-
-Writer.prototype._ensure = function(len) {
-  assert.ok(len);
-
-  if (this._size - this._offset < len) {
-    var sz = this._size * this._options.growthFactor;
-    if (sz - this._offset < len)
-      sz += len;
-
-    var buf = new Buffer(sz);
-
-    this._buf.copy(buf, 0, 0, this._offset);
-    this._buf = buf;
-    this._size = sz;
-  }
-};
-
-
-
-///--- Exported API
-
-module.exports = Writer;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/index.js
deleted file mode 100644
index d1766e7a6d176c1b18eeba8a660aa28db3bbc824..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/lib/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
-
-// If you have no idea what ASN.1 or BER is, see this:
-// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc
-
-var Ber = require('./ber/index');
-
-
-
-///--- Exported API
-
-module.exports = {
-
-  Ber: Ber,
-
-  BerReader: Ber.Reader,
-
-  BerWriter: Ber.Writer
-
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/package.json
deleted file mode 100644
index e21b04ebcc031a8a1badd645b0b0731ab58045b5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/package.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
-  "_from": "asn1@>=0.2.3 <0.3.0",
-  "_id": "asn1@0.2.3",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/sshpk/asn1",
-  "_npmUser": {
-    "email": "patrick.f.mooney@gmail.com",
-    "name": "pfmooney"
-  },
-  "_npmVersion": "1.4.28",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature/sshpk"
-  ],
-  "_resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
-  "_shasum": "dac8787713c9966849fc8180777ebe9c1ddf3b86",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mcavage@gmail.com",
-    "name": "Mark Cavage"
-  },
-  "bugs": {
-    "url": "https://github.com/mcavage/node-asn1/issues"
-  },
-  "contributors": [
-    {
-      "name": "David Gwynne",
-      "email": "loki@animata.net"
-    },
-    {
-      "name": "Yunong Xiao",
-      "email": "yunong@joyent.com"
-    },
-    {
-      "name": "Alex Wilson",
-      "email": "alex.wilson@joyent.com"
-    }
-  ],
-  "dependencies": {},
-  "description": "Contains parsers and serializers for ASN.1 (currently BER only)",
-  "devDependencies": {
-    "tap": "0.4.8"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "dac8787713c9966849fc8180777ebe9c1ddf3b86",
-    "tarball": "http://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz"
-  },
-  "homepage": "https://github.com/mcavage/node-asn1",
-  "license": "MIT",
-  "main": "lib/index.js",
-  "maintainers": [
-    {
-      "name": "mcavage",
-      "email": "mcavage@gmail.com"
-    },
-    {
-      "name": "pfmooney",
-      "email": "patrick.f.mooney@gmail.com"
-    }
-  ],
-  "name": "asn1",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/mcavage/node-asn1.git"
-  },
-  "scripts": {
-    "test": "tap ./tst"
-  },
-  "version": "0.2.3"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/tst/ber/reader.test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/tst/ber/reader.test.js
deleted file mode 100644
index 062fd7ee344bc9193f91b4ce5d9139ebf20de54b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/tst/ber/reader.test.js
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
-
-var test = require('tap').test;
-
-
-
-///--- Globals
-
-var BerReader;
-
-
-
-///--- Tests
-
-test('load library', function(t) {
-  BerReader = require('../../lib/index').BerReader;
-  t.ok(BerReader);
-  try {
-    new BerReader();
-    t.fail('Should have thrown');
-  } catch (e) {
-    t.ok(e instanceof TypeError, 'Should have been a type error');
-  }
-  t.end();
-});
-
-
-test('read byte', function(t) {
-  var reader = new BerReader(new Buffer([0xde]));
-  t.ok(reader);
-  t.equal(reader.readByte(), 0xde, 'wrong value');
-  t.end();
-});
-
-
-test('read 1 byte int', function(t) {
-  var reader = new BerReader(new Buffer([0x02, 0x01, 0x03]));
-  t.ok(reader);
-  t.equal(reader.readInt(), 0x03, 'wrong value');
-  t.equal(reader.length, 0x01, 'wrong length');
-  t.end();
-});
-
-
-test('read 2 byte int', function(t) {
-  var reader = new BerReader(new Buffer([0x02, 0x02, 0x7e, 0xde]));
-  t.ok(reader);
-  t.equal(reader.readInt(), 0x7ede, 'wrong value');
-  t.equal(reader.length, 0x02, 'wrong length');
-  t.end();
-});
-
-
-test('read 3 byte int', function(t) {
-  var reader = new BerReader(new Buffer([0x02, 0x03, 0x7e, 0xde, 0x03]));
-  t.ok(reader);
-  t.equal(reader.readInt(), 0x7ede03, 'wrong value');
-  t.equal(reader.length, 0x03, 'wrong length');
-  t.end();
-});
-
-
-test('read 4 byte int', function(t) {
-  var reader = new BerReader(new Buffer([0x02, 0x04, 0x7e, 0xde, 0x03, 0x01]));
-  t.ok(reader);
-  t.equal(reader.readInt(), 0x7ede0301, 'wrong value');
-  t.equal(reader.length, 0x04, 'wrong length');
-  t.end();
-});
-
-
-test('read 1 byte negative int', function(t) {
-  var reader = new BerReader(new Buffer([0x02, 0x01, 0xdc]));
-  t.ok(reader);
-  t.equal(reader.readInt(), -36, 'wrong value');
-  t.equal(reader.length, 0x01, 'wrong length');
-  t.end();
-});
-
-
-test('read 2 byte negative int', function(t) {
-  var reader = new BerReader(new Buffer([0x02, 0x02, 0xc0, 0x4e]));
-  t.ok(reader);
-  t.equal(reader.readInt(), -16306, 'wrong value');
-  t.equal(reader.length, 0x02, 'wrong length');
-  t.end();
-});
-
-
-test('read 3 byte negative int', function(t) {
-  var reader = new BerReader(new Buffer([0x02, 0x03, 0xff, 0x00, 0x19]));
-  t.ok(reader);
-  t.equal(reader.readInt(), -65511, 'wrong value');
-  t.equal(reader.length, 0x03, 'wrong length');
-  t.end();
-});
-
-
-test('read 4 byte negative int', function(t) {
-  var reader = new BerReader(new Buffer([0x02, 0x04, 0x91, 0x7c, 0x22, 0x1f]));
-  t.ok(reader);
-  t.equal(reader.readInt(), -1854135777, 'wrong value');
-  t.equal(reader.length, 0x04, 'wrong length');
-  t.end();
-});
-
-
-test('read boolean true', function(t) {
-  var reader = new BerReader(new Buffer([0x01, 0x01, 0xff]));
-  t.ok(reader);
-  t.equal(reader.readBoolean(), true, 'wrong value');
-  t.equal(reader.length, 0x01, 'wrong length');
-  t.end();
-});
-
-
-test('read boolean false', function(t) {
-  var reader = new BerReader(new Buffer([0x01, 0x01, 0x00]));
-  t.ok(reader);
-  t.equal(reader.readBoolean(), false, 'wrong value');
-  t.equal(reader.length, 0x01, 'wrong length');
-  t.end();
-});
-
-
-test('read enumeration', function(t) {
-  var reader = new BerReader(new Buffer([0x0a, 0x01, 0x20]));
-  t.ok(reader);
-  t.equal(reader.readEnumeration(), 0x20, 'wrong value');
-  t.equal(reader.length, 0x01, 'wrong length');
-  t.end();
-});
-
-
-test('read string', function(t) {
-  var dn = 'cn=foo,ou=unit,o=test';
-  var buf = new Buffer(dn.length + 2);
-  buf[0] = 0x04;
-  buf[1] = Buffer.byteLength(dn);
-  buf.write(dn, 2);
-  var reader = new BerReader(buf);
-  t.ok(reader);
-  t.equal(reader.readString(), dn, 'wrong value');
-  t.equal(reader.length, dn.length, 'wrong length');
-  t.end();
-});
-
-
-test('read sequence', function(t) {
-  var reader = new BerReader(new Buffer([0x30, 0x03, 0x01, 0x01, 0xff]));
-  t.ok(reader);
-  t.equal(reader.readSequence(), 0x30, 'wrong value');
-  t.equal(reader.length, 0x03, 'wrong length');
-  t.equal(reader.readBoolean(), true, 'wrong value');
-  t.equal(reader.length, 0x01, 'wrong length');
-  t.end();
-});
-
-
-test('anonymous LDAPv3 bind', function(t) {
-  var BIND = new Buffer(14);
-  BIND[0] = 0x30;  // Sequence
-  BIND[1] = 12;    // len
-  BIND[2] = 0x02;  // ASN.1 Integer
-  BIND[3] = 1;     // len
-  BIND[4] = 0x04;  // msgid (make up 4)
-  BIND[5] = 0x60;  // Bind Request
-  BIND[6] = 7;     // len
-  BIND[7] = 0x02;  // ASN.1 Integer
-  BIND[8] = 1;     // len
-  BIND[9] = 0x03;  // v3
-  BIND[10] = 0x04; // String (bind dn)
-  BIND[11] = 0;    // len
-  BIND[12] = 0x80; // ContextSpecific (choice)
-  BIND[13] = 0;    // simple bind
-
-  // Start testing ^^
-  var ber = new BerReader(BIND);
-  t.equal(ber.readSequence(), 48, 'Not an ASN.1 Sequence');
-  t.equal(ber.length, 12, 'Message length should be 12');
-  t.equal(ber.readInt(), 4, 'Message id should have been 4');
-  t.equal(ber.readSequence(), 96, 'Bind Request should have been 96');
-  t.equal(ber.length, 7, 'Bind length should have been 7');
-  t.equal(ber.readInt(), 3, 'LDAP version should have been 3');
-  t.equal(ber.readString(), '', 'Bind DN should have been empty');
-  t.equal(ber.length, 0, 'string length should have been 0');
-  t.equal(ber.readByte(), 0x80, 'Should have been ContextSpecific (choice)');
-  t.equal(ber.readByte(), 0, 'Should have been simple bind');
-  t.equal(null, ber.readByte(), 'Should be out of data');
-  t.end();
-});
-
-
-test('long string', function(t) {
-  var buf = new Buffer(256);
-  var o;
-  var s =
-    '2;649;CN=Red Hat CS 71GA Demo,O=Red Hat CS 71GA Demo,C=US;' +
-    'CN=RHCS Agent - admin01,UID=admin01,O=redhat,C=US [1] This is ' +
-    'Teena Vradmin\'s description.';
-  buf[0] = 0x04;
-  buf[1] = 0x81;
-  buf[2] = 0x94;
-  buf.write(s, 3);
-  var ber = new BerReader(buf.slice(0, 3 + s.length));
-  t.equal(ber.readString(), s);
-  t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/tst/ber/writer.test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/tst/ber/writer.test.js
deleted file mode 100644
index d87cb7bc9bb6cef1f981c287fca232e797adb8fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/asn1/tst/ber/writer.test.js
+++ /dev/null
@@ -1,370 +0,0 @@
-// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.
-
-var test = require('tap').test;
-var sys = require('sys');
-
-///--- Globals
-
-var BerWriter;
-
-var BerReader;
-
-
-///--- Tests
-
-test('load library', function(t) {
-  BerWriter = require('../../lib/index').BerWriter;
-  t.ok(BerWriter);
-  t.ok(new BerWriter());
-  t.end();
-});
-
-
-test('write byte', function(t) {
-  var writer = new BerWriter();
-
-  writer.writeByte(0xC2);
-  var ber = writer.buffer;
-
-  t.ok(ber);
-  t.equal(ber.length, 1, 'Wrong length');
-  t.equal(ber[0], 0xC2, 'value wrong');
-
-  t.end();
-});
-
-
-test('write 1 byte int', function(t) {
-  var writer = new BerWriter();
-
-  writer.writeInt(0x7f);
-  var ber = writer.buffer;
-
-  t.ok(ber);
-  t.equal(ber.length, 3, 'Wrong length for an int: ' + ber.length);
-  t.equal(ber[0], 0x02, 'ASN.1 tag wrong (2) -> ' + ber[0]);
-  t.equal(ber[1], 0x01, 'length wrong(1) -> ' + ber[1]);
-  t.equal(ber[2], 0x7f, 'value wrong(3) -> ' + ber[2]);
-
-  t.end();
-});
-
-
-test('write 2 byte int', function(t) {
-  var writer = new BerWriter();
-
-  writer.writeInt(0x7ffe);
-  var ber = writer.buffer;
-
-  t.ok(ber);
-  t.equal(ber.length, 4, 'Wrong length for an int');
-  t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
-  t.equal(ber[1], 0x02, 'length wrong');
-  t.equal(ber[2], 0x7f, 'value wrong (byte 1)');
-  t.equal(ber[3], 0xfe, 'value wrong (byte 2)');
-
-  t.end();
-});
-
-
-test('write 3 byte int', function(t) {
-  var writer = new BerWriter();
-
-  writer.writeInt(0x7ffffe);
-  var ber = writer.buffer;
-
-  t.ok(ber);
-  t.equal(ber.length, 5, 'Wrong length for an int');
-  t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
-  t.equal(ber[1], 0x03, 'length wrong');
-  t.equal(ber[2], 0x7f, 'value wrong (byte 1)');
-  t.equal(ber[3], 0xff, 'value wrong (byte 2)');
-  t.equal(ber[4], 0xfe, 'value wrong (byte 3)');
-
-  t.end();
-});
-
-
-test('write 4 byte int', function(t) {
-  var writer = new BerWriter();
-
-  writer.writeInt(0x7ffffffe);
-  var ber = writer.buffer;
-
-  t.ok(ber);
-
-  t.equal(ber.length, 6, 'Wrong length for an int');
-  t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
-  t.equal(ber[1], 0x04, 'length wrong');
-  t.equal(ber[2], 0x7f, 'value wrong (byte 1)');
-  t.equal(ber[3], 0xff, 'value wrong (byte 2)');
-  t.equal(ber[4], 0xff, 'value wrong (byte 3)');
-  t.equal(ber[5], 0xfe, 'value wrong (byte 4)');
-
-  t.end();
-});
-
-
-test('write 1 byte negative int', function(t) {
-  var writer = new BerWriter();
-
-  writer.writeInt(-128);
-  var ber = writer.buffer;
-
-  t.ok(ber);
-
-  t.equal(ber.length, 3, 'Wrong length for an int');
-  t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
-  t.equal(ber[1], 0x01, 'length wrong');
-  t.equal(ber[2], 0x80, 'value wrong (byte 1)');
-
-  t.end();
-});
-
-
-test('write 2 byte negative int', function(t) {
-  var writer = new BerWriter();
-
-  writer.writeInt(-22400);
-  var ber = writer.buffer;
-
-  t.ok(ber);
-
-  t.equal(ber.length, 4, 'Wrong length for an int');
-  t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
-  t.equal(ber[1], 0x02, 'length wrong');
-  t.equal(ber[2], 0xa8, 'value wrong (byte 1)');
-  t.equal(ber[3], 0x80, 'value wrong (byte 2)');
-
-  t.end();
-});
-
-
-test('write 3 byte negative int', function(t) {
-  var writer = new BerWriter();
-
-  writer.writeInt(-481653);
-  var ber = writer.buffer;
-
-  t.ok(ber);
-
-  t.equal(ber.length, 5, 'Wrong length for an int');
-  t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
-  t.equal(ber[1], 0x03, 'length wrong');
-  t.equal(ber[2], 0xf8, 'value wrong (byte 1)');
-  t.equal(ber[3], 0xa6, 'value wrong (byte 2)');
-  t.equal(ber[4], 0x8b, 'value wrong (byte 3)');
-
-  t.end();
-});
-
-
-test('write 4 byte negative int', function(t) {
-  var writer = new BerWriter();
-
-  writer.writeInt(-1522904131);
-  var ber = writer.buffer;
-
-  t.ok(ber);
-
-  t.equal(ber.length, 6, 'Wrong length for an int');
-  t.equal(ber[0], 0x02, 'ASN.1 tag wrong');
-  t.equal(ber[1], 0x04, 'length wrong');
-  t.equal(ber[2], 0xa5, 'value wrong (byte 1)');
-  t.equal(ber[3], 0x3a, 'value wrong (byte 2)');
-  t.equal(ber[4], 0x53, 'value wrong (byte 3)');
-  t.equal(ber[5], 0xbd, 'value wrong (byte 4)');
-
-  t.end();
-});
-
-
-test('write boolean', function(t) {
-  var writer = new BerWriter();
-
-  writer.writeBoolean(true);
-  writer.writeBoolean(false);
-  var ber = writer.buffer;
-
-  t.ok(ber);
-  t.equal(ber.length, 6, 'Wrong length');
-  t.equal(ber[0], 0x01, 'tag wrong');
-  t.equal(ber[1], 0x01, 'length wrong');
-  t.equal(ber[2], 0xff, 'value wrong');
-  t.equal(ber[3], 0x01, 'tag wrong');
-  t.equal(ber[4], 0x01, 'length wrong');
-  t.equal(ber[5], 0x00, 'value wrong');
-
-  t.end();
-});
-
-
-test('write string', function(t) {
-  var writer = new BerWriter();
-  writer.writeString('hello world');
-  var ber = writer.buffer;
-
-  t.ok(ber);
-  t.equal(ber.length, 13, 'wrong length');
-  t.equal(ber[0], 0x04, 'wrong tag');
-  t.equal(ber[1], 11, 'wrong length');
-  t.equal(ber.slice(2).toString('utf8'), 'hello world', 'wrong value');
-
-  t.end();
-});
-
-test('write buffer', function(t) {
-  var writer = new BerWriter();
-  // write some stuff to start with
-  writer.writeString('hello world');
-  var ber = writer.buffer;
-  var buf = new Buffer([0x04, 0x0b, 0x30, 0x09, 0x02, 0x01, 0x0f, 0x01, 0x01,
-     0xff, 0x01, 0x01, 0xff]);
-  writer.writeBuffer(buf.slice(2, buf.length), 0x04);
-  ber = writer.buffer;
-
-  t.ok(ber);
-  t.equal(ber.length, 26, 'wrong length');
-  t.equal(ber[0], 0x04, 'wrong tag');
-  t.equal(ber[1], 11, 'wrong length');
-  t.equal(ber.slice(2, 13).toString('utf8'), 'hello world', 'wrong value');
-  t.equal(ber[13], buf[0], 'wrong tag');
-  t.equal(ber[14], buf[1], 'wrong length');
-  for (var i = 13, j = 0; i < ber.length && j < buf.length; i++, j++) {
-    t.equal(ber[i], buf[j], 'buffer contents not identical');
-  }
-  t.end();
-});
-
-test('write string array', function(t) {
-  var writer = new BerWriter();
-  writer.writeStringArray(['hello world', 'fubar!']);
-  var ber = writer.buffer;
-
-  t.ok(ber);
-
-  t.equal(ber.length, 21, 'wrong length');
-  t.equal(ber[0], 0x04, 'wrong tag');
-  t.equal(ber[1], 11, 'wrong length');
-  t.equal(ber.slice(2, 13).toString('utf8'), 'hello world', 'wrong value');
-
-  t.equal(ber[13], 0x04, 'wrong tag');
-  t.equal(ber[14], 6, 'wrong length');
-  t.equal(ber.slice(15).toString('utf8'), 'fubar!', 'wrong value');
-
-  t.end();
-});
-
-
-test('resize internal buffer', function(t) {
-  var writer = new BerWriter({size: 2});
-  writer.writeString('hello world');
-  var ber = writer.buffer;
-
-  t.ok(ber);
-  t.equal(ber.length, 13, 'wrong length');
-  t.equal(ber[0], 0x04, 'wrong tag');
-  t.equal(ber[1], 11, 'wrong length');
-  t.equal(ber.slice(2).toString('utf8'), 'hello world', 'wrong value');
-
-  t.end();
-});
-
-
-test('sequence', function(t) {
-  var writer = new BerWriter({size: 25});
-  writer.startSequence();
-  writer.writeString('hello world');
-  writer.endSequence();
-  var ber = writer.buffer;
-
-  t.ok(ber);
-  console.log(ber);
-  t.equal(ber.length, 15, 'wrong length');
-  t.equal(ber[0], 0x30, 'wrong tag');
-  t.equal(ber[1], 13, 'wrong length');
-  t.equal(ber[2], 0x04, 'wrong tag');
-  t.equal(ber[3], 11, 'wrong length');
-  t.equal(ber.slice(4).toString('utf8'), 'hello world', 'wrong value');
-
-  t.end();
-});
-
-
-test('nested sequence', function(t) {
-  var writer = new BerWriter({size: 25});
-  writer.startSequence();
-  writer.writeString('hello world');
-  writer.startSequence();
-  writer.writeString('hello world');
-  writer.endSequence();
-  writer.endSequence();
-  var ber = writer.buffer;
-
-  t.ok(ber);
-  t.equal(ber.length, 30, 'wrong length');
-  t.equal(ber[0], 0x30, 'wrong tag');
-  t.equal(ber[1], 28, 'wrong length');
-  t.equal(ber[2], 0x04, 'wrong tag');
-  t.equal(ber[3], 11, 'wrong length');
-  t.equal(ber.slice(4, 15).toString('utf8'), 'hello world', 'wrong value');
-  t.equal(ber[15], 0x30, 'wrong tag');
-  t.equal(ber[16], 13, 'wrong length');
-  t.equal(ber[17], 0x04, 'wrong tag');
-  t.equal(ber[18], 11, 'wrong length');
-  t.equal(ber.slice(19, 30).toString('utf8'), 'hello world', 'wrong value');
-
-  t.end();
-});
-
-
-test('LDAP bind message', function(t) {
-  var dn = 'cn=foo,ou=unit,o=test';
-  var writer = new BerWriter();
-  writer.startSequence();
-  writer.writeInt(3);             // msgid = 3
-  writer.startSequence(0x60);     // ldap bind
-  writer.writeInt(3);             // ldap v3
-  writer.writeString(dn);
-  writer.writeByte(0x80);
-  writer.writeByte(0x00);
-  writer.endSequence();
-  writer.endSequence();
-  var ber = writer.buffer;
-
-  t.ok(ber);
-  t.equal(ber.length, 35, 'wrong length (buffer)');
-  t.equal(ber[0], 0x30, 'wrong tag');
-  t.equal(ber[1], 33, 'wrong length');
-  t.equal(ber[2], 0x02, 'wrong tag');
-  t.equal(ber[3], 1, 'wrong length');
-  t.equal(ber[4], 0x03, 'wrong value');
-  t.equal(ber[5], 0x60, 'wrong tag');
-  t.equal(ber[6], 28, 'wrong length');
-  t.equal(ber[7], 0x02, 'wrong tag');
-  t.equal(ber[8], 1, 'wrong length');
-  t.equal(ber[9], 0x03, 'wrong value');
-  t.equal(ber[10], 0x04, 'wrong tag');
-  t.equal(ber[11], dn.length, 'wrong length');
-  t.equal(ber.slice(12, 33).toString('utf8'), dn, 'wrong value');
-  t.equal(ber[33], 0x80, 'wrong tag');
-  t.equal(ber[34], 0x00, 'wrong len');
-
-  t.end();
-});
-
-
-test('Write OID', function(t) {
-  var oid = '1.2.840.113549.1.1.1';
-  var writer = new BerWriter();
-  writer.writeOID(oid);
-
-  var ber = writer.buffer;
-  t.ok(ber);
-  console.log(require('util').inspect(ber));
-  console.log(require('util').inspect(new Buffer([0x06, 0x09, 0x2a, 0x86,
-                                                  0x48, 0x86, 0xf7, 0x0d,
-                                                  0x01, 0x01, 0x01])));
-
-  t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/AUTHORS b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/AUTHORS
deleted file mode 100644
index 1923524fe40ddb861d8ea84974cee77b4e26df14..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/AUTHORS
+++ /dev/null
@@ -1,6 +0,0 @@
-Dave Eddy <dave@daveeddy.com>
-Fred Kuo <fred.kuo@joyent.com>
-Lars-Magnus Skog <ralphtheninja@riseup.net>
-Mark Cavage <mcavage@gmail.com>
-Patrick Mooney <pmooney@pfmooney.com>
-Rob Gulewich <robert.gulewich@joyent.com>
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/CHANGES.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/CHANGES.md
deleted file mode 100644
index 57d92bfdb9dae072053be9186ee685b5bb5dcdcd..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/CHANGES.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# assert-plus Changelog
-
-## 1.0.0
-
-- *BREAKING* assert.number (and derivatives) now accept Infinity as valid input
-- Add assert.finite check.  Previous assert.number callers should use this if
-  they expect Infinity inputs to throw.
-
-## 0.2.0
-
-- Fix `assert.object(null)` so it throws
-- Fix optional/arrayOf exports for non-type-of asserts
-- Add optiona/arrayOf exports for Stream/Date/Regex/uuid
-- Add basic unit test coverage
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/README.md
deleted file mode 100644
index ec200d161efc93348359cf44ea0b38f1c48006c6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/README.md
+++ /dev/null
@@ -1,162 +0,0 @@
-# assert-plus
-
-This library is a super small wrapper over node's assert module that has two
-things: (1) the ability to disable assertions with the environment variable
-NODE\_NDEBUG, and (2) some API wrappers for argument testing.  Like
-`assert.string(myArg, 'myArg')`.  As a simple example, most of my code looks
-like this:
-
-```javascript
-    var assert = require('assert-plus');
-
-    function fooAccount(options, callback) {
-        assert.object(options, 'options');
-        assert.number(options.id, 'options.id');
-        assert.bool(options.isManager, 'options.isManager');
-        assert.string(options.name, 'options.name');
-        assert.arrayOfString(options.email, 'options.email');
-        assert.func(callback, 'callback');
-
-        // Do stuff
-        callback(null, {});
-    }
-```
-
-# API
-
-All methods that *aren't* part of node's core assert API are simply assumed to
-take an argument, and then a string 'name' that's not a message; `AssertionError`
-will be thrown if the assertion fails with a message like:
-
-    AssertionError: foo (string) is required
-    at test (/home/mark/work/foo/foo.js:3:9)
-    at Object.<anonymous> (/home/mark/work/foo/foo.js:15:1)
-    at Module._compile (module.js:446:26)
-    at Object..js (module.js:464:10)
-    at Module.load (module.js:353:31)
-    at Function._load (module.js:311:12)
-    at Array.0 (module.js:484:10)
-    at EventEmitter._tickCallback (node.js:190:38)
-
-from:
-
-```javascript
-    function test(foo) {
-        assert.string(foo, 'foo');
-    }
-```
-
-There you go.  You can check that arrays are of a homogeneous type with `Arrayof$Type`:
-
-```javascript
-    function test(foo) {
-        assert.arrayOfString(foo, 'foo');
-    }
-```
-
-You can assert IFF an argument is not `undefined` (i.e., an optional arg):
-
-```javascript
-    assert.optionalString(foo, 'foo');
-```
-
-Lastly, you can opt-out of assertion checking altogether by setting the
-environment variable `NODE_NDEBUG=1`.  This is pseudo-useful if you have
-lots of assertions, and don't want to pay `typeof ()` taxes to v8 in
-production.  Be advised:  The standard functions re-exported from `assert` are
-also disabled in assert-plus if NDEBUG is specified.  Using them directly from
-the `assert` module avoids this behavior.
-
-The complete list of APIs is:
-
-* assert.array
-* assert.bool
-* assert.buffer
-* assert.func
-* assert.number
-* assert.finite
-* assert.object
-* assert.string
-* assert.stream
-* assert.date
-* assert.regexp
-* assert.uuid
-* assert.arrayOfArray
-* assert.arrayOfBool
-* assert.arrayOfBuffer
-* assert.arrayOfFunc
-* assert.arrayOfNumber
-* assert.arrayOfFinite
-* assert.arrayOfObject
-* assert.arrayOfString
-* assert.arrayOfStream
-* assert.arrayOfDate
-* assert.arrayOfRegexp
-* assert.arrayOfUuid
-* assert.optionalArray
-* assert.optionalBool
-* assert.optionalBuffer
-* assert.optionalFunc
-* assert.optionalNumber
-* assert.optionalFinite
-* assert.optionalObject
-* assert.optionalString
-* assert.optionalStream
-* assert.optionalDate
-* assert.optionalRegexp
-* assert.optionalUuid
-* assert.optionalArrayOfArray
-* assert.optionalArrayOfBool
-* assert.optionalArrayOfBuffer
-* assert.optionalArrayOfFunc
-* assert.optionalArrayOfNumber
-* assert.optionalArrayOfFinite
-* assert.optionalArrayOfObject
-* assert.optionalArrayOfString
-* assert.optionalArrayOfStream
-* assert.optionalArrayOfDate
-* assert.optionalArrayOfRegexp
-* assert.optionalArrayOfUuid
-* assert.AssertionError
-* assert.fail
-* assert.ok
-* assert.equal
-* assert.notEqual
-* assert.deepEqual
-* assert.notDeepEqual
-* assert.strictEqual
-* assert.notStrictEqual
-* assert.throws
-* assert.doesNotThrow
-* assert.ifError
-
-# Installation
-
-    npm install assert-plus
-
-## License
-
-The MIT License (MIT)
-Copyright (c) 2012 Mark Cavage
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
-## Bugs
-
-See <https://github.com/mcavage/node-assert-plus/issues>.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/assert.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/assert.js
deleted file mode 100644
index 26f944eec307a087be052907c2236d42f3b4cd71..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/assert.js
+++ /dev/null
@@ -1,211 +0,0 @@
-// Copyright (c) 2012, Mark Cavage. All rights reserved.
-// Copyright 2015 Joyent, Inc.
-
-var assert = require('assert');
-var Stream = require('stream').Stream;
-var util = require('util');
-
-
-///--- Globals
-
-/* JSSTYLED */
-var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;
-
-
-///--- Internal
-
-function _capitalize(str) {
-    return (str.charAt(0).toUpperCase() + str.slice(1));
-}
-
-function _toss(name, expected, oper, arg, actual) {
-    throw new assert.AssertionError({
-        message: util.format('%s (%s) is required', name, expected),
-        actual: (actual === undefined) ? typeof (arg) : actual(arg),
-        expected: expected,
-        operator: oper || '===',
-        stackStartFunction: _toss.caller
-    });
-}
-
-function _getClass(arg) {
-    return (Object.prototype.toString.call(arg).slice(8, -1));
-}
-
-function noop() {
-    // Why even bother with asserts?
-}
-
-
-///--- Exports
-
-var types = {
-    bool: {
-        check: function (arg) { return typeof (arg) === 'boolean'; }
-    },
-    func: {
-        check: function (arg) { return typeof (arg) === 'function'; }
-    },
-    string: {
-        check: function (arg) { return typeof (arg) === 'string'; }
-    },
-    object: {
-        check: function (arg) {
-            return typeof (arg) === 'object' && arg !== null;
-        }
-    },
-    number: {
-        check: function (arg) {
-            return typeof (arg) === 'number' && !isNaN(arg);
-        }
-    },
-    finite: {
-        check: function (arg) {
-            return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg);
-        }
-    },
-    buffer: {
-        check: function (arg) { return Buffer.isBuffer(arg); },
-        operator: 'Buffer.isBuffer'
-    },
-    array: {
-        check: function (arg) { return Array.isArray(arg); },
-        operator: 'Array.isArray'
-    },
-    stream: {
-        check: function (arg) { return arg instanceof Stream; },
-        operator: 'instanceof',
-        actual: _getClass
-    },
-    date: {
-        check: function (arg) { return arg instanceof Date; },
-        operator: 'instanceof',
-        actual: _getClass
-    },
-    regexp: {
-        check: function (arg) { return arg instanceof RegExp; },
-        operator: 'instanceof',
-        actual: _getClass
-    },
-    uuid: {
-        check: function (arg) {
-            return typeof (arg) === 'string' && UUID_REGEXP.test(arg);
-        },
-        operator: 'isUUID'
-    }
-};
-
-function _setExports(ndebug) {
-    var keys = Object.keys(types);
-    var out;
-
-    /* re-export standard assert */
-    if (process.env.NODE_NDEBUG) {
-        out = noop;
-    } else {
-        out = function (arg, msg) {
-            if (!arg) {
-                _toss(msg, 'true', arg);
-            }
-        };
-    }
-
-    /* standard checks */
-    keys.forEach(function (k) {
-        if (ndebug) {
-            out[k] = noop;
-            return;
-        }
-        var type = types[k];
-        out[k] = function (arg, msg) {
-            if (!type.check(arg)) {
-                _toss(msg, k, type.operator, arg, type.actual);
-            }
-        };
-    });
-
-    /* optional checks */
-    keys.forEach(function (k) {
-        var name = 'optional' + _capitalize(k);
-        if (ndebug) {
-            out[name] = noop;
-            return;
-        }
-        var type = types[k];
-        out[name] = function (arg, msg) {
-            if (arg === undefined || arg === null) {
-                return;
-            }
-            if (!type.check(arg)) {
-                _toss(msg, k, type.operator, arg, type.actual);
-            }
-        };
-    });
-
-    /* arrayOf checks */
-    keys.forEach(function (k) {
-        var name = 'arrayOf' + _capitalize(k);
-        if (ndebug) {
-            out[name] = noop;
-            return;
-        }
-        var type = types[k];
-        var expected = '[' + k + ']';
-        out[name] = function (arg, msg) {
-            if (!Array.isArray(arg)) {
-                _toss(msg, expected, type.operator, arg, type.actual);
-            }
-            var i;
-            for (i = 0; i < arg.length; i++) {
-                if (!type.check(arg[i])) {
-                    _toss(msg, expected, type.operator, arg, type.actual);
-                }
-            }
-        };
-    });
-
-    /* optionalArrayOf checks */
-    keys.forEach(function (k) {
-        var name = 'optionalArrayOf' + _capitalize(k);
-        if (ndebug) {
-            out[name] = noop;
-            return;
-        }
-        var type = types[k];
-        var expected = '[' + k + ']';
-        out[name] = function (arg, msg) {
-            if (arg === undefined || arg === null) {
-                return;
-            }
-            if (!Array.isArray(arg)) {
-                _toss(msg, expected, type.operator, arg, type.actual);
-            }
-            var i;
-            for (i = 0; i < arg.length; i++) {
-                if (!type.check(arg[i])) {
-                    _toss(msg, expected, type.operator, arg, type.actual);
-                }
-            }
-        };
-    });
-
-    /* re-export built-in assertions */
-    Object.keys(assert).forEach(function (k) {
-        if (k === 'AssertionError') {
-            out[k] = assert[k];
-            return;
-        }
-        if (ndebug) {
-            out[k] = noop;
-            return;
-        }
-        out[k] = assert[k];
-    });
-
-    /* export ourselves (for unit tests _only_) */
-    out._setExports = _setExports;
-
-    return out;
-}
-
-module.exports = _setExports(process.env.NODE_NDEBUG);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/package.json
deleted file mode 100644
index 0696022f76873b235586b2835dd58a52dd528d58..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/assert-plus/package.json
+++ /dev/null
@@ -1,91 +0,0 @@
-{
-  "_from": "assert-plus@>=1.0.0 <2.0.0",
-  "_id": "assert-plus@1.0.0",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/sshpk/assert-plus",
-  "_nodeVersion": "0.10.40",
-  "_npmUser": {
-    "email": "patrick.f.mooney@gmail.com",
-    "name": "pfmooney"
-  },
-  "_npmVersion": "3.3.9",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature/sshpk",
-    "/serialport/node-pre-gyp/request/http-signature/sshpk/dashdash",
-    "/serialport/node-pre-gyp/request/http-signature/sshpk/getpass"
-  ],
-  "_resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-  "_shasum": "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mcavage@gmail.com",
-    "name": "Mark Cavage"
-  },
-  "bugs": {
-    "url": "https://github.com/mcavage/node-assert-plus/issues"
-  },
-  "contributors": [
-    {
-      "name": "Dave Eddy",
-      "email": "dave@daveeddy.com"
-    },
-    {
-      "name": "Fred Kuo",
-      "email": "fred.kuo@joyent.com"
-    },
-    {
-      "name": "Lars-Magnus Skog",
-      "email": "ralphtheninja@riseup.net"
-    },
-    {
-      "name": "Mark Cavage",
-      "email": "mcavage@gmail.com"
-    },
-    {
-      "name": "Patrick Mooney",
-      "email": "pmooney@pfmooney.com"
-    },
-    {
-      "name": "Rob Gulewich",
-      "email": "robert.gulewich@joyent.com"
-    }
-  ],
-  "dependencies": {},
-  "description": "Extra assertions on top of node's assert module",
-  "devDependencies": {
-    "faucet": "0.0.1",
-    "tape": "4.2.2"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525",
-    "tarball": "http://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
-  },
-  "engines": {
-    "node": ">=0.8"
-  },
-  "homepage": "https://github.com/mcavage/node-assert-plus#readme",
-  "license": "MIT",
-  "main": "./assert.js",
-  "maintainers": [
-    {
-      "name": "mcavage",
-      "email": "mcavage@gmail.com"
-    },
-    {
-      "name": "pfmooney",
-      "email": "patrick.f.mooney@gmail.com"
-    }
-  ],
-  "name": "assert-plus",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/mcavage/node-assert-plus.git"
-  },
-  "scripts": {
-    "test": "tape tests/*.js | ./node_modules/.bin/faucet"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/README.md
deleted file mode 100644
index e47b106e637d21d7d078a3806c9286906ee3208b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/README.md
+++ /dev/null
@@ -1,574 +0,0 @@
-A light, featureful and explicit option parsing library for node.js.
-
-[Why another one? See below](#why). tl;dr: The others I've tried are one of
-too loosey goosey (not explicit), too big/too many deps, or ill specified.
-YMMV.
-
-Follow <a href="https://twitter.com/intent/user?screen_name=trentmick" target="_blank">@trentmick</a>
-for updates to node-dashdash.
-
-# Install
-
-    npm install dashdash
-
-
-# Usage
-
-```javascript
-var dashdash = require('dashdash');
-
-// Specify the options. Minimally `name` (or `names`) and `type`
-// must be given for each.
-var options = [
-    {
-        // `names` or a single `name`. First element is the `opts.KEY`.
-        names: ['help', 'h'],
-        // See "Option specs" below for types.
-        type: 'bool',
-        help: 'Print this help and exit.'
-    }
-];
-
-// Shortcut form. As called it infers `process.argv`. See below for
-// the longer form to use methods like `.help()` on the Parser object.
-var opts = dashdash.parse({options: options});
-
-console.log("opts:", opts);
-console.log("args:", opts._args);
-```
-
-
-# Longer Example
-
-A more realistic [starter script "foo.js"](./examples/foo.js) is as follows.
-This also shows using `parser.help()` for formatted option help.
-
-```javascript
-var dashdash = require('./lib/dashdash');
-
-var options = [
-    {
-        name: 'version',
-        type: 'bool',
-        help: 'Print tool version and exit.'
-    },
-    {
-        names: ['help', 'h'],
-        type: 'bool',
-        help: 'Print this help and exit.'
-    },
-    {
-        names: ['verbose', 'v'],
-        type: 'arrayOfBool',
-        help: 'Verbose output. Use multiple times for more verbose.'
-    },
-    {
-        names: ['file', 'f'],
-        type: 'string',
-        help: 'File to process',
-        helpArg: 'FILE'
-    }
-];
-
-var parser = dashdash.createParser({options: options});
-try {
-    var opts = parser.parse(process.argv);
-} catch (e) {
-    console.error('foo: error: %s', e.message);
-    process.exit(1);
-}
-
-console.log("# opts:", opts);
-console.log("# args:", opts._args);
-
-// Use `parser.help()` for formatted options help.
-if (opts.help) {
-    var help = parser.help({includeEnv: true}).trimRight();
-    console.log('usage: node foo.js [OPTIONS]\n'
-                + 'options:\n'
-                + help);
-    process.exit(0);
-}
-
-// ...
-```
-
-
-Some example output from this script (foo.js):
-
-```
-$ node foo.js -h
-# opts: { help: true,
-  _order: [ { name: 'help', value: true, from: 'argv' } ],
-  _args: [] }
-# args: []
-usage: node foo.js [OPTIONS]
-options:
-    --version             Print tool version and exit.
-    -h, --help            Print this help and exit.
-    -v, --verbose         Verbose output. Use multiple times for more verbose.
-    -f FILE, --file=FILE  File to process
-
-$ node foo.js -v
-# opts: { verbose: [ true ],
-  _order: [ { name: 'verbose', value: true, from: 'argv' } ],
-  _args: [] }
-# args: []
-
-$ node foo.js --version arg1
-# opts: { version: true,
-  _order: [ { name: 'version', value: true, from: 'argv' } ],
-  _args: [ 'arg1' ] }
-# args: [ 'arg1' ]
-
-$ node foo.js -f bar.txt
-# opts: { file: 'bar.txt',
-  _order: [ { name: 'file', value: 'bar.txt', from: 'argv' } ],
-  _args: [] }
-# args: []
-
-$ node foo.js -vvv --file=blah
-# opts: { verbose: [ true, true, true ],
-  file: 'blah',
-  _order:
-   [ { name: 'verbose', value: true, from: 'argv' },
-     { name: 'verbose', value: true, from: 'argv' },
-     { name: 'verbose', value: true, from: 'argv' },
-     { name: 'file', value: 'blah', from: 'argv' } ],
-  _args: [] }
-# args: []
-```
-
-
-See the ["examples"](examples/) dir for a number of starter examples using
-some of dashdash's features.
-
-
-# Environment variable integration
-
-If you want to allow environment variables to specify options to your tool,
-dashdash makes this easy. We can change the 'verbose' option in the example
-above to include an 'env' field:
-
-```javascript
-    {
-        names: ['verbose', 'v'],
-        type: 'arrayOfBool',
-        env: 'FOO_VERBOSE',         // <--- add this line
-        help: 'Verbose output. Use multiple times for more verbose.'
-    },
-```
-
-then the **"FOO_VERBOSE" environment variable** can be used to set this
-option:
-
-```shell
-$ FOO_VERBOSE=1 node foo.js
-# opts: { verbose: [ true ],
-  _order: [ { name: 'verbose', value: true, from: 'env' } ],
-  _args: [] }
-# args: []
-```
-
-Boolean options will interpret the empty string as unset, '0' as false
-and anything else as true.
-
-```shell
-$ FOO_VERBOSE= node examples/foo.js                 # not set
-# opts: { _order: [], _args: [] }
-# args: []
-
-$ FOO_VERBOSE=0 node examples/foo.js                # '0' is false
-# opts: { verbose: [ false ],
-  _order: [ { key: 'verbose', value: false, from: 'env' } ],
-  _args: [] }
-# args: []
-
-$ FOO_VERBOSE=1 node examples/foo.js                # true
-# opts: { verbose: [ true ],
-  _order: [ { key: 'verbose', value: true, from: 'env' } ],
-  _args: [] }
-# args: []
-
-$ FOO_VERBOSE=boogabooga node examples/foo.js       # true
-# opts: { verbose: [ true ],
-  _order: [ { key: 'verbose', value: true, from: 'env' } ],
-  _args: [] }
-# args: []
-```
-
-Non-booleans can be used as well. Strings:
-
-```shell
-$ FOO_FILE=data.txt node examples/foo.js
-# opts: { file: 'data.txt',
-  _order: [ { key: 'file', value: 'data.txt', from: 'env' } ],
-  _args: [] }
-# args: []
-```
-
-Numbers:
-
-```shell
-$ FOO_TIMEOUT=5000 node examples/foo.js
-# opts: { timeout: 5000,
-  _order: [ { key: 'timeout', value: 5000, from: 'env' } ],
-  _args: [] }
-# args: []
-
-$ FOO_TIMEOUT=blarg node examples/foo.js
-foo: error: arg for "FOO_TIMEOUT" is not a positive integer: "blarg"
-```
-
-With the `includeEnv: true` config to `parser.help()` the environment
-variable can also be included in **help output**:
-
-    usage: node foo.js [OPTIONS]
-    options:
-        --version             Print tool version and exit.
-        -h, --help            Print this help and exit.
-        -v, --verbose         Verbose output. Use multiple times for more verbose.
-                              Environment: FOO_VERBOSE=1
-        -f FILE, --file=FILE  File to process
-
-
-# Bash completion
-
-Dashdash provides a simple way to create a Bash completion file that you
-can place in your "bash_completion.d" directory -- sometimes that is
-"/usr/local/etc/bash_completion.d/"). Features:
-
-- Support for short and long opts
-- Support for knowing which options take arguments
-- Support for subcommands (e.g. 'git log <TAB>' to show just options for the
-  log subcommand). See
-  [node-cmdln](https://github.com/trentm/node-cmdln#bash-completion) for
-  how to integrate that.
-- Does the right thing with "--" to stop options.
-- Custom optarg and arg types for custom completions.
-
-Dashdash will return bash completion file content given a parser instance:
-
-    var parser = dashdash.createParser({options: options});
-    console.log( parser.bashCompletion({name: 'mycli'}) );
-
-or directly from a `options` array of options specs:
-
-    var code = dashdash.bashCompletionFromOptions({
-        name: 'mycli',
-        options: OPTIONS
-    });
-
-Write that content to "/usr/local/etc/bash_completion.d/mycli" and you will
-have Bash completions for `mycli`. Alternatively you can write it to
-any file (e.g. "~/.bashrc") and source it.
-
-You could add a `--completion` hidden option to your tool that emits the
-completion content and document for your users to call that to install
-Bash completions.
-
-See [examples/ddcompletion.js](examples/ddcompletion.js) for a complete
-example, including how one can define bash functions for completion of custom
-option types. Also see [node-cmdln](https://github.com/trentm/node-cmdln) for
-how it uses this for Bash completion for full multi-subcommand tools.
-
-- TODO: document specExtra
-- TODO: document includeHidden
-- TODO: document custom types, `function complete\_FOO` guide, completionType
-- TODO: document argtypes
-
-
-# Parser config
-
-Parser construction (i.e. `dashdash.createParser(CONFIG)`) takes the
-following fields:
-
-- `options` (Array of option specs). Required. See the
-  [Option specs](#option-specs) section below.
-
-- `interspersed` (Boolean). Optional. Default is true. If true this allows
-  interspersed arguments and options. I.e.:
-
-        node ./tool.js -v arg1 arg2 -h   # '-h' is after interspersed args
-
-  Set it to false to have '-h' **not** get parsed as an option in the above
-  example.
-
-- `allowUnknown` (Boolean).  Optional.  Default is false.  If false, this causes
-  unknown arguments to throw an error.  I.e.:
-
-        node ./tool.js -v arg1 --afe8asefksjefhas
-
-  Set it to true to treat the unknown option as a positional
-  argument.
-
-  **Caveat**: When a shortopt group, such as `-xaz` contains a mix of
-  known and unknown options, the *entire* group is passed through
-  unmolested as a positional argument.
-
-  Consider if you have a known short option `-a`, and parse the
-  following command line:
-
-        node ./tool.js -xaz
-
-  where `-x` and `-z` are unknown.  There are multiple ways to
-  interpret this:
-
-    1. `-x` takes a value: `{x: 'az'}`
-    2. `-x` and `-z` are both booleans: `{x:true,a:true,z:true}`
-
-  Since dashdash does not know what `-x` and `-z` are, it can't know
-  if you'd prefer to receive `{a:true,_args:['-x','-z']}` or
-  `{x:'az'}`, or `{_args:['-xaz']}`. Leaving the positional arg unprocessed
-  is the easiest mistake for the user to recover from.
-
-
-# Option specs
-
-Example using all fields (required fields are noted):
-
-```javascript
-{
-    names: ['file', 'f'],       // Required (one of `names` or `name`).
-    type: 'string',             // Required.
-    completionType: 'filename',
-    env: 'MYTOOL_FILE',
-    help: 'Config file to load before running "mytool"',
-    helpArg: 'PATH',
-    helpWrap: false,
-    default: path.resolve(process.env.HOME, '.mytoolrc')
-}
-```
-
-Each option spec in the `options` array must/can have the following fields:
-
-- `name` (String) or `names` (Array). Required. These give the option name
-  and aliases. The first name (if more than one given) is the key for the
-  parsed `opts` object.
-
-- `type` (String). Required. One of:
-
-    - bool
-    - string
-    - number
-    - integer
-    - positiveInteger
-    - date (epoch seconds, e.g. 1396031701, or ISO 8601 format
-      `YYYY-MM-DD[THH:MM:SS[.sss][Z]]`, e.g. "2014-03-28T18:35:01.489Z")
-    - arrayOfBool
-    - arrayOfString
-    - arrayOfNumber
-    - arrayOfInteger
-    - arrayOfPositiveInteger
-    - arrayOfDate
-
-  FWIW, these names attempt to match with asserts on
-  [assert-plus](https://github.com/mcavage/node-assert-plus).
-  You can add your own custom option types with `dashdash.addOptionType`.
-  See below.
-
-- `completionType` (String). Optional. This is used for [Bash
-  completion](#bash-completion) for an option argument. If not specified,
-  then the value of `type` is used. Any string may be specified, but only the
-  following values have meaning:
-
-    - `none`: Provide no completions.
-    - `file`: Bash's default completion (i.e. `complete -o default`), which
-      includes filenames.
-    - *Any string FOO for which a `function complete_FOO` Bash function is
-      defined.* This is for custom completions for a given tool. Typically
-      these custom functions are provided in the `specExtra` argument to
-      `dashdash.bashCompletionFromOptions()`. See
-      ["examples/ddcompletion.js"](examples/ddcompletion.js) for an example.
-
-- `env` (String or Array of String). Optional. An environment variable name
-  (or names) that can be used as a fallback for this option. For example,
-  given a "foo.js" like this:
-
-        var options = [{names: ['dry-run', 'n'], env: 'FOO_DRY_RUN'}];
-        var opts = dashdash.parse({options: options});
-
-  Both `node foo.js --dry-run` and `FOO_DRY_RUN=1 node foo.js` would result
-  in `opts.dry_run = true`.
-
-  An environment variable is only used as a fallback, i.e. it is ignored if
-  the associated option is given in `argv`.
-
-- `help` (String). Optional. Used for `parser.help()` output.
-
-- `helpArg` (String). Optional. Used in help output as the placeholder for
-  the option argument, e.g. the "PATH" in:
-
-        ...
-        -f PATH, --file=PATH    File to process
-        ...
-
-- `helpWrap` (Boolean). Optional, default true. Set this to `false` to have
-  that option's `help` *not* be text wrapped in `<parser>.help()` output.
-
-- `default`. Optional. A default value used for this option, if the
-  option isn't specified in argv.
-
-- `hidden` (Boolean). Optional, default false. If true, help output will not
-  include this option. See also the `includeHidden` option to
-  `bashCompletionFromOptions()` for [Bash completion](#bash-completion).
-
-
-# Option group headings
-
-You can add headings between option specs in the `options` array.  To do so,
-simply add an object with only a `group` property -- the string to print as
-the heading for the subsequent options in the array.  For example:
-
-```javascript
-var options = [
-    {
-        group: 'Armament Options'
-    },
-    {
-        names: [ 'weapon', 'w' ],
-        type: 'string'
-    },
-    {
-        group: 'General Options'
-    },
-    {
-        names: [ 'help', 'h' ],
-        type: 'bool'
-    }
-];
-...
-```
-
-Note: You can use an empty string, `{group: ''}`, to get a blank line in help
-output between groups of options.
-
-
-# Help config
-
-The `parser.help(...)` function is configurable as follows:
-
-        Options:
-          Armament Options:
-        ^^  -w WEAPON, --weapon=WEAPON  Weapon with which to crush. One of: |
-       /                                sword, spear, maul                  |
-      /   General Options:                                                  |
-     /      -h, --help                  Print this help and exit.           |
-    /   ^^^^                            ^                                   |
-    \       `-- indent                   `-- helpCol              maxCol ---'
-     `-- headingIndent
-
-- `indent` (Number or String). Default 4. Set to a number (for that many
-  spaces) or a string for the literal indent.
-- `headingIndent` (Number or String). Default half length of `indent`. Set to
-  a number (for that many spaces) or a string for the literal indent. This
-  indent applies to group heading lines, between normal option lines.
-- `nameSort` (String). Default is 'length'. By default the names are
-  sorted to put the short opts first (i.e. '-h, --help' preferred
-  to '--help, -h'). Set to 'none' to not do this sorting.
-- `maxCol` (Number). Default 80. Note that reflow is just done on whitespace
-  so a long token in the option help can overflow maxCol.
-- `helpCol` (Number). If not set a reasonable value will be determined
-  between `minHelpCol` and `maxHelpCol`.
-- `minHelpCol` (Number). Default 20.
-- `maxHelpCol` (Number). Default 40.
-- `helpWrap` (Boolean). Default true. Set to `false` to have option `help`
-  strings *not* be textwrapped to the helpCol..maxCol range.
-- `includeEnv` (Boolean). Default false. If the option has associated
-  environment variables (via the `env` option spec attribute), then
-  append mentioned of those envvars to the help string.
-- `includeDefault` (Boolean). Default false. If the option has a default value
-  (via the `default` option spec attribute, or a default on the option's type),
-  then a "Default: VALUE" string will be appended to the help string.
-
-
-# Custom option types
-
-Dashdash includes a good starter set of option types that it will parse for
-you. However, you can add your own via:
-
-    var dashdash = require('dashdash');
-    dashdash.addOptionType({
-        name: '...',
-        takesArg: true,
-        helpArg: '...',
-        parseArg: function (option, optstr, arg) {
-            ...
-        },
-        array: false,  // optional
-        arrayFlatten: false,  // optional
-        default: ...,   // optional
-        completionType: ...  // optional
-    });
-
-For example, a simple option type that accepts 'yes', 'y', 'no' or 'n' as
-a boolean argument would look like:
-
-    var dashdash = require('dashdash');
-
-    function parseYesNo(option, optstr, arg) {
-        var argLower = arg.toLowerCase()
-        if (~['yes', 'y'].indexOf(argLower)) {
-            return true;
-        } else if (~['no', 'n'].indexOf(argLower)) {
-            return false;
-        } else {
-            throw new Error(format(
-                'arg for "%s" is not "yes" or "no": "%s"',
-                optstr, arg));
-        }
-    }
-
-    dashdash.addOptionType({
-        name: 'yesno'
-        takesArg: true,
-        helpArg: '<yes|no>',
-        parseArg: parseYesNo
-    });
-
-    var options = {
-        {names: ['answer', 'a'], type: 'yesno'}
-    };
-    var opts = dashdash.parse({options: options});
-
-See "examples/custom-option-\*.js" for other examples.
-See the `addOptionType` block comment in "lib/dashdash.js" for more details.
-Please let me know [with an
-issue](https://github.com/trentm/node-dashdash/issues/new) if you write a
-generally useful one.
-
-
-
-# Why
-
-Why another node.js option parsing lib?
-
-- `nopt` really is just for "tools like npm". Implicit opts (e.g. '--no-foo'
-  works for every '--foo'). Can't disable abbreviated opts. Can't do multiple
-  usages of same opt, e.g. '-vvv' (I think). Can't do grouped short opts.
-
-- `optimist` has surprise interpretation of options (at least to me).
-  Implicit opts mean ambiguities and poor error handling for fat-fingering.
-  `process.exit` calls makes it hard to use as a libary.
-
-- `optparse` Incomplete docs. Is this an attempted clone of Python's `optparse`.
-  Not clear. Some divergence. `parser.on("name", ...)` API is weird.
-
-- `argparse` Dep on underscore. No thanks just for option processing.
-  `find lib | wc -l` -> `26`. Overkill.
-  Argparse is a bit different anyway. Not sure I want that.
-
-- `posix-getopt` No type validation. Though that isn't a killer. AFAIK can't
-  have a long opt without a short alias. I.e. no `getopt_long` semantics.
-  Also, no whizbang features like generated help output.
-
-- ["commander.js"](https://github.com/visionmedia/commander.js): I wrote
-  [a critique](http://trentm.com/2014/01/a-critique-of-commander-for-nodejs.html)
-  a while back. It seems fine, but last I checked had
-  [an outstanding bug](https://github.com/visionmedia/commander.js/pull/121)
-  that would prevent me from using it.
-
-
-# License
-
-MIT. See LICENSE.txt.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/etc/dashdash.bash_completion.in b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/etc/dashdash.bash_completion.in
deleted file mode 100644
index 50b7d6e0e31c89e6982543b68b8b483199830607..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/etc/dashdash.bash_completion.in
+++ /dev/null
@@ -1,388 +0,0 @@
-#!/bin/bash
-#
-# Bash completion generated for '{{name}}' at {{date}}.
-#
-# The original template lives here:
-# https://github.com/trentm/node-dashdash/blob/master/etc/dashdash.bash_completion.in
-#
-
-#
-# Copyright 2016 Trent Mick
-# Copyright 2016 Joyent, Inc.
-#
-#
-# A generic Bash completion driver script.
-#
-# This is meant to provide a re-usable chunk of Bash to use for
-# "etc/bash_completion.d/" files for individual tools. Only the "Configuration"
-# section with tool-specific info need differ. Features:
-#
-# - support for short and long opts
-# - support for knowing which options take arguments
-# - support for subcommands (e.g. 'git log <TAB>' to show just options for the
-#   log subcommand)
-# - does the right thing with "--" to stop options
-# - custom optarg and arg types for custom completions
-# - (TODO) support for shells other than Bash (tcsh, zsh, fish?, etc.)
-#
-#
-# Examples/design:
-#
-# 1. Bash "default" completion. By default Bash's 'complete -o default' is
-#    enabled. That means when there are no completions (e.g. if no opts match
-#    the current word), then you'll get Bash's default completion. Most notably
-#    that means you get filename completion. E.g.:
-#       $ tool ./<TAB>
-#       $ tool READ<TAB>
-#
-# 2. all opts and subcmds:
-#       $ tool <TAB>
-#       $ tool -v <TAB>     # assuming '-v' doesn't take an arg
-#       $ tool -<TAB>       # matching opts
-#       $ git lo<TAB>       # matching subcmds
-#
-#    Long opt completions are given *without* the '=', i.e. we prefer space
-#    separated because that's easier for good completions.
-#
-# 3. long opt arg with '='
-#       $ tool --file=<TAB>
-#       $ tool --file=./d<TAB>
-#    We maintain the "--file=" prefix. Limitation: With the attached prefix
-#    the 'complete -o filenames' doesn't know to do dirname '/' suffixing. Meh.
-#
-# 4. envvars:
-#       $ tool $<TAB>
-#       $ tool $P<TAB>
-#    Limitation: Currently only getting exported vars, so we miss "PS1" and
-#    others.
-#
-# 5. Defer to other completion in a subshell:
-#       $ tool --file $(cat ./<TAB>
-#    We get this from 'complete -o default ...'.
-#
-# 6. Custom completion types from a provided bash function.
-#       $ tool --profile <TAB>        # complete available "profiles"
-#
-#
-# Dev Notes:
-# - compgen notes, from http://unix.stackexchange.com/questions/151118/understand-compgen-builtin-command
-# - https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion-Builtins.html
-#
-
-
-# Debugging this completion:
-#   1. Uncomment the "_{{name}}_log_file=..." line.
-#   2. 'tail -f /var/tmp/dashdash-completion.log' in one terminal.
-#   3. Re-source this bash completion file.
-#_{{name}}_log=/var/tmp/dashdash-completion.log
-
-function _{{name}}_completer {
-
-    # ---- cmd definition
-
-    {{spec}}
-
-
-    # ---- locals
-
-    declare -a argv
-
-
-    # ---- support functions
-
-    function trace {
-        [[ -n "$_{{name}}_log" ]] && echo "$*" >&2
-    }
-
-    function _dashdash_complete {
-        local idx context
-        idx=$1
-        context=$2
-
-        local shortopts longopts optargs subcmds allsubcmds argtypes
-        shortopts="$(eval "echo \${cmd${context}_shortopts}")"
-        longopts="$(eval "echo \${cmd${context}_longopts}")"
-        optargs="$(eval "echo \${cmd${context}_optargs}")"
-        subcmds="$(eval "echo \${cmd${context}_subcmds}")"
-        allsubcmds="$(eval "echo \${cmd${context}_allsubcmds}")"
-        IFS=', ' read -r -a argtypes <<< "$(eval "echo \${cmd${context}_argtypes}")"
-
-        trace ""
-        trace "_dashdash_complete(idx=$idx, context=$context)"
-        trace "  shortopts: $shortopts"
-        trace "  longopts: $longopts"
-        trace "  optargs: $optargs"
-        trace "  subcmds: $subcmds"
-        trace "  allsubcmds: $allsubcmds"
-
-        # Get 'state' of option parsing at this COMP_POINT.
-        # Copying "dashdash.js#parse()" behaviour here.
-        local state=
-        local nargs=0
-        local i=$idx
-        local argtype
-        local optname
-        local prefix
-        local word
-        local dashdashseen=
-        while [[ $i -lt $len && $i -le $COMP_CWORD ]]; do
-            argtype=
-            optname=
-            prefix=
-            word=
-
-            arg=${argv[$i]}
-            trace "  consider argv[$i]: '$arg'"
-
-            if [[ "$arg" == "--" && $i -lt $COMP_CWORD ]]; then
-                trace "    dashdash seen"
-                dashdashseen=yes
-                state=arg
-                word=$arg
-            elif [[ -z "$dashdashseen" && "${arg:0:2}" == "--" ]]; then
-                arg=${arg:2}
-                if [[ "$arg" == *"="* ]]; then
-                    optname=${arg%%=*}
-                    val=${arg##*=}
-                    trace "    long opt: optname='$optname' val='$val'"
-                    state=arg
-                    argtype=$(echo "$optargs" | awk -F "-$optname=" '{print $2}' | cut -d' ' -f1)
-                    word=$val
-                    prefix="--$optname="
-                else
-                    optname=$arg
-                    val=
-                    trace "    long opt: optname='$optname'"
-                    state=longopt
-                    word=--$optname
-
-                    if [[ "$optargs" == *"-$optname="* && $i -lt $COMP_CWORD ]]; then
-                        i=$(( $i + 1 ))
-                        state=arg
-                        argtype=$(echo "$optargs" | awk -F "-$optname=" '{print $2}' | cut -d' ' -f1)
-                        word=${argv[$i]}
-                        trace "    takes arg (consume argv[$i], word='$word')"
-                    fi
-                fi
-            elif [[ -z "$dashdashseen" && "${arg:0:1}" == "-" ]]; then
-                trace "    short opt group"
-                state=shortopt
-                word=$arg
-
-                local j=1
-                while [[ $j -lt ${#arg} ]]; do
-                    optname=${arg:$j:1}
-                    trace "    consider index $j: optname '$optname'"
-
-                    if [[ "$optargs" == *"-$optname="* ]]; then
-                        argtype=$(echo "$optargs" | awk -F "-$optname=" '{print $2}' | cut -d' ' -f1)
-                        if [[ $(( $j + 1 )) -lt ${#arg} ]]; then
-                            state=arg
-                            word=${arg:$(( $j + 1 ))}
-                            trace "      takes arg (rest of this arg, word='$word', argtype='$argtype')"
-                        elif [[ $i -lt $COMP_CWORD ]]; then
-                            state=arg
-                            i=$(( $i + 1 ))
-                            word=${argv[$i]}
-                            trace "    takes arg (word='$word', argtype='$argtype')"
-                        fi
-                        break
-                    fi
-
-                    j=$(( $j + 1 ))
-                done
-            elif [[ $i -lt $COMP_CWORD && -n "$arg" ]] && $(echo "$allsubcmds" | grep -w "$arg" >/dev/null); then
-                trace "    complete subcmd: recurse _dashdash_complete"
-                _dashdash_complete $(( $i + 1 )) "${context}__${arg/-/_}"
-                return
-            else
-                trace "    not an opt or a complete subcmd"
-                state=arg
-                word=$arg
-                nargs=$(( $nargs + 1 ))
-                if [[ ${#argtypes[@]} -gt 0 ]]; then
-                    argtype="${argtypes[$(( $nargs - 1 ))]}"
-                    if [[ -z "$argtype" ]]; then
-                        # If we have more args than argtypes, we use the
-                        # last type.
-                        argtype="${argtypes[@]: -1:1}"
-                    fi
-                fi
-            fi
-
-            trace "    state=$state prefix='$prefix' word='$word'"
-            i=$(( $i + 1 ))
-        done
-
-        trace "  parsed: state=$state optname='$optname' argtype='$argtype' prefix='$prefix' word='$word' dashdashseen=$dashdashseen"
-        local compgen_opts=
-        if [[ -n "$prefix" ]]; then
-            compgen_opts="$compgen_opts -P $prefix"
-        fi
-
-        case $state in
-        shortopt)
-            compgen $compgen_opts -W "$shortopts $longopts" -- "$word"
-            ;;
-        longopt)
-            compgen $compgen_opts -W "$longopts" -- "$word"
-            ;;
-        arg)
-            # If we don't know what completion to do, then emit nothing. We
-            # expect that we are running with:
-            #       complete -o default ...
-            # where "default" means: "Use Readline's default completion if
-            # the compspec generates no matches." This gives us the good filename
-            # completion, completion in subshells/backticks.
-            #
-            # We cannot support an argtype="directory" because
-            #       compgen -S '/' -A directory -- "$word"
-            # doesn't give a satisfying result. It doesn't stop at the trailing '/'
-            # so you cannot descend into dirs.
-            if [[ "${word:0:1}" == '$' ]]; then
-                # By default, Bash will complete '$<TAB>' to all envvars. Apparently
-                # 'complete -o default' does *not* give us that. The following
-                # gets *close* to the same completions: '-A export' misses envvars
-                # like "PS1".
-                trace "  completing envvars"
-                compgen $compgen_opts -P '$' -A export -- "${word:1}"
-            elif [[ -z "$argtype" ]]; then
-                # Only include opts in completions if $word is not empty.
-                # This is to avoid completing the leading '-', which foils
-                # using 'default' completion.
-                if [[ -n "$dashdashseen" ]]; then
-                    trace "  completing subcmds, if any (no argtype, dashdash seen)"
-                    compgen $compgen_opts -W "$subcmds" -- "$word"
-                elif [[ -z "$word" ]]; then
-                    trace "  completing subcmds, if any (no argtype, empty word)"
-                    compgen $compgen_opts -W "$subcmds" -- "$word"
-                else
-                    trace "  completing opts & subcmds (no argtype)"
-                    compgen $compgen_opts -W "$shortopts $longopts $subcmds" -- "$word"
-                fi
-            elif [[ $argtype == "none" ]]; then
-                # We want *no* completions, i.e. some way to get the active
-                # 'complete -o default' to not do filename completion.
-                trace "  completing 'none' (hack to imply no completions)"
-                echo "##-no completions-##"
-            elif [[ $argtype == "file" ]]; then
-                # 'complete -o default' gives the best filename completion, at least
-                # on Mac.
-                trace "  completing 'file' (let 'complete -o default' handle it)"
-                echo ""
-            elif ! type complete_$argtype 2>/dev/null >/dev/null; then
-                trace "  completing '$argtype' (fallback to default b/c complete_$argtype is unknown)"
-                echo ""
-            else
-                trace "  completing custom '$argtype'"
-                completions=$(complete_$argtype "$word")
-                if [[ -z "$completions" ]]; then
-                    trace "  no custom '$argtype' completions"
-                    # These are in alpha order so they show up correctly.
-                    echo "##-no -$argtype- completions-##"
-                else
-                    echo $completions
-                fi
-            fi
-            ;;
-        *)
-            trace "  unknown state: $state"
-            ;;
-        esac
-    }
-
-
-    trace ""
-    trace "-- $(date)"
-    #trace "\$IFS: '$IFS'"
-    #trace "\$@: '$@'"
-    #trace "COMP_WORDBREAKS: '$COMP_WORDBREAKS'"
-    trace "COMP_CWORD: '$COMP_CWORD'"
-    trace "COMP_LINE: '$COMP_LINE'"
-    trace "COMP_POINT: $COMP_POINT"
-
-    # Guard against negative COMP_CWORD. This is a Bash bug at least on
-    # Mac 10.10.4's bash. See
-    # <https://lists.gnu.org/archive/html/bug-bash/2009-07/msg00125.html>.
-    if [[ $COMP_CWORD -lt 0 ]]; then
-        trace "abort on negative COMP_CWORD"
-        exit 1;
-    fi
-
-    # I don't know how to do array manip on argv vars,
-    # so copy over to argv array to work on them.
-    shift   # the leading '--'
-    i=0
-    len=$#
-    while [[ $# -gt 0 ]]; do
-        argv[$i]=$1
-        shift;
-        i=$(( $i + 1 ))
-    done
-    trace "argv: '${argv[@]}'"
-    trace "argv[COMP_CWORD-1]: '${argv[$(( $COMP_CWORD - 1 ))]}'"
-    trace "argv[COMP_CWORD]: '${argv[$COMP_CWORD]}'"
-    trace "argv len: '$len'"
-
-    _dashdash_complete 1 ""
-}
-
-
-# ---- mainline
-
-# Note: This if-block to help work with 'compdef' and 'compctl' is
-# adapted from 'npm completion'.
-if type complete &>/dev/null; then
-    function _{{name}}_completion {
-        local _log_file=/dev/null
-        [[ -z "$_{{name}}_log" ]] || _log_file="$_{{name}}_log"
-        COMPREPLY=($(COMP_CWORD="$COMP_CWORD" \
-            COMP_LINE="$COMP_LINE" \
-            COMP_POINT="$COMP_POINT" \
-            _{{name}}_completer -- "${COMP_WORDS[@]}" \
-            2>$_log_file)) || return $?
-    }
-    complete -o default -F _{{name}}_completion {{name}}
-elif type compdef &>/dev/null; then
-    function _{{name}}_completion {
-        local _log_file=/dev/null
-        [[ -z "$_{{name}}_log" ]] || _log_file="$_{{name}}_log"
-        compadd -- $(COMP_CWORD=$((CURRENT-1)) \
-            COMP_LINE=$BUFFER \
-            COMP_POINT=0 \
-            _{{name}}_completer -- "${words[@]}" \
-            2>$_log_file)
-    }
-    compdef _{{name}}_completion {{name}}
-elif type compctl &>/dev/null; then
-    function _{{name}}_completion {
-        local cword line point words si
-        read -Ac words
-        read -cn cword
-        let cword-=1
-        read -l line
-        read -ln point
-        local _log_file=/dev/null
-        [[ -z "$_{{name}}_log" ]] || _log_file="$_{{name}}_log"
-        reply=($(COMP_CWORD="$cword" \
-            COMP_LINE="$line" \
-            COMP_POINT="$point" \
-            _{{name}}_completer -- "${words[@]}" \
-            2>$_log_file)) || return $?
-    }
-    compctl -K _{{name}}_completion {{name}}
-fi
-
-
-##
-## This is a Bash completion file for the '{{name}}' command. You can install
-## with either:
-##
-##     cp FILE /usr/local/etc/bash_completion.d/{{name}}   # Mac
-##     cp FILE /etc/bash_completion.d/{{name}}             # Linux
-##
-## or:
-##
-##     cp FILE > ~/.{{name}}.completion
-##     echo "source ~/.{{name}}.completion" >> ~/.bashrc
-##
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/lib/dashdash.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/lib/dashdash.js
deleted file mode 100644
index adb6f13b158420a78354911535304f5cae25aaf1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/lib/dashdash.js
+++ /dev/null
@@ -1,1055 +0,0 @@
-/**
- * dashdash - A light, featureful and explicit option parsing library for
- * node.js.
- */
-// vim: set ts=4 sts=4 sw=4 et:
-
-var assert = require('assert-plus');
-var format = require('util').format;
-var fs = require('fs');
-var path = require('path');
-
-
-var DEBUG = true;
-if (DEBUG) {
-    var debug = console.warn;
-} else {
-    var debug = function () {};
-}
-
-
-
-// ---- internal support stuff
-
-// Replace {{variable}} in `s` with the template data in `d`.
-function renderTemplate(s, d) {
-    return s.replace(/{{([a-zA-Z]+)}}/g, function (match, key) {
-        return d.hasOwnProperty(key) ? d[key] : match;
-    });
-}
-
-/**
- * Return a shallow copy of the given object;
- */
-function shallowCopy(obj) {
-    if (!obj) {
-        return (obj);
-    }
-    var copy = {};
-    Object.keys(obj).forEach(function (k) {
-        copy[k] = obj[k];
-    });
-    return (copy);
-}
-
-
-function space(n) {
-    var s = '';
-    for (var i = 0; i < n; i++) {
-        s += ' ';
-    }
-    return s;
-}
-
-
-function makeIndent(arg, deflen, name) {
-    if (arg === null || arg === undefined)
-        return space(deflen);
-    else if (typeof (arg) === 'number')
-        return space(arg);
-    else if (typeof (arg) === 'string')
-        return arg;
-    else
-        assert.fail('invalid "' + name + '": not a string or number: ' + arg);
-}
-
-
-/**
- * Return an array of lines wrapping the given text to the given width.
- * This splits on whitespace. Single tokens longer than `width` are not
- * broken up.
- */
-function textwrap(s, width) {
-    var words = s.trim().split(/\s+/);
-    var lines = [];
-    var line = '';
-    words.forEach(function (w) {
-        var newLength = line.length + w.length;
-        if (line.length > 0)
-            newLength += 1;
-        if (newLength > width) {
-            lines.push(line);
-            line = '';
-        }
-        if (line.length > 0)
-            line += ' ';
-        line += w;
-    });
-    lines.push(line);
-    return lines;
-}
-
-
-/**
- * Transform an option name to a "key" that is used as the field
- * on the `opts` object returned from `<parser>.parse()`.
- *
- * Transformations:
- * - '-' -> '_': This allow one to use hyphen in option names (common)
- *   but not have to do silly things like `opt["dry-run"]` to access the
- *   parsed results.
- */
-function optionKeyFromName(name) {
-    return name.replace(/-/g, '_');
-}
-
-
-
-// ---- Option types
-
-function parseBool(option, optstr, arg) {
-    return Boolean(arg);
-}
-
-function parseString(option, optstr, arg) {
-    assert.string(arg, 'arg');
-    return arg;
-}
-
-function parseNumber(option, optstr, arg) {
-    assert.string(arg, 'arg');
-    var num = Number(arg);
-    if (isNaN(num)) {
-        throw new Error(format('arg for "%s" is not a number: "%s"',
-            optstr, arg));
-    }
-    return num;
-}
-
-function parseInteger(option, optstr, arg) {
-    assert.string(arg, 'arg');
-    var num = Number(arg);
-    if (!/^[0-9-]+$/.test(arg) || isNaN(num)) {
-        throw new Error(format('arg for "%s" is not an integer: "%s"',
-            optstr, arg));
-    }
-    return num;
-}
-
-function parsePositiveInteger(option, optstr, arg) {
-    assert.string(arg, 'arg');
-    var num = Number(arg);
-    if (!/^[0-9]+$/.test(arg) || isNaN(num) || num === 0) {
-        throw new Error(format('arg for "%s" is not a positive integer: "%s"',
-            optstr, arg));
-    }
-    return num;
-}
-
-/**
- * Supported date args:
- * - epoch second times (e.g. 1396031701)
- * - ISO 8601 format: YYYY-MM-DD[THH:MM:SS[.sss][Z]]
- *      2014-03-28T18:35:01.489Z
- *      2014-03-28T18:35:01.489
- *      2014-03-28T18:35:01Z
- *      2014-03-28T18:35:01
- *      2014-03-28
- */
-function parseDate(option, optstr, arg) {
-    assert.string(arg, 'arg');
-    var date;
-    if (/^\d+$/.test(arg)) {
-        // epoch seconds
-        date = new Date(Number(arg) * 1000);
-    /* JSSTYLED */
-    } else if (/^\d{4}-\d{2}-\d{2}(T\d{2}:\d{2}:\d{2}(\.\d+)?Z?)?$/i.test(arg)) {
-        // ISO 8601 format
-        date = new Date(arg);
-    } else {
-        throw new Error(format('arg for "%s" is not a valid date format: "%s"',
-            optstr, arg));
-    }
-    if (date.toString() === 'Invalid Date') {
-        throw new Error(format('arg for "%s" is an invalid date: "%s"',
-            optstr, arg));
-    }
-    return date;
-}
-
-var optionTypes = {
-    bool: {
-        takesArg: false,
-        parseArg: parseBool
-    },
-    string: {
-        takesArg: true,
-        helpArg: 'ARG',
-        parseArg: parseString
-    },
-    number: {
-        takesArg: true,
-        helpArg: 'NUM',
-        parseArg: parseNumber
-    },
-    integer: {
-        takesArg: true,
-        helpArg: 'INT',
-        parseArg: parseInteger
-    },
-    positiveInteger: {
-        takesArg: true,
-        helpArg: 'INT',
-        parseArg: parsePositiveInteger
-    },
-    date: {
-        takesArg: true,
-        helpArg: 'DATE',
-        parseArg: parseDate
-    },
-    arrayOfBool: {
-        takesArg: false,
-        array: true,
-        parseArg: parseBool
-    },
-    arrayOfString: {
-        takesArg: true,
-        helpArg: 'ARG',
-        array: true,
-        parseArg: parseString
-    },
-    arrayOfNumber: {
-        takesArg: true,
-        helpArg: 'NUM',
-        array: true,
-        parseArg: parseNumber
-    },
-    arrayOfInteger: {
-        takesArg: true,
-        helpArg: 'INT',
-        array: true,
-        parseArg: parseInteger
-    },
-    arrayOfPositiveInteger: {
-        takesArg: true,
-        helpArg: 'INT',
-        array: true,
-        parseArg: parsePositiveInteger
-    },
-    arrayOfDate: {
-        takesArg: true,
-        helpArg: 'INT',
-        array: true,
-        parseArg: parseDate
-    },
-};
-
-
-
-// ---- Parser
-
-/**
- * Parser constructor.
- *
- * @param config {Object} The parser configuration
- *      - options {Array} Array of option specs. See the README for how to
- *        specify each option spec.
- *      - allowUnknown {Boolean} Default false. Whether to throw on unknown
- *        options. If false, then unknown args are included in the _args array.
- *      - interspersed {Boolean} Default true. Whether to allow interspersed
- *        arguments (non-options) and options. E.g.:
- *              node tool.js arg1 arg2 -v
- *        '-v' is after some args here. If `interspersed: false` then '-v'
- *        would not be parsed out. Note that regardless of `interspersed`
- *        the presence of '--' will stop option parsing, as all good
- *        option parsers should.
- */
-function Parser(config) {
-    assert.object(config, 'config');
-    assert.arrayOfObject(config.options, 'config.options');
-    assert.optionalBool(config.interspersed, 'config.interspersed');
-    var self = this;
-
-    // Allow interspersed arguments (true by default).
-    this.interspersed = (config.interspersed !== undefined
-        ? config.interspersed : true);
-
-    // Don't allow unknown flags (true by default).
-    this.allowUnknown = (config.allowUnknown !== undefined
-        ? config.allowUnknown : false);
-
-    this.options = config.options.map(function (o) { return shallowCopy(o); });
-    this.optionFromName = {};
-    this.optionFromEnv = {};
-    for (var i = 0; i < this.options.length; i++) {
-        var o = this.options[i];
-        if (o.group !== undefined && o.group !== null) {
-            assert.optionalString(o.group,
-                format('config.options.%d.group', i));
-            continue;
-        }
-        assert.ok(optionTypes[o.type],
-            format('invalid config.options.%d.type: "%s" in %j',
-                   i, o.type, o));
-        assert.optionalString(o.name, format('config.options.%d.name', i));
-        assert.optionalArrayOfString(o.names,
-            format('config.options.%d.names', i));
-        assert.ok((o.name || o.names) && !(o.name && o.names),
-            format('exactly one of "name" or "names" required: %j', o));
-        assert.optionalString(o.help, format('config.options.%d.help', i));
-        var env = o.env || [];
-        if (typeof (env) === 'string') {
-            env = [env];
-        }
-        assert.optionalArrayOfString(env, format('config.options.%d.env', i));
-        assert.optionalString(o.helpGroup,
-            format('config.options.%d.helpGroup', i));
-        assert.optionalBool(o.helpWrap,
-            format('config.options.%d.helpWrap', i));
-        assert.optionalBool(o.hidden, format('config.options.%d.hidden', i));
-
-        if (o.name) {
-            o.names = [o.name];
-        } else {
-            assert.string(o.names[0],
-                format('config.options.%d.names is empty', i));
-        }
-        o.key = optionKeyFromName(o.names[0]);
-        o.names.forEach(function (n) {
-            if (self.optionFromName[n]) {
-                throw new Error(format(
-                    'option name collision: "%s" used in %j and %j',
-                    n, self.optionFromName[n], o));
-            }
-            self.optionFromName[n] = o;
-        });
-        env.forEach(function (n) {
-            if (self.optionFromEnv[n]) {
-                throw new Error(format(
-                    'option env collision: "%s" used in %j and %j',
-                    n, self.optionFromEnv[n], o));
-            }
-            self.optionFromEnv[n] = o;
-        });
-    }
-}
-
-Parser.prototype.optionTakesArg = function optionTakesArg(option) {
-    return optionTypes[option.type].takesArg;
-};
-
-/**
- * Parse options from the given argv.
- *
- * @param inputs {Object} Optional.
- *      - argv {Array} Optional. The argv to parse. Defaults to
- *        `process.argv`.
- *      - slice {Number} The index into argv at which options/args begin.
- *        Default is 2, as appropriate for `process.argv`.
- *      - env {Object} Optional. The env to use for 'env' entries in the
- *        option specs. Defaults to `process.env`.
- * @returns {Object} Parsed `opts`. It has special keys `_args` (the
- *      remaining args from `argv`) and `_order` (gives the order that
- *      options were specified).
- */
-Parser.prototype.parse = function parse(inputs) {
-    var self = this;
-
-    // Old API was `parse([argv, [slice]])`
-    if (Array.isArray(arguments[0])) {
-        inputs = {argv: arguments[0], slice: arguments[1]};
-    }
-
-    assert.optionalObject(inputs, 'inputs');
-    if (!inputs) {
-        inputs = {};
-    }
-    assert.optionalArrayOfString(inputs.argv, 'inputs.argv');
-    //assert.optionalNumber(slice, 'slice');
-    var argv = inputs.argv || process.argv;
-    var slice = inputs.slice !== undefined ? inputs.slice : 2;
-    var args = argv.slice(slice);
-    var env = inputs.env || process.env;
-    var opts = {};
-    var _order = [];
-
-    function addOpt(option, optstr, key, val, from) {
-        var type = optionTypes[option.type];
-        var parsedVal = type.parseArg(option, optstr, val);
-        if (type.array) {
-            if (!opts[key]) {
-                opts[key] = [];
-            }
-            if (type.arrayFlatten && Array.isArray(parsedVal)) {
-                for (var i = 0; i < parsedVal.length; i++) {
-                    opts[key].push(parsedVal[i]);
-                }
-            } else {
-                opts[key].push(parsedVal);
-            }
-        } else {
-            opts[key] = parsedVal;
-        }
-        var item = { key: key, value: parsedVal, from: from };
-        _order.push(item);
-    }
-
-    // Parse args.
-    var _args = [];
-    var i = 0;
-    outer: while (i < args.length) {
-        var arg = args[i];
-
-        // End of options marker.
-        if (arg === '--') {
-            i++;
-            break;
-
-        // Long option
-        } else if (arg.slice(0, 2) === '--') {
-            var name = arg.slice(2);
-            var val = null;
-            var idx = name.indexOf('=');
-            if (idx !== -1) {
-                val = name.slice(idx + 1);
-                name = name.slice(0, idx);
-            }
-            var option = this.optionFromName[name];
-            if (!option) {
-                if (!this.allowUnknown)
-                    throw new Error(format('unknown option: "--%s"', name));
-                else if (this.interspersed)
-                    _args.push(arg);
-                else
-                    break outer;
-            } else {
-                var takesArg = this.optionTakesArg(option);
-                if (val !== null && !takesArg) {
-                    throw new Error(format('argument given to "--%s" option '
-                        + 'that does not take one: "%s"', name, arg));
-                }
-                if (!takesArg) {
-                    addOpt(option, '--'+name, option.key, true, 'argv');
-                } else if (val !== null) {
-                    addOpt(option, '--'+name, option.key, val, 'argv');
-                } else if (i + 1 >= args.length) {
-                    throw new Error(format('do not have enough args for "--%s" '
-                        + 'option', name));
-                } else {
-                    addOpt(option, '--'+name, option.key, args[i + 1], 'argv');
-                    i++;
-                }
-            }
-
-        // Short option
-        } else if (arg[0] === '-' && arg.length > 1) {
-            var j = 1;
-            var allFound = true;
-            while (j < arg.length) {
-                var name = arg[j];
-                var option = this.optionFromName[name];
-                if (!option) {
-                    allFound = false;
-                    if (this.allowUnknown) {
-                        if (this.interspersed) {
-                            _args.push(arg);
-                            break;
-                        } else
-                            break outer;
-                    } else if (arg.length > 2) {
-                        throw new Error(format(
-                            'unknown option: "-%s" in "%s" group',
-                            name, arg));
-                    } else {
-                        throw new Error(format('unknown option: "-%s"', name));
-                    }
-                } else if (this.optionTakesArg(option)) {
-                    break;
-                }
-                j++;
-            }
-
-            j = 1;
-            while (allFound && j < arg.length) {
-                var name = arg[j];
-                var val = arg.slice(j + 1);  // option val if it takes an arg
-                var option = this.optionFromName[name];
-                var takesArg = this.optionTakesArg(option);
-                if (!takesArg) {
-                    addOpt(option, '-'+name, option.key, true, 'argv');
-                } else if (val) {
-                    addOpt(option, '-'+name, option.key, val, 'argv');
-                    break;
-                } else {
-                    if (i + 1 >= args.length) {
-                        throw new Error(format('do not have enough args '
-                            + 'for "-%s" option', name));
-                    }
-                    addOpt(option, '-'+name, option.key, args[i + 1], 'argv');
-                    i++;
-                    break;
-                }
-                j++;
-            }
-
-        // An interspersed arg
-        } else if (this.interspersed) {
-            _args.push(arg);
-
-        // An arg and interspersed args are not allowed, so done options.
-        } else {
-            break outer;
-        }
-        i++;
-    }
-    _args = _args.concat(args.slice(i));
-
-    // Parse environment.
-    Object.keys(this.optionFromEnv).forEach(function (envname) {
-        var val = env[envname];
-        if (val === undefined)
-            return;
-        var option = self.optionFromEnv[envname];
-        if (opts[option.key] !== undefined)
-            return;
-        var takesArg = self.optionTakesArg(option);
-        if (takesArg) {
-            addOpt(option, envname, option.key, val, 'env');
-        } else if (val !== '') {
-            // Boolean envvar handling:
-            // - VAR=<empty-string>     not set (as if the VAR was not set)
-            // - VAR=0                  false
-            // - anything else          true
-            addOpt(option, envname, option.key, (val !== '0'), 'env');
-        }
-    });
-
-    // Apply default values.
-    this.options.forEach(function (o) {
-        if (opts[o.key] === undefined) {
-            if (o.default !== undefined) {
-                opts[o.key] = o.default;
-            } else if (o.type && optionTypes[o.type].default !== undefined) {
-                opts[o.key] = optionTypes[o.type].default;
-            }
-        }
-    });
-
-    opts._order = _order;
-    opts._args = _args;
-    return opts;
-};
-
-
-/**
- * Return help output for the current options.
- *
- * E.g.: if the current options are:
- *      [{names: ['help', 'h'], type: 'bool', help: 'Show help and exit.'}]
- * then this would return:
- *      '  -h, --help     Show help and exit.\n'
- *
- * @param config {Object} Config for controlling the option help output.
- *      - indent {Number|String} Default 4. An indent/prefix to use for
- *        each option line.
- *      - nameSort {String} Default is 'length'. By default the names are
- *        sorted to put the short opts first (i.e. '-h, --help' preferred
- *        to '--help, -h'). Set to 'none' to not do this sorting.
- *      - maxCol {Number} Default 80. Note that long tokens in a help string
- *        can go past this.
- *      - helpCol {Number} Set to specify a specific column at which
- *        option help will be aligned. By default this is determined
- *        automatically.
- *      - minHelpCol {Number} Default 20.
- *      - maxHelpCol {Number} Default 40.
- *      - includeEnv {Boolean} Default false. If true, a note stating the `env`
- *        envvar (if specified for this option) will be appended to the help
- *        output.
- *      - includeDefault {Boolean} Default false. If true, a note stating
- *        the `default` for this option, if any, will be appended to the help
- *        output.
- *      - helpWrap {Boolean} Default true. Wrap help text in helpCol..maxCol
- *        bounds.
- * @returns {String}
- */
-Parser.prototype.help = function help(config) {
-    config = config || {};
-    assert.object(config, 'config');
-
-    var indent = makeIndent(config.indent, 4, 'config.indent');
-    var headingIndent = makeIndent(config.headingIndent,
-        Math.round(indent.length / 2), 'config.headingIndent');
-
-    assert.optionalString(config.nameSort, 'config.nameSort');
-    var nameSort = config.nameSort || 'length';
-    assert.ok(~['length', 'none'].indexOf(nameSort),
-        'invalid "config.nameSort"');
-    assert.optionalNumber(config.maxCol, 'config.maxCol');
-    assert.optionalNumber(config.maxHelpCol, 'config.maxHelpCol');
-    assert.optionalNumber(config.minHelpCol, 'config.minHelpCol');
-    assert.optionalNumber(config.helpCol, 'config.helpCol');
-    assert.optionalBool(config.includeEnv, 'config.includeEnv');
-    assert.optionalBool(config.includeDefault, 'config.includeDefault');
-    assert.optionalBool(config.helpWrap, 'config.helpWrap');
-    var maxCol = config.maxCol || 80;
-    var minHelpCol = config.minHelpCol || 20;
-    var maxHelpCol = config.maxHelpCol || 40;
-
-    var lines = [];
-    var maxWidth = 0;
-    this.options.forEach(function (o) {
-        if (o.hidden) {
-            return;
-        }
-        if (o.group !== undefined && o.group !== null) {
-            // We deal with groups in the next pass
-            lines.push(null);
-            return;
-        }
-        var type = optionTypes[o.type];
-        var arg = o.helpArg || type.helpArg || 'ARG';
-        var line = '';
-        var names = o.names.slice();
-        if (nameSort === 'length') {
-            names.sort(function (a, b) {
-                if (a.length < b.length)
-                    return -1;
-                else if (b.length < a.length)
-                    return 1;
-                else
-                    return 0;
-            })
-        }
-        names.forEach(function (name, i) {
-            if (i > 0)
-                line += ', ';
-            if (name.length === 1) {
-                line += '-' + name
-                if (type.takesArg)
-                    line += ' ' + arg;
-            } else {
-                line += '--' + name
-                if (type.takesArg)
-                    line += '=' + arg;
-            }
-        });
-        maxWidth = Math.max(maxWidth, line.length);
-        lines.push(line);
-    });
-
-    // Add help strings.
-    var helpCol = config.helpCol;
-    if (!helpCol) {
-        helpCol = maxWidth + indent.length + 2;
-        helpCol = Math.min(Math.max(helpCol, minHelpCol), maxHelpCol);
-    }
-    var i = -1;
-    this.options.forEach(function (o) {
-        if (o.hidden) {
-            return;
-        }
-        i++;
-
-        if (o.group !== undefined && o.group !== null) {
-            if (o.group === '') {
-                // Support a empty string "group" to have a blank line between
-                // sets of options.
-                lines[i] = '';
-            } else {
-                // Render the group heading with the heading-specific indent.
-                lines[i] = (i === 0 ? '' : '\n') + headingIndent +
-                    o.group + ':';
-            }
-            return;
-        }
-
-        var helpDefault;
-        if (config.includeDefault) {
-            if (o.default !== undefined) {
-                helpDefault = format('Default: %j', o.default);
-            } else if (o.type && optionTypes[o.type].default !== undefined) {
-                helpDefault = format('Default: %j',
-                    optionTypes[o.type].default);
-            }
-        }
-
-        var line = lines[i] = indent + lines[i];
-        if (!o.help && !(config.includeEnv && o.env) && !helpDefault) {
-            return;
-        }
-        var n = helpCol - line.length;
-        if (n >= 0) {
-            line += space(n);
-        } else {
-            line += '\n' + space(helpCol);
-        }
-
-        var helpEnv = '';
-        if (o.env && o.env.length && config.includeEnv) {
-            helpEnv += 'Environment: ';
-            var type = optionTypes[o.type];
-            var arg = o.helpArg || type.helpArg || 'ARG';
-            var envs = (Array.isArray(o.env) ? o.env : [o.env]).map(
-                function (e) {
-                    if (type.takesArg) {
-                        return e + '=' + arg;
-                    } else {
-                        return e + '=1';
-                    }
-                }
-            );
-            helpEnv += envs.join(', ');
-        }
-        var help = (o.help || '').trim();
-        if (o.helpWrap !== false && config.helpWrap !== false) {
-            // Wrap help description normally.
-            if (help.length && !~'.!?"\''.indexOf(help.slice(-1))) {
-                help += '.';
-            }
-            if (help.length) {
-                help += ' ';
-            }
-            help += helpEnv;
-            if (helpDefault) {
-                if (helpEnv) {
-                    help += '. ';
-                }
-                help += helpDefault;
-            }
-            line += textwrap(help, maxCol - helpCol).join(
-                '\n' + space(helpCol));
-        } else {
-            // Do not wrap help description, but indent newlines appropriately.
-            var helpLines = help.split('\n').filter(
-                    function (ln) { return ln.length });
-            if (helpEnv !== '') {
-                helpLines.push(helpEnv);
-            }
-            if (helpDefault) {
-                helpLines.push(helpDefault);
-            }
-            line += helpLines.join('\n' + space(helpCol));
-        }
-
-        lines[i] = line;
-    });
-
-    var rv = '';
-    if (lines.length > 0) {
-        rv = lines.join('\n') + '\n';
-    }
-    return rv;
-};
-
-
-/**
- * Return a string suitable for a Bash completion file for this tool.
- *
- * @param args.name {String} The tool name.
- * @param args.specExtra {String} Optional. Extra Bash code content to add
- *      to the end of the "spec". Typically this is used to append Bash
- *      "complete_TYPE" functions for custom option types. See
- *      "examples/ddcompletion.js" for an example.
- * @param args.argtypes {Array} Optional. Array of completion types for
- *      positional args (i.e. non-options). E.g.
- *          argtypes = ['fruit', 'veggie', 'file']
- *      will result in completion of fruits for the first arg, veggies for the
- *      second, and filenames for the third and subsequent positional args.
- *      If not given, positional args will use Bash's 'default' completion.
- *      See `specExtra` for providing Bash `complete_TYPE` functions, e.g.
- *      `complete_fruit` and `complete_veggie` in this example.
- */
-Parser.prototype.bashCompletion = function bashCompletion(args) {
-    assert.object(args, 'args');
-    assert.string(args.name, 'args.name');
-    assert.optionalString(args.specExtra, 'args.specExtra');
-    assert.optionalArrayOfString(args.argtypes, 'args.argtypes');
-
-    return bashCompletionFromOptions({
-        name: args.name,
-        specExtra: args.specExtra,
-        argtypes: args.argtypes,
-        options: this.options
-    });
-};
-
-
-// ---- Bash completion
-
-const BASH_COMPLETION_TEMPLATE_PATH = path.join(
-    __dirname, '../etc/dashdash.bash_completion.in');
-
-/**
- * Return the Bash completion "spec" (the string value for the "{{spec}}"
- * var in the "dashdash.bash_completion.in" template) for this tool.
- *
- * The "spec" is Bash code that defines the CLI options and subcmds for
- * the template's completion code. It looks something like this:
- *
- *      local cmd_shortopts="-J ..."
- *      local cmd_longopts="--help ..."
- *      local cmd_optargs="-p=tritonprofile ..."
- *
- * @param args.options {Array} The array of dashdash option specs.
- * @param args.context {String} Optional. A context string for the "local cmd*"
- *      vars in the spec. By default it is the empty string. When used to
- *      scope for completion on a *sub-command* (e.g. for "git log" on a "git"
- *      tool), then it would have a value (e.g. "__log"). See
- *      <http://github.com/trentm/node-cmdln> Bash completion for details.
- * @param opts.includeHidden {Boolean} Optional. Default false. By default
- *      hidden options and subcmds are "excluded". Here excluded means they
- *      won't be offered as a completion, but if used, their argument type
- *      will be completed. "Hidden" options and subcmds are ones with the
- *      `hidden: true` attribute to exclude them from default help output.
- * @param args.argtypes {Array} Optional. Array of completion types for
- *      positional args (i.e. non-options). E.g.
- *          argtypes = ['fruit', 'veggie', 'file']
- *      will result in completion of fruits for the first arg, veggies for the
- *      second, and filenames for the third and subsequent positional args.
- *      If not given, positional args will use Bash's 'default' completion.
- *      See `specExtra` for providing Bash `complete_TYPE` functions, e.g.
- *      `complete_fruit` and `complete_veggie` in this example.
- */
-function bashCompletionSpecFromOptions(args) {
-    assert.object(args, 'args');
-    assert.object(args.options, 'args.options');
-    assert.optionalString(args.context, 'args.context');
-    assert.optionalBool(args.includeHidden, 'args.includeHidden');
-    assert.optionalArrayOfString(args.argtypes, 'args.argtypes');
-
-    var context = args.context || '';
-    var includeHidden = (args.includeHidden === undefined
-        ? false : args.includeHidden);
-
-    var spec = [];
-    var shortopts = [];
-    var longopts = [];
-    var optargs = [];
-    (args.options || []).forEach(function (o) {
-        if (o.group !== undefined && o.group !== null) {
-            // Skip group headers.
-            return;
-        }
-
-        var optNames = o.names || [o.name];
-        var optType = getOptionType(o.type);
-        if (optType.takesArg) {
-            var completionType = o.completionType ||
-                optType.completionType || o.type;
-            optNames.forEach(function (optName) {
-                if (optName.length === 1) {
-                    if (includeHidden || !o.hidden) {
-                        shortopts.push('-' + optName);
-                    }
-                    // Include even hidden options in `optargs` so that bash
-                    // completion of its arg still works.
-                    optargs.push('-' + optName + '=' + completionType);
-                } else {
-                    if (includeHidden || !o.hidden) {
-                        longopts.push('--' + optName);
-                    }
-                    optargs.push('--' + optName + '=' + completionType);
-                }
-            });
-        } else {
-            optNames.forEach(function (optName) {
-                if (includeHidden || !o.hidden) {
-                    if (optName.length === 1) {
-                        shortopts.push('-' + optName);
-                    } else {
-                        longopts.push('--' + optName);
-                    }
-                }
-            });
-        }
-    });
-
-    spec.push(format('local cmd%s_shortopts="%s"',
-        context, shortopts.sort().join(' ')));
-    spec.push(format('local cmd%s_longopts="%s"',
-        context, longopts.sort().join(' ')));
-    spec.push(format('local cmd%s_optargs="%s"',
-        context, optargs.sort().join(' ')));
-    if (args.argtypes) {
-        spec.push(format('local cmd%s_argtypes="%s"',
-            context, args.argtypes.join(' ')));
-    }
-    return spec.join('\n');
-}
-
-
-/**
- * Return a string suitable for a Bash completion file for this tool.
- *
- * @param args.name {String} The tool name.
- * @param args.options {Array} The array of dashdash option specs.
- * @param args.specExtra {String} Optional. Extra Bash code content to add
- *      to the end of the "spec". Typically this is used to append Bash
- *      "complete_TYPE" functions for custom option types. See
- *      "examples/ddcompletion.js" for an example.
- * @param args.argtypes {Array} Optional. Array of completion types for
- *      positional args (i.e. non-options). E.g.
- *          argtypes = ['fruit', 'veggie', 'file']
- *      will result in completion of fruits for the first arg, veggies for the
- *      second, and filenames for the third and subsequent positional args.
- *      If not given, positional args will use Bash's 'default' completion.
- *      See `specExtra` for providing Bash `complete_TYPE` functions, e.g.
- *      `complete_fruit` and `complete_veggie` in this example.
- */
-function bashCompletionFromOptions(args) {
-    assert.object(args, 'args');
-    assert.object(args.options, 'args.options');
-    assert.string(args.name, 'args.name');
-    assert.optionalString(args.specExtra, 'args.specExtra');
-    assert.optionalArrayOfString(args.argtypes, 'args.argtypes');
-
-    // Gather template data.
-    var data = {
-        name: args.name,
-        date: new Date(),
-        spec: bashCompletionSpecFromOptions({
-            options: args.options,
-            argtypes: args.argtypes
-        }),
-    };
-    if (args.specExtra) {
-        data.spec += '\n\n' + args.specExtra;
-    }
-
-    // Render template.
-    var template = fs.readFileSync(BASH_COMPLETION_TEMPLATE_PATH, 'utf8');
-    return renderTemplate(template, data);
-}
-
-
-
-// ---- exports
-
-function createParser(config) {
-    return new Parser(config);
-}
-
-/**
- * Parse argv with the given options.
- *
- * @param config {Object} A merge of all the available fields from
- *      `dashdash.Parser` and `dashdash.Parser.parse`: options, interspersed,
- *      argv, env, slice.
- */
-function parse(config) {
-    assert.object(config, 'config');
-    assert.optionalArrayOfString(config.argv, 'config.argv');
-    assert.optionalObject(config.env, 'config.env');
-    var config = shallowCopy(config);
-    var argv = config.argv;
-    delete config.argv;
-    var env = config.env;
-    delete config.env;
-
-    var parser = new Parser(config);
-    return parser.parse({argv: argv, env: env});
-}
-
-
-/**
- * Add a new option type.
- *
- * @params optionType {Object}:
- *      - name {String} Required.
- *      - takesArg {Boolean} Required. Whether this type of option takes an
- *        argument on process.argv. Typically this is true for all but the
- *        "bool" type.
- *      - helpArg {String} Required iff `takesArg === true`. The string to
- *        show in generated help for options of this type.
- *      - parseArg {Function} Require. `function (option, optstr, arg)` parser
- *        that takes a string argument and returns an instance of the
- *        appropriate type, or throws an error if the arg is invalid.
- *      - array {Boolean} Optional. Set to true if this is an 'arrayOf' type
- *        that collects multiple usages of the option in process.argv and
- *        puts results in an array.
- *      - arrayFlatten {Boolean} Optional. XXX
- *      - default Optional. Default value for options of this type, if no
- *        default is specified in the option type usage.
- */
-function addOptionType(optionType) {
-    assert.object(optionType, 'optionType');
-    assert.string(optionType.name, 'optionType.name');
-    assert.bool(optionType.takesArg, 'optionType.takesArg');
-    if (optionType.takesArg) {
-        assert.string(optionType.helpArg, 'optionType.helpArg');
-    }
-    assert.func(optionType.parseArg, 'optionType.parseArg');
-    assert.optionalBool(optionType.array, 'optionType.array');
-    assert.optionalBool(optionType.arrayFlatten, 'optionType.arrayFlatten');
-
-    optionTypes[optionType.name] = {
-        takesArg: optionType.takesArg,
-        helpArg: optionType.helpArg,
-        parseArg: optionType.parseArg,
-        array: optionType.array,
-        arrayFlatten: optionType.arrayFlatten,
-        default: optionType.default
-    }
-}
-
-
-function getOptionType(name) {
-    assert.string(name, 'name');
-    return optionTypes[name];
-}
-
-
-/**
- * Return a synopsis string for the given option spec.
- *
- * Examples:
- *      > synopsisFromOpt({names: ['help', 'h'], type: 'bool'});
- *      '[ --help | -h ]'
- *      > synopsisFromOpt({name: 'file', type: 'string', helpArg: 'FILE'});
- *      '[ --file=FILE ]'
- */
-function synopsisFromOpt(o) {
-    assert.object(o, 'o');
-
-    if (o.hasOwnProperty('group')) {
-        return null;
-    }
-    var names = o.names || [o.name];
-    // `type` here could be undefined if, for example, the command has a
-    // dashdash option spec with a bogus 'type'.
-    var type = getOptionType(o.type);
-    var helpArg = o.helpArg || (type && type.helpArg) || 'ARG';
-    var parts = [];
-    names.forEach(function (name) {
-        var part = (name.length === 1 ? '-' : '--') + name;
-        if (type && type.takesArg) {
-            part += (name.length === 1 ? ' ' + helpArg : '=' + helpArg);
-        }
-        parts.push(part);
-    });
-    return ('[ ' + parts.join(' | ') + ' ]');
-};
-
-
-module.exports = {
-    createParser: createParser,
-    Parser: Parser,
-    parse: parse,
-    addOptionType: addOptionType,
-    getOptionType: getOptionType,
-    synopsisFromOpt: synopsisFromOpt,
-
-    // Bash completion-related exports
-    BASH_COMPLETION_TEMPLATE_PATH: BASH_COMPLETION_TEMPLATE_PATH,
-    bashCompletionFromOptions: bashCompletionFromOptions,
-    bashCompletionSpecFromOptions: bashCompletionSpecFromOptions,
-
-    // Export the parseFoo parsers because they might be useful as primitives
-    // for custom option types.
-    parseBool: parseBool,
-    parseString: parseString,
-    parseNumber: parseNumber,
-    parseInteger: parseInteger,
-    parsePositiveInteger: parsePositiveInteger,
-    parseDate: parseDate
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/package.json
deleted file mode 100644
index 093fc5fabadb43e48e1d45db72e0b253e3b71b0a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/dashdash/package.json
+++ /dev/null
@@ -1,98 +0,0 @@
-{
-  "_from": "dashdash@>=1.12.0 <2.0.0",
-  "_id": "dashdash@1.14.0",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/sshpk/dashdash",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/dashdash-1.14.0.tgz_1464847169030_0.07120498712174594"
-  },
-  "_npmUser": {
-    "email": "trentm@gmail.com",
-    "name": "trentm"
-  },
-  "_npmVersion": "1.4.29",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature/sshpk"
-  ],
-  "_resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz",
-  "_shasum": "29e486c5418bf0f356034a993d51686a33e84141",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "trentm@gmail.com",
-    "name": "Trent Mick",
-    "url": "http://trentm.com"
-  },
-  "bugs": {
-    "url": "https://github.com/trentm/node-dashdash/issues"
-  },
-  "contributors": [
-    {
-      "name": "Trent Mick",
-      "email": "trentm@gmail.com",
-      "url": "http://trentm.com"
-    },
-    {
-      "name": "Isaac Schlueter",
-      "url": "https://github.com/isaacs"
-    },
-    {
-      "name": "Joshua M. Clulow",
-      "url": "https://github.com/jclulow"
-    },
-    {
-      "name": "Patrick Mooney",
-      "url": "https://github.com/pfmooney"
-    },
-    {
-      "name": "Dave Pacheco",
-      "url": "https://github.com/davepacheco"
-    }
-  ],
-  "dependencies": {
-    "assert-plus": "^1.0.0"
-  },
-  "description": "A light, featureful and explicit option parsing library.",
-  "devDependencies": {
-    "nodeunit": "0.9.x"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "29e486c5418bf0f356034a993d51686a33e84141",
-    "tarball": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz"
-  },
-  "engines": {
-    "node": ">=0.10"
-  },
-  "gitHead": "2f70d248a509418e4473922ee034faf9cd91b3f8",
-  "homepage": "https://github.com/trentm/node-dashdash",
-  "keywords": [
-    "args",
-    "bash",
-    "cli",
-    "command",
-    "completion",
-    "option",
-    "parser",
-    "parsing"
-  ],
-  "license": "MIT",
-  "main": "./lib/dashdash.js",
-  "maintainers": [
-    {
-      "name": "trentm",
-      "email": "trentm@gmail.com"
-    }
-  ],
-  "name": "dashdash",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/trentm/node-dashdash.git"
-  },
-  "scripts": {
-    "test": "nodeunit test/*.test.js"
-  },
-  "version": "1.14.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/.npmignore
deleted file mode 100644
index a72b52ebe897796e4a289cf95ff6270e04637aad..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/.npmignore
+++ /dev/null
@@ -1,15 +0,0 @@
-lib-cov
-*.seed
-*.log
-*.csv
-*.dat
-*.out
-*.pid
-*.gz
-
-pids
-logs
-results
-
-npm-debug.log
-node_modules
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/LICENSE
deleted file mode 100644
index f668fefc624759ab0bf6f3cfff33187b98524fa9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/LICENSE
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Jeremie Miller
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/README.md
deleted file mode 100644
index b5d0b9de965cdf449481c4c19a6c02b4d5315389..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-ecc-jsbn
-========
-
-ECC package based on [jsbn](https://github.com/andyperlitch/jsbn) from [Tom Wu](http://www-cs-students.stanford.edu/~tjw/).
-
-This is a subset of the same interface as the [node compiled module](https://github.com/quartzjer/ecc), but works in the browser too.
-
-Also uses point compression now from [https://github.com/kaielvin](https://github.com/kaielvin/jsbn-ec-point-compression).
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/index.js
deleted file mode 100644
index 24372810b8bc2500fd0f9255a689bd84010d124b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/index.js
+++ /dev/null
@@ -1,57 +0,0 @@
-var crypto = require("crypto");
-var BigInteger = require("jsbn").BigInteger;
-var ECPointFp = require("./lib/ec.js").ECPointFp;
-exports.ECCurves = require("./lib/sec.js");
-
-// zero prepad
-function unstupid(hex,len)
-{
-	return (hex.length >= len) ? hex : unstupid("0"+hex,len);
-}
-
-exports.ECKey = function(curve, key, isPublic)
-{
-  var priv;
-	var c = curve();
-	var n = c.getN();
-  var bytes = Math.floor(n.bitLength()/8);
-
-  if(key)
-  {
-    if(isPublic)
-    {
-      var curve = c.getCurve();
-//      var x = key.slice(1,bytes+1); // skip the 04 for uncompressed format
-//      var y = key.slice(bytes+1);
-//      this.P = new ECPointFp(curve,
-//        curve.fromBigInteger(new BigInteger(x.toString("hex"), 16)),
-//        curve.fromBigInteger(new BigInteger(y.toString("hex"), 16)));      
-      this.P = curve.decodePointHex(key.toString("hex"));
-    }else{
-      if(key.length != bytes) return false;
-      priv = new BigInteger(key.toString("hex"), 16);      
-    }
-  }else{
-    var n1 = n.subtract(BigInteger.ONE);
-    var r = new BigInteger(crypto.randomBytes(n.bitLength()));
-    priv = r.mod(n1).add(BigInteger.ONE);
-    this.P = c.getG().multiply(priv);
-  }
-  if(this.P)
-  {
-//  var pubhex = unstupid(this.P.getX().toBigInteger().toString(16),bytes*2)+unstupid(this.P.getY().toBigInteger().toString(16),bytes*2);
-//  this.PublicKey = new Buffer("04"+pubhex,"hex");
-    this.PublicKey = new Buffer(c.getCurve().encodeCompressedPointHex(this.P),"hex");
-  }
-  if(priv)
-  {
-    this.PrivateKey = new Buffer(unstupid(priv.toString(16),bytes*2),"hex");
-    this.deriveSharedSecret = function(key)
-    {
-      if(!key || !key.P) return false;
-      var S = key.P.multiply(priv);
-      return new Buffer(unstupid(S.getX().toBigInteger().toString(16),bytes*2),"hex");
-   }     
-  }
-}
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/lib/LICENSE-jsbn b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/lib/LICENSE-jsbn
deleted file mode 100644
index 24502a9cf7483647d0e4e5b35396082b1295d9c3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/lib/LICENSE-jsbn
+++ /dev/null
@@ -1,40 +0,0 @@
-Licensing
----------
-
-This software is covered under the following copyright:
-
-/*
- * Copyright (c) 2003-2005  Tom Wu
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
- *
- * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
- * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
- * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * In addition, the following condition applies:
- *
- * All redistributions must retain an intact copy of this copyright notice
- * and disclaimer.
- */
-
-Address all questions regarding this license to:
-
-  Tom Wu
-  tjw@cs.Stanford.EDU
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/lib/ec.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/lib/ec.js
deleted file mode 100644
index 3852671eca22042c756f5074695830e903e2a48c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/lib/ec.js
+++ /dev/null
@@ -1,561 +0,0 @@
-// Basic Javascript Elliptic Curve implementation
-// Ported loosely from BouncyCastle's Java EC code
-// Only Fp curves implemented for now
-
-// Requires jsbn.js and jsbn2.js
-var BigInteger = require('jsbn').BigInteger
-var Barrett = BigInteger.prototype.Barrett
-
-// ----------------
-// ECFieldElementFp
-
-// constructor
-function ECFieldElementFp(q,x) {
-    this.x = x;
-    // TODO if(x.compareTo(q) >= 0) error
-    this.q = q;
-}
-
-function feFpEquals(other) {
-    if(other == this) return true;
-    return (this.q.equals(other.q) && this.x.equals(other.x));
-}
-
-function feFpToBigInteger() {
-    return this.x;
-}
-
-function feFpNegate() {
-    return new ECFieldElementFp(this.q, this.x.negate().mod(this.q));
-}
-
-function feFpAdd(b) {
-    return new ECFieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q));
-}
-
-function feFpSubtract(b) {
-    return new ECFieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q));
-}
-
-function feFpMultiply(b) {
-    return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q));
-}
-
-function feFpSquare() {
-    return new ECFieldElementFp(this.q, this.x.square().mod(this.q));
-}
-
-function feFpDivide(b) {
-    return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q));
-}
-
-ECFieldElementFp.prototype.equals = feFpEquals;
-ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;
-ECFieldElementFp.prototype.negate = feFpNegate;
-ECFieldElementFp.prototype.add = feFpAdd;
-ECFieldElementFp.prototype.subtract = feFpSubtract;
-ECFieldElementFp.prototype.multiply = feFpMultiply;
-ECFieldElementFp.prototype.square = feFpSquare;
-ECFieldElementFp.prototype.divide = feFpDivide;
-
-// ----------------
-// ECPointFp
-
-// constructor
-function ECPointFp(curve,x,y,z) {
-    this.curve = curve;
-    this.x = x;
-    this.y = y;
-    // Projective coordinates: either zinv == null or z * zinv == 1
-    // z and zinv are just BigIntegers, not fieldElements
-    if(z == null) {
-      this.z = BigInteger.ONE;
-    }
-    else {
-      this.z = z;
-    }
-    this.zinv = null;
-    //TODO: compression flag
-}
-
-function pointFpGetX() {
-    if(this.zinv == null) {
-      this.zinv = this.z.modInverse(this.curve.q);
-    }
-    var r = this.x.toBigInteger().multiply(this.zinv);
-    this.curve.reduce(r);
-    return this.curve.fromBigInteger(r);
-}
-
-function pointFpGetY() {
-    if(this.zinv == null) {
-      this.zinv = this.z.modInverse(this.curve.q);
-    }
-    var r = this.y.toBigInteger().multiply(this.zinv);
-    this.curve.reduce(r);
-    return this.curve.fromBigInteger(r);
-}
-
-function pointFpEquals(other) {
-    if(other == this) return true;
-    if(this.isInfinity()) return other.isInfinity();
-    if(other.isInfinity()) return this.isInfinity();
-    var u, v;
-    // u = Y2 * Z1 - Y1 * Z2
-    u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q);
-    if(!u.equals(BigInteger.ZERO)) return false;
-    // v = X2 * Z1 - X1 * Z2
-    v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q);
-    return v.equals(BigInteger.ZERO);
-}
-
-function pointFpIsInfinity() {
-    if((this.x == null) && (this.y == null)) return true;
-    return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO);
-}
-
-function pointFpNegate() {
-    return new ECPointFp(this.curve, this.x, this.y.negate(), this.z);
-}
-
-function pointFpAdd(b) {
-    if(this.isInfinity()) return b;
-    if(b.isInfinity()) return this;
-
-    // u = Y2 * Z1 - Y1 * Z2
-    var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q);
-    // v = X2 * Z1 - X1 * Z2
-    var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q);
-
-    if(BigInteger.ZERO.equals(v)) {
-        if(BigInteger.ZERO.equals(u)) {
-            return this.twice(); // this == b, so double
-        }
-	return this.curve.getInfinity(); // this = -b, so infinity
-    }
-
-    var THREE = new BigInteger("3");
-    var x1 = this.x.toBigInteger();
-    var y1 = this.y.toBigInteger();
-    var x2 = b.x.toBigInteger();
-    var y2 = b.y.toBigInteger();
-
-    var v2 = v.square();
-    var v3 = v2.multiply(v);
-    var x1v2 = x1.multiply(v2);
-    var zu2 = u.square().multiply(this.z);
-
-    // x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3)
-    var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q);
-    // y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3
-    var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q);
-    // z3 = v^3 * z1 * z2
-    var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.q);
-
-    return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
-}
-
-function pointFpTwice() {
-    if(this.isInfinity()) return this;
-    if(this.y.toBigInteger().signum() == 0) return this.curve.getInfinity();
-
-    // TODO: optimized handling of constants
-    var THREE = new BigInteger("3");
-    var x1 = this.x.toBigInteger();
-    var y1 = this.y.toBigInteger();
-
-    var y1z1 = y1.multiply(this.z);
-    var y1sqz1 = y1z1.multiply(y1).mod(this.curve.q);
-    var a = this.curve.a.toBigInteger();
-
-    // w = 3 * x1^2 + a * z1^2
-    var w = x1.square().multiply(THREE);
-    if(!BigInteger.ZERO.equals(a)) {
-      w = w.add(this.z.square().multiply(a));
-    }
-    w = w.mod(this.curve.q);
-    //this.curve.reduce(w);
-    // x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1)
-    var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q);
-    // y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3
-    var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q);
-    // z3 = 8 * (y1 * z1)^3
-    var z3 = y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q);
-
-    return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);
-}
-
-// Simple NAF (Non-Adjacent Form) multiplication algorithm
-// TODO: modularize the multiplication algorithm
-function pointFpMultiply(k) {
-    if(this.isInfinity()) return this;
-    if(k.signum() == 0) return this.curve.getInfinity();
-
-    var e = k;
-    var h = e.multiply(new BigInteger("3"));
-
-    var neg = this.negate();
-    var R = this;
-
-    var i;
-    for(i = h.bitLength() - 2; i > 0; --i) {
-	R = R.twice();
-
-	var hBit = h.testBit(i);
-	var eBit = e.testBit(i);
-
-	if (hBit != eBit) {
-	    R = R.add(hBit ? this : neg);
-	}
-    }
-
-    return R;
-}
-
-// Compute this*j + x*k (simultaneous multiplication)
-function pointFpMultiplyTwo(j,x,k) {
-  var i;
-  if(j.bitLength() > k.bitLength())
-    i = j.bitLength() - 1;
-  else
-    i = k.bitLength() - 1;
-
-  var R = this.curve.getInfinity();
-  var both = this.add(x);
-  while(i >= 0) {
-    R = R.twice();
-    if(j.testBit(i)) {
-      if(k.testBit(i)) {
-        R = R.add(both);
-      }
-      else {
-        R = R.add(this);
-      }
-    }
-    else {
-      if(k.testBit(i)) {
-        R = R.add(x);
-      }
-    }
-    --i;
-  }
-
-  return R;
-}
-
-ECPointFp.prototype.getX = pointFpGetX;
-ECPointFp.prototype.getY = pointFpGetY;
-ECPointFp.prototype.equals = pointFpEquals;
-ECPointFp.prototype.isInfinity = pointFpIsInfinity;
-ECPointFp.prototype.negate = pointFpNegate;
-ECPointFp.prototype.add = pointFpAdd;
-ECPointFp.prototype.twice = pointFpTwice;
-ECPointFp.prototype.multiply = pointFpMultiply;
-ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;
-
-// ----------------
-// ECCurveFp
-
-// constructor
-function ECCurveFp(q,a,b) {
-    this.q = q;
-    this.a = this.fromBigInteger(a);
-    this.b = this.fromBigInteger(b);
-    this.infinity = new ECPointFp(this, null, null);
-    this.reducer = new Barrett(this.q);
-}
-
-function curveFpGetQ() {
-    return this.q;
-}
-
-function curveFpGetA() {
-    return this.a;
-}
-
-function curveFpGetB() {
-    return this.b;
-}
-
-function curveFpEquals(other) {
-    if(other == this) return true;
-    return(this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b));
-}
-
-function curveFpGetInfinity() {
-    return this.infinity;
-}
-
-function curveFpFromBigInteger(x) {
-    return new ECFieldElementFp(this.q, x);
-}
-
-function curveReduce(x) {
-    this.reducer.reduce(x);
-}
-
-// for now, work with hex strings because they're easier in JS
-function curveFpDecodePointHex(s) {
-    switch(parseInt(s.substr(0,2), 16)) { // first byte
-    case 0:
-	return this.infinity;
-    case 2:
-    case 3:
-	// point compression not supported yet
-	return null;
-    case 4:
-    case 6:
-    case 7:
-	var len = (s.length - 2) / 2;
-	var xHex = s.substr(2, len);
-	var yHex = s.substr(len+2, len);
-
-	return new ECPointFp(this,
-			     this.fromBigInteger(new BigInteger(xHex, 16)),
-			     this.fromBigInteger(new BigInteger(yHex, 16)));
-
-    default: // unsupported
-	return null;
-    }
-}
-
-function curveFpEncodePointHex(p) {
-	if (p.isInfinity()) return "00";
-	var xHex = p.getX().toBigInteger().toString(16);
-	var yHex = p.getY().toBigInteger().toString(16);
-	var oLen = this.getQ().toString(16).length;
-	if ((oLen % 2) != 0) oLen++;
-	while (xHex.length < oLen) {
-		xHex = "0" + xHex;
-	}
-	while (yHex.length < oLen) {
-		yHex = "0" + yHex;
-	}
-	return "04" + xHex + yHex;
-}
-
-ECCurveFp.prototype.getQ = curveFpGetQ;
-ECCurveFp.prototype.getA = curveFpGetA;
-ECCurveFp.prototype.getB = curveFpGetB;
-ECCurveFp.prototype.equals = curveFpEquals;
-ECCurveFp.prototype.getInfinity = curveFpGetInfinity;
-ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;
-ECCurveFp.prototype.reduce = curveReduce;
-//ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex;
-ECCurveFp.prototype.encodePointHex = curveFpEncodePointHex;
-
-// from: https://github.com/kaielvin/jsbn-ec-point-compression
-ECCurveFp.prototype.decodePointHex = function(s)
-{
-	var yIsEven;
-    switch(parseInt(s.substr(0,2), 16)) { // first byte
-    case 0:
-	return this.infinity;
-    case 2:
-	yIsEven = false;
-    case 3:
-	if(yIsEven == undefined) yIsEven = true;
-	var len = s.length - 2;
-	var xHex = s.substr(2, len);
-	var x = this.fromBigInteger(new BigInteger(xHex,16));
-	var alpha = x.multiply(x.square().add(this.getA())).add(this.getB());
-	var beta = alpha.sqrt();
-
-    if (beta == null) throw "Invalid point compression";
-
-    var betaValue = beta.toBigInteger();
-    if (betaValue.testBit(0) != yIsEven)
-    {
-        // Use the other root
-        beta = this.fromBigInteger(this.getQ().subtract(betaValue));
-    }
-    return new ECPointFp(this,x,beta);
-    case 4:
-    case 6:
-    case 7:
-	var len = (s.length - 2) / 2;
-	var xHex = s.substr(2, len);
-	var yHex = s.substr(len+2, len);
-
-	return new ECPointFp(this,
-			     this.fromBigInteger(new BigInteger(xHex, 16)),
-			     this.fromBigInteger(new BigInteger(yHex, 16)));
-
-    default: // unsupported
-	return null;
-    }
-}
-ECCurveFp.prototype.encodeCompressedPointHex = function(p)
-{
-	if (p.isInfinity()) return "00";
-	var xHex = p.getX().toBigInteger().toString(16);
-	var oLen = this.getQ().toString(16).length;
-	if ((oLen % 2) != 0) oLen++;
-	while (xHex.length < oLen)
-		xHex = "0" + xHex;
-	var yPrefix;
-	if(p.getY().toBigInteger().isEven()) yPrefix = "02";
-	else                                 yPrefix = "03";
-
-	return yPrefix + xHex;
-}
-
-
-ECFieldElementFp.prototype.getR = function()
-{
-	if(this.r != undefined) return this.r;
-
-    this.r = null;
-    var bitLength = this.q.bitLength();
-    if (bitLength > 128)
-    {
-        var firstWord = this.q.shiftRight(bitLength - 64);
-        if (firstWord.intValue() == -1)
-        {
-            this.r = BigInteger.ONE.shiftLeft(bitLength).subtract(this.q);
-        }
-    }
-    return this.r;
-}
-ECFieldElementFp.prototype.modMult = function(x1,x2)
-{
-    return this.modReduce(x1.multiply(x2));
-}
-ECFieldElementFp.prototype.modReduce = function(x)
-{
-    if (this.getR() != null)
-    {
-        var qLen = q.bitLength();
-        while (x.bitLength() > (qLen + 1))
-        {
-            var u = x.shiftRight(qLen);
-            var v = x.subtract(u.shiftLeft(qLen));
-            if (!this.getR().equals(BigInteger.ONE))
-            {
-                u = u.multiply(this.getR());
-            }
-            x = u.add(v); 
-        }
-        while (x.compareTo(q) >= 0)
-        {
-            x = x.subtract(q);
-        }
-    }
-    else
-    {
-        x = x.mod(q);
-    }
-    return x;
-}
-ECFieldElementFp.prototype.sqrt = function()
-{
-    if (!this.q.testBit(0)) throw "unsupported";
-
-    // p mod 4 == 3
-    if (this.q.testBit(1))
-    {
-    	var z = new ECFieldElementFp(this.q,this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE),this.q));
-    	return z.square().equals(this) ? z : null;
-    }
-
-    // p mod 4 == 1
-    var qMinusOne = this.q.subtract(BigInteger.ONE);
-
-    var legendreExponent = qMinusOne.shiftRight(1);
-    if (!(this.x.modPow(legendreExponent, this.q).equals(BigInteger.ONE)))
-    {
-        return null;
-    }
-
-    var u = qMinusOne.shiftRight(2);
-    var k = u.shiftLeft(1).add(BigInteger.ONE);
-
-    var Q = this.x;
-    var fourQ = modDouble(modDouble(Q));
-
-    var U, V;
-    do
-    {
-        var P;
-        do
-        {
-            P = new BigInteger(this.q.bitLength(), new SecureRandom());
-        }
-        while (P.compareTo(this.q) >= 0
-            || !(P.multiply(P).subtract(fourQ).modPow(legendreExponent, this.q).equals(qMinusOne)));
-
-        var result = this.lucasSequence(P, Q, k);
-        U = result[0];
-        V = result[1];
-
-        if (this.modMult(V, V).equals(fourQ))
-        {
-            // Integer division by 2, mod q
-            if (V.testBit(0))
-            {
-                V = V.add(q);
-            }
-
-            V = V.shiftRight(1);
-
-            return new ECFieldElementFp(q,V);
-        }
-    }
-    while (U.equals(BigInteger.ONE) || U.equals(qMinusOne));
-
-    return null;
-}
-ECFieldElementFp.prototype.lucasSequence = function(P,Q,k)
-{
-    var n = k.bitLength();
-    var s = k.getLowestSetBit();
-
-    var Uh = BigInteger.ONE;
-    var Vl = BigInteger.TWO;
-    var Vh = P;
-    var Ql = BigInteger.ONE;
-    var Qh = BigInteger.ONE;
-
-    for (var j = n - 1; j >= s + 1; --j)
-    {
-        Ql = this.modMult(Ql, Qh);
-
-        if (k.testBit(j))
-        {
-            Qh = this.modMult(Ql, Q);
-            Uh = this.modMult(Uh, Vh);
-            Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));
-            Vh = this.modReduce(Vh.multiply(Vh).subtract(Qh.shiftLeft(1)));
-        }
-        else
-        {
-            Qh = Ql;
-            Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql));
-            Vh = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));
-            Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1)));
-        }
-    }
-
-    Ql = this.modMult(Ql, Qh);
-    Qh = this.modMult(Ql, Q);
-    Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql));
-    Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));
-    Ql = this.modMult(Ql, Qh);
-
-    for (var j = 1; j <= s; ++j)
-    {
-        Uh = this.modMult(Uh, Vl);
-        Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1)));
-        Ql = this.modMult(Ql, Ql);
-    }
-
-    return [ Uh, Vl ];
-}
-
-var exports = {
-  ECCurveFp: ECCurveFp,
-  ECPointFp: ECPointFp,
-  ECFieldElementFp: ECFieldElementFp
-}
-
-module.exports = exports
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/lib/sec.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/lib/sec.js
deleted file mode 100644
index 5eec8179ff66bd3159f9cacd1964ce9fa40edaac..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/lib/sec.js
+++ /dev/null
@@ -1,170 +0,0 @@
-// Named EC curves
-
-// Requires ec.js, jsbn.js, and jsbn2.js
-var BigInteger = require('jsbn').BigInteger
-var ECCurveFp = require('./ec.js').ECCurveFp
-
-
-// ----------------
-// X9ECParameters
-
-// constructor
-function X9ECParameters(curve,g,n,h) {
-    this.curve = curve;
-    this.g = g;
-    this.n = n;
-    this.h = h;
-}
-
-function x9getCurve() {
-    return this.curve;
-}
-
-function x9getG() {
-    return this.g;
-}
-
-function x9getN() {
-    return this.n;
-}
-
-function x9getH() {
-    return this.h;
-}
-
-X9ECParameters.prototype.getCurve = x9getCurve;
-X9ECParameters.prototype.getG = x9getG;
-X9ECParameters.prototype.getN = x9getN;
-X9ECParameters.prototype.getH = x9getH;
-
-// ----------------
-// SECNamedCurves
-
-function fromHex(s) { return new BigInteger(s, 16); }
-
-function secp128r1() {
-    // p = 2^128 - 2^97 - 1
-    var p = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF");
-    var a = fromHex("FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC");
-    var b = fromHex("E87579C11079F43DD824993C2CEE5ED3");
-    //byte[] S = Hex.decode("000E0D4D696E6768756151750CC03A4473D03679");
-    var n = fromHex("FFFFFFFE0000000075A30D1B9038A115");
-    var h = BigInteger.ONE;
-    var curve = new ECCurveFp(p, a, b);
-    var G = curve.decodePointHex("04"
-                + "161FF7528B899B2D0C28607CA52C5B86"
-		+ "CF5AC8395BAFEB13C02DA292DDED7A83");
-    return new X9ECParameters(curve, G, n, h);
-}
-
-function secp160k1() {
-    // p = 2^160 - 2^32 - 2^14 - 2^12 - 2^9 - 2^8 - 2^7 - 2^3 - 2^2 - 1
-    var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73");
-    var a = BigInteger.ZERO;
-    var b = fromHex("7");
-    //byte[] S = null;
-    var n = fromHex("0100000000000000000001B8FA16DFAB9ACA16B6B3");
-    var h = BigInteger.ONE;
-    var curve = new ECCurveFp(p, a, b);
-    var G = curve.decodePointHex("04"
-                + "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB"
-                + "938CF935318FDCED6BC28286531733C3F03C4FEE");
-    return new X9ECParameters(curve, G, n, h);
-}
-
-function secp160r1() {
-    // p = 2^160 - 2^31 - 1
-    var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF");
-    var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC");
-    var b = fromHex("1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45");
-    //byte[] S = Hex.decode("1053CDE42C14D696E67687561517533BF3F83345");
-    var n = fromHex("0100000000000000000001F4C8F927AED3CA752257");
-    var h = BigInteger.ONE;
-    var curve = new ECCurveFp(p, a, b);
-    var G = curve.decodePointHex("04"
-		+ "4A96B5688EF573284664698968C38BB913CBFC82"
-		+ "23A628553168947D59DCC912042351377AC5FB32");
-    return new X9ECParameters(curve, G, n, h);
-}
-
-function secp192k1() {
-    // p = 2^192 - 2^32 - 2^12 - 2^8 - 2^7 - 2^6 - 2^3 - 1
-    var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37");
-    var a = BigInteger.ZERO;
-    var b = fromHex("3");
-    //byte[] S = null;
-    var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D");
-    var h = BigInteger.ONE;
-    var curve = new ECCurveFp(p, a, b);
-    var G = curve.decodePointHex("04"
-                + "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D"
-                + "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D");
-    return new X9ECParameters(curve, G, n, h);
-}
-
-function secp192r1() {
-    // p = 2^192 - 2^64 - 1
-    var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF");
-    var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC");
-    var b = fromHex("64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1");
-    //byte[] S = Hex.decode("3045AE6FC8422F64ED579528D38120EAE12196D5");
-    var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831");
-    var h = BigInteger.ONE;
-    var curve = new ECCurveFp(p, a, b);
-    var G = curve.decodePointHex("04"
-                + "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012"
-                + "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811");
-    return new X9ECParameters(curve, G, n, h);
-}
-
-function secp224r1() {
-    // p = 2^224 - 2^96 + 1
-    var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001");
-    var a = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE");
-    var b = fromHex("B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4");
-    //byte[] S = Hex.decode("BD71344799D5C7FCDC45B59FA3B9AB8F6A948BC5");
-    var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D");
-    var h = BigInteger.ONE;
-    var curve = new ECCurveFp(p, a, b);
-    var G = curve.decodePointHex("04"
-                + "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21"
-                + "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34");
-    return new X9ECParameters(curve, G, n, h);
-}
-
-function secp256r1() {
-    // p = 2^224 (2^32 - 1) + 2^192 + 2^96 - 1
-    var p = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF");
-    var a = fromHex("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC");
-    var b = fromHex("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B");
-    //byte[] S = Hex.decode("C49D360886E704936A6678E1139D26B7819F7E90");
-    var n = fromHex("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551");
-    var h = BigInteger.ONE;
-    var curve = new ECCurveFp(p, a, b);
-    var G = curve.decodePointHex("04"
-                + "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"
-		+ "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5");
-    return new X9ECParameters(curve, G, n, h);
-}
-
-// TODO: make this into a proper hashtable
-function getSECCurveByName(name) {
-    if(name == "secp128r1") return secp128r1();
-    if(name == "secp160k1") return secp160k1();
-    if(name == "secp160r1") return secp160r1();
-    if(name == "secp192k1") return secp192k1();
-    if(name == "secp192r1") return secp192r1();
-    if(name == "secp224r1") return secp224r1();
-    if(name == "secp256r1") return secp256r1();
-    return null;
-}
-
-module.exports = {
-  "secp128r1":secp128r1,
-  "secp160k1":secp160k1,
-  "secp160r1":secp160r1,
-  "secp192k1":secp192k1,
-  "secp192r1":secp192r1,
-  "secp224r1":secp224r1,
-  "secp256r1":secp256r1
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/package.json
deleted file mode 100644
index 5598bc73b6caf38704b089b1afcced6d2b78d1b1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/package.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "_from": "ecc-jsbn@>=0.1.1 <0.2.0",
-  "_id": "ecc-jsbn@0.1.1",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/sshpk/ecc-jsbn",
-  "_nodeVersion": "0.12.6",
-  "_npmUser": {
-    "email": "jeremie@jabber.org",
-    "name": "quartzjer"
-  },
-  "_npmVersion": "2.11.2",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature/sshpk"
-  ],
-  "_resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
-  "_shasum": "0fc73a9ed5f0d53c38193398523ef7e543777505",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "jeremie@jabber.org",
-    "name": "Jeremie Miller",
-    "url": "http://jeremie.com/"
-  },
-  "bugs": {
-    "url": "https://github.com/quartzjer/ecc-jsbn/issues"
-  },
-  "dependencies": {
-    "jsbn": "~0.1.0"
-  },
-  "description": "ECC JS code based on JSBN",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "0fc73a9ed5f0d53c38193398523ef7e543777505",
-    "tarball": "http://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz"
-  },
-  "gitHead": "d35a360352496721030da645e8054f07efc22487",
-  "homepage": "https://github.com/quartzjer/ecc-jsbn",
-  "keywords": [
-    "browserify",
-    "ecc",
-    "jsbn"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "quartzjer",
-      "email": "jeremie@jabber.org"
-    },
-    {
-      "name": "rynomad",
-      "email": "nomad.ry@gmail.com"
-    }
-  ],
-  "name": "ecc-jsbn",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/quartzjer/ecc-jsbn.git"
-  },
-  "scripts": {},
-  "version": "0.1.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/test.js
deleted file mode 100644
index bd52abfd9d92d7681a90b7546c58d3517e886627..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/ecc-jsbn/test.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var ecc = require("./index.js");
-var key1 = new ecc.ECKey(ecc.ECCurves.secp160r1);
-var key2 = new ecc.ECKey(ecc.ECCurves.secp160r1);
-console.log(key1.deriveSharedSecret(key2));
-var key3 = new ecc.ECKey(ecc.ECCurves.secp160r1,key1.PrivateKey);
-var key4 = new ecc.ECKey(ecc.ECCurves.secp160r1,key2.PublicKey,true);
-console.log(key3.deriveSharedSecret(key4));
-
-var key1 = new ecc.ECKey(ecc.ECCurves.secp256r1);
-var key2 = new ecc.ECKey(ecc.ECCurves.secp256r1);
-console.log(key1.deriveSharedSecret(key2));
-var key3 = new ecc.ECKey(ecc.ECCurves.secp256r1,key1.PrivateKey);
-var key4 = new ecc.ECKey(ecc.ECCurves.secp256r1,key2.PublicKey,true);
-console.log(key3.deriveSharedSecret(key4));
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/.npmignore
deleted file mode 100644
index a4261fc06feaaf4b143bbddee42f3d168b5bc702..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/.npmignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.gitmodules
-deps
-docs
-Makefile
-node_modules
-test
-tools
-coverage
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/.travis.yml
deleted file mode 100644
index d8b5833a71b22c980143e6be23b777e768ed54f6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: node_js
-node_js:
-  - "5.10"
-  - "4.4"
-  - "4.1"
-  - "0.12"
-  - "0.10"
-before_install:
-  - "make check"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/LICENSE
deleted file mode 100644
index f6d947d2f61c41777fb3bbb66334a93122bf5fdc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright Joyent, Inc. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/README.md
deleted file mode 100644
index 6e4a50f63f7f00d0c628f8f80b44e1964c6841e5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/README.md
+++ /dev/null
@@ -1,32 +0,0 @@
-## getpass
-
-Get a password from the terminal. Sounds simple? Sounds like the `readline`
-module should be able to do it? NOPE.
-
-## Install and use it
-
-```bash
-npm install --save getpass
-```
-
-```javascript
-const mod_getpass = require('getpass');
-```
-
-## API
-
-### `mod_getpass.getPass([options, ]callback)`
-
-Gets a password from the terminal. If available, this uses `/dev/tty` to avoid
-interfering with any data being piped in or out of stdio.
-
-This function prints a prompt (by default `Password:`) and then accepts input
-without echoing.
-
-Parameters:
-
- * `options`, an Object, with properties:
-   * `prompt`, an optional String
- * `callback`, a `Func(error, password)`, with arguments:
-   * `error`, either `null` (no error) or an `Error` instance
-   * `password`, a String
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/lib/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/lib/index.js
deleted file mode 100644
index 55a7718c0f7f72c82858d6fb51d3c93e3d517541..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/lib/index.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2016, Joyent, Inc. All rights reserved.
- * Author: Alex Wilson <alex.wilson@joyent.com>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
-*/
-
-module.exports = {
-	getPass: getPass
-};
-
-const mod_tty = require('tty');
-const mod_fs = require('fs');
-const mod_assert = require('assert-plus');
-
-var BACKSPACE = String.fromCharCode(127);
-var CTRLC = '\u0003';
-var CTRLD = '\u0004';
-
-function getPass(opts, cb) {
-	if (typeof (opts) === 'function' && cb === undefined) {
-		cb = opts;
-		opts = {};
-	}
-	mod_assert.object(opts, 'options');
-	mod_assert.func(cb, 'callback');
-
-	mod_assert.optionalString(opts.prompt, 'options.prompt');
-	if (opts.prompt === undefined)
-		opts.prompt = 'Password';
-
-	openTTY(function (err, rfd, wfd, rtty, wtty) {
-		if (err) {
-			cb(err);
-			return;
-		}
-
-		wtty.write(opts.prompt + ':');
-		rtty.resume();
-		rtty.setRawMode(true);
-		rtty.resume();
-		rtty.setEncoding('utf8');
-
-		var pw = '';
-		rtty.on('data', onData);
-
-		function onData(data) {
-			var str = data.toString('utf8');
-			for (var i = 0; i < str.length; ++i) {
-				var ch = str[i];
-				switch (ch) {
-				case '\r':
-				case '\n':
-				case CTRLD:
-					cleanup();
-					cb(null, pw);
-					return;
-				case CTRLC:
-					cleanup();
-					cb(new Error('Aborted'));
-					return;
-				case BACKSPACE:
-					pw = pw.slice(0, pw.length - 1);
-					break;
-				default:
-					pw += ch;
-					break;
-				}
-			}
-		}
-
-		function cleanup() {
-			wtty.write('\r\n');
-			rtty.setRawMode(false);
-			rtty.pause();
-			rtty.removeListener('data', onData);
-			if (wfd !== undefined && wfd !== rfd) {
-				wtty.end();
-				mod_fs.closeSync(wfd);
-			}
-			if (rfd !== undefined) {
-				rtty.end();
-				mod_fs.closeSync(rfd);
-			}
-		}
-	});
-}
-
-function openTTY(cb) {
-	mod_fs.open('/dev/tty', 'r+', function (err, rttyfd) {
-		if ((err && (err.code === 'ENOENT' || err.code === 'EACCES')) ||
-		    (process.version.match(/^v0[.][0-8][.]/))) {
-			cb(null, undefined, undefined, process.stdin,
-			    process.stdout);
-			return;
-		}
-		var rtty = new mod_tty.ReadStream(rttyfd);
-		mod_fs.open('/dev/tty', 'w+', function (err3, wttyfd) {
-			var wtty = new mod_tty.WriteStream(wttyfd);
-			if (err3) {
-				cb(err3);
-				return;
-			}
-			cb(null, rttyfd, wttyfd, rtty, wtty);
-		});
-	});
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/package.json
deleted file mode 100644
index 5241eb285801b543a7f313c4c03b96e5678a6e59..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/getpass/package.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "_from": "getpass@>=0.1.1 <0.2.0",
-  "_id": "getpass@0.1.6",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/sshpk/getpass",
-  "_nodeVersion": "0.12.9",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/getpass-0.1.6.tgz_1461907090215_0.6450737570412457"
-  },
-  "_npmUser": {
-    "email": "alex@cooperi.net",
-    "name": "arekinath"
-  },
-  "_npmVersion": "2.14.9",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature/sshpk"
-  ],
-  "_resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz",
-  "_shasum": "283ffd9fc1256840875311c1b60e8c40187110e6",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "alex.wilson@joyent.com",
-    "name": "Alex Wilson"
-  },
-  "bugs": {
-    "url": "https://github.com/arekinath/node-getpass/issues"
-  },
-  "dependencies": {
-    "assert-plus": "^1.0.0"
-  },
-  "description": "getpass for node.js",
-  "devDependencies": {
-    "json": "^9.0.3",
-    "pty.js": "^0.3.0",
-    "tape": "^4.4.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "283ffd9fc1256840875311c1b60e8c40187110e6",
-    "tarball": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz"
-  },
-  "gitHead": "e7fdf43ad60aa520f894d41856852aa320f36646",
-  "homepage": "https://github.com/arekinath/node-getpass#readme",
-  "license": "MIT",
-  "main": "lib/index.js",
-  "maintainers": [
-    {
-      "name": "arekinath",
-      "email": "alex@cooperi.net"
-    }
-  ],
-  "name": "getpass",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/arekinath/node-getpass.git"
-  },
-  "scripts": {
-    "test": "tape test/*.test.js"
-  },
-  "version": "0.1.6"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/.npmignore
deleted file mode 100644
index 877830c065ce00f9da61376f737d72e6f7ff6e7f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/.npmignore
+++ /dev/null
@@ -1,11 +0,0 @@
-# Editor, IDE and dev environment stuff
-*~
-.project
-.settings
-
-# Build files and directories
-/coverage
-/doc/api
-/build/
-/test/
-/jodid25519-*.tgz
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/.travis.yml
deleted file mode 100644
index 92a990f6797578b242b1b787a264d8ad07e2e75a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-language: node_js
-node_js:
-  - "0.10"
-  - "0.11"
-branches:
-  only:
-    - master
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/AUTHORS.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/AUTHORS.md
deleted file mode 100644
index 0c17097375f41cf6f1836f30ba8b00963110f7ec..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/AUTHORS.md
+++ /dev/null
@@ -1,3 +0,0 @@
-* Michele Bini (original Curve25519 core code: curve25519.js)
-* Ron Garret (original Ed25519 code: fast-djbec.js)
-* Guy Kloss (package refactoring, unit testing)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/LICENSE
deleted file mode 100644
index c722113b2388ec3f0cda374922758d2937dc2377..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2012 Ron Garret
-Copyright (c) 2007, 2013, 2014 Michele Bini
-Copyright (c) 2014 Mega Limited
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/README.md
deleted file mode 100644
index 5335b2dec3674cc7939bcdf1ccb0039fe12a5694..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/README.md
+++ /dev/null
@@ -1,51 +0,0 @@
-Jodid25519 [![Build Status](https://secure.travis-ci.org/meganz/jodid25519.png)](https://travis-ci.org/meganz/jodid25519)
-===================================================================================================================================
-
-Javascript implementation of the Curve25519 and Ed25519 elliptic cryptography functions by Daniel J. Bernstein.
-
-For the API, please consult the generated documentation under doc/ (you can run `make` to generate it).
-
-To run the tests do the following on the console from the project's root directory:
-
-    $ npm install
-    $ make test
-
-
-Contributors
-------------
-
-If you are one of the contributors and want to add yourself or change the information here, please do submit a pull request.   Contributors appear in no particular order.
-
-### For the Curve25519 submodule
-
-* [Graydon Hoare](https://github.com/graydon): suggested clamping the private key by default for increased safety and uniformity with other implementations.
-* [liliakai](https://github.com/liliakai): spotted an unused argument in some of the functions
-* [RyanC](https://github.com/ryancdotorg): removed dependency of a function to the Javascript Math library
-* [Guy Kloss](https://github.com/pohutukawa): performance improvements through bit-shift operations, performance and conformance testing, documentation, compatibility with the npm package ecosystem, and more
-* [Michele Bini](https://github.com/rev22): originally wrote the Javascript implementation
-
-
-Copyright and MIT licensing
----------------------------
-
-* Copyright (c) 2012 Ron Garret
-* Copyright (c) 2007, 2013, 2014 Michele Bini <michele.bini@gmail.com>
-* Copyright (c) 2014 Mega Limited
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/almond.0 b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/almond.0
deleted file mode 100644
index 55ffcc47cee9e298acc61fcdefa4c2b9b952a434..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/almond.0
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Curve 25519-based cryptography collection.
- *
- * EC Diffie-Hellman (ECDH) based on Curve25519 and digital signatures (EdDSA)
- * based on Ed25519.
- *
- * Copyright (c) 2012 Ron Garret
- * Copyright (c) 2007, 2013, 2014 Michele Bini
- * Copyright (c) 2014 Mega Limited
- * under the MIT License.
- *
- * You should have received a copy of the license along with this program.
- */
-// See https://github.com/jrburke/almond#exporting-a-public-api
-(function (root, factory) {
-    if (typeof define === 'function' && define.amd) {
-        // Allow using this built library as an AMD module
-        // in another project. That other project will only
-        // see this AMD call, not the internal modules in
-        // the closure below.
-        define([], factory);
-    } else if (typeof module === 'object' && module.exports) {
-        // Allow using this built library as a CommonJS module
-        module.exports = factory();
-    } else {
-        // Browser globals case. Just assign the
-        // result to a property on the global.
-        root.jodid25519 = factory();
-    }
-}(this, function () {
-    if (typeof module === 'object' && module.exports) {
-        // If we're running under CommonJS, our dependencies get confused and
-        // each clobber module.exports which leads to bad behaviour because
-        // almond does asynchronous loading. So just pretend we're in the
-        // browser globals case, and make them write to those values instead.
-        // TODO: ditch requirejs/almond and use browserify or something.
-        var __oldModule = module;
-        var __oldExports = exports;
-        var window = global;
-        module = undefined;
-        exports = undefined;
-    }
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/almond.1 b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/almond.1
deleted file mode 100644
index cdb5e67283d7b1e858e420d1c5629b340e7d4818..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/almond.1
+++ /dev/null
@@ -1,13 +0,0 @@
-    if (typeof module === 'object' && module.exports) {
-        // Restore CommonJS exports once our dependencies have all finished
-        // loading.
-        module = __oldModule;
-        exports = __oldExports;
-    }
-    // The modules for your project will be inlined above
-    // this snippet. Ask almond to synchronously require the
-    // module value for 'main' here and return it as the
-    // value to use for the public API for the built file.
-    return require('jodid25519');
-}));
-// See https://github.com/jrburke/almond#exporting-a-public-api
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/index.js
deleted file mode 100644
index 870983984b348229b4da470c3b40571bbe402957..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/index.js
+++ /dev/null
@@ -1,35 +0,0 @@
-"use strict";
-
-/*
- * Copyright (c) 2014 Mega Limited
- * under the MIT License.
- * 
- * Authors: Guy K. Kloss
- * 
- * You should have received a copy of the license along with this program.
- */
-
-var dh = require('./lib/dh');
-var eddsa = require('./lib/eddsa');
-var curve255 = require('./lib/curve255');
-var utils = require('./lib/utils');
-    
-    /**
-     * @exports jodid25519
-     * Curve 25519-based cryptography collection.
-     *
-     * @description
-     * EC Diffie-Hellman (ECDH) based on Curve25519 and digital signatures
-     * (EdDSA) based on Ed25519.
-     */
-    var ns = {};
-    
-    /** Module version indicator as string (format: [major.minor.patch]). */
-    ns.VERSION = '0.7.1';
-
-    ns.dh = dh;
-    ns.eddsa = eddsa;
-    ns.curve255 = curve255;
-    ns.utils = utils;
-
-module.exports = ns;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/jsdoc.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/jsdoc.json
deleted file mode 100644
index 21eba9bd66df25638807182f1708f0036f2063a3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/jsdoc.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-	"templates": {
-	    "applicationName": "jodid25519 Library",
-	    "disqus": "",
-	    "googleAnalytics": "",
-	    "openGraph": {
-	        "title": "jodid25519 Library",
-	        "type": "website",
-	        "image": "",
-	        "site_name": "",
-	        "url": ""
-	    },
-	    "meta": {
-	        "title": "jodid25519 Library",
-	        "description": "",
-	        "keyword": ""
-	    }
-	}
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/core.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/core.js
deleted file mode 100644
index f78fd74ddb1b03d884d6be38c641c9ea6fa39028..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/core.js
+++ /dev/null
@@ -1,481 +0,0 @@
-"use strict";
-/**
- * @fileOverview
- * Core operations on curve 25519 required for the higher level modules.
- */
-
-/*
- * Copyright (c) 2007, 2013, 2014 Michele Bini
- * Copyright (c) 2014 Mega Limited
- * under the MIT License.
- *
- * Authors: Guy K. Kloss, Michele Bini
- *
- * You should have received a copy of the license along with this program.
- */
-
-var crypto = require('crypto');
-
-    /**
-     * @exports jodid25519/core
-     * Core operations on curve 25519 required for the higher level modules.
-     *
-     * @description
-     * Core operations on curve 25519 required for the higher level modules.
-     *
-     * <p>
-     * This core code is extracted from Michele Bini's curve255.js implementation,
-     * which is used as a base for Curve25519 ECDH and Ed25519 EdDSA operations.
-     * </p>
-     */
-    var ns = {};
-
-    function _setbit(n, c, v) {
-        var i = c >> 4;
-        var a = n[i];
-        a = a + (1 << (c & 0xf)) * v;
-        n[i] = a;
-    }
-
-    function _getbit(n, c) {
-        return (n[c >> 4] >> (c & 0xf)) & 1;
-    }
-
-    function _ZERO() {
-        return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
-    }
-
-    function _ONE() {
-        return [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
-    }
-
-    // Basepoint.
-    function _BASE() {
-        return [9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
-    }
-
-    // return -1, 0, +1 when a is less than, equal, or greater than b
-    function _bigintcmp(a, b) {
-        // The following code is a bit tricky to avoid code branching
-        var c, abs_r, mask;
-        var r = 0;
-        for (c = 15; c >= 0; c--) {
-            var x = a[c];
-            var y = b[c];
-            r = r + (x - y) * (1 - r * r);
-            // http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs
-            // correct for [-294967295, 294967295]
-            mask = r >> 31;
-            abs_r = (r + mask) ^ mask;
-            // http://stackoverflow.com/questions/596467/how-do-i-convert-a-number-to-an-integer-in-javascript
-            // this rounds towards zero
-            r = ~~((r << 1) / (abs_r + 1));
-        }
-        return r;
-    }
-
-    function _bigintadd(a, b) {
-        var r = [];
-        var v;
-        r[0] = (v = a[0] + b[0]) & 0xffff;
-        r[1] = (v = (v >>> 16) + a[1] + b[1]) & 0xffff;
-        r[2] = (v = (v >>> 16) + a[2] + b[2]) & 0xffff;
-        r[3] = (v = (v >>> 16) + a[3] + b[3]) & 0xffff;
-        r[4] = (v = (v >>> 16) + a[4] + b[4]) & 0xffff;
-        r[5] = (v = (v >>> 16) + a[5] + b[5]) & 0xffff;
-        r[6] = (v = (v >>> 16) + a[6] + b[6]) & 0xffff;
-        r[7] = (v = (v >>> 16) + a[7] + b[7]) & 0xffff;
-        r[8] = (v = (v >>> 16) + a[8] + b[8]) & 0xffff;
-        r[9] = (v = (v >>> 16) + a[9] + b[9]) & 0xffff;
-        r[10] = (v = (v >>> 16) + a[10] + b[10]) & 0xffff;
-        r[11] = (v = (v >>> 16) + a[11] + b[11]) & 0xffff;
-        r[12] = (v = (v >>> 16) + a[12] + b[12]) & 0xffff;
-        r[13] = (v = (v >>> 16) + a[13] + b[13]) & 0xffff;
-        r[14] = (v = (v >>> 16) + a[14] + b[14]) & 0xffff;
-        r[15] = (v >>> 16) + a[15] + b[15];
-        return r;
-    }
-
-    function _bigintsub(a, b) {
-        var r = [];
-        var v;
-        r[0] = (v = 0x80000 + a[0] - b[0]) & 0xffff;
-        r[1] = (v = (v >>> 16) + 0x7fff8 + a[1] - b[1]) & 0xffff;
-        r[2] = (v = (v >>> 16) + 0x7fff8 + a[2] - b[2]) & 0xffff;
-        r[3] = (v = (v >>> 16) + 0x7fff8 + a[3] - b[3]) & 0xffff;
-        r[4] = (v = (v >>> 16) + 0x7fff8 + a[4] - b[4]) & 0xffff;
-        r[5] = (v = (v >>> 16) + 0x7fff8 + a[5] - b[5]) & 0xffff;
-        r[6] = (v = (v >>> 16) + 0x7fff8 + a[6] - b[6]) & 0xffff;
-        r[7] = (v = (v >>> 16) + 0x7fff8 + a[7] - b[7]) & 0xffff;
-        r[8] = (v = (v >>> 16) + 0x7fff8 + a[8] - b[8]) & 0xffff;
-        r[9] = (v = (v >>> 16) + 0x7fff8 + a[9] - b[9]) & 0xffff;
-        r[10] = (v = (v >>> 16) + 0x7fff8 + a[10] - b[10]) & 0xffff;
-        r[11] = (v = (v >>> 16) + 0x7fff8 + a[11] - b[11]) & 0xffff;
-        r[12] = (v = (v >>> 16) + 0x7fff8 + a[12] - b[12]) & 0xffff;
-        r[13] = (v = (v >>> 16) + 0x7fff8 + a[13] - b[13]) & 0xffff;
-        r[14] = (v = (v >>> 16) + 0x7fff8 + a[14] - b[14]) & 0xffff;
-        r[15] = (v >>> 16) - 8 + a[15] - b[15];
-        return r;
-    }
-
-    function _sqr8h(a7, a6, a5, a4, a3, a2, a1, a0) {
-        // 'division by 0x10000' can not be replaced by '>> 16' because
-        // more than 32 bits of precision are needed similarly
-        // 'multiplication by 2' cannot be replaced by '<< 1'
-        var r = [];
-        var v;
-        r[0] = (v = a0 * a0) & 0xffff;
-        r[1] = (v = (0 | (v / 0x10000)) + 2 * a0 * a1) & 0xffff;
-        r[2] = (v = (0 | (v / 0x10000)) + 2 * a0 * a2 + a1 * a1) & 0xffff;
-        r[3] = (v = (0 | (v / 0x10000)) + 2 * a0 * a3 + 2 * a1 * a2) & 0xffff;
-        r[4] = (v = (0 | (v / 0x10000)) + 2 * a0 * a4 + 2 * a1 * a3 + a2
-                    * a2) & 0xffff;
-        r[5] = (v = (0 | (v / 0x10000)) + 2 * a0 * a5 + 2 * a1 * a4 + 2
-                    * a2 * a3) & 0xffff;
-        r[6] = (v = (0 | (v / 0x10000)) + 2 * a0 * a6 + 2 * a1 * a5 + 2
-                    * a2 * a4 + a3 * a3) & 0xffff;
-        r[7] = (v = (0 | (v / 0x10000)) + 2 * a0 * a7 + 2 * a1 * a6 + 2
-                    * a2 * a5 + 2 * a3 * a4) & 0xffff;
-        r[8] = (v = (0 | (v / 0x10000)) + 2 * a1 * a7 + 2 * a2 * a6 + 2
-                    * a3 * a5 + a4 * a4) & 0xffff;
-        r[9] = (v = (0 | (v / 0x10000)) + 2 * a2 * a7 + 2 * a3 * a6 + 2
-                    * a4 * a5) & 0xffff;
-        r[10] = (v = (0 | (v / 0x10000)) + 2 * a3 * a7 + 2 * a4 * a6
-                     + a5 * a5) & 0xffff;
-        r[11] = (v = (0 | (v / 0x10000)) + 2 * a4 * a7 + 2 * a5 * a6) & 0xffff;
-        r[12] = (v = (0 | (v / 0x10000)) + 2 * a5 * a7 + a6 * a6) & 0xffff;
-        r[13] = (v = (0 | (v / 0x10000)) + 2 * a6 * a7) & 0xffff;
-        r[14] = (v = (0 | (v / 0x10000)) + a7 * a7) & 0xffff;
-        r[15] = 0 | (v / 0x10000);
-        return r;
-    }
-
-    function _sqrmodp(a) {
-        var x = _sqr8h(a[15], a[14], a[13], a[12], a[11], a[10], a[9],
-                       a[8]);
-        var z = _sqr8h(a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0]);
-        var y = _sqr8h(a[15] + a[7], a[14] + a[6], a[13] + a[5], a[12]
-                                                                 + a[4],
-                       a[11] + a[3], a[10] + a[2], a[9] + a[1], a[8]
-                                                                + a[0]);
-        var r = [];
-        var v;
-        r[0] = (v = 0x800000 + z[0] + (y[8] - x[8] - z[8] + x[0] - 0x80)
-                    * 38) & 0xffff;
-        r[1] = (v = 0x7fff80 + (v >>> 16) + z[1]
-                    + (y[9] - x[9] - z[9] + x[1]) * 38) & 0xffff;
-        r[2] = (v = 0x7fff80 + (v >>> 16) + z[2]
-                    + (y[10] - x[10] - z[10] + x[2]) * 38) & 0xffff;
-        r[3] = (v = 0x7fff80 + (v >>> 16) + z[3]
-                    + (y[11] - x[11] - z[11] + x[3]) * 38) & 0xffff;
-        r[4] = (v = 0x7fff80 + (v >>> 16) + z[4]
-                    + (y[12] - x[12] - z[12] + x[4]) * 38) & 0xffff;
-        r[5] = (v = 0x7fff80 + (v >>> 16) + z[5]
-                    + (y[13] - x[13] - z[13] + x[5]) * 38) & 0xffff;
-        r[6] = (v = 0x7fff80 + (v >>> 16) + z[6]
-                    + (y[14] - x[14] - z[14] + x[6]) * 38) & 0xffff;
-        r[7] = (v = 0x7fff80 + (v >>> 16) + z[7]
-                    + (y[15] - x[15] - z[15] + x[7]) * 38) & 0xffff;
-        r[8] = (v = 0x7fff80 + (v >>> 16) + z[8] + y[0] - x[0] - z[0]
-                    + x[8] * 38) & 0xffff;
-        r[9] = (v = 0x7fff80 + (v >>> 16) + z[9] + y[1] - x[1] - z[1]
-                    + x[9] * 38) & 0xffff;
-        r[10] = (v = 0x7fff80 + (v >>> 16) + z[10] + y[2] - x[2] - z[2]
-                     + x[10] * 38) & 0xffff;
-        r[11] = (v = 0x7fff80 + (v >>> 16) + z[11] + y[3] - x[3] - z[3]
-                     + x[11] * 38) & 0xffff;
-        r[12] = (v = 0x7fff80 + (v >>> 16) + z[12] + y[4] - x[4] - z[4]
-                     + x[12] * 38) & 0xffff;
-        r[13] = (v = 0x7fff80 + (v >>> 16) + z[13] + y[5] - x[5] - z[5]
-                     + x[13] * 38) & 0xffff;
-        r[14] = (v = 0x7fff80 + (v >>> 16) + z[14] + y[6] - x[6] - z[6]
-                     + x[14] * 38) & 0xffff;
-        r[15] = 0x7fff80 + (v >>> 16) + z[15] + y[7] - x[7] - z[7]
-                + x[15] * 38;
-        _reduce(r);
-        return r;
-    }
-
-    function _mul8h(a7, a6, a5, a4, a3, a2, a1, a0, b7, b6, b5, b4, b3,
-                    b2, b1, b0) {
-        // 'division by 0x10000' can not be replaced by '>> 16' because
-        // more than 32 bits of precision are needed
-        var r = [];
-        var v;
-        r[0] = (v = a0 * b0) & 0xffff;
-        r[1] = (v = (0 | (v / 0x10000)) + a0 * b1 + a1 * b0) & 0xffff;
-        r[2] = (v = (0 | (v / 0x10000)) + a0 * b2 + a1 * b1 + a2 * b0) & 0xffff;
-        r[3] = (v = (0 | (v / 0x10000)) + a0 * b3 + a1 * b2 + a2 * b1
-                    + a3 * b0) & 0xffff;
-        r[4] = (v = (0 | (v / 0x10000)) + a0 * b4 + a1 * b3 + a2 * b2
-                    + a3 * b1 + a4 * b0) & 0xffff;
-        r[5] = (v = (0 | (v / 0x10000)) + a0 * b5 + a1 * b4 + a2 * b3
-                    + a3 * b2 + a4 * b1 + a5 * b0) & 0xffff;
-        r[6] = (v = (0 | (v / 0x10000)) + a0 * b6 + a1 * b5 + a2 * b4
-                    + a3 * b3 + a4 * b2 + a5 * b1 + a6 * b0) & 0xffff;
-        r[7] = (v = (0 | (v / 0x10000)) + a0 * b7 + a1 * b6 + a2 * b5
-                    + a3 * b4 + a4 * b3 + a5 * b2 + a6 * b1 + a7 * b0) & 0xffff;
-        r[8] = (v = (0 | (v / 0x10000)) + a1 * b7 + a2 * b6 + a3 * b5
-                    + a4 * b4 + a5 * b3 + a6 * b2 + a7 * b1) & 0xffff;
-        r[9] = (v = (0 | (v / 0x10000)) + a2 * b7 + a3 * b6 + a4 * b5
-                    + a5 * b4 + a6 * b3 + a7 * b2) & 0xffff;
-        r[10] = (v = (0 | (v / 0x10000)) + a3 * b7 + a4 * b6 + a5 * b5
-                     + a6 * b4 + a7 * b3) & 0xffff;
-        r[11] = (v = (0 | (v / 0x10000)) + a4 * b7 + a5 * b6 + a6 * b5
-                     + a7 * b4) & 0xffff;
-        r[12] = (v = (0 | (v / 0x10000)) + a5 * b7 + a6 * b6 + a7 * b5) & 0xffff;
-        r[13] = (v = (0 | (v / 0x10000)) + a6 * b7 + a7 * b6) & 0xffff;
-        r[14] = (v = (0 | (v / 0x10000)) + a7 * b7) & 0xffff;
-        r[15] = (0 | (v / 0x10000));
-        return r;
-    }
-
-    function _mulmodp(a, b) {
-        // Karatsuba multiplication scheme: x*y = (b^2+b)*x1*y1 -
-        // b*(x1-x0)*(y1-y0) + (b+1)*x0*y0
-        var x = _mul8h(a[15], a[14], a[13], a[12], a[11], a[10], a[9],
-                       a[8], b[15], b[14], b[13], b[12], b[11], b[10],
-                       b[9], b[8]);
-        var z = _mul8h(a[7], a[6], a[5], a[4], a[3], a[2], a[1], a[0],
-                       b[7], b[6], b[5], b[4], b[3], b[2], b[1], b[0]);
-        var y = _mul8h(a[15] + a[7], a[14] + a[6], a[13] + a[5], a[12]
-                                                                 + a[4],
-                       a[11] + a[3], a[10] + a[2], a[9] + a[1], a[8]
-                                                                + a[0],
-                       b[15] + b[7], b[14] + b[6], b[13] + b[5], b[12]
-                                                                 + b[4],
-                       b[11] + b[3], b[10] + b[2], b[9] + b[1], b[8]
-                                                                + b[0]);
-        var r = [];
-        var v;
-        r[0] = (v = 0x800000 + z[0] + (y[8] - x[8] - z[8] + x[0] - 0x80)
-                    * 38) & 0xffff;
-        r[1] = (v = 0x7fff80 + (v >>> 16) + z[1]
-                    + (y[9] - x[9] - z[9] + x[1]) * 38) & 0xffff;
-        r[2] = (v = 0x7fff80 + (v >>> 16) + z[2]
-                    + (y[10] - x[10] - z[10] + x[2]) * 38) & 0xffff;
-        r[3] = (v = 0x7fff80 + (v >>> 16) + z[3]
-                    + (y[11] - x[11] - z[11] + x[3]) * 38) & 0xffff;
-        r[4] = (v = 0x7fff80 + (v >>> 16) + z[4]
-                    + (y[12] - x[12] - z[12] + x[4]) * 38) & 0xffff;
-        r[5] = (v = 0x7fff80 + (v >>> 16) + z[5]
-                    + (y[13] - x[13] - z[13] + x[5]) * 38) & 0xffff;
-        r[6] = (v = 0x7fff80 + (v >>> 16) + z[6]
-                    + (y[14] - x[14] - z[14] + x[6]) * 38) & 0xffff;
-        r[7] = (v = 0x7fff80 + (v >>> 16) + z[7]
-                    + (y[15] - x[15] - z[15] + x[7]) * 38) & 0xffff;
-        r[8] = (v = 0x7fff80 + (v >>> 16) + z[8] + y[0] - x[0] - z[0]
-                    + x[8] * 38) & 0xffff;
-        r[9] = (v = 0x7fff80 + (v >>> 16) + z[9] + y[1] - x[1] - z[1]
-                    + x[9] * 38) & 0xffff;
-        r[10] = (v = 0x7fff80 + (v >>> 16) + z[10] + y[2] - x[2] - z[2]
-                     + x[10] * 38) & 0xffff;
-        r[11] = (v = 0x7fff80 + (v >>> 16) + z[11] + y[3] - x[3] - z[3]
-                     + x[11] * 38) & 0xffff;
-        r[12] = (v = 0x7fff80 + (v >>> 16) + z[12] + y[4] - x[4] - z[4]
-                     + x[12] * 38) & 0xffff;
-        r[13] = (v = 0x7fff80 + (v >>> 16) + z[13] + y[5] - x[5] - z[5]
-                     + x[13] * 38) & 0xffff;
-        r[14] = (v = 0x7fff80 + (v >>> 16) + z[14] + y[6] - x[6] - z[6]
-                     + x[14] * 38) & 0xffff;
-        r[15] = 0x7fff80 + (v >>> 16) + z[15] + y[7] - x[7] - z[7]
-                + x[15] * 38;
-        _reduce(r);
-        return r;
-    }
-
-    function _reduce(arr) {
-        var aCopy = arr.slice(0);
-        var choice = [arr, aCopy];
-        var v = arr[15];
-        // Use the dummy copy instead of just returning to be more constant time.
-        var a = choice[(v < 0x8000) & 1];
-        a[15] = v & 0x7fff;
-        // >32-bits of precision are required here so '/ 0x8000' can not be
-        // replaced by the arithmetic equivalent '>>> 15'
-        v = (0 | (v / 0x8000)) * 19;
-        a[0] = (v += a[0]) & 0xffff;
-        v = v >>> 16;
-        a[1] = (v += a[1]) & 0xffff;
-        v = v >>> 16;
-        a[2] = (v += a[2]) & 0xffff;
-        v = v >>> 16;
-        a[3] = (v += a[3]) & 0xffff;
-        v = v >>> 16;
-        a[4] = (v += a[4]) & 0xffff;
-        v = v >>> 16;
-        a[5] = (v += a[5]) & 0xffff;
-        v = v >>> 16;
-        a[6] = (v += a[6]) & 0xffff;
-        v = v >>> 16;
-        a[7] = (v += a[7]) & 0xffff;
-        v = v >>> 16;
-        a[8] = (v += a[8]) & 0xffff;
-        v = v >>> 16;
-        a[9] = (v += a[9]) & 0xffff;
-        v = v >>> 16;
-        a[10] = (v += a[10]) & 0xffff;
-        v = v >>> 16;
-        a[11] = (v += a[11]) & 0xffff;
-        v = v >>> 16;
-        a[12] = (v += a[12]) & 0xffff;
-        v = v >>> 16;
-        a[13] = (v += a[13]) & 0xffff;
-        v = v >>> 16;
-        a[14] = (v += a[14]) & 0xffff;
-        v = v >>> 16;
-        a[15] += v;
-    }
-
-    function _addmodp(a, b) {
-        var r = [];
-        var v;
-        r[0] = (v = ((0 | (a[15] >>> 15)) + (0 | (b[15] >>> 15))) * 19
-                    + a[0] + b[0]) & 0xffff;
-        r[1] = (v = (v >>> 16) + a[1] + b[1]) & 0xffff;
-        r[2] = (v = (v >>> 16) + a[2] + b[2]) & 0xffff;
-        r[3] = (v = (v >>> 16) + a[3] + b[3]) & 0xffff;
-        r[4] = (v = (v >>> 16) + a[4] + b[4]) & 0xffff;
-        r[5] = (v = (v >>> 16) + a[5] + b[5]) & 0xffff;
-        r[6] = (v = (v >>> 16) + a[6] + b[6]) & 0xffff;
-        r[7] = (v = (v >>> 16) + a[7] + b[7]) & 0xffff;
-        r[8] = (v = (v >>> 16) + a[8] + b[8]) & 0xffff;
-        r[9] = (v = (v >>> 16) + a[9] + b[9]) & 0xffff;
-        r[10] = (v = (v >>> 16) + a[10] + b[10]) & 0xffff;
-        r[11] = (v = (v >>> 16) + a[11] + b[11]) & 0xffff;
-        r[12] = (v = (v >>> 16) + a[12] + b[12]) & 0xffff;
-        r[13] = (v = (v >>> 16) + a[13] + b[13]) & 0xffff;
-        r[14] = (v = (v >>> 16) + a[14] + b[14]) & 0xffff;
-        r[15] = (v >>> 16) + (a[15] & 0x7fff) + (b[15] & 0x7fff);
-        return r;
-    }
-
-    function _submodp(a, b) {
-        var r = [];
-        var v;
-        r[0] = (v = 0x80000
-                    + ((0 | (a[15] >>> 15)) - (0 | (b[15] >>> 15)) - 1)
-                    * 19 + a[0] - b[0]) & 0xffff;
-        r[1] = (v = (v >>> 16) + 0x7fff8 + a[1] - b[1]) & 0xffff;
-        r[2] = (v = (v >>> 16) + 0x7fff8 + a[2] - b[2]) & 0xffff;
-        r[3] = (v = (v >>> 16) + 0x7fff8 + a[3] - b[3]) & 0xffff;
-        r[4] = (v = (v >>> 16) + 0x7fff8 + a[4] - b[4]) & 0xffff;
-        r[5] = (v = (v >>> 16) + 0x7fff8 + a[5] - b[5]) & 0xffff;
-        r[6] = (v = (v >>> 16) + 0x7fff8 + a[6] - b[6]) & 0xffff;
-        r[7] = (v = (v >>> 16) + 0x7fff8 + a[7] - b[7]) & 0xffff;
-        r[8] = (v = (v >>> 16) + 0x7fff8 + a[8] - b[8]) & 0xffff;
-        r[9] = (v = (v >>> 16) + 0x7fff8 + a[9] - b[9]) & 0xffff;
-        r[10] = (v = (v >>> 16) + 0x7fff8 + a[10] - b[10]) & 0xffff;
-        r[11] = (v = (v >>> 16) + 0x7fff8 + a[11] - b[11]) & 0xffff;
-        r[12] = (v = (v >>> 16) + 0x7fff8 + a[12] - b[12]) & 0xffff;
-        r[13] = (v = (v >>> 16) + 0x7fff8 + a[13] - b[13]) & 0xffff;
-        r[14] = (v = (v >>> 16) + 0x7fff8 + a[14] - b[14]) & 0xffff;
-        r[15] = (v >>> 16) + 0x7ff8 + (a[15] & 0x7fff)
-                - (b[15] & 0x7fff);
-        return r;
-    }
-
-    function _invmodp(a) {
-        var c = a;
-        var i = 250;
-        while (--i) {
-            a = _sqrmodp(a);
-            a = _mulmodp(a, c);
-        }
-        a = _sqrmodp(a);
-        a = _sqrmodp(a);
-        a = _mulmodp(a, c);
-        a = _sqrmodp(a);
-        a = _sqrmodp(a);
-        a = _mulmodp(a, c);
-        a = _sqrmodp(a);
-        a = _mulmodp(a, c);
-        return a;
-    }
-
-    function _mulasmall(a) {
-        // 'division by 0x10000' can not be replaced by '>> 16' because
-        // more than 32 bits of precision are needed
-        var m = 121665;
-        var r = [];
-        var v;
-        r[0] = (v = a[0] * m) & 0xffff;
-        r[1] = (v = (0 | (v / 0x10000)) + a[1] * m) & 0xffff;
-        r[2] = (v = (0 | (v / 0x10000)) + a[2] * m) & 0xffff;
-        r[3] = (v = (0 | (v / 0x10000)) + a[3] * m) & 0xffff;
-        r[4] = (v = (0 | (v / 0x10000)) + a[4] * m) & 0xffff;
-        r[5] = (v = (0 | (v / 0x10000)) + a[5] * m) & 0xffff;
-        r[6] = (v = (0 | (v / 0x10000)) + a[6] * m) & 0xffff;
-        r[7] = (v = (0 | (v / 0x10000)) + a[7] * m) & 0xffff;
-        r[8] = (v = (0 | (v / 0x10000)) + a[8] * m) & 0xffff;
-        r[9] = (v = (0 | (v / 0x10000)) + a[9] * m) & 0xffff;
-        r[10] = (v = (0 | (v / 0x10000)) + a[10] * m) & 0xffff;
-        r[11] = (v = (0 | (v / 0x10000)) + a[11] * m) & 0xffff;
-        r[12] = (v = (0 | (v / 0x10000)) + a[12] * m) & 0xffff;
-        r[13] = (v = (0 | (v / 0x10000)) + a[13] * m) & 0xffff;
-        r[14] = (v = (0 | (v / 0x10000)) + a[14] * m) & 0xffff;
-        r[15] = (0 | (v / 0x10000)) + a[15] * m;
-        _reduce(r);
-        return r;
-    }
-
-    function _dbl(x, z) {
-        var x_2, z_2, m, n, o;
-        m = _sqrmodp(_addmodp(x, z));
-        n = _sqrmodp(_submodp(x, z));
-        o = _submodp(m, n);
-        x_2 = _mulmodp(n, m);
-        z_2 = _mulmodp(_addmodp(_mulasmall(o), m), o);
-        return [x_2, z_2];
-    }
-
-    function _sum(x, z, x_p, z_p, x_1) {
-        var x_3, z_3, p, q;
-        p = _mulmodp(_submodp(x, z), _addmodp(x_p, z_p));
-        q = _mulmodp(_addmodp(x, z), _submodp(x_p, z_p));
-        x_3 = _sqrmodp(_addmodp(p, q));
-        z_3 = _mulmodp(_sqrmodp(_submodp(p, q)), x_1);
-        return [x_3, z_3];
-    }
-
-    function _generateKey(curve25519) {
-        var buffer = crypto.randomBytes(32);
-
-        // For Curve25519 DH keys, we need to apply some bit mask on generated
-        // keys:
-        // * clear bit 0, 1, 2 of first byte
-        // * clear bit 7 of last byte
-        // * set bit 6 of last byte
-        if (curve25519 === true) {
-            buffer[0] &= 0xf8;
-            buffer[31] = (buffer[31] & 0x7f) | 0x40;
-        }
-        var result = [];
-        for (var i = 0; i < buffer.length; i++) {
-            result.push(String.fromCharCode(buffer[i]));
-        }
-        return result.join('');
-    }
-
-    // Expose some functions to the outside through this name space.
-    // Note: This is not part of the public API.
-    ns.getbit = _getbit;
-    ns.setbit = _setbit;
-    ns.addmodp = _addmodp;
-    ns.invmodp = _invmodp;
-    ns.mulmodp = _mulmodp;
-    ns.reduce = _reduce;
-    ns.dbl = _dbl;
-    ns.sum = _sum;
-    ns.ZERO = _ZERO;
-    ns.ONE = _ONE;
-    ns.BASE = _BASE;
-    ns.bigintadd = _bigintadd;
-    ns.bigintsub = _bigintsub;
-    ns.bigintcmp = _bigintcmp;
-    ns.mulmodp = _mulmodp;
-    ns.sqrmodp = _sqrmodp;
-    ns.generateKey = _generateKey;
-
-
-module.exports = ns;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/curve255.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/curve255.js
deleted file mode 100644
index 3978b46e31e07587838a6f1bdae143cdfe89402b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/curve255.js
+++ /dev/null
@@ -1,221 +0,0 @@
-"use strict";
-/**
- * @fileOverview
- * Core operations on curve 25519 required for the higher level modules.
- */
-
-/*
- * Copyright (c) 2007, 2013, 2014 Michele Bini
- * Copyright (c) 2014 Mega Limited
- * under the MIT License.
- *
- * Authors: Guy K. Kloss, Michele Bini
- *
- * You should have received a copy of the license along with this program.
- */
-
-var core = require('./core');
-var utils = require('./utils');
-
-    /**
-     * @exports jodid25519/curve255
-     * Legacy compatibility module for Michele Bini's previous curve255.js.
-     *
-     * @description
-     * Legacy compatibility module for Michele Bini's previous curve255.js.
-     *
-     * <p>
-     * This code presents an API with all key formats as previously available
-     * from Michele Bini's curve255.js implementation.
-     * </p>
-     */
-    var ns = {};
-
-    function curve25519_raw(f, c) {
-        var a, x_1, q;
-
-        x_1 = c;
-        a = core.dbl(x_1, core.ONE());
-        q = [x_1, core.ONE()];
-
-        var n = 255;
-
-        while (core.getbit(f, n) == 0) {
-            n--;
-            // For correct constant-time operation, bit 255 should always be
-            // set to 1 so the following 'while' loop is never entered.
-            if (n < 0) {
-                return core.ZERO();
-            }
-        }
-        n--;
-
-        var aq = [a, q];
-
-        while (n >= 0) {
-            var r, s;
-            var b = core.getbit(f, n);
-            r = core.sum(aq[0][0], aq[0][1], aq[1][0], aq[1][1], x_1);
-            s = core.dbl(aq[1 - b][0], aq[1 - b][1]);
-            aq[1 - b] = s;
-            aq[b] = r;
-            n--;
-        }
-        q = aq[1];
-
-        q[1] = core.invmodp(q[1]);
-        q[0] = core.mulmodp(q[0], q[1]);
-        core.reduce(q[0]);
-        return q[0];
-    }
-
-    function curve25519b32(a, b) {
-        return _base32encode(curve25519(_base32decode(a),
-                                        _base32decode(b)));
-    }
-
-    function curve25519(f, c) {
-        if (!c) {
-            c = core.BASE();
-        }
-        f[0] &= 0xFFF8;
-        f[15] = (f[15] & 0x7FFF) | 0x4000;
-        return curve25519_raw(f, c);
-    }
-
-    function _hexEncodeVector(k) {
-        var hexKey = utils.hexEncode(k);
-        // Pad with '0' at the front.
-        hexKey = new Array(64 + 1 - hexKey.length).join('0') + hexKey;
-        // Invert bytes.
-        return hexKey.split(/(..)/).reverse().join('');
-    }
-
-    function _hexDecodeVector(v) {
-        // assert(length(x) == 64);
-        // Invert bytes.
-        var hexKey = v.split(/(..)/).reverse().join('');
-        return utils.hexDecode(hexKey);
-    }
-
-
-    // Expose some functions to the outside through this name space.
-
-    /**
-     * Computes the scalar product of a point on the curve 25519.
-     *
-     * This function is used for the DH key-exchange protocol.
-     *
-     * Before multiplication, some bit operations are applied to the
-     * private key to ensure it is a valid Curve25519 secret key.
-     * It is the user's responsibility to make sure that the private
-     * key is a uniformly random, secret value.
-     *
-     * @function
-     * @param f {array}
-     *     Private key.
-     * @param c {array}
-     *     Public point on the curve. If not given, the curve's base point is used.
-     * @returns {array}
-     *     Key point resulting from scalar product.
-     */
-    ns.curve25519 = curve25519;
-
-    /**
-     * Computes the scalar product of a point on the curve 25519.
-     *
-     * This variant does not make sure that the private key is valid.
-     * The user has the responsibility to ensure the private key is
-     * valid or that this results in a safe protocol.  Unless you know
-     * exactly what you are doing, you should not use this variant,
-     * please use 'curve25519' instead.
-     *
-     * @function
-     * @param f {array}
-     *     Private key.
-     * @param c {array}
-     *     Public point on the curve. If not given, the curve's base point is used.
-     * @returns {array}
-     *     Key point resulting from scalar product.
-     */
-    ns.curve25519_raw = curve25519_raw;
-
-    /**
-     * Encodes the internal representation of a key to a canonical hex
-     * representation.
-     *
-     * This is the format commonly used in other libraries and for
-     * test vectors, and is equivalent to the hex dump of the key in
-     * little-endian binary format.
-     *
-     * @function
-     * @param n {array}
-     *     Array representation of key.
-     * @returns {string}
-     *     Hexadecimal string representation of key.
-     */
-    ns.hexEncodeVector = _hexEncodeVector;
-
-    /**
-     * Decodes a canonical hex representation of a key
-     * to an internally compatible array representation.
-     *
-     * @function
-     * @param n {string}
-     *     Hexadecimal string representation of key.
-     * @returns {array}
-     *     Array representation of key.
-     */
-    ns.hexDecodeVector = _hexDecodeVector;
-
-    /**
-     * Encodes the internal representation of a key into a
-     * hexadecimal representation.
-     *
-     * This is a strict positional notation, most significant digit first.
-     *
-     * @function
-     * @param n {array}
-     *     Array representation of key.
-     * @returns {string}
-     *     Hexadecimal string representation of key.
-     */
-    ns.hexencode = utils.hexEncode;
-
-    /**
-     * Decodes a hex representation of a key to an internally
-     * compatible array representation.
-     *
-     * @function
-     * @param n {string}
-     *     Hexadecimal string representation of key.
-     * @returns {array}
-     *     Array representation of key.
-     */
-    ns.hexdecode = utils.hexDecode;
-
-    /**
-     * Encodes the internal representation of a key to a base32
-     * representation.
-     *
-     * @function
-     * @param n {array}
-     *     Array representation of key.
-     * @returns {string}
-     *     Base32 string representation of key.
-     */
-    ns.base32encode = utils.base32encode;
-
-    /**
-     * Decodes a base32 representation of a key to an internally
-     * compatible array representation.
-     *
-     * @function
-     * @param n {string}
-     *     Base32 string representation of key.
-     * @returns {array}
-     *     Array representation of key.
-     */
-    ns.base32decode = utils.base32decode;
-
-module.exports = ns;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/dh.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/dh.js
deleted file mode 100644
index 2f75494a4877423db5930c6dd49f65fe9e5239a6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/dh.js
+++ /dev/null
@@ -1,111 +0,0 @@
-"use strict";
-/**
- * @fileOverview
- * EC Diffie-Hellman operations on Curve25519.
- */
-
-/*
- * Copyright (c) 2014 Mega Limited
- * under the MIT License.
- *
- * Authors: Guy K. Kloss
- *
- * You should have received a copy of the license along with this program.
- */
-
-var core = require('./core');
-var utils = require('./utils');
-var curve255 = require('./curve255');
-
-
-    /**
-     * @exports jodid25519/dh
-     * EC Diffie-Hellman operations on Curve25519.
-     *
-     * @description
-     * EC Diffie-Hellman operations on Curve25519.
-     */
-    var ns = {};
-
-
-    function _toString(vector) {
-        var u = new Uint16Array(vector);
-        return (new Buffer(new Uint8Array(u.buffer)));
-    }
-
-    function _fromString(vector) {
-        if (Buffer.isBuffer(vector)) {
-            var u = new Uint8Array(vector);
-            return (new Uint16Array(u.buffer));
-        }
-
-        var result = new Array(16);
-        for (var i = 0, l = 0; i < vector.length; i += 2) {
-            result[l] = (vector.charCodeAt(i + 1) << 8) | vector.charCodeAt(i);
-            l++;
-        }
-        return result;
-    }
-
-
-    /**
-     * Computes a key through scalar multiplication of a point on the curve 25519.
-     *
-     * This function is used for the DH key-exchange protocol. It computes a
-     * key based on a secret key with a public component (opponent's public key
-     * or curve base point if not given) by using scalar multiplication.
-     *
-     * Before multiplication, some bit operations are applied to the
-     * private key to ensure it is a valid Curve25519 secret key.
-     * It is the user's responsibility to make sure that the private
-     * key is a uniformly random, secret value.
-     *
-     * @function
-     * @param privateComponent {string}
-     *     Private point as byte string on the curve.
-     * @param publicComponent {string}
-     *     Public point as byte string on the curve. If not given, the curve's
-     *     base point is used.
-     * @returns {string}
-     *     Key point as byte string resulting from scalar product.
-     */
-    ns.computeKey = function(privateComponent, publicComponent) {
-        if (publicComponent) {
-            return _toString(curve255.curve25519(_fromString(privateComponent),
-                                                 _fromString(publicComponent)));
-        } else {
-            return _toString(curve255.curve25519(_fromString(privateComponent)));
-        }
-    };
-
-    /**
-     * Computes the public key to a private key on the curve 25519.
-     *
-     * Before multiplication, some bit operations are applied to the
-     * private key to ensure it is a valid Curve25519 secret key.
-     * It is the user's responsibility to make sure that the private
-     * key is a uniformly random, secret value.
-     *
-     * @function
-     * @param privateKey {string}
-     *     Private point as byte string on the curve.
-     * @returns {string}
-     *     Public key point as byte string resulting from scalar product.
-     */
-    ns.publicKey = function(privateKey) {
-        return _toString(curve255.curve25519(_fromString(privateKey)));
-    };
-
-
-    /**
-     * Generates a new random private key of 32 bytes length (256 bit).
-     *
-     * @function
-     * @returns {string}
-     *     Byte string containing a new random private key seed.
-     */
-    ns.generateKey = function() {
-        return core.generateKey(true);
-    };
-
-module.exports = ns;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/eddsa.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/eddsa.js
deleted file mode 100644
index c384f3293da948a811077da0121f0453da2b3332..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/eddsa.js
+++ /dev/null
@@ -1,573 +0,0 @@
-"use strict";
-/**
- * @fileOverview
- * Digital signature scheme based on Curve25519 (Ed25519 or EdDSA).
- */
-
-/*
- * Copyright (c) 2011, 2012, 2014 Ron Garret
- * Copyright (c) 2014 Mega Limited
- * under the MIT License.
- *
- * Authors: Guy K. Kloss, Ron Garret
- *
- * You should have received a copy of the license along with this program.
- */
-
-var core = require('./core');
-var curve255 = require('./curve255');
-var utils = require('./utils');
-var BigInteger = require('jsbn').BigInteger;
-var crypto = require('crypto');
-
-    /**
-     * @exports jodid25519/eddsa
-     * Digital signature scheme based on Curve25519 (Ed25519 or EdDSA).
-     *
-     * @description
-     * Digital signature scheme based on Curve25519 (Ed25519 or EdDSA).
-     *
-     * <p>
-     * This code is adapted from fast-djbec.js, a faster but more complicated
-     * version of the Ed25519 encryption scheme (as compared to djbec.js).
-     * It uses two different representations for big integers: The jsbn
-     * BigInteger class, which can represent arbitrary-length numbers, and a
-     * special fixed-length representation optimised for 256-bit integers.
-     * The reason both are needed is that the Ed25519 algorithm requires some
-     * 512-bit numbers.</p>
-    */
-    var ns = {};
-
-    function _bi255(value) {
-        if (!(this instanceof _bi255)) {
-            return new _bi255(value);
-        }
-        if (typeof value === 'undefined') {
-            return _ZERO;
-        }
-        var c = value.constructor;
-        if ((c === Array || c === Uint16Array || c === Uint32Array) && (value.length === 16)) {
-            this.n = value;
-        } else if ((c === Array) && (value.length === 32)) {
-            this.n = _bytes2bi255(value).n;
-        } else if (c === String) {
-            this.n = utils.hexDecode(value);
-        } else if (c === Number) {
-            this.n = [value & 0xffff,
-                      value >> 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
-        } else if (value instanceof _bi255) {
-            this.n = value.n.slice(0); // Copy constructor
-        } else {
-            throw "Bad argument for bignum: " + value;
-        }
-    }
-
-   _bi255.prototype = {
-        'toString' : function() {
-            return utils.hexEncode(this.n);
-        },
-        'toSource' : function() {
-            return '_' + utils.hexEncode(this.n);
-        },
-        'plus' : function(n1) {
-            return _bi255(core.bigintadd(this.n, n1.n));
-        },
-        'minus' : function(n1) {
-            return _bi255(core.bigintsub(this.n, n1.n)).modq();
-        },
-        'times' : function(n1) {
-            return _bi255(core.mulmodp(this.n, n1.n));
-        },
-        'divide' : function(n1) {
-            return this.times(n1.inv());
-        },
-        'sqr' : function() {
-            return _bi255(core.sqrmodp(this.n));
-        },
-        'cmp' : function(n1) {
-            return core.bigintcmp(this.n, n1.n);
-        },
-        'equals' : function(n1) {
-            return this.cmp(n1) === 0;
-        },
-        'isOdd' : function() {
-            return (this.n[0] & 1) === 1;
-        },
-        'shiftLeft' : function(cnt) {
-            _shiftL(this.n, cnt);
-            return this;
-        },
-        'shiftRight' : function(cnt) {
-            _shiftR(this.n, cnt);
-            return this;
-        },
-        'inv' : function() {
-            return _bi255(core.invmodp(this.n));
-        },
-        'pow' : function(e) {
-            return _bi255(_pow(this.n, e.n));
-        },
-        'modq' : function() {
-            return _modq(this);
-        },
-        'bytes' : function() {
-            return _bi255_bytes(this);
-        }
-    };
-
-    function _shiftL(n, cnt) {
-        var lastcarry = 0;
-        for (var i = 0; i < 16; i++) {
-            var carry = n[i] >> (16 - cnt);
-            n[i] = (n[i] << cnt) & 0xffff | lastcarry;
-            lastcarry = carry;
-        }
-        return n;
-    }
-
-    function _shiftR(n, cnt) {
-        var lastcarry = 0;
-        for (var i = 15; i >= 0; i--) {
-            var carry = n[i] << (16 - cnt) & 0xffff;
-            n[i] = (n[i] >> cnt) | lastcarry;
-            lastcarry = carry;
-        }
-        return n;
-    }
-
-    function _bi255_bytes(n) {
-        n = _bi255(n); // Make a copy because shiftRight is destructive
-        var a = new Array(32);
-        for (var i = 31; i >= 0; i--) {
-            a[i] = n.n[0] & 0xff;
-            n.shiftRight(8);
-        }
-        return a;
-    }
-
-    function _bytes2bi255(a) {
-        var n = _ZERO;
-        for (var i = 0; i < 32; i++) {
-            n.shiftLeft(8);
-            n = n.plus(_bi255(a[i]));
-        }
-        return n;
-    }
-
-    function _pow(n, e) {
-        var result = core.ONE();
-        for (var i = 0; i < 256; i++) {
-            if (core.getbit(e, i) === 1) {
-                result = core.mulmodp(result, n);
-            }
-            n = core.sqrmodp(n);
-        }
-        return result;
-    }
-
-    var _ZERO = _bi255(0);
-    var _ONE = _bi255(1);
-    var _TWO = _bi255(2);
-    // This is the core prime.
-    var _Q = _bi255([0xffff - 18, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-                     0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-                     0xffff, 0xffff, 0x7fff]);
-
-    function _modq(n) {
-        core.reduce(n.n);
-        if (n.cmp(_Q) >= 0) {
-            return _modq(n.minus(_Q));
-        }
-        if (n.cmp(_ZERO) === -1) {
-            return _modq(n.plus(_Q));
-        } else {
-            return n;
-        }
-    }
-
-    // _RECOVERY_EXPONENT = _Q.plus(_bi255(3)).divide(_bi255(8));
-    var _RECOVERY_EXPONENT = _bi255('0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe');
-    // _D = _Q.minus(_bi255(121665)).divide(_bi255(121666));
-    var _D = _bi255('52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3');
-    // _I = _TWO.pow(_Q.minus(_ONE).divide(_bi255(4)));
-    var _I = _bi255('2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0');
-    // _L = _TWO.pow(_bi255(252)).plus(_bi255('14def9dea2f79cd65812631a5cf5d3ed'));
-    var _L = _bi255('1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed');
-    var _L_BI = _bi('1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed', 16);
-
-
-    // ////////////////////////////////////////////////////////////
-
-    function _isoncurve(p) {
-        var x = p[0];
-        var y = p[1];
-        var xsqr = x.sqr();
-        var ysqr = y.sqr();
-        var v = _D.times(xsqr).times(ysqr);
-        return ysqr.minus(xsqr).minus(_ONE).minus(v).modq().equals(_ZERO);
-    }
-
-    function _xrecover(y) {
-        var ysquared = y.sqr();
-        var xx = ysquared.minus(_ONE).divide(_ONE.plus(_D.times(ysquared)));
-        var x = xx.pow(_RECOVERY_EXPONENT);
-        if (!(x.times(x).minus(xx).equals(_ZERO))) {
-            x = x.times(_I);
-        }
-        if (x.isOdd()) {
-            x = _Q.minus(x);
-        }
-        return x;
-    }
-
-    function _x_pt_add(pt1, pt2) {
-        var x1 = pt1[0];
-        var y1 = pt1[1];
-        var z1 = pt1[2];
-        var t1 = pt1[3];
-        var x2 = pt2[0];
-        var y2 = pt2[1];
-        var z2 = pt2[2];
-        var t2 = pt2[3];
-        var A = y1.minus(x1).times(y2.plus(x2));
-        var B = y1.plus(x1).times(y2.minus(x2));
-        var C = z1.times(_TWO).times(t2);
-        var D = t1.times(_TWO).times(z2);
-        var E = D.plus(C);
-        var F = B.minus(A);
-        var G = B.plus(A);
-        var H = D.minus(C);
-        return [E.times(F), G.times(H), F.times(G), E.times(H)];
-    }
-
-    function _xpt_double(pt1) {
-        var x1 = pt1[0];
-        var y1 = pt1[1];
-        var z1 = pt1[2];
-        var A = x1.times(x1);
-        var B = y1.times(y1);
-        var C = _TWO.times(z1).times(z1);
-        var D = _Q.minus(A);
-        var J = x1.plus(y1);
-        var E = J.times(J).minus(A).minus(B);
-        var G = D.plus(B);
-        var F = G.minus(C);
-        var H = D.minus(B);
-        return [E.times(F), G.times(H), F.times(G), E.times(H)];
-    }
-
-    function _xpt_mult(pt, n) {
-        if (n.equals(_ZERO)) {
-            return [_ZERO, _ONE, _ONE, _ZERO];
-        }
-        var odd = n.isOdd();
-        n.shiftRight(1);
-        var value = _xpt_double(_xpt_mult(pt, n));
-        return odd ? _x_pt_add(value, pt) : value;
-    }
-
-    function _pt_xform(pt) {
-        var x = pt[0];
-        var y = pt[1];
-        return [x, y, _ONE, x.times(y)];
-    }
-
-    function _pt_unxform(pt) {
-        var x = pt[0];
-        var y = pt[1];
-        var z = pt[2];
-        var invz = z.inv();
-        return [x.times(invz), y.times(invz)];
-    }
-
-    function _scalarmult(pt, n) {
-        return _pt_unxform(_xpt_mult(_pt_xform(pt), n));
-    }
-
-    function _bytesgetbit(bytes, n) {
-        return (bytes[bytes.length - (n >>> 3) - 1] >> (n & 7)) & 1;
-    }
-
-    function _xpt_mult_bytes(pt, bytes) {
-        var r = [_ZERO, _ONE, _ONE, _ZERO];
-        for (var i = (bytes.length << 3) - 1; i >= 0; i--) {
-            r = _xpt_double(r);
-            if (_bytesgetbit(bytes, i) === 1) {
-                r = _x_pt_add(r, pt);
-            }
-        }
-        return r;
-    }
-
-    function _scalarmultBytes(pt, bytes) {
-        return _pt_unxform(_xpt_mult_bytes(_pt_xform(pt), bytes));
-    }
-
-    var _by = _bi255(4).divide(_bi255(5));
-    var _bx = _xrecover(_by);
-    var _bp = [_bx, _by];
-
-    function _encodeint(n) {
-        return n.bytes(32).reverse();
-    }
-    function _decodeint(b) {
-        return _bi255(b.slice(0).reverse());
-    }
-
-    function _encodepoint(p) {
-        var v = _encodeint(p[1]);
-        if (p[0].isOdd()) {
-            v[31] |= 0x80;
-        }
-        return v;
-    }
-
-    function _decodepoint(v) {
-        v = v.slice(0);
-        var signbit = v[31] >> 7;
-        v[31] &= 127;
-        var y = _decodeint(v);
-        var x = _xrecover(y);
-        if ((x.n[0] & 1) !== signbit) {
-            x = _Q.minus(x);
-        }
-        var p = [x, y];
-        if (!_isoncurve(p)) {
-            throw ('Point is not on curve');
-        }
-        return p;
-    }
-
-    // //////////////////////////////////////////////////
-
-    /**
-     * Factory function to create a suitable BigInteger.
-     *
-     * @param value
-     *     The value for the big integer.
-     * @param base {integer}
-     *     Base of the conversion of elements in ``value``.
-     * @returns
-     *     A BigInteger object.
-     */
-    function _bi(value, base) {
-        if (base !== undefined) {
-            if (base === 256) {
-                return _bi(utils.string2bytes(value));
-            }
-            return new BigInteger(value, base);
-        } else if (typeof value === 'string') {
-            return new BigInteger(value, 10);
-        } else if ((value instanceof Array) || (value instanceof Uint8Array)
-          || Buffer.isBuffer(value)) {
-            return new BigInteger(value);
-        } else if (typeof value === 'number') {
-            return new BigInteger(value.toString(), 10);
-        } else {
-            throw "Can't convert " + value + " to BigInteger";
-        }
-    }
-
-    function _bi2bytes(n, cnt) {
-        if (cnt === undefined) {
-            cnt = (n.bitLength() + 7) >>> 3;
-        }
-        var bytes = new Array(cnt);
-        for (var i = cnt - 1; i >= 0; i--) {
-            bytes[i] = n[0] & 255; // n.and(0xff);
-            n = n.shiftRight(8);
-        }
-        return bytes;
-    }
-
-    BigInteger.prototype.bytes = function(n) {
-        return _bi2bytes(this, n);
-    };
-
-    // /////////////////////////////////////////////////////////
-
-    function _bytehash(s) {
-        var sha = crypto.createHash('sha512').update(s).digest();
-        return _bi2bytes(_bi(sha), 64).reverse();
-    }
-
-    function _stringhash(s) {
-        var sha = crypto.createHash('sha512').update(s).digest();
-        return _map(_chr, _bi2bytes(_bi(sha), 64)).join('');
-    }
-
-    function _inthash(s) {
-        // Need a leading 0 to prevent sign extension
-        return _bi([0].concat(_bytehash(s)));
-    }
-
-    function _inthash_lo(s) {
-        return _bi255(_bytehash(s).slice(32, 64));
-    }
-
-    function _inthash_mod_l(s) {
-        return _inthash(s).mod(_L_BI);
-    }
-
-    function _get_a(sk) {
-        var a = _inthash_lo(sk);
-        a.n[0] &= 0xfff8;
-        a.n[15] &= 0x3fff;
-        a.n[15] |= 0x4000;
-        return a;
-    }
-
-    function _publickey(sk) {
-        return _encodepoint(_scalarmult(_bp, _get_a(sk)));
-    }
-
-    function _map(f, l) {
-        var result = new Array(l.length);
-        for (var i = 0; i < l.length; i++) {
-            result[i] = f(l[i]);
-        }
-        return result;
-    }
-
-    function _chr(n) {
-        return String.fromCharCode(n);
-    }
-
-    function _ord(c) {
-        return c.charCodeAt(0);
-    }
-
-    function _pt_add(p1, p2) {
-        return _pt_unxform(_x_pt_add(_pt_xform(p1), _pt_xform(p2)));
-    }
-
-
-    // Exports for the API.
-
-    /**
-     * Checks whether a point is on the curve.
-     *
-     * @function
-     * @param point {string}
-     *     The point to check for in a byte string representation.
-     * @returns {boolean}
-     *     true if the point is on the curve, false otherwise.
-     */
-    ns.isOnCurve = function(point) {
-        try {
-            _isoncurve(_decodepoint(utils.string2bytes(point)));
-        } catch(e) {
-            if (e === 'Point is not on curve') {
-                return false;
-            } else {
-                throw e;
-            }
-        }
-        return true;
-    };
-
-
-    /**
-     * Computes the EdDSA public key.
-     *
-     * <p>Note: Seeds should be a byte string, not a unicode string containing
-     * multi-byte characters.</p>
-     *
-     * @function
-     * @param keySeed {string}
-     *     Private key seed in the form of a byte string.
-     * @returns {string}
-     *     Public key as byte string computed from the private key seed
-     *     (32 bytes).
-     */
-    ns.publicKey = function(keySeed) {
-        return utils.bytes2string(_publickey(keySeed));
-    };
-
-
-    /**
-     * Computes an EdDSA signature of a message.
-     *
-     * <p>Notes:</p>
-     *
-     * <ul>
-     *   <li>Unicode messages need to be converted to a byte representation
-     *   (e. g. UTF-8).</li>
-     *   <li>If `publicKey` is given, and it is *not* a point of the curve,
-     *   the signature will be faulty, but no error will be thrown.</li>
-     * </ul>
-     *
-     * @function
-     * @param message {string}
-     *     Message in the form of a byte string.
-     * @param keySeed {string}
-     *     Private key seed in the form of a byte string.
-     * @param publicKey {string}
-     *     Public key as byte string (if not present, it will be computed from
-     *     the private key seed).
-     * @returns {string}
-     *     Detached message signature in the form of a byte string (64 bytes).
-     */
-    ns.sign = function(message, keySeed, publicKey) {
-        if (publicKey === undefined) {
-            publicKey = _publickey(keySeed);
-        } else {
-            publicKey = utils.string2bytes(publicKey);
-        }
-        var a = _bi(_get_a(keySeed).toString(), 16);
-        var hs = _stringhash(keySeed);
-        var r = _bytehash(hs.slice(32, 64) + message);
-        var rp = _scalarmultBytes(_bp, r);
-        var erp = _encodepoint(rp);
-        r = _bi(r).mod(_bi(1, 10).shiftLeft(512));
-        var s = _map(_chr, erp).join('') + _map(_chr, publicKey).join('') + message;
-        s = _inthash_mod_l(s).multiply(a).add(r).mod(_L_BI);
-        return utils.bytes2string(erp.concat(_encodeint(s)));
-    };
-
-
-    /**
-     * Verifies an EdDSA signature of a message with the public key.
-     *
-     * <p>Note: Unicode messages need to be converted to a byte representation
-     * (e. g. UTF-8).</p>
-     *
-     * @function
-     * @param signature {string}
-     *     Message signature in the form of a byte string. Can be detached
-     *     (64 bytes), or attached to be sliced off.
-     * @param message {string}
-     *     Message in the form of a byte string.
-     * @param publicKey {string}
-     *     Public key as byte string (if not present, it will be computed from
-     *     the private key seed).
-     * @returns {boolean}
-     *     true, if the signature verifies.
-     */
-    ns.verify = function(signature, message, publicKey) {
-        signature = utils.string2bytes(signature.slice(0, 64));
-        publicKey = utils.string2bytes(publicKey);
-        var rpe = signature.slice(0, 32);
-        var rp = _decodepoint(rpe);
-        var a = _decodepoint(publicKey);
-        var s = _decodeint(signature.slice(32, 64));
-        var h = _inthash(utils.bytes2string(rpe.concat(publicKey)) + message);
-        var v1 = _scalarmult(_bp, s);
-        var value = _scalarmultBytes(a, _bi2bytes(h));
-        var v2 = _pt_add(rp, value);
-        return v1[0].equals(v2[0]) && v1[1].equals(v2[1]);
-    };
-
-
-    /**
-     * Generates a new random private key seed of 32 bytes length (256 bit).
-     *
-     * @function
-     * @returns {string}
-     *     Byte string containing a new random private key seed.
-     */
-    ns.generateKeySeed = function() {
-        return core.generateKey(false);
-    };
-
-module.exports = ns;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/utils.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/utils.js
deleted file mode 100644
index c795231ad7a74067fcc7d630faa2cf3224877460..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/lib/utils.js
+++ /dev/null
@@ -1,198 +0,0 @@
-"use strict";
-/**
- * @fileOverview
- * A collection of general utility functions..
- */
-
-/*
- * Copyright (c) 2011, 2012, 2014 Ron Garret
- * Copyright (c) 2007, 2013, 2014 Michele Bini
- * Copyright (c) 2014 Mega Limited
- * under the MIT License.
- *
- * Authors: Guy K. Kloss, Michele Bini, Ron Garret
- *
- * You should have received a copy of the license along with this program.
- */
-
-var core = require('./core');
-
-    /**
-     * @exports jodid25519/utils
-     * A collection of general utility functions..
-     *
-     * @description
-     * A collection of general utility functions..
-     */
-    var ns = {};
-
-    var _HEXCHARS = "0123456789abcdef";
-
-    function _hexencode(vector) {
-        var result = [];
-        for (var i = vector.length - 1; i >= 0; i--) {
-            var value = vector[i];
-            result.push(_HEXCHARS.substr((value >>> 12) & 0x0f, 1));
-            result.push(_HEXCHARS.substr((value >>> 8) & 0x0f, 1));
-            result.push(_HEXCHARS.substr((value >>> 4) & 0x0f, 1));
-            result.push(_HEXCHARS.substr(value & 0x0f, 1));
-        }
-        return result.join('');
-    }
-
-    function _hexdecode(vector) {
-        var result = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
-        for (var i = vector.length - 1, l = 0; i >= 0; i -= 4) {
-            result[l] = (_HEXCHARS.indexOf(vector.charAt(i)))
-                      | (_HEXCHARS.indexOf(vector.charAt(i - 1)) << 4)
-                      | (_HEXCHARS.indexOf(vector.charAt(i - 2)) << 8)
-                      | (_HEXCHARS.indexOf(vector.charAt(i - 3)) << 12);
-            l++;
-        }
-        return result;
-    }
-
-    var _BASE32CHARS = "abcdefghijklmnopqrstuvwxyz234567";
-
-    var _BASE32VALUES = (function () {
-        var result = {};
-        for (var i = 0; i < _BASE32CHARS.length; i++) {
-            result[_BASE32CHARS.charAt(i)] = i;
-        }
-        return result;
-    })();
-
-    function _base32encode(n) {
-        var c;
-        var r = "";
-        for (c = 0; c < 255; c += 5) {
-            r = _BASE32CHARS.substr(core.getbit(n, c)
-                                    + (core.getbit(n, c + 1) << 1)
-                                    + (core.getbit(n, c + 2) << 2)
-                                    + (core.getbit(n, c + 3) << 3)
-                                    + (core.getbit(n, c + 4) << 4), 1)
-                                    + r;
-        }
-        return r;
-    }
-
-    function _base32decode(n) {
-        var c = 0;
-        var r = core.ZERO();
-        var l = n.length;
-        for (c = 0; (l > 0) && (c < 255); c += 5) {
-            l--;
-            var v = _BASE32VALUES[n.substr(l, 1)];
-            core.setbit(r, c, v & 1);
-            v >>= 1;
-            core.setbit(r, c + 1, v & 1);
-            v >>= 1;
-            core.setbit(r, c + 2, v & 1);
-            v >>= 1;
-            core.setbit(r, c + 3, v & 1);
-            v >>= 1;
-            core.setbit(r, c + 4, v & 1);
-           }
-        return r;
-    }
-
-    function _map(f, l) {
-        var result = new Array(l.length);
-        for (var i = 0; i < l.length; i++) {
-            result[i] = f(l[i]);
-        }
-        return result;
-    }
-
-    function _chr(n) {
-        return String.fromCharCode(n);
-    }
-
-    function _ord(c) {
-        return c.charCodeAt(0);
-    }
-
-    function _bytes2string(bytes) {
-        return _map(_chr, bytes).join('');
-    }
-
-    function _string2bytes(s) {
-        return _map(_ord, s);
-    }
-
-
-    // Expose some functions to the outside through this name space.
-
-    /**
-     * Encodes an array of unsigned 8-bit integers to a hex string.
-     *
-     * @function
-     * @param vector {array}
-     *     Array containing the byte values.
-     * @returns {string}
-     *     String containing vector in a hexadecimal representation.
-     */
-    ns.hexEncode = _hexencode;
-
-
-    /**
-     * Decodes a hex string to an array of unsigned 8-bit integers.
-     *
-     * @function
-     * @param vector {string}
-     *     String containing vector in a hexadecimal representation.
-     * @returns {array}
-     *     Array containing the byte values.
-     */
-    ns.hexDecode = _hexdecode;
-
-
-    /**
-     * Encodes an array of unsigned 8-bit integers using base32 encoding.
-     *
-     * @function
-     * @param vector {array}
-     *     Array containing the byte values.
-     * @returns {string}
-     *     String containing vector in a hexadecimal representation.
-     */
-    ns.base32encode = _base32encode;
-
-
-    /**
-     * Decodes a base32 encoded string to an array of unsigned 8-bit integers.
-     *
-     * @function
-     * @param vector {string}
-     *     String containing vector in a hexadecimal representation.
-     * @returns {array}
-     *     Array containing the byte values.
-     */
-    ns.base32decode = _base32decode;
-
-
-    /**
-     * Converts an unsigned 8-bit integer array representation to a byte string.
-     *
-     * @function
-     * @param vector {array}
-     *     Array containing the byte values.
-     * @returns {string}
-     *     Byte string representation of vector.
-     */
-    ns.bytes2string = _bytes2string;
-
-
-    /**
-     * Converts a byte string representation to an array of unsigned
-     * 8-bit integers.
-     *
-     * @function
-     * @param vector {array}
-     *     Array containing the byte values.
-     * @returns {string}
-     *     Byte string representation of vector.
-     */
-    ns.string2bytes = _string2bytes;
-
-module.exports = ns;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/package.json
deleted file mode 100644
index 25669f7944e3f24aa78b2fbba5cf70d4a8385abc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jodid25519/package.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "_from": "jodid25519@>=1.0.0 <2.0.0",
-  "_id": "jodid25519@1.0.2",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/sshpk/jodid25519",
-  "_nodeVersion": "4.1.1",
-  "_npmUser": {
-    "email": "alex@cooperi.net",
-    "name": "arekinath"
-  },
-  "_npmVersion": "2.14.4",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature/sshpk"
-  ],
-  "_resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz",
-  "_shasum": "06d4912255093419477d425633606e0e90782967",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "Michele Bini, Ron Garret, Guy K. Kloss"
-  },
-  "bugs": {
-    "url": "https://github.com/meganz/jodid25519/issues"
-  },
-  "dependencies": {
-    "jsbn": "~0.1.0"
-  },
-  "description": "jodid25519 - Curve 25519-based cryptography",
-  "devDependencies": {
-    "almond": "~0.3.1",
-    "chai": "^3.0.0",
-    "dateformat": "~1.0.7-1.2.3",
-    "ibrik": "~2.0.0",
-    "istanbul": "~0.3.5",
-    "jsdoc": "<=3.3.0",
-    "mocha": "~2.0.1",
-    "sinon": "~1.10.3",
-    "sinon-chai": "^2.8.0"
-  },
-  "directories": {
-    "doc": "doc",
-    "src": "src",
-    "test": "test"
-  },
-  "dist": {
-    "shasum": "06d4912255093419477d425633606e0e90782967",
-    "tarball": "http://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz"
-  },
-  "gitHead": "a83b9fcf7fd3be4f27cd4a57817aff171c7cd918",
-  "homepage": "https://github.com/meganz/jodid25519",
-  "keywords": [
-    "Curve25519",
-    "ECDH",
-    "ECDSA",
-    "Ed25519",
-    "EdDSA",
-    "encryption",
-    "signing"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "arekinath",
-      "email": "alex@cooperi.net"
-    }
-  ],
-  "name": "jodid25519",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/meganz/jodid25519.git"
-  },
-  "scripts": {
-    "test": "mocha test/*_test.js"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/.npmignore
deleted file mode 100644
index 28f1ba7565f46fb5074ad9a4f07c4cfc86dff4cc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-node_modules
-.DS_Store
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/LICENSE
deleted file mode 100644
index 2a6457e9ef1e09a1d78e99f787f160ef5670c194..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/LICENSE
+++ /dev/null
@@ -1,40 +0,0 @@
-Licensing
----------
-
-This software is covered under the following copyright:
-
-/*
- * Copyright (c) 2003-2005  Tom Wu
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be
- * included in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
- * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
- * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
- *
- * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
- * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
- * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- * In addition, the following condition applies:
- *
- * All redistributions must retain an intact copy of this copyright notice
- * and disclaimer.
- */
-
-Address all questions regarding this license to:
-
-  Tom Wu
-  tjw@cs.Stanford.EDU
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/README.md
deleted file mode 100644
index 7aac67f53ff0efb15f648e7e664a8773aa0045e2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/README.md
+++ /dev/null
@@ -1,175 +0,0 @@
-# jsbn: javascript big number
-
-[Tom Wu's Original Website](http://www-cs-students.stanford.edu/~tjw/jsbn/)
-
-I felt compelled to put this on github and publish to npm. I haven't tested every other big integer library out there, but the few that I have tested in comparison to this one have not even come close in performance. I am aware of the `bi` module on npm, however it has been modified and I wanted to publish the original without modifications. This is jsbn and jsbn2 from Tom Wu's original website above, with the modular pattern applied to prevent global leaks and to allow for use with node.js on the server side.
-
-## usage
-
-    var BigInteger = require('jsbn');
-    
-    var a = new BigInteger('91823918239182398123');
-    alert(a.bitLength()); // 67
-
-
-## API
-
-### bi.toString()
-
-returns the base-10 number as a string
-
-### bi.negate()
-
-returns a new BigInteger equal to the negation of `bi`
-
-### bi.abs
-
-returns new BI of absolute value
-
-### bi.compareTo
-
-
-
-### bi.bitLength
-
-
-
-### bi.mod
-
-
-
-### bi.modPowInt
-
-
-
-### bi.clone
-
-
-
-### bi.intValue
-
-
-
-### bi.byteValue
-
-
-
-### bi.shortValue
-
-
-
-### bi.signum
-
-
-
-### bi.toByteArray
-
-
-
-### bi.equals
-
-
-
-### bi.min
-
-
-
-### bi.max
-
-
-
-### bi.and
-
-
-
-### bi.or
-
-
-
-### bi.xor
-
-
-
-### bi.andNot
-
-
-
-### bi.not
-
-
-
-### bi.shiftLeft
-
-
-
-### bi.shiftRight
-
-
-
-### bi.getLowestSetBit
-
-
-
-### bi.bitCount
-
-
-
-### bi.testBit
-
-
-
-### bi.setBit
-
-
-
-### bi.clearBit
-
-
-
-### bi.flipBit
-
-
-
-### bi.add
-
-
-
-### bi.subtract
-
-
-
-### bi.multiply
-
-
-
-### bi.divide
-
-
-
-### bi.remainder
-
-
-
-### bi.divideAndRemainder
-
-
-
-### bi.modPow
-
-
-
-### bi.modInverse
-
-
-
-### bi.pow
-
-
-
-### bi.gcd
-
-
-
-### bi.isProbablePrime
-
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/example.html b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/example.html
deleted file mode 100644
index 7c26a5665c1b1a77278525007e2563226dcceb60..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/example.html
+++ /dev/null
@@ -1,12 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-    <head>
-        <meta charset="utf-8">
-        <title></title>
-    </head>
-    <body>
-        
-        
-        <script src="index.js"></script>
-    </body>
-</html>
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/example.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/example.js
deleted file mode 100644
index 664c1b455bd77e2161a333b69c8dc7f2c498c519..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/example.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var BigInteger = require('./');
-var a = new BigInteger('91823918239182398123');
-console.log(a.bitLength());
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/index.js
deleted file mode 100644
index e32fe13d860085c379a72946022227df502b2b33..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/index.js
+++ /dev/null
@@ -1,1358 +0,0 @@
-(function(){
-
-    // Copyright (c) 2005  Tom Wu
-    // All Rights Reserved.
-    // See "LICENSE" for details.
-
-    // Basic JavaScript BN library - subset useful for RSA encryption.
-
-    // Bits per digit
-    var dbits;
-
-    // JavaScript engine analysis
-    var canary = 0xdeadbeefcafe;
-    var j_lm = ((canary&0xffffff)==0xefcafe);
-
-    // (public) Constructor
-    function BigInteger(a,b,c) {
-      if(a != null)
-        if("number" == typeof a) this.fromNumber(a,b,c);
-        else if(b == null && "string" != typeof a) this.fromString(a,256);
-        else this.fromString(a,b);
-    }
-
-    // return new, unset BigInteger
-    function nbi() { return new BigInteger(null); }
-
-    // am: Compute w_j += (x*this_i), propagate carries,
-    // c is initial carry, returns final carry.
-    // c < 3*dvalue, x < 2*dvalue, this_i < dvalue
-    // We need to select the fastest one that works in this environment.
-
-    // am1: use a single mult and divide to get the high bits,
-    // max digit bits should be 26 because
-    // max internal value = 2*dvalue^2-2*dvalue (< 2^53)
-    function am1(i,x,w,j,c,n) {
-      while(--n >= 0) {
-        var v = x*this[i++]+w[j]+c;
-        c = Math.floor(v/0x4000000);
-        w[j++] = v&0x3ffffff;
-      }
-      return c;
-    }
-    // am2 avoids a big mult-and-extract completely.
-    // Max digit bits should be <= 30 because we do bitwise ops
-    // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
-    function am2(i,x,w,j,c,n) {
-      var xl = x&0x7fff, xh = x>>15;
-      while(--n >= 0) {
-        var l = this[i]&0x7fff;
-        var h = this[i++]>>15;
-        var m = xh*l+h*xl;
-        l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);
-        c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
-        w[j++] = l&0x3fffffff;
-      }
-      return c;
-    }
-    // Alternately, set max digit bits to 28 since some
-    // browsers slow down when dealing with 32-bit numbers.
-    function am3(i,x,w,j,c,n) {
-      var xl = x&0x3fff, xh = x>>14;
-      while(--n >= 0) {
-        var l = this[i]&0x3fff;
-        var h = this[i++]>>14;
-        var m = xh*l+h*xl;
-        l = xl*l+((m&0x3fff)<<14)+w[j]+c;
-        c = (l>>28)+(m>>14)+xh*h;
-        w[j++] = l&0xfffffff;
-      }
-      return c;
-    }
-    var inBrowser = typeof navigator !== "undefined";
-    if(inBrowser && j_lm && (navigator.appName == "Microsoft Internet Explorer")) {
-      BigInteger.prototype.am = am2;
-      dbits = 30;
-    }
-    else if(inBrowser && j_lm && (navigator.appName != "Netscape")) {
-      BigInteger.prototype.am = am1;
-      dbits = 26;
-    }
-    else { // Mozilla/Netscape seems to prefer am3
-      BigInteger.prototype.am = am3;
-      dbits = 28;
-    }
-
-    BigInteger.prototype.DB = dbits;
-    BigInteger.prototype.DM = ((1<<dbits)-1);
-    BigInteger.prototype.DV = (1<<dbits);
-
-    var BI_FP = 52;
-    BigInteger.prototype.FV = Math.pow(2,BI_FP);
-    BigInteger.prototype.F1 = BI_FP-dbits;
-    BigInteger.prototype.F2 = 2*dbits-BI_FP;
-
-    // Digit conversions
-    var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
-    var BI_RC = new Array();
-    var rr,vv;
-    rr = "0".charCodeAt(0);
-    for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
-    rr = "a".charCodeAt(0);
-    for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
-    rr = "A".charCodeAt(0);
-    for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
-
-    function int2char(n) { return BI_RM.charAt(n); }
-    function intAt(s,i) {
-      var c = BI_RC[s.charCodeAt(i)];
-      return (c==null)?-1:c;
-    }
-
-    // (protected) copy this to r
-    function bnpCopyTo(r) {
-      for(var i = this.t-1; i >= 0; --i) r[i] = this[i];
-      r.t = this.t;
-      r.s = this.s;
-    }
-
-    // (protected) set from integer value x, -DV <= x < DV
-    function bnpFromInt(x) {
-      this.t = 1;
-      this.s = (x<0)?-1:0;
-      if(x > 0) this[0] = x;
-      else if(x < -1) this[0] = x+this.DV;
-      else this.t = 0;
-    }
-
-    // return bigint initialized to value
-    function nbv(i) { var r = nbi(); r.fromInt(i); return r; }
-
-    // (protected) set from string and radix
-    function bnpFromString(s,b) {
-      var k;
-      if(b == 16) k = 4;
-      else if(b == 8) k = 3;
-      else if(b == 256) k = 8; // byte array
-      else if(b == 2) k = 1;
-      else if(b == 32) k = 5;
-      else if(b == 4) k = 2;
-      else { this.fromRadix(s,b); return; }
-      this.t = 0;
-      this.s = 0;
-      var i = s.length, mi = false, sh = 0;
-      while(--i >= 0) {
-        var x = (k==8)?s[i]&0xff:intAt(s,i);
-        if(x < 0) {
-          if(s.charAt(i) == "-") mi = true;
-          continue;
-        }
-        mi = false;
-        if(sh == 0)
-          this[this.t++] = x;
-        else if(sh+k > this.DB) {
-          this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;
-          this[this.t++] = (x>>(this.DB-sh));
-        }
-        else
-          this[this.t-1] |= x<<sh;
-        sh += k;
-        if(sh >= this.DB) sh -= this.DB;
-      }
-      if(k == 8 && (s[0]&0x80) != 0) {
-        this.s = -1;
-        if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;
-      }
-      this.clamp();
-      if(mi) BigInteger.ZERO.subTo(this,this);
-    }
-
-    // (protected) clamp off excess high words
-    function bnpClamp() {
-      var c = this.s&this.DM;
-      while(this.t > 0 && this[this.t-1] == c) --this.t;
-    }
-
-    // (public) return string representation in given radix
-    function bnToString(b) {
-      if(this.s < 0) return "-"+this.negate().toString(b);
-      var k;
-      if(b == 16) k = 4;
-      else if(b == 8) k = 3;
-      else if(b == 2) k = 1;
-      else if(b == 32) k = 5;
-      else if(b == 4) k = 2;
-      else return this.toRadix(b);
-      var km = (1<<k)-1, d, m = false, r = "", i = this.t;
-      var p = this.DB-(i*this.DB)%k;
-      if(i-- > 0) {
-        if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }
-        while(i >= 0) {
-          if(p < k) {
-            d = (this[i]&((1<<p)-1))<<(k-p);
-            d |= this[--i]>>(p+=this.DB-k);
-          }
-          else {
-            d = (this[i]>>(p-=k))&km;
-            if(p <= 0) { p += this.DB; --i; }
-          }
-          if(d > 0) m = true;
-          if(m) r += int2char(d);
-        }
-      }
-      return m?r:"0";
-    }
-
-    // (public) -this
-    function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }
-
-    // (public) |this|
-    function bnAbs() { return (this.s<0)?this.negate():this; }
-
-    // (public) return + if this > a, - if this < a, 0 if equal
-    function bnCompareTo(a) {
-      var r = this.s-a.s;
-      if(r != 0) return r;
-      var i = this.t;
-      r = i-a.t;
-      if(r != 0) return (this.s<0)?-r:r;
-      while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;
-      return 0;
-    }
-
-    // returns bit length of the integer x
-    function nbits(x) {
-      var r = 1, t;
-      if((t=x>>>16) != 0) { x = t; r += 16; }
-      if((t=x>>8) != 0) { x = t; r += 8; }
-      if((t=x>>4) != 0) { x = t; r += 4; }
-      if((t=x>>2) != 0) { x = t; r += 2; }
-      if((t=x>>1) != 0) { x = t; r += 1; }
-      return r;
-    }
-
-    // (public) return the number of bits in "this"
-    function bnBitLength() {
-      if(this.t <= 0) return 0;
-      return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));
-    }
-
-    // (protected) r = this << n*DB
-    function bnpDLShiftTo(n,r) {
-      var i;
-      for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];
-      for(i = n-1; i >= 0; --i) r[i] = 0;
-      r.t = this.t+n;
-      r.s = this.s;
-    }
-
-    // (protected) r = this >> n*DB
-    function bnpDRShiftTo(n,r) {
-      for(var i = n; i < this.t; ++i) r[i-n] = this[i];
-      r.t = Math.max(this.t-n,0);
-      r.s = this.s;
-    }
-
-    // (protected) r = this << n
-    function bnpLShiftTo(n,r) {
-      var bs = n%this.DB;
-      var cbs = this.DB-bs;
-      var bm = (1<<cbs)-1;
-      var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;
-      for(i = this.t-1; i >= 0; --i) {
-        r[i+ds+1] = (this[i]>>cbs)|c;
-        c = (this[i]&bm)<<bs;
-      }
-      for(i = ds-1; i >= 0; --i) r[i] = 0;
-      r[ds] = c;
-      r.t = this.t+ds+1;
-      r.s = this.s;
-      r.clamp();
-    }
-
-    // (protected) r = this >> n
-    function bnpRShiftTo(n,r) {
-      r.s = this.s;
-      var ds = Math.floor(n/this.DB);
-      if(ds >= this.t) { r.t = 0; return; }
-      var bs = n%this.DB;
-      var cbs = this.DB-bs;
-      var bm = (1<<bs)-1;
-      r[0] = this[ds]>>bs;
-      for(var i = ds+1; i < this.t; ++i) {
-        r[i-ds-1] |= (this[i]&bm)<<cbs;
-        r[i-ds] = this[i]>>bs;
-      }
-      if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;
-      r.t = this.t-ds;
-      r.clamp();
-    }
-
-    // (protected) r = this - a
-    function bnpSubTo(a,r) {
-      var i = 0, c = 0, m = Math.min(a.t,this.t);
-      while(i < m) {
-        c += this[i]-a[i];
-        r[i++] = c&this.DM;
-        c >>= this.DB;
-      }
-      if(a.t < this.t) {
-        c -= a.s;
-        while(i < this.t) {
-          c += this[i];
-          r[i++] = c&this.DM;
-          c >>= this.DB;
-        }
-        c += this.s;
-      }
-      else {
-        c += this.s;
-        while(i < a.t) {
-          c -= a[i];
-          r[i++] = c&this.DM;
-          c >>= this.DB;
-        }
-        c -= a.s;
-      }
-      r.s = (c<0)?-1:0;
-      if(c < -1) r[i++] = this.DV+c;
-      else if(c > 0) r[i++] = c;
-      r.t = i;
-      r.clamp();
-    }
-
-    // (protected) r = this * a, r != this,a (HAC 14.12)
-    // "this" should be the larger one if appropriate.
-    function bnpMultiplyTo(a,r) {
-      var x = this.abs(), y = a.abs();
-      var i = x.t;
-      r.t = i+y.t;
-      while(--i >= 0) r[i] = 0;
-      for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);
-      r.s = 0;
-      r.clamp();
-      if(this.s != a.s) BigInteger.ZERO.subTo(r,r);
-    }
-
-    // (protected) r = this^2, r != this (HAC 14.16)
-    function bnpSquareTo(r) {
-      var x = this.abs();
-      var i = r.t = 2*x.t;
-      while(--i >= 0) r[i] = 0;
-      for(i = 0; i < x.t-1; ++i) {
-        var c = x.am(i,x[i],r,2*i,0,1);
-        if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {
-          r[i+x.t] -= x.DV;
-          r[i+x.t+1] = 1;
-        }
-      }
-      if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);
-      r.s = 0;
-      r.clamp();
-    }
-
-    // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
-    // r != q, this != m.  q or r may be null.
-    function bnpDivRemTo(m,q,r) {
-      var pm = m.abs();
-      if(pm.t <= 0) return;
-      var pt = this.abs();
-      if(pt.t < pm.t) {
-        if(q != null) q.fromInt(0);
-        if(r != null) this.copyTo(r);
-        return;
-      }
-      if(r == null) r = nbi();
-      var y = nbi(), ts = this.s, ms = m.s;
-      var nsh = this.DB-nbits(pm[pm.t-1]);   // normalize modulus
-      if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }
-      else { pm.copyTo(y); pt.copyTo(r); }
-      var ys = y.t;
-      var y0 = y[ys-1];
-      if(y0 == 0) return;
-      var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);
-      var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;
-      var i = r.t, j = i-ys, t = (q==null)?nbi():q;
-      y.dlShiftTo(j,t);
-      if(r.compareTo(t) >= 0) {
-        r[r.t++] = 1;
-        r.subTo(t,r);
-      }
-      BigInteger.ONE.dlShiftTo(ys,t);
-      t.subTo(y,y);  // "negative" y so we can replace sub with am later
-      while(y.t < ys) y[y.t++] = 0;
-      while(--j >= 0) {
-        // Estimate quotient digit
-        var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);
-        if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) {   // Try it out
-          y.dlShiftTo(j,t);
-          r.subTo(t,r);
-          while(r[i] < --qd) r.subTo(t,r);
-        }
-      }
-      if(q != null) {
-        r.drShiftTo(ys,q);
-        if(ts != ms) BigInteger.ZERO.subTo(q,q);
-      }
-      r.t = ys;
-      r.clamp();
-      if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder
-      if(ts < 0) BigInteger.ZERO.subTo(r,r);
-    }
-
-    // (public) this mod a
-    function bnMod(a) {
-      var r = nbi();
-      this.abs().divRemTo(a,null,r);
-      if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);
-      return r;
-    }
-
-    // Modular reduction using "classic" algorithm
-    function Classic(m) { this.m = m; }
-    function cConvert(x) {
-      if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
-      else return x;
-    }
-    function cRevert(x) { return x; }
-    function cReduce(x) { x.divRemTo(this.m,null,x); }
-    function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
-    function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
-
-    Classic.prototype.convert = cConvert;
-    Classic.prototype.revert = cRevert;
-    Classic.prototype.reduce = cReduce;
-    Classic.prototype.mulTo = cMulTo;
-    Classic.prototype.sqrTo = cSqrTo;
-
-    // (protected) return "-1/this % 2^DB"; useful for Mont. reduction
-    // justification:
-    //         xy == 1 (mod m)
-    //         xy =  1+km
-    //   xy(2-xy) = (1+km)(1-km)
-    // x[y(2-xy)] = 1-k^2m^2
-    // x[y(2-xy)] == 1 (mod m^2)
-    // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
-    // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
-    // JS multiply "overflows" differently from C/C++, so care is needed here.
-    function bnpInvDigit() {
-      if(this.t < 1) return 0;
-      var x = this[0];
-      if((x&1) == 0) return 0;
-      var y = x&3;       // y == 1/x mod 2^2
-      y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4
-      y = (y*(2-(x&0xff)*y))&0xff;   // y == 1/x mod 2^8
-      y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;    // y == 1/x mod 2^16
-      // last step - calculate inverse mod DV directly;
-      // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
-      y = (y*(2-x*y%this.DV))%this.DV;       // y == 1/x mod 2^dbits
-      // we really want the negative inverse, and -DV < y < DV
-      return (y>0)?this.DV-y:-y;
-    }
-
-    // Montgomery reduction
-    function Montgomery(m) {
-      this.m = m;
-      this.mp = m.invDigit();
-      this.mpl = this.mp&0x7fff;
-      this.mph = this.mp>>15;
-      this.um = (1<<(m.DB-15))-1;
-      this.mt2 = 2*m.t;
-    }
-
-    // xR mod m
-    function montConvert(x) {
-      var r = nbi();
-      x.abs().dlShiftTo(this.m.t,r);
-      r.divRemTo(this.m,null,r);
-      if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);
-      return r;
-    }
-
-    // x/R mod m
-    function montRevert(x) {
-      var r = nbi();
-      x.copyTo(r);
-      this.reduce(r);
-      return r;
-    }
-
-    // x = x/R mod m (HAC 14.32)
-    function montReduce(x) {
-      while(x.t <= this.mt2) // pad x so am has enough room later
-        x[x.t++] = 0;
-      for(var i = 0; i < this.m.t; ++i) {
-        // faster way of calculating u0 = x[i]*mp mod DV
-        var j = x[i]&0x7fff;
-        var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;
-        // use am to combine the multiply-shift-add into one call
-        j = i+this.m.t;
-        x[j] += this.m.am(0,u0,x,i,0,this.m.t);
-        // propagate carry
-        while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }
-      }
-      x.clamp();
-      x.drShiftTo(this.m.t,x);
-      if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
-    }
-
-    // r = "x^2/R mod m"; x != r
-    function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
-
-    // r = "xy/R mod m"; x,y != r
-    function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
-
-    Montgomery.prototype.convert = montConvert;
-    Montgomery.prototype.revert = montRevert;
-    Montgomery.prototype.reduce = montReduce;
-    Montgomery.prototype.mulTo = montMulTo;
-    Montgomery.prototype.sqrTo = montSqrTo;
-
-    // (protected) true iff this is even
-    function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }
-
-    // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
-    function bnpExp(e,z) {
-      if(e > 0xffffffff || e < 1) return BigInteger.ONE;
-      var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;
-      g.copyTo(r);
-      while(--i >= 0) {
-        z.sqrTo(r,r2);
-        if((e&(1<<i)) > 0) z.mulTo(r2,g,r);
-        else { var t = r; r = r2; r2 = t; }
-      }
-      return z.revert(r);
-    }
-
-    // (public) this^e % m, 0 <= e < 2^32
-    function bnModPowInt(e,m) {
-      var z;
-      if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
-      return this.exp(e,z);
-    }
-
-    // protected
-    BigInteger.prototype.copyTo = bnpCopyTo;
-    BigInteger.prototype.fromInt = bnpFromInt;
-    BigInteger.prototype.fromString = bnpFromString;
-    BigInteger.prototype.clamp = bnpClamp;
-    BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
-    BigInteger.prototype.drShiftTo = bnpDRShiftTo;
-    BigInteger.prototype.lShiftTo = bnpLShiftTo;
-    BigInteger.prototype.rShiftTo = bnpRShiftTo;
-    BigInteger.prototype.subTo = bnpSubTo;
-    BigInteger.prototype.multiplyTo = bnpMultiplyTo;
-    BigInteger.prototype.squareTo = bnpSquareTo;
-    BigInteger.prototype.divRemTo = bnpDivRemTo;
-    BigInteger.prototype.invDigit = bnpInvDigit;
-    BigInteger.prototype.isEven = bnpIsEven;
-    BigInteger.prototype.exp = bnpExp;
-
-    // public
-    BigInteger.prototype.toString = bnToString;
-    BigInteger.prototype.negate = bnNegate;
-    BigInteger.prototype.abs = bnAbs;
-    BigInteger.prototype.compareTo = bnCompareTo;
-    BigInteger.prototype.bitLength = bnBitLength;
-    BigInteger.prototype.mod = bnMod;
-    BigInteger.prototype.modPowInt = bnModPowInt;
-
-    // "constants"
-    BigInteger.ZERO = nbv(0);
-    BigInteger.ONE = nbv(1);
-
-    // Copyright (c) 2005-2009  Tom Wu
-    // All Rights Reserved.
-    // See "LICENSE" for details.
-
-    // Extended JavaScript BN functions, required for RSA private ops.
-
-    // Version 1.1: new BigInteger("0", 10) returns "proper" zero
-    // Version 1.2: square() API, isProbablePrime fix
-
-    // (public)
-    function bnClone() { var r = nbi(); this.copyTo(r); return r; }
-
-    // (public) return value as integer
-    function bnIntValue() {
-      if(this.s < 0) {
-        if(this.t == 1) return this[0]-this.DV;
-        else if(this.t == 0) return -1;
-      }
-      else if(this.t == 1) return this[0];
-      else if(this.t == 0) return 0;
-      // assumes 16 < DB < 32
-      return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];
-    }
-
-    // (public) return value as byte
-    function bnByteValue() { return (this.t==0)?this.s:(this[0]<<24)>>24; }
-
-    // (public) return value as short (assumes DB>=16)
-    function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; }
-
-    // (protected) return x s.t. r^x < DV
-    function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }
-
-    // (public) 0 if this == 0, 1 if this > 0
-    function bnSigNum() {
-      if(this.s < 0) return -1;
-      else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;
-      else return 1;
-    }
-
-    // (protected) convert to radix string
-    function bnpToRadix(b) {
-      if(b == null) b = 10;
-      if(this.signum() == 0 || b < 2 || b > 36) return "0";
-      var cs = this.chunkSize(b);
-      var a = Math.pow(b,cs);
-      var d = nbv(a), y = nbi(), z = nbi(), r = "";
-      this.divRemTo(d,y,z);
-      while(y.signum() > 0) {
-        r = (a+z.intValue()).toString(b).substr(1) + r;
-        y.divRemTo(d,y,z);
-      }
-      return z.intValue().toString(b) + r;
-    }
-
-    // (protected) convert from radix string
-    function bnpFromRadix(s,b) {
-      this.fromInt(0);
-      if(b == null) b = 10;
-      var cs = this.chunkSize(b);
-      var d = Math.pow(b,cs), mi = false, j = 0, w = 0;
-      for(var i = 0; i < s.length; ++i) {
-        var x = intAt(s,i);
-        if(x < 0) {
-          if(s.charAt(i) == "-" && this.signum() == 0) mi = true;
-          continue;
-        }
-        w = b*w+x;
-        if(++j >= cs) {
-          this.dMultiply(d);
-          this.dAddOffset(w,0);
-          j = 0;
-          w = 0;
-        }
-      }
-      if(j > 0) {
-        this.dMultiply(Math.pow(b,j));
-        this.dAddOffset(w,0);
-      }
-      if(mi) BigInteger.ZERO.subTo(this,this);
-    }
-
-    // (protected) alternate constructor
-    function bnpFromNumber(a,b,c) {
-      if("number" == typeof b) {
-        // new BigInteger(int,int,RNG)
-        if(a < 2) this.fromInt(1);
-        else {
-          this.fromNumber(a,c);
-          if(!this.testBit(a-1))	// force MSB set
-            this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);
-          if(this.isEven()) this.dAddOffset(1,0); // force odd
-          while(!this.isProbablePrime(b)) {
-            this.dAddOffset(2,0);
-            if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);
-          }
-        }
-      }
-      else {
-        // new BigInteger(int,RNG)
-        var x = new Array(), t = a&7;
-        x.length = (a>>3)+1;
-        b.nextBytes(x);
-        if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;
-        this.fromString(x,256);
-      }
-    }
-
-    // (public) convert to bigendian byte array
-    function bnToByteArray() {
-      var i = this.t, r = new Array();
-      r[0] = this.s;
-      var p = this.DB-(i*this.DB)%8, d, k = 0;
-      if(i-- > 0) {
-        if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p)
-          r[k++] = d|(this.s<<(this.DB-p));
-        while(i >= 0) {
-          if(p < 8) {
-            d = (this[i]&((1<<p)-1))<<(8-p);
-            d |= this[--i]>>(p+=this.DB-8);
-          }
-          else {
-            d = (this[i]>>(p-=8))&0xff;
-            if(p <= 0) { p += this.DB; --i; }
-          }
-          if((d&0x80) != 0) d |= -256;
-          if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;
-          if(k > 0 || d != this.s) r[k++] = d;
-        }
-      }
-      return r;
-    }
-
-    function bnEquals(a) { return(this.compareTo(a)==0); }
-    function bnMin(a) { return(this.compareTo(a)<0)?this:a; }
-    function bnMax(a) { return(this.compareTo(a)>0)?this:a; }
-
-    // (protected) r = this op a (bitwise)
-    function bnpBitwiseTo(a,op,r) {
-      var i, f, m = Math.min(a.t,this.t);
-      for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]);
-      if(a.t < this.t) {
-        f = a.s&this.DM;
-        for(i = m; i < this.t; ++i) r[i] = op(this[i],f);
-        r.t = this.t;
-      }
-      else {
-        f = this.s&this.DM;
-        for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);
-        r.t = a.t;
-      }
-      r.s = op(this.s,a.s);
-      r.clamp();
-    }
-
-    // (public) this & a
-    function op_and(x,y) { return x&y; }
-    function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }
-
-    // (public) this | a
-    function op_or(x,y) { return x|y; }
-    function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }
-
-    // (public) this ^ a
-    function op_xor(x,y) { return x^y; }
-    function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }
-
-    // (public) this & ~a
-    function op_andnot(x,y) { return x&~y; }
-    function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }
-
-    // (public) ~this
-    function bnNot() {
-      var r = nbi();
-      for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i];
-      r.t = this.t;
-      r.s = ~this.s;
-      return r;
-    }
-
-    // (public) this << n
-    function bnShiftLeft(n) {
-      var r = nbi();
-      if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);
-      return r;
-    }
-
-    // (public) this >> n
-    function bnShiftRight(n) {
-      var r = nbi();
-      if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);
-      return r;
-    }
-
-    // return index of lowest 1-bit in x, x < 2^31
-    function lbit(x) {
-      if(x == 0) return -1;
-      var r = 0;
-      if((x&0xffff) == 0) { x >>= 16; r += 16; }
-      if((x&0xff) == 0) { x >>= 8; r += 8; }
-      if((x&0xf) == 0) { x >>= 4; r += 4; }
-      if((x&3) == 0) { x >>= 2; r += 2; }
-      if((x&1) == 0) ++r;
-      return r;
-    }
-
-    // (public) returns index of lowest 1-bit (or -1 if none)
-    function bnGetLowestSetBit() {
-      for(var i = 0; i < this.t; ++i)
-        if(this[i] != 0) return i*this.DB+lbit(this[i]);
-      if(this.s < 0) return this.t*this.DB;
-      return -1;
-    }
-
-    // return number of 1 bits in x
-    function cbit(x) {
-      var r = 0;
-      while(x != 0) { x &= x-1; ++r; }
-      return r;
-    }
-
-    // (public) return number of set bits
-    function bnBitCount() {
-      var r = 0, x = this.s&this.DM;
-      for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x);
-      return r;
-    }
-
-    // (public) true iff nth bit is set
-    function bnTestBit(n) {
-      var j = Math.floor(n/this.DB);
-      if(j >= this.t) return(this.s!=0);
-      return((this[j]&(1<<(n%this.DB)))!=0);
-    }
-
-    // (protected) this op (1<<n)
-    function bnpChangeBit(n,op) {
-      var r = BigInteger.ONE.shiftLeft(n);
-      this.bitwiseTo(r,op,r);
-      return r;
-    }
-
-    // (public) this | (1<<n)
-    function bnSetBit(n) { return this.changeBit(n,op_or); }
-
-    // (public) this & ~(1<<n)
-    function bnClearBit(n) { return this.changeBit(n,op_andnot); }
-
-    // (public) this ^ (1<<n)
-    function bnFlipBit(n) { return this.changeBit(n,op_xor); }
-
-    // (protected) r = this + a
-    function bnpAddTo(a,r) {
-      var i = 0, c = 0, m = Math.min(a.t,this.t);
-      while(i < m) {
-        c += this[i]+a[i];
-        r[i++] = c&this.DM;
-        c >>= this.DB;
-      }
-      if(a.t < this.t) {
-        c += a.s;
-        while(i < this.t) {
-          c += this[i];
-          r[i++] = c&this.DM;
-          c >>= this.DB;
-        }
-        c += this.s;
-      }
-      else {
-        c += this.s;
-        while(i < a.t) {
-          c += a[i];
-          r[i++] = c&this.DM;
-          c >>= this.DB;
-        }
-        c += a.s;
-      }
-      r.s = (c<0)?-1:0;
-      if(c > 0) r[i++] = c;
-      else if(c < -1) r[i++] = this.DV+c;
-      r.t = i;
-      r.clamp();
-    }
-
-    // (public) this + a
-    function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }
-
-    // (public) this - a
-    function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }
-
-    // (public) this * a
-    function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }
-
-    // (public) this^2
-    function bnSquare() { var r = nbi(); this.squareTo(r); return r; }
-
-    // (public) this / a
-    function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }
-
-    // (public) this % a
-    function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }
-
-    // (public) [this/a,this%a]
-    function bnDivideAndRemainder(a) {
-      var q = nbi(), r = nbi();
-      this.divRemTo(a,q,r);
-      return new Array(q,r);
-    }
-
-    // (protected) this *= n, this >= 0, 1 < n < DV
-    function bnpDMultiply(n) {
-      this[this.t] = this.am(0,n-1,this,0,0,this.t);
-      ++this.t;
-      this.clamp();
-    }
-
-    // (protected) this += n << w words, this >= 0
-    function bnpDAddOffset(n,w) {
-      if(n == 0) return;
-      while(this.t <= w) this[this.t++] = 0;
-      this[w] += n;
-      while(this[w] >= this.DV) {
-        this[w] -= this.DV;
-        if(++w >= this.t) this[this.t++] = 0;
-        ++this[w];
-      }
-    }
-
-    // A "null" reducer
-    function NullExp() {}
-    function nNop(x) { return x; }
-    function nMulTo(x,y,r) { x.multiplyTo(y,r); }
-    function nSqrTo(x,r) { x.squareTo(r); }
-
-    NullExp.prototype.convert = nNop;
-    NullExp.prototype.revert = nNop;
-    NullExp.prototype.mulTo = nMulTo;
-    NullExp.prototype.sqrTo = nSqrTo;
-
-    // (public) this^e
-    function bnPow(e) { return this.exp(e,new NullExp()); }
-
-    // (protected) r = lower n words of "this * a", a.t <= n
-    // "this" should be the larger one if appropriate.
-    function bnpMultiplyLowerTo(a,n,r) {
-      var i = Math.min(this.t+a.t,n);
-      r.s = 0; // assumes a,this >= 0
-      r.t = i;
-      while(i > 0) r[--i] = 0;
-      var j;
-      for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t);
-      for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i);
-      r.clamp();
-    }
-
-    // (protected) r = "this * a" without lower n words, n > 0
-    // "this" should be the larger one if appropriate.
-    function bnpMultiplyUpperTo(a,n,r) {
-      --n;
-      var i = r.t = this.t+a.t-n;
-      r.s = 0; // assumes a,this >= 0
-      while(--i >= 0) r[i] = 0;
-      for(i = Math.max(n-this.t,0); i < a.t; ++i)
-        r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n);
-      r.clamp();
-      r.drShiftTo(1,r);
-    }
-
-    // Barrett modular reduction
-    function Barrett(m) {
-      // setup Barrett
-      this.r2 = nbi();
-      this.q3 = nbi();
-      BigInteger.ONE.dlShiftTo(2*m.t,this.r2);
-      this.mu = this.r2.divide(m);
-      this.m = m;
-    }
-
-    function barrettConvert(x) {
-      if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);
-      else if(x.compareTo(this.m) < 0) return x;
-      else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
-    }
-
-    function barrettRevert(x) { return x; }
-
-    // x = x mod m (HAC 14.42)
-    function barrettReduce(x) {
-      x.drShiftTo(this.m.t-1,this.r2);
-      if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }
-      this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);
-      this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);
-      while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);
-      x.subTo(this.r2,x);
-      while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
-    }
-
-    // r = x^2 mod m; x != r
-    function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
-
-    // r = x*y mod m; x,y != r
-    function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
-
-    Barrett.prototype.convert = barrettConvert;
-    Barrett.prototype.revert = barrettRevert;
-    Barrett.prototype.reduce = barrettReduce;
-    Barrett.prototype.mulTo = barrettMulTo;
-    Barrett.prototype.sqrTo = barrettSqrTo;
-
-    // (public) this^e % m (HAC 14.85)
-    function bnModPow(e,m) {
-      var i = e.bitLength(), k, r = nbv(1), z;
-      if(i <= 0) return r;
-      else if(i < 18) k = 1;
-      else if(i < 48) k = 3;
-      else if(i < 144) k = 4;
-      else if(i < 768) k = 5;
-      else k = 6;
-      if(i < 8)
-        z = new Classic(m);
-      else if(m.isEven())
-        z = new Barrett(m);
-      else
-        z = new Montgomery(m);
-
-      // precomputation
-      var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;
-      g[1] = z.convert(this);
-      if(k > 1) {
-        var g2 = nbi();
-        z.sqrTo(g[1],g2);
-        while(n <= km) {
-          g[n] = nbi();
-          z.mulTo(g2,g[n-2],g[n]);
-          n += 2;
-        }
-      }
-
-      var j = e.t-1, w, is1 = true, r2 = nbi(), t;
-      i = nbits(e[j])-1;
-      while(j >= 0) {
-        if(i >= k1) w = (e[j]>>(i-k1))&km;
-        else {
-          w = (e[j]&((1<<(i+1))-1))<<(k1-i);
-          if(j > 0) w |= e[j-1]>>(this.DB+i-k1);
-        }
-
-        n = k;
-        while((w&1) == 0) { w >>= 1; --n; }
-        if((i -= n) < 0) { i += this.DB; --j; }
-        if(is1) {	// ret == 1, don't bother squaring or multiplying it
-          g[w].copyTo(r);
-          is1 = false;
-        }
-        else {
-          while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }
-          if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }
-          z.mulTo(r2,g[w],r);
-        }
-
-        while(j >= 0 && (e[j]&(1<<i)) == 0) {
-          z.sqrTo(r,r2); t = r; r = r2; r2 = t;
-          if(--i < 0) { i = this.DB-1; --j; }
-        }
-      }
-      return z.revert(r);
-    }
-
-    // (public) gcd(this,a) (HAC 14.54)
-    function bnGCD(a) {
-      var x = (this.s<0)?this.negate():this.clone();
-      var y = (a.s<0)?a.negate():a.clone();
-      if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }
-      var i = x.getLowestSetBit(), g = y.getLowestSetBit();
-      if(g < 0) return x;
-      if(i < g) g = i;
-      if(g > 0) {
-        x.rShiftTo(g,x);
-        y.rShiftTo(g,y);
-      }
-      while(x.signum() > 0) {
-        if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);
-        if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);
-        if(x.compareTo(y) >= 0) {
-          x.subTo(y,x);
-          x.rShiftTo(1,x);
-        }
-        else {
-          y.subTo(x,y);
-          y.rShiftTo(1,y);
-        }
-      }
-      if(g > 0) y.lShiftTo(g,y);
-      return y;
-    }
-
-    // (protected) this % n, n < 2^26
-    function bnpModInt(n) {
-      if(n <= 0) return 0;
-      var d = this.DV%n, r = (this.s<0)?n-1:0;
-      if(this.t > 0)
-        if(d == 0) r = this[0]%n;
-        else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n;
-      return r;
-    }
-
-    // (public) 1/this % m (HAC 14.61)
-    function bnModInverse(m) {
-      var ac = m.isEven();
-      if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;
-      var u = m.clone(), v = this.clone();
-      var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
-      while(u.signum() != 0) {
-        while(u.isEven()) {
-          u.rShiftTo(1,u);
-          if(ac) {
-            if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
-            a.rShiftTo(1,a);
-          }
-          else if(!b.isEven()) b.subTo(m,b);
-          b.rShiftTo(1,b);
-        }
-        while(v.isEven()) {
-          v.rShiftTo(1,v);
-          if(ac) {
-            if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
-            c.rShiftTo(1,c);
-          }
-          else if(!d.isEven()) d.subTo(m,d);
-          d.rShiftTo(1,d);
-        }
-        if(u.compareTo(v) >= 0) {
-          u.subTo(v,u);
-          if(ac) a.subTo(c,a);
-          b.subTo(d,b);
-        }
-        else {
-          v.subTo(u,v);
-          if(ac) c.subTo(a,c);
-          d.subTo(b,d);
-        }
-      }
-      if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
-      if(d.compareTo(m) >= 0) return d.subtract(m);
-      if(d.signum() < 0) d.addTo(m,d); else return d;
-      if(d.signum() < 0) return d.add(m); else return d;
-    }
-
-    var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];
-    var lplim = (1<<26)/lowprimes[lowprimes.length-1];
-
-    // (public) test primality with certainty >= 1-.5^t
-    function bnIsProbablePrime(t) {
-      var i, x = this.abs();
-      if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) {
-        for(i = 0; i < lowprimes.length; ++i)
-          if(x[0] == lowprimes[i]) return true;
-        return false;
-      }
-      if(x.isEven()) return false;
-      i = 1;
-      while(i < lowprimes.length) {
-        var m = lowprimes[i], j = i+1;
-        while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];
-        m = x.modInt(m);
-        while(i < j) if(m%lowprimes[i++] == 0) return false;
-      }
-      return x.millerRabin(t);
-    }
-
-    // (protected) true if probably prime (HAC 4.24, Miller-Rabin)
-    function bnpMillerRabin(t) {
-      var n1 = this.subtract(BigInteger.ONE);
-      var k = n1.getLowestSetBit();
-      if(k <= 0) return false;
-      var r = n1.shiftRight(k);
-      t = (t+1)>>1;
-      if(t > lowprimes.length) t = lowprimes.length;
-      var a = nbi();
-      for(var i = 0; i < t; ++i) {
-        //Pick bases at random, instead of starting at 2
-        a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);
-        var y = a.modPow(r,this);
-        if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
-          var j = 1;
-          while(j++ < k && y.compareTo(n1) != 0) {
-            y = y.modPowInt(2,this);
-            if(y.compareTo(BigInteger.ONE) == 0) return false;
-          }
-          if(y.compareTo(n1) != 0) return false;
-        }
-      }
-      return true;
-    }
-
-    // protected
-    BigInteger.prototype.chunkSize = bnpChunkSize;
-    BigInteger.prototype.toRadix = bnpToRadix;
-    BigInteger.prototype.fromRadix = bnpFromRadix;
-    BigInteger.prototype.fromNumber = bnpFromNumber;
-    BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
-    BigInteger.prototype.changeBit = bnpChangeBit;
-    BigInteger.prototype.addTo = bnpAddTo;
-    BigInteger.prototype.dMultiply = bnpDMultiply;
-    BigInteger.prototype.dAddOffset = bnpDAddOffset;
-    BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
-    BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
-    BigInteger.prototype.modInt = bnpModInt;
-    BigInteger.prototype.millerRabin = bnpMillerRabin;
-
-    // public
-    BigInteger.prototype.clone = bnClone;
-    BigInteger.prototype.intValue = bnIntValue;
-    BigInteger.prototype.byteValue = bnByteValue;
-    BigInteger.prototype.shortValue = bnShortValue;
-    BigInteger.prototype.signum = bnSigNum;
-    BigInteger.prototype.toByteArray = bnToByteArray;
-    BigInteger.prototype.equals = bnEquals;
-    BigInteger.prototype.min = bnMin;
-    BigInteger.prototype.max = bnMax;
-    BigInteger.prototype.and = bnAnd;
-    BigInteger.prototype.or = bnOr;
-    BigInteger.prototype.xor = bnXor;
-    BigInteger.prototype.andNot = bnAndNot;
-    BigInteger.prototype.not = bnNot;
-    BigInteger.prototype.shiftLeft = bnShiftLeft;
-    BigInteger.prototype.shiftRight = bnShiftRight;
-    BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
-    BigInteger.prototype.bitCount = bnBitCount;
-    BigInteger.prototype.testBit = bnTestBit;
-    BigInteger.prototype.setBit = bnSetBit;
-    BigInteger.prototype.clearBit = bnClearBit;
-    BigInteger.prototype.flipBit = bnFlipBit;
-    BigInteger.prototype.add = bnAdd;
-    BigInteger.prototype.subtract = bnSubtract;
-    BigInteger.prototype.multiply = bnMultiply;
-    BigInteger.prototype.divide = bnDivide;
-    BigInteger.prototype.remainder = bnRemainder;
-    BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
-    BigInteger.prototype.modPow = bnModPow;
-    BigInteger.prototype.modInverse = bnModInverse;
-    BigInteger.prototype.pow = bnPow;
-    BigInteger.prototype.gcd = bnGCD;
-    BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
-
-    // JSBN-specific extension
-    BigInteger.prototype.square = bnSquare;
-
-    // Expose the Barrett function
-    BigInteger.prototype.Barrett = Barrett
-
-    // BigInteger interfaces not implemented in jsbn:
-
-    // BigInteger(int signum, byte[] magnitude)
-    // double doubleValue()
-    // float floatValue()
-    // int hashCode()
-    // long longValue()
-    // static BigInteger valueOf(long val)
-
-	// Random number generator - requires a PRNG backend, e.g. prng4.js
-
-	// For best results, put code like
-	// <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>
-	// in your main HTML document.
-
-	var rng_state;
-	var rng_pool;
-	var rng_pptr;
-
-	// Mix in a 32-bit integer into the pool
-	function rng_seed_int(x) {
-	  rng_pool[rng_pptr++] ^= x & 255;
-	  rng_pool[rng_pptr++] ^= (x >> 8) & 255;
-	  rng_pool[rng_pptr++] ^= (x >> 16) & 255;
-	  rng_pool[rng_pptr++] ^= (x >> 24) & 255;
-	  if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;
-	}
-
-	// Mix in the current time (w/milliseconds) into the pool
-	function rng_seed_time() {
-	  rng_seed_int(new Date().getTime());
-	}
-
-	// Initialize the pool with junk if needed.
-	if(rng_pool == null) {
-	  rng_pool = new Array();
-	  rng_pptr = 0;
-	  var t;
-	  if(typeof window !== "undefined" && window.crypto) {
-		if (window.crypto.getRandomValues) {
-		  // Use webcrypto if available
-		  var ua = new Uint8Array(32);
-		  window.crypto.getRandomValues(ua);
-		  for(t = 0; t < 32; ++t)
-			rng_pool[rng_pptr++] = ua[t];
-		}
-		else if(navigator.appName == "Netscape" && navigator.appVersion < "5") {
-		  // Extract entropy (256 bits) from NS4 RNG if available
-		  var z = window.crypto.random(32);
-		  for(t = 0; t < z.length; ++t)
-			rng_pool[rng_pptr++] = z.charCodeAt(t) & 255;
-		}
-	  }
-	  while(rng_pptr < rng_psize) {  // extract some randomness from Math.random()
-		t = Math.floor(65536 * Math.random());
-		rng_pool[rng_pptr++] = t >>> 8;
-		rng_pool[rng_pptr++] = t & 255;
-	  }
-	  rng_pptr = 0;
-	  rng_seed_time();
-	  //rng_seed_int(window.screenX);
-	  //rng_seed_int(window.screenY);
-	}
-
-	function rng_get_byte() {
-	  if(rng_state == null) {
-		rng_seed_time();
-		rng_state = prng_newstate();
-		rng_state.init(rng_pool);
-		for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)
-		  rng_pool[rng_pptr] = 0;
-		rng_pptr = 0;
-		//rng_pool = null;
-	  }
-	  // TODO: allow reseeding after first request
-	  return rng_state.next();
-	}
-
-	function rng_get_bytes(ba) {
-	  var i;
-	  for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();
-	}
-
-	function SecureRandom() {}
-
-	SecureRandom.prototype.nextBytes = rng_get_bytes;
-
-	// prng4.js - uses Arcfour as a PRNG
-
-	function Arcfour() {
-	  this.i = 0;
-	  this.j = 0;
-	  this.S = new Array();
-	}
-
-	// Initialize arcfour context from key, an array of ints, each from [0..255]
-	function ARC4init(key) {
-	  var i, j, t;
-	  for(i = 0; i < 256; ++i)
-		this.S[i] = i;
-	  j = 0;
-	  for(i = 0; i < 256; ++i) {
-		j = (j + this.S[i] + key[i % key.length]) & 255;
-		t = this.S[i];
-		this.S[i] = this.S[j];
-		this.S[j] = t;
-	  }
-	  this.i = 0;
-	  this.j = 0;
-	}
-
-	function ARC4next() {
-	  var t;
-	  this.i = (this.i + 1) & 255;
-	  this.j = (this.j + this.S[this.i]) & 255;
-	  t = this.S[this.i];
-	  this.S[this.i] = this.S[this.j];
-	  this.S[this.j] = t;
-	  return this.S[(t + this.S[this.i]) & 255];
-	}
-
-	Arcfour.prototype.init = ARC4init;
-	Arcfour.prototype.next = ARC4next;
-
-	// Plug in your RNG constructor here
-	function prng_newstate() {
-	  return new Arcfour();
-	}
-
-	// Pool size must be a multiple of 4 and greater than 32.
-	// An array of bytes the size of the pool will be passed to init()
-	var rng_psize = 256;
-
-    if (typeof exports !== 'undefined') {
-        exports = module.exports = {
-			BigInteger: BigInteger,
-			SecureRandom: SecureRandom,
-		};
-    } else {
-        this.BigInteger = BigInteger;
-        this.SecureRandom = SecureRandom;
-    }
-
-}).call(this);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/package.json
deleted file mode 100644
index d7d7023d5273b9972a294f21395c821b913a5751..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/jsbn/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "_from": "jsbn@>=0.1.0 <0.2.0",
-  "_id": "jsbn@0.1.0",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/sshpk/jsbn",
-  "_nodeVersion": "0.12.2",
-  "_npmUser": {
-    "email": "andyperlitch@gmail.com",
-    "name": "andyperlitch"
-  },
-  "_npmVersion": "2.7.4",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature/sshpk",
-    "/serialport/node-pre-gyp/request/http-signature/sshpk/ecc-jsbn",
-    "/serialport/node-pre-gyp/request/http-signature/sshpk/jodid25519"
-  ],
-  "_resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz",
-  "_shasum": "650987da0dd74f4ebf5a11377a2aa2d273e97dfd",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "Tom Wu"
-  },
-  "bugs": {
-    "url": "https://github.com/andyperlitch/jsbn/issues"
-  },
-  "dependencies": {},
-  "description": "The jsbn library is a fast, portable implementation of large-number math in pure JavaScript, enabling public-key crypto and other applications on desktop and mobile browsers.",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "650987da0dd74f4ebf5a11377a2aa2d273e97dfd",
-    "tarball": "http://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz"
-  },
-  "gitHead": "148a967b112806e63ddeeed78ee7938eef74c84a",
-  "homepage": "https://github.com/andyperlitch/jsbn",
-  "keywords": [
-    "big",
-    "biginteger",
-    "bignumber",
-    "integer"
-  ],
-  "license": "BSD",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "andyperlitch",
-      "email": "andyperlitch@gmail.com"
-    }
-  ],
-  "name": "jsbn",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/andyperlitch/jsbn.git"
-  },
-  "scripts": {
-    "test": "mocha test.js"
-  },
-  "version": "0.1.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/.npmignore
deleted file mode 100644
index 7d98dcbd2d360af59d33cd0023d657f5a5b591ab..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/.npmignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.eslintrc
-.travis.yml
-bower.json
-test
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/CHANGELOG.md
deleted file mode 100644
index 77c69bd5ee45be16425102877bb74effafaa12ff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/CHANGELOG.md
+++ /dev/null
@@ -1,128 +0,0 @@
-TweetNaCl.js Changelog
-======================
-
-
-v0.13.2
--------
-
-* Fixed undefined variable bug in fast version of Poly1305. No worries, this
-  bug was *never* triggered.
-
-* Specified CC0 public domain dedication.
-
-* Updated development dependencies.
-
-
-v0.13.1
--------
-
-* Exclude `crypto` and `buffer` modules from browserify builds.
-
-
-v0.13.0
--------
-
-* Made `nacl-fast` the default version in NPM package. Now
-  `require("tweetnacl")` will use fast version; to get the original version,
-  use `require("tweetnacl/nacl.js")`.
-
-* Cleanup temporary array after generating random bytes.
-
-
-v0.12.2
--------
-
-* Improved performance of curve operations, making `nacl.scalarMult`, `nacl.box`,
-  `nacl.sign` and related functions up to 3x faster in `nacl-fast` version.
-
-
-v0.12.1
--------
-
-* Significantly improved performance of Salsa20 (~1.5x faster) and
-  Poly1305 (~3.5x faster) in `nacl-fast` version.
-
-
-v0.12.0
--------
-
-* Instead of using the given secret key directly, TweetNaCl.js now copies it to
-  a new array in `nacl.box.keyPair.fromSecretKey` and
-  `nacl.sign.keyPair.fromSecretKey`.
-
-
-v0.11.2
--------
-
-* Added new constant: `nacl.sign.seedLength`.
-
-
-v0.11.1
--------
-
-* Even faster hash for both short and long inputs (in `nacl-fast`).
-
-
-v0.11.0
--------
-
-* Implement `nacl.sign.keyPair.fromSeed` to enable creation of sign key pairs
-  deterministically from a 32-byte seed. (It behaves like
-  [libsodium's](http://doc.libsodium.org/public-key_cryptography/public-key_signatures.html)
-  `crypto_sign_seed_keypair`: the seed becomes a secret part of the secret key.)
-
-* Fast version now has an improved hash implementation that is 2x-5x faster.
-
-* Fixed benchmarks, which may have produced incorrect measurements.
-
-
-v0.10.1
--------
-
-* Exported undocumented `nacl.lowlevel.crypto_core_hsalsa20`.
-
-
-v0.10.0
--------
-
-* **Signature API breaking change!** `nacl.sign` and `nacl.sign.open` now deal
- with signed messages, and new `nacl.sign.detached` and
- `nacl.sign.detached.verify` are available.
- 
- Previously, `nacl.sign` returned a signature, and `nacl.sign.open` accepted a
- message and "detached" signature. This was unlike NaCl's API, which dealt with
- signed messages (concatenation of signature and message).
- 
- The new API is:
-
-      nacl.sign(message, secretKey) -> signedMessage
-      nacl.sign.open(signedMessage, publicKey) -> message | null
-
- Since detached signatures are common, two new API functions were introduced:
- 
-      nacl.sign.detached(message, secretKey) -> signature
-      nacl.sign.detached.verify(message, signature, publicKey) -> true | false
-
- (Note that it's `verify`, not `open`, and it returns a boolean value, unlike
- `open`, which returns an "unsigned" message.)
-
-* NPM package now comes without `test` directory to keep it small.
-
-
-v0.9.2
-------
-
-* Improved documentation.
-* Fast version: increased theoretical message size limit from 2^32-1 to 2^52
-  bytes in Poly1305 (and thus, secretbox and box). However this has no impact
-  in practice since JavaScript arrays or ArrayBuffers are limited to 32-bit
-  indexes, and most implementations won't allocate more than a gigabyte or so.
-  (Obviously, there are no tests for the correctness of implementation.) Also,
-  it's not recommended to use messages that large without splitting them into
-  smaller packets anyway.
-
-
-v0.9.1
-------
-
-* Initial release
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/README.md
deleted file mode 100644
index 11bd3472c258d185918be63abcdb89f187230889..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/README.md
+++ /dev/null
@@ -1,463 +0,0 @@
-TweetNaCl.js
-============
-
-Port of [TweetNaCl](http://tweetnacl.cr.yp.to) / [NaCl](http://nacl.cr.yp.to/)
-to JavaScript for modern browsers and Node.js. Public domain.
-
-[![Build Status](https://travis-ci.org/dchest/tweetnacl-js.svg?branch=master)
-](https://travis-ci.org/dchest/tweetnacl-js)
-
-[Demo](https://dchest.github.io/tweetnacl-js/)
-
-**:warning: Beta version. The library is stable and API is frozen, however
-it has not been independently reviewed. If you can help reviewing it, please
-[contact me](mailto:dmitry@codingrobots.com).**
-
-Documentation
-=============
-
-* [Overview](#overview)
-* [Installation](#installation)
-* [Usage](#usage)
-  * [Public-key authenticated encryption (box)](#public-key-authenticated-encryption-box)
-  * [Secret-key authenticated encryption (secretbox)](#secret-key-authenticated-encryption-secretbox)
-  * [Scalar multiplication](#scalar-multiplication)
-  * [Signatures](#signatures)
-  * [Hashing](#hashing)
-  * [Random bytes generation](#random-bytes-generation)
-  * [Constant-time comparison](#constant-time-comparison)
-  * [Utilities](#utilities)
-* [Examples](#examples)
-* [System requirements](#system-requirements)
-* [Development and testing](#development-and-testing)
-* [Contributors](#contributors)
-* [Who uses it](#who-uses-it)
-
-
-Overview
---------
-
-The primary goal of this project is to produce a translation of TweetNaCl to
-JavaScript which is as close as possible to the original C implementation, plus
-a thin layer of idiomatic high-level API on top of it.
-
-There are two versions, you can use either of them:
-
-* `nacl.js` is the port of TweetNaCl with minimum differences from the
-  original + high-level API.
-
-* `nacl-fast.js` is like `nacl.js`, but with some functions replaced with
-  faster versions.
-
-
-Installation
-------------
-
-You can install TweetNaCl.js via a package manager:
-
-[Bower](http://bower.io):
-
-    $ bower install tweetnacl
-
-[NPM](https://www.npmjs.org/):
-
-    $ npm install tweetnacl
-
-or [download source code](https://github.com/dchest/tweetnacl-js/releases).
-
-
-Usage
-------
-
-All API functions accept and return bytes as `Uint8Array`s.  If you need to
-encode or decode strings, use functions from `nacl.util` namespace.
-
-### Public-key authenticated encryption (box)
-
-Implements *curve25519-xsalsa20-poly1305*.
-
-#### nacl.box.keyPair()
-
-Generates a new random key pair for box and returns it as an object with
-`publicKey` and `secretKey` members:
-
-    {
-       publicKey: ...,  // Uint8Array with 32-byte public key
-       secretKey: ...   // Uint8Array with 32-byte secret key
-    }
-
-
-#### nacl.box.keyPair.fromSecretKey(secretKey)
-
-Returns a key pair for box with public key corresponding to the given secret
-key.
-
-#### nacl.box(message, nonce, theirPublicKey, mySecretKey)
-
-Encrypt and authenticates message using peer's public key, our secret key, and
-the given nonce, which must be unique for each distinct message for a key pair.
-
-Returns an encrypted and authenticated message, which is
-`nacl.box.overheadLength` longer than the original message.
-
-#### nacl.box.open(box, nonce, theirPublicKey, mySecretKey)
-
-Authenticates and decrypts the given box with peer's public key, our secret
-key, and the given nonce.
-
-Returns the original message, or `false` if authentication fails.
-
-#### nacl.box.before(theirPublicKey, mySecretKey)
-
-Returns a precomputed shared key which can be used in `nacl.box.after` and
-`nacl.box.open.after`.
-
-#### nacl.box.after(message, nonce, sharedKey)
-
-Same as `nacl.box`, but uses a shared key precomputed with `nacl.box.before`.
-
-#### nacl.box.open.after(box, nonce, sharedKey)
-
-Same as `nacl.box.open`, but uses a shared key precomputed with `nacl.box.before`.
-
-#### nacl.box.publicKeyLength = 32
-
-Length of public key in bytes.
-
-#### nacl.box.secretKeyLength = 32
-
-Length of secret key in bytes.
-
-#### nacl.box.sharedKeyLength = 32
-
-Length of precomputed shared key in bytes.
-
-#### nacl.box.nonceLength = 24
-
-Length of nonce in bytes.
-
-#### nacl.box.overheadLength = 16
-
-Length of overhead added to box compared to original message.
-
-
-### Secret-key authenticated encryption (secretbox)
-
-Implements *xsalsa20-poly1305*.
-
-#### nacl.secretbox(message, nonce, key)
-
-Encrypt and authenticates message using the key and the nonce. The nonce must
-be unique for each distinct message for this key.
-
-Returns an encrypted and authenticated message, which is
-`nacl.secretbox.overheadLength` longer than the original message.
-
-#### nacl.secretbox.open(box, nonce, key)
-
-Authenticates and decrypts the given secret box using the key and the nonce.
-
-Returns the original message, or `false` if authentication fails.
-
-#### nacl.secretbox.keyLength = 32
-
-Length of key in bytes.
-
-#### nacl.secretbox.nonceLength = 24
-
-Length of nonce in bytes.
-
-#### nacl.secretbox.overheadLength = 16
-
-Length of overhead added to secret box compared to original message.
-
-
-### Scalar multiplication
-
-Implements *curve25519*.
-
-#### nacl.scalarMult(n, p)
-
-Multiplies an integer `n` by a group element `p` and returns the resulting
-group element.
-
-#### nacl.scalarMult.base(n)
-
-Multiplies an integer `n` by a standard group element and returns the resulting
-group element.
-
-#### nacl.scalarMult.scalarLength = 32
-
-Length of scalar in bytes.
-
-#### nacl.scalarMult.groupElementLength = 32
-
-Length of group element in bytes.
-
-
-### Signatures
-
-Implements [ed25519](http://ed25519.cr.yp.to).
-
-#### nacl.sign.keyPair()
-
-Generates new random key pair for signing and returns it as an object with
-`publicKey` and `secretKey` members:
-
-    {
-       publicKey: ...,  // Uint8Array with 32-byte public key
-       secretKey: ...   // Uint8Array with 64-byte secret key
-    }
-
-#### nacl.sign.keyPair.fromSecretKey(secretKey)
-
-Returns a signing key pair with public key corresponding to the given
-64-byte secret key. The secret key must have been generated by
-`nacl.sign.keyPair` or `nacl.sign.keyPair.fromSeed`.
-
-#### nacl.sign.keyPair.fromSeed(seed)
-
-Returns a new signing key pair generated deterministically from a 32-byte seed.
-The seed must contain enough entropy to be secure. This method is not
-recommended for general use: instead, use `nacl.sign.keyPair` to generate a new
-key pair from a random seed.
-
-#### nacl.sign(message, secretKey)
-
-Signs the message using the secret key and returns a signed message.
-
-#### nacl.sign.open(signedMessage, publicKey)
-
-Verifies the signed message and returns the message without signature.
-
-Returns `null` if verification failed.
-
-#### nacl.sign.detached(message, secretKey)
-
-Signs the message using the secret key and returns a signature.
-
-#### nacl.sign.detached.verify(message, signature, publicKey)
-
-Verifies the signature for the message and returns `true` if verification
-succeeded or `false` if it failed.
-
-#### nacl.sign.publicKeyLength = 32
-
-Length of signing public key in bytes.
-
-#### nacl.sign.secretKeyLength = 64
-
-Length of signing secret key in bytes.
-
-#### nacl.sign.seedLength = 32
-
-Length of seed for `nacl.sign.keyPair.fromSeed` in bytes.
-
-#### nacl.sign.signatureLength = 64
-
-Length of signature in bytes.
-
-
-### Hashing
-
-Implements *SHA-512*.
-
-#### nacl.hash(message)
-
-Returns SHA-512 hash of the message.
-
-#### nacl.hash.hashLength = 64
-
-Length of hash in bytes.
-
-
-### Random bytes generation
-
-#### nacl.randomBytes(length)
-
-Returns a `Uint8Array` of the given length containing random bytes of
-cryptographic quality.
-
-**Implementation note**
-
-TweetNaCl.js uses the following methods to generate random bytes,
-depending on the platform it runs on:
-
-* `window.crypto.getRandomValues` (WebCrypto standard)
-* `window.msCrypto.getRandomValues` (Internet Explorer 11)
-* `crypto.randomBytes` (Node.js)
-
-Note that browsers are required to throw `QuotaExceededError` exception if
-requested `length` is more than 65536, so do not ask for more than 65536 bytes
-in *one call* (multiple calls to get as many bytes as you like are okay:
-browsers can generate infinite amount of random bytes without any bad
-consequences).
-
-If the platform doesn't provide a suitable PRNG, the following functions,
-which require random numbers, will throw exception:
-
-* `nacl.randomBytes`
-* `nacl.box.keyPair`
-* `nacl.sign.keyPair`
-
-Other functions are deterministic and will continue working.
-
-If a platform you are targeting doesn't implement secure random number
-generator, but you somehow have a cryptographically-strong source of entropy
-(not `Math.random`!), and you know what you are doing, you can plug it into
-TweetNaCl.js like this:
-
-    nacl.setPRNG(function(x, n) {
-      // ... copy n random bytes into x ...
-    });
-
-Note that `nacl.setPRNG` *completely replaces* internal random byte generator
-with the one provided.
-
-
-### Constant-time comparison
-
-#### nacl.verify(x, y)
-
-Compares `x` and `y` in constant time and returns `true` if their lengths are
-non-zero and equal, and their contents are equal.
-
-Returns `false` if either of the arguments has zero length, or arguments have
-different lengths, or their contents differ.
-
-
-### Utilities
-
-Encoding/decoding functions are provided for convenience. They are correct,
-however their performance and wide compatibility with uncommon runtimes is not
-something that is considered important compared to the simplicity and size of
-implementation. You can use third-party libraries if you need to.
-
-#### nacl.util.decodeUTF8(string)
-
-Decodes string and returns `Uint8Array` of bytes.
-
-#### nacl.util.encodeUTF8(array)
-
-Encodes `Uint8Array` or `Array` of bytes into string.
-
-#### nacl.util.decodeBase64(string)
-
-Decodes Base-64 encoded string and returns `Uint8Array` of bytes.
-
-#### nacl.util.encodeBase64(array)
-
-Encodes `Uint8Array` or `Array` of bytes into string using Base-64 encoding.
-
-
-System requirements
--------------------
-
-TweetNaCl.js supports modern browsers that have a cryptographically secure
-pseudorandom number generator and typed arrays, including the latest versions
-of:
-
-* Chrome
-* Firefox
-* Safari (Mac, iOS)
-* Internet Explorer 11
-
-Other systems:
-
-* Node.js (we test on 0.10 and later)
-
-
-Development and testing
-------------------------
-
-Install NPM modules needed for development:
-
-    $ npm install
-
-To build minified versions:
-
-    $ npm run build
-
-Tests use minified version, so make sure to rebuild it every time you change
-`nacl.js` or `nacl-fast.js`.
-
-### Testing
-
-To run tests in Node.js:
-
-    $ npm test
-
-By default all tests described here work on `nacl.min.js`. To test other
-versions, set environment variable `NACL_SRC` to the file name you want to test.
-For example, the following command will test fast minified version:
-
-    $ NACL_SRC=nacl-fast.min.js npm test
-
-To run full suite of tests in Node.js, including comparing outputs of
-JavaScript port to outputs of the original C version:
-
-    $ npm run testall
-
-To prepare tests for browsers:
-
-    $ npm run browser
-
-and then open `test/browser/test.html` (or `test/browser/test-fast.html`) to
-run them.
-
-To run headless browser tests with `testling`:
-
-    $ npm run testling
-
-(If you get `Error: spawn ENOENT`, install *xvfb*: `sudo apt-get install xvfb`.)
-
-### Benchmarking
-
-To run benchmarks in Node.js:
-
-    $ npm run bench
-    $ NACL_SRC=nacl-fast.min.js npm run bench
-
-To run benchmarks in a browser, open `test/benchmark/bench.html` (or
-`test/benchmark/bench-fast.html`).
-
-
-Contributors
-------------
-
-JavaScript port:
-
- * [Dmitry Chestnykh](http://github.com/dchest) (ported xsalsa20, poly1305, curve25519)
- * [Devi Mandiri](https://github.com/devi) (ported curve25519, ed25519, sha512)
-
-Original authors of [NaCl](http://nacl.cr.yp.to), [TweetNaCl](http://tweetnacl.cr.yp.to)
-and [Poly1305-donna](https://github.com/floodyberry/poly1305-donna)
-(who are *not* responsible for any errors in this implementation):
-
-  * [Daniel J. Bernstein](http://cr.yp.to/djb.html)
-  * Wesley Janssen
-  * [Tanja Lange](http://hyperelliptic.org/tanja)
-  * [Peter Schwabe](http://www.cryptojedi.org/users/peter/)
-  * [Matthew Dempsky](https://github.com/mdempsky)
-  * [Andrew Moon](https://github.com/floodyberry)
-
-Contributors have dedicated their work to the public domain.
-
-This software is distributed without any warranty.
-
-
-Third-party libraries based on TweetNaCl.js
--------------------------------------------
-
-* [forward-secrecy](https://github.com/alax/forward-secrecy) — Axolotl ratchet implementation
-* [nacl-stream](https://github.com/dchest/nacl-stream-js) - streaming encryption
-* [tweetnacl-auth-js](https://github.com/dchest/tweetnacl-auth-js) — implementation of [`crypto_auth`](http://nacl.cr.yp.to/auth.html)
-
-
-Who uses it
------------
-
-Some notable users of TweetNaCl.js:
-
-* [miniLock](http://minilock.io/)
-* [Stellar](https://www.stellar.org/)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.js
deleted file mode 100644
index 6c4995848cc42c5c8c5fcc6f2dc61bccabd263ea..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.js
+++ /dev/null
@@ -1,2418 +0,0 @@
-(function(nacl) {
-'use strict';
-
-// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.
-// Public domain.
-//
-// Implementation derived from TweetNaCl version 20140427.
-// See for details: http://tweetnacl.cr.yp.to/
-
-var gf = function(init) {
-  var i, r = new Float64Array(16);
-  if (init) for (i = 0; i < init.length; i++) r[i] = init[i];
-  return r;
-};
-
-//  Pluggable, initialized in high-level API below.
-var randombytes = function(/* x, n */) { throw new Error('no PRNG'); };
-
-var _0 = new Uint8Array(16);
-var _9 = new Uint8Array(32); _9[0] = 9;
-
-var gf0 = gf(),
-    gf1 = gf([1]),
-    _121665 = gf([0xdb41, 1]),
-    D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),
-    D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),
-    X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),
-    Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),
-    I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);
-
-function ts64(x, i, h, l) {
-  x[i]   = (h >> 24) & 0xff;
-  x[i+1] = (h >> 16) & 0xff;
-  x[i+2] = (h >>  8) & 0xff;
-  x[i+3] = h & 0xff;
-  x[i+4] = (l >> 24)  & 0xff;
-  x[i+5] = (l >> 16)  & 0xff;
-  x[i+6] = (l >>  8)  & 0xff;
-  x[i+7] = l & 0xff;
-}
-
-function vn(x, xi, y, yi, n) {
-  var i,d = 0;
-  for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i];
-  return (1 & ((d - 1) >>> 8)) - 1;
-}
-
-function crypto_verify_16(x, xi, y, yi) {
-  return vn(x,xi,y,yi,16);
-}
-
-function crypto_verify_32(x, xi, y, yi) {
-  return vn(x,xi,y,yi,32);
-}
-
-function core_salsa20(o, p, k, c) {
-  var j0  = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,
-      j1  = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,
-      j2  = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,
-      j3  = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,
-      j4  = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,
-      j5  = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,
-      j6  = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,
-      j7  = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,
-      j8  = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,
-      j9  = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,
-      j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,
-      j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,
-      j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,
-      j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,
-      j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,
-      j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;
-
-  var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,
-      x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,
-      x15 = j15, u;
-
-  for (var i = 0; i < 20; i += 2) {
-    u = x0 + x12 | 0;
-    x4 ^= u<<7 | u>>>(32-7);
-    u = x4 + x0 | 0;
-    x8 ^= u<<9 | u>>>(32-9);
-    u = x8 + x4 | 0;
-    x12 ^= u<<13 | u>>>(32-13);
-    u = x12 + x8 | 0;
-    x0 ^= u<<18 | u>>>(32-18);
-
-    u = x5 + x1 | 0;
-    x9 ^= u<<7 | u>>>(32-7);
-    u = x9 + x5 | 0;
-    x13 ^= u<<9 | u>>>(32-9);
-    u = x13 + x9 | 0;
-    x1 ^= u<<13 | u>>>(32-13);
-    u = x1 + x13 | 0;
-    x5 ^= u<<18 | u>>>(32-18);
-
-    u = x10 + x6 | 0;
-    x14 ^= u<<7 | u>>>(32-7);
-    u = x14 + x10 | 0;
-    x2 ^= u<<9 | u>>>(32-9);
-    u = x2 + x14 | 0;
-    x6 ^= u<<13 | u>>>(32-13);
-    u = x6 + x2 | 0;
-    x10 ^= u<<18 | u>>>(32-18);
-
-    u = x15 + x11 | 0;
-    x3 ^= u<<7 | u>>>(32-7);
-    u = x3 + x15 | 0;
-    x7 ^= u<<9 | u>>>(32-9);
-    u = x7 + x3 | 0;
-    x11 ^= u<<13 | u>>>(32-13);
-    u = x11 + x7 | 0;
-    x15 ^= u<<18 | u>>>(32-18);
-
-    u = x0 + x3 | 0;
-    x1 ^= u<<7 | u>>>(32-7);
-    u = x1 + x0 | 0;
-    x2 ^= u<<9 | u>>>(32-9);
-    u = x2 + x1 | 0;
-    x3 ^= u<<13 | u>>>(32-13);
-    u = x3 + x2 | 0;
-    x0 ^= u<<18 | u>>>(32-18);
-
-    u = x5 + x4 | 0;
-    x6 ^= u<<7 | u>>>(32-7);
-    u = x6 + x5 | 0;
-    x7 ^= u<<9 | u>>>(32-9);
-    u = x7 + x6 | 0;
-    x4 ^= u<<13 | u>>>(32-13);
-    u = x4 + x7 | 0;
-    x5 ^= u<<18 | u>>>(32-18);
-
-    u = x10 + x9 | 0;
-    x11 ^= u<<7 | u>>>(32-7);
-    u = x11 + x10 | 0;
-    x8 ^= u<<9 | u>>>(32-9);
-    u = x8 + x11 | 0;
-    x9 ^= u<<13 | u>>>(32-13);
-    u = x9 + x8 | 0;
-    x10 ^= u<<18 | u>>>(32-18);
-
-    u = x15 + x14 | 0;
-    x12 ^= u<<7 | u>>>(32-7);
-    u = x12 + x15 | 0;
-    x13 ^= u<<9 | u>>>(32-9);
-    u = x13 + x12 | 0;
-    x14 ^= u<<13 | u>>>(32-13);
-    u = x14 + x13 | 0;
-    x15 ^= u<<18 | u>>>(32-18);
-  }
-   x0 =  x0 +  j0 | 0;
-   x1 =  x1 +  j1 | 0;
-   x2 =  x2 +  j2 | 0;
-   x3 =  x3 +  j3 | 0;
-   x4 =  x4 +  j4 | 0;
-   x5 =  x5 +  j5 | 0;
-   x6 =  x6 +  j6 | 0;
-   x7 =  x7 +  j7 | 0;
-   x8 =  x8 +  j8 | 0;
-   x9 =  x9 +  j9 | 0;
-  x10 = x10 + j10 | 0;
-  x11 = x11 + j11 | 0;
-  x12 = x12 + j12 | 0;
-  x13 = x13 + j13 | 0;
-  x14 = x14 + j14 | 0;
-  x15 = x15 + j15 | 0;
-
-  o[ 0] = x0 >>>  0 & 0xff;
-  o[ 1] = x0 >>>  8 & 0xff;
-  o[ 2] = x0 >>> 16 & 0xff;
-  o[ 3] = x0 >>> 24 & 0xff;
-
-  o[ 4] = x1 >>>  0 & 0xff;
-  o[ 5] = x1 >>>  8 & 0xff;
-  o[ 6] = x1 >>> 16 & 0xff;
-  o[ 7] = x1 >>> 24 & 0xff;
-
-  o[ 8] = x2 >>>  0 & 0xff;
-  o[ 9] = x2 >>>  8 & 0xff;
-  o[10] = x2 >>> 16 & 0xff;
-  o[11] = x2 >>> 24 & 0xff;
-
-  o[12] = x3 >>>  0 & 0xff;
-  o[13] = x3 >>>  8 & 0xff;
-  o[14] = x3 >>> 16 & 0xff;
-  o[15] = x3 >>> 24 & 0xff;
-
-  o[16] = x4 >>>  0 & 0xff;
-  o[17] = x4 >>>  8 & 0xff;
-  o[18] = x4 >>> 16 & 0xff;
-  o[19] = x4 >>> 24 & 0xff;
-
-  o[20] = x5 >>>  0 & 0xff;
-  o[21] = x5 >>>  8 & 0xff;
-  o[22] = x5 >>> 16 & 0xff;
-  o[23] = x5 >>> 24 & 0xff;
-
-  o[24] = x6 >>>  0 & 0xff;
-  o[25] = x6 >>>  8 & 0xff;
-  o[26] = x6 >>> 16 & 0xff;
-  o[27] = x6 >>> 24 & 0xff;
-
-  o[28] = x7 >>>  0 & 0xff;
-  o[29] = x7 >>>  8 & 0xff;
-  o[30] = x7 >>> 16 & 0xff;
-  o[31] = x7 >>> 24 & 0xff;
-
-  o[32] = x8 >>>  0 & 0xff;
-  o[33] = x8 >>>  8 & 0xff;
-  o[34] = x8 >>> 16 & 0xff;
-  o[35] = x8 >>> 24 & 0xff;
-
-  o[36] = x9 >>>  0 & 0xff;
-  o[37] = x9 >>>  8 & 0xff;
-  o[38] = x9 >>> 16 & 0xff;
-  o[39] = x9 >>> 24 & 0xff;
-
-  o[40] = x10 >>>  0 & 0xff;
-  o[41] = x10 >>>  8 & 0xff;
-  o[42] = x10 >>> 16 & 0xff;
-  o[43] = x10 >>> 24 & 0xff;
-
-  o[44] = x11 >>>  0 & 0xff;
-  o[45] = x11 >>>  8 & 0xff;
-  o[46] = x11 >>> 16 & 0xff;
-  o[47] = x11 >>> 24 & 0xff;
-
-  o[48] = x12 >>>  0 & 0xff;
-  o[49] = x12 >>>  8 & 0xff;
-  o[50] = x12 >>> 16 & 0xff;
-  o[51] = x12 >>> 24 & 0xff;
-
-  o[52] = x13 >>>  0 & 0xff;
-  o[53] = x13 >>>  8 & 0xff;
-  o[54] = x13 >>> 16 & 0xff;
-  o[55] = x13 >>> 24 & 0xff;
-
-  o[56] = x14 >>>  0 & 0xff;
-  o[57] = x14 >>>  8 & 0xff;
-  o[58] = x14 >>> 16 & 0xff;
-  o[59] = x14 >>> 24 & 0xff;
-
-  o[60] = x15 >>>  0 & 0xff;
-  o[61] = x15 >>>  8 & 0xff;
-  o[62] = x15 >>> 16 & 0xff;
-  o[63] = x15 >>> 24 & 0xff;
-}
-
-function core_hsalsa20(o,p,k,c) {
-  var j0  = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,
-      j1  = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,
-      j2  = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,
-      j3  = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,
-      j4  = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,
-      j5  = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,
-      j6  = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,
-      j7  = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,
-      j8  = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,
-      j9  = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,
-      j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,
-      j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,
-      j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,
-      j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,
-      j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,
-      j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;
-
-  var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,
-      x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,
-      x15 = j15, u;
-
-  for (var i = 0; i < 20; i += 2) {
-    u = x0 + x12 | 0;
-    x4 ^= u<<7 | u>>>(32-7);
-    u = x4 + x0 | 0;
-    x8 ^= u<<9 | u>>>(32-9);
-    u = x8 + x4 | 0;
-    x12 ^= u<<13 | u>>>(32-13);
-    u = x12 + x8 | 0;
-    x0 ^= u<<18 | u>>>(32-18);
-
-    u = x5 + x1 | 0;
-    x9 ^= u<<7 | u>>>(32-7);
-    u = x9 + x5 | 0;
-    x13 ^= u<<9 | u>>>(32-9);
-    u = x13 + x9 | 0;
-    x1 ^= u<<13 | u>>>(32-13);
-    u = x1 + x13 | 0;
-    x5 ^= u<<18 | u>>>(32-18);
-
-    u = x10 + x6 | 0;
-    x14 ^= u<<7 | u>>>(32-7);
-    u = x14 + x10 | 0;
-    x2 ^= u<<9 | u>>>(32-9);
-    u = x2 + x14 | 0;
-    x6 ^= u<<13 | u>>>(32-13);
-    u = x6 + x2 | 0;
-    x10 ^= u<<18 | u>>>(32-18);
-
-    u = x15 + x11 | 0;
-    x3 ^= u<<7 | u>>>(32-7);
-    u = x3 + x15 | 0;
-    x7 ^= u<<9 | u>>>(32-9);
-    u = x7 + x3 | 0;
-    x11 ^= u<<13 | u>>>(32-13);
-    u = x11 + x7 | 0;
-    x15 ^= u<<18 | u>>>(32-18);
-
-    u = x0 + x3 | 0;
-    x1 ^= u<<7 | u>>>(32-7);
-    u = x1 + x0 | 0;
-    x2 ^= u<<9 | u>>>(32-9);
-    u = x2 + x1 | 0;
-    x3 ^= u<<13 | u>>>(32-13);
-    u = x3 + x2 | 0;
-    x0 ^= u<<18 | u>>>(32-18);
-
-    u = x5 + x4 | 0;
-    x6 ^= u<<7 | u>>>(32-7);
-    u = x6 + x5 | 0;
-    x7 ^= u<<9 | u>>>(32-9);
-    u = x7 + x6 | 0;
-    x4 ^= u<<13 | u>>>(32-13);
-    u = x4 + x7 | 0;
-    x5 ^= u<<18 | u>>>(32-18);
-
-    u = x10 + x9 | 0;
-    x11 ^= u<<7 | u>>>(32-7);
-    u = x11 + x10 | 0;
-    x8 ^= u<<9 | u>>>(32-9);
-    u = x8 + x11 | 0;
-    x9 ^= u<<13 | u>>>(32-13);
-    u = x9 + x8 | 0;
-    x10 ^= u<<18 | u>>>(32-18);
-
-    u = x15 + x14 | 0;
-    x12 ^= u<<7 | u>>>(32-7);
-    u = x12 + x15 | 0;
-    x13 ^= u<<9 | u>>>(32-9);
-    u = x13 + x12 | 0;
-    x14 ^= u<<13 | u>>>(32-13);
-    u = x14 + x13 | 0;
-    x15 ^= u<<18 | u>>>(32-18);
-  }
-
-  o[ 0] = x0 >>>  0 & 0xff;
-  o[ 1] = x0 >>>  8 & 0xff;
-  o[ 2] = x0 >>> 16 & 0xff;
-  o[ 3] = x0 >>> 24 & 0xff;
-
-  o[ 4] = x5 >>>  0 & 0xff;
-  o[ 5] = x5 >>>  8 & 0xff;
-  o[ 6] = x5 >>> 16 & 0xff;
-  o[ 7] = x5 >>> 24 & 0xff;
-
-  o[ 8] = x10 >>>  0 & 0xff;
-  o[ 9] = x10 >>>  8 & 0xff;
-  o[10] = x10 >>> 16 & 0xff;
-  o[11] = x10 >>> 24 & 0xff;
-
-  o[12] = x15 >>>  0 & 0xff;
-  o[13] = x15 >>>  8 & 0xff;
-  o[14] = x15 >>> 16 & 0xff;
-  o[15] = x15 >>> 24 & 0xff;
-
-  o[16] = x6 >>>  0 & 0xff;
-  o[17] = x6 >>>  8 & 0xff;
-  o[18] = x6 >>> 16 & 0xff;
-  o[19] = x6 >>> 24 & 0xff;
-
-  o[20] = x7 >>>  0 & 0xff;
-  o[21] = x7 >>>  8 & 0xff;
-  o[22] = x7 >>> 16 & 0xff;
-  o[23] = x7 >>> 24 & 0xff;
-
-  o[24] = x8 >>>  0 & 0xff;
-  o[25] = x8 >>>  8 & 0xff;
-  o[26] = x8 >>> 16 & 0xff;
-  o[27] = x8 >>> 24 & 0xff;
-
-  o[28] = x9 >>>  0 & 0xff;
-  o[29] = x9 >>>  8 & 0xff;
-  o[30] = x9 >>> 16 & 0xff;
-  o[31] = x9 >>> 24 & 0xff;
-}
-
-function crypto_core_salsa20(out,inp,k,c) {
-  core_salsa20(out,inp,k,c);
-}
-
-function crypto_core_hsalsa20(out,inp,k,c) {
-  core_hsalsa20(out,inp,k,c);
-}
-
-var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);
-            // "expand 32-byte k"
-
-function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) {
-  var z = new Uint8Array(16), x = new Uint8Array(64);
-  var u, i;
-  for (i = 0; i < 16; i++) z[i] = 0;
-  for (i = 0; i < 8; i++) z[i] = n[i];
-  while (b >= 64) {
-    crypto_core_salsa20(x,z,k,sigma);
-    for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i];
-    u = 1;
-    for (i = 8; i < 16; i++) {
-      u = u + (z[i] & 0xff) | 0;
-      z[i] = u & 0xff;
-      u >>>= 8;
-    }
-    b -= 64;
-    cpos += 64;
-    mpos += 64;
-  }
-  if (b > 0) {
-    crypto_core_salsa20(x,z,k,sigma);
-    for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i];
-  }
-  return 0;
-}
-
-function crypto_stream_salsa20(c,cpos,b,n,k) {
-  var z = new Uint8Array(16), x = new Uint8Array(64);
-  var u, i;
-  for (i = 0; i < 16; i++) z[i] = 0;
-  for (i = 0; i < 8; i++) z[i] = n[i];
-  while (b >= 64) {
-    crypto_core_salsa20(x,z,k,sigma);
-    for (i = 0; i < 64; i++) c[cpos+i] = x[i];
-    u = 1;
-    for (i = 8; i < 16; i++) {
-      u = u + (z[i] & 0xff) | 0;
-      z[i] = u & 0xff;
-      u >>>= 8;
-    }
-    b -= 64;
-    cpos += 64;
-  }
-  if (b > 0) {
-    crypto_core_salsa20(x,z,k,sigma);
-    for (i = 0; i < b; i++) c[cpos+i] = x[i];
-  }
-  return 0;
-}
-
-function crypto_stream(c,cpos,d,n,k) {
-  var s = new Uint8Array(32);
-  crypto_core_hsalsa20(s,n,k,sigma);
-  var sn = new Uint8Array(8);
-  for (var i = 0; i < 8; i++) sn[i] = n[i+16];
-  return crypto_stream_salsa20(c,cpos,d,sn,s);
-}
-
-function crypto_stream_xor(c,cpos,m,mpos,d,n,k) {
-  var s = new Uint8Array(32);
-  crypto_core_hsalsa20(s,n,k,sigma);
-  var sn = new Uint8Array(8);
-  for (var i = 0; i < 8; i++) sn[i] = n[i+16];
-  return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s);
-}
-
-/*
-* Port of Andrew Moon's Poly1305-donna-16. Public domain.
-* https://github.com/floodyberry/poly1305-donna
-*/
-
-var poly1305 = function(key) {
-  this.buffer = new Uint8Array(16);
-  this.r = new Uint16Array(10);
-  this.h = new Uint16Array(10);
-  this.pad = new Uint16Array(8);
-  this.leftover = 0;
-  this.fin = 0;
-
-  var t0, t1, t2, t3, t4, t5, t6, t7;
-
-  t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0                     ) & 0x1fff;
-  t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 <<  3)) & 0x1fff;
-  t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 <<  6)) & 0x1f03;
-  t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>>  7) | (t3 <<  9)) & 0x1fff;
-  t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>>  4) | (t4 << 12)) & 0x00ff;
-  this.r[5] = ((t4 >>>  1)) & 0x1ffe;
-  t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 <<  2)) & 0x1fff;
-  t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 <<  5)) & 0x1f81;
-  t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>>  8) | (t7 <<  8)) & 0x1fff;
-  this.r[9] = ((t7 >>>  5)) & 0x007f;
-
-  this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8;
-  this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8;
-  this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8;
-  this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8;
-  this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8;
-  this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8;
-  this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8;
-  this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8;
-};
-
-poly1305.prototype.blocks = function(m, mpos, bytes) {
-  var hibit = this.fin ? 0 : (1 << 11);
-  var t0, t1, t2, t3, t4, t5, t6, t7, c;
-  var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9;
-
-  var h0 = this.h[0],
-      h1 = this.h[1],
-      h2 = this.h[2],
-      h3 = this.h[3],
-      h4 = this.h[4],
-      h5 = this.h[5],
-      h6 = this.h[6],
-      h7 = this.h[7],
-      h8 = this.h[8],
-      h9 = this.h[9];
-
-  var r0 = this.r[0],
-      r1 = this.r[1],
-      r2 = this.r[2],
-      r3 = this.r[3],
-      r4 = this.r[4],
-      r5 = this.r[5],
-      r6 = this.r[6],
-      r7 = this.r[7],
-      r8 = this.r[8],
-      r9 = this.r[9];
-
-  while (bytes >= 16) {
-    t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0                     ) & 0x1fff;
-    t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 <<  3)) & 0x1fff;
-    t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 <<  6)) & 0x1fff;
-    t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>>  7) | (t3 <<  9)) & 0x1fff;
-    t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>>  4) | (t4 << 12)) & 0x1fff;
-    h5 += ((t4 >>>  1)) & 0x1fff;
-    t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 <<  2)) & 0x1fff;
-    t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 <<  5)) & 0x1fff;
-    t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>>  8) | (t7 <<  8)) & 0x1fff;
-    h9 += ((t7 >>> 5)) | hibit;
-
-    c = 0;
-
-    d0 = c;
-    d0 += h0 * r0;
-    d0 += h1 * (5 * r9);
-    d0 += h2 * (5 * r8);
-    d0 += h3 * (5 * r7);
-    d0 += h4 * (5 * r6);
-    c = (d0 >>> 13); d0 &= 0x1fff;
-    d0 += h5 * (5 * r5);
-    d0 += h6 * (5 * r4);
-    d0 += h7 * (5 * r3);
-    d0 += h8 * (5 * r2);
-    d0 += h9 * (5 * r1);
-    c += (d0 >>> 13); d0 &= 0x1fff;
-
-    d1 = c;
-    d1 += h0 * r1;
-    d1 += h1 * r0;
-    d1 += h2 * (5 * r9);
-    d1 += h3 * (5 * r8);
-    d1 += h4 * (5 * r7);
-    c = (d1 >>> 13); d1 &= 0x1fff;
-    d1 += h5 * (5 * r6);
-    d1 += h6 * (5 * r5);
-    d1 += h7 * (5 * r4);
-    d1 += h8 * (5 * r3);
-    d1 += h9 * (5 * r2);
-    c += (d1 >>> 13); d1 &= 0x1fff;
-
-    d2 = c;
-    d2 += h0 * r2;
-    d2 += h1 * r1;
-    d2 += h2 * r0;
-    d2 += h3 * (5 * r9);
-    d2 += h4 * (5 * r8);
-    c = (d2 >>> 13); d2 &= 0x1fff;
-    d2 += h5 * (5 * r7);
-    d2 += h6 * (5 * r6);
-    d2 += h7 * (5 * r5);
-    d2 += h8 * (5 * r4);
-    d2 += h9 * (5 * r3);
-    c += (d2 >>> 13); d2 &= 0x1fff;
-
-    d3 = c;
-    d3 += h0 * r3;
-    d3 += h1 * r2;
-    d3 += h2 * r1;
-    d3 += h3 * r0;
-    d3 += h4 * (5 * r9);
-    c = (d3 >>> 13); d3 &= 0x1fff;
-    d3 += h5 * (5 * r8);
-    d3 += h6 * (5 * r7);
-    d3 += h7 * (5 * r6);
-    d3 += h8 * (5 * r5);
-    d3 += h9 * (5 * r4);
-    c += (d3 >>> 13); d3 &= 0x1fff;
-
-    d4 = c;
-    d4 += h0 * r4;
-    d4 += h1 * r3;
-    d4 += h2 * r2;
-    d4 += h3 * r1;
-    d4 += h4 * r0;
-    c = (d4 >>> 13); d4 &= 0x1fff;
-    d4 += h5 * (5 * r9);
-    d4 += h6 * (5 * r8);
-    d4 += h7 * (5 * r7);
-    d4 += h8 * (5 * r6);
-    d4 += h9 * (5 * r5);
-    c += (d4 >>> 13); d4 &= 0x1fff;
-
-    d5 = c;
-    d5 += h0 * r5;
-    d5 += h1 * r4;
-    d5 += h2 * r3;
-    d5 += h3 * r2;
-    d5 += h4 * r1;
-    c = (d5 >>> 13); d5 &= 0x1fff;
-    d5 += h5 * r0;
-    d5 += h6 * (5 * r9);
-    d5 += h7 * (5 * r8);
-    d5 += h8 * (5 * r7);
-    d5 += h9 * (5 * r6);
-    c += (d5 >>> 13); d5 &= 0x1fff;
-
-    d6 = c;
-    d6 += h0 * r6;
-    d6 += h1 * r5;
-    d6 += h2 * r4;
-    d6 += h3 * r3;
-    d6 += h4 * r2;
-    c = (d6 >>> 13); d6 &= 0x1fff;
-    d6 += h5 * r1;
-    d6 += h6 * r0;
-    d6 += h7 * (5 * r9);
-    d6 += h8 * (5 * r8);
-    d6 += h9 * (5 * r7);
-    c += (d6 >>> 13); d6 &= 0x1fff;
-
-    d7 = c;
-    d7 += h0 * r7;
-    d7 += h1 * r6;
-    d7 += h2 * r5;
-    d7 += h3 * r4;
-    d7 += h4 * r3;
-    c = (d7 >>> 13); d7 &= 0x1fff;
-    d7 += h5 * r2;
-    d7 += h6 * r1;
-    d7 += h7 * r0;
-    d7 += h8 * (5 * r9);
-    d7 += h9 * (5 * r8);
-    c += (d7 >>> 13); d7 &= 0x1fff;
-
-    d8 = c;
-    d8 += h0 * r8;
-    d8 += h1 * r7;
-    d8 += h2 * r6;
-    d8 += h3 * r5;
-    d8 += h4 * r4;
-    c = (d8 >>> 13); d8 &= 0x1fff;
-    d8 += h5 * r3;
-    d8 += h6 * r2;
-    d8 += h7 * r1;
-    d8 += h8 * r0;
-    d8 += h9 * (5 * r9);
-    c += (d8 >>> 13); d8 &= 0x1fff;
-
-    d9 = c;
-    d9 += h0 * r9;
-    d9 += h1 * r8;
-    d9 += h2 * r7;
-    d9 += h3 * r6;
-    d9 += h4 * r5;
-    c = (d9 >>> 13); d9 &= 0x1fff;
-    d9 += h5 * r4;
-    d9 += h6 * r3;
-    d9 += h7 * r2;
-    d9 += h8 * r1;
-    d9 += h9 * r0;
-    c += (d9 >>> 13); d9 &= 0x1fff;
-
-    c = (((c << 2) + c)) | 0;
-    c = (c + d0) | 0;
-    d0 = c & 0x1fff;
-    c = (c >>> 13);
-    d1 += c;
-
-    h0 = d0;
-    h1 = d1;
-    h2 = d2;
-    h3 = d3;
-    h4 = d4;
-    h5 = d5;
-    h6 = d6;
-    h7 = d7;
-    h8 = d8;
-    h9 = d9;
-
-    mpos += 16;
-    bytes -= 16;
-  }
-  this.h[0] = h0;
-  this.h[1] = h1;
-  this.h[2] = h2;
-  this.h[3] = h3;
-  this.h[4] = h4;
-  this.h[5] = h5;
-  this.h[6] = h6;
-  this.h[7] = h7;
-  this.h[8] = h8;
-  this.h[9] = h9;
-};
-
-poly1305.prototype.finish = function(mac, macpos) {
-  var g = new Uint16Array(10);
-  var c, mask, f, i;
-
-  if (this.leftover) {
-    i = this.leftover;
-    this.buffer[i++] = 1;
-    for (; i < 16; i++) this.buffer[i] = 0;
-    this.fin = 1;
-    this.blocks(this.buffer, 0, 16);
-  }
-
-  c = this.h[1] >>> 13;
-  this.h[1] &= 0x1fff;
-  for (i = 2; i < 10; i++) {
-    this.h[i] += c;
-    c = this.h[i] >>> 13;
-    this.h[i] &= 0x1fff;
-  }
-  this.h[0] += (c * 5);
-  c = this.h[0] >>> 13;
-  this.h[0] &= 0x1fff;
-  this.h[1] += c;
-  c = this.h[1] >>> 13;
-  this.h[1] &= 0x1fff;
-  this.h[2] += c;
-
-  g[0] = this.h[0] + 5;
-  c = g[0] >>> 13;
-  g[0] &= 0x1fff;
-  for (i = 1; i < 10; i++) {
-    g[i] = this.h[i] + c;
-    c = g[i] >>> 13;
-    g[i] &= 0x1fff;
-  }
-  g[9] -= (1 << 13);
-
-  mask = (g[9] >>> ((2 * 8) - 1)) - 1;
-  for (i = 0; i < 10; i++) g[i] &= mask;
-  mask = ~mask;
-  for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i];
-
-  this.h[0] = ((this.h[0]       ) | (this.h[1] << 13)                    ) & 0xffff;
-  this.h[1] = ((this.h[1] >>>  3) | (this.h[2] << 10)                    ) & 0xffff;
-  this.h[2] = ((this.h[2] >>>  6) | (this.h[3] <<  7)                    ) & 0xffff;
-  this.h[3] = ((this.h[3] >>>  9) | (this.h[4] <<  4)                    ) & 0xffff;
-  this.h[4] = ((this.h[4] >>> 12) | (this.h[5] <<  1) | (this.h[6] << 14)) & 0xffff;
-  this.h[5] = ((this.h[6] >>>  2) | (this.h[7] << 11)                    ) & 0xffff;
-  this.h[6] = ((this.h[7] >>>  5) | (this.h[8] <<  8)                    ) & 0xffff;
-  this.h[7] = ((this.h[8] >>>  8) | (this.h[9] <<  5)                    ) & 0xffff;
-
-  f = this.h[0] + this.pad[0];
-  this.h[0] = f & 0xffff;
-  for (i = 1; i < 8; i++) {
-    f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0;
-    this.h[i] = f & 0xffff;
-  }
-
-  mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff;
-  mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff;
-  mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff;
-  mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff;
-  mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff;
-  mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff;
-  mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff;
-  mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff;
-  mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff;
-  mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff;
-  mac[macpos+10] = (this.h[5] >>> 0) & 0xff;
-  mac[macpos+11] = (this.h[5] >>> 8) & 0xff;
-  mac[macpos+12] = (this.h[6] >>> 0) & 0xff;
-  mac[macpos+13] = (this.h[6] >>> 8) & 0xff;
-  mac[macpos+14] = (this.h[7] >>> 0) & 0xff;
-  mac[macpos+15] = (this.h[7] >>> 8) & 0xff;
-};
-
-poly1305.prototype.update = function(m, mpos, bytes) {
-  var i, want;
-
-  if (this.leftover) {
-    want = (16 - this.leftover);
-    if (want > bytes)
-      want = bytes;
-    for (i = 0; i < want; i++)
-      this.buffer[this.leftover + i] = m[mpos+i];
-    bytes -= want;
-    mpos += want;
-    this.leftover += want;
-    if (this.leftover < 16)
-      return;
-    this.blocks(this.buffer, 0, 16);
-    this.leftover = 0;
-  }
-
-  if (bytes >= 16) {
-    want = bytes - (bytes % 16);
-    this.blocks(m, mpos, want);
-    mpos += want;
-    bytes -= want;
-  }
-
-  if (bytes) {
-    for (i = 0; i < bytes; i++)
-      this.buffer[this.leftover + i] = m[mpos+i];
-    this.leftover += bytes;
-  }
-};
-
-function crypto_onetimeauth(out, outpos, m, mpos, n, k) {
-  var s = new poly1305(k);
-  s.update(m, mpos, n);
-  s.finish(out, outpos);
-  return 0;
-}
-
-function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {
-  var x = new Uint8Array(16);
-  crypto_onetimeauth(x,0,m,mpos,n,k);
-  return crypto_verify_16(h,hpos,x,0);
-}
-
-function crypto_secretbox(c,m,d,n,k) {
-  var i;
-  if (d < 32) return -1;
-  crypto_stream_xor(c,0,m,0,d,n,k);
-  crypto_onetimeauth(c, 16, c, 32, d - 32, c);
-  for (i = 0; i < 16; i++) c[i] = 0;
-  return 0;
-}
-
-function crypto_secretbox_open(m,c,d,n,k) {
-  var i;
-  var x = new Uint8Array(32);
-  if (d < 32) return -1;
-  crypto_stream(x,0,32,n,k);
-  if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1;
-  crypto_stream_xor(m,0,c,0,d,n,k);
-  for (i = 0; i < 32; i++) m[i] = 0;
-  return 0;
-}
-
-function set25519(r, a) {
-  var i;
-  for (i = 0; i < 16; i++) r[i] = a[i]|0;
-}
-
-function car25519(o) {
-  var i, v, c = 1;
-  for (i = 0; i < 16; i++) {
-    v = o[i] + c + 65535;
-    c = Math.floor(v / 65536);
-    o[i] = v - c * 65536;
-  }
-  o[0] += c-1 + 37 * (c-1);
-}
-
-function sel25519(p, q, b) {
-  var t, c = ~(b-1);
-  for (var i = 0; i < 16; i++) {
-    t = c & (p[i] ^ q[i]);
-    p[i] ^= t;
-    q[i] ^= t;
-  }
-}
-
-function pack25519(o, n) {
-  var i, j, b;
-  var m = gf(), t = gf();
-  for (i = 0; i < 16; i++) t[i] = n[i];
-  car25519(t);
-  car25519(t);
-  car25519(t);
-  for (j = 0; j < 2; j++) {
-    m[0] = t[0] - 0xffed;
-    for (i = 1; i < 15; i++) {
-      m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1);
-      m[i-1] &= 0xffff;
-    }
-    m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1);
-    b = (m[15]>>16) & 1;
-    m[14] &= 0xffff;
-    sel25519(t, m, 1-b);
-  }
-  for (i = 0; i < 16; i++) {
-    o[2*i] = t[i] & 0xff;
-    o[2*i+1] = t[i]>>8;
-  }
-}
-
-function neq25519(a, b) {
-  var c = new Uint8Array(32), d = new Uint8Array(32);
-  pack25519(c, a);
-  pack25519(d, b);
-  return crypto_verify_32(c, 0, d, 0);
-}
-
-function par25519(a) {
-  var d = new Uint8Array(32);
-  pack25519(d, a);
-  return d[0] & 1;
-}
-
-function unpack25519(o, n) {
-  var i;
-  for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8);
-  o[15] &= 0x7fff;
-}
-
-function A(o, a, b) {
-  for (var i = 0; i < 16; i++) o[i] = a[i] + b[i];
-}
-
-function Z(o, a, b) {
-  for (var i = 0; i < 16; i++) o[i] = a[i] - b[i];
-}
-
-function M(o, a, b) {
-  var v, c,
-     t0 = 0,  t1 = 0,  t2 = 0,  t3 = 0,  t4 = 0,  t5 = 0,  t6 = 0,  t7 = 0,
-     t8 = 0,  t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,
-    t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,
-    t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,
-    b0 = b[0],
-    b1 = b[1],
-    b2 = b[2],
-    b3 = b[3],
-    b4 = b[4],
-    b5 = b[5],
-    b6 = b[6],
-    b7 = b[7],
-    b8 = b[8],
-    b9 = b[9],
-    b10 = b[10],
-    b11 = b[11],
-    b12 = b[12],
-    b13 = b[13],
-    b14 = b[14],
-    b15 = b[15];
-
-  v = a[0];
-  t0 += v * b0;
-  t1 += v * b1;
-  t2 += v * b2;
-  t3 += v * b3;
-  t4 += v * b4;
-  t5 += v * b5;
-  t6 += v * b6;
-  t7 += v * b7;
-  t8 += v * b8;
-  t9 += v * b9;
-  t10 += v * b10;
-  t11 += v * b11;
-  t12 += v * b12;
-  t13 += v * b13;
-  t14 += v * b14;
-  t15 += v * b15;
-  v = a[1];
-  t1 += v * b0;
-  t2 += v * b1;
-  t3 += v * b2;
-  t4 += v * b3;
-  t5 += v * b4;
-  t6 += v * b5;
-  t7 += v * b6;
-  t8 += v * b7;
-  t9 += v * b8;
-  t10 += v * b9;
-  t11 += v * b10;
-  t12 += v * b11;
-  t13 += v * b12;
-  t14 += v * b13;
-  t15 += v * b14;
-  t16 += v * b15;
-  v = a[2];
-  t2 += v * b0;
-  t3 += v * b1;
-  t4 += v * b2;
-  t5 += v * b3;
-  t6 += v * b4;
-  t7 += v * b5;
-  t8 += v * b6;
-  t9 += v * b7;
-  t10 += v * b8;
-  t11 += v * b9;
-  t12 += v * b10;
-  t13 += v * b11;
-  t14 += v * b12;
-  t15 += v * b13;
-  t16 += v * b14;
-  t17 += v * b15;
-  v = a[3];
-  t3 += v * b0;
-  t4 += v * b1;
-  t5 += v * b2;
-  t6 += v * b3;
-  t7 += v * b4;
-  t8 += v * b5;
-  t9 += v * b6;
-  t10 += v * b7;
-  t11 += v * b8;
-  t12 += v * b9;
-  t13 += v * b10;
-  t14 += v * b11;
-  t15 += v * b12;
-  t16 += v * b13;
-  t17 += v * b14;
-  t18 += v * b15;
-  v = a[4];
-  t4 += v * b0;
-  t5 += v * b1;
-  t6 += v * b2;
-  t7 += v * b3;
-  t8 += v * b4;
-  t9 += v * b5;
-  t10 += v * b6;
-  t11 += v * b7;
-  t12 += v * b8;
-  t13 += v * b9;
-  t14 += v * b10;
-  t15 += v * b11;
-  t16 += v * b12;
-  t17 += v * b13;
-  t18 += v * b14;
-  t19 += v * b15;
-  v = a[5];
-  t5 += v * b0;
-  t6 += v * b1;
-  t7 += v * b2;
-  t8 += v * b3;
-  t9 += v * b4;
-  t10 += v * b5;
-  t11 += v * b6;
-  t12 += v * b7;
-  t13 += v * b8;
-  t14 += v * b9;
-  t15 += v * b10;
-  t16 += v * b11;
-  t17 += v * b12;
-  t18 += v * b13;
-  t19 += v * b14;
-  t20 += v * b15;
-  v = a[6];
-  t6 += v * b0;
-  t7 += v * b1;
-  t8 += v * b2;
-  t9 += v * b3;
-  t10 += v * b4;
-  t11 += v * b5;
-  t12 += v * b6;
-  t13 += v * b7;
-  t14 += v * b8;
-  t15 += v * b9;
-  t16 += v * b10;
-  t17 += v * b11;
-  t18 += v * b12;
-  t19 += v * b13;
-  t20 += v * b14;
-  t21 += v * b15;
-  v = a[7];
-  t7 += v * b0;
-  t8 += v * b1;
-  t9 += v * b2;
-  t10 += v * b3;
-  t11 += v * b4;
-  t12 += v * b5;
-  t13 += v * b6;
-  t14 += v * b7;
-  t15 += v * b8;
-  t16 += v * b9;
-  t17 += v * b10;
-  t18 += v * b11;
-  t19 += v * b12;
-  t20 += v * b13;
-  t21 += v * b14;
-  t22 += v * b15;
-  v = a[8];
-  t8 += v * b0;
-  t9 += v * b1;
-  t10 += v * b2;
-  t11 += v * b3;
-  t12 += v * b4;
-  t13 += v * b5;
-  t14 += v * b6;
-  t15 += v * b7;
-  t16 += v * b8;
-  t17 += v * b9;
-  t18 += v * b10;
-  t19 += v * b11;
-  t20 += v * b12;
-  t21 += v * b13;
-  t22 += v * b14;
-  t23 += v * b15;
-  v = a[9];
-  t9 += v * b0;
-  t10 += v * b1;
-  t11 += v * b2;
-  t12 += v * b3;
-  t13 += v * b4;
-  t14 += v * b5;
-  t15 += v * b6;
-  t16 += v * b7;
-  t17 += v * b8;
-  t18 += v * b9;
-  t19 += v * b10;
-  t20 += v * b11;
-  t21 += v * b12;
-  t22 += v * b13;
-  t23 += v * b14;
-  t24 += v * b15;
-  v = a[10];
-  t10 += v * b0;
-  t11 += v * b1;
-  t12 += v * b2;
-  t13 += v * b3;
-  t14 += v * b4;
-  t15 += v * b5;
-  t16 += v * b6;
-  t17 += v * b7;
-  t18 += v * b8;
-  t19 += v * b9;
-  t20 += v * b10;
-  t21 += v * b11;
-  t22 += v * b12;
-  t23 += v * b13;
-  t24 += v * b14;
-  t25 += v * b15;
-  v = a[11];
-  t11 += v * b0;
-  t12 += v * b1;
-  t13 += v * b2;
-  t14 += v * b3;
-  t15 += v * b4;
-  t16 += v * b5;
-  t17 += v * b6;
-  t18 += v * b7;
-  t19 += v * b8;
-  t20 += v * b9;
-  t21 += v * b10;
-  t22 += v * b11;
-  t23 += v * b12;
-  t24 += v * b13;
-  t25 += v * b14;
-  t26 += v * b15;
-  v = a[12];
-  t12 += v * b0;
-  t13 += v * b1;
-  t14 += v * b2;
-  t15 += v * b3;
-  t16 += v * b4;
-  t17 += v * b5;
-  t18 += v * b6;
-  t19 += v * b7;
-  t20 += v * b8;
-  t21 += v * b9;
-  t22 += v * b10;
-  t23 += v * b11;
-  t24 += v * b12;
-  t25 += v * b13;
-  t26 += v * b14;
-  t27 += v * b15;
-  v = a[13];
-  t13 += v * b0;
-  t14 += v * b1;
-  t15 += v * b2;
-  t16 += v * b3;
-  t17 += v * b4;
-  t18 += v * b5;
-  t19 += v * b6;
-  t20 += v * b7;
-  t21 += v * b8;
-  t22 += v * b9;
-  t23 += v * b10;
-  t24 += v * b11;
-  t25 += v * b12;
-  t26 += v * b13;
-  t27 += v * b14;
-  t28 += v * b15;
-  v = a[14];
-  t14 += v * b0;
-  t15 += v * b1;
-  t16 += v * b2;
-  t17 += v * b3;
-  t18 += v * b4;
-  t19 += v * b5;
-  t20 += v * b6;
-  t21 += v * b7;
-  t22 += v * b8;
-  t23 += v * b9;
-  t24 += v * b10;
-  t25 += v * b11;
-  t26 += v * b12;
-  t27 += v * b13;
-  t28 += v * b14;
-  t29 += v * b15;
-  v = a[15];
-  t15 += v * b0;
-  t16 += v * b1;
-  t17 += v * b2;
-  t18 += v * b3;
-  t19 += v * b4;
-  t20 += v * b5;
-  t21 += v * b6;
-  t22 += v * b7;
-  t23 += v * b8;
-  t24 += v * b9;
-  t25 += v * b10;
-  t26 += v * b11;
-  t27 += v * b12;
-  t28 += v * b13;
-  t29 += v * b14;
-  t30 += v * b15;
-
-  t0  += 38 * t16;
-  t1  += 38 * t17;
-  t2  += 38 * t18;
-  t3  += 38 * t19;
-  t4  += 38 * t20;
-  t5  += 38 * t21;
-  t6  += 38 * t22;
-  t7  += 38 * t23;
-  t8  += 38 * t24;
-  t9  += 38 * t25;
-  t10 += 38 * t26;
-  t11 += 38 * t27;
-  t12 += 38 * t28;
-  t13 += 38 * t29;
-  t14 += 38 * t30;
-  // t15 left as is
-
-  // first car
-  c = 1;
-  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;
-  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;
-  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;
-  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;
-  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;
-  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;
-  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;
-  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;
-  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;
-  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;
-  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;
-  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;
-  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;
-  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;
-  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;
-  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;
-  t0 += c-1 + 37 * (c-1);
-
-  // second car
-  c = 1;
-  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;
-  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;
-  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;
-  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;
-  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;
-  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;
-  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;
-  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;
-  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;
-  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;
-  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;
-  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;
-  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;
-  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;
-  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;
-  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;
-  t0 += c-1 + 37 * (c-1);
-
-  o[ 0] = t0;
-  o[ 1] = t1;
-  o[ 2] = t2;
-  o[ 3] = t3;
-  o[ 4] = t4;
-  o[ 5] = t5;
-  o[ 6] = t6;
-  o[ 7] = t7;
-  o[ 8] = t8;
-  o[ 9] = t9;
-  o[10] = t10;
-  o[11] = t11;
-  o[12] = t12;
-  o[13] = t13;
-  o[14] = t14;
-  o[15] = t15;
-}
-
-function S(o, a) {
-  M(o, a, a);
-}
-
-function inv25519(o, i) {
-  var c = gf();
-  var a;
-  for (a = 0; a < 16; a++) c[a] = i[a];
-  for (a = 253; a >= 0; a--) {
-    S(c, c);
-    if(a !== 2 && a !== 4) M(c, c, i);
-  }
-  for (a = 0; a < 16; a++) o[a] = c[a];
-}
-
-function pow2523(o, i) {
-  var c = gf();
-  var a;
-  for (a = 0; a < 16; a++) c[a] = i[a];
-  for (a = 250; a >= 0; a--) {
-      S(c, c);
-      if(a !== 1) M(c, c, i);
-  }
-  for (a = 0; a < 16; a++) o[a] = c[a];
-}
-
-function crypto_scalarmult(q, n, p) {
-  var z = new Uint8Array(32);
-  var x = new Float64Array(80), r, i;
-  var a = gf(), b = gf(), c = gf(),
-      d = gf(), e = gf(), f = gf();
-  for (i = 0; i < 31; i++) z[i] = n[i];
-  z[31]=(n[31]&127)|64;
-  z[0]&=248;
-  unpack25519(x,p);
-  for (i = 0; i < 16; i++) {
-    b[i]=x[i];
-    d[i]=a[i]=c[i]=0;
-  }
-  a[0]=d[0]=1;
-  for (i=254; i>=0; --i) {
-    r=(z[i>>>3]>>>(i&7))&1;
-    sel25519(a,b,r);
-    sel25519(c,d,r);
-    A(e,a,c);
-    Z(a,a,c);
-    A(c,b,d);
-    Z(b,b,d);
-    S(d,e);
-    S(f,a);
-    M(a,c,a);
-    M(c,b,e);
-    A(e,a,c);
-    Z(a,a,c);
-    S(b,a);
-    Z(c,d,f);
-    M(a,c,_121665);
-    A(a,a,d);
-    M(c,c,a);
-    M(a,d,f);
-    M(d,b,x);
-    S(b,e);
-    sel25519(a,b,r);
-    sel25519(c,d,r);
-  }
-  for (i = 0; i < 16; i++) {
-    x[i+16]=a[i];
-    x[i+32]=c[i];
-    x[i+48]=b[i];
-    x[i+64]=d[i];
-  }
-  var x32 = x.subarray(32);
-  var x16 = x.subarray(16);
-  inv25519(x32,x32);
-  M(x16,x16,x32);
-  pack25519(q,x16);
-  return 0;
-}
-
-function crypto_scalarmult_base(q, n) {
-  return crypto_scalarmult(q, n, _9);
-}
-
-function crypto_box_keypair(y, x) {
-  randombytes(x, 32);
-  return crypto_scalarmult_base(y, x);
-}
-
-function crypto_box_beforenm(k, y, x) {
-  var s = new Uint8Array(32);
-  crypto_scalarmult(s, x, y);
-  return crypto_core_hsalsa20(k, _0, s, sigma);
-}
-
-var crypto_box_afternm = crypto_secretbox;
-var crypto_box_open_afternm = crypto_secretbox_open;
-
-function crypto_box(c, m, d, n, y, x) {
-  var k = new Uint8Array(32);
-  crypto_box_beforenm(k, y, x);
-  return crypto_box_afternm(c, m, d, n, k);
-}
-
-function crypto_box_open(m, c, d, n, y, x) {
-  var k = new Uint8Array(32);
-  crypto_box_beforenm(k, y, x);
-  return crypto_box_open_afternm(m, c, d, n, k);
-}
-
-var K = [
-  0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,
-  0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,
-  0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,
-  0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,
-  0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,
-  0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,
-  0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,
-  0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,
-  0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,
-  0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,
-  0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,
-  0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,
-  0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,
-  0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,
-  0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,
-  0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,
-  0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,
-  0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,
-  0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,
-  0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,
-  0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,
-  0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,
-  0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,
-  0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,
-  0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,
-  0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,
-  0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,
-  0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,
-  0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,
-  0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,
-  0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,
-  0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,
-  0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,
-  0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,
-  0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,
-  0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,
-  0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,
-  0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,
-  0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,
-  0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817
-];
-
-function crypto_hashblocks_hl(hh, hl, m, n) {
-  var wh = new Int32Array(16), wl = new Int32Array(16),
-      bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7,
-      bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7,
-      th, tl, i, j, h, l, a, b, c, d;
-
-  var ah0 = hh[0],
-      ah1 = hh[1],
-      ah2 = hh[2],
-      ah3 = hh[3],
-      ah4 = hh[4],
-      ah5 = hh[5],
-      ah6 = hh[6],
-      ah7 = hh[7],
-
-      al0 = hl[0],
-      al1 = hl[1],
-      al2 = hl[2],
-      al3 = hl[3],
-      al4 = hl[4],
-      al5 = hl[5],
-      al6 = hl[6],
-      al7 = hl[7];
-
-  var pos = 0;
-  while (n >= 128) {
-    for (i = 0; i < 16; i++) {
-      j = 8 * i + pos;
-      wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3];
-      wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7];
-    }
-    for (i = 0; i < 80; i++) {
-      bh0 = ah0;
-      bh1 = ah1;
-      bh2 = ah2;
-      bh3 = ah3;
-      bh4 = ah4;
-      bh5 = ah5;
-      bh6 = ah6;
-      bh7 = ah7;
-
-      bl0 = al0;
-      bl1 = al1;
-      bl2 = al2;
-      bl3 = al3;
-      bl4 = al4;
-      bl5 = al5;
-      bl6 = al6;
-      bl7 = al7;
-
-      // add
-      h = ah7;
-      l = al7;
-
-      a = l & 0xffff; b = l >>> 16;
-      c = h & 0xffff; d = h >>> 16;
-
-      // Sigma1
-      h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32))));
-      l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32))));
-
-      a += l & 0xffff; b += l >>> 16;
-      c += h & 0xffff; d += h >>> 16;
-
-      // Ch
-      h = (ah4 & ah5) ^ (~ah4 & ah6);
-      l = (al4 & al5) ^ (~al4 & al6);
-
-      a += l & 0xffff; b += l >>> 16;
-      c += h & 0xffff; d += h >>> 16;
-
-      // K
-      h = K[i*2];
-      l = K[i*2+1];
-
-      a += l & 0xffff; b += l >>> 16;
-      c += h & 0xffff; d += h >>> 16;
-
-      // w
-      h = wh[i%16];
-      l = wl[i%16];
-
-      a += l & 0xffff; b += l >>> 16;
-      c += h & 0xffff; d += h >>> 16;
-
-      b += a >>> 16;
-      c += b >>> 16;
-      d += c >>> 16;
-
-      th = c & 0xffff | d << 16;
-      tl = a & 0xffff | b << 16;
-
-      // add
-      h = th;
-      l = tl;
-
-      a = l & 0xffff; b = l >>> 16;
-      c = h & 0xffff; d = h >>> 16;
-
-      // Sigma0
-      h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32))));
-      l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32))));
-
-      a += l & 0xffff; b += l >>> 16;
-      c += h & 0xffff; d += h >>> 16;
-
-      // Maj
-      h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2);
-      l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2);
-
-      a += l & 0xffff; b += l >>> 16;
-      c += h & 0xffff; d += h >>> 16;
-
-      b += a >>> 16;
-      c += b >>> 16;
-      d += c >>> 16;
-
-      bh7 = (c & 0xffff) | (d << 16);
-      bl7 = (a & 0xffff) | (b << 16);
-
-      // add
-      h = bh3;
-      l = bl3;
-
-      a = l & 0xffff; b = l >>> 16;
-      c = h & 0xffff; d = h >>> 16;
-
-      h = th;
-      l = tl;
-
-      a += l & 0xffff; b += l >>> 16;
-      c += h & 0xffff; d += h >>> 16;
-
-      b += a >>> 16;
-      c += b >>> 16;
-      d += c >>> 16;
-
-      bh3 = (c & 0xffff) | (d << 16);
-      bl3 = (a & 0xffff) | (b << 16);
-
-      ah1 = bh0;
-      ah2 = bh1;
-      ah3 = bh2;
-      ah4 = bh3;
-      ah5 = bh4;
-      ah6 = bh5;
-      ah7 = bh6;
-      ah0 = bh7;
-
-      al1 = bl0;
-      al2 = bl1;
-      al3 = bl2;
-      al4 = bl3;
-      al5 = bl4;
-      al6 = bl5;
-      al7 = bl6;
-      al0 = bl7;
-
-      if (i%16 === 15) {
-        for (j = 0; j < 16; j++) {
-          // add
-          h = wh[j];
-          l = wl[j];
-
-          a = l & 0xffff; b = l >>> 16;
-          c = h & 0xffff; d = h >>> 16;
-
-          h = wh[(j+9)%16];
-          l = wl[(j+9)%16];
-
-          a += l & 0xffff; b += l >>> 16;
-          c += h & 0xffff; d += h >>> 16;
-
-          // sigma0
-          th = wh[(j+1)%16];
-          tl = wl[(j+1)%16];
-          h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7);
-          l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7)));
-
-          a += l & 0xffff; b += l >>> 16;
-          c += h & 0xffff; d += h >>> 16;
-
-          // sigma1
-          th = wh[(j+14)%16];
-          tl = wl[(j+14)%16];
-          h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6);
-          l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6)));
-
-          a += l & 0xffff; b += l >>> 16;
-          c += h & 0xffff; d += h >>> 16;
-
-          b += a >>> 16;
-          c += b >>> 16;
-          d += c >>> 16;
-
-          wh[j] = (c & 0xffff) | (d << 16);
-          wl[j] = (a & 0xffff) | (b << 16);
-        }
-      }
-    }
-
-    // add
-    h = ah0;
-    l = al0;
-
-    a = l & 0xffff; b = l >>> 16;
-    c = h & 0xffff; d = h >>> 16;
-
-    h = hh[0];
-    l = hl[0];
-
-    a += l & 0xffff; b += l >>> 16;
-    c += h & 0xffff; d += h >>> 16;
-
-    b += a >>> 16;
-    c += b >>> 16;
-    d += c >>> 16;
-
-    hh[0] = ah0 = (c & 0xffff) | (d << 16);
-    hl[0] = al0 = (a & 0xffff) | (b << 16);
-
-    h = ah1;
-    l = al1;
-
-    a = l & 0xffff; b = l >>> 16;
-    c = h & 0xffff; d = h >>> 16;
-
-    h = hh[1];
-    l = hl[1];
-
-    a += l & 0xffff; b += l >>> 16;
-    c += h & 0xffff; d += h >>> 16;
-
-    b += a >>> 16;
-    c += b >>> 16;
-    d += c >>> 16;
-
-    hh[1] = ah1 = (c & 0xffff) | (d << 16);
-    hl[1] = al1 = (a & 0xffff) | (b << 16);
-
-    h = ah2;
-    l = al2;
-
-    a = l & 0xffff; b = l >>> 16;
-    c = h & 0xffff; d = h >>> 16;
-
-    h = hh[2];
-    l = hl[2];
-
-    a += l & 0xffff; b += l >>> 16;
-    c += h & 0xffff; d += h >>> 16;
-
-    b += a >>> 16;
-    c += b >>> 16;
-    d += c >>> 16;
-
-    hh[2] = ah2 = (c & 0xffff) | (d << 16);
-    hl[2] = al2 = (a & 0xffff) | (b << 16);
-
-    h = ah3;
-    l = al3;
-
-    a = l & 0xffff; b = l >>> 16;
-    c = h & 0xffff; d = h >>> 16;
-
-    h = hh[3];
-    l = hl[3];
-
-    a += l & 0xffff; b += l >>> 16;
-    c += h & 0xffff; d += h >>> 16;
-
-    b += a >>> 16;
-    c += b >>> 16;
-    d += c >>> 16;
-
-    hh[3] = ah3 = (c & 0xffff) | (d << 16);
-    hl[3] = al3 = (a & 0xffff) | (b << 16);
-
-    h = ah4;
-    l = al4;
-
-    a = l & 0xffff; b = l >>> 16;
-    c = h & 0xffff; d = h >>> 16;
-
-    h = hh[4];
-    l = hl[4];
-
-    a += l & 0xffff; b += l >>> 16;
-    c += h & 0xffff; d += h >>> 16;
-
-    b += a >>> 16;
-    c += b >>> 16;
-    d += c >>> 16;
-
-    hh[4] = ah4 = (c & 0xffff) | (d << 16);
-    hl[4] = al4 = (a & 0xffff) | (b << 16);
-
-    h = ah5;
-    l = al5;
-
-    a = l & 0xffff; b = l >>> 16;
-    c = h & 0xffff; d = h >>> 16;
-
-    h = hh[5];
-    l = hl[5];
-
-    a += l & 0xffff; b += l >>> 16;
-    c += h & 0xffff; d += h >>> 16;
-
-    b += a >>> 16;
-    c += b >>> 16;
-    d += c >>> 16;
-
-    hh[5] = ah5 = (c & 0xffff) | (d << 16);
-    hl[5] = al5 = (a & 0xffff) | (b << 16);
-
-    h = ah6;
-    l = al6;
-
-    a = l & 0xffff; b = l >>> 16;
-    c = h & 0xffff; d = h >>> 16;
-
-    h = hh[6];
-    l = hl[6];
-
-    a += l & 0xffff; b += l >>> 16;
-    c += h & 0xffff; d += h >>> 16;
-
-    b += a >>> 16;
-    c += b >>> 16;
-    d += c >>> 16;
-
-    hh[6] = ah6 = (c & 0xffff) | (d << 16);
-    hl[6] = al6 = (a & 0xffff) | (b << 16);
-
-    h = ah7;
-    l = al7;
-
-    a = l & 0xffff; b = l >>> 16;
-    c = h & 0xffff; d = h >>> 16;
-
-    h = hh[7];
-    l = hl[7];
-
-    a += l & 0xffff; b += l >>> 16;
-    c += h & 0xffff; d += h >>> 16;
-
-    b += a >>> 16;
-    c += b >>> 16;
-    d += c >>> 16;
-
-    hh[7] = ah7 = (c & 0xffff) | (d << 16);
-    hl[7] = al7 = (a & 0xffff) | (b << 16);
-
-    pos += 128;
-    n -= 128;
-  }
-
-  return n;
-}
-
-function crypto_hash(out, m, n) {
-  var hh = new Int32Array(8),
-      hl = new Int32Array(8),
-      x = new Uint8Array(256),
-      i, b = n;
-
-  hh[0] = 0x6a09e667;
-  hh[1] = 0xbb67ae85;
-  hh[2] = 0x3c6ef372;
-  hh[3] = 0xa54ff53a;
-  hh[4] = 0x510e527f;
-  hh[5] = 0x9b05688c;
-  hh[6] = 0x1f83d9ab;
-  hh[7] = 0x5be0cd19;
-
-  hl[0] = 0xf3bcc908;
-  hl[1] = 0x84caa73b;
-  hl[2] = 0xfe94f82b;
-  hl[3] = 0x5f1d36f1;
-  hl[4] = 0xade682d1;
-  hl[5] = 0x2b3e6c1f;
-  hl[6] = 0xfb41bd6b;
-  hl[7] = 0x137e2179;
-
-  crypto_hashblocks_hl(hh, hl, m, n);
-  n %= 128;
-
-  for (i = 0; i < n; i++) x[i] = m[b-n+i];
-  x[n] = 128;
-
-  n = 256-128*(n<112?1:0);
-  x[n-9] = 0;
-  ts64(x, n-8,  (b / 0x20000000) | 0, b << 3);
-  crypto_hashblocks_hl(hh, hl, x, n);
-
-  for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]);
-
-  return 0;
-}
-
-function add(p, q) {
-  var a = gf(), b = gf(), c = gf(),
-      d = gf(), e = gf(), f = gf(),
-      g = gf(), h = gf(), t = gf();
-
-  Z(a, p[1], p[0]);
-  Z(t, q[1], q[0]);
-  M(a, a, t);
-  A(b, p[0], p[1]);
-  A(t, q[0], q[1]);
-  M(b, b, t);
-  M(c, p[3], q[3]);
-  M(c, c, D2);
-  M(d, p[2], q[2]);
-  A(d, d, d);
-  Z(e, b, a);
-  Z(f, d, c);
-  A(g, d, c);
-  A(h, b, a);
-
-  M(p[0], e, f);
-  M(p[1], h, g);
-  M(p[2], g, f);
-  M(p[3], e, h);
-}
-
-function cswap(p, q, b) {
-  var i;
-  for (i = 0; i < 4; i++) {
-    sel25519(p[i], q[i], b);
-  }
-}
-
-function pack(r, p) {
-  var tx = gf(), ty = gf(), zi = gf();
-  inv25519(zi, p[2]);
-  M(tx, p[0], zi);
-  M(ty, p[1], zi);
-  pack25519(r, ty);
-  r[31] ^= par25519(tx) << 7;
-}
-
-function scalarmult(p, q, s) {
-  var b, i;
-  set25519(p[0], gf0);
-  set25519(p[1], gf1);
-  set25519(p[2], gf1);
-  set25519(p[3], gf0);
-  for (i = 255; i >= 0; --i) {
-    b = (s[(i/8)|0] >> (i&7)) & 1;
-    cswap(p, q, b);
-    add(q, p);
-    add(p, p);
-    cswap(p, q, b);
-  }
-}
-
-function scalarbase(p, s) {
-  var q = [gf(), gf(), gf(), gf()];
-  set25519(q[0], X);
-  set25519(q[1], Y);
-  set25519(q[2], gf1);
-  M(q[3], X, Y);
-  scalarmult(p, q, s);
-}
-
-function crypto_sign_keypair(pk, sk, seeded) {
-  var d = new Uint8Array(64);
-  var p = [gf(), gf(), gf(), gf()];
-  var i;
-
-  if (!seeded) randombytes(sk, 32);
-  crypto_hash(d, sk, 32);
-  d[0] &= 248;
-  d[31] &= 127;
-  d[31] |= 64;
-
-  scalarbase(p, d);
-  pack(pk, p);
-
-  for (i = 0; i < 32; i++) sk[i+32] = pk[i];
-  return 0;
-}
-
-var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);
-
-function modL(r, x) {
-  var carry, i, j, k;
-  for (i = 63; i >= 32; --i) {
-    carry = 0;
-    for (j = i - 32, k = i - 12; j < k; ++j) {
-      x[j] += carry - 16 * x[i] * L[j - (i - 32)];
-      carry = (x[j] + 128) >> 8;
-      x[j] -= carry * 256;
-    }
-    x[j] += carry;
-    x[i] = 0;
-  }
-  carry = 0;
-  for (j = 0; j < 32; j++) {
-    x[j] += carry - (x[31] >> 4) * L[j];
-    carry = x[j] >> 8;
-    x[j] &= 255;
-  }
-  for (j = 0; j < 32; j++) x[j] -= carry * L[j];
-  for (i = 0; i < 32; i++) {
-    x[i+1] += x[i] >> 8;
-    r[i] = x[i] & 255;
-  }
-}
-
-function reduce(r) {
-  var x = new Float64Array(64), i;
-  for (i = 0; i < 64; i++) x[i] = r[i];
-  for (i = 0; i < 64; i++) r[i] = 0;
-  modL(r, x);
-}
-
-// Note: difference from C - smlen returned, not passed as argument.
-function crypto_sign(sm, m, n, sk) {
-  var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);
-  var i, j, x = new Float64Array(64);
-  var p = [gf(), gf(), gf(), gf()];
-
-  crypto_hash(d, sk, 32);
-  d[0] &= 248;
-  d[31] &= 127;
-  d[31] |= 64;
-
-  var smlen = n + 64;
-  for (i = 0; i < n; i++) sm[64 + i] = m[i];
-  for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];
-
-  crypto_hash(r, sm.subarray(32), n+32);
-  reduce(r);
-  scalarbase(p, r);
-  pack(sm, p);
-
-  for (i = 32; i < 64; i++) sm[i] = sk[i];
-  crypto_hash(h, sm, n + 64);
-  reduce(h);
-
-  for (i = 0; i < 64; i++) x[i] = 0;
-  for (i = 0; i < 32; i++) x[i] = r[i];
-  for (i = 0; i < 32; i++) {
-    for (j = 0; j < 32; j++) {
-      x[i+j] += h[i] * d[j];
-    }
-  }
-
-  modL(sm.subarray(32), x);
-  return smlen;
-}
-
-function unpackneg(r, p) {
-  var t = gf(), chk = gf(), num = gf(),
-      den = gf(), den2 = gf(), den4 = gf(),
-      den6 = gf();
-
-  set25519(r[2], gf1);
-  unpack25519(r[1], p);
-  S(num, r[1]);
-  M(den, num, D);
-  Z(num, num, r[2]);
-  A(den, r[2], den);
-
-  S(den2, den);
-  S(den4, den2);
-  M(den6, den4, den2);
-  M(t, den6, num);
-  M(t, t, den);
-
-  pow2523(t, t);
-  M(t, t, num);
-  M(t, t, den);
-  M(t, t, den);
-  M(r[0], t, den);
-
-  S(chk, r[0]);
-  M(chk, chk, den);
-  if (neq25519(chk, num)) M(r[0], r[0], I);
-
-  S(chk, r[0]);
-  M(chk, chk, den);
-  if (neq25519(chk, num)) return -1;
-
-  if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]);
-
-  M(r[3], r[0], r[1]);
-  return 0;
-}
-
-function crypto_sign_open(m, sm, n, pk) {
-  var i, mlen;
-  var t = new Uint8Array(32), h = new Uint8Array(64);
-  var p = [gf(), gf(), gf(), gf()],
-      q = [gf(), gf(), gf(), gf()];
-
-  mlen = -1;
-  if (n < 64) return -1;
-
-  if (unpackneg(q, pk)) return -1;
-
-  for (i = 0; i < n; i++) m[i] = sm[i];
-  for (i = 0; i < 32; i++) m[i+32] = pk[i];
-  crypto_hash(h, m, n);
-  reduce(h);
-  scalarmult(p, q, h);
-
-  scalarbase(q, sm.subarray(32));
-  add(p, q);
-  pack(t, p);
-
-  n -= 64;
-  if (crypto_verify_32(sm, 0, t, 0)) {
-    for (i = 0; i < n; i++) m[i] = 0;
-    return -1;
-  }
-
-  for (i = 0; i < n; i++) m[i] = sm[i + 64];
-  mlen = n;
-  return mlen;
-}
-
-var crypto_secretbox_KEYBYTES = 32,
-    crypto_secretbox_NONCEBYTES = 24,
-    crypto_secretbox_ZEROBYTES = 32,
-    crypto_secretbox_BOXZEROBYTES = 16,
-    crypto_scalarmult_BYTES = 32,
-    crypto_scalarmult_SCALARBYTES = 32,
-    crypto_box_PUBLICKEYBYTES = 32,
-    crypto_box_SECRETKEYBYTES = 32,
-    crypto_box_BEFORENMBYTES = 32,
-    crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,
-    crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,
-    crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,
-    crypto_sign_BYTES = 64,
-    crypto_sign_PUBLICKEYBYTES = 32,
-    crypto_sign_SECRETKEYBYTES = 64,
-    crypto_sign_SEEDBYTES = 32,
-    crypto_hash_BYTES = 64;
-
-nacl.lowlevel = {
-  crypto_core_hsalsa20: crypto_core_hsalsa20,
-  crypto_stream_xor: crypto_stream_xor,
-  crypto_stream: crypto_stream,
-  crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,
-  crypto_stream_salsa20: crypto_stream_salsa20,
-  crypto_onetimeauth: crypto_onetimeauth,
-  crypto_onetimeauth_verify: crypto_onetimeauth_verify,
-  crypto_verify_16: crypto_verify_16,
-  crypto_verify_32: crypto_verify_32,
-  crypto_secretbox: crypto_secretbox,
-  crypto_secretbox_open: crypto_secretbox_open,
-  crypto_scalarmult: crypto_scalarmult,
-  crypto_scalarmult_base: crypto_scalarmult_base,
-  crypto_box_beforenm: crypto_box_beforenm,
-  crypto_box_afternm: crypto_box_afternm,
-  crypto_box: crypto_box,
-  crypto_box_open: crypto_box_open,
-  crypto_box_keypair: crypto_box_keypair,
-  crypto_hash: crypto_hash,
-  crypto_sign: crypto_sign,
-  crypto_sign_keypair: crypto_sign_keypair,
-  crypto_sign_open: crypto_sign_open,
-
-  crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,
-  crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,
-  crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,
-  crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,
-  crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,
-  crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,
-  crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,
-  crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,
-  crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,
-  crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,
-  crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,
-  crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,
-  crypto_sign_BYTES: crypto_sign_BYTES,
-  crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,
-  crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,
-  crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,
-  crypto_hash_BYTES: crypto_hash_BYTES
-};
-
-/* High-level API */
-
-function checkLengths(k, n) {
-  if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');
-  if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');
-}
-
-function checkBoxLengths(pk, sk) {
-  if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');
-  if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');
-}
-
-function checkArrayTypes() {
-  var t, i;
-  for (i = 0; i < arguments.length; i++) {
-     if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]')
-       throw new TypeError('unexpected type ' + t + ', use Uint8Array');
-  }
-}
-
-function cleanup(arr) {
-  for (var i = 0; i < arr.length; i++) arr[i] = 0;
-}
-
-nacl.util = {};
-
-nacl.util.decodeUTF8 = function(s) {
-  var i, d = unescape(encodeURIComponent(s)), b = new Uint8Array(d.length);
-  for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i);
-  return b;
-};
-
-nacl.util.encodeUTF8 = function(arr) {
-  var i, s = [];
-  for (i = 0; i < arr.length; i++) s.push(String.fromCharCode(arr[i]));
-  return decodeURIComponent(escape(s.join('')));
-};
-
-nacl.util.encodeBase64 = function(arr) {
-  if (typeof btoa === 'undefined') {
-    return (new Buffer(arr)).toString('base64');
-  } else {
-    var i, s = [], len = arr.length;
-    for (i = 0; i < len; i++) s.push(String.fromCharCode(arr[i]));
-    return btoa(s.join(''));
-  }
-};
-
-nacl.util.decodeBase64 = function(s) {
-  if (typeof atob === 'undefined') {
-    return new Uint8Array(Array.prototype.slice.call(new Buffer(s, 'base64'), 0));
-  } else {
-    var i, d = atob(s), b = new Uint8Array(d.length);
-    for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i);
-    return b;
-  }
-};
-
-nacl.randomBytes = function(n) {
-  var b = new Uint8Array(n);
-  randombytes(b, n);
-  return b;
-};
-
-nacl.secretbox = function(msg, nonce, key) {
-  checkArrayTypes(msg, nonce, key);
-  checkLengths(key, nonce);
-  var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);
-  var c = new Uint8Array(m.length);
-  for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i];
-  crypto_secretbox(c, m, m.length, nonce, key);
-  return c.subarray(crypto_secretbox_BOXZEROBYTES);
-};
-
-nacl.secretbox.open = function(box, nonce, key) {
-  checkArrayTypes(box, nonce, key);
-  checkLengths(key, nonce);
-  var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);
-  var m = new Uint8Array(c.length);
-  for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i];
-  if (c.length < 32) return false;
-  if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false;
-  return m.subarray(crypto_secretbox_ZEROBYTES);
-};
-
-nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;
-nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;
-nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;
-
-nacl.scalarMult = function(n, p) {
-  checkArrayTypes(n, p);
-  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
-  if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');
-  var q = new Uint8Array(crypto_scalarmult_BYTES);
-  crypto_scalarmult(q, n, p);
-  return q;
-};
-
-nacl.scalarMult.base = function(n) {
-  checkArrayTypes(n);
-  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
-  var q = new Uint8Array(crypto_scalarmult_BYTES);
-  crypto_scalarmult_base(q, n);
-  return q;
-};
-
-nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;
-nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;
-
-nacl.box = function(msg, nonce, publicKey, secretKey) {
-  var k = nacl.box.before(publicKey, secretKey);
-  return nacl.secretbox(msg, nonce, k);
-};
-
-nacl.box.before = function(publicKey, secretKey) {
-  checkArrayTypes(publicKey, secretKey);
-  checkBoxLengths(publicKey, secretKey);
-  var k = new Uint8Array(crypto_box_BEFORENMBYTES);
-  crypto_box_beforenm(k, publicKey, secretKey);
-  return k;
-};
-
-nacl.box.after = nacl.secretbox;
-
-nacl.box.open = function(msg, nonce, publicKey, secretKey) {
-  var k = nacl.box.before(publicKey, secretKey);
-  return nacl.secretbox.open(msg, nonce, k);
-};
-
-nacl.box.open.after = nacl.secretbox.open;
-
-nacl.box.keyPair = function() {
-  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
-  var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);
-  crypto_box_keypair(pk, sk);
-  return {publicKey: pk, secretKey: sk};
-};
-
-nacl.box.keyPair.fromSecretKey = function(secretKey) {
-  checkArrayTypes(secretKey);
-  if (secretKey.length !== crypto_box_SECRETKEYBYTES)
-    throw new Error('bad secret key size');
-  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
-  crypto_scalarmult_base(pk, secretKey);
-  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
-};
-
-nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;
-nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;
-nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;
-nacl.box.nonceLength = crypto_box_NONCEBYTES;
-nacl.box.overheadLength = nacl.secretbox.overheadLength;
-
-nacl.sign = function(msg, secretKey) {
-  checkArrayTypes(msg, secretKey);
-  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
-    throw new Error('bad secret key size');
-  var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length);
-  crypto_sign(signedMsg, msg, msg.length, secretKey);
-  return signedMsg;
-};
-
-nacl.sign.open = function(signedMsg, publicKey) {
-  if (arguments.length !== 2)
-    throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?');
-  checkArrayTypes(signedMsg, publicKey);
-  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
-    throw new Error('bad public key size');
-  var tmp = new Uint8Array(signedMsg.length);
-  var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);
-  if (mlen < 0) return null;
-  var m = new Uint8Array(mlen);
-  for (var i = 0; i < m.length; i++) m[i] = tmp[i];
-  return m;
-};
-
-nacl.sign.detached = function(msg, secretKey) {
-  var signedMsg = nacl.sign(msg, secretKey);
-  var sig = new Uint8Array(crypto_sign_BYTES);
-  for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];
-  return sig;
-};
-
-nacl.sign.detached.verify = function(msg, sig, publicKey) {
-  checkArrayTypes(msg, sig, publicKey);
-  if (sig.length !== crypto_sign_BYTES)
-    throw new Error('bad signature size');
-  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
-    throw new Error('bad public key size');
-  var sm = new Uint8Array(crypto_sign_BYTES + msg.length);
-  var m = new Uint8Array(crypto_sign_BYTES + msg.length);
-  var i;
-  for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];
-  for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];
-  return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);
-};
-
-nacl.sign.keyPair = function() {
-  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
-  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
-  crypto_sign_keypair(pk, sk);
-  return {publicKey: pk, secretKey: sk};
-};
-
-nacl.sign.keyPair.fromSecretKey = function(secretKey) {
-  checkArrayTypes(secretKey);
-  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
-    throw new Error('bad secret key size');
-  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
-  for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i];
-  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
-};
-
-nacl.sign.keyPair.fromSeed = function(seed) {
-  checkArrayTypes(seed);
-  if (seed.length !== crypto_sign_SEEDBYTES)
-    throw new Error('bad seed size');
-  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
-  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
-  for (var i = 0; i < 32; i++) sk[i] = seed[i];
-  crypto_sign_keypair(pk, sk, true);
-  return {publicKey: pk, secretKey: sk};
-};
-
-nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;
-nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;
-nacl.sign.seedLength = crypto_sign_SEEDBYTES;
-nacl.sign.signatureLength = crypto_sign_BYTES;
-
-nacl.hash = function(msg) {
-  checkArrayTypes(msg);
-  var h = new Uint8Array(crypto_hash_BYTES);
-  crypto_hash(h, msg, msg.length);
-  return h;
-};
-
-nacl.hash.hashLength = crypto_hash_BYTES;
-
-nacl.verify = function(x, y) {
-  checkArrayTypes(x, y);
-  // Zero length arguments are considered not equal.
-  if (x.length === 0 || y.length === 0) return false;
-  if (x.length !== y.length) return false;
-  return (vn(x, 0, y, 0, x.length) === 0) ? true : false;
-};
-
-nacl.setPRNG = function(fn) {
-  randombytes = fn;
-};
-
-(function() {
-  // Initialize PRNG if environment provides CSPRNG.
-  // If not, methods calling randombytes will throw.
-  var crypto;
-  if (typeof window !== 'undefined') {
-    // Browser.
-    if (window.crypto && window.crypto.getRandomValues) {
-      crypto = window.crypto; // Standard
-    } else if (window.msCrypto && window.msCrypto.getRandomValues) {
-      crypto = window.msCrypto; // Internet Explorer 11+
-    }
-    if (crypto) {
-      nacl.setPRNG(function(x, n) {
-        var i, v = new Uint8Array(n);
-        crypto.getRandomValues(v);
-        for (i = 0; i < n; i++) x[i] = v[i];
-        cleanup(v);
-      });
-    }
-  } else if (typeof require !== 'undefined') {
-    // Node.js.
-    crypto = require('crypto');
-    if (crypto) {
-      nacl.setPRNG(function(x, n) {
-        var i, v = crypto.randomBytes(n);
-        for (i = 0; i < n; i++) x[i] = v[i];
-        cleanup(v);
-      });
-    }
-  }
-})();
-
-})(typeof module !== 'undefined' && module.exports ? module.exports : (window.nacl = window.nacl || {}));
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.min.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.min.js
deleted file mode 100644
index 7072c2af4435bd459fddd9639a161840b8577dba..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl-fast.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-!function(r){"use strict";function t(r,t,n,e){r[t]=n>>24&255,r[t+1]=n>>16&255,r[t+2]=n>>8&255,r[t+3]=255&n,r[t+4]=e>>24&255,r[t+5]=e>>16&255,r[t+6]=e>>8&255,r[t+7]=255&e}function n(r,t,n,e,o){var i,h=0;for(i=0;o>i;i++)h|=r[t+i]^n[e+i];return(1&h-1>>>8)-1}function e(r,t,e,o){return n(r,t,e,o,16)}function o(r,t,e,o){return n(r,t,e,o,32)}function i(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,u=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,c=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,g=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,v=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,b=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,d=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,_=i,U=h,E=a,x=f,M=s,m=u,B=c,S=y,K=l,T=w,Y=p,k=g,L=v,C=b,R=d,z=A,P=0;20>P;P+=2)o=_+L|0,M^=o<<7|o>>>25,o=M+_|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,_^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,C^=o<<9|o>>>23,o=C+T|0,U^=o<<13|o>>>19,o=U+C|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=z+k|0,x^=o<<7|o>>>25,o=x+z|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,z^=o<<18|o>>>14,o=_+x|0,U^=o<<7|o>>>25,o=U+_|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,_^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=z+R|0,L^=o<<7|o>>>25,o=L+z|0,C^=o<<9|o>>>23,o=C+L|0,R^=o<<13|o>>>19,o=R+C|0,z^=o<<18|o>>>14;_=_+i|0,U=U+h|0,E=E+a|0,x=x+f|0,M=M+s|0,m=m+u|0,B=B+c|0,S=S+y|0,K=K+l|0,T=T+w|0,Y=Y+p|0,k=k+g|0,L=L+v|0,C=C+b|0,R=R+d|0,z=z+A|0,r[0]=_>>>0&255,r[1]=_>>>8&255,r[2]=_>>>16&255,r[3]=_>>>24&255,r[4]=U>>>0&255,r[5]=U>>>8&255,r[6]=U>>>16&255,r[7]=U>>>24&255,r[8]=E>>>0&255,r[9]=E>>>8&255,r[10]=E>>>16&255,r[11]=E>>>24&255,r[12]=x>>>0&255,r[13]=x>>>8&255,r[14]=x>>>16&255,r[15]=x>>>24&255,r[16]=M>>>0&255,r[17]=M>>>8&255,r[18]=M>>>16&255,r[19]=M>>>24&255,r[20]=m>>>0&255,r[21]=m>>>8&255,r[22]=m>>>16&255,r[23]=m>>>24&255,r[24]=B>>>0&255,r[25]=B>>>8&255,r[26]=B>>>16&255,r[27]=B>>>24&255,r[28]=S>>>0&255,r[29]=S>>>8&255,r[30]=S>>>16&255,r[31]=S>>>24&255,r[32]=K>>>0&255,r[33]=K>>>8&255,r[34]=K>>>16&255,r[35]=K>>>24&255,r[36]=T>>>0&255,r[37]=T>>>8&255,r[38]=T>>>16&255,r[39]=T>>>24&255,r[40]=Y>>>0&255,r[41]=Y>>>8&255,r[42]=Y>>>16&255,r[43]=Y>>>24&255,r[44]=k>>>0&255,r[45]=k>>>8&255,r[46]=k>>>16&255,r[47]=k>>>24&255,r[48]=L>>>0&255,r[49]=L>>>8&255,r[50]=L>>>16&255,r[51]=L>>>24&255,r[52]=C>>>0&255,r[53]=C>>>8&255,r[54]=C>>>16&255,r[55]=C>>>24&255,r[56]=R>>>0&255,r[57]=R>>>8&255,r[58]=R>>>16&255,r[59]=R>>>24&255,r[60]=z>>>0&255,r[61]=z>>>8&255,r[62]=z>>>16&255,r[63]=z>>>24&255}function h(r,t,n,e){for(var o,i=255&e[0]|(255&e[1])<<8|(255&e[2])<<16|(255&e[3])<<24,h=255&n[0]|(255&n[1])<<8|(255&n[2])<<16|(255&n[3])<<24,a=255&n[4]|(255&n[5])<<8|(255&n[6])<<16|(255&n[7])<<24,f=255&n[8]|(255&n[9])<<8|(255&n[10])<<16|(255&n[11])<<24,s=255&n[12]|(255&n[13])<<8|(255&n[14])<<16|(255&n[15])<<24,u=255&e[4]|(255&e[5])<<8|(255&e[6])<<16|(255&e[7])<<24,c=255&t[0]|(255&t[1])<<8|(255&t[2])<<16|(255&t[3])<<24,y=255&t[4]|(255&t[5])<<8|(255&t[6])<<16|(255&t[7])<<24,l=255&t[8]|(255&t[9])<<8|(255&t[10])<<16|(255&t[11])<<24,w=255&t[12]|(255&t[13])<<8|(255&t[14])<<16|(255&t[15])<<24,p=255&e[8]|(255&e[9])<<8|(255&e[10])<<16|(255&e[11])<<24,g=255&n[16]|(255&n[17])<<8|(255&n[18])<<16|(255&n[19])<<24,v=255&n[20]|(255&n[21])<<8|(255&n[22])<<16|(255&n[23])<<24,b=255&n[24]|(255&n[25])<<8|(255&n[26])<<16|(255&n[27])<<24,d=255&n[28]|(255&n[29])<<8|(255&n[30])<<16|(255&n[31])<<24,A=255&e[12]|(255&e[13])<<8|(255&e[14])<<16|(255&e[15])<<24,_=i,U=h,E=a,x=f,M=s,m=u,B=c,S=y,K=l,T=w,Y=p,k=g,L=v,C=b,R=d,z=A,P=0;20>P;P+=2)o=_+L|0,M^=o<<7|o>>>25,o=M+_|0,K^=o<<9|o>>>23,o=K+M|0,L^=o<<13|o>>>19,o=L+K|0,_^=o<<18|o>>>14,o=m+U|0,T^=o<<7|o>>>25,o=T+m|0,C^=o<<9|o>>>23,o=C+T|0,U^=o<<13|o>>>19,o=U+C|0,m^=o<<18|o>>>14,o=Y+B|0,R^=o<<7|o>>>25,o=R+Y|0,E^=o<<9|o>>>23,o=E+R|0,B^=o<<13|o>>>19,o=B+E|0,Y^=o<<18|o>>>14,o=z+k|0,x^=o<<7|o>>>25,o=x+z|0,S^=o<<9|o>>>23,o=S+x|0,k^=o<<13|o>>>19,o=k+S|0,z^=o<<18|o>>>14,o=_+x|0,U^=o<<7|o>>>25,o=U+_|0,E^=o<<9|o>>>23,o=E+U|0,x^=o<<13|o>>>19,o=x+E|0,_^=o<<18|o>>>14,o=m+M|0,B^=o<<7|o>>>25,o=B+m|0,S^=o<<9|o>>>23,o=S+B|0,M^=o<<13|o>>>19,o=M+S|0,m^=o<<18|o>>>14,o=Y+T|0,k^=o<<7|o>>>25,o=k+Y|0,K^=o<<9|o>>>23,o=K+k|0,T^=o<<13|o>>>19,o=T+K|0,Y^=o<<18|o>>>14,o=z+R|0,L^=o<<7|o>>>25,o=L+z|0,C^=o<<9|o>>>23,o=C+L|0,R^=o<<13|o>>>19,o=R+C|0,z^=o<<18|o>>>14;r[0]=_>>>0&255,r[1]=_>>>8&255,r[2]=_>>>16&255,r[3]=_>>>24&255,r[4]=m>>>0&255,r[5]=m>>>8&255,r[6]=m>>>16&255,r[7]=m>>>24&255,r[8]=Y>>>0&255,r[9]=Y>>>8&255,r[10]=Y>>>16&255,r[11]=Y>>>24&255,r[12]=z>>>0&255,r[13]=z>>>8&255,r[14]=z>>>16&255,r[15]=z>>>24&255,r[16]=B>>>0&255,r[17]=B>>>8&255,r[18]=B>>>16&255,r[19]=B>>>24&255,r[20]=S>>>0&255,r[21]=S>>>8&255,r[22]=S>>>16&255,r[23]=S>>>24&255,r[24]=K>>>0&255,r[25]=K>>>8&255,r[26]=K>>>16&255,r[27]=K>>>24&255,r[28]=T>>>0&255,r[29]=T>>>8&255,r[30]=T>>>16&255,r[31]=T>>>24&255}function a(r,t,n,e){i(r,t,n,e)}function f(r,t,n,e){h(r,t,n,e)}function s(r,t,n,e,o,i,h){var f,s,u=new Uint8Array(16),c=new Uint8Array(64);for(s=0;16>s;s++)u[s]=0;for(s=0;8>s;s++)u[s]=i[s];for(;o>=64;){for(a(c,u,h,cr),s=0;64>s;s++)r[t+s]=n[e+s]^c[s];for(f=1,s=8;16>s;s++)f=f+(255&u[s])|0,u[s]=255&f,f>>>=8;o-=64,t+=64,e+=64}if(o>0)for(a(c,u,h,cr),s=0;o>s;s++)r[t+s]=n[e+s]^c[s];return 0}function u(r,t,n,e,o){var i,h,f=new Uint8Array(16),s=new Uint8Array(64);for(h=0;16>h;h++)f[h]=0;for(h=0;8>h;h++)f[h]=e[h];for(;n>=64;){for(a(s,f,o,cr),h=0;64>h;h++)r[t+h]=s[h];for(i=1,h=8;16>h;h++)i=i+(255&f[h])|0,f[h]=255&i,i>>>=8;n-=64,t+=64}if(n>0)for(a(s,f,o,cr),h=0;n>h;h++)r[t+h]=s[h];return 0}function c(r,t,n,e,o){var i=new Uint8Array(32);f(i,e,o,cr);for(var h=new Uint8Array(8),a=0;8>a;a++)h[a]=e[a+16];return u(r,t,n,h,i)}function y(r,t,n,e,o,i,h){var a=new Uint8Array(32);f(a,i,h,cr);for(var u=new Uint8Array(8),c=0;8>c;c++)u[c]=i[c+16];return s(r,t,n,e,o,u,a)}function l(r,t,n,e,o,i){var h=new yr(i);return h.update(n,e,o),h.finish(r,t),0}function w(r,t,n,o,i,h){var a=new Uint8Array(16);return l(a,0,n,o,i,h),e(r,t,a,0)}function p(r,t,n,e,o){var i;if(32>n)return-1;for(y(r,0,t,0,n,e,o),l(r,16,r,32,n-32,r),i=0;16>i;i++)r[i]=0;return 0}function g(r,t,n,e,o){var i,h=new Uint8Array(32);if(32>n)return-1;if(c(h,0,32,e,o),0!==w(t,16,t,32,n-32,h))return-1;for(y(r,0,t,0,n,e,o),i=0;32>i;i++)r[i]=0;return 0}function v(r,t){var n;for(n=0;16>n;n++)r[n]=0|t[n]}function b(r){var t,n,e=1;for(t=0;16>t;t++)n=r[t]+e+65535,e=Math.floor(n/65536),r[t]=n-65536*e;r[0]+=e-1+37*(e-1)}function d(r,t,n){for(var e,o=~(n-1),i=0;16>i;i++)e=o&(r[i]^t[i]),r[i]^=e,t[i]^=e}function A(r,t){var n,e,o,i=$(),h=$();for(n=0;16>n;n++)h[n]=t[n];for(b(h),b(h),b(h),e=0;2>e;e++){for(i[0]=h[0]-65517,n=1;15>n;n++)i[n]=h[n]-65535-(i[n-1]>>16&1),i[n-1]&=65535;i[15]=h[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,d(h,i,1-o)}for(n=0;16>n;n++)r[2*n]=255&h[n],r[2*n+1]=h[n]>>8}function _(r,t){var n=new Uint8Array(32),e=new Uint8Array(32);return A(n,r),A(e,t),o(n,0,e,0)}function U(r){var t=new Uint8Array(32);return A(t,r),1&t[0]}function E(r,t){var n;for(n=0;16>n;n++)r[n]=t[2*n]+(t[2*n+1]<<8);r[15]&=32767}function x(r,t,n){for(var e=0;16>e;e++)r[e]=t[e]+n[e]}function M(r,t,n){for(var e=0;16>e;e++)r[e]=t[e]-n[e]}function m(r,t,n){var e,o,i=0,h=0,a=0,f=0,s=0,u=0,c=0,y=0,l=0,w=0,p=0,g=0,v=0,b=0,d=0,A=0,_=0,U=0,E=0,x=0,M=0,m=0,B=0,S=0,K=0,T=0,Y=0,k=0,L=0,C=0,R=0,z=n[0],P=n[1],O=n[2],N=n[3],F=n[4],I=n[5],j=n[6],G=n[7],Z=n[8],V=n[9],q=n[10],X=n[11],D=n[12],H=n[13],J=n[14],Q=n[15];e=t[0],i+=e*z,h+=e*P,a+=e*O,f+=e*N,s+=e*F,u+=e*I,c+=e*j,y+=e*G,l+=e*Z,w+=e*V,p+=e*q,g+=e*X,v+=e*D,b+=e*H,d+=e*J,A+=e*Q,e=t[1],h+=e*z,a+=e*P,f+=e*O,s+=e*N,u+=e*F,c+=e*I,y+=e*j,l+=e*G,w+=e*Z,p+=e*V,g+=e*q,v+=e*X,b+=e*D,d+=e*H,A+=e*J,_+=e*Q,e=t[2],a+=e*z,f+=e*P,s+=e*O,u+=e*N,c+=e*F,y+=e*I,l+=e*j,w+=e*G,p+=e*Z,g+=e*V,v+=e*q,b+=e*X,d+=e*D,A+=e*H,_+=e*J,U+=e*Q,e=t[3],f+=e*z,s+=e*P,u+=e*O,c+=e*N,y+=e*F,l+=e*I,w+=e*j,p+=e*G,g+=e*Z,v+=e*V,b+=e*q,d+=e*X,A+=e*D,_+=e*H,U+=e*J,E+=e*Q,e=t[4],s+=e*z,u+=e*P,c+=e*O,y+=e*N,l+=e*F,w+=e*I,p+=e*j,g+=e*G,v+=e*Z,b+=e*V,d+=e*q,A+=e*X,_+=e*D,U+=e*H,E+=e*J,x+=e*Q,e=t[5],u+=e*z,c+=e*P,y+=e*O,l+=e*N,w+=e*F,p+=e*I,g+=e*j,v+=e*G,b+=e*Z,d+=e*V,A+=e*q,_+=e*X,U+=e*D,E+=e*H,x+=e*J,M+=e*Q,e=t[6],c+=e*z,y+=e*P,l+=e*O,w+=e*N,p+=e*F,g+=e*I,v+=e*j,b+=e*G,d+=e*Z,A+=e*V,_+=e*q,U+=e*X,E+=e*D,x+=e*H,M+=e*J,m+=e*Q,e=t[7],y+=e*z,l+=e*P,w+=e*O,p+=e*N,g+=e*F,v+=e*I,b+=e*j,d+=e*G,A+=e*Z,_+=e*V,U+=e*q,E+=e*X,x+=e*D,M+=e*H,m+=e*J,B+=e*Q,e=t[8],l+=e*z,w+=e*P,p+=e*O,g+=e*N,v+=e*F,b+=e*I,d+=e*j,A+=e*G,_+=e*Z,U+=e*V,E+=e*q,x+=e*X,M+=e*D,m+=e*H,B+=e*J,S+=e*Q,e=t[9],w+=e*z,p+=e*P,g+=e*O,v+=e*N,b+=e*F,d+=e*I,A+=e*j,_+=e*G,U+=e*Z,E+=e*V,x+=e*q,M+=e*X,m+=e*D,B+=e*H,S+=e*J,K+=e*Q,e=t[10],p+=e*z,g+=e*P,v+=e*O,b+=e*N,d+=e*F,A+=e*I,_+=e*j,U+=e*G,E+=e*Z,x+=e*V,M+=e*q,m+=e*X,B+=e*D,S+=e*H,K+=e*J,T+=e*Q,e=t[11],g+=e*z,v+=e*P,b+=e*O,d+=e*N,A+=e*F,_+=e*I,U+=e*j,E+=e*G,x+=e*Z,M+=e*V,m+=e*q,B+=e*X,S+=e*D,K+=e*H,T+=e*J,Y+=e*Q,e=t[12],v+=e*z,b+=e*P,d+=e*O,A+=e*N,_+=e*F,U+=e*I,E+=e*j,x+=e*G,M+=e*Z,m+=e*V,B+=e*q,S+=e*X,K+=e*D,T+=e*H,Y+=e*J,k+=e*Q,e=t[13],b+=e*z,d+=e*P,A+=e*O,_+=e*N,U+=e*F,E+=e*I,x+=e*j,M+=e*G,m+=e*Z,B+=e*V,S+=e*q,K+=e*X,T+=e*D,Y+=e*H,k+=e*J,L+=e*Q,e=t[14],d+=e*z,A+=e*P,_+=e*O,U+=e*N,E+=e*F,x+=e*I,M+=e*j,m+=e*G,B+=e*Z,S+=e*V,K+=e*q,T+=e*X,Y+=e*D,k+=e*H,L+=e*J,C+=e*Q,e=t[15],A+=e*z,_+=e*P,U+=e*O,E+=e*N,x+=e*F,M+=e*I,m+=e*j,B+=e*G,S+=e*Z,K+=e*V,T+=e*q,Y+=e*X,k+=e*D,L+=e*H,C+=e*J,R+=e*Q,i+=38*_,h+=38*U,a+=38*E,f+=38*x,s+=38*M,u+=38*m,c+=38*B,y+=38*S,l+=38*K,w+=38*T,p+=38*Y,g+=38*k,v+=38*L,b+=38*C,d+=38*R,o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=d+o+65535,o=Math.floor(e/65536),d=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),o=1,e=i+o+65535,o=Math.floor(e/65536),i=e-65536*o,e=h+o+65535,o=Math.floor(e/65536),h=e-65536*o,e=a+o+65535,o=Math.floor(e/65536),a=e-65536*o,e=f+o+65535,o=Math.floor(e/65536),f=e-65536*o,e=s+o+65535,o=Math.floor(e/65536),s=e-65536*o,e=u+o+65535,o=Math.floor(e/65536),u=e-65536*o,e=c+o+65535,o=Math.floor(e/65536),c=e-65536*o,e=y+o+65535,o=Math.floor(e/65536),y=e-65536*o,e=l+o+65535,o=Math.floor(e/65536),l=e-65536*o,e=w+o+65535,o=Math.floor(e/65536),w=e-65536*o,e=p+o+65535,o=Math.floor(e/65536),p=e-65536*o,e=g+o+65535,o=Math.floor(e/65536),g=e-65536*o,e=v+o+65535,o=Math.floor(e/65536),v=e-65536*o,e=b+o+65535,o=Math.floor(e/65536),b=e-65536*o,e=d+o+65535,o=Math.floor(e/65536),d=e-65536*o,e=A+o+65535,o=Math.floor(e/65536),A=e-65536*o,i+=o-1+37*(o-1),r[0]=i,r[1]=h,r[2]=a,r[3]=f,r[4]=s,r[5]=u,r[6]=c,r[7]=y,r[8]=l,r[9]=w,r[10]=p,r[11]=g,r[12]=v,r[13]=b,r[14]=d,r[15]=A}function B(r,t){m(r,t,t)}function S(r,t){var n,e=$();for(n=0;16>n;n++)e[n]=t[n];for(n=253;n>=0;n--)B(e,e),2!==n&&4!==n&&m(e,e,t);for(n=0;16>n;n++)r[n]=e[n]}function K(r,t){var n,e=$();for(n=0;16>n;n++)e[n]=t[n];for(n=250;n>=0;n--)B(e,e),1!==n&&m(e,e,t);for(n=0;16>n;n++)r[n]=e[n]}function T(r,t,n){var e,o,i=new Uint8Array(32),h=new Float64Array(80),a=$(),f=$(),s=$(),u=$(),c=$(),y=$();for(o=0;31>o;o++)i[o]=t[o];for(i[31]=127&t[31]|64,i[0]&=248,E(h,n),o=0;16>o;o++)f[o]=h[o],u[o]=a[o]=s[o]=0;for(a[0]=u[0]=1,o=254;o>=0;--o)e=i[o>>>3]>>>(7&o)&1,d(a,f,e),d(s,u,e),x(c,a,s),M(a,a,s),x(s,f,u),M(f,f,u),B(u,c),B(y,a),m(a,s,a),m(s,f,c),x(c,a,s),M(a,a,s),B(f,a),M(s,u,y),m(a,s,ir),x(a,a,u),m(s,s,a),m(a,u,y),m(u,f,h),B(f,c),d(a,f,e),d(s,u,e);for(o=0;16>o;o++)h[o+16]=a[o],h[o+32]=s[o],h[o+48]=f[o],h[o+64]=u[o];var l=h.subarray(32),w=h.subarray(16);return S(l,l),m(w,w,l),A(r,w),0}function Y(r,t){return T(r,t,nr)}function k(r,t){return rr(t,32),Y(r,t)}function L(r,t,n){var e=new Uint8Array(32);return T(e,n,t),f(r,tr,e,cr)}function C(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),lr(r,t,n,e,h)}function R(r,t,n,e,o,i){var h=new Uint8Array(32);return L(h,o,i),wr(r,t,n,e,h)}function z(r,t,n,e){for(var o,i,h,a,f,s,u,c,y,l,w,p,g,v,b,d,A,_,U,E,x,M,m,B,S,K,T=new Int32Array(16),Y=new Int32Array(16),k=r[0],L=r[1],C=r[2],R=r[3],z=r[4],P=r[5],O=r[6],N=r[7],F=t[0],I=t[1],j=t[2],G=t[3],Z=t[4],V=t[5],q=t[6],X=t[7],D=0;e>=128;){for(U=0;16>U;U++)E=8*U+D,T[U]=n[E+0]<<24|n[E+1]<<16|n[E+2]<<8|n[E+3],Y[U]=n[E+4]<<24|n[E+5]<<16|n[E+6]<<8|n[E+7];for(U=0;80>U;U++)if(o=k,i=L,h=C,a=R,f=z,s=P,u=O,c=N,y=F,l=I,w=j,p=G,g=Z,v=V,b=q,d=X,x=N,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(z>>>14|Z<<18)^(z>>>18|Z<<14)^(Z>>>9|z<<23),M=(Z>>>14|z<<18)^(Z>>>18|z<<14)^(z>>>9|Z<<23),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=z&P^~z&O,M=Z&V^~Z&q,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=pr[2*U],M=pr[2*U+1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=T[U%16],M=Y[U%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,A=65535&S|K<<16,_=65535&m|B<<16,x=A,M=_,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=(k>>>28|F<<4)^(F>>>2|k<<30)^(F>>>7|k<<25),M=(F>>>28|k<<4)^(k>>>2|F<<30)^(k>>>7|F<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,x=k&L^k&C^L&C,M=F&I^F&j^I&j,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,c=65535&S|K<<16,d=65535&m|B<<16,x=a,M=p,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=A,M=_,m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,a=65535&S|K<<16,p=65535&m|B<<16,L=o,C=i,R=h,z=a,P=f,O=s,N=u,k=c,I=y,j=l,G=w,Z=p,V=g,q=v,X=b,F=d,U%16===15)for(E=0;16>E;E++)x=T[E],M=Y[E],m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=T[(E+9)%16],M=Y[(E+9)%16],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+1)%16],_=Y[(E+1)%16],x=(A>>>1|_<<31)^(A>>>8|_<<24)^A>>>7,M=(_>>>1|A<<31)^(_>>>8|A<<24)^(_>>>7|A<<25),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,A=T[(E+14)%16],_=Y[(E+14)%16],x=(A>>>19|_<<13)^(_>>>29|A<<3)^A>>>6,M=(_>>>19|A<<13)^(A>>>29|_<<3)^(_>>>6|A<<26),m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,T[E]=65535&S|K<<16,Y[E]=65535&m|B<<16;x=k,M=F,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[0],M=t[0],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[0]=k=65535&S|K<<16,t[0]=F=65535&m|B<<16,x=L,M=I,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[1],M=t[1],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[1]=L=65535&S|K<<16,t[1]=I=65535&m|B<<16,x=C,M=j,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[2],M=t[2],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[2]=C=65535&S|K<<16,t[2]=j=65535&m|B<<16,x=R,M=G,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[3],M=t[3],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[3]=R=65535&S|K<<16,t[3]=G=65535&m|B<<16,x=z,M=Z,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[4],M=t[4],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[4]=z=65535&S|K<<16,t[4]=Z=65535&m|B<<16,x=P,M=V,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[5],M=t[5],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[5]=P=65535&S|K<<16,t[5]=V=65535&m|B<<16,x=O,M=q,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[6],M=t[6],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[6]=O=65535&S|K<<16,t[6]=q=65535&m|B<<16,x=N,M=X,m=65535&M,B=M>>>16,S=65535&x,K=x>>>16,x=r[7],M=t[7],m+=65535&M,B+=M>>>16,S+=65535&x,K+=x>>>16,B+=m>>>16,S+=B>>>16,K+=S>>>16,r[7]=N=65535&S|K<<16,t[7]=X=65535&m|B<<16,D+=128,e-=128}return e}function P(r,n,e){var o,i=new Int32Array(8),h=new Int32Array(8),a=new Uint8Array(256),f=e;for(i[0]=1779033703,i[1]=3144134277,i[2]=1013904242,i[3]=2773480762,i[4]=1359893119,i[5]=2600822924,i[6]=528734635,i[7]=1541459225,h[0]=4089235720,h[1]=2227873595,h[2]=4271175723,h[3]=1595750129,h[4]=2917565137,h[5]=725511199,h[6]=4215389547,h[7]=327033209,z(i,h,n,e),e%=128,o=0;e>o;o++)a[o]=n[f-e+o];for(a[e]=128,e=256-128*(112>e?1:0),a[e-9]=0,t(a,e-8,f/536870912|0,f<<3),z(i,h,a,e),o=0;8>o;o++)t(r,8*o,i[o],h[o]);return 0}function O(r,t){var n=$(),e=$(),o=$(),i=$(),h=$(),a=$(),f=$(),s=$(),u=$();M(n,r[1],r[0]),M(u,t[1],t[0]),m(n,n,u),x(e,r[0],r[1]),x(u,t[0],t[1]),m(e,e,u),m(o,r[3],t[3]),m(o,o,ar),m(i,r[2],t[2]),x(i,i,i),M(h,e,n),M(a,i,o),x(f,i,o),x(s,e,n),m(r[0],h,a),m(r[1],s,f),m(r[2],f,a),m(r[3],h,s)}function N(r,t,n){var e;for(e=0;4>e;e++)d(r[e],t[e],n)}function F(r,t){var n=$(),e=$(),o=$();S(o,t[2]),m(n,t[0],o),m(e,t[1],o),A(r,e),r[31]^=U(n)<<7}function I(r,t,n){var e,o;for(v(r[0],er),v(r[1],or),v(r[2],or),v(r[3],er),o=255;o>=0;--o)e=n[o/8|0]>>(7&o)&1,N(r,t,e),O(t,r),O(r,r),N(r,t,e)}function j(r,t){var n=[$(),$(),$(),$()];v(n[0],fr),v(n[1],sr),v(n[2],or),m(n[3],fr,sr),I(r,n,t)}function G(r,t,n){var e,o=new Uint8Array(64),i=[$(),$(),$(),$()];for(n||rr(t,32),P(o,t,32),o[0]&=248,o[31]&=127,o[31]|=64,j(i,o),F(r,i),e=0;32>e;e++)t[e+32]=r[e];return 0}function Z(r,t){var n,e,o,i;for(e=63;e>=32;--e){for(n=0,o=e-32,i=e-12;i>o;++o)t[o]+=n-16*t[e]*gr[o-(e-32)],n=t[o]+128>>8,t[o]-=256*n;t[o]+=n,t[e]=0}for(n=0,o=0;32>o;o++)t[o]+=n-(t[31]>>4)*gr[o],n=t[o]>>8,t[o]&=255;for(o=0;32>o;o++)t[o]-=n*gr[o];for(e=0;32>e;e++)t[e+1]+=t[e]>>8,r[e]=255&t[e]}function V(r){var t,n=new Float64Array(64);for(t=0;64>t;t++)n[t]=r[t];for(t=0;64>t;t++)r[t]=0;Z(r,n)}function q(r,t,n,e){var o,i,h=new Uint8Array(64),a=new Uint8Array(64),f=new Uint8Array(64),s=new Float64Array(64),u=[$(),$(),$(),$()];P(h,e,32),h[0]&=248,h[31]&=127,h[31]|=64;var c=n+64;for(o=0;n>o;o++)r[64+o]=t[o];for(o=0;32>o;o++)r[32+o]=h[32+o];for(P(f,r.subarray(32),n+32),V(f),j(u,f),F(r,u),o=32;64>o;o++)r[o]=e[o];for(P(a,r,n+64),V(a),o=0;64>o;o++)s[o]=0;for(o=0;32>o;o++)s[o]=f[o];for(o=0;32>o;o++)for(i=0;32>i;i++)s[o+i]+=a[o]*h[i];return Z(r.subarray(32),s),c}function X(r,t){var n=$(),e=$(),o=$(),i=$(),h=$(),a=$(),f=$();return v(r[2],or),E(r[1],t),B(o,r[1]),m(i,o,hr),M(o,o,r[2]),x(i,r[2],i),B(h,i),B(a,h),m(f,a,h),m(n,f,o),m(n,n,i),K(n,n),m(n,n,o),m(n,n,i),m(n,n,i),m(r[0],n,i),B(e,r[0]),m(e,e,i),_(e,o)&&m(r[0],r[0],ur),B(e,r[0]),m(e,e,i),_(e,o)?-1:(U(r[0])===t[31]>>7&&M(r[0],er,r[0]),m(r[3],r[0],r[1]),0)}function D(r,t,n,e){var i,h,a=new Uint8Array(32),f=new Uint8Array(64),s=[$(),$(),$(),$()],u=[$(),$(),$(),$()];if(h=-1,64>n)return-1;if(X(u,e))return-1;for(i=0;n>i;i++)r[i]=t[i];for(i=0;32>i;i++)r[i+32]=e[i];if(P(f,r,n),V(f),I(s,u,f),j(u,t.subarray(32)),O(s,u),F(a,s),n-=64,o(t,0,a,0)){for(i=0;n>i;i++)r[i]=0;return-1}for(i=0;n>i;i++)r[i]=t[i+64];return h=n}function H(r,t){if(r.length!==vr)throw new Error("bad key size");if(t.length!==br)throw new Error("bad nonce size")}function J(r,t){if(r.length!==Er)throw new Error("bad public key size");if(t.length!==xr)throw new Error("bad secret key size")}function Q(){var r,t;for(t=0;t<arguments.length;t++)if("[object Uint8Array]"!==(r=Object.prototype.toString.call(arguments[t])))throw new TypeError("unexpected type "+r+", use Uint8Array")}function W(r){for(var t=0;t<r.length;t++)r[t]=0}var $=function(r){var t,n=new Float64Array(16);if(r)for(t=0;t<r.length;t++)n[t]=r[t];return n},rr=function(){throw new Error("no PRNG")},tr=new Uint8Array(16),nr=new Uint8Array(32);nr[0]=9;var er=$(),or=$([1]),ir=$([56129,1]),hr=$([30883,4953,19914,30187,55467,16705,2637,112,59544,30585,16505,36039,65139,11119,27886,20995]),ar=$([61785,9906,39828,60374,45398,33411,5274,224,53552,61171,33010,6542,64743,22239,55772,9222]),fr=$([54554,36645,11616,51542,42930,38181,51040,26924,56412,64982,57905,49316,21502,52590,14035,8553]),sr=$([26200,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214]),ur=$([41136,18958,6951,50414,58488,44335,6150,12099,55207,15867,153,11085,57099,20417,9344,11139]),cr=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]),yr=function(r){this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.leftover=0,this.fin=0;var t,n,e,o,i,h,a,f;t=255&r[0]|(255&r[1])<<8,this.r[0]=8191&t,n=255&r[2]|(255&r[3])<<8,this.r[1]=8191&(t>>>13|n<<3),e=255&r[4]|(255&r[5])<<8,this.r[2]=7939&(n>>>10|e<<6),o=255&r[6]|(255&r[7])<<8,this.r[3]=8191&(e>>>7|o<<9),i=255&r[8]|(255&r[9])<<8,this.r[4]=255&(o>>>4|i<<12),this.r[5]=i>>>1&8190,h=255&r[10]|(255&r[11])<<8,this.r[6]=8191&(i>>>14|h<<2),a=255&r[12]|(255&r[13])<<8,this.r[7]=8065&(h>>>11|a<<5),f=255&r[14]|(255&r[15])<<8,this.r[8]=8191&(a>>>8|f<<8),this.r[9]=f>>>5&127,this.pad[0]=255&r[16]|(255&r[17])<<8,this.pad[1]=255&r[18]|(255&r[19])<<8,this.pad[2]=255&r[20]|(255&r[21])<<8,this.pad[3]=255&r[22]|(255&r[23])<<8,this.pad[4]=255&r[24]|(255&r[25])<<8,this.pad[5]=255&r[26]|(255&r[27])<<8,this.pad[6]=255&r[28]|(255&r[29])<<8,this.pad[7]=255&r[30]|(255&r[31])<<8};yr.prototype.blocks=function(r,t,n){for(var e,o,i,h,a,f,s,u,c,y,l,w,p,g,v,b,d,A,_,U=this.fin?0:2048,E=this.h[0],x=this.h[1],M=this.h[2],m=this.h[3],B=this.h[4],S=this.h[5],K=this.h[6],T=this.h[7],Y=this.h[8],k=this.h[9],L=this.r[0],C=this.r[1],R=this.r[2],z=this.r[3],P=this.r[4],O=this.r[5],N=this.r[6],F=this.r[7],I=this.r[8],j=this.r[9];n>=16;)e=255&r[t+0]|(255&r[t+1])<<8,E+=8191&e,o=255&r[t+2]|(255&r[t+3])<<8,x+=8191&(e>>>13|o<<3),i=255&r[t+4]|(255&r[t+5])<<8,M+=8191&(o>>>10|i<<6),h=255&r[t+6]|(255&r[t+7])<<8,m+=8191&(i>>>7|h<<9),a=255&r[t+8]|(255&r[t+9])<<8,B+=8191&(h>>>4|a<<12),S+=a>>>1&8191,f=255&r[t+10]|(255&r[t+11])<<8,K+=8191&(a>>>14|f<<2),s=255&r[t+12]|(255&r[t+13])<<8,T+=8191&(f>>>11|s<<5),u=255&r[t+14]|(255&r[t+15])<<8,Y+=8191&(s>>>8|u<<8),k+=u>>>5|U,c=0,y=c,y+=E*L,y+=5*x*j,y+=5*M*I,y+=5*m*F,y+=5*B*N,c=y>>>13,y&=8191,y+=5*S*O,y+=5*K*P,y+=5*T*z,y+=5*Y*R,y+=5*k*C,c+=y>>>13,y&=8191,l=c,l+=E*C,l+=x*L,l+=5*M*j,l+=5*m*I,l+=5*B*F,c=l>>>13,l&=8191,l+=5*S*N,l+=5*K*O,l+=5*T*P,l+=5*Y*z,l+=5*k*R,c+=l>>>13,l&=8191,w=c,w+=E*R,w+=x*C,w+=M*L,w+=5*m*j,w+=5*B*I,c=w>>>13,w&=8191,w+=5*S*F,w+=5*K*N,w+=5*T*O,w+=5*Y*P,w+=5*k*z,c+=w>>>13,w&=8191,p=c,p+=E*z,p+=x*R,p+=M*C,p+=m*L,p+=5*B*j,c=p>>>13,p&=8191,p+=5*S*I,p+=5*K*F,p+=5*T*N,p+=5*Y*O,p+=5*k*P,c+=p>>>13,p&=8191,g=c,g+=E*P,g+=x*z,g+=M*R,g+=m*C,g+=B*L,c=g>>>13,g&=8191,g+=5*S*j,g+=5*K*I,g+=5*T*F,g+=5*Y*N,g+=5*k*O,c+=g>>>13,g&=8191,v=c,v+=E*O,v+=x*P,v+=M*z,v+=m*R,v+=B*C,c=v>>>13,v&=8191,v+=S*L,v+=5*K*j,v+=5*T*I,v+=5*Y*F,v+=5*k*N,c+=v>>>13,v&=8191,b=c,b+=E*N,b+=x*O,b+=M*P,b+=m*z,b+=B*R,c=b>>>13,b&=8191,b+=S*C,b+=K*L,b+=5*T*j,b+=5*Y*I,b+=5*k*F,c+=b>>>13,b&=8191,d=c,d+=E*F,d+=x*N,d+=M*O,d+=m*P,d+=B*z,c=d>>>13,d&=8191,d+=S*R,d+=K*C,d+=T*L,d+=5*Y*j,d+=5*k*I,c+=d>>>13,d&=8191,A=c,A+=E*I,A+=x*F,A+=M*N,A+=m*O,A+=B*P,c=A>>>13,A&=8191,A+=S*z,A+=K*R,A+=T*C,A+=Y*L,A+=5*k*j,c+=A>>>13,A&=8191,_=c,_+=E*j,_+=x*I,_+=M*F,_+=m*N,_+=B*O,c=_>>>13,_&=8191,_+=S*P,_+=K*z,_+=T*R,_+=Y*C,_+=k*L,c+=_>>>13,_&=8191,c=(c<<2)+c|0,c=c+y|0,y=8191&c,c>>>=13,l+=c,E=y,x=l,M=w,m=p,B=g,S=v,K=b,T=d,Y=A,k=_,t+=16,n-=16;this.h[0]=E,this.h[1]=x,this.h[2]=M,this.h[3]=m,this.h[4]=B,this.h[5]=S,this.h[6]=K,this.h[7]=T,this.h[8]=Y,this.h[9]=k},yr.prototype.finish=function(r,t){var n,e,o,i,h=new Uint16Array(10);if(this.leftover){for(i=this.leftover,this.buffer[i++]=1;16>i;i++)this.buffer[i]=0;this.fin=1,this.blocks(this.buffer,0,16)}for(n=this.h[1]>>>13,this.h[1]&=8191,i=2;10>i;i++)this.h[i]+=n,n=this.h[i]>>>13,this.h[i]&=8191;for(this.h[0]+=5*n,n=this.h[0]>>>13,this.h[0]&=8191,this.h[1]+=n,n=this.h[1]>>>13,this.h[1]&=8191,this.h[2]+=n,h[0]=this.h[0]+5,n=h[0]>>>13,h[0]&=8191,i=1;10>i;i++)h[i]=this.h[i]+n,n=h[i]>>>13,h[i]&=8191;for(h[9]-=8192,e=(h[9]>>>15)-1,i=0;10>i;i++)h[i]&=e;for(e=~e,i=0;10>i;i++)this.h[i]=this.h[i]&e|h[i];for(this.h[0]=65535&(this.h[0]|this.h[1]<<13),this.h[1]=65535&(this.h[1]>>>3|this.h[2]<<10),this.h[2]=65535&(this.h[2]>>>6|this.h[3]<<7),this.h[3]=65535&(this.h[3]>>>9|this.h[4]<<4),this.h[4]=65535&(this.h[4]>>>12|this.h[5]<<1|this.h[6]<<14),this.h[5]=65535&(this.h[6]>>>2|this.h[7]<<11),this.h[6]=65535&(this.h[7]>>>5|this.h[8]<<8),this.h[7]=65535&(this.h[8]>>>8|this.h[9]<<5),o=this.h[0]+this.pad[0],this.h[0]=65535&o,i=1;8>i;i++)o=(this.h[i]+this.pad[i]|0)+(o>>>16)|0,this.h[i]=65535&o;r[t+0]=this.h[0]>>>0&255,r[t+1]=this.h[0]>>>8&255,r[t+2]=this.h[1]>>>0&255,r[t+3]=this.h[1]>>>8&255,r[t+4]=this.h[2]>>>0&255,r[t+5]=this.h[2]>>>8&255,r[t+6]=this.h[3]>>>0&255,r[t+7]=this.h[3]>>>8&255,r[t+8]=this.h[4]>>>0&255,r[t+9]=this.h[4]>>>8&255,r[t+10]=this.h[5]>>>0&255,r[t+11]=this.h[5]>>>8&255,r[t+12]=this.h[6]>>>0&255,r[t+13]=this.h[6]>>>8&255,r[t+14]=this.h[7]>>>0&255,r[t+15]=this.h[7]>>>8&255},yr.prototype.update=function(r,t,n){var e,o;if(this.leftover){for(o=16-this.leftover,o>n&&(o=n),e=0;o>e;e++)this.buffer[this.leftover+e]=r[t+e];if(n-=o,t+=o,this.leftover+=o,this.leftover<16)return;this.blocks(this.buffer,0,16),this.leftover=0}if(n>=16&&(o=n-n%16,this.blocks(r,t,o),t+=o,n-=o),n){for(e=0;n>e;e++)this.buffer[this.leftover+e]=r[t+e];this.leftover+=n}};var lr=p,wr=g,pr=[1116352408,3609767458,1899447441,602891725,3049323471,3964484399,3921009573,2173295548,961987163,4081628472,1508970993,3053834265,2453635748,2937671579,2870763221,3664609560,3624381080,2734883394,310598401,1164996542,607225278,1323610764,1426881987,3590304994,1925078388,4068182383,2162078206,991336113,2614888103,633803317,3248222580,3479774868,3835390401,2666613458,4022224774,944711139,264347078,2341262773,604807628,2007800933,770255983,1495990901,1249150122,1856431235,1555081692,3175218132,1996064986,2198950837,2554220882,3999719339,2821834349,766784016,2952996808,2566594879,3210313671,3203337956,3336571891,1034457026,3584528711,2466948901,113926993,3758326383,338241895,168717936,666307205,1188179964,773529912,1546045734,1294757372,1522805485,1396182291,2643833823,1695183700,2343527390,1986661051,1014477480,2177026350,1206759142,2456956037,344077627,2730485921,1290863460,2820302411,3158454273,3259730800,3505952657,3345764771,106217008,3516065817,3606008344,3600352804,1432725776,4094571909,1467031594,275423344,851169720,430227734,3100823752,506948616,1363258195,659060556,3750685593,883997877,3785050280,958139571,3318307427,1322822218,3812723403,1537002063,2003034995,1747873779,3602036899,1955562222,1575990012,2024104815,1125592928,2227730452,2716904306,2361852424,442776044,2428436474,593698344,2756734187,3733110249,3204031479,2999351573,3329325298,3815920427,3391569614,3928383900,3515267271,566280711,3940187606,3454069534,4118630271,4000239992,116418474,1914138554,174292421,2731055270,289380356,3203993006,460393269,320620315,685471733,587496836,852142971,1086792851,1017036298,365543100,1126000580,2618297676,1288033470,3409855158,1501505948,4234509866,1607167915,987167468,1816402316,1246189591],gr=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]),vr=32,br=24,dr=32,Ar=16,_r=32,Ur=32,Er=32,xr=32,Mr=32,mr=br,Br=dr,Sr=Ar,Kr=64,Tr=32,Yr=64,kr=32,Lr=64;r.lowlevel={crypto_core_hsalsa20:f,crypto_stream_xor:y,crypto_stream:c,crypto_stream_salsa20_xor:s,crypto_stream_salsa20:u,crypto_onetimeauth:l,crypto_onetimeauth_verify:w,crypto_verify_16:e,crypto_verify_32:o,crypto_secretbox:p,crypto_secretbox_open:g,crypto_scalarmult:T,crypto_scalarmult_base:Y,crypto_box_beforenm:L,crypto_box_afternm:lr,crypto_box:C,crypto_box_open:R,crypto_box_keypair:k,crypto_hash:P,crypto_sign:q,crypto_sign_keypair:G,crypto_sign_open:D,crypto_secretbox_KEYBYTES:vr,crypto_secretbox_NONCEBYTES:br,crypto_secretbox_ZEROBYTES:dr,crypto_secretbox_BOXZEROBYTES:Ar,crypto_scalarmult_BYTES:_r,crypto_scalarmult_SCALARBYTES:Ur,crypto_box_PUBLICKEYBYTES:Er,crypto_box_SECRETKEYBYTES:xr,crypto_box_BEFORENMBYTES:Mr,crypto_box_NONCEBYTES:mr,crypto_box_ZEROBYTES:Br,crypto_box_BOXZEROBYTES:Sr,crypto_sign_BYTES:Kr,crypto_sign_PUBLICKEYBYTES:Tr,crypto_sign_SECRETKEYBYTES:Yr,crypto_sign_SEEDBYTES:kr,crypto_hash_BYTES:Lr},r.util={},r.util.decodeUTF8=function(r){var t,n=unescape(encodeURIComponent(r)),e=new Uint8Array(n.length);for(t=0;t<n.length;t++)e[t]=n.charCodeAt(t);return e},r.util.encodeUTF8=function(r){var t,n=[];for(t=0;t<r.length;t++)n.push(String.fromCharCode(r[t]));return decodeURIComponent(escape(n.join("")))},r.util.encodeBase64=function(r){if("undefined"==typeof btoa)return new Buffer(r).toString("base64");var t,n=[],e=r.length;for(t=0;e>t;t++)n.push(String.fromCharCode(r[t]));return btoa(n.join(""))},r.util.decodeBase64=function(r){if("undefined"==typeof atob)return new Uint8Array(Array.prototype.slice.call(new Buffer(r,"base64"),0));var t,n=atob(r),e=new Uint8Array(n.length);for(t=0;t<n.length;t++)e[t]=n.charCodeAt(t);return e},r.randomBytes=function(r){var t=new Uint8Array(r);return rr(t,r),t},r.secretbox=function(r,t,n){Q(r,t,n),H(n,t);for(var e=new Uint8Array(dr+r.length),o=new Uint8Array(e.length),i=0;i<r.length;i++)e[i+dr]=r[i];return p(o,e,e.length,t,n),o.subarray(Ar)},r.secretbox.open=function(r,t,n){Q(r,t,n),H(n,t);for(var e=new Uint8Array(Ar+r.length),o=new Uint8Array(e.length),i=0;i<r.length;i++)e[i+Ar]=r[i];return e.length<32?!1:0!==g(o,e,e.length,t,n)?!1:o.subarray(dr)},r.secretbox.keyLength=vr,r.secretbox.nonceLength=br,r.secretbox.overheadLength=Ar,r.scalarMult=function(r,t){if(Q(r,t),r.length!==Ur)throw new Error("bad n size");if(t.length!==_r)throw new Error("bad p size");var n=new Uint8Array(_r);return T(n,r,t),n},r.scalarMult.base=function(r){if(Q(r),r.length!==Ur)throw new Error("bad n size");var t=new Uint8Array(_r);return Y(t,r),t},r.scalarMult.scalarLength=Ur,r.scalarMult.groupElementLength=_r,r.box=function(t,n,e,o){var i=r.box.before(e,o);return r.secretbox(t,n,i)},r.box.before=function(r,t){Q(r,t),J(r,t);var n=new Uint8Array(Mr);return L(n,r,t),n},r.box.after=r.secretbox,r.box.open=function(t,n,e,o){var i=r.box.before(e,o);return r.secretbox.open(t,n,i)},r.box.open.after=r.secretbox.open,r.box.keyPair=function(){var r=new Uint8Array(Er),t=new Uint8Array(xr);return k(r,t),{publicKey:r,secretKey:t}},r.box.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==xr)throw new Error("bad secret key size");var t=new Uint8Array(Er);return Y(t,r),{publicKey:t,secretKey:new Uint8Array(r)}},r.box.publicKeyLength=Er,r.box.secretKeyLength=xr,r.box.sharedKeyLength=Mr,r.box.nonceLength=mr,r.box.overheadLength=r.secretbox.overheadLength,r.sign=function(r,t){if(Q(r,t),t.length!==Yr)throw new Error("bad secret key size");var n=new Uint8Array(Kr+r.length);return q(n,r,r.length,t),n},r.sign.open=function(r,t){if(2!==arguments.length)throw new Error("nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?");if(Q(r,t),t.length!==Tr)throw new Error("bad public key size");var n=new Uint8Array(r.length),e=D(n,r,r.length,t);if(0>e)return null;for(var o=new Uint8Array(e),i=0;i<o.length;i++)o[i]=n[i];return o},r.sign.detached=function(t,n){for(var e=r.sign(t,n),o=new Uint8Array(Kr),i=0;i<o.length;i++)o[i]=e[i];return o},r.sign.detached.verify=function(r,t,n){if(Q(r,t,n),t.length!==Kr)throw new Error("bad signature size");if(n.length!==Tr)throw new Error("bad public key size");var e,o=new Uint8Array(Kr+r.length),i=new Uint8Array(Kr+r.length);for(e=0;Kr>e;e++)o[e]=t[e];for(e=0;e<r.length;e++)o[e+Kr]=r[e];return D(i,o,o.length,n)>=0},r.sign.keyPair=function(){var r=new Uint8Array(Tr),t=new Uint8Array(Yr);return G(r,t),{publicKey:r,secretKey:t}},r.sign.keyPair.fromSecretKey=function(r){if(Q(r),r.length!==Yr)throw new Error("bad secret key size");for(var t=new Uint8Array(Tr),n=0;n<t.length;n++)t[n]=r[32+n];return{publicKey:t,secretKey:new Uint8Array(r)
-}},r.sign.keyPair.fromSeed=function(r){if(Q(r),r.length!==kr)throw new Error("bad seed size");for(var t=new Uint8Array(Tr),n=new Uint8Array(Yr),e=0;32>e;e++)n[e]=r[e];return G(t,n,!0),{publicKey:t,secretKey:n}},r.sign.publicKeyLength=Tr,r.sign.secretKeyLength=Yr,r.sign.seedLength=kr,r.sign.signatureLength=Kr,r.hash=function(r){Q(r);var t=new Uint8Array(Lr);return P(t,r,r.length),t},r.hash.hashLength=Lr,r.verify=function(r,t){return Q(r,t),0===r.length||0===t.length?!1:r.length!==t.length?!1:0===n(r,0,t,0,r.length)?!0:!1},r.setPRNG=function(r){rr=r},function(){var t;"undefined"!=typeof window?(window.crypto&&window.crypto.getRandomValues?t=window.crypto:window.msCrypto&&window.msCrypto.getRandomValues&&(t=window.msCrypto),t&&r.setPRNG(function(r,n){var e,o=new Uint8Array(n);for(t.getRandomValues(o),e=0;n>e;e++)r[e]=o[e];W(o)})):"undefined"!=typeof require&&(t=require("crypto"),t&&r.setPRNG(function(r,n){var e,o=t.randomBytes(n);for(e=0;n>e;e++)r[e]=o[e];W(o)}))}()}("undefined"!=typeof module&&module.exports?module.exports:window.nacl=window.nacl||{});
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.js
deleted file mode 100644
index b8edbbee692cdfaca53818a28f38ea33f5320a8b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.js
+++ /dev/null
@@ -1,1205 +0,0 @@
-(function(nacl) {
-'use strict';
-
-// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.
-// Public domain.
-//
-// Implementation derived from TweetNaCl version 20140427.
-// See for details: http://tweetnacl.cr.yp.to/
-
-var u64 = function(h, l) { this.hi = h|0 >>> 0; this.lo = l|0 >>> 0; };
-var gf = function(init) {
-  var i, r = new Float64Array(16);
-  if (init) for (i = 0; i < init.length; i++) r[i] = init[i];
-  return r;
-};
-
-//  Pluggable, initialized in high-level API below.
-var randombytes = function(/* x, n */) { throw new Error('no PRNG'); };
-
-var _0 = new Uint8Array(16);
-var _9 = new Uint8Array(32); _9[0] = 9;
-
-var gf0 = gf(),
-    gf1 = gf([1]),
-    _121665 = gf([0xdb41, 1]),
-    D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),
-    D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),
-    X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),
-    Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),
-    I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);
-
-function L32(x, c) { return (x << c) | (x >>> (32 - c)); }
-
-function ld32(x, i) {
-  var u = x[i+3] & 0xff;
-  u = (u<<8)|(x[i+2] & 0xff);
-  u = (u<<8)|(x[i+1] & 0xff);
-  return (u<<8)|(x[i+0] & 0xff);
-}
-
-function dl64(x, i) {
-  var h = (x[i] << 24) | (x[i+1] << 16) | (x[i+2] << 8) | x[i+3];
-  var l = (x[i+4] << 24) | (x[i+5] << 16) | (x[i+6] << 8) | x[i+7];
-  return new u64(h, l);
-}
-
-function st32(x, j, u) {
-  var i;
-  for (i = 0; i < 4; i++) { x[j+i] = u & 255; u >>>= 8; }
-}
-
-function ts64(x, i, u) {
-  x[i]   = (u.hi >> 24) & 0xff;
-  x[i+1] = (u.hi >> 16) & 0xff;
-  x[i+2] = (u.hi >>  8) & 0xff;
-  x[i+3] = u.hi & 0xff;
-  x[i+4] = (u.lo >> 24)  & 0xff;
-  x[i+5] = (u.lo >> 16)  & 0xff;
-  x[i+6] = (u.lo >>  8)  & 0xff;
-  x[i+7] = u.lo & 0xff;
-}
-
-function vn(x, xi, y, yi, n) {
-  var i,d = 0;
-  for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i];
-  return (1 & ((d - 1) >>> 8)) - 1;
-}
-
-function crypto_verify_16(x, xi, y, yi) {
-  return vn(x,xi,y,yi,16);
-}
-
-function crypto_verify_32(x, xi, y, yi) {
-  return vn(x,xi,y,yi,32);
-}
-
-function core(out,inp,k,c,h) {
-  var w = new Uint32Array(16), x = new Uint32Array(16),
-      y = new Uint32Array(16), t = new Uint32Array(4);
-  var i, j, m;
-
-  for (i = 0; i < 4; i++) {
-    x[5*i] = ld32(c, 4*i);
-    x[1+i] = ld32(k, 4*i);
-    x[6+i] = ld32(inp, 4*i);
-    x[11+i] = ld32(k, 16+4*i);
-  }
-
-  for (i = 0; i < 16; i++) y[i] = x[i];
-
-  for (i = 0; i < 20; i++) {
-    for (j = 0; j < 4; j++) {
-      for (m = 0; m < 4; m++) t[m] = x[(5*j+4*m)%16];
-      t[1] ^= L32((t[0]+t[3])|0, 7);
-      t[2] ^= L32((t[1]+t[0])|0, 9);
-      t[3] ^= L32((t[2]+t[1])|0,13);
-      t[0] ^= L32((t[3]+t[2])|0,18);
-      for (m = 0; m < 4; m++) w[4*j+(j+m)%4] = t[m];
-    }
-    for (m = 0; m < 16; m++) x[m] = w[m];
-  }
-
-  if (h) {
-    for (i = 0; i < 16; i++) x[i] = (x[i] + y[i]) | 0;
-    for (i = 0; i < 4; i++) {
-      x[5*i] = (x[5*i] - ld32(c, 4*i)) | 0;
-      x[6+i] = (x[6+i] - ld32(inp, 4*i)) | 0;
-    }
-    for (i = 0; i < 4; i++) {
-      st32(out,4*i,x[5*i]);
-      st32(out,16+4*i,x[6+i]);
-    }
-  } else {
-    for (i = 0; i < 16; i++) st32(out, 4 * i, (x[i] + y[i]) | 0);
-  }
-}
-
-function crypto_core_salsa20(out,inp,k,c) {
-  core(out,inp,k,c,false);
-  return 0;
-}
-
-function crypto_core_hsalsa20(out,inp,k,c) {
-  core(out,inp,k,c,true);
-  return 0;
-}
-
-var sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);
-            // "expand 32-byte k"
-
-function crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) {
-  var z = new Uint8Array(16), x = new Uint8Array(64);
-  var u, i;
-  if (!b) return 0;
-  for (i = 0; i < 16; i++) z[i] = 0;
-  for (i = 0; i < 8; i++) z[i] = n[i];
-  while (b >= 64) {
-    crypto_core_salsa20(x,z,k,sigma);
-    for (i = 0; i < 64; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i];
-    u = 1;
-    for (i = 8; i < 16; i++) {
-      u = u + (z[i] & 0xff) | 0;
-      z[i] = u & 0xff;
-      u >>>= 8;
-    }
-    b -= 64;
-    cpos += 64;
-    if (m) mpos += 64;
-  }
-  if (b > 0) {
-    crypto_core_salsa20(x,z,k,sigma);
-    for (i = 0; i < b; i++) c[cpos+i] = (m?m[mpos+i]:0) ^ x[i];
-  }
-  return 0;
-}
-
-function crypto_stream_salsa20(c,cpos,d,n,k) {
-  return crypto_stream_salsa20_xor(c,cpos,null,0,d,n,k);
-}
-
-function crypto_stream(c,cpos,d,n,k) {
-  var s = new Uint8Array(32);
-  crypto_core_hsalsa20(s,n,k,sigma);
-  return crypto_stream_salsa20(c,cpos,d,n.subarray(16),s);
-}
-
-function crypto_stream_xor(c,cpos,m,mpos,d,n,k) {
-  var s = new Uint8Array(32);
-  crypto_core_hsalsa20(s,n,k,sigma);
-  return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,n.subarray(16),s);
-}
-
-function add1305(h, c) {
-  var j, u = 0;
-  for (j = 0; j < 17; j++) {
-    u = (u + ((h[j] + c[j]) | 0)) | 0;
-    h[j] = u & 255;
-    u >>>= 8;
-  }
-}
-
-var minusp = new Uint32Array([
-  5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252
-]);
-
-function crypto_onetimeauth(out, outpos, m, mpos, n, k) {
-  var s, i, j, u;
-  var x = new Uint32Array(17), r = new Uint32Array(17),
-      h = new Uint32Array(17), c = new Uint32Array(17),
-      g = new Uint32Array(17);
-  for (j = 0; j < 17; j++) r[j]=h[j]=0;
-  for (j = 0; j < 16; j++) r[j]=k[j];
-  r[3]&=15;
-  r[4]&=252;
-  r[7]&=15;
-  r[8]&=252;
-  r[11]&=15;
-  r[12]&=252;
-  r[15]&=15;
-
-  while (n > 0) {
-    for (j = 0; j < 17; j++) c[j] = 0;
-    for (j = 0; (j < 16) && (j < n); ++j) c[j] = m[mpos+j];
-    c[j] = 1;
-    mpos += j; n -= j;
-    add1305(h,c);
-    for (i = 0; i < 17; i++) {
-      x[i] = 0;
-      for (j = 0; j < 17; j++) x[i] = (x[i] + (h[j] * ((j <= i) ? r[i - j] : ((320 * r[i + 17 - j])|0))) | 0) | 0;
-    }
-    for (i = 0; i < 17; i++) h[i] = x[i];
-    u = 0;
-    for (j = 0; j < 16; j++) {
-      u = (u + h[j]) | 0;
-      h[j] = u & 255;
-      u >>>= 8;
-    }
-    u = (u + h[16]) | 0; h[16] = u & 3;
-    u = (5 * (u >>> 2)) | 0;
-    for (j = 0; j < 16; j++) {
-      u = (u + h[j]) | 0;
-      h[j] = u & 255;
-      u >>>= 8;
-    }
-    u = (u + h[16]) | 0; h[16] = u;
-  }
-
-  for (j = 0; j < 17; j++) g[j] = h[j];
-  add1305(h,minusp);
-  s = (-(h[16] >>> 7) | 0);
-  for (j = 0; j < 17; j++) h[j] ^= s & (g[j] ^ h[j]);
-
-  for (j = 0; j < 16; j++) c[j] = k[j + 16];
-  c[16] = 0;
-  add1305(h,c);
-  for (j = 0; j < 16; j++) out[outpos+j] = h[j];
-  return 0;
-}
-
-function crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {
-  var x = new Uint8Array(16);
-  crypto_onetimeauth(x,0,m,mpos,n,k);
-  return crypto_verify_16(h,hpos,x,0);
-}
-
-function crypto_secretbox(c,m,d,n,k) {
-  var i;
-  if (d < 32) return -1;
-  crypto_stream_xor(c,0,m,0,d,n,k);
-  crypto_onetimeauth(c, 16, c, 32, d - 32, c);
-  for (i = 0; i < 16; i++) c[i] = 0;
-  return 0;
-}
-
-function crypto_secretbox_open(m,c,d,n,k) {
-  var i;
-  var x = new Uint8Array(32);
-  if (d < 32) return -1;
-  crypto_stream(x,0,32,n,k);
-  if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1;
-  crypto_stream_xor(m,0,c,0,d,n,k);
-  for (i = 0; i < 32; i++) m[i] = 0;
-  return 0;
-}
-
-function set25519(r, a) {
-  var i;
-  for (i = 0; i < 16; i++) r[i] = a[i]|0;
-}
-
-function car25519(o) {
-  var c;
-  var i;
-  for (i = 0; i < 16; i++) {
-      o[i] += 65536;
-      c = Math.floor(o[i] / 65536);
-      o[(i+1)*(i<15?1:0)] += c - 1 + 37 * (c-1) * (i===15?1:0);
-      o[i] -= (c * 65536);
-  }
-}
-
-function sel25519(p, q, b) {
-  var t, c = ~(b-1);
-  for (var i = 0; i < 16; i++) {
-    t = c & (p[i] ^ q[i]);
-    p[i] ^= t;
-    q[i] ^= t;
-  }
-}
-
-function pack25519(o, n) {
-  var i, j, b;
-  var m = gf(), t = gf();
-  for (i = 0; i < 16; i++) t[i] = n[i];
-  car25519(t);
-  car25519(t);
-  car25519(t);
-  for (j = 0; j < 2; j++) {
-    m[0] = t[0] - 0xffed;
-    for (i = 1; i < 15; i++) {
-      m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1);
-      m[i-1] &= 0xffff;
-    }
-    m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1);
-    b = (m[15]>>16) & 1;
-    m[14] &= 0xffff;
-    sel25519(t, m, 1-b);
-  }
-  for (i = 0; i < 16; i++) {
-    o[2*i] = t[i] & 0xff;
-    o[2*i+1] = t[i]>>8;
-  }
-}
-
-function neq25519(a, b) {
-  var c = new Uint8Array(32), d = new Uint8Array(32);
-  pack25519(c, a);
-  pack25519(d, b);
-  return crypto_verify_32(c, 0, d, 0);
-}
-
-function par25519(a) {
-  var d = new Uint8Array(32);
-  pack25519(d, a);
-  return d[0] & 1;
-}
-
-function unpack25519(o, n) {
-  var i;
-  for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8);
-  o[15] &= 0x7fff;
-}
-
-function A(o, a, b) {
-  var i;
-  for (i = 0; i < 16; i++) o[i] = (a[i] + b[i])|0;
-}
-
-function Z(o, a, b) {
-  var i;
-  for (i = 0; i < 16; i++) o[i] = (a[i] - b[i])|0;
-}
-
-function M(o, a, b) {
-  var i, j, t = new Float64Array(31);
-  for (i = 0; i < 31; i++) t[i] = 0;
-  for (i = 0; i < 16; i++) {
-    for (j = 0; j < 16; j++) {
-      t[i+j] += a[i] * b[j];
-    }
-  }
-  for (i = 0; i < 15; i++) {
-    t[i] += 38 * t[i+16];
-  }
-  for (i = 0; i < 16; i++) o[i] = t[i];
-  car25519(o);
-  car25519(o);
-}
-
-function S(o, a) {
-  M(o, a, a);
-}
-
-function inv25519(o, i) {
-  var c = gf();
-  var a;
-  for (a = 0; a < 16; a++) c[a] = i[a];
-  for (a = 253; a >= 0; a--) {
-    S(c, c);
-    if(a !== 2 && a !== 4) M(c, c, i);
-  }
-  for (a = 0; a < 16; a++) o[a] = c[a];
-}
-
-function pow2523(o, i) {
-  var c = gf();
-  var a;
-  for (a = 0; a < 16; a++) c[a] = i[a];
-  for (a = 250; a >= 0; a--) {
-      S(c, c);
-      if(a !== 1) M(c, c, i);
-  }
-  for (a = 0; a < 16; a++) o[a] = c[a];
-}
-
-function crypto_scalarmult(q, n, p) {
-  var z = new Uint8Array(32);
-  var x = new Float64Array(80), r, i;
-  var a = gf(), b = gf(), c = gf(),
-      d = gf(), e = gf(), f = gf();
-  for (i = 0; i < 31; i++) z[i] = n[i];
-  z[31]=(n[31]&127)|64;
-  z[0]&=248;
-  unpack25519(x,p);
-  for (i = 0; i < 16; i++) {
-    b[i]=x[i];
-    d[i]=a[i]=c[i]=0;
-  }
-  a[0]=d[0]=1;
-  for (i=254; i>=0; --i) {
-    r=(z[i>>>3]>>>(i&7))&1;
-    sel25519(a,b,r);
-    sel25519(c,d,r);
-    A(e,a,c);
-    Z(a,a,c);
-    A(c,b,d);
-    Z(b,b,d);
-    S(d,e);
-    S(f,a);
-    M(a,c,a);
-    M(c,b,e);
-    A(e,a,c);
-    Z(a,a,c);
-    S(b,a);
-    Z(c,d,f);
-    M(a,c,_121665);
-    A(a,a,d);
-    M(c,c,a);
-    M(a,d,f);
-    M(d,b,x);
-    S(b,e);
-    sel25519(a,b,r);
-    sel25519(c,d,r);
-  }
-  for (i = 0; i < 16; i++) {
-    x[i+16]=a[i];
-    x[i+32]=c[i];
-    x[i+48]=b[i];
-    x[i+64]=d[i];
-  }
-  var x32 = x.subarray(32);
-  var x16 = x.subarray(16);
-  inv25519(x32,x32);
-  M(x16,x16,x32);
-  pack25519(q,x16);
-  return 0;
-}
-
-function crypto_scalarmult_base(q, n) {
-  return crypto_scalarmult(q, n, _9);
-}
-
-function crypto_box_keypair(y, x) {
-  randombytes(x, 32);
-  return crypto_scalarmult_base(y, x);
-}
-
-function crypto_box_beforenm(k, y, x) {
-  var s = new Uint8Array(32);
-  crypto_scalarmult(s, x, y);
-  return crypto_core_hsalsa20(k, _0, s, sigma);
-}
-
-var crypto_box_afternm = crypto_secretbox;
-var crypto_box_open_afternm = crypto_secretbox_open;
-
-function crypto_box(c, m, d, n, y, x) {
-  var k = new Uint8Array(32);
-  crypto_box_beforenm(k, y, x);
-  return crypto_box_afternm(c, m, d, n, k);
-}
-
-function crypto_box_open(m, c, d, n, y, x) {
-  var k = new Uint8Array(32);
-  crypto_box_beforenm(k, y, x);
-  return crypto_box_open_afternm(m, c, d, n, k);
-}
-
-function add64() {
-  var a = 0, b = 0, c = 0, d = 0, m16 = 65535, l, h, i;
-  for (i = 0; i < arguments.length; i++) {
-    l = arguments[i].lo;
-    h = arguments[i].hi;
-    a += (l & m16); b += (l >>> 16);
-    c += (h & m16); d += (h >>> 16);
-  }
-
-  b += (a >>> 16);
-  c += (b >>> 16);
-  d += (c >>> 16);
-
-  return new u64((c & m16) | (d << 16), (a & m16) | (b << 16));
-}
-
-function shr64(x, c) {
-  return new u64((x.hi >>> c), (x.lo >>> c) | (x.hi << (32 - c)));
-}
-
-function xor64() {
-  var l = 0, h = 0, i;
-  for (i = 0; i < arguments.length; i++) {
-    l ^= arguments[i].lo;
-    h ^= arguments[i].hi;
-  }
-  return new u64(h, l);
-}
-
-function R(x, c) {
-  var h, l, c1 = 32 - c;
-  if (c < 32) {
-    h = (x.hi >>> c) | (x.lo << c1);
-    l = (x.lo >>> c) | (x.hi << c1);
-  } else if (c < 64) {
-    h = (x.lo >>> c) | (x.hi << c1);
-    l = (x.hi >>> c) | (x.lo << c1);
-  }
-  return new u64(h, l);
-}
-
-function Ch(x, y, z) {
-  var h = (x.hi & y.hi) ^ (~x.hi & z.hi),
-      l = (x.lo & y.lo) ^ (~x.lo & z.lo);
-  return new u64(h, l);
-}
-
-function Maj(x, y, z) {
-  var h = (x.hi & y.hi) ^ (x.hi & z.hi) ^ (y.hi & z.hi),
-      l = (x.lo & y.lo) ^ (x.lo & z.lo) ^ (y.lo & z.lo);
-  return new u64(h, l);
-}
-
-function Sigma0(x) { return xor64(R(x,28), R(x,34), R(x,39)); }
-function Sigma1(x) { return xor64(R(x,14), R(x,18), R(x,41)); }
-function sigma0(x) { return xor64(R(x, 1), R(x, 8), shr64(x,7)); }
-function sigma1(x) { return xor64(R(x,19), R(x,61), shr64(x,6)); }
-
-var K = [
-  new u64(0x428a2f98, 0xd728ae22), new u64(0x71374491, 0x23ef65cd),
-  new u64(0xb5c0fbcf, 0xec4d3b2f), new u64(0xe9b5dba5, 0x8189dbbc),
-  new u64(0x3956c25b, 0xf348b538), new u64(0x59f111f1, 0xb605d019),
-  new u64(0x923f82a4, 0xaf194f9b), new u64(0xab1c5ed5, 0xda6d8118),
-  new u64(0xd807aa98, 0xa3030242), new u64(0x12835b01, 0x45706fbe),
-  new u64(0x243185be, 0x4ee4b28c), new u64(0x550c7dc3, 0xd5ffb4e2),
-  new u64(0x72be5d74, 0xf27b896f), new u64(0x80deb1fe, 0x3b1696b1),
-  new u64(0x9bdc06a7, 0x25c71235), new u64(0xc19bf174, 0xcf692694),
-  new u64(0xe49b69c1, 0x9ef14ad2), new u64(0xefbe4786, 0x384f25e3),
-  new u64(0x0fc19dc6, 0x8b8cd5b5), new u64(0x240ca1cc, 0x77ac9c65),
-  new u64(0x2de92c6f, 0x592b0275), new u64(0x4a7484aa, 0x6ea6e483),
-  new u64(0x5cb0a9dc, 0xbd41fbd4), new u64(0x76f988da, 0x831153b5),
-  new u64(0x983e5152, 0xee66dfab), new u64(0xa831c66d, 0x2db43210),
-  new u64(0xb00327c8, 0x98fb213f), new u64(0xbf597fc7, 0xbeef0ee4),
-  new u64(0xc6e00bf3, 0x3da88fc2), new u64(0xd5a79147, 0x930aa725),
-  new u64(0x06ca6351, 0xe003826f), new u64(0x14292967, 0x0a0e6e70),
-  new u64(0x27b70a85, 0x46d22ffc), new u64(0x2e1b2138, 0x5c26c926),
-  new u64(0x4d2c6dfc, 0x5ac42aed), new u64(0x53380d13, 0x9d95b3df),
-  new u64(0x650a7354, 0x8baf63de), new u64(0x766a0abb, 0x3c77b2a8),
-  new u64(0x81c2c92e, 0x47edaee6), new u64(0x92722c85, 0x1482353b),
-  new u64(0xa2bfe8a1, 0x4cf10364), new u64(0xa81a664b, 0xbc423001),
-  new u64(0xc24b8b70, 0xd0f89791), new u64(0xc76c51a3, 0x0654be30),
-  new u64(0xd192e819, 0xd6ef5218), new u64(0xd6990624, 0x5565a910),
-  new u64(0xf40e3585, 0x5771202a), new u64(0x106aa070, 0x32bbd1b8),
-  new u64(0x19a4c116, 0xb8d2d0c8), new u64(0x1e376c08, 0x5141ab53),
-  new u64(0x2748774c, 0xdf8eeb99), new u64(0x34b0bcb5, 0xe19b48a8),
-  new u64(0x391c0cb3, 0xc5c95a63), new u64(0x4ed8aa4a, 0xe3418acb),
-  new u64(0x5b9cca4f, 0x7763e373), new u64(0x682e6ff3, 0xd6b2b8a3),
-  new u64(0x748f82ee, 0x5defb2fc), new u64(0x78a5636f, 0x43172f60),
-  new u64(0x84c87814, 0xa1f0ab72), new u64(0x8cc70208, 0x1a6439ec),
-  new u64(0x90befffa, 0x23631e28), new u64(0xa4506ceb, 0xde82bde9),
-  new u64(0xbef9a3f7, 0xb2c67915), new u64(0xc67178f2, 0xe372532b),
-  new u64(0xca273ece, 0xea26619c), new u64(0xd186b8c7, 0x21c0c207),
-  new u64(0xeada7dd6, 0xcde0eb1e), new u64(0xf57d4f7f, 0xee6ed178),
-  new u64(0x06f067aa, 0x72176fba), new u64(0x0a637dc5, 0xa2c898a6),
-  new u64(0x113f9804, 0xbef90dae), new u64(0x1b710b35, 0x131c471b),
-  new u64(0x28db77f5, 0x23047d84), new u64(0x32caab7b, 0x40c72493),
-  new u64(0x3c9ebe0a, 0x15c9bebc), new u64(0x431d67c4, 0x9c100d4c),
-  new u64(0x4cc5d4be, 0xcb3e42b6), new u64(0x597f299c, 0xfc657e2a),
-  new u64(0x5fcb6fab, 0x3ad6faec), new u64(0x6c44198c, 0x4a475817)
-];
-
-function crypto_hashblocks(x, m, n) {
-  var z = [], b = [], a = [], w = [], t, i, j;
-
-  for (i = 0; i < 8; i++) z[i] = a[i] = dl64(x, 8*i);
-
-  var pos = 0;
-  while (n >= 128) {
-    for (i = 0; i < 16; i++) w[i] = dl64(m, 8*i+pos);
-    for (i = 0; i < 80; i++) {
-      for (j = 0; j < 8; j++) b[j] = a[j];
-      t = add64(a[7], Sigma1(a[4]), Ch(a[4], a[5], a[6]), K[i], w[i%16]);
-      b[7] = add64(t, Sigma0(a[0]), Maj(a[0], a[1], a[2]));
-      b[3] = add64(b[3], t);
-      for (j = 0; j < 8; j++) a[(j+1)%8] = b[j];
-      if (i%16 === 15) {
-        for (j = 0; j < 16; j++) {
-          w[j] = add64(w[j], w[(j+9)%16], sigma0(w[(j+1)%16]), sigma1(w[(j+14)%16]));
-        }
-      }
-    }
-
-    for (i = 0; i < 8; i++) {
-      a[i] = add64(a[i], z[i]);
-      z[i] = a[i];
-    }
-
-    pos += 128;
-    n -= 128;
-  }
-
-  for (i = 0; i < 8; i++) ts64(x, 8*i, z[i]);
-  return n;
-}
-
-var iv = new Uint8Array([
-  0x6a,0x09,0xe6,0x67,0xf3,0xbc,0xc9,0x08,
-  0xbb,0x67,0xae,0x85,0x84,0xca,0xa7,0x3b,
-  0x3c,0x6e,0xf3,0x72,0xfe,0x94,0xf8,0x2b,
-  0xa5,0x4f,0xf5,0x3a,0x5f,0x1d,0x36,0xf1,
-  0x51,0x0e,0x52,0x7f,0xad,0xe6,0x82,0xd1,
-  0x9b,0x05,0x68,0x8c,0x2b,0x3e,0x6c,0x1f,
-  0x1f,0x83,0xd9,0xab,0xfb,0x41,0xbd,0x6b,
-  0x5b,0xe0,0xcd,0x19,0x13,0x7e,0x21,0x79
-]);
-
-function crypto_hash(out, m, n) {
-  var h = new Uint8Array(64), x = new Uint8Array(256);
-  var i, b = n;
-
-  for (i = 0; i < 64; i++) h[i] = iv[i];
-
-  crypto_hashblocks(h, m, n);
-  n %= 128;
-
-  for (i = 0; i < 256; i++) x[i] = 0;
-  for (i = 0; i < n; i++) x[i] = m[b-n+i];
-  x[n] = 128;
-
-  n = 256-128*(n<112?1:0);
-  x[n-9] = 0;
-  ts64(x, n-8, new u64((b / 0x20000000) | 0, b << 3));
-  crypto_hashblocks(h, x, n);
-
-  for (i = 0; i < 64; i++) out[i] = h[i];
-
-  return 0;
-}
-
-function add(p, q) {
-  var a = gf(), b = gf(), c = gf(),
-      d = gf(), e = gf(), f = gf(),
-      g = gf(), h = gf(), t = gf();
-
-  Z(a, p[1], p[0]);
-  Z(t, q[1], q[0]);
-  M(a, a, t);
-  A(b, p[0], p[1]);
-  A(t, q[0], q[1]);
-  M(b, b, t);
-  M(c, p[3], q[3]);
-  M(c, c, D2);
-  M(d, p[2], q[2]);
-  A(d, d, d);
-  Z(e, b, a);
-  Z(f, d, c);
-  A(g, d, c);
-  A(h, b, a);
-
-  M(p[0], e, f);
-  M(p[1], h, g);
-  M(p[2], g, f);
-  M(p[3], e, h);
-}
-
-function cswap(p, q, b) {
-  var i;
-  for (i = 0; i < 4; i++) {
-    sel25519(p[i], q[i], b);
-  }
-}
-
-function pack(r, p) {
-  var tx = gf(), ty = gf(), zi = gf();
-  inv25519(zi, p[2]);
-  M(tx, p[0], zi);
-  M(ty, p[1], zi);
-  pack25519(r, ty);
-  r[31] ^= par25519(tx) << 7;
-}
-
-function scalarmult(p, q, s) {
-  var b, i;
-  set25519(p[0], gf0);
-  set25519(p[1], gf1);
-  set25519(p[2], gf1);
-  set25519(p[3], gf0);
-  for (i = 255; i >= 0; --i) {
-    b = (s[(i/8)|0] >> (i&7)) & 1;
-    cswap(p, q, b);
-    add(q, p);
-    add(p, p);
-    cswap(p, q, b);
-  }
-}
-
-function scalarbase(p, s) {
-  var q = [gf(), gf(), gf(), gf()];
-  set25519(q[0], X);
-  set25519(q[1], Y);
-  set25519(q[2], gf1);
-  M(q[3], X, Y);
-  scalarmult(p, q, s);
-}
-
-function crypto_sign_keypair(pk, sk, seeded) {
-  var d = new Uint8Array(64);
-  var p = [gf(), gf(), gf(), gf()];
-  var i;
-
-  if (!seeded) randombytes(sk, 32);
-  crypto_hash(d, sk, 32);
-  d[0] &= 248;
-  d[31] &= 127;
-  d[31] |= 64;
-
-  scalarbase(p, d);
-  pack(pk, p);
-
-  for (i = 0; i < 32; i++) sk[i+32] = pk[i];
-  return 0;
-}
-
-var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);
-
-function modL(r, x) {
-  var carry, i, j, k;
-  for (i = 63; i >= 32; --i) {
-    carry = 0;
-    for (j = i - 32, k = i - 12; j < k; ++j) {
-      x[j] += carry - 16 * x[i] * L[j - (i - 32)];
-      carry = (x[j] + 128) >> 8;
-      x[j] -= carry * 256;
-    }
-    x[j] += carry;
-    x[i] = 0;
-  }
-  carry = 0;
-  for (j = 0; j < 32; j++) {
-    x[j] += carry - (x[31] >> 4) * L[j];
-    carry = x[j] >> 8;
-    x[j] &= 255;
-  }
-  for (j = 0; j < 32; j++) x[j] -= carry * L[j];
-  for (i = 0; i < 32; i++) {
-    x[i+1] += x[i] >> 8;
-    r[i] = x[i] & 255;
-  }
-}
-
-function reduce(r) {
-  var x = new Float64Array(64), i;
-  for (i = 0; i < 64; i++) x[i] = r[i];
-  for (i = 0; i < 64; i++) r[i] = 0;
-  modL(r, x);
-}
-
-// Note: difference from C - smlen returned, not passed as argument.
-function crypto_sign(sm, m, n, sk) {
-  var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);
-  var i, j, x = new Float64Array(64);
-  var p = [gf(), gf(), gf(), gf()];
-
-  crypto_hash(d, sk, 32);
-  d[0] &= 248;
-  d[31] &= 127;
-  d[31] |= 64;
-
-  var smlen = n + 64;
-  for (i = 0; i < n; i++) sm[64 + i] = m[i];
-  for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];
-
-  crypto_hash(r, sm.subarray(32), n+32);
-  reduce(r);
-  scalarbase(p, r);
-  pack(sm, p);
-
-  for (i = 32; i < 64; i++) sm[i] = sk[i];
-  crypto_hash(h, sm, n + 64);
-  reduce(h);
-
-  for (i = 0; i < 64; i++) x[i] = 0;
-  for (i = 0; i < 32; i++) x[i] = r[i];
-  for (i = 0; i < 32; i++) {
-    for (j = 0; j < 32; j++) {
-      x[i+j] += h[i] * d[j];
-    }
-  }
-
-  modL(sm.subarray(32), x);
-  return smlen;
-}
-
-function unpackneg(r, p) {
-  var t = gf(), chk = gf(), num = gf(),
-      den = gf(), den2 = gf(), den4 = gf(),
-      den6 = gf();
-
-  set25519(r[2], gf1);
-  unpack25519(r[1], p);
-  S(num, r[1]);
-  M(den, num, D);
-  Z(num, num, r[2]);
-  A(den, r[2], den);
-
-  S(den2, den);
-  S(den4, den2);
-  M(den6, den4, den2);
-  M(t, den6, num);
-  M(t, t, den);
-
-  pow2523(t, t);
-  M(t, t, num);
-  M(t, t, den);
-  M(t, t, den);
-  M(r[0], t, den);
-
-  S(chk, r[0]);
-  M(chk, chk, den);
-  if (neq25519(chk, num)) M(r[0], r[0], I);
-
-  S(chk, r[0]);
-  M(chk, chk, den);
-  if (neq25519(chk, num)) return -1;
-
-  if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]);
-
-  M(r[3], r[0], r[1]);
-  return 0;
-}
-
-function crypto_sign_open(m, sm, n, pk) {
-  var i, mlen;
-  var t = new Uint8Array(32), h = new Uint8Array(64);
-  var p = [gf(), gf(), gf(), gf()],
-      q = [gf(), gf(), gf(), gf()];
-
-  mlen = -1;
-  if (n < 64) return -1;
-
-  if (unpackneg(q, pk)) return -1;
-
-  for (i = 0; i < n; i++) m[i] = sm[i];
-  for (i = 0; i < 32; i++) m[i+32] = pk[i];
-  crypto_hash(h, m, n);
-  reduce(h);
-  scalarmult(p, q, h);
-
-  scalarbase(q, sm.subarray(32));
-  add(p, q);
-  pack(t, p);
-
-  n -= 64;
-  if (crypto_verify_32(sm, 0, t, 0)) {
-    for (i = 0; i < n; i++) m[i] = 0;
-    return -1;
-  }
-
-  for (i = 0; i < n; i++) m[i] = sm[i + 64];
-  mlen = n;
-  return mlen;
-}
-
-var crypto_secretbox_KEYBYTES = 32,
-    crypto_secretbox_NONCEBYTES = 24,
-    crypto_secretbox_ZEROBYTES = 32,
-    crypto_secretbox_BOXZEROBYTES = 16,
-    crypto_scalarmult_BYTES = 32,
-    crypto_scalarmult_SCALARBYTES = 32,
-    crypto_box_PUBLICKEYBYTES = 32,
-    crypto_box_SECRETKEYBYTES = 32,
-    crypto_box_BEFORENMBYTES = 32,
-    crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,
-    crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,
-    crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,
-    crypto_sign_BYTES = 64,
-    crypto_sign_PUBLICKEYBYTES = 32,
-    crypto_sign_SECRETKEYBYTES = 64,
-    crypto_sign_SEEDBYTES = 32,
-    crypto_hash_BYTES = 64;
-
-nacl.lowlevel = {
-  crypto_core_hsalsa20: crypto_core_hsalsa20,
-  crypto_stream_xor: crypto_stream_xor,
-  crypto_stream: crypto_stream,
-  crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,
-  crypto_stream_salsa20: crypto_stream_salsa20,
-  crypto_onetimeauth: crypto_onetimeauth,
-  crypto_onetimeauth_verify: crypto_onetimeauth_verify,
-  crypto_verify_16: crypto_verify_16,
-  crypto_verify_32: crypto_verify_32,
-  crypto_secretbox: crypto_secretbox,
-  crypto_secretbox_open: crypto_secretbox_open,
-  crypto_scalarmult: crypto_scalarmult,
-  crypto_scalarmult_base: crypto_scalarmult_base,
-  crypto_box_beforenm: crypto_box_beforenm,
-  crypto_box_afternm: crypto_box_afternm,
-  crypto_box: crypto_box,
-  crypto_box_open: crypto_box_open,
-  crypto_box_keypair: crypto_box_keypair,
-  crypto_hash: crypto_hash,
-  crypto_sign: crypto_sign,
-  crypto_sign_keypair: crypto_sign_keypair,
-  crypto_sign_open: crypto_sign_open,
-
-  crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,
-  crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,
-  crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,
-  crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,
-  crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,
-  crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,
-  crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,
-  crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,
-  crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,
-  crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,
-  crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,
-  crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,
-  crypto_sign_BYTES: crypto_sign_BYTES,
-  crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,
-  crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,
-  crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,
-  crypto_hash_BYTES: crypto_hash_BYTES
-};
-
-/* High-level API */
-
-function checkLengths(k, n) {
-  if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');
-  if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');
-}
-
-function checkBoxLengths(pk, sk) {
-  if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');
-  if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');
-}
-
-function checkArrayTypes() {
-  var t, i;
-  for (i = 0; i < arguments.length; i++) {
-     if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]')
-       throw new TypeError('unexpected type ' + t + ', use Uint8Array');
-  }
-}
-
-function cleanup(arr) {
-  for (var i = 0; i < arr.length; i++) arr[i] = 0;
-}
-
-nacl.util = {};
-
-nacl.util.decodeUTF8 = function(s) {
-  var i, d = unescape(encodeURIComponent(s)), b = new Uint8Array(d.length);
-  for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i);
-  return b;
-};
-
-nacl.util.encodeUTF8 = function(arr) {
-  var i, s = [];
-  for (i = 0; i < arr.length; i++) s.push(String.fromCharCode(arr[i]));
-  return decodeURIComponent(escape(s.join('')));
-};
-
-nacl.util.encodeBase64 = function(arr) {
-  if (typeof btoa === 'undefined') {
-    return (new Buffer(arr)).toString('base64');
-  } else {
-    var i, s = [], len = arr.length;
-    for (i = 0; i < len; i++) s.push(String.fromCharCode(arr[i]));
-    return btoa(s.join(''));
-  }
-};
-
-nacl.util.decodeBase64 = function(s) {
-  if (typeof atob === 'undefined') {
-    return new Uint8Array(Array.prototype.slice.call(new Buffer(s, 'base64'), 0));
-  } else {
-    var i, d = atob(s), b = new Uint8Array(d.length);
-    for (i = 0; i < d.length; i++) b[i] = d.charCodeAt(i);
-    return b;
-  }
-};
-
-nacl.randomBytes = function(n) {
-  var b = new Uint8Array(n);
-  randombytes(b, n);
-  return b;
-};
-
-nacl.secretbox = function(msg, nonce, key) {
-  checkArrayTypes(msg, nonce, key);
-  checkLengths(key, nonce);
-  var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);
-  var c = new Uint8Array(m.length);
-  for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i];
-  crypto_secretbox(c, m, m.length, nonce, key);
-  return c.subarray(crypto_secretbox_BOXZEROBYTES);
-};
-
-nacl.secretbox.open = function(box, nonce, key) {
-  checkArrayTypes(box, nonce, key);
-  checkLengths(key, nonce);
-  var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);
-  var m = new Uint8Array(c.length);
-  for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i];
-  if (c.length < 32) return false;
-  if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false;
-  return m.subarray(crypto_secretbox_ZEROBYTES);
-};
-
-nacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;
-nacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;
-nacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;
-
-nacl.scalarMult = function(n, p) {
-  checkArrayTypes(n, p);
-  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
-  if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');
-  var q = new Uint8Array(crypto_scalarmult_BYTES);
-  crypto_scalarmult(q, n, p);
-  return q;
-};
-
-nacl.scalarMult.base = function(n) {
-  checkArrayTypes(n);
-  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');
-  var q = new Uint8Array(crypto_scalarmult_BYTES);
-  crypto_scalarmult_base(q, n);
-  return q;
-};
-
-nacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;
-nacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;
-
-nacl.box = function(msg, nonce, publicKey, secretKey) {
-  var k = nacl.box.before(publicKey, secretKey);
-  return nacl.secretbox(msg, nonce, k);
-};
-
-nacl.box.before = function(publicKey, secretKey) {
-  checkArrayTypes(publicKey, secretKey);
-  checkBoxLengths(publicKey, secretKey);
-  var k = new Uint8Array(crypto_box_BEFORENMBYTES);
-  crypto_box_beforenm(k, publicKey, secretKey);
-  return k;
-};
-
-nacl.box.after = nacl.secretbox;
-
-nacl.box.open = function(msg, nonce, publicKey, secretKey) {
-  var k = nacl.box.before(publicKey, secretKey);
-  return nacl.secretbox.open(msg, nonce, k);
-};
-
-nacl.box.open.after = nacl.secretbox.open;
-
-nacl.box.keyPair = function() {
-  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
-  var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);
-  crypto_box_keypair(pk, sk);
-  return {publicKey: pk, secretKey: sk};
-};
-
-nacl.box.keyPair.fromSecretKey = function(secretKey) {
-  checkArrayTypes(secretKey);
-  if (secretKey.length !== crypto_box_SECRETKEYBYTES)
-    throw new Error('bad secret key size');
-  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);
-  crypto_scalarmult_base(pk, secretKey);
-  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
-};
-
-nacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;
-nacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;
-nacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;
-nacl.box.nonceLength = crypto_box_NONCEBYTES;
-nacl.box.overheadLength = nacl.secretbox.overheadLength;
-
-nacl.sign = function(msg, secretKey) {
-  checkArrayTypes(msg, secretKey);
-  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
-    throw new Error('bad secret key size');
-  var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length);
-  crypto_sign(signedMsg, msg, msg.length, secretKey);
-  return signedMsg;
-};
-
-nacl.sign.open = function(signedMsg, publicKey) {
-  if (arguments.length !== 2)
-    throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?');
-  checkArrayTypes(signedMsg, publicKey);
-  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
-    throw new Error('bad public key size');
-  var tmp = new Uint8Array(signedMsg.length);
-  var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);
-  if (mlen < 0) return null;
-  var m = new Uint8Array(mlen);
-  for (var i = 0; i < m.length; i++) m[i] = tmp[i];
-  return m;
-};
-
-nacl.sign.detached = function(msg, secretKey) {
-  var signedMsg = nacl.sign(msg, secretKey);
-  var sig = new Uint8Array(crypto_sign_BYTES);
-  for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];
-  return sig;
-};
-
-nacl.sign.detached.verify = function(msg, sig, publicKey) {
-  checkArrayTypes(msg, sig, publicKey);
-  if (sig.length !== crypto_sign_BYTES)
-    throw new Error('bad signature size');
-  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)
-    throw new Error('bad public key size');
-  var sm = new Uint8Array(crypto_sign_BYTES + msg.length);
-  var m = new Uint8Array(crypto_sign_BYTES + msg.length);
-  var i;
-  for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];
-  for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];
-  return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);
-};
-
-nacl.sign.keyPair = function() {
-  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
-  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
-  crypto_sign_keypair(pk, sk);
-  return {publicKey: pk, secretKey: sk};
-};
-
-nacl.sign.keyPair.fromSecretKey = function(secretKey) {
-  checkArrayTypes(secretKey);
-  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)
-    throw new Error('bad secret key size');
-  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
-  for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i];
-  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};
-};
-
-nacl.sign.keyPair.fromSeed = function(seed) {
-  checkArrayTypes(seed);
-  if (seed.length !== crypto_sign_SEEDBYTES)
-    throw new Error('bad seed size');
-  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);
-  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);
-  for (var i = 0; i < 32; i++) sk[i] = seed[i];
-  crypto_sign_keypair(pk, sk, true);
-  return {publicKey: pk, secretKey: sk};
-};
-
-nacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;
-nacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;
-nacl.sign.seedLength = crypto_sign_SEEDBYTES;
-nacl.sign.signatureLength = crypto_sign_BYTES;
-
-nacl.hash = function(msg) {
-  checkArrayTypes(msg);
-  var h = new Uint8Array(crypto_hash_BYTES);
-  crypto_hash(h, msg, msg.length);
-  return h;
-};
-
-nacl.hash.hashLength = crypto_hash_BYTES;
-
-nacl.verify = function(x, y) {
-  checkArrayTypes(x, y);
-  // Zero length arguments are considered not equal.
-  if (x.length === 0 || y.length === 0) return false;
-  if (x.length !== y.length) return false;
-  return (vn(x, 0, y, 0, x.length) === 0) ? true : false;
-};
-
-nacl.setPRNG = function(fn) {
-  randombytes = fn;
-};
-
-(function() {
-  // Initialize PRNG if environment provides CSPRNG.
-  // If not, methods calling randombytes will throw.
-  var crypto;
-  if (typeof window !== 'undefined') {
-    // Browser.
-    if (window.crypto && window.crypto.getRandomValues) {
-      crypto = window.crypto; // Standard
-    } else if (window.msCrypto && window.msCrypto.getRandomValues) {
-      crypto = window.msCrypto; // Internet Explorer 11+
-    }
-    if (crypto) {
-      nacl.setPRNG(function(x, n) {
-        var i, v = new Uint8Array(n);
-        crypto.getRandomValues(v);
-        for (i = 0; i < n; i++) x[i] = v[i];
-        cleanup(v);
-      });
-    }
-  } else if (typeof require !== 'undefined') {
-    // Node.js.
-    crypto = require('crypto');
-    if (crypto) {
-      nacl.setPRNG(function(x, n) {
-        var i, v = crypto.randomBytes(n);
-        for (i = 0; i < n; i++) x[i] = v[i];
-        cleanup(v);
-      });
-    }
-  }
-})();
-
-})(typeof module !== 'undefined' && module.exports ? module.exports : (window.nacl = window.nacl || {}));
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.min.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.min.js
deleted file mode 100644
index 95d869502e4b0da41c3ece4289f1cabb3e12bec9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/nacl.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(r){"use strict";function n(r,n){return r<<n|r>>>32-n}function e(r,n){var e=255&r[n+3];return e=e<<8|255&r[n+2],e=e<<8|255&r[n+1],e<<8|255&r[n+0]}function t(r,n){var e=r[n]<<24|r[n+1]<<16|r[n+2]<<8|r[n+3],t=r[n+4]<<24|r[n+5]<<16|r[n+6]<<8|r[n+7];return new lr(e,t)}function o(r,n,e){var t;for(t=0;4>t;t++)r[n+t]=255&e,e>>>=8}function i(r,n,e){r[n]=e.hi>>24&255,r[n+1]=e.hi>>16&255,r[n+2]=e.hi>>8&255,r[n+3]=255&e.hi,r[n+4]=e.lo>>24&255,r[n+5]=e.lo>>16&255,r[n+6]=e.lo>>8&255,r[n+7]=255&e.lo}function a(r,n,e,t,o){var i,a=0;for(i=0;o>i;i++)a|=r[n+i]^e[t+i];return(1&a-1>>>8)-1}function f(r,n,e,t){return a(r,n,e,t,16)}function u(r,n,e,t){return a(r,n,e,t,32)}function c(r,t,i,a,f){var u,c,w,y=new Uint32Array(16),s=new Uint32Array(16),l=new Uint32Array(16),h=new Uint32Array(4);for(u=0;4>u;u++)s[5*u]=e(a,4*u),s[1+u]=e(i,4*u),s[6+u]=e(t,4*u),s[11+u]=e(i,16+4*u);for(u=0;16>u;u++)l[u]=s[u];for(u=0;20>u;u++){for(c=0;4>c;c++){for(w=0;4>w;w++)h[w]=s[(5*c+4*w)%16];for(h[1]^=n(h[0]+h[3]|0,7),h[2]^=n(h[1]+h[0]|0,9),h[3]^=n(h[2]+h[1]|0,13),h[0]^=n(h[3]+h[2]|0,18),w=0;4>w;w++)y[4*c+(c+w)%4]=h[w]}for(w=0;16>w;w++)s[w]=y[w]}if(f){for(u=0;16>u;u++)s[u]=s[u]+l[u]|0;for(u=0;4>u;u++)s[5*u]=s[5*u]-e(a,4*u)|0,s[6+u]=s[6+u]-e(t,4*u)|0;for(u=0;4>u;u++)o(r,4*u,s[5*u]),o(r,16+4*u,s[6+u])}else for(u=0;16>u;u++)o(r,4*u,s[u]+l[u]|0)}function w(r,n,e,t){return c(r,n,e,t,!1),0}function y(r,n,e,t){return c(r,n,e,t,!0),0}function s(r,n,e,t,o,i,a){var f,u,c=new Uint8Array(16),y=new Uint8Array(64);if(!o)return 0;for(u=0;16>u;u++)c[u]=0;for(u=0;8>u;u++)c[u]=i[u];for(;o>=64;){for(w(y,c,a,Br),u=0;64>u;u++)r[n+u]=(e?e[t+u]:0)^y[u];for(f=1,u=8;16>u;u++)f=f+(255&c[u])|0,c[u]=255&f,f>>>=8;o-=64,n+=64,e&&(t+=64)}if(o>0)for(w(y,c,a,Br),u=0;o>u;u++)r[n+u]=(e?e[t+u]:0)^y[u];return 0}function l(r,n,e,t,o){return s(r,n,null,0,e,t,o)}function h(r,n,e,t,o){var i=new Uint8Array(32);return y(i,t,o,Br),l(r,n,e,t.subarray(16),i)}function g(r,n,e,t,o,i,a){var f=new Uint8Array(32);return y(f,i,a,Br),s(r,n,e,t,o,i.subarray(16),f)}function p(r,n){var e,t=0;for(e=0;17>e;e++)t=t+(r[e]+n[e]|0)|0,r[e]=255&t,t>>>=8}function v(r,n,e,t,o,i){var a,f,u,c,w=new Uint32Array(17),y=new Uint32Array(17),s=new Uint32Array(17),l=new Uint32Array(17),h=new Uint32Array(17);for(u=0;17>u;u++)y[u]=s[u]=0;for(u=0;16>u;u++)y[u]=i[u];for(y[3]&=15,y[4]&=252,y[7]&=15,y[8]&=252,y[11]&=15,y[12]&=252,y[15]&=15;o>0;){for(u=0;17>u;u++)l[u]=0;for(u=0;16>u&&o>u;++u)l[u]=e[t+u];for(l[u]=1,t+=u,o-=u,p(s,l),f=0;17>f;f++)for(w[f]=0,u=0;17>u;u++)w[f]=w[f]+s[u]*(f>=u?y[f-u]:320*y[f+17-u]|0)|0|0;for(f=0;17>f;f++)s[f]=w[f];for(c=0,u=0;16>u;u++)c=c+s[u]|0,s[u]=255&c,c>>>=8;for(c=c+s[16]|0,s[16]=3&c,c=5*(c>>>2)|0,u=0;16>u;u++)c=c+s[u]|0,s[u]=255&c,c>>>=8;c=c+s[16]|0,s[16]=c}for(u=0;17>u;u++)h[u]=s[u];for(p(s,Sr),a=0|-(s[16]>>>7),u=0;17>u;u++)s[u]^=a&(h[u]^s[u]);for(u=0;16>u;u++)l[u]=i[u+16];for(l[16]=0,p(s,l),u=0;16>u;u++)r[n+u]=s[u];return 0}function b(r,n,e,t,o,i){var a=new Uint8Array(16);return v(a,0,e,t,o,i),f(r,n,a,0)}function A(r,n,e,t,o){var i;if(32>e)return-1;for(g(r,0,n,0,e,t,o),v(r,16,r,32,e-32,r),i=0;16>i;i++)r[i]=0;return 0}function U(r,n,e,t,o){var i,a=new Uint8Array(32);if(32>e)return-1;if(h(a,0,32,t,o),0!==b(n,16,n,32,e-32,a))return-1;for(g(r,0,n,0,e,t,o),i=0;32>i;i++)r[i]=0;return 0}function _(r,n){var e;for(e=0;16>e;e++)r[e]=0|n[e]}function d(r){var n,e;for(e=0;16>e;e++)r[e]+=65536,n=Math.floor(r[e]/65536),r[(e+1)*(15>e?1:0)]+=n-1+37*(n-1)*(15===e?1:0),r[e]-=65536*n}function E(r,n,e){for(var t,o=~(e-1),i=0;16>i;i++)t=o&(r[i]^n[i]),r[i]^=t,n[i]^=t}function x(r,n){var e,t,o,i=hr(),a=hr();for(e=0;16>e;e++)a[e]=n[e];for(d(a),d(a),d(a),t=0;2>t;t++){for(i[0]=a[0]-65517,e=1;15>e;e++)i[e]=a[e]-65535-(i[e-1]>>16&1),i[e-1]&=65535;i[15]=a[15]-32767-(i[14]>>16&1),o=i[15]>>16&1,i[14]&=65535,E(a,i,1-o)}for(e=0;16>e;e++)r[2*e]=255&a[e],r[2*e+1]=a[e]>>8}function m(r,n){var e=new Uint8Array(32),t=new Uint8Array(32);return x(e,r),x(t,n),u(e,0,t,0)}function B(r){var n=new Uint8Array(32);return x(n,r),1&n[0]}function S(r,n){var e;for(e=0;16>e;e++)r[e]=n[2*e]+(n[2*e+1]<<8);r[15]&=32767}function K(r,n,e){var t;for(t=0;16>t;t++)r[t]=n[t]+e[t]|0}function T(r,n,e){var t;for(t=0;16>t;t++)r[t]=n[t]-e[t]|0}function Y(r,n,e){var t,o,i=new Float64Array(31);for(t=0;31>t;t++)i[t]=0;for(t=0;16>t;t++)for(o=0;16>o;o++)i[t+o]+=n[t]*e[o];for(t=0;15>t;t++)i[t]+=38*i[t+16];for(t=0;16>t;t++)r[t]=i[t];d(r),d(r)}function L(r,n){Y(r,n,n)}function C(r,n){var e,t=hr();for(e=0;16>e;e++)t[e]=n[e];for(e=253;e>=0;e--)L(t,t),2!==e&&4!==e&&Y(t,t,n);for(e=0;16>e;e++)r[e]=t[e]}function R(r,n){var e,t=hr();for(e=0;16>e;e++)t[e]=n[e];for(e=250;e>=0;e--)L(t,t),1!==e&&Y(t,t,n);for(e=0;16>e;e++)r[e]=t[e]}function k(r,n,e){var t,o,i=new Uint8Array(32),a=new Float64Array(80),f=hr(),u=hr(),c=hr(),w=hr(),y=hr(),s=hr();for(o=0;31>o;o++)i[o]=n[o];for(i[31]=127&n[31]|64,i[0]&=248,S(a,e),o=0;16>o;o++)u[o]=a[o],w[o]=f[o]=c[o]=0;for(f[0]=w[0]=1,o=254;o>=0;--o)t=i[o>>>3]>>>(7&o)&1,E(f,u,t),E(c,w,t),K(y,f,c),T(f,f,c),K(c,u,w),T(u,u,w),L(w,y),L(s,f),Y(f,c,f),Y(c,u,y),K(y,f,c),T(f,f,c),L(u,f),T(c,w,s),Y(f,c,Ur),K(f,f,w),Y(c,c,f),Y(f,w,s),Y(w,u,a),L(u,y),E(f,u,t),E(c,w,t);for(o=0;16>o;o++)a[o+16]=f[o],a[o+32]=c[o],a[o+48]=u[o],a[o+64]=w[o];var l=a.subarray(32),h=a.subarray(16);return C(l,l),Y(h,h,l),x(r,h),0}function z(r,n){return k(r,n,vr)}function P(r,n){return gr(n,32),z(r,n)}function O(r,n,e){var t=new Uint8Array(32);return k(t,e,n),y(r,pr,t,Br)}function F(r,n,e,t,o,i){var a=new Uint8Array(32);return O(a,o,i),Kr(r,n,e,t,a)}function N(r,n,e,t,o,i){var a=new Uint8Array(32);return O(a,o,i),Tr(r,n,e,t,a)}function M(){var r,n,e,t=0,o=0,i=0,a=0,f=65535;for(e=0;e<arguments.length;e++)r=arguments[e].lo,n=arguments[e].hi,t+=r&f,o+=r>>>16,i+=n&f,a+=n>>>16;return o+=t>>>16,i+=o>>>16,a+=i>>>16,new lr(i&f|a<<16,t&f|o<<16)}function j(r,n){return new lr(r.hi>>>n,r.lo>>>n|r.hi<<32-n)}function G(){var r,n=0,e=0;for(r=0;r<arguments.length;r++)n^=arguments[r].lo,e^=arguments[r].hi;return new lr(e,n)}function I(r,n){var e,t,o=32-n;return 32>n?(e=r.hi>>>n|r.lo<<o,t=r.lo>>>n|r.hi<<o):64>n&&(e=r.lo>>>n|r.hi<<o,t=r.hi>>>n|r.lo<<o),new lr(e,t)}function Z(r,n,e){var t=r.hi&n.hi^~r.hi&e.hi,o=r.lo&n.lo^~r.lo&e.lo;return new lr(t,o)}function V(r,n,e){var t=r.hi&n.hi^r.hi&e.hi^n.hi&e.hi,o=r.lo&n.lo^r.lo&e.lo^n.lo&e.lo;return new lr(t,o)}function q(r){return G(I(r,28),I(r,34),I(r,39))}function X(r){return G(I(r,14),I(r,18),I(r,41))}function D(r){return G(I(r,1),I(r,8),j(r,7))}function H(r){return G(I(r,19),I(r,61),j(r,6))}function J(r,n,e){var o,a,f,u=[],c=[],w=[],y=[];for(a=0;8>a;a++)u[a]=w[a]=t(r,8*a);for(var s=0;e>=128;){for(a=0;16>a;a++)y[a]=t(n,8*a+s);for(a=0;80>a;a++){for(f=0;8>f;f++)c[f]=w[f];for(o=M(w[7],X(w[4]),Z(w[4],w[5],w[6]),Yr[a],y[a%16]),c[7]=M(o,q(w[0]),V(w[0],w[1],w[2])),c[3]=M(c[3],o),f=0;8>f;f++)w[(f+1)%8]=c[f];if(a%16===15)for(f=0;16>f;f++)y[f]=M(y[f],y[(f+9)%16],D(y[(f+1)%16]),H(y[(f+14)%16]))}for(a=0;8>a;a++)w[a]=M(w[a],u[a]),u[a]=w[a];s+=128,e-=128}for(a=0;8>a;a++)i(r,8*a,u[a]);return e}function Q(r,n,e){var t,o=new Uint8Array(64),a=new Uint8Array(256),f=e;for(t=0;64>t;t++)o[t]=Lr[t];for(J(o,n,e),e%=128,t=0;256>t;t++)a[t]=0;for(t=0;e>t;t++)a[t]=n[f-e+t];for(a[e]=128,e=256-128*(112>e?1:0),a[e-9]=0,i(a,e-8,new lr(f/536870912|0,f<<3)),J(o,a,e),t=0;64>t;t++)r[t]=o[t];return 0}function W(r,n){var e=hr(),t=hr(),o=hr(),i=hr(),a=hr(),f=hr(),u=hr(),c=hr(),w=hr();T(e,r[1],r[0]),T(w,n[1],n[0]),Y(e,e,w),K(t,r[0],r[1]),K(w,n[0],n[1]),Y(t,t,w),Y(o,r[3],n[3]),Y(o,o,dr),Y(i,r[2],n[2]),K(i,i,i),T(a,t,e),T(f,i,o),K(u,i,o),K(c,t,e),Y(r[0],a,f),Y(r[1],c,u),Y(r[2],u,f),Y(r[3],a,c)}function $(r,n,e){var t;for(t=0;4>t;t++)E(r[t],n[t],e)}function rr(r,n){var e=hr(),t=hr(),o=hr();C(o,n[2]),Y(e,n[0],o),Y(t,n[1],o),x(r,t),r[31]^=B(e)<<7}function nr(r,n,e){var t,o;for(_(r[0],br),_(r[1],Ar),_(r[2],Ar),_(r[3],br),o=255;o>=0;--o)t=e[o/8|0]>>(7&o)&1,$(r,n,t),W(n,r),W(r,r),$(r,n,t)}function er(r,n){var e=[hr(),hr(),hr(),hr()];_(e[0],Er),_(e[1],xr),_(e[2],Ar),Y(e[3],Er,xr),nr(r,e,n)}function tr(r,n,e){var t,o=new Uint8Array(64),i=[hr(),hr(),hr(),hr()];for(e||gr(n,32),Q(o,n,32),o[0]&=248,o[31]&=127,o[31]|=64,er(i,o),rr(r,i),t=0;32>t;t++)n[t+32]=r[t];return 0}function or(r,n){var e,t,o,i;for(t=63;t>=32;--t){for(e=0,o=t-32,i=t-12;i>o;++o)n[o]+=e-16*n[t]*Cr[o-(t-32)],e=n[o]+128>>8,n[o]-=256*e;n[o]+=e,n[t]=0}for(e=0,o=0;32>o;o++)n[o]+=e-(n[31]>>4)*Cr[o],e=n[o]>>8,n[o]&=255;for(o=0;32>o;o++)n[o]-=e*Cr[o];for(t=0;32>t;t++)n[t+1]+=n[t]>>8,r[t]=255&n[t]}function ir(r){var n,e=new Float64Array(64);for(n=0;64>n;n++)e[n]=r[n];for(n=0;64>n;n++)r[n]=0;or(r,e)}function ar(r,n,e,t){var o,i,a=new Uint8Array(64),f=new Uint8Array(64),u=new Uint8Array(64),c=new Float64Array(64),w=[hr(),hr(),hr(),hr()];Q(a,t,32),a[0]&=248,a[31]&=127,a[31]|=64;var y=e+64;for(o=0;e>o;o++)r[64+o]=n[o];for(o=0;32>o;o++)r[32+o]=a[32+o];for(Q(u,r.subarray(32),e+32),ir(u),er(w,u),rr(r,w),o=32;64>o;o++)r[o]=t[o];for(Q(f,r,e+64),ir(f),o=0;64>o;o++)c[o]=0;for(o=0;32>o;o++)c[o]=u[o];for(o=0;32>o;o++)for(i=0;32>i;i++)c[o+i]+=f[o]*a[i];return or(r.subarray(32),c),y}function fr(r,n){var e=hr(),t=hr(),o=hr(),i=hr(),a=hr(),f=hr(),u=hr();return _(r[2],Ar),S(r[1],n),L(o,r[1]),Y(i,o,_r),T(o,o,r[2]),K(i,r[2],i),L(a,i),L(f,a),Y(u,f,a),Y(e,u,o),Y(e,e,i),R(e,e),Y(e,e,o),Y(e,e,i),Y(e,e,i),Y(r[0],e,i),L(t,r[0]),Y(t,t,i),m(t,o)&&Y(r[0],r[0],mr),L(t,r[0]),Y(t,t,i),m(t,o)?-1:(B(r[0])===n[31]>>7&&T(r[0],br,r[0]),Y(r[3],r[0],r[1]),0)}function ur(r,n,e,t){var o,i,a=new Uint8Array(32),f=new Uint8Array(64),c=[hr(),hr(),hr(),hr()],w=[hr(),hr(),hr(),hr()];if(i=-1,64>e)return-1;if(fr(w,t))return-1;for(o=0;e>o;o++)r[o]=n[o];for(o=0;32>o;o++)r[o+32]=t[o];if(Q(f,r,e),ir(f),nr(c,w,f),er(w,n.subarray(32)),W(c,w),rr(a,c),e-=64,u(n,0,a,0)){for(o=0;e>o;o++)r[o]=0;return-1}for(o=0;e>o;o++)r[o]=n[o+64];return i=e}function cr(r,n){if(r.length!==Rr)throw new Error("bad key size");if(n.length!==kr)throw new Error("bad nonce size")}function wr(r,n){if(r.length!==Nr)throw new Error("bad public key size");if(n.length!==Mr)throw new Error("bad secret key size")}function yr(){var r,n;for(n=0;n<arguments.length;n++)if("[object Uint8Array]"!==(r=Object.prototype.toString.call(arguments[n])))throw new TypeError("unexpected type "+r+", use Uint8Array")}function sr(r){for(var n=0;n<r.length;n++)r[n]=0}var lr=function(r,n){this.hi=0|r,this.lo=0|n},hr=function(r){var n,e=new Float64Array(16);if(r)for(n=0;n<r.length;n++)e[n]=r[n];return e},gr=function(){throw new Error("no PRNG")},pr=new Uint8Array(16),vr=new Uint8Array(32);vr[0]=9;var br=hr(),Ar=hr([1]),Ur=hr([56129,1]),_r=hr([30883,4953,19914,30187,55467,16705,2637,112,59544,30585,16505,36039,65139,11119,27886,20995]),dr=hr([61785,9906,39828,60374,45398,33411,5274,224,53552,61171,33010,6542,64743,22239,55772,9222]),Er=hr([54554,36645,11616,51542,42930,38181,51040,26924,56412,64982,57905,49316,21502,52590,14035,8553]),xr=hr([26200,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214,26214]),mr=hr([41136,18958,6951,50414,58488,44335,6150,12099,55207,15867,153,11085,57099,20417,9344,11139]),Br=new Uint8Array([101,120,112,97,110,100,32,51,50,45,98,121,116,101,32,107]),Sr=new Uint32Array([5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252]),Kr=A,Tr=U,Yr=[new lr(1116352408,3609767458),new lr(1899447441,602891725),new lr(3049323471,3964484399),new lr(3921009573,2173295548),new lr(961987163,4081628472),new lr(1508970993,3053834265),new lr(2453635748,2937671579),new lr(2870763221,3664609560),new lr(3624381080,2734883394),new lr(310598401,1164996542),new lr(607225278,1323610764),new lr(1426881987,3590304994),new lr(1925078388,4068182383),new lr(2162078206,991336113),new lr(2614888103,633803317),new lr(3248222580,3479774868),new lr(3835390401,2666613458),new lr(4022224774,944711139),new lr(264347078,2341262773),new lr(604807628,2007800933),new lr(770255983,1495990901),new lr(1249150122,1856431235),new lr(1555081692,3175218132),new lr(1996064986,2198950837),new lr(2554220882,3999719339),new lr(2821834349,766784016),new lr(2952996808,2566594879),new lr(3210313671,3203337956),new lr(3336571891,1034457026),new lr(3584528711,2466948901),new lr(113926993,3758326383),new lr(338241895,168717936),new lr(666307205,1188179964),new lr(773529912,1546045734),new lr(1294757372,1522805485),new lr(1396182291,2643833823),new lr(1695183700,2343527390),new lr(1986661051,1014477480),new lr(2177026350,1206759142),new lr(2456956037,344077627),new lr(2730485921,1290863460),new lr(2820302411,3158454273),new lr(3259730800,3505952657),new lr(3345764771,106217008),new lr(3516065817,3606008344),new lr(3600352804,1432725776),new lr(4094571909,1467031594),new lr(275423344,851169720),new lr(430227734,3100823752),new lr(506948616,1363258195),new lr(659060556,3750685593),new lr(883997877,3785050280),new lr(958139571,3318307427),new lr(1322822218,3812723403),new lr(1537002063,2003034995),new lr(1747873779,3602036899),new lr(1955562222,1575990012),new lr(2024104815,1125592928),new lr(2227730452,2716904306),new lr(2361852424,442776044),new lr(2428436474,593698344),new lr(2756734187,3733110249),new lr(3204031479,2999351573),new lr(3329325298,3815920427),new lr(3391569614,3928383900),new lr(3515267271,566280711),new lr(3940187606,3454069534),new lr(4118630271,4000239992),new lr(116418474,1914138554),new lr(174292421,2731055270),new lr(289380356,3203993006),new lr(460393269,320620315),new lr(685471733,587496836),new lr(852142971,1086792851),new lr(1017036298,365543100),new lr(1126000580,2618297676),new lr(1288033470,3409855158),new lr(1501505948,4234509866),new lr(1607167915,987167468),new lr(1816402316,1246189591)],Lr=new Uint8Array([106,9,230,103,243,188,201,8,187,103,174,133,132,202,167,59,60,110,243,114,254,148,248,43,165,79,245,58,95,29,54,241,81,14,82,127,173,230,130,209,155,5,104,140,43,62,108,31,31,131,217,171,251,65,189,107,91,224,205,25,19,126,33,121]),Cr=new Float64Array([237,211,245,92,26,99,18,88,214,156,247,162,222,249,222,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16]),Rr=32,kr=24,zr=32,Pr=16,Or=32,Fr=32,Nr=32,Mr=32,jr=32,Gr=kr,Ir=zr,Zr=Pr,Vr=64,qr=32,Xr=64,Dr=32,Hr=64;r.lowlevel={crypto_core_hsalsa20:y,crypto_stream_xor:g,crypto_stream:h,crypto_stream_salsa20_xor:s,crypto_stream_salsa20:l,crypto_onetimeauth:v,crypto_onetimeauth_verify:b,crypto_verify_16:f,crypto_verify_32:u,crypto_secretbox:A,crypto_secretbox_open:U,crypto_scalarmult:k,crypto_scalarmult_base:z,crypto_box_beforenm:O,crypto_box_afternm:Kr,crypto_box:F,crypto_box_open:N,crypto_box_keypair:P,crypto_hash:Q,crypto_sign:ar,crypto_sign_keypair:tr,crypto_sign_open:ur,crypto_secretbox_KEYBYTES:Rr,crypto_secretbox_NONCEBYTES:kr,crypto_secretbox_ZEROBYTES:zr,crypto_secretbox_BOXZEROBYTES:Pr,crypto_scalarmult_BYTES:Or,crypto_scalarmult_SCALARBYTES:Fr,crypto_box_PUBLICKEYBYTES:Nr,crypto_box_SECRETKEYBYTES:Mr,crypto_box_BEFORENMBYTES:jr,crypto_box_NONCEBYTES:Gr,crypto_box_ZEROBYTES:Ir,crypto_box_BOXZEROBYTES:Zr,crypto_sign_BYTES:Vr,crypto_sign_PUBLICKEYBYTES:qr,crypto_sign_SECRETKEYBYTES:Xr,crypto_sign_SEEDBYTES:Dr,crypto_hash_BYTES:Hr},r.util={},r.util.decodeUTF8=function(r){var n,e=unescape(encodeURIComponent(r)),t=new Uint8Array(e.length);for(n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t},r.util.encodeUTF8=function(r){var n,e=[];for(n=0;n<r.length;n++)e.push(String.fromCharCode(r[n]));return decodeURIComponent(escape(e.join("")))},r.util.encodeBase64=function(r){if("undefined"==typeof btoa)return new Buffer(r).toString("base64");var n,e=[],t=r.length;for(n=0;t>n;n++)e.push(String.fromCharCode(r[n]));return btoa(e.join(""))},r.util.decodeBase64=function(r){if("undefined"==typeof atob)return new Uint8Array(Array.prototype.slice.call(new Buffer(r,"base64"),0));var n,e=atob(r),t=new Uint8Array(e.length);for(n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t},r.randomBytes=function(r){var n=new Uint8Array(r);return gr(n,r),n},r.secretbox=function(r,n,e){yr(r,n,e),cr(e,n);for(var t=new Uint8Array(zr+r.length),o=new Uint8Array(t.length),i=0;i<r.length;i++)t[i+zr]=r[i];return A(o,t,t.length,n,e),o.subarray(Pr)},r.secretbox.open=function(r,n,e){yr(r,n,e),cr(e,n);for(var t=new Uint8Array(Pr+r.length),o=new Uint8Array(t.length),i=0;i<r.length;i++)t[i+Pr]=r[i];return t.length<32?!1:0!==U(o,t,t.length,n,e)?!1:o.subarray(zr)},r.secretbox.keyLength=Rr,r.secretbox.nonceLength=kr,r.secretbox.overheadLength=Pr,r.scalarMult=function(r,n){if(yr(r,n),r.length!==Fr)throw new Error("bad n size");if(n.length!==Or)throw new Error("bad p size");var e=new Uint8Array(Or);return k(e,r,n),e},r.scalarMult.base=function(r){if(yr(r),r.length!==Fr)throw new Error("bad n size");var n=new Uint8Array(Or);return z(n,r),n},r.scalarMult.scalarLength=Fr,r.scalarMult.groupElementLength=Or,r.box=function(n,e,t,o){var i=r.box.before(t,o);return r.secretbox(n,e,i)},r.box.before=function(r,n){yr(r,n),wr(r,n);var e=new Uint8Array(jr);return O(e,r,n),e},r.box.after=r.secretbox,r.box.open=function(n,e,t,o){var i=r.box.before(t,o);return r.secretbox.open(n,e,i)},r.box.open.after=r.secretbox.open,r.box.keyPair=function(){var r=new Uint8Array(Nr),n=new Uint8Array(Mr);return P(r,n),{publicKey:r,secretKey:n}},r.box.keyPair.fromSecretKey=function(r){if(yr(r),r.length!==Mr)throw new Error("bad secret key size");var n=new Uint8Array(Nr);return z(n,r),{publicKey:n,secretKey:new Uint8Array(r)}},r.box.publicKeyLength=Nr,r.box.secretKeyLength=Mr,r.box.sharedKeyLength=jr,r.box.nonceLength=Gr,r.box.overheadLength=r.secretbox.overheadLength,r.sign=function(r,n){if(yr(r,n),n.length!==Xr)throw new Error("bad secret key size");var e=new Uint8Array(Vr+r.length);return ar(e,r,r.length,n),e},r.sign.open=function(r,n){if(2!==arguments.length)throw new Error("nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?");if(yr(r,n),n.length!==qr)throw new Error("bad public key size");var e=new Uint8Array(r.length),t=ur(e,r,r.length,n);if(0>t)return null;for(var o=new Uint8Array(t),i=0;i<o.length;i++)o[i]=e[i];return o},r.sign.detached=function(n,e){for(var t=r.sign(n,e),o=new Uint8Array(Vr),i=0;i<o.length;i++)o[i]=t[i];return o},r.sign.detached.verify=function(r,n,e){if(yr(r,n,e),n.length!==Vr)throw new Error("bad signature size");if(e.length!==qr)throw new Error("bad public key size");var t,o=new Uint8Array(Vr+r.length),i=new Uint8Array(Vr+r.length);for(t=0;Vr>t;t++)o[t]=n[t];for(t=0;t<r.length;t++)o[t+Vr]=r[t];return ur(i,o,o.length,e)>=0},r.sign.keyPair=function(){var r=new Uint8Array(qr),n=new Uint8Array(Xr);return tr(r,n),{publicKey:r,secretKey:n}},r.sign.keyPair.fromSecretKey=function(r){if(yr(r),r.length!==Xr)throw new Error("bad secret key size");for(var n=new Uint8Array(qr),e=0;e<n.length;e++)n[e]=r[32+e];return{publicKey:n,secretKey:new Uint8Array(r)}},r.sign.keyPair.fromSeed=function(r){if(yr(r),r.length!==Dr)throw new Error("bad seed size");for(var n=new Uint8Array(qr),e=new Uint8Array(Xr),t=0;32>t;t++)e[t]=r[t];return tr(n,e,!0),{publicKey:n,secretKey:e}},r.sign.publicKeyLength=qr,r.sign.secretKeyLength=Xr,r.sign.seedLength=Dr,r.sign.signatureLength=Vr,r.hash=function(r){yr(r);var n=new Uint8Array(Hr);return Q(n,r,r.length),n},r.hash.hashLength=Hr,r.verify=function(r,n){return yr(r,n),0===r.length||0===n.length?!1:r.length!==n.length?!1:0===a(r,0,n,0,r.length)?!0:!1},r.setPRNG=function(r){gr=r},function(){var n;"undefined"!=typeof window?(window.crypto&&window.crypto.getRandomValues?n=window.crypto:window.msCrypto&&window.msCrypto.getRandomValues&&(n=window.msCrypto),n&&r.setPRNG(function(r,e){var t,o=new Uint8Array(e);for(n.getRandomValues(o),t=0;e>t;t++)r[t]=o[t];sr(o)})):"undefined"!=typeof require&&(n=require("crypto"),n&&r.setPRNG(function(r,e){var t,o=n.randomBytes(e);for(t=0;e>t;t++)r[t]=o[t];sr(o)}))}()}("undefined"!=typeof module&&module.exports?module.exports:window.nacl=window.nacl||{});
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/package.json
deleted file mode 100644
index a399574fabef90aefbe0726a2873708a0d321706..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/node_modules/tweetnacl/package.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
-  "_from": "tweetnacl@>=0.13.0 <0.14.0",
-  "_id": "tweetnacl@0.13.3",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/sshpk/tweetnacl",
-  "_nodeVersion": "4.2.3",
-  "_npmUser": {
-    "email": "dmitry@codingrobots.com",
-    "name": "dchest"
-  },
-  "_npmVersion": "2.14.7",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature/sshpk"
-  ],
-  "_resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz",
-  "_shasum": "d628b56f3bcc3d5ae74ba9d4c1a704def5ab4b56",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "TweetNaCl-js contributors"
-  },
-  "browser": {
-    "buffer": false,
-    "crypto": false
-  },
-  "bugs": {
-    "url": "https://github.com/dchest/tweetnacl-js/issues"
-  },
-  "dependencies": {},
-  "description": "Port of TweetNaCl cryptographic library to JavaScript",
-  "devDependencies": {
-    "browserify": "^10.1.3",
-    "eslint": "^1.4.3",
-    "faucet": "0.0.1",
-    "tap-browser-color": "^0.1.2",
-    "tape": "^4.0.0",
-    "testling": "^1.7.1",
-    "uglify-js": "^2.4.21"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "dist": {
-    "shasum": "d628b56f3bcc3d5ae74ba9d4c1a704def5ab4b56",
-    "tarball": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.3.tgz"
-  },
-  "gitHead": "2bb422cb707fba4a5ec9654688564a4fb861b068",
-  "homepage": "https://dchest.github.io/tweetnacl-js",
-  "keywords": [
-    "crypto",
-    "cryptography",
-    "curve25519",
-    "ed25519",
-    "encrypt",
-    "hash",
-    "key",
-    "nacl",
-    "poly1305",
-    "public",
-    "salsa20",
-    "signatures"
-  ],
-  "license": "Public domain",
-  "main": "nacl-fast.js",
-  "maintainers": [
-    {
-      "name": "dchest",
-      "email": "dmitry@codingrobots.com"
-    }
-  ],
-  "name": "tweetnacl",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/dchest/tweetnacl-js.git"
-  },
-  "scripts": {
-    "bench": "node test/benchmark/bench.js",
-    "browser": "browserify test/browser/init.js test/*.js | uglifyjs -c -m -o test/browser/_bundle.js 2>/dev/null",
-    "browser-quick": "browserify test/browser/init.js test/*.quick.js | uglifyjs -c -m -o test/browser/_bundle-quick.js 2>/dev/null",
-    "build": "uglifyjs nacl.js -c -m -o nacl.min.js && uglifyjs nacl-fast.js -c -m -o nacl-fast.min.js",
-    "chrome": "browserify test/browser/testling_init.js test/*.js | testling -x google-chrome | faucet",
-    "firefox": "browserify test/browser/testling_init.js test/*.js | testling -x firefox | faucet",
-    "lint": "eslint nacl.js nacl-fast.js test/*.js test/benchmark/*.js",
-    "test": "tape test/*.js | faucet",
-    "testall": "make -C test/c && tape test/*.js test/c/*.js | faucet",
-    "testling": "browserify test/browser/testling_init.js test/*.js | testling | faucet"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/latest",
-      "chrome/22..latest",
-      "firefox/16..latest",
-      "ipad/6..latest",
-      "iphone/6..latest",
-      "opera/11.0..latest",
-      "safari/latest"
-    ],
-    "files": "test/*.js"
-  },
-  "version": "0.13.3"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/package.json
deleted file mode 100644
index 22ec336b1af6443ee16e65ffacf12380d20a9346..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/node_modules/sshpk/package.json
+++ /dev/null
@@ -1,107 +0,0 @@
-{
-  "_from": "sshpk@>=1.7.0 <2.0.0",
-  "_id": "sshpk@1.8.3",
-  "_location": "/serialport/node-pre-gyp/request/http-signature/sshpk",
-  "_nodeVersion": "0.12.13",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/sshpk-1.8.3.tgz_1461968607532_0.32797130732797086"
-  },
-  "_npmUser": {
-    "email": "alex@cooperi.net",
-    "name": "arekinath"
-  },
-  "_npmVersion": "2.15.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/http-signature"
-  ],
-  "_resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.8.3.tgz",
-  "_shasum": "890cc9d614dc5292e5cb1a543b03c9abaa5c374e",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "Joyent, Inc"
-  },
-  "bin": {
-    "sshpk-conv": "bin/sshpk-conv",
-    "sshpk-sign": "bin/sshpk-sign",
-    "sshpk-verify": "bin/sshpk-verify"
-  },
-  "bugs": {
-    "url": "https://github.com/arekinath/node-sshpk/issues"
-  },
-  "contributors": [
-    {
-      "name": "Dave Eddy",
-      "email": "dave@daveeddy.com"
-    },
-    {
-      "name": "Mark Cavage",
-      "email": "mcavage@gmail.com"
-    },
-    {
-      "name": "Alex Wilson",
-      "email": "alex@cooperi.net"
-    }
-  ],
-  "dependencies": {
-    "asn1": "~0.2.3",
-    "assert-plus": "^1.0.0",
-    "dashdash": "^1.12.0",
-    "ecc-jsbn": "~0.1.1",
-    "getpass": "^0.1.1",
-    "jodid25519": "^1.0.0",
-    "jsbn": "~0.1.0",
-    "tweetnacl": "~0.13.0"
-  },
-  "description": "A library for finding and using SSH public keys",
-  "devDependencies": {
-    "benchmark": "^1.0.0",
-    "sinon": "^1.17.2",
-    "tape": "^3.5.0",
-    "temp": "^0.8.2"
-  },
-  "directories": {
-    "bin": "./bin",
-    "lib": "./lib",
-    "man": "./man/man1"
-  },
-  "dist": {
-    "shasum": "890cc9d614dc5292e5cb1a543b03c9abaa5c374e",
-    "tarball": "https://registry.npmjs.org/sshpk/-/sshpk-1.8.3.tgz"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "gitHead": "82d39066b2df4e8284350ff5ebb08c5b95c74652",
-  "homepage": "https://github.com/arekinath/node-sshpk#readme",
-  "license": "MIT",
-  "main": "lib/index.js",
-  "maintainers": [
-    {
-      "name": "arekinath",
-      "email": "alex@cooperi.net"
-    }
-  ],
-  "man": [
-    "/Users/alex.wilson/dev/sshpk/man/man1/sshpk-conv.1",
-    "/Users/alex.wilson/dev/sshpk/man/man1/sshpk-sign.1",
-    "/Users/alex.wilson/dev/sshpk/man/man1/sshpk-verify.1"
-  ],
-  "name": "sshpk",
-  "optionalDependencies": {
-    "ecc-jsbn": "~0.1.1",
-    "jodid25519": "^1.0.0",
-    "jsbn": "~0.1.0",
-    "tweetnacl": "~0.13.0"
-  },
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/arekinath/node-sshpk.git"
-  },
-  "scripts": {
-    "test": "tape test/*.js"
-  },
-  "version": "1.8.3"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/package.json
deleted file mode 100644
index 28c070ce1cca902faa3fb4a923be278d282eebca..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/http-signature/package.json
+++ /dev/null
@@ -1,90 +0,0 @@
-{
-  "_from": "http-signature@>=1.1.0 <1.2.0",
-  "_id": "http-signature@1.1.1",
-  "_location": "/serialport/node-pre-gyp/request/http-signature",
-  "_nodeVersion": "0.12.9",
-  "_npmUser": {
-    "email": "alex@cooperi.net",
-    "name": "arekinath"
-  },
-  "_npmVersion": "2.14.9",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
-  "_shasum": "df72e267066cd0ac67fb76adf8e134a8fbcf91bf",
-  "_shrinkwrap": null,
-  "author": {
-    "name": "Joyent, Inc"
-  },
-  "bugs": {
-    "url": "https://github.com/joyent/node-http-signature/issues"
-  },
-  "contributors": [
-    {
-      "name": "Mark Cavage",
-      "email": "mcavage@gmail.com"
-    },
-    {
-      "name": "David I. Lehn",
-      "email": "dil@lehn.org"
-    },
-    {
-      "name": "Patrick Mooney",
-      "email": "patrick.f.mooney@gmail.com"
-    }
-  ],
-  "dependencies": {
-    "assert-plus": "^0.2.0",
-    "jsprim": "^1.2.2",
-    "sshpk": "^1.7.0"
-  },
-  "description": "Reference implementation of Joyent's HTTP Signature scheme.",
-  "devDependencies": {
-    "node-uuid": "^1.4.1",
-    "tap": "0.4.2"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "df72e267066cd0ac67fb76adf8e134a8fbcf91bf",
-    "tarball": "http://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz"
-  },
-  "engines": {
-    "node": ">=0.8",
-    "npm": ">=1.3.7"
-  },
-  "gitHead": "74d3f35e3aa436d83723c53b01e266f448e8149a",
-  "homepage": "https://github.com/joyent/node-http-signature/",
-  "keywords": [
-    "https",
-    "request"
-  ],
-  "license": "MIT",
-  "main": "lib/index.js",
-  "maintainers": [
-    {
-      "name": "arekinath",
-      "email": "alex@cooperi.net"
-    },
-    {
-      "name": "mcavage",
-      "email": "mcavage@gmail.com"
-    },
-    {
-      "name": "pfmooney",
-      "email": "patrick.f.mooney@gmail.com"
-    }
-  ],
-  "name": "http-signature",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/joyent/node-http-signature.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "1.1.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/LICENSE.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/LICENSE.md
deleted file mode 100644
index ee27ba4b4412b0e4a05af5e3d8a005bc6681fdf3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/LICENSE.md
+++ /dev/null
@@ -1,18 +0,0 @@
-This software is released under the MIT license:
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/README.md
deleted file mode 100644
index 275286391935842285d869d8a18949e04ca20fdf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# is-typedarray [![locked](http://badges.github.io/stability-badges/dist/locked.svg)](http://github.com/badges/stability-badges)
-
-Detect whether or not an object is a
-[Typed Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Typed_arrays).
-
-## Usage
-
-[![NPM](https://nodei.co/npm/is-typedarray.png)](https://nodei.co/npm/is-typedarray/)
-
-### isTypedArray(array)
-
-Returns `true` when array is a Typed Array, and `false` when it is not.
-
-## License
-
-MIT. See [LICENSE.md](http://github.com/hughsk/is-typedarray/blob/master/LICENSE.md) for details.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/index.js
deleted file mode 100644
index 58596036cdf15908a729e6547936eef72b2d2e60..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/index.js
+++ /dev/null
@@ -1,41 +0,0 @@
-module.exports      = isTypedArray
-isTypedArray.strict = isStrictTypedArray
-isTypedArray.loose  = isLooseTypedArray
-
-var toString = Object.prototype.toString
-var names = {
-    '[object Int8Array]': true
-  , '[object Int16Array]': true
-  , '[object Int32Array]': true
-  , '[object Uint8Array]': true
-  , '[object Uint8ClampedArray]': true
-  , '[object Uint16Array]': true
-  , '[object Uint32Array]': true
-  , '[object Float32Array]': true
-  , '[object Float64Array]': true
-}
-
-function isTypedArray(arr) {
-  return (
-       isStrictTypedArray(arr)
-    || isLooseTypedArray(arr)
-  )
-}
-
-function isStrictTypedArray(arr) {
-  return (
-       arr instanceof Int8Array
-    || arr instanceof Int16Array
-    || arr instanceof Int32Array
-    || arr instanceof Uint8Array
-    || arr instanceof Uint8ClampedArray
-    || arr instanceof Uint16Array
-    || arr instanceof Uint32Array
-    || arr instanceof Float32Array
-    || arr instanceof Float64Array
-  )
-}
-
-function isLooseTypedArray(arr) {
-  return names[toString.call(arr)]
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/package.json
deleted file mode 100644
index 34c28ef8397ff65a08bfde56027e0ebd1bac393f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/package.json
+++ /dev/null
@@ -1,64 +0,0 @@
-{
-  "_from": "is-typedarray@>=1.0.0 <1.1.0",
-  "_id": "is-typedarray@1.0.0",
-  "_location": "/serialport/node-pre-gyp/request/is-typedarray",
-  "_nodeVersion": "0.10.36",
-  "_npmUser": {
-    "email": "hughskennedy@gmail.com",
-    "name": "hughsk"
-  },
-  "_npmVersion": "2.7.5",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-  "_shasum": "e479c80858df0c1b11ddda6940f96011fcda4a9a",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "hughskennedy@gmail.com",
-    "name": "Hugh Kennedy",
-    "url": "http://hughsk.io/"
-  },
-  "bugs": {
-    "url": "https://github.com/hughsk/is-typedarray/issues"
-  },
-  "dependencies": {},
-  "description": "Detect whether or not an object is a Typed Array",
-  "devDependencies": {
-    "tape": "^2.13.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "e479c80858df0c1b11ddda6940f96011fcda4a9a",
-    "tarball": "http://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
-  },
-  "gitHead": "0617cfa871686cf541af62b144f130488f44f6fe",
-  "homepage": "https://github.com/hughsk/is-typedarray",
-  "keywords": [
-    "array",
-    "detect",
-    "is",
-    "typed",
-    "util"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "hughsk",
-      "email": "hughskennedy@gmail.com"
-    }
-  ],
-  "name": "is-typedarray",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/hughsk/is-typedarray.git"
-  },
-  "scripts": {
-    "test": "node test"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/test.js
deleted file mode 100644
index b0c176fa302aa0c3aacab1287893ee5c1f8b07d6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/is-typedarray/test.js
+++ /dev/null
@@ -1,34 +0,0 @@
-var test = require('tape')
-var ista = require('./')
-
-test('strict', function(t) {
-  t.ok(ista.strict(new Int8Array), 'Int8Array')
-  t.ok(ista.strict(new Int16Array), 'Int16Array')
-  t.ok(ista.strict(new Int32Array), 'Int32Array')
-  t.ok(ista.strict(new Uint8Array), 'Uint8Array')
-  t.ok(ista.strict(new Uint16Array), 'Uint16Array')
-  t.ok(ista.strict(new Uint32Array), 'Uint32Array')
-  t.ok(ista.strict(new Float32Array), 'Float32Array')
-  t.ok(ista.strict(new Float64Array), 'Float64Array')
-
-  t.ok(!ista.strict(new Array), 'Array')
-  t.ok(!ista.strict([]), '[]')
-
-  t.end()
-})
-
-test('loose', function(t) {
-  t.ok(ista.loose(new Int8Array), 'Int8Array')
-  t.ok(ista.loose(new Int16Array), 'Int16Array')
-  t.ok(ista.loose(new Int32Array), 'Int32Array')
-  t.ok(ista.loose(new Uint8Array), 'Uint8Array')
-  t.ok(ista.loose(new Uint16Array), 'Uint16Array')
-  t.ok(ista.loose(new Uint32Array), 'Uint32Array')
-  t.ok(ista.loose(new Float32Array), 'Float32Array')
-  t.ok(ista.loose(new Float64Array), 'Float64Array')
-
-  t.ok(!ista.loose(new Array), 'Array')
-  t.ok(!ista.loose([]), '[]')
-
-  t.end()
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/.jshintrc b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/.jshintrc
deleted file mode 100644
index c8ef3ca4097f8288c92d3f298cb089c1bf05aa68..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/.jshintrc
+++ /dev/null
@@ -1,59 +0,0 @@
-{
-    "predef": [ ]
-  , "bitwise": false
-  , "camelcase": false
-  , "curly": false
-  , "eqeqeq": false
-  , "forin": false
-  , "immed": false
-  , "latedef": false
-  , "noarg": true
-  , "noempty": true
-  , "nonew": true
-  , "plusplus": false
-  , "quotmark": true
-  , "regexp": false
-  , "undef": true
-  , "unused": true
-  , "strict": false
-  , "trailing": true
-  , "maxlen": 120
-  , "asi": true
-  , "boss": true
-  , "debug": true
-  , "eqnull": true
-  , "esnext": true
-  , "evil": true
-  , "expr": true
-  , "funcscope": false
-  , "globalstrict": false
-  , "iterator": false
-  , "lastsemic": true
-  , "laxbreak": true
-  , "laxcomma": true
-  , "loopfunc": true
-  , "multistr": false
-  , "onecase": false
-  , "proto": false
-  , "regexdash": false
-  , "scripturl": true
-  , "smarttabs": false
-  , "shadow": false
-  , "sub": true
-  , "supernew": false
-  , "validthis": true
-  , "browser": true
-  , "couch": false
-  , "devel": false
-  , "dojo": false
-  , "mootools": false
-  , "node": true
-  , "nonstandard": true
-  , "prototypejs": false
-  , "rhino": false
-  , "worker": true
-  , "wsh": false
-  , "nomen": false
-  , "onevar": false
-  , "passfail": false
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/.npmignore
deleted file mode 100644
index aa1ec1ea0618124672d14a63d00d943240f2db2a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-*.tgz
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/.travis.yml
deleted file mode 100644
index 1fec2ab9afd64dd704e5b9c2a6042c8be14f01b8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
-  - "0.11"
-branches:
-  only:
-    - master
-notifications:
-  email:
-    - rod@vagg.org
-script: npm test
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/LICENSE.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/LICENSE.md
deleted file mode 100644
index 43f7153f9f966f20ab9f090f5c2265c7bf7113b2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/LICENSE.md
+++ /dev/null
@@ -1,11 +0,0 @@
-The MIT License (MIT)
-=====================
-
-Copyright (c) 2015 Rod Vagg
----------------------------
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/README.md
deleted file mode 100644
index 06770e82f2f27dd5e7bb58d518c0a00d7758a060..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/README.md
+++ /dev/null
@@ -1,66 +0,0 @@
-# isStream
-
-[![Build Status](https://secure.travis-ci.org/rvagg/isstream.png)](http://travis-ci.org/rvagg/isstream)
-
-**Test if an object is a `Stream`**
-
-[![NPM](https://nodei.co/npm/isstream.svg)](https://nodei.co/npm/isstream/)
-
-The missing `Stream.isStream(obj)`: determine if an object is standard Node.js `Stream`. Works for Node-core `Stream` objects (for 0.8, 0.10, 0.11, and in theory, older and newer versions) and all versions of **[readable-stream](https://github.com/isaacs/readable-stream)**.
-
-## Usage:
-
-```js
-var isStream = require('isstream')
-var Stream = require('stream')
-
-isStream(new Stream()) // true
-
-isStream({}) // false
-
-isStream(new Stream.Readable())    // true
-isStream(new Stream.Writable())    // true
-isStream(new Stream.Duplex())      // true
-isStream(new Stream.Transform())   // true
-isStream(new Stream.PassThrough()) // true
-```
-
-## But wait! There's more!
-
-You can also test for `isReadable(obj)`, `isWritable(obj)` and `isDuplex(obj)` to test for implementations of Streams2 (and Streams3) base classes.
-
-```js
-var isReadable = require('isstream').isReadable
-var isWritable = require('isstream').isWritable
-var isDuplex = require('isstream').isDuplex
-var Stream = require('stream')
-
-isReadable(new Stream()) // false
-isWritable(new Stream()) // false
-isDuplex(new Stream())   // false
-
-isReadable(new Stream.Readable())    // true
-isReadable(new Stream.Writable())    // false
-isReadable(new Stream.Duplex())      // true
-isReadable(new Stream.Transform())   // true
-isReadable(new Stream.PassThrough()) // true
-
-isWritable(new Stream.Readable())    // false
-isWritable(new Stream.Writable())    // true
-isWritable(new Stream.Duplex())      // true
-isWritable(new Stream.Transform())   // true
-isWritable(new Stream.PassThrough()) // true
-
-isDuplex(new Stream.Readable())    // false
-isDuplex(new Stream.Writable())    // false
-isDuplex(new Stream.Duplex())      // true
-isDuplex(new Stream.Transform())   // true
-isDuplex(new Stream.PassThrough()) // true
-```
-
-*Reminder: when implementing your own streams, please [use **readable-stream** rather than core streams](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).*
-
-
-## License
-
-**isStream** is Copyright (c) 2015 Rod Vagg [@rvagg](https://twitter.com/rvagg) and licenced under the MIT licence. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE.md file for more details.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/isstream.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/isstream.js
deleted file mode 100644
index a1d104a7ac5cfd388d7143aaeb747bdb7712ce32..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/isstream.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var stream = require('stream')
-
-
-function isStream (obj) {
-  return obj instanceof stream.Stream
-}
-
-
-function isReadable (obj) {
-  return isStream(obj) && typeof obj._read == 'function' && typeof obj._readableState == 'object'
-}
-
-
-function isWritable (obj) {
-  return isStream(obj) && typeof obj._write == 'function' && typeof obj._writableState == 'object'
-}
-
-
-function isDuplex (obj) {
-  return isReadable(obj) && isWritable(obj)
-}
-
-
-module.exports            = isStream
-module.exports.isReadable = isReadable
-module.exports.isWritable = isWritable
-module.exports.isDuplex   = isDuplex
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/package.json
deleted file mode 100644
index e6bb8547a7285b6a9b3ae1136bc6c1812ad582a4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/package.json
+++ /dev/null
@@ -1,67 +0,0 @@
-{
-  "_from": "isstream@>=0.1.2 <0.2.0",
-  "_id": "isstream@0.1.2",
-  "_location": "/serialport/node-pre-gyp/request/isstream",
-  "_nodeVersion": "1.4.3",
-  "_npmUser": {
-    "email": "rod@vagg.org",
-    "name": "rvagg"
-  },
-  "_npmVersion": "2.6.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-  "_shasum": "47e63f7af55afa6f92e1500e690eb8b8529c099a",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "rod@vagg.org",
-    "name": "Rod Vagg"
-  },
-  "bugs": {
-    "url": "https://github.com/rvagg/isstream/issues"
-  },
-  "dependencies": {},
-  "description": "Determine if an object is a Stream",
-  "devDependencies": {
-    "core-util-is": "~1.0.0",
-    "inherits": "~2.0.1",
-    "isarray": "0.0.1",
-    "string_decoder": "~0.10.x",
-    "tape": "~2.12.3"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "47e63f7af55afa6f92e1500e690eb8b8529c099a",
-    "tarball": "http://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
-  },
-  "gitHead": "cd39cba6da939b4fc9110825203adc506422c3dc",
-  "homepage": "https://github.com/rvagg/isstream",
-  "keywords": [
-    "hippo",
-    "readable-stream",
-    "stream",
-    "streams",
-    "type"
-  ],
-  "license": "MIT",
-  "main": "isstream.js",
-  "maintainers": [
-    {
-      "name": "rvagg",
-      "email": "rod@vagg.org"
-    }
-  ],
-  "name": "isstream",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/rvagg/isstream.git"
-  },
-  "scripts": {
-    "test": "tar --xform 's/^package/readable-stream-1.0/' -zxf readable-stream-1.0.*.tgz && tar --xform 's/^package/readable-stream-1.1/' -zxf readable-stream-1.1.*.tgz && node test.js; rm -rf readable-stream-1.?/"
-  },
-  "version": "0.1.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/test.js
deleted file mode 100644
index 8c950c55e6375f01b196cd492983422620dc509e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/isstream/test.js
+++ /dev/null
@@ -1,168 +0,0 @@
-var tape             = require('tape')
-  , EE               = require('events').EventEmitter
-  , util             = require('util')
-
-
-  , isStream         = require('./')
-  , isReadable       = require('./').isReadable
-  , isWritable       = require('./').isWritable
-  , isDuplex         = require('./').isDuplex
-
-  , CoreStreams      = require('stream')
-  , ReadableStream10 = require('./readable-stream-1.0/')
-  , ReadableStream11 = require('./readable-stream-1.1/')
-
-
-function test (pass, type, stream) {
-  tape('isStream('  + type + ')', function (t) {
-    t.plan(1)
-    t.ok(pass === isStream(stream), type)
-  })
-}
-
-
-function testReadable (pass, type, stream) {
-  tape('isReadable('  + type + ')', function (t) {
-    t.plan(1)
-    t.ok(pass === isReadable(stream), type)
-  })
-}
-
-
-function testWritable (pass, type, stream) {
-  tape('isWritable('  + type + ')', function (t) {
-    t.plan(1)
-    t.ok(pass === isWritable(stream), type)
-  })
-}
-
-
-function testDuplex (pass, type, stream) {
-  tape('isDuplex('  + type + ')', function (t) {
-    t.plan(1)
-    t.ok(pass === isDuplex(stream), type)
-  })
-}
-
-
-[ undefined, null, '', true, false, 0, 1, 1.0, 'string', {}, function foo () {} ].forEach(function (o) {
-  test(false, 'non-stream / primitive: ' + (JSON.stringify(o) || (o && o.toString()) || o), o)
-})
-
-
-test(false, 'fake stream obj', { pipe: function () {} })
-
-
-;(function () {
-
-  // looks like a stream!
-
-  function Stream () {
-    EE.call(this)
-  }
-  util.inherits(Stream, EE)
-  Stream.prototype.pipe = function () {}
-  Stream.Stream = Stream
-
-  test(false, 'fake stream "new Stream()"', new Stream())
-
-}())
-
-
-test(true, 'CoreStreams.Stream', new (CoreStreams.Stream)())
-test(true, 'CoreStreams.Readable', new (CoreStreams.Readable)())
-test(true, 'CoreStreams.Writable', new (CoreStreams.Writable)())
-test(true, 'CoreStreams.Duplex', new (CoreStreams.Duplex)())
-test(true, 'CoreStreams.Transform', new (CoreStreams.Transform)())
-test(true, 'CoreStreams.PassThrough', new (CoreStreams.PassThrough)())
-
-test(true, 'ReadableStream10.Readable', new (ReadableStream10.Readable)())
-test(true, 'ReadableStream10.Writable', new (ReadableStream10.Writable)())
-test(true, 'ReadableStream10.Duplex', new (ReadableStream10.Duplex)())
-test(true, 'ReadableStream10.Transform', new (ReadableStream10.Transform)())
-test(true, 'ReadableStream10.PassThrough', new (ReadableStream10.PassThrough)())
-
-test(true, 'ReadableStream11.Readable', new (ReadableStream11.Readable)())
-test(true, 'ReadableStream11.Writable', new (ReadableStream11.Writable)())
-test(true, 'ReadableStream11.Duplex', new (ReadableStream11.Duplex)())
-test(true, 'ReadableStream11.Transform', new (ReadableStream11.Transform)())
-test(true, 'ReadableStream11.PassThrough', new (ReadableStream11.PassThrough)())
-
-
-testReadable(false, 'CoreStreams.Stream', new (CoreStreams.Stream)())
-testReadable(true, 'CoreStreams.Readable', new (CoreStreams.Readable)())
-testReadable(false, 'CoreStreams.Writable', new (CoreStreams.Writable)())
-testReadable(true, 'CoreStreams.Duplex', new (CoreStreams.Duplex)())
-testReadable(true, 'CoreStreams.Transform', new (CoreStreams.Transform)())
-testReadable(true, 'CoreStreams.PassThrough', new (CoreStreams.PassThrough)())
-
-testReadable(true, 'ReadableStream10.Readable', new (ReadableStream10.Readable)())
-testReadable(false, 'ReadableStream10.Writable', new (ReadableStream10.Writable)())
-testReadable(true, 'ReadableStream10.Duplex', new (ReadableStream10.Duplex)())
-testReadable(true, 'ReadableStream10.Transform', new (ReadableStream10.Transform)())
-testReadable(true, 'ReadableStream10.PassThrough', new (ReadableStream10.PassThrough)())
-
-testReadable(true, 'ReadableStream11.Readable', new (ReadableStream11.Readable)())
-testReadable(false, 'ReadableStream11.Writable', new (ReadableStream11.Writable)())
-testReadable(true, 'ReadableStream11.Duplex', new (ReadableStream11.Duplex)())
-testReadable(true, 'ReadableStream11.Transform', new (ReadableStream11.Transform)())
-testReadable(true, 'ReadableStream11.PassThrough', new (ReadableStream11.PassThrough)())
-
-
-testWritable(false, 'CoreStreams.Stream', new (CoreStreams.Stream)())
-testWritable(false, 'CoreStreams.Readable', new (CoreStreams.Readable)())
-testWritable(true, 'CoreStreams.Writable', new (CoreStreams.Writable)())
-testWritable(true, 'CoreStreams.Duplex', new (CoreStreams.Duplex)())
-testWritable(true, 'CoreStreams.Transform', new (CoreStreams.Transform)())
-testWritable(true, 'CoreStreams.PassThrough', new (CoreStreams.PassThrough)())
-
-testWritable(false, 'ReadableStream10.Readable', new (ReadableStream10.Readable)())
-testWritable(true, 'ReadableStream10.Writable', new (ReadableStream10.Writable)())
-testWritable(true, 'ReadableStream10.Duplex', new (ReadableStream10.Duplex)())
-testWritable(true, 'ReadableStream10.Transform', new (ReadableStream10.Transform)())
-testWritable(true, 'ReadableStream10.PassThrough', new (ReadableStream10.PassThrough)())
-
-testWritable(false, 'ReadableStream11.Readable', new (ReadableStream11.Readable)())
-testWritable(true, 'ReadableStream11.Writable', new (ReadableStream11.Writable)())
-testWritable(true, 'ReadableStream11.Duplex', new (ReadableStream11.Duplex)())
-testWritable(true, 'ReadableStream11.Transform', new (ReadableStream11.Transform)())
-testWritable(true, 'ReadableStream11.PassThrough', new (ReadableStream11.PassThrough)())
-
-
-testDuplex(false, 'CoreStreams.Stream', new (CoreStreams.Stream)())
-testDuplex(false, 'CoreStreams.Readable', new (CoreStreams.Readable)())
-testDuplex(false, 'CoreStreams.Writable', new (CoreStreams.Writable)())
-testDuplex(true, 'CoreStreams.Duplex', new (CoreStreams.Duplex)())
-testDuplex(true, 'CoreStreams.Transform', new (CoreStreams.Transform)())
-testDuplex(true, 'CoreStreams.PassThrough', new (CoreStreams.PassThrough)())
-
-testDuplex(false, 'ReadableStream10.Readable', new (ReadableStream10.Readable)())
-testDuplex(false, 'ReadableStream10.Writable', new (ReadableStream10.Writable)())
-testDuplex(true, 'ReadableStream10.Duplex', new (ReadableStream10.Duplex)())
-testDuplex(true, 'ReadableStream10.Transform', new (ReadableStream10.Transform)())
-testDuplex(true, 'ReadableStream10.PassThrough', new (ReadableStream10.PassThrough)())
-
-testDuplex(false, 'ReadableStream11.Readable', new (ReadableStream11.Readable)())
-testDuplex(false, 'ReadableStream11.Writable', new (ReadableStream11.Writable)())
-testDuplex(true, 'ReadableStream11.Duplex', new (ReadableStream11.Duplex)())
-testDuplex(true, 'ReadableStream11.Transform', new (ReadableStream11.Transform)())
-testDuplex(true, 'ReadableStream11.PassThrough', new (ReadableStream11.PassThrough)())
-
-
-;[ CoreStreams, ReadableStream10, ReadableStream11 ].forEach(function (p) {
-  [ 'Stream', 'Readable', 'Writable', 'Duplex', 'Transform', 'PassThrough' ].forEach(function (k) {
-    if (!p[k])
-      return
-
-    function SubStream () {
-      p[k].call(this)
-    }
-    util.inherits(SubStream, p[k])
-
-    test(true, 'Stream subclass: ' + p.name + '.' + k, new SubStream())
-
-  })
-})
-
-
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/.npmignore
deleted file mode 100644
index 17d6b3677f037e5749dcd01f9a197e64dc25e06a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-/*.tgz
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/CHANGELOG.md
deleted file mode 100644
index 42bcb60af47a50b7ec47d899dbd522e4ed163772..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/CHANGELOG.md
+++ /dev/null
@@ -1,14 +0,0 @@
-## Unreleased
-- Fixes stringify to only take ancestors into account when checking
-  circularity.  
-  It previously assumed every visited object was circular which led to [false
-  positives][issue9].  
-  Uses the tiny serializer I wrote for [Must.js][must] a year and a half ago.
-- Fixes calling the `replacer` function in the proper context (`thisArg`).
-- Fixes calling the `cycleReplacer` function in the proper context (`thisArg`).
-- Speeds serializing by a factor of
-  Big-O(h-my-god-it-linearly-searched-every-object) it had ever seen. Searching
-  only the ancestors for a circular references speeds up things considerably.
-
-[must]: https://github.com/moll/js-must
-[issue9]: https://github.com/isaacs/json-stringify-safe/issues/9
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/Makefile b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/Makefile
deleted file mode 100644
index 36088c723a3b3f96e449136639da88e43cd716dd..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/Makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-NODE_OPTS =
-TEST_OPTS =
-
-love:
-	@echo "Feel like makin' love."
-
-test:
-	@node $(NODE_OPTS) ./node_modules/.bin/_mocha -R dot $(TEST_OPTS)
-
-spec:
-	@node $(NODE_OPTS) ./node_modules/.bin/_mocha -R spec $(TEST_OPTS)
-
-autotest:
-	@node $(NODE_OPTS) ./node_modules/.bin/_mocha -R dot --watch $(TEST_OPTS)
-
-autospec:
-	@node $(NODE_OPTS) ./node_modules/.bin/_mocha -R spec --watch $(TEST_OPTS)
-
-pack:
-	@file=$$(npm pack); echo "$$file"; tar tf "$$file"
-
-publish:
-	npm publish
-
-tag:
-	git tag "v$$(node -e 'console.log(require("./package").version)')"
-
-clean:
-	rm -f *.tgz
-	npm prune --production
-
-.PHONY: love
-.PHONY: test spec autotest autospec
-.PHONY: pack publish tag
-.PHONY: clean
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/README.md
deleted file mode 100644
index a11f302a33070c667396a5119a4c42bebada6a32..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/README.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# json-stringify-safe
-
-Like JSON.stringify, but doesn't throw on circular references.
-
-## Usage
-
-Takes the same arguments as `JSON.stringify`.
-
-```javascript
-var stringify = require('json-stringify-safe');
-var circularObj = {};
-circularObj.circularRef = circularObj;
-circularObj.list = [ circularObj, circularObj ];
-console.log(stringify(circularObj, null, 2));
-```
-
-Output:
-
-```json
-{
-  "circularRef": "[Circular]",
-  "list": [
-    "[Circular]",
-    "[Circular]"
-  ]
-}
-```
-
-## Details
-
-```
-stringify(obj, serializer, indent, decycler)
-```
-
-The first three arguments are the same as to JSON.stringify.  The last
-is an argument that's only used when the object has been seen already.
-
-The default `decycler` function returns the string `'[Circular]'`.
-If, for example, you pass in `function(k,v){}` (return nothing) then it
-will prune cycles.  If you pass in `function(k,v){ return {foo: 'bar'}}`,
-then cyclical objects will always be represented as `{"foo":"bar"}` in
-the result.
-
-```
-stringify.getSerialize(serializer, decycler)
-```
-
-Returns a serializer that can be used elsewhere.  This is the actual
-function that's passed to JSON.stringify.
-
-**Note** that the function returned from `getSerialize` is stateful for now, so
-do **not** use it more than once.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/package.json
deleted file mode 100644
index d1976ba07f223d1ada23debe2564da4f94afd43b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/package.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "_from": "json-stringify-safe@>=5.0.1 <5.1.0",
-  "_id": "json-stringify-safe@5.0.1",
-  "_location": "/serialport/node-pre-gyp/request/json-stringify-safe",
-  "_nodeVersion": "2.0.1",
-  "_npmUser": {
-    "email": "isaacs@npmjs.com",
-    "name": "isaacs"
-  },
-  "_npmVersion": "2.10.0",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-  "_shasum": "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/json-stringify-safe/issues"
-  },
-  "contributors": [
-    {
-      "name": "Andri Möll",
-      "email": "andri@dot.ee",
-      "url": "http://themoll.com"
-    }
-  ],
-  "dependencies": {},
-  "description": "Like JSON.stringify, but doesn't blow up on circular refs.",
-  "devDependencies": {
-    "mocha": ">= 2.1.0 < 3",
-    "must": ">= 0.12 < 0.13",
-    "sinon": ">= 1.12.2 < 2"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb",
-    "tarball": "http://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
-  },
-  "gitHead": "3890dceab3ad14f8701e38ca74f38276abc76de5",
-  "homepage": "https://github.com/isaacs/json-stringify-safe",
-  "keywords": [
-    "circular",
-    "json",
-    "safe",
-    "stringify"
-  ],
-  "license": "ISC",
-  "main": "stringify.js",
-  "maintainers": [
-    {
-      "name": "isaacs",
-      "email": "i@izs.me"
-    },
-    {
-      "name": "moll",
-      "email": "andri@dot.ee"
-    }
-  ],
-  "name": "json-stringify-safe",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/json-stringify-safe.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "5.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/stringify.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/stringify.js
deleted file mode 100644
index 124a452181a4e2e87321b6600ab2129f182d262c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/stringify.js
+++ /dev/null
@@ -1,27 +0,0 @@
-exports = module.exports = stringify
-exports.getSerialize = serializer
-
-function stringify(obj, replacer, spaces, cycleReplacer) {
-  return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces)
-}
-
-function serializer(replacer, cycleReplacer) {
-  var stack = [], keys = []
-
-  if (cycleReplacer == null) cycleReplacer = function(key, value) {
-    if (stack[0] === value) return "[Circular ~]"
-    return "[Circular ~." + keys.slice(0, stack.indexOf(value)).join(".") + "]"
-  }
-
-  return function(key, value) {
-    if (stack.length > 0) {
-      var thisPos = stack.indexOf(this)
-      ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)
-      ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)
-      if (~stack.indexOf(value)) value = cycleReplacer.call(this, key, value)
-    }
-    else stack.push(value)
-
-    return replacer == null ? value : replacer.call(this, key, value)
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/test/mocha.opts b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/test/mocha.opts
deleted file mode 100644
index 2544e5861e4ff9f75ace55c1e353916ad3a2146a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/test/mocha.opts
+++ /dev/null
@@ -1,2 +0,0 @@
---recursive
---require must
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/test/stringify_test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/test/stringify_test.js
deleted file mode 100644
index 5b3258317687c9b23af0e421b42dd7c54083372e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/json-stringify-safe/test/stringify_test.js
+++ /dev/null
@@ -1,246 +0,0 @@
-var Sinon = require("sinon")
-var stringify = require("..")
-function jsonify(obj) { return JSON.stringify(obj, null, 2) }
-
-describe("Stringify", function() {
-  it("must stringify circular objects", function() {
-    var obj = {name: "Alice"}
-    obj.self = obj
-    var json = stringify(obj, null, 2)
-    json.must.eql(jsonify({name: "Alice", self: "[Circular ~]"}))
-  })
-
-  it("must stringify circular objects with intermediaries", function() {
-    var obj = {name: "Alice"}
-    obj.identity = {self: obj}
-    var json = stringify(obj, null, 2)
-    json.must.eql(jsonify({name: "Alice", identity: {self: "[Circular ~]"}}))
-  })
-
-  it("must stringify circular objects deeper", function() {
-    var obj = {name: "Alice", child: {name: "Bob"}}
-    obj.child.self = obj.child
-
-    stringify(obj, null, 2).must.eql(jsonify({
-      name: "Alice",
-      child: {name: "Bob", self: "[Circular ~.child]"}
-    }))
-  })
-
-  it("must stringify circular objects deeper with intermediaries", function() {
-    var obj = {name: "Alice", child: {name: "Bob"}}
-    obj.child.identity = {self: obj.child}
-
-    stringify(obj, null, 2).must.eql(jsonify({
-      name: "Alice",
-      child: {name: "Bob", identity: {self: "[Circular ~.child]"}}
-    }))
-  })
-
-  it("must stringify circular objects in an array", function() {
-    var obj = {name: "Alice"}
-    obj.self = [obj, obj]
-
-    stringify(obj, null, 2).must.eql(jsonify({
-      name: "Alice", self: ["[Circular ~]", "[Circular ~]"]
-    }))
-  })
-
-  it("must stringify circular objects deeper in an array", function() {
-    var obj = {name: "Alice", children: [{name: "Bob"}, {name: "Eve"}]}
-    obj.children[0].self = obj.children[0]
-    obj.children[1].self = obj.children[1]
-
-    stringify(obj, null, 2).must.eql(jsonify({
-      name: "Alice",
-      children: [
-        {name: "Bob", self: "[Circular ~.children.0]"},
-        {name: "Eve", self: "[Circular ~.children.1]"}
-      ]
-    }))
-  })
-
-  it("must stringify circular arrays", function() {
-    var obj = []
-    obj.push(obj)
-    obj.push(obj)
-    var json = stringify(obj, null, 2)
-    json.must.eql(jsonify(["[Circular ~]", "[Circular ~]"]))
-  })
-
-  it("must stringify circular arrays with intermediaries", function() {
-    var obj = []
-    obj.push({name: "Alice", self: obj})
-    obj.push({name: "Bob", self: obj})
-
-    stringify(obj, null, 2).must.eql(jsonify([
-      {name: "Alice", self: "[Circular ~]"},
-      {name: "Bob", self: "[Circular ~]"}
-    ]))
-  })
-
-  it("must stringify repeated objects in objects", function() {
-    var obj = {}
-    var alice = {name: "Alice"}
-    obj.alice1 = alice
-    obj.alice2 = alice
-
-    stringify(obj, null, 2).must.eql(jsonify({
-      alice1: {name: "Alice"},
-      alice2: {name: "Alice"}
-    }))
-  })
-
-  it("must stringify repeated objects in arrays", function() {
-    var alice = {name: "Alice"}
-    var obj = [alice, alice]
-    var json = stringify(obj, null, 2)
-    json.must.eql(jsonify([{name: "Alice"}, {name: "Alice"}]))
-  })
-
-  it("must call given decycler and use its output", function() {
-    var obj = {}
-    obj.a = obj
-    obj.b = obj
-
-    var decycle = Sinon.spy(function() { return decycle.callCount })
-    var json = stringify(obj, null, 2, decycle)
-    json.must.eql(jsonify({a: 1, b: 2}, null, 2))
-
-    decycle.callCount.must.equal(2)
-    decycle.thisValues[0].must.equal(obj)
-    decycle.args[0][0].must.equal("a")
-    decycle.args[0][1].must.equal(obj)
-    decycle.thisValues[1].must.equal(obj)
-    decycle.args[1][0].must.equal("b")
-    decycle.args[1][1].must.equal(obj)
-  })
-
-  it("must call replacer and use its output", function() {
-    var obj = {name: "Alice", child: {name: "Bob"}}
-
-    var replacer = Sinon.spy(bangString)
-    var json = stringify(obj, replacer, 2)
-    json.must.eql(jsonify({name: "Alice!", child: {name: "Bob!"}}))
-
-    replacer.callCount.must.equal(4)
-    replacer.args[0][0].must.equal("")
-    replacer.args[0][1].must.equal(obj)
-    replacer.thisValues[1].must.equal(obj)
-    replacer.args[1][0].must.equal("name")
-    replacer.args[1][1].must.equal("Alice")
-    replacer.thisValues[2].must.equal(obj)
-    replacer.args[2][0].must.equal("child")
-    replacer.args[2][1].must.equal(obj.child)
-    replacer.thisValues[3].must.equal(obj.child)
-    replacer.args[3][0].must.equal("name")
-    replacer.args[3][1].must.equal("Bob")
-  })
-
-  it("must call replacer after describing circular references", function() {
-    var obj = {name: "Alice"}
-    obj.self = obj
-
-    var replacer = Sinon.spy(bangString)
-    var json = stringify(obj, replacer, 2)
-    json.must.eql(jsonify({name: "Alice!", self: "[Circular ~]!"}))
-
-    replacer.callCount.must.equal(3)
-    replacer.args[0][0].must.equal("")
-    replacer.args[0][1].must.equal(obj)
-    replacer.thisValues[1].must.equal(obj)
-    replacer.args[1][0].must.equal("name")
-    replacer.args[1][1].must.equal("Alice")
-    replacer.thisValues[2].must.equal(obj)
-    replacer.args[2][0].must.equal("self")
-    replacer.args[2][1].must.equal("[Circular ~]")
-  })
-
-  it("must call given decycler and use its output for nested objects",
-    function() {
-    var obj = {}
-    obj.a = obj
-    obj.b = {self: obj}
-
-    var decycle = Sinon.spy(function() { return decycle.callCount })
-    var json = stringify(obj, null, 2, decycle)
-    json.must.eql(jsonify({a: 1, b: {self: 2}}))
-
-    decycle.callCount.must.equal(2)
-    decycle.args[0][0].must.equal("a")
-    decycle.args[0][1].must.equal(obj)
-    decycle.args[1][0].must.equal("self")
-    decycle.args[1][1].must.equal(obj)
-  })
-
-  it("must use decycler's output when it returned null", function() {
-    var obj = {a: "b"}
-    obj.self = obj
-    obj.selves = [obj, obj]
-
-    function decycle() { return null }
-    stringify(obj, null, 2, decycle).must.eql(jsonify({
-      a: "b",
-      self: null,
-      selves: [null, null]
-    }))
-  })
-
-  it("must use decycler's output when it returned undefined", function() {
-    var obj = {a: "b"}
-    obj.self = obj
-    obj.selves = [obj, obj]
-
-    function decycle() {}
-    stringify(obj, null, 2, decycle).must.eql(jsonify({
-      a: "b",
-      selves: [null, null]
-    }))
-  })
-
-  it("must throw given a decycler that returns a cycle", function() {
-    var obj = {}
-    obj.self = obj
-    var err
-    function identity(key, value) { return value }
-    try { stringify(obj, null, 2, identity) } catch (ex) { err = ex }
-    err.must.be.an.instanceof(TypeError)
-  })
-
-  describe(".getSerialize", function() {
-    it("must stringify circular objects", function() {
-      var obj = {a: "b"}
-      obj.circularRef = obj
-      obj.list = [obj, obj]
-
-      var json = JSON.stringify(obj, stringify.getSerialize(), 2)
-      json.must.eql(jsonify({
-        "a": "b",
-        "circularRef": "[Circular ~]",
-        "list": ["[Circular ~]", "[Circular ~]"]
-      }))
-    })
-
-    // This is the behavior as of Mar 3, 2015.
-    // The serializer function keeps state inside the returned function and
-    // so far I'm not sure how to not do that. JSON.stringify's replacer is not
-    // called _after_ serialization.
-    xit("must return a function that could be called twice", function() {
-      var obj = {name: "Alice"}
-      obj.self = obj
-
-      var json
-      var serializer = stringify.getSerialize()
-
-      json = JSON.stringify(obj, serializer, 2)
-      json.must.eql(jsonify({name: "Alice", self: "[Circular ~]"}))
-
-      json = JSON.stringify(obj, serializer, 2)
-      json.must.eql(jsonify({name: "Alice", self: "[Circular ~]"}))
-    })
-  })
-})
-
-function bangString(key, value) {
-  return typeof value == "string" ? value + "!" : value
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/HISTORY.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/HISTORY.md
deleted file mode 100644
index 63bd4ea0b40ce463a136a1cb432ca7dc08e4f22c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/HISTORY.md
+++ /dev/null
@@ -1,197 +0,0 @@
-2.1.11 / 2016-05-01
-===================
-
-  * deps: mime-db@~1.23.0
-    - Add new mime types
-
-2.1.10 / 2016-02-15
-===================
-
-  * deps: mime-db@~1.22.0
-    - Add new mime types
-    - Fix extension of `application/dash+xml`
-    - Update primary extension for `audio/mp4`
-
-2.1.9 / 2016-01-06
-==================
-
-  * deps: mime-db@~1.21.0
-    - Add new mime types
-
-2.1.8 / 2015-11-30
-==================
-
-  * deps: mime-db@~1.20.0
-    - Add new mime types
-
-2.1.7 / 2015-09-20
-==================
-
-  * deps: mime-db@~1.19.0
-    - Add new mime types
-
-2.1.6 / 2015-09-03
-==================
-
-  * deps: mime-db@~1.18.0
-    - Add new mime types
-
-2.1.5 / 2015-08-20
-==================
-
-  * deps: mime-db@~1.17.0
-    - Add new mime types
-
-2.1.4 / 2015-07-30
-==================
-
-  * deps: mime-db@~1.16.0
-    - Add new mime types
-
-2.1.3 / 2015-07-13
-==================
-
-  * deps: mime-db@~1.15.0
-    - Add new mime types
-
-2.1.2 / 2015-06-25
-==================
-
-  * deps: mime-db@~1.14.0
-    - Add new mime types
-
-2.1.1 / 2015-06-08
-==================
-
-  * perf: fix deopt during mapping
-
-2.1.0 / 2015-06-07
-==================
-
-  * Fix incorrectly treating extension-less file name as extension
-    - i.e. `'path/to/json'` will no longer return `application/json`
-  * Fix `.charset(type)` to accept parameters
-  * Fix `.charset(type)` to match case-insensitive
-  * Improve generation of extension to MIME mapping
-  * Refactor internals for readability and no argument reassignment
-  * Prefer `application/*` MIME types from the same source
-  * Prefer any type over `application/octet-stream`
-  * deps: mime-db@~1.13.0
-    - Add nginx as a source
-    - Add new mime types
-
-2.0.14 / 2015-06-06
-===================
-
-  * deps: mime-db@~1.12.0
-    - Add new mime types
-
-2.0.13 / 2015-05-31
-===================
-
-  * deps: mime-db@~1.11.0
-    - Add new mime types
-
-2.0.12 / 2015-05-19
-===================
-
-  * deps: mime-db@~1.10.0
-    - Add new mime types
-
-2.0.11 / 2015-05-05
-===================
-
-  * deps: mime-db@~1.9.1
-    - Add new mime types
-
-2.0.10 / 2015-03-13
-===================
-
-  * deps: mime-db@~1.8.0
-    - Add new mime types
-
-2.0.9 / 2015-02-09
-==================
-
-  * deps: mime-db@~1.7.0
-    - Add new mime types
-    - Community extensions ownership transferred from `node-mime`
-
-2.0.8 / 2015-01-29
-==================
-
-  * deps: mime-db@~1.6.0
-    - Add new mime types
-
-2.0.7 / 2014-12-30
-==================
-
-  * deps: mime-db@~1.5.0
-    - Add new mime types
-    - Fix various invalid MIME type entries
-
-2.0.6 / 2014-12-30
-==================
-
-  * deps: mime-db@~1.4.0
-    - Add new mime types
-    - Fix various invalid MIME type entries
-    - Remove example template MIME types
-
-2.0.5 / 2014-12-29
-==================
-
-  * deps: mime-db@~1.3.1
-    - Fix missing extensions
-
-2.0.4 / 2014-12-10
-==================
-
-  * deps: mime-db@~1.3.0
-    - Add new mime types
-
-2.0.3 / 2014-11-09
-==================
-
-  * deps: mime-db@~1.2.0
-    - Add new mime types
-
-2.0.2 / 2014-09-28
-==================
-
-  * deps: mime-db@~1.1.0
-    - Add new mime types
-    - Add additional compressible
-    - Update charsets
-
-2.0.1 / 2014-09-07
-==================
-
-  * Support Node.js 0.6
-
-2.0.0 / 2014-09-02
-==================
-
-  * Use `mime-db`
-  * Remove `.define()`
-
-1.0.2 / 2014-08-04
-==================
-
-  * Set charset=utf-8 for `text/javascript`
-
-1.0.1 / 2014-06-24
-==================
-
-  * Add `text/jsx` type
-
-1.0.0 / 2014-05-12
-==================
-
-  * Return `false` for unknown types
-  * Set charset=utf-8 for `application/json`
-
-0.1.0 / 2014-05-02
-==================
-
-  * Initial release
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/LICENSE
deleted file mode 100644
index 06166077be4d1f620d89b9eb33c76d89e75857da..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
-Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/README.md
deleted file mode 100644
index e77d615d3e6de0febc551b97714434a194a023ec..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/README.md
+++ /dev/null
@@ -1,103 +0,0 @@
-# mime-types
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![Build Status][travis-image]][travis-url]
-[![Test Coverage][coveralls-image]][coveralls-url]
-
-The ultimate javascript content-type utility.
-
-Similar to [node-mime](https://github.com/broofa/node-mime), except:
-
-- __No fallbacks.__ Instead of naively returning the first available type, `mime-types` simply returns `false`,
-  so do `var type = mime.lookup('unrecognized') || 'application/octet-stream'`.
-- No `new Mime()` business, so you could do `var lookup = require('mime-types').lookup`.
-- Additional mime types are added such as jade and stylus via [mime-db](https://github.com/jshttp/mime-db)
-- No `.define()` functionality
-
-Otherwise, the API is compatible.
-
-## Install
-
-```sh
-$ npm install mime-types
-```
-
-## Adding Types
-
-All mime types are based on [mime-db](https://github.com/jshttp/mime-db),
-so open a PR there if you'd like to add mime types.
-
-## API
-
-```js
-var mime = require('mime-types')
-```
-
-All functions return `false` if input is invalid or not found.
-
-### mime.lookup(path)
-
-Lookup the content-type associated with a file.
-
-```js
-mime.lookup('json')             // 'application/json'
-mime.lookup('.md')              // 'text/x-markdown'
-mime.lookup('file.html')        // 'text/html'
-mime.lookup('folder/file.js')   // 'application/javascript'
-mime.lookup('folder/.htaccess') // false
-
-mime.lookup('cats') // false
-```
-
-### mime.contentType(type)
-
-Create a full content-type header given a content-type or extension.
-
-```js
-mime.contentType('markdown')  // 'text/x-markdown; charset=utf-8'
-mime.contentType('file.json') // 'application/json; charset=utf-8'
-
-// from a full path
-mime.contentType(path.extname('/path/to/file.json')) // 'application/json; charset=utf-8'
-```
-
-### mime.extension(type)
-
-Get the default extension for a content-type.
-
-```js
-mime.extension('application/octet-stream') // 'bin'
-```
-
-### mime.charset(type)
-
-Lookup the implied default charset of a content-type.
-
-```js
-mime.charset('text/x-markdown') // 'UTF-8'
-```
-
-### var type = mime.types[extension]
-
-A map of content-types by extension.
-
-### [extensions...] = mime.extensions[type]
-
-A map of extensions by content-type.
-
-## License
-
-[MIT](LICENSE)
-
-[npm-image]: https://img.shields.io/npm/v/mime-types.svg
-[npm-url]: https://npmjs.org/package/mime-types
-[node-version-image]: https://img.shields.io/node/v/mime-types.svg
-[node-version-url]: https://nodejs.org/en/download/
-[travis-image]: https://img.shields.io/travis/jshttp/mime-types/master.svg
-[travis-url]: https://travis-ci.org/jshttp/mime-types
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-types/master.svg
-[coveralls-url]: https://coveralls.io/r/jshttp/mime-types
-[downloads-image]: https://img.shields.io/npm/dm/mime-types.svg
-[downloads-url]: https://npmjs.org/package/mime-types
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/index.js
deleted file mode 100644
index f7008b246d1e4c1d5e213081b58874bdba30408c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/index.js
+++ /dev/null
@@ -1,188 +0,0 @@
-/*!
- * mime-types
- * Copyright(c) 2014 Jonathan Ong
- * Copyright(c) 2015 Douglas Christopher Wilson
- * MIT Licensed
- */
-
-'use strict'
-
-/**
- * Module dependencies.
- * @private
- */
-
-var db = require('mime-db')
-var extname = require('path').extname
-
-/**
- * Module variables.
- * @private
- */
-
-var extractTypeRegExp = /^\s*([^;\s]*)(?:;|\s|$)/
-var textTypeRegExp = /^text\//i
-
-/**
- * Module exports.
- * @public
- */
-
-exports.charset = charset
-exports.charsets = { lookup: charset }
-exports.contentType = contentType
-exports.extension = extension
-exports.extensions = Object.create(null)
-exports.lookup = lookup
-exports.types = Object.create(null)
-
-// Populate the extensions/types maps
-populateMaps(exports.extensions, exports.types)
-
-/**
- * Get the default charset for a MIME type.
- *
- * @param {string} type
- * @return {boolean|string}
- */
-
-function charset(type) {
-  if (!type || typeof type !== 'string') {
-    return false
-  }
-
-  // TODO: use media-typer
-  var match = extractTypeRegExp.exec(type)
-  var mime = match && db[match[1].toLowerCase()]
-
-  if (mime && mime.charset) {
-    return mime.charset
-  }
-
-  // default text/* to utf-8
-  if (match && textTypeRegExp.test(match[1])) {
-    return 'UTF-8'
-  }
-
-  return false
-}
-
-/**
- * Create a full Content-Type header given a MIME type or extension.
- *
- * @param {string} str
- * @return {boolean|string}
- */
-
-function contentType(str) {
-  // TODO: should this even be in this module?
-  if (!str || typeof str !== 'string') {
-    return false
-  }
-
-  var mime = str.indexOf('/') === -1
-    ? exports.lookup(str)
-    : str
-
-  if (!mime) {
-    return false
-  }
-
-  // TODO: use content-type or other module
-  if (mime.indexOf('charset') === -1) {
-    var charset = exports.charset(mime)
-    if (charset) mime += '; charset=' + charset.toLowerCase()
-  }
-
-  return mime
-}
-
-/**
- * Get the default extension for a MIME type.
- *
- * @param {string} type
- * @return {boolean|string}
- */
-
-function extension(type) {
-  if (!type || typeof type !== 'string') {
-    return false
-  }
-
-  // TODO: use media-typer
-  var match = extractTypeRegExp.exec(type)
-
-  // get extensions
-  var exts = match && exports.extensions[match[1].toLowerCase()]
-
-  if (!exts || !exts.length) {
-    return false
-  }
-
-  return exts[0]
-}
-
-/**
- * Lookup the MIME type for a file path/extension.
- *
- * @param {string} path
- * @return {boolean|string}
- */
-
-function lookup(path) {
-  if (!path || typeof path !== 'string') {
-    return false
-  }
-
-  // get the extension ("ext" or ".ext" or full path)
-  var extension = extname('x.' + path)
-    .toLowerCase()
-    .substr(1)
-
-  if (!extension) {
-    return false
-  }
-
-  return exports.types[extension] || false
-}
-
-/**
- * Populate the extensions and types maps.
- * @private
- */
-
-function populateMaps(extensions, types) {
-  // source preference (least -> most)
-  var preference = ['nginx', 'apache', undefined, 'iana']
-
-  Object.keys(db).forEach(function forEachMimeType(type) {
-    var mime = db[type]
-    var exts = mime.extensions
-
-    if (!exts || !exts.length) {
-      return
-    }
-
-    // mime -> extensions
-    extensions[type] = exts
-
-    // extension -> mime
-    for (var i = 0; i < exts.length; i++) {
-      var extension = exts[i]
-
-      if (types[extension]) {
-        var from = preference.indexOf(db[types[extension]].source)
-        var to = preference.indexOf(mime.source)
-
-        if (types[extension] !== 'application/octet-stream'
-          && from > to || (from === to && types[extension].substr(0, 12) === 'application/')) {
-          // skip the remapping
-          continue
-        }
-      }
-
-      // set the extension -> mime
-      types[extension] = type
-    }
-  })
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md
deleted file mode 100644
index d6705ac86d114f7e43acb98857349a9f60a0914d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/HISTORY.md
+++ /dev/null
@@ -1,341 +0,0 @@
-1.23.0 / 2016-05-01
-===================
-
-  * Add `application/efi`
-  * Add `application/vnd.3gpp.sms+xml`
-  * Add `application/vnd.3lightssoftware.imagescal`
-  * Add `application/vnd.coreos.ignition+json`
-  * Add `application/vnd.desmume.movie`
-  * Add `application/vnd.onepager`
-  * Add `application/vnd.vel+json`
-  * Add `text/prs.prop.logic`
-  * Add `video/encaprtp`
-  * Add `video/h265`
-  * Add `video/iso.segment`
-  * Add `video/raptorfec`
-  * Add `video/rtploopback`
-  * Add `video/vnd.radgamettools.bink`
-  * Add `video/vnd.radgamettools.smacker`
-  * Add `video/vp8`
-  * Add extension `.3gpp` to `audio/3gpp`
-
-1.22.0 / 2016-02-15
-===================
-
-  * Add `application/ppsp-tracker+json`
-  * Add `application/problem+json`
-  * Add `application/problem+xml`
-  * Add `application/vnd.hdt`
-  * Add `application/vnd.ms-printschematicket+xml`
-  * Add `model/vnd.rosette.annotated-data-model`
-  * Add `text/slim`
-  * Add extension `.rng` to `application/xml`
-  * Fix extension of `application/dash+xml` to be `.mpd`
-  * Update primary extension to `.m4a` for `audio/mp4`
-
-1.21.0 / 2016-01-06
-===================
-
-  * Add `application/emergencycalldata.comment+xml`
-  * Add `application/emergencycalldata.deviceinfo+xml`
-  * Add `application/emergencycalldata.providerinfo+xml`
-  * Add `application/emergencycalldata.serviceinfo+xml`
-  * Add `application/emergencycalldata.subscriberinfo+xml`
-  * Add `application/vnd.filmit.zfc`
-  * Add `application/vnd.google-apps.document`
-  * Add `application/vnd.google-apps.presentation`
-  * Add `application/vnd.google-apps.spreadsheet`
-  * Add `application/vnd.mapbox-vector-tile`
-  * Add `application/vnd.ms-printdevicecapabilities+xml`
-  * Add `application/vnd.ms-windows.devicepairing`
-  * Add `application/vnd.ms-windows.nwprinting.oob`
-  * Add `application/vnd.tml`
-  * Add `audio/evs`
-
-1.20.0 / 2015-11-10
-===================
-
-  * Add `application/cdni`
-  * Add `application/csvm+json`
-  * Add `application/rfc+xml`
-  * Add `application/vnd.3gpp.access-transfer-events+xml`
-  * Add `application/vnd.3gpp.srvcc-ext+xml`
-  * Add `application/vnd.ms-windows.wsd.oob`
-  * Add `application/vnd.oxli.countgraph`
-  * Add `application/vnd.pagerduty+json`
-  * Add `text/x-suse-ymp`
-
-1.19.0 / 2015-09-17
-===================
-
-  * Add `application/vnd.3gpp-prose-pc3ch+xml`
-  * Add `application/vnd.3gpp.srvcc-info+xml`
-  * Add `application/vnd.apple.pkpass`
-  * Add `application/vnd.drive+json`
-
-1.18.0 / 2015-09-03
-===================
-
-  * Add `application/pkcs12`
-  * Add `application/vnd.3gpp-prose+xml`
-  * Add `application/vnd.3gpp.mid-call+xml`
-  * Add `application/vnd.3gpp.state-and-event-info+xml`
-  * Add `application/vnd.anki`
-  * Add `application/vnd.firemonkeys.cloudcell`
-  * Add `application/vnd.openblox.game+xml`
-  * Add `application/vnd.openblox.game-binary`
-
-1.17.0 / 2015-08-13
-===================
-
-  * Add `application/x-msdos-program`
-  * Add `audio/g711-0`
-  * Add `image/vnd.mozilla.apng`
-  * Add extension `.exe` to `application/x-msdos-program`
-
-1.16.0 / 2015-07-29
-===================
-
-  * Add `application/vnd.uri-map`
-
-1.15.0 / 2015-07-13
-===================
-
-  * Add `application/x-httpd-php`
-
-1.14.0 / 2015-06-25
-===================
-
-  * Add `application/scim+json`
-  * Add `application/vnd.3gpp.ussd+xml`
-  * Add `application/vnd.biopax.rdf+xml`
-  * Add `text/x-processing`
-
-1.13.0 / 2015-06-07
-===================
-
-  * Add nginx as a source
-  * Add `application/x-cocoa`
-  * Add `application/x-java-archive-diff`
-  * Add `application/x-makeself`
-  * Add `application/x-perl`
-  * Add `application/x-pilot`
-  * Add `application/x-redhat-package-manager`
-  * Add `application/x-sea`
-  * Add `audio/x-m4a`
-  * Add `audio/x-realaudio`
-  * Add `image/x-jng`
-  * Add `text/mathml`
-
-1.12.0 / 2015-06-05
-===================
-
-  * Add `application/bdoc`
-  * Add `application/vnd.hyperdrive+json`
-  * Add `application/x-bdoc`
-  * Add extension `.rtf` to `text/rtf`
-
-1.11.0 / 2015-05-31
-===================
-
-  * Add `audio/wav`
-  * Add `audio/wave`
-  * Add extension `.litcoffee` to `text/coffeescript`
-  * Add extension `.sfd-hdstx` to `application/vnd.hydrostatix.sof-data`
-  * Add extension `.n-gage` to `application/vnd.nokia.n-gage.symbian.install`
-
-1.10.0 / 2015-05-19
-===================
-
-  * Add `application/vnd.balsamiq.bmpr`
-  * Add `application/vnd.microsoft.portable-executable`
-  * Add `application/x-ns-proxy-autoconfig`
-
-1.9.1 / 2015-04-19
-==================
-
-  * Remove `.json` extension from `application/manifest+json`
-    - This is causing bugs downstream
-
-1.9.0 / 2015-04-19
-==================
-
-  * Add `application/manifest+json`
-  * Add `application/vnd.micro+json`
-  * Add `image/vnd.zbrush.pcx`
-  * Add `image/x-ms-bmp`
-
-1.8.0 / 2015-03-13
-==================
-
-  * Add `application/vnd.citationstyles.style+xml`
-  * Add `application/vnd.fastcopy-disk-image`
-  * Add `application/vnd.gov.sk.xmldatacontainer+xml`
-  * Add extension `.jsonld` to `application/ld+json`
-
-1.7.0 / 2015-02-08
-==================
-
-  * Add `application/vnd.gerber`
-  * Add `application/vnd.msa-disk-image`
-
-1.6.1 / 2015-02-05
-==================
-
-  * Community extensions ownership transferred from `node-mime`
-
-1.6.0 / 2015-01-29
-==================
-
-  * Add `application/jose`
-  * Add `application/jose+json`
-  * Add `application/json-seq`
-  * Add `application/jwk+json`
-  * Add `application/jwk-set+json`
-  * Add `application/jwt`
-  * Add `application/rdap+json`
-  * Add `application/vnd.gov.sk.e-form+xml`
-  * Add `application/vnd.ims.imsccv1p3`
-
-1.5.0 / 2014-12-30
-==================
-
-  * Add `application/vnd.oracle.resource+json`
-  * Fix various invalid MIME type entries
-    - `application/mbox+xml`
-    - `application/oscp-response`
-    - `application/vwg-multiplexed`
-    - `audio/g721`
-
-1.4.0 / 2014-12-21
-==================
-
-  * Add `application/vnd.ims.imsccv1p2`
-  * Fix various invalid MIME type entries
-    - `application/vnd-acucobol`
-    - `application/vnd-curl`
-    - `application/vnd-dart`
-    - `application/vnd-dxr`
-    - `application/vnd-fdf`
-    - `application/vnd-mif`
-    - `application/vnd-sema`
-    - `application/vnd-wap-wmlc`
-    - `application/vnd.adobe.flash-movie`
-    - `application/vnd.dece-zip`
-    - `application/vnd.dvb_service`
-    - `application/vnd.micrografx-igx`
-    - `application/vnd.sealed-doc`
-    - `application/vnd.sealed-eml`
-    - `application/vnd.sealed-mht`
-    - `application/vnd.sealed-ppt`
-    - `application/vnd.sealed-tiff`
-    - `application/vnd.sealed-xls`
-    - `application/vnd.sealedmedia.softseal-html`
-    - `application/vnd.sealedmedia.softseal-pdf`
-    - `application/vnd.wap-slc`
-    - `application/vnd.wap-wbxml`
-    - `audio/vnd.sealedmedia.softseal-mpeg`
-    - `image/vnd-djvu`
-    - `image/vnd-svf`
-    - `image/vnd-wap-wbmp`
-    - `image/vnd.sealed-png`
-    - `image/vnd.sealedmedia.softseal-gif`
-    - `image/vnd.sealedmedia.softseal-jpg`
-    - `model/vnd-dwf`
-    - `model/vnd.parasolid.transmit-binary`
-    - `model/vnd.parasolid.transmit-text`
-    - `text/vnd-a`
-    - `text/vnd-curl`
-    - `text/vnd.wap-wml`
-  * Remove example template MIME types
-    - `application/example`
-    - `audio/example`
-    - `image/example`
-    - `message/example`
-    - `model/example`
-    - `multipart/example`
-    - `text/example`
-    - `video/example`
-
-1.3.1 / 2014-12-16
-==================
-
-  * Fix missing extensions
-    - `application/json5`
-    - `text/hjson`
-
-1.3.0 / 2014-12-07
-==================
-
-  * Add `application/a2l`
-  * Add `application/aml`
-  * Add `application/atfx`
-  * Add `application/atxml`
-  * Add `application/cdfx+xml`
-  * Add `application/dii`
-  * Add `application/json5`
-  * Add `application/lxf`
-  * Add `application/mf4`
-  * Add `application/vnd.apache.thrift.compact`
-  * Add `application/vnd.apache.thrift.json`
-  * Add `application/vnd.coffeescript`
-  * Add `application/vnd.enphase.envoy`
-  * Add `application/vnd.ims.imsccv1p1`
-  * Add `text/csv-schema`
-  * Add `text/hjson`
-  * Add `text/markdown`
-  * Add `text/yaml`
-
-1.2.0 / 2014-11-09
-==================
-
-  * Add `application/cea`
-  * Add `application/dit`
-  * Add `application/vnd.gov.sk.e-form+zip`
-  * Add `application/vnd.tmd.mediaflex.api+xml`
-  * Type `application/epub+zip` is now IANA-registered
-
-1.1.2 / 2014-10-23
-==================
-
-  * Rebuild database for `application/x-www-form-urlencoded` change
-
-1.1.1 / 2014-10-20
-==================
-
-  * Mark `application/x-www-form-urlencoded` as compressible.
-
-1.1.0 / 2014-09-28
-==================
-
-  * Add `application/font-woff2`
-
-1.0.3 / 2014-09-25
-==================
-
-  * Fix engine requirement in package
-
-1.0.2 / 2014-09-25
-==================
-
-  * Add `application/coap-group+json`
-  * Add `application/dcd`
-  * Add `application/vnd.apache.thrift.binary`
-  * Add `image/vnd.tencent.tap`
-  * Mark all JSON-derived types as compressible
-  * Update `text/vtt` data
-
-1.0.1 / 2014-08-30
-==================
-
-  * Fix extension ordering
-
-1.0.0 / 2014-08-30
-==================
-
-  * Add `application/atf`
-  * Add `application/merge-patch+json`
-  * Add `multipart/x-mixed-replace`
-  * Add `source: 'apache'` metadata
-  * Add `source: 'iana'` metadata
-  * Remove badly-assumed charset data
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/LICENSE
deleted file mode 100644
index a7ae8ee9b8a30ef2a73ff5a7a80adc3b1a845cae..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-
-The MIT License (MIT)
-
-Copyright (c) 2014 Jonathan Ong me@jongleberry.com
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md
deleted file mode 100644
index 7662440bb9f9a277cba4e38e6da2d27b146fa9c4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/README.md
+++ /dev/null
@@ -1,82 +0,0 @@
-# mime-db
-
-[![NPM Version][npm-version-image]][npm-url]
-[![NPM Downloads][npm-downloads-image]][npm-url]
-[![Node.js Version][node-image]][node-url]
-[![Build Status][travis-image]][travis-url]
-[![Coverage Status][coveralls-image]][coveralls-url]
-
-This is a database of all mime types.
-It consists of a single, public JSON file and does not include any logic,
-allowing it to remain as un-opinionated as possible with an API.
-It aggregates data from the following sources:
-
-- http://www.iana.org/assignments/media-types/media-types.xhtml
-- http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
-- http://hg.nginx.org/nginx/raw-file/default/conf/mime.types
-
-## Installation
-
-```bash
-npm install mime-db
-```
-
-### Database Download
-
-If you're crazy enough to use this in the browser, you can just grab the
-JSON file using [RawGit](https://rawgit.com/). It is recommended to replace
-`master` with [a release tag](https://github.com/jshttp/mime-db/tags) as the
-JSON format may change in the future.
-
-```
-https://cdn.rawgit.com/jshttp/mime-db/master/db.json
-```
-
-## Usage
-
-```js
-var db = require('mime-db');
-
-// grab data on .js files
-var data = db['application/javascript'];
-```
-
-## Data Structure
-
-The JSON file is a map lookup for lowercased mime types.
-Each mime type has the following properties:
-
-- `.source` - where the mime type is defined.
-    If not set, it's probably a custom media type.
-    - `apache` - [Apache common media types](http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types)
-    - `iana` - [IANA-defined media types](http://www.iana.org/assignments/media-types/media-types.xhtml)
-    - `nginx` - [nginx media types](http://hg.nginx.org/nginx/raw-file/default/conf/mime.types)
-- `.extensions[]` - known extensions associated with this mime type.
-- `.compressible` - whether a file of this type can be gzipped.
-- `.charset` - the default charset associated with this type, if any.
-
-If unknown, every property could be `undefined`.
-
-## Contributing
-
-To edit the database, only make PRs against `src/custom.json` or
-`src/custom-suffix.json`.
-
-To update the build, run `npm run build`.
-
-## Adding Custom Media Types
-
-The best way to get new media types included in this library is to register
-them with the IANA. The community registration procedure is outlined in
-[RFC 6838 section 5](http://tools.ietf.org/html/rfc6838#section-5). Types
-registered with the IANA are automatically pulled into this library.
-
-[npm-version-image]: https://img.shields.io/npm/v/mime-db.svg
-[npm-downloads-image]: https://img.shields.io/npm/dm/mime-db.svg
-[npm-url]: https://npmjs.org/package/mime-db
-[travis-image]: https://img.shields.io/travis/jshttp/mime-db/master.svg
-[travis-url]: https://travis-ci.org/jshttp/mime-db
-[coveralls-image]: https://img.shields.io/coveralls/jshttp/mime-db/master.svg
-[coveralls-url]: https://coveralls.io/r/jshttp/mime-db?branch=master
-[node-image]: https://img.shields.io/node/v/mime-db.svg
-[node-url]: http://nodejs.org/download/
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json
deleted file mode 100644
index 0a5a8a7bba5574305c7e583385db13d11465aee2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/db.json
+++ /dev/null
@@ -1,6627 +0,0 @@
-{
-  "application/1d-interleaved-parityfec": {
-    "source": "iana"
-  },
-  "application/3gpdash-qoe-report+xml": {
-    "source": "iana"
-  },
-  "application/3gpp-ims+xml": {
-    "source": "iana"
-  },
-  "application/a2l": {
-    "source": "iana"
-  },
-  "application/activemessage": {
-    "source": "iana"
-  },
-  "application/alto-costmap+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-costmapfilter+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-directory+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-endpointcost+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-endpointcostparams+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-endpointprop+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-endpointpropparams+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-error+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-networkmap+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/alto-networkmapfilter+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/aml": {
-    "source": "iana"
-  },
-  "application/andrew-inset": {
-    "source": "iana",
-    "extensions": ["ez"]
-  },
-  "application/applefile": {
-    "source": "iana"
-  },
-  "application/applixware": {
-    "source": "apache",
-    "extensions": ["aw"]
-  },
-  "application/atf": {
-    "source": "iana"
-  },
-  "application/atfx": {
-    "source": "iana"
-  },
-  "application/atom+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["atom"]
-  },
-  "application/atomcat+xml": {
-    "source": "iana",
-    "extensions": ["atomcat"]
-  },
-  "application/atomdeleted+xml": {
-    "source": "iana"
-  },
-  "application/atomicmail": {
-    "source": "iana"
-  },
-  "application/atomsvc+xml": {
-    "source": "iana",
-    "extensions": ["atomsvc"]
-  },
-  "application/atxml": {
-    "source": "iana"
-  },
-  "application/auth-policy+xml": {
-    "source": "iana"
-  },
-  "application/bacnet-xdd+zip": {
-    "source": "iana"
-  },
-  "application/batch-smtp": {
-    "source": "iana"
-  },
-  "application/bdoc": {
-    "compressible": false,
-    "extensions": ["bdoc"]
-  },
-  "application/beep+xml": {
-    "source": "iana"
-  },
-  "application/calendar+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/calendar+xml": {
-    "source": "iana"
-  },
-  "application/call-completion": {
-    "source": "iana"
-  },
-  "application/cals-1840": {
-    "source": "iana"
-  },
-  "application/cbor": {
-    "source": "iana"
-  },
-  "application/ccmp+xml": {
-    "source": "iana"
-  },
-  "application/ccxml+xml": {
-    "source": "iana",
-    "extensions": ["ccxml"]
-  },
-  "application/cdfx+xml": {
-    "source": "iana"
-  },
-  "application/cdmi-capability": {
-    "source": "iana",
-    "extensions": ["cdmia"]
-  },
-  "application/cdmi-container": {
-    "source": "iana",
-    "extensions": ["cdmic"]
-  },
-  "application/cdmi-domain": {
-    "source": "iana",
-    "extensions": ["cdmid"]
-  },
-  "application/cdmi-object": {
-    "source": "iana",
-    "extensions": ["cdmio"]
-  },
-  "application/cdmi-queue": {
-    "source": "iana",
-    "extensions": ["cdmiq"]
-  },
-  "application/cdni": {
-    "source": "iana"
-  },
-  "application/cea": {
-    "source": "iana"
-  },
-  "application/cea-2018+xml": {
-    "source": "iana"
-  },
-  "application/cellml+xml": {
-    "source": "iana"
-  },
-  "application/cfw": {
-    "source": "iana"
-  },
-  "application/cms": {
-    "source": "iana"
-  },
-  "application/cnrp+xml": {
-    "source": "iana"
-  },
-  "application/coap-group+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/commonground": {
-    "source": "iana"
-  },
-  "application/conference-info+xml": {
-    "source": "iana"
-  },
-  "application/cpl+xml": {
-    "source": "iana"
-  },
-  "application/csrattrs": {
-    "source": "iana"
-  },
-  "application/csta+xml": {
-    "source": "iana"
-  },
-  "application/cstadata+xml": {
-    "source": "iana"
-  },
-  "application/csvm+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/cu-seeme": {
-    "source": "apache",
-    "extensions": ["cu"]
-  },
-  "application/cybercash": {
-    "source": "iana"
-  },
-  "application/dart": {
-    "compressible": true
-  },
-  "application/dash+xml": {
-    "source": "iana",
-    "extensions": ["mpd"]
-  },
-  "application/dashdelta": {
-    "source": "iana"
-  },
-  "application/davmount+xml": {
-    "source": "iana",
-    "extensions": ["davmount"]
-  },
-  "application/dca-rft": {
-    "source": "iana"
-  },
-  "application/dcd": {
-    "source": "iana"
-  },
-  "application/dec-dx": {
-    "source": "iana"
-  },
-  "application/dialog-info+xml": {
-    "source": "iana"
-  },
-  "application/dicom": {
-    "source": "iana"
-  },
-  "application/dii": {
-    "source": "iana"
-  },
-  "application/dit": {
-    "source": "iana"
-  },
-  "application/dns": {
-    "source": "iana"
-  },
-  "application/docbook+xml": {
-    "source": "apache",
-    "extensions": ["dbk"]
-  },
-  "application/dskpp+xml": {
-    "source": "iana"
-  },
-  "application/dssc+der": {
-    "source": "iana",
-    "extensions": ["dssc"]
-  },
-  "application/dssc+xml": {
-    "source": "iana",
-    "extensions": ["xdssc"]
-  },
-  "application/dvcs": {
-    "source": "iana"
-  },
-  "application/ecmascript": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["ecma"]
-  },
-  "application/edi-consent": {
-    "source": "iana"
-  },
-  "application/edi-x12": {
-    "source": "iana",
-    "compressible": false
-  },
-  "application/edifact": {
-    "source": "iana",
-    "compressible": false
-  },
-  "application/efi": {
-    "source": "iana"
-  },
-  "application/emergencycalldata.comment+xml": {
-    "source": "iana"
-  },
-  "application/emergencycalldata.deviceinfo+xml": {
-    "source": "iana"
-  },
-  "application/emergencycalldata.providerinfo+xml": {
-    "source": "iana"
-  },
-  "application/emergencycalldata.serviceinfo+xml": {
-    "source": "iana"
-  },
-  "application/emergencycalldata.subscriberinfo+xml": {
-    "source": "iana"
-  },
-  "application/emma+xml": {
-    "source": "iana",
-    "extensions": ["emma"]
-  },
-  "application/emotionml+xml": {
-    "source": "iana"
-  },
-  "application/encaprtp": {
-    "source": "iana"
-  },
-  "application/epp+xml": {
-    "source": "iana"
-  },
-  "application/epub+zip": {
-    "source": "iana",
-    "extensions": ["epub"]
-  },
-  "application/eshop": {
-    "source": "iana"
-  },
-  "application/exi": {
-    "source": "iana",
-    "extensions": ["exi"]
-  },
-  "application/fastinfoset": {
-    "source": "iana"
-  },
-  "application/fastsoap": {
-    "source": "iana"
-  },
-  "application/fdt+xml": {
-    "source": "iana"
-  },
-  "application/fits": {
-    "source": "iana"
-  },
-  "application/font-sfnt": {
-    "source": "iana"
-  },
-  "application/font-tdpfr": {
-    "source": "iana",
-    "extensions": ["pfr"]
-  },
-  "application/font-woff": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["woff"]
-  },
-  "application/font-woff2": {
-    "compressible": false,
-    "extensions": ["woff2"]
-  },
-  "application/framework-attributes+xml": {
-    "source": "iana"
-  },
-  "application/gml+xml": {
-    "source": "apache",
-    "extensions": ["gml"]
-  },
-  "application/gpx+xml": {
-    "source": "apache",
-    "extensions": ["gpx"]
-  },
-  "application/gxf": {
-    "source": "apache",
-    "extensions": ["gxf"]
-  },
-  "application/gzip": {
-    "source": "iana",
-    "compressible": false
-  },
-  "application/h224": {
-    "source": "iana"
-  },
-  "application/held+xml": {
-    "source": "iana"
-  },
-  "application/http": {
-    "source": "iana"
-  },
-  "application/hyperstudio": {
-    "source": "iana",
-    "extensions": ["stk"]
-  },
-  "application/ibe-key-request+xml": {
-    "source": "iana"
-  },
-  "application/ibe-pkg-reply+xml": {
-    "source": "iana"
-  },
-  "application/ibe-pp-data": {
-    "source": "iana"
-  },
-  "application/iges": {
-    "source": "iana"
-  },
-  "application/im-iscomposing+xml": {
-    "source": "iana"
-  },
-  "application/index": {
-    "source": "iana"
-  },
-  "application/index.cmd": {
-    "source": "iana"
-  },
-  "application/index.obj": {
-    "source": "iana"
-  },
-  "application/index.response": {
-    "source": "iana"
-  },
-  "application/index.vnd": {
-    "source": "iana"
-  },
-  "application/inkml+xml": {
-    "source": "iana",
-    "extensions": ["ink","inkml"]
-  },
-  "application/iotp": {
-    "source": "iana"
-  },
-  "application/ipfix": {
-    "source": "iana",
-    "extensions": ["ipfix"]
-  },
-  "application/ipp": {
-    "source": "iana"
-  },
-  "application/isup": {
-    "source": "iana"
-  },
-  "application/its+xml": {
-    "source": "iana"
-  },
-  "application/java-archive": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["jar","war","ear"]
-  },
-  "application/java-serialized-object": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["ser"]
-  },
-  "application/java-vm": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["class"]
-  },
-  "application/javascript": {
-    "source": "iana",
-    "charset": "UTF-8",
-    "compressible": true,
-    "extensions": ["js"]
-  },
-  "application/jose": {
-    "source": "iana"
-  },
-  "application/jose+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/jrd+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/json": {
-    "source": "iana",
-    "charset": "UTF-8",
-    "compressible": true,
-    "extensions": ["json","map"]
-  },
-  "application/json-patch+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/json-seq": {
-    "source": "iana"
-  },
-  "application/json5": {
-    "extensions": ["json5"]
-  },
-  "application/jsonml+json": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["jsonml"]
-  },
-  "application/jwk+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/jwk-set+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/jwt": {
-    "source": "iana"
-  },
-  "application/kpml-request+xml": {
-    "source": "iana"
-  },
-  "application/kpml-response+xml": {
-    "source": "iana"
-  },
-  "application/ld+json": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["jsonld"]
-  },
-  "application/link-format": {
-    "source": "iana"
-  },
-  "application/load-control+xml": {
-    "source": "iana"
-  },
-  "application/lost+xml": {
-    "source": "iana",
-    "extensions": ["lostxml"]
-  },
-  "application/lostsync+xml": {
-    "source": "iana"
-  },
-  "application/lxf": {
-    "source": "iana"
-  },
-  "application/mac-binhex40": {
-    "source": "iana",
-    "extensions": ["hqx"]
-  },
-  "application/mac-compactpro": {
-    "source": "apache",
-    "extensions": ["cpt"]
-  },
-  "application/macwriteii": {
-    "source": "iana"
-  },
-  "application/mads+xml": {
-    "source": "iana",
-    "extensions": ["mads"]
-  },
-  "application/manifest+json": {
-    "charset": "UTF-8",
-    "compressible": true,
-    "extensions": ["webmanifest"]
-  },
-  "application/marc": {
-    "source": "iana",
-    "extensions": ["mrc"]
-  },
-  "application/marcxml+xml": {
-    "source": "iana",
-    "extensions": ["mrcx"]
-  },
-  "application/mathematica": {
-    "source": "iana",
-    "extensions": ["ma","nb","mb"]
-  },
-  "application/mathml+xml": {
-    "source": "iana",
-    "extensions": ["mathml"]
-  },
-  "application/mathml-content+xml": {
-    "source": "iana"
-  },
-  "application/mathml-presentation+xml": {
-    "source": "iana"
-  },
-  "application/mbms-associated-procedure-description+xml": {
-    "source": "iana"
-  },
-  "application/mbms-deregister+xml": {
-    "source": "iana"
-  },
-  "application/mbms-envelope+xml": {
-    "source": "iana"
-  },
-  "application/mbms-msk+xml": {
-    "source": "iana"
-  },
-  "application/mbms-msk-response+xml": {
-    "source": "iana"
-  },
-  "application/mbms-protection-description+xml": {
-    "source": "iana"
-  },
-  "application/mbms-reception-report+xml": {
-    "source": "iana"
-  },
-  "application/mbms-register+xml": {
-    "source": "iana"
-  },
-  "application/mbms-register-response+xml": {
-    "source": "iana"
-  },
-  "application/mbms-schedule+xml": {
-    "source": "iana"
-  },
-  "application/mbms-user-service-description+xml": {
-    "source": "iana"
-  },
-  "application/mbox": {
-    "source": "iana",
-    "extensions": ["mbox"]
-  },
-  "application/media-policy-dataset+xml": {
-    "source": "iana"
-  },
-  "application/media_control+xml": {
-    "source": "iana"
-  },
-  "application/mediaservercontrol+xml": {
-    "source": "iana",
-    "extensions": ["mscml"]
-  },
-  "application/merge-patch+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/metalink+xml": {
-    "source": "apache",
-    "extensions": ["metalink"]
-  },
-  "application/metalink4+xml": {
-    "source": "iana",
-    "extensions": ["meta4"]
-  },
-  "application/mets+xml": {
-    "source": "iana",
-    "extensions": ["mets"]
-  },
-  "application/mf4": {
-    "source": "iana"
-  },
-  "application/mikey": {
-    "source": "iana"
-  },
-  "application/mods+xml": {
-    "source": "iana",
-    "extensions": ["mods"]
-  },
-  "application/moss-keys": {
-    "source": "iana"
-  },
-  "application/moss-signature": {
-    "source": "iana"
-  },
-  "application/mosskey-data": {
-    "source": "iana"
-  },
-  "application/mosskey-request": {
-    "source": "iana"
-  },
-  "application/mp21": {
-    "source": "iana",
-    "extensions": ["m21","mp21"]
-  },
-  "application/mp4": {
-    "source": "iana",
-    "extensions": ["mp4s","m4p"]
-  },
-  "application/mpeg4-generic": {
-    "source": "iana"
-  },
-  "application/mpeg4-iod": {
-    "source": "iana"
-  },
-  "application/mpeg4-iod-xmt": {
-    "source": "iana"
-  },
-  "application/mrb-consumer+xml": {
-    "source": "iana"
-  },
-  "application/mrb-publish+xml": {
-    "source": "iana"
-  },
-  "application/msc-ivr+xml": {
-    "source": "iana"
-  },
-  "application/msc-mixer+xml": {
-    "source": "iana"
-  },
-  "application/msword": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["doc","dot"]
-  },
-  "application/mxf": {
-    "source": "iana",
-    "extensions": ["mxf"]
-  },
-  "application/nasdata": {
-    "source": "iana"
-  },
-  "application/news-checkgroups": {
-    "source": "iana"
-  },
-  "application/news-groupinfo": {
-    "source": "iana"
-  },
-  "application/news-transmission": {
-    "source": "iana"
-  },
-  "application/nlsml+xml": {
-    "source": "iana"
-  },
-  "application/nss": {
-    "source": "iana"
-  },
-  "application/ocsp-request": {
-    "source": "iana"
-  },
-  "application/ocsp-response": {
-    "source": "iana"
-  },
-  "application/octet-stream": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]
-  },
-  "application/oda": {
-    "source": "iana",
-    "extensions": ["oda"]
-  },
-  "application/odx": {
-    "source": "iana"
-  },
-  "application/oebps-package+xml": {
-    "source": "iana",
-    "extensions": ["opf"]
-  },
-  "application/ogg": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["ogx"]
-  },
-  "application/omdoc+xml": {
-    "source": "apache",
-    "extensions": ["omdoc"]
-  },
-  "application/onenote": {
-    "source": "apache",
-    "extensions": ["onetoc","onetoc2","onetmp","onepkg"]
-  },
-  "application/oxps": {
-    "source": "iana",
-    "extensions": ["oxps"]
-  },
-  "application/p2p-overlay+xml": {
-    "source": "iana"
-  },
-  "application/parityfec": {
-    "source": "iana"
-  },
-  "application/patch-ops-error+xml": {
-    "source": "iana",
-    "extensions": ["xer"]
-  },
-  "application/pdf": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["pdf"]
-  },
-  "application/pdx": {
-    "source": "iana"
-  },
-  "application/pgp-encrypted": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["pgp"]
-  },
-  "application/pgp-keys": {
-    "source": "iana"
-  },
-  "application/pgp-signature": {
-    "source": "iana",
-    "extensions": ["asc","sig"]
-  },
-  "application/pics-rules": {
-    "source": "apache",
-    "extensions": ["prf"]
-  },
-  "application/pidf+xml": {
-    "source": "iana"
-  },
-  "application/pidf-diff+xml": {
-    "source": "iana"
-  },
-  "application/pkcs10": {
-    "source": "iana",
-    "extensions": ["p10"]
-  },
-  "application/pkcs12": {
-    "source": "iana"
-  },
-  "application/pkcs7-mime": {
-    "source": "iana",
-    "extensions": ["p7m","p7c"]
-  },
-  "application/pkcs7-signature": {
-    "source": "iana",
-    "extensions": ["p7s"]
-  },
-  "application/pkcs8": {
-    "source": "iana",
-    "extensions": ["p8"]
-  },
-  "application/pkix-attr-cert": {
-    "source": "iana",
-    "extensions": ["ac"]
-  },
-  "application/pkix-cert": {
-    "source": "iana",
-    "extensions": ["cer"]
-  },
-  "application/pkix-crl": {
-    "source": "iana",
-    "extensions": ["crl"]
-  },
-  "application/pkix-pkipath": {
-    "source": "iana",
-    "extensions": ["pkipath"]
-  },
-  "application/pkixcmp": {
-    "source": "iana",
-    "extensions": ["pki"]
-  },
-  "application/pls+xml": {
-    "source": "iana",
-    "extensions": ["pls"]
-  },
-  "application/poc-settings+xml": {
-    "source": "iana"
-  },
-  "application/postscript": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["ai","eps","ps"]
-  },
-  "application/ppsp-tracker+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/problem+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/problem+xml": {
-    "source": "iana"
-  },
-  "application/provenance+xml": {
-    "source": "iana"
-  },
-  "application/prs.alvestrand.titrax-sheet": {
-    "source": "iana"
-  },
-  "application/prs.cww": {
-    "source": "iana",
-    "extensions": ["cww"]
-  },
-  "application/prs.hpub+zip": {
-    "source": "iana"
-  },
-  "application/prs.nprend": {
-    "source": "iana"
-  },
-  "application/prs.plucker": {
-    "source": "iana"
-  },
-  "application/prs.rdf-xml-crypt": {
-    "source": "iana"
-  },
-  "application/prs.xsf+xml": {
-    "source": "iana"
-  },
-  "application/pskc+xml": {
-    "source": "iana",
-    "extensions": ["pskcxml"]
-  },
-  "application/qsig": {
-    "source": "iana"
-  },
-  "application/raptorfec": {
-    "source": "iana"
-  },
-  "application/rdap+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/rdf+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["rdf"]
-  },
-  "application/reginfo+xml": {
-    "source": "iana",
-    "extensions": ["rif"]
-  },
-  "application/relax-ng-compact-syntax": {
-    "source": "iana",
-    "extensions": ["rnc"]
-  },
-  "application/remote-printing": {
-    "source": "iana"
-  },
-  "application/reputon+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/resource-lists+xml": {
-    "source": "iana",
-    "extensions": ["rl"]
-  },
-  "application/resource-lists-diff+xml": {
-    "source": "iana",
-    "extensions": ["rld"]
-  },
-  "application/rfc+xml": {
-    "source": "iana"
-  },
-  "application/riscos": {
-    "source": "iana"
-  },
-  "application/rlmi+xml": {
-    "source": "iana"
-  },
-  "application/rls-services+xml": {
-    "source": "iana",
-    "extensions": ["rs"]
-  },
-  "application/rpki-ghostbusters": {
-    "source": "iana",
-    "extensions": ["gbr"]
-  },
-  "application/rpki-manifest": {
-    "source": "iana",
-    "extensions": ["mft"]
-  },
-  "application/rpki-roa": {
-    "source": "iana",
-    "extensions": ["roa"]
-  },
-  "application/rpki-updown": {
-    "source": "iana"
-  },
-  "application/rsd+xml": {
-    "source": "apache",
-    "extensions": ["rsd"]
-  },
-  "application/rss+xml": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["rss"]
-  },
-  "application/rtf": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["rtf"]
-  },
-  "application/rtploopback": {
-    "source": "iana"
-  },
-  "application/rtx": {
-    "source": "iana"
-  },
-  "application/samlassertion+xml": {
-    "source": "iana"
-  },
-  "application/samlmetadata+xml": {
-    "source": "iana"
-  },
-  "application/sbml+xml": {
-    "source": "iana",
-    "extensions": ["sbml"]
-  },
-  "application/scaip+xml": {
-    "source": "iana"
-  },
-  "application/scim+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/scvp-cv-request": {
-    "source": "iana",
-    "extensions": ["scq"]
-  },
-  "application/scvp-cv-response": {
-    "source": "iana",
-    "extensions": ["scs"]
-  },
-  "application/scvp-vp-request": {
-    "source": "iana",
-    "extensions": ["spq"]
-  },
-  "application/scvp-vp-response": {
-    "source": "iana",
-    "extensions": ["spp"]
-  },
-  "application/sdp": {
-    "source": "iana",
-    "extensions": ["sdp"]
-  },
-  "application/sep+xml": {
-    "source": "iana"
-  },
-  "application/sep-exi": {
-    "source": "iana"
-  },
-  "application/session-info": {
-    "source": "iana"
-  },
-  "application/set-payment": {
-    "source": "iana"
-  },
-  "application/set-payment-initiation": {
-    "source": "iana",
-    "extensions": ["setpay"]
-  },
-  "application/set-registration": {
-    "source": "iana"
-  },
-  "application/set-registration-initiation": {
-    "source": "iana",
-    "extensions": ["setreg"]
-  },
-  "application/sgml": {
-    "source": "iana"
-  },
-  "application/sgml-open-catalog": {
-    "source": "iana"
-  },
-  "application/shf+xml": {
-    "source": "iana",
-    "extensions": ["shf"]
-  },
-  "application/sieve": {
-    "source": "iana"
-  },
-  "application/simple-filter+xml": {
-    "source": "iana"
-  },
-  "application/simple-message-summary": {
-    "source": "iana"
-  },
-  "application/simplesymbolcontainer": {
-    "source": "iana"
-  },
-  "application/slate": {
-    "source": "iana"
-  },
-  "application/smil": {
-    "source": "iana"
-  },
-  "application/smil+xml": {
-    "source": "iana",
-    "extensions": ["smi","smil"]
-  },
-  "application/smpte336m": {
-    "source": "iana"
-  },
-  "application/soap+fastinfoset": {
-    "source": "iana"
-  },
-  "application/soap+xml": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/sparql-query": {
-    "source": "iana",
-    "extensions": ["rq"]
-  },
-  "application/sparql-results+xml": {
-    "source": "iana",
-    "extensions": ["srx"]
-  },
-  "application/spirits-event+xml": {
-    "source": "iana"
-  },
-  "application/sql": {
-    "source": "iana"
-  },
-  "application/srgs": {
-    "source": "iana",
-    "extensions": ["gram"]
-  },
-  "application/srgs+xml": {
-    "source": "iana",
-    "extensions": ["grxml"]
-  },
-  "application/sru+xml": {
-    "source": "iana",
-    "extensions": ["sru"]
-  },
-  "application/ssdl+xml": {
-    "source": "apache",
-    "extensions": ["ssdl"]
-  },
-  "application/ssml+xml": {
-    "source": "iana",
-    "extensions": ["ssml"]
-  },
-  "application/tamp-apex-update": {
-    "source": "iana"
-  },
-  "application/tamp-apex-update-confirm": {
-    "source": "iana"
-  },
-  "application/tamp-community-update": {
-    "source": "iana"
-  },
-  "application/tamp-community-update-confirm": {
-    "source": "iana"
-  },
-  "application/tamp-error": {
-    "source": "iana"
-  },
-  "application/tamp-sequence-adjust": {
-    "source": "iana"
-  },
-  "application/tamp-sequence-adjust-confirm": {
-    "source": "iana"
-  },
-  "application/tamp-status-query": {
-    "source": "iana"
-  },
-  "application/tamp-status-response": {
-    "source": "iana"
-  },
-  "application/tamp-update": {
-    "source": "iana"
-  },
-  "application/tamp-update-confirm": {
-    "source": "iana"
-  },
-  "application/tar": {
-    "compressible": true
-  },
-  "application/tei+xml": {
-    "source": "iana",
-    "extensions": ["tei","teicorpus"]
-  },
-  "application/thraud+xml": {
-    "source": "iana",
-    "extensions": ["tfi"]
-  },
-  "application/timestamp-query": {
-    "source": "iana"
-  },
-  "application/timestamp-reply": {
-    "source": "iana"
-  },
-  "application/timestamped-data": {
-    "source": "iana",
-    "extensions": ["tsd"]
-  },
-  "application/ttml+xml": {
-    "source": "iana"
-  },
-  "application/tve-trigger": {
-    "source": "iana"
-  },
-  "application/ulpfec": {
-    "source": "iana"
-  },
-  "application/urc-grpsheet+xml": {
-    "source": "iana"
-  },
-  "application/urc-ressheet+xml": {
-    "source": "iana"
-  },
-  "application/urc-targetdesc+xml": {
-    "source": "iana"
-  },
-  "application/urc-uisocketdesc+xml": {
-    "source": "iana"
-  },
-  "application/vcard+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vcard+xml": {
-    "source": "iana"
-  },
-  "application/vemmi": {
-    "source": "iana"
-  },
-  "application/vividence.scriptfile": {
-    "source": "apache"
-  },
-  "application/vnd.3gpp-prose+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp-prose-pc3ch+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp.access-transfer-events+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp.bsf+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp.mid-call+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp.pic-bw-large": {
-    "source": "iana",
-    "extensions": ["plb"]
-  },
-  "application/vnd.3gpp.pic-bw-small": {
-    "source": "iana",
-    "extensions": ["psb"]
-  },
-  "application/vnd.3gpp.pic-bw-var": {
-    "source": "iana",
-    "extensions": ["pvb"]
-  },
-  "application/vnd.3gpp.sms": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp.sms+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp.srvcc-ext+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp.srvcc-info+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp.state-and-event-info+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp.ussd+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp2.bcmcsinfo+xml": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp2.sms": {
-    "source": "iana"
-  },
-  "application/vnd.3gpp2.tcap": {
-    "source": "iana",
-    "extensions": ["tcap"]
-  },
-  "application/vnd.3lightssoftware.imagescal": {
-    "source": "iana"
-  },
-  "application/vnd.3m.post-it-notes": {
-    "source": "iana",
-    "extensions": ["pwn"]
-  },
-  "application/vnd.accpac.simply.aso": {
-    "source": "iana",
-    "extensions": ["aso"]
-  },
-  "application/vnd.accpac.simply.imp": {
-    "source": "iana",
-    "extensions": ["imp"]
-  },
-  "application/vnd.acucobol": {
-    "source": "iana",
-    "extensions": ["acu"]
-  },
-  "application/vnd.acucorp": {
-    "source": "iana",
-    "extensions": ["atc","acutc"]
-  },
-  "application/vnd.adobe.air-application-installer-package+zip": {
-    "source": "apache",
-    "extensions": ["air"]
-  },
-  "application/vnd.adobe.flash.movie": {
-    "source": "iana"
-  },
-  "application/vnd.adobe.formscentral.fcdt": {
-    "source": "iana",
-    "extensions": ["fcdt"]
-  },
-  "application/vnd.adobe.fxp": {
-    "source": "iana",
-    "extensions": ["fxp","fxpl"]
-  },
-  "application/vnd.adobe.partial-upload": {
-    "source": "iana"
-  },
-  "application/vnd.adobe.xdp+xml": {
-    "source": "iana",
-    "extensions": ["xdp"]
-  },
-  "application/vnd.adobe.xfdf": {
-    "source": "iana",
-    "extensions": ["xfdf"]
-  },
-  "application/vnd.aether.imp": {
-    "source": "iana"
-  },
-  "application/vnd.ah-barcode": {
-    "source": "iana"
-  },
-  "application/vnd.ahead.space": {
-    "source": "iana",
-    "extensions": ["ahead"]
-  },
-  "application/vnd.airzip.filesecure.azf": {
-    "source": "iana",
-    "extensions": ["azf"]
-  },
-  "application/vnd.airzip.filesecure.azs": {
-    "source": "iana",
-    "extensions": ["azs"]
-  },
-  "application/vnd.amazon.ebook": {
-    "source": "apache",
-    "extensions": ["azw"]
-  },
-  "application/vnd.americandynamics.acc": {
-    "source": "iana",
-    "extensions": ["acc"]
-  },
-  "application/vnd.amiga.ami": {
-    "source": "iana",
-    "extensions": ["ami"]
-  },
-  "application/vnd.amundsen.maze+xml": {
-    "source": "iana"
-  },
-  "application/vnd.android.package-archive": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["apk"]
-  },
-  "application/vnd.anki": {
-    "source": "iana"
-  },
-  "application/vnd.anser-web-certificate-issue-initiation": {
-    "source": "iana",
-    "extensions": ["cii"]
-  },
-  "application/vnd.anser-web-funds-transfer-initiation": {
-    "source": "apache",
-    "extensions": ["fti"]
-  },
-  "application/vnd.antix.game-component": {
-    "source": "iana",
-    "extensions": ["atx"]
-  },
-  "application/vnd.apache.thrift.binary": {
-    "source": "iana"
-  },
-  "application/vnd.apache.thrift.compact": {
-    "source": "iana"
-  },
-  "application/vnd.apache.thrift.json": {
-    "source": "iana"
-  },
-  "application/vnd.api+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.apple.installer+xml": {
-    "source": "iana",
-    "extensions": ["mpkg"]
-  },
-  "application/vnd.apple.mpegurl": {
-    "source": "iana",
-    "extensions": ["m3u8"]
-  },
-  "application/vnd.apple.pkpass": {
-    "compressible": false,
-    "extensions": ["pkpass"]
-  },
-  "application/vnd.arastra.swi": {
-    "source": "iana"
-  },
-  "application/vnd.aristanetworks.swi": {
-    "source": "iana",
-    "extensions": ["swi"]
-  },
-  "application/vnd.artsquare": {
-    "source": "iana"
-  },
-  "application/vnd.astraea-software.iota": {
-    "source": "iana",
-    "extensions": ["iota"]
-  },
-  "application/vnd.audiograph": {
-    "source": "iana",
-    "extensions": ["aep"]
-  },
-  "application/vnd.autopackage": {
-    "source": "iana"
-  },
-  "application/vnd.avistar+xml": {
-    "source": "iana"
-  },
-  "application/vnd.balsamiq.bmml+xml": {
-    "source": "iana"
-  },
-  "application/vnd.balsamiq.bmpr": {
-    "source": "iana"
-  },
-  "application/vnd.bekitzur-stech+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.biopax.rdf+xml": {
-    "source": "iana"
-  },
-  "application/vnd.blueice.multipass": {
-    "source": "iana",
-    "extensions": ["mpm"]
-  },
-  "application/vnd.bluetooth.ep.oob": {
-    "source": "iana"
-  },
-  "application/vnd.bluetooth.le.oob": {
-    "source": "iana"
-  },
-  "application/vnd.bmi": {
-    "source": "iana",
-    "extensions": ["bmi"]
-  },
-  "application/vnd.businessobjects": {
-    "source": "iana",
-    "extensions": ["rep"]
-  },
-  "application/vnd.cab-jscript": {
-    "source": "iana"
-  },
-  "application/vnd.canon-cpdl": {
-    "source": "iana"
-  },
-  "application/vnd.canon-lips": {
-    "source": "iana"
-  },
-  "application/vnd.cendio.thinlinc.clientconf": {
-    "source": "iana"
-  },
-  "application/vnd.century-systems.tcp_stream": {
-    "source": "iana"
-  },
-  "application/vnd.chemdraw+xml": {
-    "source": "iana",
-    "extensions": ["cdxml"]
-  },
-  "application/vnd.chipnuts.karaoke-mmd": {
-    "source": "iana",
-    "extensions": ["mmd"]
-  },
-  "application/vnd.cinderella": {
-    "source": "iana",
-    "extensions": ["cdy"]
-  },
-  "application/vnd.cirpack.isdn-ext": {
-    "source": "iana"
-  },
-  "application/vnd.citationstyles.style+xml": {
-    "source": "iana"
-  },
-  "application/vnd.claymore": {
-    "source": "iana",
-    "extensions": ["cla"]
-  },
-  "application/vnd.cloanto.rp9": {
-    "source": "iana",
-    "extensions": ["rp9"]
-  },
-  "application/vnd.clonk.c4group": {
-    "source": "iana",
-    "extensions": ["c4g","c4d","c4f","c4p","c4u"]
-  },
-  "application/vnd.cluetrust.cartomobile-config": {
-    "source": "iana",
-    "extensions": ["c11amc"]
-  },
-  "application/vnd.cluetrust.cartomobile-config-pkg": {
-    "source": "iana",
-    "extensions": ["c11amz"]
-  },
-  "application/vnd.coffeescript": {
-    "source": "iana"
-  },
-  "application/vnd.collection+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.collection.doc+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.collection.next+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.commerce-battelle": {
-    "source": "iana"
-  },
-  "application/vnd.commonspace": {
-    "source": "iana",
-    "extensions": ["csp"]
-  },
-  "application/vnd.contact.cmsg": {
-    "source": "iana",
-    "extensions": ["cdbcmsg"]
-  },
-  "application/vnd.coreos.ignition+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.cosmocaller": {
-    "source": "iana",
-    "extensions": ["cmc"]
-  },
-  "application/vnd.crick.clicker": {
-    "source": "iana",
-    "extensions": ["clkx"]
-  },
-  "application/vnd.crick.clicker.keyboard": {
-    "source": "iana",
-    "extensions": ["clkk"]
-  },
-  "application/vnd.crick.clicker.palette": {
-    "source": "iana",
-    "extensions": ["clkp"]
-  },
-  "application/vnd.crick.clicker.template": {
-    "source": "iana",
-    "extensions": ["clkt"]
-  },
-  "application/vnd.crick.clicker.wordbank": {
-    "source": "iana",
-    "extensions": ["clkw"]
-  },
-  "application/vnd.criticaltools.wbs+xml": {
-    "source": "iana",
-    "extensions": ["wbs"]
-  },
-  "application/vnd.ctc-posml": {
-    "source": "iana",
-    "extensions": ["pml"]
-  },
-  "application/vnd.ctct.ws+xml": {
-    "source": "iana"
-  },
-  "application/vnd.cups-pdf": {
-    "source": "iana"
-  },
-  "application/vnd.cups-postscript": {
-    "source": "iana"
-  },
-  "application/vnd.cups-ppd": {
-    "source": "iana",
-    "extensions": ["ppd"]
-  },
-  "application/vnd.cups-raster": {
-    "source": "iana"
-  },
-  "application/vnd.cups-raw": {
-    "source": "iana"
-  },
-  "application/vnd.curl": {
-    "source": "iana"
-  },
-  "application/vnd.curl.car": {
-    "source": "apache",
-    "extensions": ["car"]
-  },
-  "application/vnd.curl.pcurl": {
-    "source": "apache",
-    "extensions": ["pcurl"]
-  },
-  "application/vnd.cyan.dean.root+xml": {
-    "source": "iana"
-  },
-  "application/vnd.cybank": {
-    "source": "iana"
-  },
-  "application/vnd.dart": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["dart"]
-  },
-  "application/vnd.data-vision.rdz": {
-    "source": "iana",
-    "extensions": ["rdz"]
-  },
-  "application/vnd.debian.binary-package": {
-    "source": "iana"
-  },
-  "application/vnd.dece.data": {
-    "source": "iana",
-    "extensions": ["uvf","uvvf","uvd","uvvd"]
-  },
-  "application/vnd.dece.ttml+xml": {
-    "source": "iana",
-    "extensions": ["uvt","uvvt"]
-  },
-  "application/vnd.dece.unspecified": {
-    "source": "iana",
-    "extensions": ["uvx","uvvx"]
-  },
-  "application/vnd.dece.zip": {
-    "source": "iana",
-    "extensions": ["uvz","uvvz"]
-  },
-  "application/vnd.denovo.fcselayout-link": {
-    "source": "iana",
-    "extensions": ["fe_launch"]
-  },
-  "application/vnd.desmume-movie": {
-    "source": "iana"
-  },
-  "application/vnd.desmume.movie": {
-    "source": "apache"
-  },
-  "application/vnd.dir-bi.plate-dl-nosuffix": {
-    "source": "iana"
-  },
-  "application/vnd.dm.delegation+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dna": {
-    "source": "iana",
-    "extensions": ["dna"]
-  },
-  "application/vnd.document+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.dolby.mlp": {
-    "source": "apache",
-    "extensions": ["mlp"]
-  },
-  "application/vnd.dolby.mobile.1": {
-    "source": "iana"
-  },
-  "application/vnd.dolby.mobile.2": {
-    "source": "iana"
-  },
-  "application/vnd.doremir.scorecloud-binary-document": {
-    "source": "iana"
-  },
-  "application/vnd.dpgraph": {
-    "source": "iana",
-    "extensions": ["dpg"]
-  },
-  "application/vnd.dreamfactory": {
-    "source": "iana",
-    "extensions": ["dfac"]
-  },
-  "application/vnd.drive+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.ds-keypoint": {
-    "source": "apache",
-    "extensions": ["kpxx"]
-  },
-  "application/vnd.dtg.local": {
-    "source": "iana"
-  },
-  "application/vnd.dtg.local.flash": {
-    "source": "iana"
-  },
-  "application/vnd.dtg.local.html": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ait": {
-    "source": "iana",
-    "extensions": ["ait"]
-  },
-  "application/vnd.dvb.dvbj": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.esgcontainer": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ipdcdftnotifaccess": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ipdcesgaccess": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ipdcesgaccess2": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ipdcesgpdd": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.ipdcroaming": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.iptv.alfec-base": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.iptv.alfec-enhancement": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-aggregate-root+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-container+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-generic+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-ia-msglist+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-ia-registration-request+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-ia-registration-response+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.notif-init+xml": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.pfr": {
-    "source": "iana"
-  },
-  "application/vnd.dvb.service": {
-    "source": "iana",
-    "extensions": ["svc"]
-  },
-  "application/vnd.dxr": {
-    "source": "iana"
-  },
-  "application/vnd.dynageo": {
-    "source": "iana",
-    "extensions": ["geo"]
-  },
-  "application/vnd.dzr": {
-    "source": "iana"
-  },
-  "application/vnd.easykaraoke.cdgdownload": {
-    "source": "iana"
-  },
-  "application/vnd.ecdis-update": {
-    "source": "iana"
-  },
-  "application/vnd.ecowin.chart": {
-    "source": "iana",
-    "extensions": ["mag"]
-  },
-  "application/vnd.ecowin.filerequest": {
-    "source": "iana"
-  },
-  "application/vnd.ecowin.fileupdate": {
-    "source": "iana"
-  },
-  "application/vnd.ecowin.series": {
-    "source": "iana"
-  },
-  "application/vnd.ecowin.seriesrequest": {
-    "source": "iana"
-  },
-  "application/vnd.ecowin.seriesupdate": {
-    "source": "iana"
-  },
-  "application/vnd.emclient.accessrequest+xml": {
-    "source": "iana"
-  },
-  "application/vnd.enliven": {
-    "source": "iana",
-    "extensions": ["nml"]
-  },
-  "application/vnd.enphase.envoy": {
-    "source": "iana"
-  },
-  "application/vnd.eprints.data+xml": {
-    "source": "iana"
-  },
-  "application/vnd.epson.esf": {
-    "source": "iana",
-    "extensions": ["esf"]
-  },
-  "application/vnd.epson.msf": {
-    "source": "iana",
-    "extensions": ["msf"]
-  },
-  "application/vnd.epson.quickanime": {
-    "source": "iana",
-    "extensions": ["qam"]
-  },
-  "application/vnd.epson.salt": {
-    "source": "iana",
-    "extensions": ["slt"]
-  },
-  "application/vnd.epson.ssf": {
-    "source": "iana",
-    "extensions": ["ssf"]
-  },
-  "application/vnd.ericsson.quickcall": {
-    "source": "iana"
-  },
-  "application/vnd.eszigno3+xml": {
-    "source": "iana",
-    "extensions": ["es3","et3"]
-  },
-  "application/vnd.etsi.aoc+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.asic-e+zip": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.asic-s+zip": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.cug+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvcommand+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvdiscovery+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvprofile+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvsad-bc+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvsad-cod+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvsad-npvr+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvservice+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvsync+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.iptvueprofile+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.mcid+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.mheg5": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.overload-control-policy-dataset+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.pstn+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.sci+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.simservs+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.timestamp-token": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.tsl+xml": {
-    "source": "iana"
-  },
-  "application/vnd.etsi.tsl.der": {
-    "source": "iana"
-  },
-  "application/vnd.eudora.data": {
-    "source": "iana"
-  },
-  "application/vnd.ezpix-album": {
-    "source": "iana",
-    "extensions": ["ez2"]
-  },
-  "application/vnd.ezpix-package": {
-    "source": "iana",
-    "extensions": ["ez3"]
-  },
-  "application/vnd.f-secure.mobile": {
-    "source": "iana"
-  },
-  "application/vnd.fastcopy-disk-image": {
-    "source": "iana"
-  },
-  "application/vnd.fdf": {
-    "source": "iana",
-    "extensions": ["fdf"]
-  },
-  "application/vnd.fdsn.mseed": {
-    "source": "iana",
-    "extensions": ["mseed"]
-  },
-  "application/vnd.fdsn.seed": {
-    "source": "iana",
-    "extensions": ["seed","dataless"]
-  },
-  "application/vnd.ffsns": {
-    "source": "iana"
-  },
-  "application/vnd.filmit.zfc": {
-    "source": "iana"
-  },
-  "application/vnd.fints": {
-    "source": "iana"
-  },
-  "application/vnd.firemonkeys.cloudcell": {
-    "source": "iana"
-  },
-  "application/vnd.flographit": {
-    "source": "iana",
-    "extensions": ["gph"]
-  },
-  "application/vnd.fluxtime.clip": {
-    "source": "iana",
-    "extensions": ["ftc"]
-  },
-  "application/vnd.font-fontforge-sfd": {
-    "source": "iana"
-  },
-  "application/vnd.framemaker": {
-    "source": "iana",
-    "extensions": ["fm","frame","maker","book"]
-  },
-  "application/vnd.frogans.fnc": {
-    "source": "iana",
-    "extensions": ["fnc"]
-  },
-  "application/vnd.frogans.ltf": {
-    "source": "iana",
-    "extensions": ["ltf"]
-  },
-  "application/vnd.fsc.weblaunch": {
-    "source": "iana",
-    "extensions": ["fsc"]
-  },
-  "application/vnd.fujitsu.oasys": {
-    "source": "iana",
-    "extensions": ["oas"]
-  },
-  "application/vnd.fujitsu.oasys2": {
-    "source": "iana",
-    "extensions": ["oa2"]
-  },
-  "application/vnd.fujitsu.oasys3": {
-    "source": "iana",
-    "extensions": ["oa3"]
-  },
-  "application/vnd.fujitsu.oasysgp": {
-    "source": "iana",
-    "extensions": ["fg5"]
-  },
-  "application/vnd.fujitsu.oasysprs": {
-    "source": "iana",
-    "extensions": ["bh2"]
-  },
-  "application/vnd.fujixerox.art-ex": {
-    "source": "iana"
-  },
-  "application/vnd.fujixerox.art4": {
-    "source": "iana"
-  },
-  "application/vnd.fujixerox.ddd": {
-    "source": "iana",
-    "extensions": ["ddd"]
-  },
-  "application/vnd.fujixerox.docuworks": {
-    "source": "iana",
-    "extensions": ["xdw"]
-  },
-  "application/vnd.fujixerox.docuworks.binder": {
-    "source": "iana",
-    "extensions": ["xbd"]
-  },
-  "application/vnd.fujixerox.docuworks.container": {
-    "source": "iana"
-  },
-  "application/vnd.fujixerox.hbpl": {
-    "source": "iana"
-  },
-  "application/vnd.fut-misnet": {
-    "source": "iana"
-  },
-  "application/vnd.fuzzysheet": {
-    "source": "iana",
-    "extensions": ["fzs"]
-  },
-  "application/vnd.genomatix.tuxedo": {
-    "source": "iana",
-    "extensions": ["txd"]
-  },
-  "application/vnd.geo+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.geocube+xml": {
-    "source": "iana"
-  },
-  "application/vnd.geogebra.file": {
-    "source": "iana",
-    "extensions": ["ggb"]
-  },
-  "application/vnd.geogebra.tool": {
-    "source": "iana",
-    "extensions": ["ggt"]
-  },
-  "application/vnd.geometry-explorer": {
-    "source": "iana",
-    "extensions": ["gex","gre"]
-  },
-  "application/vnd.geonext": {
-    "source": "iana",
-    "extensions": ["gxt"]
-  },
-  "application/vnd.geoplan": {
-    "source": "iana",
-    "extensions": ["g2w"]
-  },
-  "application/vnd.geospace": {
-    "source": "iana",
-    "extensions": ["g3w"]
-  },
-  "application/vnd.gerber": {
-    "source": "iana"
-  },
-  "application/vnd.globalplatform.card-content-mgt": {
-    "source": "iana"
-  },
-  "application/vnd.globalplatform.card-content-mgt-response": {
-    "source": "iana"
-  },
-  "application/vnd.gmx": {
-    "source": "iana",
-    "extensions": ["gmx"]
-  },
-  "application/vnd.google-apps.document": {
-    "compressible": false,
-    "extensions": ["gdoc"]
-  },
-  "application/vnd.google-apps.presentation": {
-    "compressible": false,
-    "extensions": ["gslides"]
-  },
-  "application/vnd.google-apps.spreadsheet": {
-    "compressible": false,
-    "extensions": ["gsheet"]
-  },
-  "application/vnd.google-earth.kml+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["kml"]
-  },
-  "application/vnd.google-earth.kmz": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["kmz"]
-  },
-  "application/vnd.gov.sk.e-form+xml": {
-    "source": "iana"
-  },
-  "application/vnd.gov.sk.e-form+zip": {
-    "source": "iana"
-  },
-  "application/vnd.gov.sk.xmldatacontainer+xml": {
-    "source": "iana"
-  },
-  "application/vnd.grafeq": {
-    "source": "iana",
-    "extensions": ["gqf","gqs"]
-  },
-  "application/vnd.gridmp": {
-    "source": "iana"
-  },
-  "application/vnd.groove-account": {
-    "source": "iana",
-    "extensions": ["gac"]
-  },
-  "application/vnd.groove-help": {
-    "source": "iana",
-    "extensions": ["ghf"]
-  },
-  "application/vnd.groove-identity-message": {
-    "source": "iana",
-    "extensions": ["gim"]
-  },
-  "application/vnd.groove-injector": {
-    "source": "iana",
-    "extensions": ["grv"]
-  },
-  "application/vnd.groove-tool-message": {
-    "source": "iana",
-    "extensions": ["gtm"]
-  },
-  "application/vnd.groove-tool-template": {
-    "source": "iana",
-    "extensions": ["tpl"]
-  },
-  "application/vnd.groove-vcard": {
-    "source": "iana",
-    "extensions": ["vcg"]
-  },
-  "application/vnd.hal+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.hal+xml": {
-    "source": "iana",
-    "extensions": ["hal"]
-  },
-  "application/vnd.handheld-entertainment+xml": {
-    "source": "iana",
-    "extensions": ["zmm"]
-  },
-  "application/vnd.hbci": {
-    "source": "iana",
-    "extensions": ["hbci"]
-  },
-  "application/vnd.hcl-bireports": {
-    "source": "iana"
-  },
-  "application/vnd.hdt": {
-    "source": "iana"
-  },
-  "application/vnd.heroku+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.hhe.lesson-player": {
-    "source": "iana",
-    "extensions": ["les"]
-  },
-  "application/vnd.hp-hpgl": {
-    "source": "iana",
-    "extensions": ["hpgl"]
-  },
-  "application/vnd.hp-hpid": {
-    "source": "iana",
-    "extensions": ["hpid"]
-  },
-  "application/vnd.hp-hps": {
-    "source": "iana",
-    "extensions": ["hps"]
-  },
-  "application/vnd.hp-jlyt": {
-    "source": "iana",
-    "extensions": ["jlt"]
-  },
-  "application/vnd.hp-pcl": {
-    "source": "iana",
-    "extensions": ["pcl"]
-  },
-  "application/vnd.hp-pclxl": {
-    "source": "iana",
-    "extensions": ["pclxl"]
-  },
-  "application/vnd.httphone": {
-    "source": "iana"
-  },
-  "application/vnd.hydrostatix.sof-data": {
-    "source": "iana",
-    "extensions": ["sfd-hdstx"]
-  },
-  "application/vnd.hyperdrive+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.hzn-3d-crossword": {
-    "source": "iana"
-  },
-  "application/vnd.ibm.afplinedata": {
-    "source": "iana"
-  },
-  "application/vnd.ibm.electronic-media": {
-    "source": "iana"
-  },
-  "application/vnd.ibm.minipay": {
-    "source": "iana",
-    "extensions": ["mpy"]
-  },
-  "application/vnd.ibm.modcap": {
-    "source": "iana",
-    "extensions": ["afp","listafp","list3820"]
-  },
-  "application/vnd.ibm.rights-management": {
-    "source": "iana",
-    "extensions": ["irm"]
-  },
-  "application/vnd.ibm.secure-container": {
-    "source": "iana",
-    "extensions": ["sc"]
-  },
-  "application/vnd.iccprofile": {
-    "source": "iana",
-    "extensions": ["icc","icm"]
-  },
-  "application/vnd.ieee.1905": {
-    "source": "iana"
-  },
-  "application/vnd.igloader": {
-    "source": "iana",
-    "extensions": ["igl"]
-  },
-  "application/vnd.immervision-ivp": {
-    "source": "iana",
-    "extensions": ["ivp"]
-  },
-  "application/vnd.immervision-ivu": {
-    "source": "iana",
-    "extensions": ["ivu"]
-  },
-  "application/vnd.ims.imsccv1p1": {
-    "source": "iana"
-  },
-  "application/vnd.ims.imsccv1p2": {
-    "source": "iana"
-  },
-  "application/vnd.ims.imsccv1p3": {
-    "source": "iana"
-  },
-  "application/vnd.ims.lis.v2.result+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.ims.lti.v2.toolconsumerprofile+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.ims.lti.v2.toolproxy+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.ims.lti.v2.toolproxy.id+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.ims.lti.v2.toolsettings+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.ims.lti.v2.toolsettings.simple+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.informedcontrol.rms+xml": {
-    "source": "iana"
-  },
-  "application/vnd.informix-visionary": {
-    "source": "iana"
-  },
-  "application/vnd.infotech.project": {
-    "source": "iana"
-  },
-  "application/vnd.infotech.project+xml": {
-    "source": "iana"
-  },
-  "application/vnd.innopath.wamp.notification": {
-    "source": "iana"
-  },
-  "application/vnd.insors.igm": {
-    "source": "iana",
-    "extensions": ["igm"]
-  },
-  "application/vnd.intercon.formnet": {
-    "source": "iana",
-    "extensions": ["xpw","xpx"]
-  },
-  "application/vnd.intergeo": {
-    "source": "iana",
-    "extensions": ["i2g"]
-  },
-  "application/vnd.intertrust.digibox": {
-    "source": "iana"
-  },
-  "application/vnd.intertrust.nncp": {
-    "source": "iana"
-  },
-  "application/vnd.intu.qbo": {
-    "source": "iana",
-    "extensions": ["qbo"]
-  },
-  "application/vnd.intu.qfx": {
-    "source": "iana",
-    "extensions": ["qfx"]
-  },
-  "application/vnd.iptc.g2.catalogitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.conceptitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.knowledgeitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.newsitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.newsmessage+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.packageitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.iptc.g2.planningitem+xml": {
-    "source": "iana"
-  },
-  "application/vnd.ipunplugged.rcprofile": {
-    "source": "iana",
-    "extensions": ["rcprofile"]
-  },
-  "application/vnd.irepository.package+xml": {
-    "source": "iana",
-    "extensions": ["irp"]
-  },
-  "application/vnd.is-xpr": {
-    "source": "iana",
-    "extensions": ["xpr"]
-  },
-  "application/vnd.isac.fcs": {
-    "source": "iana",
-    "extensions": ["fcs"]
-  },
-  "application/vnd.jam": {
-    "source": "iana",
-    "extensions": ["jam"]
-  },
-  "application/vnd.japannet-directory-service": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-jpnstore-wakeup": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-payment-wakeup": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-registration": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-registration-wakeup": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-setstore-wakeup": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-verification": {
-    "source": "iana"
-  },
-  "application/vnd.japannet-verification-wakeup": {
-    "source": "iana"
-  },
-  "application/vnd.jcp.javame.midlet-rms": {
-    "source": "iana",
-    "extensions": ["rms"]
-  },
-  "application/vnd.jisp": {
-    "source": "iana",
-    "extensions": ["jisp"]
-  },
-  "application/vnd.joost.joda-archive": {
-    "source": "iana",
-    "extensions": ["joda"]
-  },
-  "application/vnd.jsk.isdn-ngn": {
-    "source": "iana"
-  },
-  "application/vnd.kahootz": {
-    "source": "iana",
-    "extensions": ["ktz","ktr"]
-  },
-  "application/vnd.kde.karbon": {
-    "source": "iana",
-    "extensions": ["karbon"]
-  },
-  "application/vnd.kde.kchart": {
-    "source": "iana",
-    "extensions": ["chrt"]
-  },
-  "application/vnd.kde.kformula": {
-    "source": "iana",
-    "extensions": ["kfo"]
-  },
-  "application/vnd.kde.kivio": {
-    "source": "iana",
-    "extensions": ["flw"]
-  },
-  "application/vnd.kde.kontour": {
-    "source": "iana",
-    "extensions": ["kon"]
-  },
-  "application/vnd.kde.kpresenter": {
-    "source": "iana",
-    "extensions": ["kpr","kpt"]
-  },
-  "application/vnd.kde.kspread": {
-    "source": "iana",
-    "extensions": ["ksp"]
-  },
-  "application/vnd.kde.kword": {
-    "source": "iana",
-    "extensions": ["kwd","kwt"]
-  },
-  "application/vnd.kenameaapp": {
-    "source": "iana",
-    "extensions": ["htke"]
-  },
-  "application/vnd.kidspiration": {
-    "source": "iana",
-    "extensions": ["kia"]
-  },
-  "application/vnd.kinar": {
-    "source": "iana",
-    "extensions": ["kne","knp"]
-  },
-  "application/vnd.koan": {
-    "source": "iana",
-    "extensions": ["skp","skd","skt","skm"]
-  },
-  "application/vnd.kodak-descriptor": {
-    "source": "iana",
-    "extensions": ["sse"]
-  },
-  "application/vnd.las.las+xml": {
-    "source": "iana",
-    "extensions": ["lasxml"]
-  },
-  "application/vnd.liberty-request+xml": {
-    "source": "iana"
-  },
-  "application/vnd.llamagraphics.life-balance.desktop": {
-    "source": "iana",
-    "extensions": ["lbd"]
-  },
-  "application/vnd.llamagraphics.life-balance.exchange+xml": {
-    "source": "iana",
-    "extensions": ["lbe"]
-  },
-  "application/vnd.lotus-1-2-3": {
-    "source": "iana",
-    "extensions": ["123"]
-  },
-  "application/vnd.lotus-approach": {
-    "source": "iana",
-    "extensions": ["apr"]
-  },
-  "application/vnd.lotus-freelance": {
-    "source": "iana",
-    "extensions": ["pre"]
-  },
-  "application/vnd.lotus-notes": {
-    "source": "iana",
-    "extensions": ["nsf"]
-  },
-  "application/vnd.lotus-organizer": {
-    "source": "iana",
-    "extensions": ["org"]
-  },
-  "application/vnd.lotus-screencam": {
-    "source": "iana",
-    "extensions": ["scm"]
-  },
-  "application/vnd.lotus-wordpro": {
-    "source": "iana",
-    "extensions": ["lwp"]
-  },
-  "application/vnd.macports.portpkg": {
-    "source": "iana",
-    "extensions": ["portpkg"]
-  },
-  "application/vnd.mapbox-vector-tile": {
-    "source": "iana"
-  },
-  "application/vnd.marlin.drm.actiontoken+xml": {
-    "source": "iana"
-  },
-  "application/vnd.marlin.drm.conftoken+xml": {
-    "source": "iana"
-  },
-  "application/vnd.marlin.drm.license+xml": {
-    "source": "iana"
-  },
-  "application/vnd.marlin.drm.mdcf": {
-    "source": "iana"
-  },
-  "application/vnd.mason+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.maxmind.maxmind-db": {
-    "source": "iana"
-  },
-  "application/vnd.mcd": {
-    "source": "iana",
-    "extensions": ["mcd"]
-  },
-  "application/vnd.medcalcdata": {
-    "source": "iana",
-    "extensions": ["mc1"]
-  },
-  "application/vnd.mediastation.cdkey": {
-    "source": "iana",
-    "extensions": ["cdkey"]
-  },
-  "application/vnd.meridian-slingshot": {
-    "source": "iana"
-  },
-  "application/vnd.mfer": {
-    "source": "iana",
-    "extensions": ["mwf"]
-  },
-  "application/vnd.mfmp": {
-    "source": "iana",
-    "extensions": ["mfm"]
-  },
-  "application/vnd.micro+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.micrografx.flo": {
-    "source": "iana",
-    "extensions": ["flo"]
-  },
-  "application/vnd.micrografx.igx": {
-    "source": "iana",
-    "extensions": ["igx"]
-  },
-  "application/vnd.microsoft.portable-executable": {
-    "source": "iana"
-  },
-  "application/vnd.miele+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.mif": {
-    "source": "iana",
-    "extensions": ["mif"]
-  },
-  "application/vnd.minisoft-hp3000-save": {
-    "source": "iana"
-  },
-  "application/vnd.mitsubishi.misty-guard.trustweb": {
-    "source": "iana"
-  },
-  "application/vnd.mobius.daf": {
-    "source": "iana",
-    "extensions": ["daf"]
-  },
-  "application/vnd.mobius.dis": {
-    "source": "iana",
-    "extensions": ["dis"]
-  },
-  "application/vnd.mobius.mbk": {
-    "source": "iana",
-    "extensions": ["mbk"]
-  },
-  "application/vnd.mobius.mqy": {
-    "source": "iana",
-    "extensions": ["mqy"]
-  },
-  "application/vnd.mobius.msl": {
-    "source": "iana",
-    "extensions": ["msl"]
-  },
-  "application/vnd.mobius.plc": {
-    "source": "iana",
-    "extensions": ["plc"]
-  },
-  "application/vnd.mobius.txf": {
-    "source": "iana",
-    "extensions": ["txf"]
-  },
-  "application/vnd.mophun.application": {
-    "source": "iana",
-    "extensions": ["mpn"]
-  },
-  "application/vnd.mophun.certificate": {
-    "source": "iana",
-    "extensions": ["mpc"]
-  },
-  "application/vnd.motorola.flexsuite": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.adsi": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.fis": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.gotap": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.kmr": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.ttc": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.flexsuite.wem": {
-    "source": "iana"
-  },
-  "application/vnd.motorola.iprm": {
-    "source": "iana"
-  },
-  "application/vnd.mozilla.xul+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["xul"]
-  },
-  "application/vnd.ms-3mfdocument": {
-    "source": "iana"
-  },
-  "application/vnd.ms-artgalry": {
-    "source": "iana",
-    "extensions": ["cil"]
-  },
-  "application/vnd.ms-asf": {
-    "source": "iana"
-  },
-  "application/vnd.ms-cab-compressed": {
-    "source": "iana",
-    "extensions": ["cab"]
-  },
-  "application/vnd.ms-color.iccprofile": {
-    "source": "apache"
-  },
-  "application/vnd.ms-excel": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["xls","xlm","xla","xlc","xlt","xlw"]
-  },
-  "application/vnd.ms-excel.addin.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["xlam"]
-  },
-  "application/vnd.ms-excel.sheet.binary.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["xlsb"]
-  },
-  "application/vnd.ms-excel.sheet.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["xlsm"]
-  },
-  "application/vnd.ms-excel.template.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["xltm"]
-  },
-  "application/vnd.ms-fontobject": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["eot"]
-  },
-  "application/vnd.ms-htmlhelp": {
-    "source": "iana",
-    "extensions": ["chm"]
-  },
-  "application/vnd.ms-ims": {
-    "source": "iana",
-    "extensions": ["ims"]
-  },
-  "application/vnd.ms-lrm": {
-    "source": "iana",
-    "extensions": ["lrm"]
-  },
-  "application/vnd.ms-office.activex+xml": {
-    "source": "iana"
-  },
-  "application/vnd.ms-officetheme": {
-    "source": "iana",
-    "extensions": ["thmx"]
-  },
-  "application/vnd.ms-opentype": {
-    "source": "apache",
-    "compressible": true
-  },
-  "application/vnd.ms-package.obfuscated-opentype": {
-    "source": "apache"
-  },
-  "application/vnd.ms-pki.seccat": {
-    "source": "apache",
-    "extensions": ["cat"]
-  },
-  "application/vnd.ms-pki.stl": {
-    "source": "apache",
-    "extensions": ["stl"]
-  },
-  "application/vnd.ms-playready.initiator+xml": {
-    "source": "iana"
-  },
-  "application/vnd.ms-powerpoint": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["ppt","pps","pot"]
-  },
-  "application/vnd.ms-powerpoint.addin.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["ppam"]
-  },
-  "application/vnd.ms-powerpoint.presentation.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["pptm"]
-  },
-  "application/vnd.ms-powerpoint.slide.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["sldm"]
-  },
-  "application/vnd.ms-powerpoint.slideshow.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["ppsm"]
-  },
-  "application/vnd.ms-powerpoint.template.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["potm"]
-  },
-  "application/vnd.ms-printdevicecapabilities+xml": {
-    "source": "iana"
-  },
-  "application/vnd.ms-printing.printticket+xml": {
-    "source": "apache"
-  },
-  "application/vnd.ms-printschematicket+xml": {
-    "source": "iana"
-  },
-  "application/vnd.ms-project": {
-    "source": "iana",
-    "extensions": ["mpp","mpt"]
-  },
-  "application/vnd.ms-tnef": {
-    "source": "iana"
-  },
-  "application/vnd.ms-windows.devicepairing": {
-    "source": "iana"
-  },
-  "application/vnd.ms-windows.nwprinting.oob": {
-    "source": "iana"
-  },
-  "application/vnd.ms-windows.printerpairing": {
-    "source": "iana"
-  },
-  "application/vnd.ms-windows.wsd.oob": {
-    "source": "iana"
-  },
-  "application/vnd.ms-wmdrm.lic-chlg-req": {
-    "source": "iana"
-  },
-  "application/vnd.ms-wmdrm.lic-resp": {
-    "source": "iana"
-  },
-  "application/vnd.ms-wmdrm.meter-chlg-req": {
-    "source": "iana"
-  },
-  "application/vnd.ms-wmdrm.meter-resp": {
-    "source": "iana"
-  },
-  "application/vnd.ms-word.document.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["docm"]
-  },
-  "application/vnd.ms-word.template.macroenabled.12": {
-    "source": "iana",
-    "extensions": ["dotm"]
-  },
-  "application/vnd.ms-works": {
-    "source": "iana",
-    "extensions": ["wps","wks","wcm","wdb"]
-  },
-  "application/vnd.ms-wpl": {
-    "source": "iana",
-    "extensions": ["wpl"]
-  },
-  "application/vnd.ms-xpsdocument": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["xps"]
-  },
-  "application/vnd.msa-disk-image": {
-    "source": "iana"
-  },
-  "application/vnd.mseq": {
-    "source": "iana",
-    "extensions": ["mseq"]
-  },
-  "application/vnd.msign": {
-    "source": "iana"
-  },
-  "application/vnd.multiad.creator": {
-    "source": "iana"
-  },
-  "application/vnd.multiad.creator.cif": {
-    "source": "iana"
-  },
-  "application/vnd.music-niff": {
-    "source": "iana"
-  },
-  "application/vnd.musician": {
-    "source": "iana",
-    "extensions": ["mus"]
-  },
-  "application/vnd.muvee.style": {
-    "source": "iana",
-    "extensions": ["msty"]
-  },
-  "application/vnd.mynfc": {
-    "source": "iana",
-    "extensions": ["taglet"]
-  },
-  "application/vnd.ncd.control": {
-    "source": "iana"
-  },
-  "application/vnd.ncd.reference": {
-    "source": "iana"
-  },
-  "application/vnd.nervana": {
-    "source": "iana"
-  },
-  "application/vnd.netfpx": {
-    "source": "iana"
-  },
-  "application/vnd.neurolanguage.nlu": {
-    "source": "iana",
-    "extensions": ["nlu"]
-  },
-  "application/vnd.nintendo.nitro.rom": {
-    "source": "iana"
-  },
-  "application/vnd.nintendo.snes.rom": {
-    "source": "iana"
-  },
-  "application/vnd.nitf": {
-    "source": "iana",
-    "extensions": ["ntf","nitf"]
-  },
-  "application/vnd.noblenet-directory": {
-    "source": "iana",
-    "extensions": ["nnd"]
-  },
-  "application/vnd.noblenet-sealer": {
-    "source": "iana",
-    "extensions": ["nns"]
-  },
-  "application/vnd.noblenet-web": {
-    "source": "iana",
-    "extensions": ["nnw"]
-  },
-  "application/vnd.nokia.catalogs": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.conml+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.conml+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.iptv.config+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.isds-radio-presets": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.landmark+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.landmark+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.landmarkcollection+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.n-gage.ac+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.n-gage.data": {
-    "source": "iana",
-    "extensions": ["ngdat"]
-  },
-  "application/vnd.nokia.n-gage.symbian.install": {
-    "source": "iana",
-    "extensions": ["n-gage"]
-  },
-  "application/vnd.nokia.ncd": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.pcd+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.pcd+xml": {
-    "source": "iana"
-  },
-  "application/vnd.nokia.radio-preset": {
-    "source": "iana",
-    "extensions": ["rpst"]
-  },
-  "application/vnd.nokia.radio-presets": {
-    "source": "iana",
-    "extensions": ["rpss"]
-  },
-  "application/vnd.novadigm.edm": {
-    "source": "iana",
-    "extensions": ["edm"]
-  },
-  "application/vnd.novadigm.edx": {
-    "source": "iana",
-    "extensions": ["edx"]
-  },
-  "application/vnd.novadigm.ext": {
-    "source": "iana",
-    "extensions": ["ext"]
-  },
-  "application/vnd.ntt-local.content-share": {
-    "source": "iana"
-  },
-  "application/vnd.ntt-local.file-transfer": {
-    "source": "iana"
-  },
-  "application/vnd.ntt-local.ogw_remote-access": {
-    "source": "iana"
-  },
-  "application/vnd.ntt-local.sip-ta_remote": {
-    "source": "iana"
-  },
-  "application/vnd.ntt-local.sip-ta_tcp_stream": {
-    "source": "iana"
-  },
-  "application/vnd.oasis.opendocument.chart": {
-    "source": "iana",
-    "extensions": ["odc"]
-  },
-  "application/vnd.oasis.opendocument.chart-template": {
-    "source": "iana",
-    "extensions": ["otc"]
-  },
-  "application/vnd.oasis.opendocument.database": {
-    "source": "iana",
-    "extensions": ["odb"]
-  },
-  "application/vnd.oasis.opendocument.formula": {
-    "source": "iana",
-    "extensions": ["odf"]
-  },
-  "application/vnd.oasis.opendocument.formula-template": {
-    "source": "iana",
-    "extensions": ["odft"]
-  },
-  "application/vnd.oasis.opendocument.graphics": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["odg"]
-  },
-  "application/vnd.oasis.opendocument.graphics-template": {
-    "source": "iana",
-    "extensions": ["otg"]
-  },
-  "application/vnd.oasis.opendocument.image": {
-    "source": "iana",
-    "extensions": ["odi"]
-  },
-  "application/vnd.oasis.opendocument.image-template": {
-    "source": "iana",
-    "extensions": ["oti"]
-  },
-  "application/vnd.oasis.opendocument.presentation": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["odp"]
-  },
-  "application/vnd.oasis.opendocument.presentation-template": {
-    "source": "iana",
-    "extensions": ["otp"]
-  },
-  "application/vnd.oasis.opendocument.spreadsheet": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["ods"]
-  },
-  "application/vnd.oasis.opendocument.spreadsheet-template": {
-    "source": "iana",
-    "extensions": ["ots"]
-  },
-  "application/vnd.oasis.opendocument.text": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["odt"]
-  },
-  "application/vnd.oasis.opendocument.text-master": {
-    "source": "iana",
-    "extensions": ["odm"]
-  },
-  "application/vnd.oasis.opendocument.text-template": {
-    "source": "iana",
-    "extensions": ["ott"]
-  },
-  "application/vnd.oasis.opendocument.text-web": {
-    "source": "iana",
-    "extensions": ["oth"]
-  },
-  "application/vnd.obn": {
-    "source": "iana"
-  },
-  "application/vnd.oftn.l10n+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.oipf.contentaccessdownload+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.contentaccessstreaming+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.cspg-hexbinary": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.dae.svg+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.dae.xhtml+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.mippvcontrolmessage+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.pae.gem": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.spdiscovery+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.spdlist+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.ueprofile+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oipf.userprofile+xml": {
-    "source": "iana"
-  },
-  "application/vnd.olpc-sugar": {
-    "source": "iana",
-    "extensions": ["xo"]
-  },
-  "application/vnd.oma-scws-config": {
-    "source": "iana"
-  },
-  "application/vnd.oma-scws-http-request": {
-    "source": "iana"
-  },
-  "application/vnd.oma-scws-http-response": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.associated-procedure-parameter+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.drm-trigger+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.imd+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.ltkm": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.notification+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.provisioningtrigger": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.sgboot": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.sgdd+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.sgdu": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.simple-symbol-container": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.smartcard-trigger+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.sprov+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.bcast.stkm": {
-    "source": "iana"
-  },
-  "application/vnd.oma.cab-address-book+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.cab-feature-handler+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.cab-pcc+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.cab-subs-invite+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.cab-user-prefs+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.dcd": {
-    "source": "iana"
-  },
-  "application/vnd.oma.dcdc": {
-    "source": "iana"
-  },
-  "application/vnd.oma.dd2+xml": {
-    "source": "iana",
-    "extensions": ["dd2"]
-  },
-  "application/vnd.oma.drm.risd+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.group-usage-list+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.pal+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.poc.detailed-progress-report+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.poc.final-report+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.poc.groups+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.poc.invocation-descriptor+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.poc.optimized-progress-report+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.push": {
-    "source": "iana"
-  },
-  "application/vnd.oma.scidm.messages+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oma.xcap-directory+xml": {
-    "source": "iana"
-  },
-  "application/vnd.omads-email+xml": {
-    "source": "iana"
-  },
-  "application/vnd.omads-file+xml": {
-    "source": "iana"
-  },
-  "application/vnd.omads-folder+xml": {
-    "source": "iana"
-  },
-  "application/vnd.omaloc-supl-init": {
-    "source": "iana"
-  },
-  "application/vnd.onepager": {
-    "source": "iana"
-  },
-  "application/vnd.openblox.game+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openblox.game-binary": {
-    "source": "iana"
-  },
-  "application/vnd.openeye.oeb": {
-    "source": "iana"
-  },
-  "application/vnd.openofficeorg.extension": {
-    "source": "apache",
-    "extensions": ["oxt"]
-  },
-  "application/vnd.openxmlformats-officedocument.custom-properties+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.customxmlproperties+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawing+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.extended-properties+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml-template": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.comments+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.presentation": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["pptx"]
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.presprops+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slide": {
-    "source": "iana",
-    "extensions": ["sldx"]
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slide+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slideshow": {
-    "source": "iana",
-    "extensions": ["ppsx"]
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.tags+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.template": {
-    "source": "apache",
-    "extensions": ["potx"]
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.template.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml-template": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["xlsx"]
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.template": {
-    "source": "apache",
-    "extensions": ["xltx"]
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.theme+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.themeoverride+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.vmldrawing": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml-template": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.document": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["docx"]
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.template": {
-    "source": "apache",
-    "extensions": ["dotx"]
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-package.core-properties+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml": {
-    "source": "iana"
-  },
-  "application/vnd.openxmlformats-package.relationships+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oracle.resource+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.orange.indata": {
-    "source": "iana"
-  },
-  "application/vnd.osa.netdeploy": {
-    "source": "iana"
-  },
-  "application/vnd.osgeo.mapguide.package": {
-    "source": "iana",
-    "extensions": ["mgp"]
-  },
-  "application/vnd.osgi.bundle": {
-    "source": "iana"
-  },
-  "application/vnd.osgi.dp": {
-    "source": "iana",
-    "extensions": ["dp"]
-  },
-  "application/vnd.osgi.subsystem": {
-    "source": "iana",
-    "extensions": ["esa"]
-  },
-  "application/vnd.otps.ct-kip+xml": {
-    "source": "iana"
-  },
-  "application/vnd.oxli.countgraph": {
-    "source": "iana"
-  },
-  "application/vnd.pagerduty+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.palm": {
-    "source": "iana",
-    "extensions": ["pdb","pqa","oprc"]
-  },
-  "application/vnd.panoply": {
-    "source": "iana"
-  },
-  "application/vnd.paos+xml": {
-    "source": "iana"
-  },
-  "application/vnd.paos.xml": {
-    "source": "apache"
-  },
-  "application/vnd.pawaafile": {
-    "source": "iana",
-    "extensions": ["paw"]
-  },
-  "application/vnd.pcos": {
-    "source": "iana"
-  },
-  "application/vnd.pg.format": {
-    "source": "iana",
-    "extensions": ["str"]
-  },
-  "application/vnd.pg.osasli": {
-    "source": "iana",
-    "extensions": ["ei6"]
-  },
-  "application/vnd.piaccess.application-licence": {
-    "source": "iana"
-  },
-  "application/vnd.picsel": {
-    "source": "iana",
-    "extensions": ["efif"]
-  },
-  "application/vnd.pmi.widget": {
-    "source": "iana",
-    "extensions": ["wg"]
-  },
-  "application/vnd.poc.group-advertisement+xml": {
-    "source": "iana"
-  },
-  "application/vnd.pocketlearn": {
-    "source": "iana",
-    "extensions": ["plf"]
-  },
-  "application/vnd.powerbuilder6": {
-    "source": "iana",
-    "extensions": ["pbd"]
-  },
-  "application/vnd.powerbuilder6-s": {
-    "source": "iana"
-  },
-  "application/vnd.powerbuilder7": {
-    "source": "iana"
-  },
-  "application/vnd.powerbuilder7-s": {
-    "source": "iana"
-  },
-  "application/vnd.powerbuilder75": {
-    "source": "iana"
-  },
-  "application/vnd.powerbuilder75-s": {
-    "source": "iana"
-  },
-  "application/vnd.preminet": {
-    "source": "iana"
-  },
-  "application/vnd.previewsystems.box": {
-    "source": "iana",
-    "extensions": ["box"]
-  },
-  "application/vnd.proteus.magazine": {
-    "source": "iana",
-    "extensions": ["mgz"]
-  },
-  "application/vnd.publishare-delta-tree": {
-    "source": "iana",
-    "extensions": ["qps"]
-  },
-  "application/vnd.pvi.ptid1": {
-    "source": "iana",
-    "extensions": ["ptid"]
-  },
-  "application/vnd.pwg-multiplexed": {
-    "source": "iana"
-  },
-  "application/vnd.pwg-xhtml-print+xml": {
-    "source": "iana"
-  },
-  "application/vnd.qualcomm.brew-app-res": {
-    "source": "iana"
-  },
-  "application/vnd.quark.quarkxpress": {
-    "source": "iana",
-    "extensions": ["qxd","qxt","qwd","qwt","qxl","qxb"]
-  },
-  "application/vnd.quobject-quoxdocument": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.moml+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-audit+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-audit-conf+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-audit-conn+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-audit-dialog+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-audit-stream+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-conf+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-base+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-fax-detect+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-fax-sendrecv+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-group+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-speech+xml": {
-    "source": "iana"
-  },
-  "application/vnd.radisys.msml-dialog-transform+xml": {
-    "source": "iana"
-  },
-  "application/vnd.rainstor.data": {
-    "source": "iana"
-  },
-  "application/vnd.rapid": {
-    "source": "iana"
-  },
-  "application/vnd.realvnc.bed": {
-    "source": "iana",
-    "extensions": ["bed"]
-  },
-  "application/vnd.recordare.musicxml": {
-    "source": "iana",
-    "extensions": ["mxl"]
-  },
-  "application/vnd.recordare.musicxml+xml": {
-    "source": "iana",
-    "extensions": ["musicxml"]
-  },
-  "application/vnd.renlearn.rlprint": {
-    "source": "iana"
-  },
-  "application/vnd.rig.cryptonote": {
-    "source": "iana",
-    "extensions": ["cryptonote"]
-  },
-  "application/vnd.rim.cod": {
-    "source": "apache",
-    "extensions": ["cod"]
-  },
-  "application/vnd.rn-realmedia": {
-    "source": "apache",
-    "extensions": ["rm"]
-  },
-  "application/vnd.rn-realmedia-vbr": {
-    "source": "apache",
-    "extensions": ["rmvb"]
-  },
-  "application/vnd.route66.link66+xml": {
-    "source": "iana",
-    "extensions": ["link66"]
-  },
-  "application/vnd.rs-274x": {
-    "source": "iana"
-  },
-  "application/vnd.ruckus.download": {
-    "source": "iana"
-  },
-  "application/vnd.s3sms": {
-    "source": "iana"
-  },
-  "application/vnd.sailingtracker.track": {
-    "source": "iana",
-    "extensions": ["st"]
-  },
-  "application/vnd.sbm.cid": {
-    "source": "iana"
-  },
-  "application/vnd.sbm.mid2": {
-    "source": "iana"
-  },
-  "application/vnd.scribus": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.3df": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.csf": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.doc": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.eml": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.mht": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.net": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.ppt": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.tiff": {
-    "source": "iana"
-  },
-  "application/vnd.sealed.xls": {
-    "source": "iana"
-  },
-  "application/vnd.sealedmedia.softseal.html": {
-    "source": "iana"
-  },
-  "application/vnd.sealedmedia.softseal.pdf": {
-    "source": "iana"
-  },
-  "application/vnd.seemail": {
-    "source": "iana",
-    "extensions": ["see"]
-  },
-  "application/vnd.sema": {
-    "source": "iana",
-    "extensions": ["sema"]
-  },
-  "application/vnd.semd": {
-    "source": "iana",
-    "extensions": ["semd"]
-  },
-  "application/vnd.semf": {
-    "source": "iana",
-    "extensions": ["semf"]
-  },
-  "application/vnd.shana.informed.formdata": {
-    "source": "iana",
-    "extensions": ["ifm"]
-  },
-  "application/vnd.shana.informed.formtemplate": {
-    "source": "iana",
-    "extensions": ["itp"]
-  },
-  "application/vnd.shana.informed.interchange": {
-    "source": "iana",
-    "extensions": ["iif"]
-  },
-  "application/vnd.shana.informed.package": {
-    "source": "iana",
-    "extensions": ["ipk"]
-  },
-  "application/vnd.simtech-mindmapper": {
-    "source": "iana",
-    "extensions": ["twd","twds"]
-  },
-  "application/vnd.siren+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.smaf": {
-    "source": "iana",
-    "extensions": ["mmf"]
-  },
-  "application/vnd.smart.notebook": {
-    "source": "iana"
-  },
-  "application/vnd.smart.teacher": {
-    "source": "iana",
-    "extensions": ["teacher"]
-  },
-  "application/vnd.software602.filler.form+xml": {
-    "source": "iana"
-  },
-  "application/vnd.software602.filler.form-xml-zip": {
-    "source": "iana"
-  },
-  "application/vnd.solent.sdkm+xml": {
-    "source": "iana",
-    "extensions": ["sdkm","sdkd"]
-  },
-  "application/vnd.spotfire.dxp": {
-    "source": "iana",
-    "extensions": ["dxp"]
-  },
-  "application/vnd.spotfire.sfs": {
-    "source": "iana",
-    "extensions": ["sfs"]
-  },
-  "application/vnd.sss-cod": {
-    "source": "iana"
-  },
-  "application/vnd.sss-dtf": {
-    "source": "iana"
-  },
-  "application/vnd.sss-ntf": {
-    "source": "iana"
-  },
-  "application/vnd.stardivision.calc": {
-    "source": "apache",
-    "extensions": ["sdc"]
-  },
-  "application/vnd.stardivision.draw": {
-    "source": "apache",
-    "extensions": ["sda"]
-  },
-  "application/vnd.stardivision.impress": {
-    "source": "apache",
-    "extensions": ["sdd"]
-  },
-  "application/vnd.stardivision.math": {
-    "source": "apache",
-    "extensions": ["smf"]
-  },
-  "application/vnd.stardivision.writer": {
-    "source": "apache",
-    "extensions": ["sdw","vor"]
-  },
-  "application/vnd.stardivision.writer-global": {
-    "source": "apache",
-    "extensions": ["sgl"]
-  },
-  "application/vnd.stepmania.package": {
-    "source": "iana",
-    "extensions": ["smzip"]
-  },
-  "application/vnd.stepmania.stepchart": {
-    "source": "iana",
-    "extensions": ["sm"]
-  },
-  "application/vnd.street-stream": {
-    "source": "iana"
-  },
-  "application/vnd.sun.wadl+xml": {
-    "source": "iana"
-  },
-  "application/vnd.sun.xml.calc": {
-    "source": "apache",
-    "extensions": ["sxc"]
-  },
-  "application/vnd.sun.xml.calc.template": {
-    "source": "apache",
-    "extensions": ["stc"]
-  },
-  "application/vnd.sun.xml.draw": {
-    "source": "apache",
-    "extensions": ["sxd"]
-  },
-  "application/vnd.sun.xml.draw.template": {
-    "source": "apache",
-    "extensions": ["std"]
-  },
-  "application/vnd.sun.xml.impress": {
-    "source": "apache",
-    "extensions": ["sxi"]
-  },
-  "application/vnd.sun.xml.impress.template": {
-    "source": "apache",
-    "extensions": ["sti"]
-  },
-  "application/vnd.sun.xml.math": {
-    "source": "apache",
-    "extensions": ["sxm"]
-  },
-  "application/vnd.sun.xml.writer": {
-    "source": "apache",
-    "extensions": ["sxw"]
-  },
-  "application/vnd.sun.xml.writer.global": {
-    "source": "apache",
-    "extensions": ["sxg"]
-  },
-  "application/vnd.sun.xml.writer.template": {
-    "source": "apache",
-    "extensions": ["stw"]
-  },
-  "application/vnd.sus-calendar": {
-    "source": "iana",
-    "extensions": ["sus","susp"]
-  },
-  "application/vnd.svd": {
-    "source": "iana",
-    "extensions": ["svd"]
-  },
-  "application/vnd.swiftview-ics": {
-    "source": "iana"
-  },
-  "application/vnd.symbian.install": {
-    "source": "apache",
-    "extensions": ["sis","sisx"]
-  },
-  "application/vnd.syncml+xml": {
-    "source": "iana",
-    "extensions": ["xsm"]
-  },
-  "application/vnd.syncml.dm+wbxml": {
-    "source": "iana",
-    "extensions": ["bdm"]
-  },
-  "application/vnd.syncml.dm+xml": {
-    "source": "iana",
-    "extensions": ["xdm"]
-  },
-  "application/vnd.syncml.dm.notification": {
-    "source": "iana"
-  },
-  "application/vnd.syncml.dmddf+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.syncml.dmddf+xml": {
-    "source": "iana"
-  },
-  "application/vnd.syncml.dmtnds+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.syncml.dmtnds+xml": {
-    "source": "iana"
-  },
-  "application/vnd.syncml.ds.notification": {
-    "source": "iana"
-  },
-  "application/vnd.tao.intent-module-archive": {
-    "source": "iana",
-    "extensions": ["tao"]
-  },
-  "application/vnd.tcpdump.pcap": {
-    "source": "iana",
-    "extensions": ["pcap","cap","dmp"]
-  },
-  "application/vnd.tmd.mediaflex.api+xml": {
-    "source": "iana"
-  },
-  "application/vnd.tml": {
-    "source": "iana"
-  },
-  "application/vnd.tmobile-livetv": {
-    "source": "iana",
-    "extensions": ["tmo"]
-  },
-  "application/vnd.trid.tpt": {
-    "source": "iana",
-    "extensions": ["tpt"]
-  },
-  "application/vnd.triscape.mxs": {
-    "source": "iana",
-    "extensions": ["mxs"]
-  },
-  "application/vnd.trueapp": {
-    "source": "iana",
-    "extensions": ["tra"]
-  },
-  "application/vnd.truedoc": {
-    "source": "iana"
-  },
-  "application/vnd.ubisoft.webplayer": {
-    "source": "iana"
-  },
-  "application/vnd.ufdl": {
-    "source": "iana",
-    "extensions": ["ufd","ufdl"]
-  },
-  "application/vnd.uiq.theme": {
-    "source": "iana",
-    "extensions": ["utz"]
-  },
-  "application/vnd.umajin": {
-    "source": "iana",
-    "extensions": ["umj"]
-  },
-  "application/vnd.unity": {
-    "source": "iana",
-    "extensions": ["unityweb"]
-  },
-  "application/vnd.uoml+xml": {
-    "source": "iana",
-    "extensions": ["uoml"]
-  },
-  "application/vnd.uplanet.alert": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.alert-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.bearer-choice": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.bearer-choice-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.cacheop": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.cacheop-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.channel": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.channel-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.list": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.list-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.listcmd": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.listcmd-wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.uplanet.signal": {
-    "source": "iana"
-  },
-  "application/vnd.uri-map": {
-    "source": "iana"
-  },
-  "application/vnd.valve.source.material": {
-    "source": "iana"
-  },
-  "application/vnd.vcx": {
-    "source": "iana",
-    "extensions": ["vcx"]
-  },
-  "application/vnd.vd-study": {
-    "source": "iana"
-  },
-  "application/vnd.vectorworks": {
-    "source": "iana"
-  },
-  "application/vnd.vel+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.verimatrix.vcas": {
-    "source": "iana"
-  },
-  "application/vnd.vidsoft.vidconference": {
-    "source": "iana"
-  },
-  "application/vnd.visio": {
-    "source": "iana",
-    "extensions": ["vsd","vst","vss","vsw"]
-  },
-  "application/vnd.visionary": {
-    "source": "iana",
-    "extensions": ["vis"]
-  },
-  "application/vnd.vividence.scriptfile": {
-    "source": "iana"
-  },
-  "application/vnd.vsf": {
-    "source": "iana",
-    "extensions": ["vsf"]
-  },
-  "application/vnd.wap.sic": {
-    "source": "iana"
-  },
-  "application/vnd.wap.slc": {
-    "source": "iana"
-  },
-  "application/vnd.wap.wbxml": {
-    "source": "iana",
-    "extensions": ["wbxml"]
-  },
-  "application/vnd.wap.wmlc": {
-    "source": "iana",
-    "extensions": ["wmlc"]
-  },
-  "application/vnd.wap.wmlscriptc": {
-    "source": "iana",
-    "extensions": ["wmlsc"]
-  },
-  "application/vnd.webturbo": {
-    "source": "iana",
-    "extensions": ["wtb"]
-  },
-  "application/vnd.wfa.p2p": {
-    "source": "iana"
-  },
-  "application/vnd.wfa.wsc": {
-    "source": "iana"
-  },
-  "application/vnd.windows.devicepairing": {
-    "source": "iana"
-  },
-  "application/vnd.wmc": {
-    "source": "iana"
-  },
-  "application/vnd.wmf.bootstrap": {
-    "source": "iana"
-  },
-  "application/vnd.wolfram.mathematica": {
-    "source": "iana"
-  },
-  "application/vnd.wolfram.mathematica.package": {
-    "source": "iana"
-  },
-  "application/vnd.wolfram.player": {
-    "source": "iana",
-    "extensions": ["nbp"]
-  },
-  "application/vnd.wordperfect": {
-    "source": "iana",
-    "extensions": ["wpd"]
-  },
-  "application/vnd.wqd": {
-    "source": "iana",
-    "extensions": ["wqd"]
-  },
-  "application/vnd.wrq-hp3000-labelled": {
-    "source": "iana"
-  },
-  "application/vnd.wt.stf": {
-    "source": "iana",
-    "extensions": ["stf"]
-  },
-  "application/vnd.wv.csp+wbxml": {
-    "source": "iana"
-  },
-  "application/vnd.wv.csp+xml": {
-    "source": "iana"
-  },
-  "application/vnd.wv.ssp+xml": {
-    "source": "iana"
-  },
-  "application/vnd.xacml+json": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/vnd.xara": {
-    "source": "iana",
-    "extensions": ["xar"]
-  },
-  "application/vnd.xfdl": {
-    "source": "iana",
-    "extensions": ["xfdl"]
-  },
-  "application/vnd.xfdl.webform": {
-    "source": "iana"
-  },
-  "application/vnd.xmi+xml": {
-    "source": "iana"
-  },
-  "application/vnd.xmpie.cpkg": {
-    "source": "iana"
-  },
-  "application/vnd.xmpie.dpkg": {
-    "source": "iana"
-  },
-  "application/vnd.xmpie.plan": {
-    "source": "iana"
-  },
-  "application/vnd.xmpie.ppkg": {
-    "source": "iana"
-  },
-  "application/vnd.xmpie.xlim": {
-    "source": "iana"
-  },
-  "application/vnd.yamaha.hv-dic": {
-    "source": "iana",
-    "extensions": ["hvd"]
-  },
-  "application/vnd.yamaha.hv-script": {
-    "source": "iana",
-    "extensions": ["hvs"]
-  },
-  "application/vnd.yamaha.hv-voice": {
-    "source": "iana",
-    "extensions": ["hvp"]
-  },
-  "application/vnd.yamaha.openscoreformat": {
-    "source": "iana",
-    "extensions": ["osf"]
-  },
-  "application/vnd.yamaha.openscoreformat.osfpvg+xml": {
-    "source": "iana",
-    "extensions": ["osfpvg"]
-  },
-  "application/vnd.yamaha.remote-setup": {
-    "source": "iana"
-  },
-  "application/vnd.yamaha.smaf-audio": {
-    "source": "iana",
-    "extensions": ["saf"]
-  },
-  "application/vnd.yamaha.smaf-phrase": {
-    "source": "iana",
-    "extensions": ["spf"]
-  },
-  "application/vnd.yamaha.through-ngn": {
-    "source": "iana"
-  },
-  "application/vnd.yamaha.tunnel-udpencap": {
-    "source": "iana"
-  },
-  "application/vnd.yaoweme": {
-    "source": "iana"
-  },
-  "application/vnd.yellowriver-custom-menu": {
-    "source": "iana",
-    "extensions": ["cmp"]
-  },
-  "application/vnd.zul": {
-    "source": "iana",
-    "extensions": ["zir","zirz"]
-  },
-  "application/vnd.zzazz.deck+xml": {
-    "source": "iana",
-    "extensions": ["zaz"]
-  },
-  "application/voicexml+xml": {
-    "source": "iana",
-    "extensions": ["vxml"]
-  },
-  "application/vq-rtcpxr": {
-    "source": "iana"
-  },
-  "application/watcherinfo+xml": {
-    "source": "iana"
-  },
-  "application/whoispp-query": {
-    "source": "iana"
-  },
-  "application/whoispp-response": {
-    "source": "iana"
-  },
-  "application/widget": {
-    "source": "iana",
-    "extensions": ["wgt"]
-  },
-  "application/winhlp": {
-    "source": "apache",
-    "extensions": ["hlp"]
-  },
-  "application/wita": {
-    "source": "iana"
-  },
-  "application/wordperfect5.1": {
-    "source": "iana"
-  },
-  "application/wsdl+xml": {
-    "source": "iana",
-    "extensions": ["wsdl"]
-  },
-  "application/wspolicy+xml": {
-    "source": "iana",
-    "extensions": ["wspolicy"]
-  },
-  "application/x-7z-compressed": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["7z"]
-  },
-  "application/x-abiword": {
-    "source": "apache",
-    "extensions": ["abw"]
-  },
-  "application/x-ace-compressed": {
-    "source": "apache",
-    "extensions": ["ace"]
-  },
-  "application/x-amf": {
-    "source": "apache"
-  },
-  "application/x-apple-diskimage": {
-    "source": "apache",
-    "extensions": ["dmg"]
-  },
-  "application/x-authorware-bin": {
-    "source": "apache",
-    "extensions": ["aab","x32","u32","vox"]
-  },
-  "application/x-authorware-map": {
-    "source": "apache",
-    "extensions": ["aam"]
-  },
-  "application/x-authorware-seg": {
-    "source": "apache",
-    "extensions": ["aas"]
-  },
-  "application/x-bcpio": {
-    "source": "apache",
-    "extensions": ["bcpio"]
-  },
-  "application/x-bdoc": {
-    "compressible": false,
-    "extensions": ["bdoc"]
-  },
-  "application/x-bittorrent": {
-    "source": "apache",
-    "extensions": ["torrent"]
-  },
-  "application/x-blorb": {
-    "source": "apache",
-    "extensions": ["blb","blorb"]
-  },
-  "application/x-bzip": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["bz"]
-  },
-  "application/x-bzip2": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["bz2","boz"]
-  },
-  "application/x-cbr": {
-    "source": "apache",
-    "extensions": ["cbr","cba","cbt","cbz","cb7"]
-  },
-  "application/x-cdlink": {
-    "source": "apache",
-    "extensions": ["vcd"]
-  },
-  "application/x-cfs-compressed": {
-    "source": "apache",
-    "extensions": ["cfs"]
-  },
-  "application/x-chat": {
-    "source": "apache",
-    "extensions": ["chat"]
-  },
-  "application/x-chess-pgn": {
-    "source": "apache",
-    "extensions": ["pgn"]
-  },
-  "application/x-chrome-extension": {
-    "extensions": ["crx"]
-  },
-  "application/x-cocoa": {
-    "source": "nginx",
-    "extensions": ["cco"]
-  },
-  "application/x-compress": {
-    "source": "apache"
-  },
-  "application/x-conference": {
-    "source": "apache",
-    "extensions": ["nsc"]
-  },
-  "application/x-cpio": {
-    "source": "apache",
-    "extensions": ["cpio"]
-  },
-  "application/x-csh": {
-    "source": "apache",
-    "extensions": ["csh"]
-  },
-  "application/x-deb": {
-    "compressible": false
-  },
-  "application/x-debian-package": {
-    "source": "apache",
-    "extensions": ["deb","udeb"]
-  },
-  "application/x-dgc-compressed": {
-    "source": "apache",
-    "extensions": ["dgc"]
-  },
-  "application/x-director": {
-    "source": "apache",
-    "extensions": ["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]
-  },
-  "application/x-doom": {
-    "source": "apache",
-    "extensions": ["wad"]
-  },
-  "application/x-dtbncx+xml": {
-    "source": "apache",
-    "extensions": ["ncx"]
-  },
-  "application/x-dtbook+xml": {
-    "source": "apache",
-    "extensions": ["dtb"]
-  },
-  "application/x-dtbresource+xml": {
-    "source": "apache",
-    "extensions": ["res"]
-  },
-  "application/x-dvi": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["dvi"]
-  },
-  "application/x-envoy": {
-    "source": "apache",
-    "extensions": ["evy"]
-  },
-  "application/x-eva": {
-    "source": "apache",
-    "extensions": ["eva"]
-  },
-  "application/x-font-bdf": {
-    "source": "apache",
-    "extensions": ["bdf"]
-  },
-  "application/x-font-dos": {
-    "source": "apache"
-  },
-  "application/x-font-framemaker": {
-    "source": "apache"
-  },
-  "application/x-font-ghostscript": {
-    "source": "apache",
-    "extensions": ["gsf"]
-  },
-  "application/x-font-libgrx": {
-    "source": "apache"
-  },
-  "application/x-font-linux-psf": {
-    "source": "apache",
-    "extensions": ["psf"]
-  },
-  "application/x-font-otf": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["otf"]
-  },
-  "application/x-font-pcf": {
-    "source": "apache",
-    "extensions": ["pcf"]
-  },
-  "application/x-font-snf": {
-    "source": "apache",
-    "extensions": ["snf"]
-  },
-  "application/x-font-speedo": {
-    "source": "apache"
-  },
-  "application/x-font-sunos-news": {
-    "source": "apache"
-  },
-  "application/x-font-ttf": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["ttf","ttc"]
-  },
-  "application/x-font-type1": {
-    "source": "apache",
-    "extensions": ["pfa","pfb","pfm","afm"]
-  },
-  "application/x-font-vfont": {
-    "source": "apache"
-  },
-  "application/x-freearc": {
-    "source": "apache",
-    "extensions": ["arc"]
-  },
-  "application/x-futuresplash": {
-    "source": "apache",
-    "extensions": ["spl"]
-  },
-  "application/x-gca-compressed": {
-    "source": "apache",
-    "extensions": ["gca"]
-  },
-  "application/x-glulx": {
-    "source": "apache",
-    "extensions": ["ulx"]
-  },
-  "application/x-gnumeric": {
-    "source": "apache",
-    "extensions": ["gnumeric"]
-  },
-  "application/x-gramps-xml": {
-    "source": "apache",
-    "extensions": ["gramps"]
-  },
-  "application/x-gtar": {
-    "source": "apache",
-    "extensions": ["gtar"]
-  },
-  "application/x-gzip": {
-    "source": "apache"
-  },
-  "application/x-hdf": {
-    "source": "apache",
-    "extensions": ["hdf"]
-  },
-  "application/x-httpd-php": {
-    "compressible": true,
-    "extensions": ["php"]
-  },
-  "application/x-install-instructions": {
-    "source": "apache",
-    "extensions": ["install"]
-  },
-  "application/x-iso9660-image": {
-    "source": "apache",
-    "extensions": ["iso"]
-  },
-  "application/x-java-archive-diff": {
-    "source": "nginx",
-    "extensions": ["jardiff"]
-  },
-  "application/x-java-jnlp-file": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["jnlp"]
-  },
-  "application/x-javascript": {
-    "compressible": true
-  },
-  "application/x-latex": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["latex"]
-  },
-  "application/x-lua-bytecode": {
-    "extensions": ["luac"]
-  },
-  "application/x-lzh-compressed": {
-    "source": "apache",
-    "extensions": ["lzh","lha"]
-  },
-  "application/x-makeself": {
-    "source": "nginx",
-    "extensions": ["run"]
-  },
-  "application/x-mie": {
-    "source": "apache",
-    "extensions": ["mie"]
-  },
-  "application/x-mobipocket-ebook": {
-    "source": "apache",
-    "extensions": ["prc","mobi"]
-  },
-  "application/x-mpegurl": {
-    "compressible": false
-  },
-  "application/x-ms-application": {
-    "source": "apache",
-    "extensions": ["application"]
-  },
-  "application/x-ms-shortcut": {
-    "source": "apache",
-    "extensions": ["lnk"]
-  },
-  "application/x-ms-wmd": {
-    "source": "apache",
-    "extensions": ["wmd"]
-  },
-  "application/x-ms-wmz": {
-    "source": "apache",
-    "extensions": ["wmz"]
-  },
-  "application/x-ms-xbap": {
-    "source": "apache",
-    "extensions": ["xbap"]
-  },
-  "application/x-msaccess": {
-    "source": "apache",
-    "extensions": ["mdb"]
-  },
-  "application/x-msbinder": {
-    "source": "apache",
-    "extensions": ["obd"]
-  },
-  "application/x-mscardfile": {
-    "source": "apache",
-    "extensions": ["crd"]
-  },
-  "application/x-msclip": {
-    "source": "apache",
-    "extensions": ["clp"]
-  },
-  "application/x-msdos-program": {
-    "extensions": ["exe"]
-  },
-  "application/x-msdownload": {
-    "source": "apache",
-    "extensions": ["exe","dll","com","bat","msi"]
-  },
-  "application/x-msmediaview": {
-    "source": "apache",
-    "extensions": ["mvb","m13","m14"]
-  },
-  "application/x-msmetafile": {
-    "source": "apache",
-    "extensions": ["wmf","wmz","emf","emz"]
-  },
-  "application/x-msmoney": {
-    "source": "apache",
-    "extensions": ["mny"]
-  },
-  "application/x-mspublisher": {
-    "source": "apache",
-    "extensions": ["pub"]
-  },
-  "application/x-msschedule": {
-    "source": "apache",
-    "extensions": ["scd"]
-  },
-  "application/x-msterminal": {
-    "source": "apache",
-    "extensions": ["trm"]
-  },
-  "application/x-mswrite": {
-    "source": "apache",
-    "extensions": ["wri"]
-  },
-  "application/x-netcdf": {
-    "source": "apache",
-    "extensions": ["nc","cdf"]
-  },
-  "application/x-ns-proxy-autoconfig": {
-    "compressible": true,
-    "extensions": ["pac"]
-  },
-  "application/x-nzb": {
-    "source": "apache",
-    "extensions": ["nzb"]
-  },
-  "application/x-perl": {
-    "source": "nginx",
-    "extensions": ["pl","pm"]
-  },
-  "application/x-pilot": {
-    "source": "nginx",
-    "extensions": ["prc","pdb"]
-  },
-  "application/x-pkcs12": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["p12","pfx"]
-  },
-  "application/x-pkcs7-certificates": {
-    "source": "apache",
-    "extensions": ["p7b","spc"]
-  },
-  "application/x-pkcs7-certreqresp": {
-    "source": "apache",
-    "extensions": ["p7r"]
-  },
-  "application/x-rar-compressed": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["rar"]
-  },
-  "application/x-redhat-package-manager": {
-    "source": "nginx",
-    "extensions": ["rpm"]
-  },
-  "application/x-research-info-systems": {
-    "source": "apache",
-    "extensions": ["ris"]
-  },
-  "application/x-sea": {
-    "source": "nginx",
-    "extensions": ["sea"]
-  },
-  "application/x-sh": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["sh"]
-  },
-  "application/x-shar": {
-    "source": "apache",
-    "extensions": ["shar"]
-  },
-  "application/x-shockwave-flash": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["swf"]
-  },
-  "application/x-silverlight-app": {
-    "source": "apache",
-    "extensions": ["xap"]
-  },
-  "application/x-sql": {
-    "source": "apache",
-    "extensions": ["sql"]
-  },
-  "application/x-stuffit": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["sit"]
-  },
-  "application/x-stuffitx": {
-    "source": "apache",
-    "extensions": ["sitx"]
-  },
-  "application/x-subrip": {
-    "source": "apache",
-    "extensions": ["srt"]
-  },
-  "application/x-sv4cpio": {
-    "source": "apache",
-    "extensions": ["sv4cpio"]
-  },
-  "application/x-sv4crc": {
-    "source": "apache",
-    "extensions": ["sv4crc"]
-  },
-  "application/x-t3vm-image": {
-    "source": "apache",
-    "extensions": ["t3"]
-  },
-  "application/x-tads": {
-    "source": "apache",
-    "extensions": ["gam"]
-  },
-  "application/x-tar": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["tar"]
-  },
-  "application/x-tcl": {
-    "source": "apache",
-    "extensions": ["tcl","tk"]
-  },
-  "application/x-tex": {
-    "source": "apache",
-    "extensions": ["tex"]
-  },
-  "application/x-tex-tfm": {
-    "source": "apache",
-    "extensions": ["tfm"]
-  },
-  "application/x-texinfo": {
-    "source": "apache",
-    "extensions": ["texinfo","texi"]
-  },
-  "application/x-tgif": {
-    "source": "apache",
-    "extensions": ["obj"]
-  },
-  "application/x-ustar": {
-    "source": "apache",
-    "extensions": ["ustar"]
-  },
-  "application/x-wais-source": {
-    "source": "apache",
-    "extensions": ["src"]
-  },
-  "application/x-web-app-manifest+json": {
-    "compressible": true,
-    "extensions": ["webapp"]
-  },
-  "application/x-www-form-urlencoded": {
-    "source": "iana",
-    "compressible": true
-  },
-  "application/x-x509-ca-cert": {
-    "source": "apache",
-    "extensions": ["der","crt","pem"]
-  },
-  "application/x-xfig": {
-    "source": "apache",
-    "extensions": ["fig"]
-  },
-  "application/x-xliff+xml": {
-    "source": "apache",
-    "extensions": ["xlf"]
-  },
-  "application/x-xpinstall": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["xpi"]
-  },
-  "application/x-xz": {
-    "source": "apache",
-    "extensions": ["xz"]
-  },
-  "application/x-zmachine": {
-    "source": "apache",
-    "extensions": ["z1","z2","z3","z4","z5","z6","z7","z8"]
-  },
-  "application/x400-bp": {
-    "source": "iana"
-  },
-  "application/xacml+xml": {
-    "source": "iana"
-  },
-  "application/xaml+xml": {
-    "source": "apache",
-    "extensions": ["xaml"]
-  },
-  "application/xcap-att+xml": {
-    "source": "iana"
-  },
-  "application/xcap-caps+xml": {
-    "source": "iana"
-  },
-  "application/xcap-diff+xml": {
-    "source": "iana",
-    "extensions": ["xdf"]
-  },
-  "application/xcap-el+xml": {
-    "source": "iana"
-  },
-  "application/xcap-error+xml": {
-    "source": "iana"
-  },
-  "application/xcap-ns+xml": {
-    "source": "iana"
-  },
-  "application/xcon-conference-info+xml": {
-    "source": "iana"
-  },
-  "application/xcon-conference-info-diff+xml": {
-    "source": "iana"
-  },
-  "application/xenc+xml": {
-    "source": "iana",
-    "extensions": ["xenc"]
-  },
-  "application/xhtml+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["xhtml","xht"]
-  },
-  "application/xhtml-voice+xml": {
-    "source": "apache"
-  },
-  "application/xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["xml","xsl","xsd","rng"]
-  },
-  "application/xml-dtd": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["dtd"]
-  },
-  "application/xml-external-parsed-entity": {
-    "source": "iana"
-  },
-  "application/xml-patch+xml": {
-    "source": "iana"
-  },
-  "application/xmpp+xml": {
-    "source": "iana"
-  },
-  "application/xop+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["xop"]
-  },
-  "application/xproc+xml": {
-    "source": "apache",
-    "extensions": ["xpl"]
-  },
-  "application/xslt+xml": {
-    "source": "iana",
-    "extensions": ["xslt"]
-  },
-  "application/xspf+xml": {
-    "source": "apache",
-    "extensions": ["xspf"]
-  },
-  "application/xv+xml": {
-    "source": "iana",
-    "extensions": ["mxml","xhvml","xvml","xvm"]
-  },
-  "application/yang": {
-    "source": "iana",
-    "extensions": ["yang"]
-  },
-  "application/yin+xml": {
-    "source": "iana",
-    "extensions": ["yin"]
-  },
-  "application/zip": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["zip"]
-  },
-  "application/zlib": {
-    "source": "iana"
-  },
-  "audio/1d-interleaved-parityfec": {
-    "source": "iana"
-  },
-  "audio/32kadpcm": {
-    "source": "iana"
-  },
-  "audio/3gpp": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["3gpp"]
-  },
-  "audio/3gpp2": {
-    "source": "iana"
-  },
-  "audio/ac3": {
-    "source": "iana"
-  },
-  "audio/adpcm": {
-    "source": "apache",
-    "extensions": ["adp"]
-  },
-  "audio/amr": {
-    "source": "iana"
-  },
-  "audio/amr-wb": {
-    "source": "iana"
-  },
-  "audio/amr-wb+": {
-    "source": "iana"
-  },
-  "audio/aptx": {
-    "source": "iana"
-  },
-  "audio/asc": {
-    "source": "iana"
-  },
-  "audio/atrac-advanced-lossless": {
-    "source": "iana"
-  },
-  "audio/atrac-x": {
-    "source": "iana"
-  },
-  "audio/atrac3": {
-    "source": "iana"
-  },
-  "audio/basic": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["au","snd"]
-  },
-  "audio/bv16": {
-    "source": "iana"
-  },
-  "audio/bv32": {
-    "source": "iana"
-  },
-  "audio/clearmode": {
-    "source": "iana"
-  },
-  "audio/cn": {
-    "source": "iana"
-  },
-  "audio/dat12": {
-    "source": "iana"
-  },
-  "audio/dls": {
-    "source": "iana"
-  },
-  "audio/dsr-es201108": {
-    "source": "iana"
-  },
-  "audio/dsr-es202050": {
-    "source": "iana"
-  },
-  "audio/dsr-es202211": {
-    "source": "iana"
-  },
-  "audio/dsr-es202212": {
-    "source": "iana"
-  },
-  "audio/dv": {
-    "source": "iana"
-  },
-  "audio/dvi4": {
-    "source": "iana"
-  },
-  "audio/eac3": {
-    "source": "iana"
-  },
-  "audio/encaprtp": {
-    "source": "iana"
-  },
-  "audio/evrc": {
-    "source": "iana"
-  },
-  "audio/evrc-qcp": {
-    "source": "iana"
-  },
-  "audio/evrc0": {
-    "source": "iana"
-  },
-  "audio/evrc1": {
-    "source": "iana"
-  },
-  "audio/evrcb": {
-    "source": "iana"
-  },
-  "audio/evrcb0": {
-    "source": "iana"
-  },
-  "audio/evrcb1": {
-    "source": "iana"
-  },
-  "audio/evrcnw": {
-    "source": "iana"
-  },
-  "audio/evrcnw0": {
-    "source": "iana"
-  },
-  "audio/evrcnw1": {
-    "source": "iana"
-  },
-  "audio/evrcwb": {
-    "source": "iana"
-  },
-  "audio/evrcwb0": {
-    "source": "iana"
-  },
-  "audio/evrcwb1": {
-    "source": "iana"
-  },
-  "audio/evs": {
-    "source": "iana"
-  },
-  "audio/fwdred": {
-    "source": "iana"
-  },
-  "audio/g711-0": {
-    "source": "iana"
-  },
-  "audio/g719": {
-    "source": "iana"
-  },
-  "audio/g722": {
-    "source": "iana"
-  },
-  "audio/g7221": {
-    "source": "iana"
-  },
-  "audio/g723": {
-    "source": "iana"
-  },
-  "audio/g726-16": {
-    "source": "iana"
-  },
-  "audio/g726-24": {
-    "source": "iana"
-  },
-  "audio/g726-32": {
-    "source": "iana"
-  },
-  "audio/g726-40": {
-    "source": "iana"
-  },
-  "audio/g728": {
-    "source": "iana"
-  },
-  "audio/g729": {
-    "source": "iana"
-  },
-  "audio/g7291": {
-    "source": "iana"
-  },
-  "audio/g729d": {
-    "source": "iana"
-  },
-  "audio/g729e": {
-    "source": "iana"
-  },
-  "audio/gsm": {
-    "source": "iana"
-  },
-  "audio/gsm-efr": {
-    "source": "iana"
-  },
-  "audio/gsm-hr-08": {
-    "source": "iana"
-  },
-  "audio/ilbc": {
-    "source": "iana"
-  },
-  "audio/ip-mr_v2.5": {
-    "source": "iana"
-  },
-  "audio/isac": {
-    "source": "apache"
-  },
-  "audio/l16": {
-    "source": "iana"
-  },
-  "audio/l20": {
-    "source": "iana"
-  },
-  "audio/l24": {
-    "source": "iana",
-    "compressible": false
-  },
-  "audio/l8": {
-    "source": "iana"
-  },
-  "audio/lpc": {
-    "source": "iana"
-  },
-  "audio/midi": {
-    "source": "apache",
-    "extensions": ["mid","midi","kar","rmi"]
-  },
-  "audio/mobile-xmf": {
-    "source": "iana"
-  },
-  "audio/mp4": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["m4a","mp4a"]
-  },
-  "audio/mp4a-latm": {
-    "source": "iana"
-  },
-  "audio/mpa": {
-    "source": "iana"
-  },
-  "audio/mpa-robust": {
-    "source": "iana"
-  },
-  "audio/mpeg": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["mpga","mp2","mp2a","mp3","m2a","m3a"]
-  },
-  "audio/mpeg4-generic": {
-    "source": "iana"
-  },
-  "audio/musepack": {
-    "source": "apache"
-  },
-  "audio/ogg": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["oga","ogg","spx"]
-  },
-  "audio/opus": {
-    "source": "iana"
-  },
-  "audio/parityfec": {
-    "source": "iana"
-  },
-  "audio/pcma": {
-    "source": "iana"
-  },
-  "audio/pcma-wb": {
-    "source": "iana"
-  },
-  "audio/pcmu": {
-    "source": "iana"
-  },
-  "audio/pcmu-wb": {
-    "source": "iana"
-  },
-  "audio/prs.sid": {
-    "source": "iana"
-  },
-  "audio/qcelp": {
-    "source": "iana"
-  },
-  "audio/raptorfec": {
-    "source": "iana"
-  },
-  "audio/red": {
-    "source": "iana"
-  },
-  "audio/rtp-enc-aescm128": {
-    "source": "iana"
-  },
-  "audio/rtp-midi": {
-    "source": "iana"
-  },
-  "audio/rtploopback": {
-    "source": "iana"
-  },
-  "audio/rtx": {
-    "source": "iana"
-  },
-  "audio/s3m": {
-    "source": "apache",
-    "extensions": ["s3m"]
-  },
-  "audio/silk": {
-    "source": "apache",
-    "extensions": ["sil"]
-  },
-  "audio/smv": {
-    "source": "iana"
-  },
-  "audio/smv-qcp": {
-    "source": "iana"
-  },
-  "audio/smv0": {
-    "source": "iana"
-  },
-  "audio/sp-midi": {
-    "source": "iana"
-  },
-  "audio/speex": {
-    "source": "iana"
-  },
-  "audio/t140c": {
-    "source": "iana"
-  },
-  "audio/t38": {
-    "source": "iana"
-  },
-  "audio/telephone-event": {
-    "source": "iana"
-  },
-  "audio/tone": {
-    "source": "iana"
-  },
-  "audio/uemclip": {
-    "source": "iana"
-  },
-  "audio/ulpfec": {
-    "source": "iana"
-  },
-  "audio/vdvi": {
-    "source": "iana"
-  },
-  "audio/vmr-wb": {
-    "source": "iana"
-  },
-  "audio/vnd.3gpp.iufp": {
-    "source": "iana"
-  },
-  "audio/vnd.4sb": {
-    "source": "iana"
-  },
-  "audio/vnd.audiokoz": {
-    "source": "iana"
-  },
-  "audio/vnd.celp": {
-    "source": "iana"
-  },
-  "audio/vnd.cisco.nse": {
-    "source": "iana"
-  },
-  "audio/vnd.cmles.radio-events": {
-    "source": "iana"
-  },
-  "audio/vnd.cns.anp1": {
-    "source": "iana"
-  },
-  "audio/vnd.cns.inf1": {
-    "source": "iana"
-  },
-  "audio/vnd.dece.audio": {
-    "source": "iana",
-    "extensions": ["uva","uvva"]
-  },
-  "audio/vnd.digital-winds": {
-    "source": "iana",
-    "extensions": ["eol"]
-  },
-  "audio/vnd.dlna.adts": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.heaac.1": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.heaac.2": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.mlp": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.mps": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.pl2": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.pl2x": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.pl2z": {
-    "source": "iana"
-  },
-  "audio/vnd.dolby.pulse.1": {
-    "source": "iana"
-  },
-  "audio/vnd.dra": {
-    "source": "iana",
-    "extensions": ["dra"]
-  },
-  "audio/vnd.dts": {
-    "source": "iana",
-    "extensions": ["dts"]
-  },
-  "audio/vnd.dts.hd": {
-    "source": "iana",
-    "extensions": ["dtshd"]
-  },
-  "audio/vnd.dvb.file": {
-    "source": "iana"
-  },
-  "audio/vnd.everad.plj": {
-    "source": "iana"
-  },
-  "audio/vnd.hns.audio": {
-    "source": "iana"
-  },
-  "audio/vnd.lucent.voice": {
-    "source": "iana",
-    "extensions": ["lvp"]
-  },
-  "audio/vnd.ms-playready.media.pya": {
-    "source": "iana",
-    "extensions": ["pya"]
-  },
-  "audio/vnd.nokia.mobile-xmf": {
-    "source": "iana"
-  },
-  "audio/vnd.nortel.vbk": {
-    "source": "iana"
-  },
-  "audio/vnd.nuera.ecelp4800": {
-    "source": "iana",
-    "extensions": ["ecelp4800"]
-  },
-  "audio/vnd.nuera.ecelp7470": {
-    "source": "iana",
-    "extensions": ["ecelp7470"]
-  },
-  "audio/vnd.nuera.ecelp9600": {
-    "source": "iana",
-    "extensions": ["ecelp9600"]
-  },
-  "audio/vnd.octel.sbc": {
-    "source": "iana"
-  },
-  "audio/vnd.qcelp": {
-    "source": "iana"
-  },
-  "audio/vnd.rhetorex.32kadpcm": {
-    "source": "iana"
-  },
-  "audio/vnd.rip": {
-    "source": "iana",
-    "extensions": ["rip"]
-  },
-  "audio/vnd.rn-realaudio": {
-    "compressible": false
-  },
-  "audio/vnd.sealedmedia.softseal.mpeg": {
-    "source": "iana"
-  },
-  "audio/vnd.vmx.cvsd": {
-    "source": "iana"
-  },
-  "audio/vnd.wave": {
-    "compressible": false
-  },
-  "audio/vorbis": {
-    "source": "iana",
-    "compressible": false
-  },
-  "audio/vorbis-config": {
-    "source": "iana"
-  },
-  "audio/wav": {
-    "compressible": false,
-    "extensions": ["wav"]
-  },
-  "audio/wave": {
-    "compressible": false,
-    "extensions": ["wav"]
-  },
-  "audio/webm": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["weba"]
-  },
-  "audio/x-aac": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["aac"]
-  },
-  "audio/x-aiff": {
-    "source": "apache",
-    "extensions": ["aif","aiff","aifc"]
-  },
-  "audio/x-caf": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["caf"]
-  },
-  "audio/x-flac": {
-    "source": "apache",
-    "extensions": ["flac"]
-  },
-  "audio/x-m4a": {
-    "source": "nginx",
-    "extensions": ["m4a"]
-  },
-  "audio/x-matroska": {
-    "source": "apache",
-    "extensions": ["mka"]
-  },
-  "audio/x-mpegurl": {
-    "source": "apache",
-    "extensions": ["m3u"]
-  },
-  "audio/x-ms-wax": {
-    "source": "apache",
-    "extensions": ["wax"]
-  },
-  "audio/x-ms-wma": {
-    "source": "apache",
-    "extensions": ["wma"]
-  },
-  "audio/x-pn-realaudio": {
-    "source": "apache",
-    "extensions": ["ram","ra"]
-  },
-  "audio/x-pn-realaudio-plugin": {
-    "source": "apache",
-    "extensions": ["rmp"]
-  },
-  "audio/x-realaudio": {
-    "source": "nginx",
-    "extensions": ["ra"]
-  },
-  "audio/x-tta": {
-    "source": "apache"
-  },
-  "audio/x-wav": {
-    "source": "apache",
-    "extensions": ["wav"]
-  },
-  "audio/xm": {
-    "source": "apache",
-    "extensions": ["xm"]
-  },
-  "chemical/x-cdx": {
-    "source": "apache",
-    "extensions": ["cdx"]
-  },
-  "chemical/x-cif": {
-    "source": "apache",
-    "extensions": ["cif"]
-  },
-  "chemical/x-cmdf": {
-    "source": "apache",
-    "extensions": ["cmdf"]
-  },
-  "chemical/x-cml": {
-    "source": "apache",
-    "extensions": ["cml"]
-  },
-  "chemical/x-csml": {
-    "source": "apache",
-    "extensions": ["csml"]
-  },
-  "chemical/x-pdb": {
-    "source": "apache"
-  },
-  "chemical/x-xyz": {
-    "source": "apache",
-    "extensions": ["xyz"]
-  },
-  "font/opentype": {
-    "compressible": true,
-    "extensions": ["otf"]
-  },
-  "image/bmp": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["bmp"]
-  },
-  "image/cgm": {
-    "source": "iana",
-    "extensions": ["cgm"]
-  },
-  "image/fits": {
-    "source": "iana"
-  },
-  "image/g3fax": {
-    "source": "iana",
-    "extensions": ["g3"]
-  },
-  "image/gif": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["gif"]
-  },
-  "image/ief": {
-    "source": "iana",
-    "extensions": ["ief"]
-  },
-  "image/jp2": {
-    "source": "iana"
-  },
-  "image/jpeg": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["jpeg","jpg","jpe"]
-  },
-  "image/jpm": {
-    "source": "iana"
-  },
-  "image/jpx": {
-    "source": "iana"
-  },
-  "image/ktx": {
-    "source": "iana",
-    "extensions": ["ktx"]
-  },
-  "image/naplps": {
-    "source": "iana"
-  },
-  "image/pjpeg": {
-    "compressible": false
-  },
-  "image/png": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["png"]
-  },
-  "image/prs.btif": {
-    "source": "iana",
-    "extensions": ["btif"]
-  },
-  "image/prs.pti": {
-    "source": "iana"
-  },
-  "image/pwg-raster": {
-    "source": "iana"
-  },
-  "image/sgi": {
-    "source": "apache",
-    "extensions": ["sgi"]
-  },
-  "image/svg+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["svg","svgz"]
-  },
-  "image/t38": {
-    "source": "iana"
-  },
-  "image/tiff": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["tiff","tif"]
-  },
-  "image/tiff-fx": {
-    "source": "iana"
-  },
-  "image/vnd.adobe.photoshop": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["psd"]
-  },
-  "image/vnd.airzip.accelerator.azv": {
-    "source": "iana"
-  },
-  "image/vnd.cns.inf2": {
-    "source": "iana"
-  },
-  "image/vnd.dece.graphic": {
-    "source": "iana",
-    "extensions": ["uvi","uvvi","uvg","uvvg"]
-  },
-  "image/vnd.djvu": {
-    "source": "iana",
-    "extensions": ["djvu","djv"]
-  },
-  "image/vnd.dvb.subtitle": {
-    "source": "iana",
-    "extensions": ["sub"]
-  },
-  "image/vnd.dwg": {
-    "source": "iana",
-    "extensions": ["dwg"]
-  },
-  "image/vnd.dxf": {
-    "source": "iana",
-    "extensions": ["dxf"]
-  },
-  "image/vnd.fastbidsheet": {
-    "source": "iana",
-    "extensions": ["fbs"]
-  },
-  "image/vnd.fpx": {
-    "source": "iana",
-    "extensions": ["fpx"]
-  },
-  "image/vnd.fst": {
-    "source": "iana",
-    "extensions": ["fst"]
-  },
-  "image/vnd.fujixerox.edmics-mmr": {
-    "source": "iana",
-    "extensions": ["mmr"]
-  },
-  "image/vnd.fujixerox.edmics-rlc": {
-    "source": "iana",
-    "extensions": ["rlc"]
-  },
-  "image/vnd.globalgraphics.pgb": {
-    "source": "iana"
-  },
-  "image/vnd.microsoft.icon": {
-    "source": "iana"
-  },
-  "image/vnd.mix": {
-    "source": "iana"
-  },
-  "image/vnd.mozilla.apng": {
-    "source": "iana"
-  },
-  "image/vnd.ms-modi": {
-    "source": "iana",
-    "extensions": ["mdi"]
-  },
-  "image/vnd.ms-photo": {
-    "source": "apache",
-    "extensions": ["wdp"]
-  },
-  "image/vnd.net-fpx": {
-    "source": "iana",
-    "extensions": ["npx"]
-  },
-  "image/vnd.radiance": {
-    "source": "iana"
-  },
-  "image/vnd.sealed.png": {
-    "source": "iana"
-  },
-  "image/vnd.sealedmedia.softseal.gif": {
-    "source": "iana"
-  },
-  "image/vnd.sealedmedia.softseal.jpg": {
-    "source": "iana"
-  },
-  "image/vnd.svf": {
-    "source": "iana"
-  },
-  "image/vnd.tencent.tap": {
-    "source": "iana"
-  },
-  "image/vnd.valve.source.texture": {
-    "source": "iana"
-  },
-  "image/vnd.wap.wbmp": {
-    "source": "iana",
-    "extensions": ["wbmp"]
-  },
-  "image/vnd.xiff": {
-    "source": "iana",
-    "extensions": ["xif"]
-  },
-  "image/vnd.zbrush.pcx": {
-    "source": "iana"
-  },
-  "image/webp": {
-    "source": "apache",
-    "extensions": ["webp"]
-  },
-  "image/x-3ds": {
-    "source": "apache",
-    "extensions": ["3ds"]
-  },
-  "image/x-cmu-raster": {
-    "source": "apache",
-    "extensions": ["ras"]
-  },
-  "image/x-cmx": {
-    "source": "apache",
-    "extensions": ["cmx"]
-  },
-  "image/x-freehand": {
-    "source": "apache",
-    "extensions": ["fh","fhc","fh4","fh5","fh7"]
-  },
-  "image/x-icon": {
-    "source": "apache",
-    "compressible": true,
-    "extensions": ["ico"]
-  },
-  "image/x-jng": {
-    "source": "nginx",
-    "extensions": ["jng"]
-  },
-  "image/x-mrsid-image": {
-    "source": "apache",
-    "extensions": ["sid"]
-  },
-  "image/x-ms-bmp": {
-    "source": "nginx",
-    "compressible": true,
-    "extensions": ["bmp"]
-  },
-  "image/x-pcx": {
-    "source": "apache",
-    "extensions": ["pcx"]
-  },
-  "image/x-pict": {
-    "source": "apache",
-    "extensions": ["pic","pct"]
-  },
-  "image/x-portable-anymap": {
-    "source": "apache",
-    "extensions": ["pnm"]
-  },
-  "image/x-portable-bitmap": {
-    "source": "apache",
-    "extensions": ["pbm"]
-  },
-  "image/x-portable-graymap": {
-    "source": "apache",
-    "extensions": ["pgm"]
-  },
-  "image/x-portable-pixmap": {
-    "source": "apache",
-    "extensions": ["ppm"]
-  },
-  "image/x-rgb": {
-    "source": "apache",
-    "extensions": ["rgb"]
-  },
-  "image/x-tga": {
-    "source": "apache",
-    "extensions": ["tga"]
-  },
-  "image/x-xbitmap": {
-    "source": "apache",
-    "extensions": ["xbm"]
-  },
-  "image/x-xcf": {
-    "compressible": false
-  },
-  "image/x-xpixmap": {
-    "source": "apache",
-    "extensions": ["xpm"]
-  },
-  "image/x-xwindowdump": {
-    "source": "apache",
-    "extensions": ["xwd"]
-  },
-  "message/cpim": {
-    "source": "iana"
-  },
-  "message/delivery-status": {
-    "source": "iana"
-  },
-  "message/disposition-notification": {
-    "source": "iana"
-  },
-  "message/external-body": {
-    "source": "iana"
-  },
-  "message/feedback-report": {
-    "source": "iana"
-  },
-  "message/global": {
-    "source": "iana"
-  },
-  "message/global-delivery-status": {
-    "source": "iana"
-  },
-  "message/global-disposition-notification": {
-    "source": "iana"
-  },
-  "message/global-headers": {
-    "source": "iana"
-  },
-  "message/http": {
-    "source": "iana",
-    "compressible": false
-  },
-  "message/imdn+xml": {
-    "source": "iana",
-    "compressible": true
-  },
-  "message/news": {
-    "source": "iana"
-  },
-  "message/partial": {
-    "source": "iana",
-    "compressible": false
-  },
-  "message/rfc822": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["eml","mime"]
-  },
-  "message/s-http": {
-    "source": "iana"
-  },
-  "message/sip": {
-    "source": "iana"
-  },
-  "message/sipfrag": {
-    "source": "iana"
-  },
-  "message/tracking-status": {
-    "source": "iana"
-  },
-  "message/vnd.si.simp": {
-    "source": "iana"
-  },
-  "message/vnd.wfa.wsc": {
-    "source": "iana"
-  },
-  "model/iges": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["igs","iges"]
-  },
-  "model/mesh": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["msh","mesh","silo"]
-  },
-  "model/vnd.collada+xml": {
-    "source": "iana",
-    "extensions": ["dae"]
-  },
-  "model/vnd.dwf": {
-    "source": "iana",
-    "extensions": ["dwf"]
-  },
-  "model/vnd.flatland.3dml": {
-    "source": "iana"
-  },
-  "model/vnd.gdl": {
-    "source": "iana",
-    "extensions": ["gdl"]
-  },
-  "model/vnd.gs-gdl": {
-    "source": "apache"
-  },
-  "model/vnd.gs.gdl": {
-    "source": "iana"
-  },
-  "model/vnd.gtw": {
-    "source": "iana",
-    "extensions": ["gtw"]
-  },
-  "model/vnd.moml+xml": {
-    "source": "iana"
-  },
-  "model/vnd.mts": {
-    "source": "iana",
-    "extensions": ["mts"]
-  },
-  "model/vnd.opengex": {
-    "source": "iana"
-  },
-  "model/vnd.parasolid.transmit.binary": {
-    "source": "iana"
-  },
-  "model/vnd.parasolid.transmit.text": {
-    "source": "iana"
-  },
-  "model/vnd.rosette.annotated-data-model": {
-    "source": "iana"
-  },
-  "model/vnd.valve.source.compiled-map": {
-    "source": "iana"
-  },
-  "model/vnd.vtu": {
-    "source": "iana",
-    "extensions": ["vtu"]
-  },
-  "model/vrml": {
-    "source": "iana",
-    "compressible": false,
-    "extensions": ["wrl","vrml"]
-  },
-  "model/x3d+binary": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["x3db","x3dbz"]
-  },
-  "model/x3d+fastinfoset": {
-    "source": "iana"
-  },
-  "model/x3d+vrml": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["x3dv","x3dvz"]
-  },
-  "model/x3d+xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["x3d","x3dz"]
-  },
-  "model/x3d-vrml": {
-    "source": "iana"
-  },
-  "multipart/alternative": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/appledouble": {
-    "source": "iana"
-  },
-  "multipart/byteranges": {
-    "source": "iana"
-  },
-  "multipart/digest": {
-    "source": "iana"
-  },
-  "multipart/encrypted": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/form-data": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/header-set": {
-    "source": "iana"
-  },
-  "multipart/mixed": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/parallel": {
-    "source": "iana"
-  },
-  "multipart/related": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/report": {
-    "source": "iana"
-  },
-  "multipart/signed": {
-    "source": "iana",
-    "compressible": false
-  },
-  "multipart/voice-message": {
-    "source": "iana"
-  },
-  "multipart/x-mixed-replace": {
-    "source": "iana"
-  },
-  "text/1d-interleaved-parityfec": {
-    "source": "iana"
-  },
-  "text/cache-manifest": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["appcache","manifest"]
-  },
-  "text/calendar": {
-    "source": "iana",
-    "extensions": ["ics","ifb"]
-  },
-  "text/calender": {
-    "compressible": true
-  },
-  "text/cmd": {
-    "compressible": true
-  },
-  "text/coffeescript": {
-    "extensions": ["coffee","litcoffee"]
-  },
-  "text/css": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["css"]
-  },
-  "text/csv": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["csv"]
-  },
-  "text/csv-schema": {
-    "source": "iana"
-  },
-  "text/directory": {
-    "source": "iana"
-  },
-  "text/dns": {
-    "source": "iana"
-  },
-  "text/ecmascript": {
-    "source": "iana"
-  },
-  "text/encaprtp": {
-    "source": "iana"
-  },
-  "text/enriched": {
-    "source": "iana"
-  },
-  "text/fwdred": {
-    "source": "iana"
-  },
-  "text/grammar-ref-list": {
-    "source": "iana"
-  },
-  "text/hjson": {
-    "extensions": ["hjson"]
-  },
-  "text/html": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["html","htm","shtml"]
-  },
-  "text/jade": {
-    "extensions": ["jade"]
-  },
-  "text/javascript": {
-    "source": "iana",
-    "compressible": true
-  },
-  "text/jcr-cnd": {
-    "source": "iana"
-  },
-  "text/jsx": {
-    "compressible": true,
-    "extensions": ["jsx"]
-  },
-  "text/less": {
-    "extensions": ["less"]
-  },
-  "text/markdown": {
-    "source": "iana"
-  },
-  "text/mathml": {
-    "source": "nginx",
-    "extensions": ["mml"]
-  },
-  "text/mizar": {
-    "source": "iana"
-  },
-  "text/n3": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["n3"]
-  },
-  "text/parameters": {
-    "source": "iana"
-  },
-  "text/parityfec": {
-    "source": "iana"
-  },
-  "text/plain": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["txt","text","conf","def","list","log","in","ini"]
-  },
-  "text/provenance-notation": {
-    "source": "iana"
-  },
-  "text/prs.fallenstein.rst": {
-    "source": "iana"
-  },
-  "text/prs.lines.tag": {
-    "source": "iana",
-    "extensions": ["dsc"]
-  },
-  "text/prs.prop.logic": {
-    "source": "iana"
-  },
-  "text/raptorfec": {
-    "source": "iana"
-  },
-  "text/red": {
-    "source": "iana"
-  },
-  "text/rfc822-headers": {
-    "source": "iana"
-  },
-  "text/richtext": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["rtx"]
-  },
-  "text/rtf": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["rtf"]
-  },
-  "text/rtp-enc-aescm128": {
-    "source": "iana"
-  },
-  "text/rtploopback": {
-    "source": "iana"
-  },
-  "text/rtx": {
-    "source": "iana"
-  },
-  "text/sgml": {
-    "source": "iana",
-    "extensions": ["sgml","sgm"]
-  },
-  "text/slim": {
-    "extensions": ["slim","slm"]
-  },
-  "text/stylus": {
-    "extensions": ["stylus","styl"]
-  },
-  "text/t140": {
-    "source": "iana"
-  },
-  "text/tab-separated-values": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["tsv"]
-  },
-  "text/troff": {
-    "source": "iana",
-    "extensions": ["t","tr","roff","man","me","ms"]
-  },
-  "text/turtle": {
-    "source": "iana",
-    "extensions": ["ttl"]
-  },
-  "text/ulpfec": {
-    "source": "iana"
-  },
-  "text/uri-list": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["uri","uris","urls"]
-  },
-  "text/vcard": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["vcard"]
-  },
-  "text/vnd.a": {
-    "source": "iana"
-  },
-  "text/vnd.abc": {
-    "source": "iana"
-  },
-  "text/vnd.curl": {
-    "source": "iana",
-    "extensions": ["curl"]
-  },
-  "text/vnd.curl.dcurl": {
-    "source": "apache",
-    "extensions": ["dcurl"]
-  },
-  "text/vnd.curl.mcurl": {
-    "source": "apache",
-    "extensions": ["mcurl"]
-  },
-  "text/vnd.curl.scurl": {
-    "source": "apache",
-    "extensions": ["scurl"]
-  },
-  "text/vnd.debian.copyright": {
-    "source": "iana"
-  },
-  "text/vnd.dmclientscript": {
-    "source": "iana"
-  },
-  "text/vnd.dvb.subtitle": {
-    "source": "iana",
-    "extensions": ["sub"]
-  },
-  "text/vnd.esmertec.theme-descriptor": {
-    "source": "iana"
-  },
-  "text/vnd.fly": {
-    "source": "iana",
-    "extensions": ["fly"]
-  },
-  "text/vnd.fmi.flexstor": {
-    "source": "iana",
-    "extensions": ["flx"]
-  },
-  "text/vnd.graphviz": {
-    "source": "iana",
-    "extensions": ["gv"]
-  },
-  "text/vnd.in3d.3dml": {
-    "source": "iana",
-    "extensions": ["3dml"]
-  },
-  "text/vnd.in3d.spot": {
-    "source": "iana",
-    "extensions": ["spot"]
-  },
-  "text/vnd.iptc.newsml": {
-    "source": "iana"
-  },
-  "text/vnd.iptc.nitf": {
-    "source": "iana"
-  },
-  "text/vnd.latex-z": {
-    "source": "iana"
-  },
-  "text/vnd.motorola.reflex": {
-    "source": "iana"
-  },
-  "text/vnd.ms-mediapackage": {
-    "source": "iana"
-  },
-  "text/vnd.net2phone.commcenter.command": {
-    "source": "iana"
-  },
-  "text/vnd.radisys.msml-basic-layout": {
-    "source": "iana"
-  },
-  "text/vnd.si.uricatalogue": {
-    "source": "iana"
-  },
-  "text/vnd.sun.j2me.app-descriptor": {
-    "source": "iana",
-    "extensions": ["jad"]
-  },
-  "text/vnd.trolltech.linguist": {
-    "source": "iana"
-  },
-  "text/vnd.wap.si": {
-    "source": "iana"
-  },
-  "text/vnd.wap.sl": {
-    "source": "iana"
-  },
-  "text/vnd.wap.wml": {
-    "source": "iana",
-    "extensions": ["wml"]
-  },
-  "text/vnd.wap.wmlscript": {
-    "source": "iana",
-    "extensions": ["wmls"]
-  },
-  "text/vtt": {
-    "charset": "UTF-8",
-    "compressible": true,
-    "extensions": ["vtt"]
-  },
-  "text/x-asm": {
-    "source": "apache",
-    "extensions": ["s","asm"]
-  },
-  "text/x-c": {
-    "source": "apache",
-    "extensions": ["c","cc","cxx","cpp","h","hh","dic"]
-  },
-  "text/x-component": {
-    "source": "nginx",
-    "extensions": ["htc"]
-  },
-  "text/x-fortran": {
-    "source": "apache",
-    "extensions": ["f","for","f77","f90"]
-  },
-  "text/x-gwt-rpc": {
-    "compressible": true
-  },
-  "text/x-handlebars-template": {
-    "extensions": ["hbs"]
-  },
-  "text/x-java-source": {
-    "source": "apache",
-    "extensions": ["java"]
-  },
-  "text/x-jquery-tmpl": {
-    "compressible": true
-  },
-  "text/x-lua": {
-    "extensions": ["lua"]
-  },
-  "text/x-markdown": {
-    "compressible": true,
-    "extensions": ["markdown","md","mkd"]
-  },
-  "text/x-nfo": {
-    "source": "apache",
-    "extensions": ["nfo"]
-  },
-  "text/x-opml": {
-    "source": "apache",
-    "extensions": ["opml"]
-  },
-  "text/x-pascal": {
-    "source": "apache",
-    "extensions": ["p","pas"]
-  },
-  "text/x-processing": {
-    "compressible": true,
-    "extensions": ["pde"]
-  },
-  "text/x-sass": {
-    "extensions": ["sass"]
-  },
-  "text/x-scss": {
-    "extensions": ["scss"]
-  },
-  "text/x-setext": {
-    "source": "apache",
-    "extensions": ["etx"]
-  },
-  "text/x-sfv": {
-    "source": "apache",
-    "extensions": ["sfv"]
-  },
-  "text/x-suse-ymp": {
-    "compressible": true,
-    "extensions": ["ymp"]
-  },
-  "text/x-uuencode": {
-    "source": "apache",
-    "extensions": ["uu"]
-  },
-  "text/x-vcalendar": {
-    "source": "apache",
-    "extensions": ["vcs"]
-  },
-  "text/x-vcard": {
-    "source": "apache",
-    "extensions": ["vcf"]
-  },
-  "text/xml": {
-    "source": "iana",
-    "compressible": true,
-    "extensions": ["xml"]
-  },
-  "text/xml-external-parsed-entity": {
-    "source": "iana"
-  },
-  "text/yaml": {
-    "extensions": ["yaml","yml"]
-  },
-  "video/1d-interleaved-parityfec": {
-    "source": "apache"
-  },
-  "video/3gpp": {
-    "source": "apache",
-    "extensions": ["3gp","3gpp"]
-  },
-  "video/3gpp-tt": {
-    "source": "apache"
-  },
-  "video/3gpp2": {
-    "source": "apache",
-    "extensions": ["3g2"]
-  },
-  "video/bmpeg": {
-    "source": "apache"
-  },
-  "video/bt656": {
-    "source": "apache"
-  },
-  "video/celb": {
-    "source": "apache"
-  },
-  "video/dv": {
-    "source": "apache"
-  },
-  "video/encaprtp": {
-    "source": "apache"
-  },
-  "video/h261": {
-    "source": "apache",
-    "extensions": ["h261"]
-  },
-  "video/h263": {
-    "source": "apache",
-    "extensions": ["h263"]
-  },
-  "video/h263-1998": {
-    "source": "apache"
-  },
-  "video/h263-2000": {
-    "source": "apache"
-  },
-  "video/h264": {
-    "source": "apache",
-    "extensions": ["h264"]
-  },
-  "video/h264-rcdo": {
-    "source": "apache"
-  },
-  "video/h264-svc": {
-    "source": "apache"
-  },
-  "video/h265": {
-    "source": "apache"
-  },
-  "video/iso.segment": {
-    "source": "apache"
-  },
-  "video/jpeg": {
-    "source": "apache",
-    "extensions": ["jpgv"]
-  },
-  "video/jpeg2000": {
-    "source": "apache"
-  },
-  "video/jpm": {
-    "source": "apache",
-    "extensions": ["jpm","jpgm"]
-  },
-  "video/mj2": {
-    "source": "apache",
-    "extensions": ["mj2","mjp2"]
-  },
-  "video/mp1s": {
-    "source": "apache"
-  },
-  "video/mp2p": {
-    "source": "apache"
-  },
-  "video/mp2t": {
-    "source": "apache",
-    "extensions": ["ts"]
-  },
-  "video/mp4": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["mp4","mp4v","mpg4"]
-  },
-  "video/mp4v-es": {
-    "source": "apache"
-  },
-  "video/mpeg": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["mpeg","mpg","mpe","m1v","m2v"]
-  },
-  "video/mpeg4-generic": {
-    "source": "apache"
-  },
-  "video/mpv": {
-    "source": "apache"
-  },
-  "video/nv": {
-    "source": "apache"
-  },
-  "video/ogg": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["ogv"]
-  },
-  "video/parityfec": {
-    "source": "apache"
-  },
-  "video/pointer": {
-    "source": "apache"
-  },
-  "video/quicktime": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["qt","mov"]
-  },
-  "video/raptorfec": {
-    "source": "apache"
-  },
-  "video/raw": {
-    "source": "apache"
-  },
-  "video/rtp-enc-aescm128": {
-    "source": "apache"
-  },
-  "video/rtploopback": {
-    "source": "apache"
-  },
-  "video/rtx": {
-    "source": "apache"
-  },
-  "video/smpte292m": {
-    "source": "apache"
-  },
-  "video/ulpfec": {
-    "source": "apache"
-  },
-  "video/vc1": {
-    "source": "apache"
-  },
-  "video/vnd.cctv": {
-    "source": "apache"
-  },
-  "video/vnd.dece.hd": {
-    "source": "apache",
-    "extensions": ["uvh","uvvh"]
-  },
-  "video/vnd.dece.mobile": {
-    "source": "apache",
-    "extensions": ["uvm","uvvm"]
-  },
-  "video/vnd.dece.mp4": {
-    "source": "apache"
-  },
-  "video/vnd.dece.pd": {
-    "source": "apache",
-    "extensions": ["uvp","uvvp"]
-  },
-  "video/vnd.dece.sd": {
-    "source": "apache",
-    "extensions": ["uvs","uvvs"]
-  },
-  "video/vnd.dece.video": {
-    "source": "apache",
-    "extensions": ["uvv","uvvv"]
-  },
-  "video/vnd.directv.mpeg": {
-    "source": "apache"
-  },
-  "video/vnd.directv.mpeg-tts": {
-    "source": "apache"
-  },
-  "video/vnd.dlna.mpeg-tts": {
-    "source": "apache"
-  },
-  "video/vnd.dvb.file": {
-    "source": "apache",
-    "extensions": ["dvb"]
-  },
-  "video/vnd.fvt": {
-    "source": "apache",
-    "extensions": ["fvt"]
-  },
-  "video/vnd.hns.video": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.1dparityfec-1010": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.1dparityfec-2005": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.2dparityfec-1010": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.2dparityfec-2005": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.ttsavc": {
-    "source": "apache"
-  },
-  "video/vnd.iptvforum.ttsmpeg2": {
-    "source": "apache"
-  },
-  "video/vnd.motorola.video": {
-    "source": "apache"
-  },
-  "video/vnd.motorola.videop": {
-    "source": "apache"
-  },
-  "video/vnd.mpegurl": {
-    "source": "apache",
-    "extensions": ["mxu","m4u"]
-  },
-  "video/vnd.ms-playready.media.pyv": {
-    "source": "apache",
-    "extensions": ["pyv"]
-  },
-  "video/vnd.nokia.interleaved-multimedia": {
-    "source": "apache"
-  },
-  "video/vnd.nokia.videovoip": {
-    "source": "apache"
-  },
-  "video/vnd.objectvideo": {
-    "source": "apache"
-  },
-  "video/vnd.radgamettools.bink": {
-    "source": "apache"
-  },
-  "video/vnd.radgamettools.smacker": {
-    "source": "apache"
-  },
-  "video/vnd.sealed.mpeg1": {
-    "source": "apache"
-  },
-  "video/vnd.sealed.mpeg4": {
-    "source": "apache"
-  },
-  "video/vnd.sealed.swf": {
-    "source": "apache"
-  },
-  "video/vnd.sealedmedia.softseal.mov": {
-    "source": "apache"
-  },
-  "video/vnd.uvvu.mp4": {
-    "source": "apache",
-    "extensions": ["uvu","uvvu"]
-  },
-  "video/vnd.vivo": {
-    "source": "apache",
-    "extensions": ["viv"]
-  },
-  "video/vp8": {
-    "source": "apache"
-  },
-  "video/webm": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["webm"]
-  },
-  "video/x-f4v": {
-    "source": "apache",
-    "extensions": ["f4v"]
-  },
-  "video/x-fli": {
-    "source": "apache",
-    "extensions": ["fli"]
-  },
-  "video/x-flv": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["flv"]
-  },
-  "video/x-m4v": {
-    "source": "apache",
-    "extensions": ["m4v"]
-  },
-  "video/x-matroska": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["mkv","mk3d","mks"]
-  },
-  "video/x-mng": {
-    "source": "apache",
-    "extensions": ["mng"]
-  },
-  "video/x-ms-asf": {
-    "source": "apache",
-    "extensions": ["asf","asx"]
-  },
-  "video/x-ms-vob": {
-    "source": "apache",
-    "extensions": ["vob"]
-  },
-  "video/x-ms-wm": {
-    "source": "apache",
-    "extensions": ["wm"]
-  },
-  "video/x-ms-wmv": {
-    "source": "apache",
-    "compressible": false,
-    "extensions": ["wmv"]
-  },
-  "video/x-ms-wmx": {
-    "source": "apache",
-    "extensions": ["wmx"]
-  },
-  "video/x-ms-wvx": {
-    "source": "apache",
-    "extensions": ["wvx"]
-  },
-  "video/x-msvideo": {
-    "source": "apache",
-    "extensions": ["avi"]
-  },
-  "video/x-sgi-movie": {
-    "source": "apache",
-    "extensions": ["movie"]
-  },
-  "video/x-smv": {
-    "source": "apache",
-    "extensions": ["smv"]
-  },
-  "x-conference/x-cooltalk": {
-    "source": "apache",
-    "extensions": ["ice"]
-  },
-  "x-shader/x-fragment": {
-    "compressible": true
-  },
-  "x-shader/x-vertex": {
-    "compressible": true
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js
deleted file mode 100644
index 551031f690b5ca9f58c2cebc8c4f4a198e4c68f5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/*!
- * mime-db
- * Copyright(c) 2014 Jonathan Ong
- * MIT Licensed
- */
-
-/**
- * Module exports.
- */
-
-module.exports = require('./db.json')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json
deleted file mode 100644
index 2d76951a7b1a27d181cdaf1f45cc34ede9d44046..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/node_modules/mime-db/package.json
+++ /dev/null
@@ -1,107 +0,0 @@
-{
-  "_from": "mime-db@>=1.23.0 <1.24.0",
-  "_id": "mime-db@1.23.0",
-  "_location": "/serialport/node-pre-gyp/request/mime-types/mime-db",
-  "_nodeVersion": "4.4.3",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/mime-db-1.23.0.tgz_1462163798086_0.43938886746764183"
-  },
-  "_npmUser": {
-    "email": "doug@somethingdoug.com",
-    "name": "dougwilson"
-  },
-  "_npmVersion": "2.15.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request/mime-types"
-  ],
-  "_resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz",
-  "_shasum": "a31b4070adaea27d732ea333740a64d0ec9a6659",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/jshttp/mime-db/issues"
-  },
-  "contributors": [
-    {
-      "name": "Douglas Christopher Wilson",
-      "email": "doug@somethingdoug.com"
-    },
-    {
-      "name": "Jonathan Ong",
-      "email": "me@jongleberry.com",
-      "url": "http://jongleberry.com"
-    },
-    {
-      "name": "Robert Kieffer",
-      "email": "robert@broofa.com",
-      "url": "http://github.com/broofa"
-    }
-  ],
-  "dependencies": {},
-  "description": "Media Type Database",
-  "devDependencies": {
-    "bluebird": "3.3.5",
-    "co": "4.6.0",
-    "cogent": "1.0.1",
-    "csv-parse": "1.1.0",
-    "gnode": "0.1.2",
-    "istanbul": "0.4.3",
-    "mocha": "1.21.5",
-    "raw-body": "2.1.6",
-    "stream-to-array": "2.3.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "a31b4070adaea27d732ea333740a64d0ec9a6659",
-    "tarball": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz"
-  },
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "files": [
-    "HISTORY.md",
-    "LICENSE",
-    "README.md",
-    "db.json",
-    "index.js"
-  ],
-  "gitHead": "ba0d99fd05b3bfdc2ebcd78f858c25cb7db6af41",
-  "homepage": "https://github.com/jshttp/mime-db#readme",
-  "keywords": [
-    "charset",
-    "charsets",
-    "database",
-    "db",
-    "mime",
-    "type",
-    "types"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "dougwilson",
-      "email": "doug@somethingdoug.com"
-    },
-    {
-      "name": "jongleberry",
-      "email": "jonathanrichardong@gmail.com"
-    }
-  ],
-  "name": "mime-db",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/jshttp/mime-db.git"
-  },
-  "scripts": {
-    "build": "node scripts/build",
-    "fetch": "gnode scripts/fetch-apache && gnode scripts/fetch-iana && gnode scripts/fetch-nginx",
-    "test": "mocha --reporter spec --bail --check-leaks test/",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
-    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/",
-    "update": "npm run fetch && npm run build"
-  },
-  "version": "1.23.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/package.json
deleted file mode 100644
index 68e08ce24029e4a263499becff2ba42d1910abdf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/mime-types/package.json
+++ /dev/null
@@ -1,97 +0,0 @@
-{
-  "_from": "mime-types@>=2.1.7 <2.2.0",
-  "_id": "mime-types@2.1.11",
-  "_location": "/serialport/node-pre-gyp/request/mime-types",
-  "_nodeVersion": "4.4.3",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/mime-types-2.1.11.tgz_1462165365027_0.7217204745393246"
-  },
-  "_npmUser": {
-    "email": "doug@somethingdoug.com",
-    "name": "dougwilson"
-  },
-  "_npmVersion": "2.15.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request",
-    "/serialport/node-pre-gyp/request/form-data"
-  ],
-  "_resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz",
-  "_shasum": "c259c471bda808a85d6cd193b430a5fae4473b3c",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/jshttp/mime-types/issues"
-  },
-  "contributors": [
-    {
-      "name": "Douglas Christopher Wilson",
-      "email": "doug@somethingdoug.com"
-    },
-    {
-      "name": "Jeremiah Senkpiel",
-      "email": "fishrock123@rocketmail.com",
-      "url": "https://searchbeam.jit.su"
-    },
-    {
-      "name": "Jonathan Ong",
-      "email": "me@jongleberry.com",
-      "url": "http://jongleberry.com"
-    }
-  ],
-  "dependencies": {
-    "mime-db": "~1.23.0"
-  },
-  "description": "The ultimate javascript content-type utility.",
-  "devDependencies": {
-    "istanbul": "0.4.3",
-    "mocha": "1.21.5"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "c259c471bda808a85d6cd193b430a5fae4473b3c",
-    "tarball": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz"
-  },
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "files": [
-    "HISTORY.md",
-    "LICENSE",
-    "index.js"
-  ],
-  "gitHead": "298ffcf490a5d6e60edea7bf7a69036df04846b1",
-  "homepage": "https://github.com/jshttp/mime-types#readme",
-  "keywords": [
-    "mime",
-    "types"
-  ],
-  "license": "MIT",
-  "maintainers": [
-    {
-      "name": "dougwilson",
-      "email": "doug@somethingdoug.com"
-    },
-    {
-      "name": "fishrock123",
-      "email": "fishrock123@rocketmail.com"
-    },
-    {
-      "name": "jongleberry",
-      "email": "jonathanrichardong@gmail.com"
-    }
-  ],
-  "name": "mime-types",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/jshttp/mime-types.git"
-  },
-  "scripts": {
-    "test": "mocha --reporter spec test/test.js",
-    "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot test/test.js",
-    "test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot test/test.js"
-  },
-  "version": "2.1.11"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/.npmignore
deleted file mode 100644
index 8886139386e5dae9af569eb9f50cb56a39a16f5b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/.npmignore
+++ /dev/null
@@ -1,4 +0,0 @@
-node_modules
-.DS_Store
-.nyc_output
-coverage
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/LICENSE.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/LICENSE.md
deleted file mode 100644
index 652609b37e009ceef1ee234dd648f384594346cb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/LICENSE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c)  2010-2012 Robert Kieffer 
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/README.md
deleted file mode 100644
index 5cd855508773311ad7d7860e35ca74b8e08995d0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/README.md
+++ /dev/null
@@ -1,254 +0,0 @@
-# node-uuid
-
-Simple, fast generation of [RFC4122](http://www.ietf.org/rfc/rfc4122.txt) UUIDS.
-
-Features:
-
-* Generate RFC4122 version 1 or version 4 UUIDs
-* Runs in node.js and all browsers.
-* Registered as a [ComponentJS](https://github.com/component/component) [component](https://github.com/component/component/wiki/Components) ('broofa/node-uuid').
-* Cryptographically strong random # generation
-  * `crypto.randomBytes(n)` in node.js
-  * `window.crypto.getRandomValues(ta)` in [supported browsers](https://developer.mozilla.org/en-US/docs/Web/API/RandomSource/getRandomValues#Browser_Compatibility)
-* 1.1K minified and gzip'ed  (Want something smaller?  Check this [crazy shit](https://gist.github.com/982883) out! )
-* [Annotated source code](http://broofa.github.com/node-uuid/docs/uuid.html)
-* Comes with a Command Line Interface for generating uuids on the command line
-
-## Getting Started
-
-Install it in your browser:
-
-```html
-<script src="uuid.js"></script>
-```
-
-Or in node.js:
-
-```
-npm install node-uuid
-```
-
-```javascript
-var uuid = require('node-uuid');
-```
-
-Then create some ids ...
-
-```javascript
-// Generate a v1 (time-based) id
-uuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'
-
-// Generate a v4 (random) id
-uuid.v4(); // -> '110ec58a-a0f2-4ac4-8393-c866d813b8d1'
-```
-
-## API
-
-### uuid.v1([`options` [, `buffer` [, `offset`]]])
-
-Generate and return a RFC4122 v1 (timestamp-based) UUID.
-
-* `options` - (Object) Optional uuid state to apply. Properties may include:
-
-  * `node` - (Array) Node id as Array of 6 bytes (per 4.1.6). Default: Randomly generated ID.  See note 1.
-  * `clockseq` - (Number between 0 - 0x3fff) RFC clock sequence.  Default: An internally maintained clockseq is used.
-  * `msecs` - (Number | Date) Time in milliseconds since unix Epoch.  Default: The current time is used.
-  * `nsecs` - (Number between 0-9999) additional time, in 100-nanosecond units. Ignored if `msecs` is unspecified. Default: internal uuid counter is used, as per 4.2.1.2.
-
-* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written.
-* `offset` - (Number) Starting index in `buffer` at which to begin writing.
-
-Returns `buffer`, if specified, otherwise the string form of the UUID
-
-Notes:
-
-1. The randomly generated node id is only guaranteed to stay constant for the lifetime of the current JS runtime. (Future versions of this module may use persistent storage mechanisms to extend this guarantee.)
-
-Example: Generate string UUID with fully-specified options
-
-```javascript
-uuid.v1({
-  node: [0x01, 0x23, 0x45, 0x67, 0x89, 0xab],
-  clockseq: 0x1234,
-  msecs: new Date('2011-11-01').getTime(),
-  nsecs: 5678
-});   // -> "710b962e-041c-11e1-9234-0123456789ab"
-```
-
-Example: In-place generation of two binary IDs
-
-```javascript
-// Generate two ids in an array
-var arr = new Array(32); // -> []
-uuid.v1(null, arr, 0);   // -> [02 a2 ce 90 14 32 11 e1 85 58 0b 48 8e 4f c1 15]
-uuid.v1(null, arr, 16);  // -> [02 a2 ce 90 14 32 11 e1 85 58 0b 48 8e 4f c1 15 02 a3 1c b0 14 32 11 e1 85 58 0b 48 8e 4f c1 15]
-
-// Optionally use uuid.unparse() to get stringify the ids
-uuid.unparse(buffer);    // -> '02a2ce90-1432-11e1-8558-0b488e4fc115'
-uuid.unparse(buffer, 16) // -> '02a31cb0-1432-11e1-8558-0b488e4fc115'
-```
-
-### uuid.v4([`options` [, `buffer` [, `offset`]]])
-
-Generate and return a RFC4122 v4 UUID.
-
-* `options` - (Object) Optional uuid state to apply. Properties may include:
-
-  * `random` - (Number[16]) Array of 16 numbers (0-255) to use in place of randomly generated values
-  * `rng` - (Function) Random # generator to use.  Set to one of the built-in generators - `uuid.mathRNG` (all platforms), `uuid.nodeRNG` (node.js only), `uuid.whatwgRNG` (WebKit only) - or a custom function that returns an array[16] of byte values.
-
-* `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written.
-* `offset` - (Number) Starting index in `buffer` at which to begin writing.
-
-Returns `buffer`, if specified, otherwise the string form of the UUID
-
-Example: Generate string UUID with fully-specified options
-
-```javascript
-uuid.v4({
-  random: [
-    0x10, 0x91, 0x56, 0xbe, 0xc4, 0xfb, 0xc1, 0xea,
-    0x71, 0xb4, 0xef, 0xe1, 0x67, 0x1c, 0x58, 0x36
-  ]
-});
-// -> "109156be-c4fb-41ea-b1b4-efe1671c5836"
-```
-
-Example: Generate two IDs in a single buffer
-
-```javascript
-var buffer = new Array(32); // (or 'new Buffer' in node.js)
-uuid.v4(null, buffer, 0);
-uuid.v4(null, buffer, 16);
-```
-
-### uuid.parse(id[, buffer[, offset]])
-### uuid.unparse(buffer[, offset])
-
-Parse and unparse UUIDs
-
-  * `id` - (String) UUID(-like) string
-  * `buffer` - (Array | Buffer) Array or buffer where UUID bytes are to be written. Default: A new Array or Buffer is used
-  * `offset` - (Number) Starting index in `buffer` at which to begin writing. Default: 0
-
-Example parsing and unparsing a UUID string
-
-```javascript
-var bytes = uuid.parse('797ff043-11eb-11e1-80d6-510998755d10'); // -> <Buffer 79 7f f0 43 11 eb 11 e1 80 d6 51 09 98 75 5d 10>
-var string = uuid.unparse(bytes); // -> '797ff043-11eb-11e1-80d6-510998755d10'
-```
-
-### uuid.noConflict()
-
-(Browsers only) Set `uuid` property back to it's previous value.
-
-Returns the node-uuid object.
-
-Example:
-
-```javascript
-var myUuid = uuid.noConflict();
-myUuid.v1(); // -> '6c84fb90-12c4-11e1-840d-7b25c5ee775a'
-```
-
-## Deprecated APIs
-
-Support for the following v1.2 APIs is available in v1.3, but is deprecated and will be removed in the next major version.
-
-### uuid([format [, buffer [, offset]]])
-
-uuid() has become uuid.v4(), and the `format` argument is now implicit in the `buffer` argument. (i.e. if you specify a buffer, the format is assumed to be binary).
-
-### uuid.BufferClass
-
-The class of container created when generating binary uuid data if no buffer argument is specified.  This is expected to go away, with no replacement API.
-
-## Command Line Interface
-
-To use the executable, it's probably best to install this library globally.
-
-`npm install -g node-uuid`
-
-Usage:
-
-```
-USAGE: uuid [version] [options]
-
-
-options:
-
---help                     Display this message and exit
-```
-
-`version` must be an RFC4122 version that is supported by this library, which is currently version 1 and version 4 (denoted by "v1" and "v4", respectively). `version` defaults to version 4 when not supplied.
-
-### Examples
-
-```
-> uuid
-3a91f950-dec8-4688-ba14-5b7bbfc7a563
-```
-
-```
-> uuid v1
-9d0b43e0-7696-11e3-964b-250efa37a98e
-```
-
-```
-> uuid v4
-6790ac7c-24ac-4f98-8464-42f6d98a53ae
-```
-
-## Testing
-
-In node.js
-
-```
-npm test
-```
-
-In Browser
-
-```
-open test/test.html
-```
-
-### Benchmarking
-
-Requires node.js
-
-```
-npm install uuid uuid-js
-node benchmark/benchmark.js
-```
-
-For a more complete discussion of node-uuid performance, please see the `benchmark/README.md` file, and the [benchmark wiki](https://github.com/broofa/node-uuid/wiki/Benchmark)
-
-For browser performance [checkout the JSPerf tests](http://jsperf.com/node-uuid-performance).
-
-## Release notes
-
-### 1.4.6
-
-* Properly detect node crypto and whatwg crypto
-* Workaround phantomjs/browserify bug
-* Explicit check for `window` rather implicit this-global
-* Issue warning if Math.random() is being used
-* "use strict";
-* A few jshint / stylistic updates (=== and such)
-
-### 1.4.0
-
-* Improved module context detection
-* Removed public RNG functions
-
-### 1.3.2
-
-* Improve tests and handling of v1() options (Issue #24)
-* Expose RNG option to allow for perf testing with different generators
-
-### 1.3.0
-
-* Support for version 1 ids, thanks to [@ctavan](https://github.com/ctavan)!
-* Support for node.js crypto API
-* De-emphasizing performance in favor of a) cryptographic quality PRNGs where available and b) more manageable code
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/README.md
deleted file mode 100644
index aaeb2ea0132f95b608ae9f4b62b7e7a214f88c49..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# node-uuid Benchmarks
-
-### Results
-
-To see the results of our benchmarks visit https://github.com/broofa/node-uuid/wiki/Benchmark
-
-### Run them yourself
-
-node-uuid comes with some benchmarks to measure performance of generating UUIDs. These can be run using node.js. node-uuid is being benchmarked against some other uuid modules, that are available through npm namely `uuid` and `uuid-js`.
-
-To prepare and run the benchmark issue;
-
-```
-npm install uuid uuid-js
-node benchmark/benchmark.js
-```
-
-You'll see an output like this one:
-
-```
-# v4
-nodeuuid.v4(): 854700 uuids/second
-nodeuuid.v4('binary'): 788643 uuids/second
-nodeuuid.v4('binary', buffer): 1336898 uuids/second
-uuid(): 479386 uuids/second
-uuid('binary'): 582072 uuids/second
-uuidjs.create(4): 312304 uuids/second
-
-# v1
-nodeuuid.v1(): 938086 uuids/second
-nodeuuid.v1('binary'): 683060 uuids/second
-nodeuuid.v1('binary', buffer): 1644736 uuids/second
-uuidjs.create(1): 190621 uuids/second
-```
-
-* The `uuid()` entries are for Nikhil Marathe's [uuid module](https://bitbucket.org/nikhilm/uuidjs) which is a wrapper around the native libuuid library.
-* The `uuidjs()` entries are for Patrick Negri's [uuid-js module](https://github.com/pnegri/uuid-js) which is a pure javascript implementation based on [UUID.js](https://github.com/LiosK/UUID.js) by LiosK.
-
-If you want to get more reliable results you can run the benchmark multiple times and write the output into a log file:
-
-```
-for i in {0..9}; do node benchmark/benchmark.js >> benchmark/bench_0.4.12.log; done;
-```
-
-If you're interested in how performance varies between different node versions, you can issue the above command multiple times.
-
-You can then use the shell script `bench.sh` provided in this directory to calculate the averages over all benchmark runs and draw a nice plot:
-
-```
-(cd benchmark/ && ./bench.sh)
-```
-
-This assumes you have [gnuplot](http://www.gnuplot.info/) and [ImageMagick](http://www.imagemagick.org/) installed. You'll find a nice `bench.png` graph in the `benchmark/` directory then.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu
deleted file mode 100644
index a342fbbe04e9ac93a59a2de4080000e18c8cdb16..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.gnu
+++ /dev/null
@@ -1,174 +0,0 @@
-#!/opt/local/bin/gnuplot -persist
-#
-#    
-#    	G N U P L O T
-#    	Version 4.4 patchlevel 3
-#    	last modified March 2011
-#    	System: Darwin 10.8.0
-#    
-#    	Copyright (C) 1986-1993, 1998, 2004, 2007-2010
-#    	Thomas Williams, Colin Kelley and many others
-#    
-#    	gnuplot home:     http://www.gnuplot.info
-#    	faq, bugs, etc:   type "help seeking-assistance"
-#    	immediate help:   type "help"
-#    	plot window:      hit 'h'
-set terminal postscript eps noenhanced defaultplex \
- leveldefault color colortext \
- solid linewidth 1.2 butt noclip \
- palfuncparam 2000,0.003 \
- "Helvetica" 14 
-set output 'bench.eps'
-unset clip points
-set clip one
-unset clip two
-set bar 1.000000 front
-set border 31 front linetype -1 linewidth 1.000
-set xdata
-set ydata
-set zdata
-set x2data
-set y2data
-set timefmt x "%d/%m/%y,%H:%M"
-set timefmt y "%d/%m/%y,%H:%M"
-set timefmt z "%d/%m/%y,%H:%M"
-set timefmt x2 "%d/%m/%y,%H:%M"
-set timefmt y2 "%d/%m/%y,%H:%M"
-set timefmt cb "%d/%m/%y,%H:%M"
-set boxwidth
-set style fill  empty border
-set style rectangle back fc lt -3 fillstyle   solid 1.00 border lt -1
-set style circle radius graph 0.02, first 0, 0 
-set dummy x,y
-set format x "% g"
-set format y "% g"
-set format x2 "% g"
-set format y2 "% g"
-set format z "% g"
-set format cb "% g"
-set angles radians
-unset grid
-set key title ""
-set key outside left top horizontal Right noreverse enhanced autotitles columnhead nobox
-set key noinvert samplen 4 spacing 1 width 0 height 0 
-set key maxcolumns 2 maxrows 0
-unset label
-unset arrow
-set style increment default
-unset style line
-set style line 1  linetype 1 linewidth 2.000 pointtype 1 pointsize default pointinterval 0
-unset style arrow
-set style histogram clustered gap 2 title  offset character 0, 0, 0
-unset logscale
-set offsets graph 0.05, 0.15, 0, 0
-set pointsize 1.5
-set pointintervalbox 1
-set encoding default
-unset polar
-unset parametric
-unset decimalsign
-set view 60, 30, 1, 1
-set samples 100, 100
-set isosamples 10, 10
-set surface
-unset contour
-set clabel '%8.3g'
-set mapping cartesian
-set datafile separator whitespace
-unset hidden3d
-set cntrparam order 4
-set cntrparam linear
-set cntrparam levels auto 5
-set cntrparam points 5
-set size ratio 0 1,1
-set origin 0,0
-set style data points
-set style function lines
-set xzeroaxis linetype -2 linewidth 1.000
-set yzeroaxis linetype -2 linewidth 1.000
-set zzeroaxis linetype -2 linewidth 1.000
-set x2zeroaxis linetype -2 linewidth 1.000
-set y2zeroaxis linetype -2 linewidth 1.000
-set ticslevel 0.5
-set mxtics default
-set mytics default
-set mztics default
-set mx2tics default
-set my2tics default
-set mcbtics default
-set xtics border in scale 1,0.5 mirror norotate  offset character 0, 0, 0
-set xtics  norangelimit
-set xtics   ()
-set ytics border in scale 1,0.5 mirror norotate  offset character 0, 0, 0
-set ytics autofreq  norangelimit
-set ztics border in scale 1,0.5 nomirror norotate  offset character 0, 0, 0
-set ztics autofreq  norangelimit
-set nox2tics
-set noy2tics
-set cbtics border in scale 1,0.5 mirror norotate  offset character 0, 0, 0
-set cbtics autofreq  norangelimit
-set title "" 
-set title  offset character 0, 0, 0 font "" norotate
-set timestamp bottom 
-set timestamp "" 
-set timestamp  offset character 0, 0, 0 font "" norotate
-set rrange [ * : * ] noreverse nowriteback  # (currently [8.98847e+307:-8.98847e+307] )
-set autoscale rfixmin
-set autoscale rfixmax
-set trange [ * : * ] noreverse nowriteback  # (currently [-5.00000:5.00000] )
-set autoscale tfixmin
-set autoscale tfixmax
-set urange [ * : * ] noreverse nowriteback  # (currently [-10.0000:10.0000] )
-set autoscale ufixmin
-set autoscale ufixmax
-set vrange [ * : * ] noreverse nowriteback  # (currently [-10.0000:10.0000] )
-set autoscale vfixmin
-set autoscale vfixmax
-set xlabel "" 
-set xlabel  offset character 0, 0, 0 font "" textcolor lt -1 norotate
-set x2label "" 
-set x2label  offset character 0, 0, 0 font "" textcolor lt -1 norotate
-set xrange [ * : * ] noreverse nowriteback  # (currently [-0.150000:3.15000] )
-set autoscale xfixmin
-set autoscale xfixmax
-set x2range [ * : * ] noreverse nowriteback  # (currently [0.00000:3.00000] )
-set autoscale x2fixmin
-set autoscale x2fixmax
-set ylabel "" 
-set ylabel  offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270
-set y2label "" 
-set y2label  offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270
-set yrange [ 0.00000 : 1.90000e+06 ] noreverse nowriteback  # (currently [:] )
-set autoscale yfixmin
-set autoscale yfixmax
-set y2range [ * : * ] noreverse nowriteback  # (currently [0.00000:1.90000e+06] )
-set autoscale y2fixmin
-set autoscale y2fixmax
-set zlabel "" 
-set zlabel  offset character 0, 0, 0 font "" textcolor lt -1 norotate
-set zrange [ * : * ] noreverse nowriteback  # (currently [-10.0000:10.0000] )
-set autoscale zfixmin
-set autoscale zfixmax
-set cblabel "" 
-set cblabel  offset character 0, 0, 0 font "" textcolor lt -1 rotate by -270
-set cbrange [ * : * ] noreverse nowriteback  # (currently [8.98847e+307:-8.98847e+307] )
-set autoscale cbfixmin
-set autoscale cbfixmax
-set zero 1e-08
-set lmargin  -1
-set bmargin  -1
-set rmargin  -1
-set tmargin  -1
-set pm3d explicit at s
-set pm3d scansautomatic
-set pm3d interpolate 1,1 flush begin noftriangles nohidden3d corners2color mean
-set palette positive nops_allcF maxcolors 0 gamma 1.5 color model RGB 
-set palette rgbformulae 7, 5, 15
-set colorbox default
-set colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.05, 0.6, 0 front bdefault
-set loadpath 
-set fontpath 
-set fit noerrorvariables
-GNUTERM = "aqua"
-plot 'bench_results.txt' using 2:xticlabel(1) w lp lw 2, '' using 3:xticlabel(1) w lp lw 2, '' using 4:xticlabel(1) w lp lw 2, '' using 5:xticlabel(1) w lp lw 2, '' using 6:xticlabel(1) w lp lw 2, '' using 7:xticlabel(1) w lp lw 2, '' using 8:xticlabel(1) w lp lw 2, '' using 9:xticlabel(1) w lp lw 2
-#    EOF
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.sh b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.sh
deleted file mode 100755
index d870a0cb098b15b2408889365a1c032451ac79b7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/bench.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/bash
-
-# for a given node version run:
-# for i in {0..9}; do node benchmark.js >> bench_0.6.2.log; done;
-
-PATTERNS=('nodeuuid.v1()' "nodeuuid.v1('binary'," 'nodeuuid.v4()' "nodeuuid.v4('binary'," "uuid()" "uuid('binary')" 'uuidjs.create(1)' 'uuidjs.create(4)' '140byte')
-FILES=(node_uuid_v1_string node_uuid_v1_buf node_uuid_v4_string node_uuid_v4_buf libuuid_v4_string libuuid_v4_binary uuidjs_v1_string uuidjs_v4_string 140byte_es)
-INDICES=(2 3 2 3 2 2 2 2 2)
-VERSIONS=$( ls bench_*.log | sed -e 's/^bench_\([0-9\.]*\)\.log/\1/' | tr "\\n" " " )
-TMPJOIN="tmp_join"
-OUTPUT="bench_results.txt"
-
-for I in ${!FILES[*]}; do
-  F=${FILES[$I]}
-  P=${PATTERNS[$I]}
-  INDEX=${INDICES[$I]}
-  echo "version $F" > $F
-  for V in $VERSIONS; do
-    (VAL=$( grep "$P" bench_$V.log | LC_ALL=en_US awk '{ sum += $'$INDEX' } END { print sum/NR }' ); echo $V $VAL) >> $F
-  done
-  if [ $I == 0 ]; then
-    cat $F > $TMPJOIN
-  else
-    join $TMPJOIN $F > $OUTPUT
-    cp $OUTPUT $TMPJOIN
-  fi
-  rm $F
-done
-
-rm $TMPJOIN
-
-gnuplot bench.gnu
-convert -density 200 -resize 800x560 -flatten bench.eps bench.png
-rm bench.eps
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c
deleted file mode 100644
index dbfc75f6d71778edde68642ac660ee3ec35a0ac9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark-native.c
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
-Test performance of native C UUID generation
-
-To Compile: cc -luuid benchmark-native.c -o benchmark-native
-*/
-
-#include <stdio.h>
-#include <unistd.h>
-#include <sys/time.h>
-#include <uuid/uuid.h>
-
-int main() {
-  uuid_t myid;
-  char buf[36+1];
-  int i;
-  struct timeval t;
-  double start, finish;
-
-  gettimeofday(&t, NULL);
-  start = t.tv_sec + t.tv_usec/1e6;
-
-  int n = 2e5;
-  for (i = 0; i < n; i++) {
-    uuid_generate(myid);
-    uuid_unparse(myid, buf);
-  }
-
-  gettimeofday(&t, NULL);
-  finish = t.tv_sec + t.tv_usec/1e6;
-  double dur = finish - start;
-
-  printf("%d uuids/sec", (int)(n/dur));
-  return 0;
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js
deleted file mode 100644
index 40e6efbe762c1ec43f828b6d4212ef860fce5c3a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/benchmark/benchmark.js
+++ /dev/null
@@ -1,84 +0,0 @@
-try {
-  var nodeuuid = require('../uuid');
-} catch (e) {
-  console.error('node-uuid require failed - skipping tests');
-}
-
-try {
-  var uuid = require('uuid');
-} catch (e) {
-  console.error('uuid require failed - skipping tests');
-}
-
-try {
-  var uuidjs = require('uuid-js');
-} catch (e) {
-  console.error('uuid-js require failed - skipping tests');
-}
-
-var N = 5e5;
-
-function rate(msg, t) {
-  console.log(msg + ': ' +
-    (N / (Date.now() - t) * 1e3 | 0) +
-    ' uuids/second');
-}
-
-console.log('# v4');
-
-// node-uuid - string form
-if (nodeuuid) {
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4();
-  rate('nodeuuid.v4() - using node.js crypto RNG', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4({rng: nodeuuid.mathRNG});
-  rate('nodeuuid.v4() - using Math.random() RNG', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4('binary');
-  rate('nodeuuid.v4(\'binary\')', t);
-
-  var buffer = new nodeuuid.BufferClass(16);
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v4('binary', buffer);
-  rate('nodeuuid.v4(\'binary\', buffer)', t);
-}
-
-// libuuid - string form
-if (uuid) {
-  for (var i = 0, t = Date.now(); i < N; i++) uuid();
-  rate('uuid()', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) uuid('binary');
-  rate('uuid(\'binary\')', t);
-}
-
-// uuid-js - string form
-if (uuidjs) {
-  for (var i = 0, t = Date.now(); i < N; i++) uuidjs.create(4);
-  rate('uuidjs.create(4)', t);
-}
-
-// 140byte.es
-for (var i = 0, t = Date.now(); i < N; i++) 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(s,r){r=Math.random()*16|0;return (s=='x'?r:r&0x3|0x8).toString(16)});
-rate('140byte.es_v4', t);
-
-console.log('');
-console.log('# v1');
-
-// node-uuid - v1 string form
-if (nodeuuid) {
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1();
-  rate('nodeuuid.v1()', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1('binary');
-  rate('nodeuuid.v1(\'binary\')', t);
-
-  var buffer = new nodeuuid.BufferClass(16);
-  for (var i = 0, t = Date.now(); i < N; i++) nodeuuid.v1('binary', buffer);
-  rate('nodeuuid.v1(\'binary\', buffer)', t);
-}
-
-// uuid-js - v1 string form
-if (uuidjs) {
-  for (var i = 0, t = Date.now(); i < N; i++) uuidjs.create(1);
-  rate('uuidjs.create(1)', t);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/bin/uuid b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/bin/uuid
deleted file mode 100755
index f732e9918e00b48462723a3a423d1b2519faa745..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/bin/uuid
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env node
-
-var path = require('path');
-var uuid = require(path.join(__dirname, '..'));
-
-var arg = process.argv[2];
-
-if ('--help' === arg) {
-  console.log('\n  USAGE: uuid [version] [options]\n\n');
-  console.log('  options:\n');
-  console.log('  --help                     Display this message and exit\n');
-  process.exit(0);
-}
-
-if (null == arg) {
-  console.log(uuid());
-  process.exit(0);
-}
-
-if ('v1' !== arg && 'v4' !== arg) {
-  console.error('Version must be RFC4122 version 1 or version 4, denoted as "v1" or "v4"');
-  process.exit(1);
-}
-
-console.log(uuid[arg]());
-process.exit(0);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/bower.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/bower.json
deleted file mode 100644
index c0925e1906bd7cb7784eb479c7427c138af2e99f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/bower.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "name": "node-uuid",
-  "version": "1.4.7",
-  "homepage": "https://github.com/broofa/node-uuid",
-  "authors": [
-    "Robert Kieffer <robert@broofa.com>"
-  ],
-  "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.",
-  "main": "uuid.js",
-  "keywords": [
-    "uuid",
-    "gid",
-    "rfc4122"
-  ],
-  "license": "MIT",
-  "ignore": [
-    "**/.*",
-    "node_modules",
-    "bower_components",
-    "test",
-    "tests"
-  ]
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/component.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/component.json
deleted file mode 100644
index 3ff463366e7818496a041b1252c2587ae841e891..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/component.json
+++ /dev/null
@@ -1,25 +0,0 @@
-{
-  "name": "node-uuid",
-  "repo": "broofa/node-uuid",
-  "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.",
-  "version": "1.4.7",
-  "author": "Robert Kieffer <robert@broofa.com>",
-  "contributors": [
-    {
-      "name": "Christoph Tavan <dev@tavan.de>",
-      "github": "https://github.com/ctavan"
-    }
-  ],
-  "keywords": [
-    "uuid",
-    "guid",
-    "rfc4122"
-  ],
-  "dependencies": {},
-  "development": {},
-  "main": "uuid.js",
-  "scripts": [
-    "uuid.js"
-  ],
-  "license": "MIT"
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/package.json
deleted file mode 100644
index 68f8d6ff10b41645620977873d14ae4c4de10e0a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/package.json
+++ /dev/null
@@ -1,87 +0,0 @@
-{
-  "_from": "node-uuid@>=1.4.7 <1.5.0",
-  "_id": "node-uuid@1.4.7",
-  "_location": "/serialport/node-pre-gyp/request/node-uuid",
-  "_nodeVersion": "5.0.0",
-  "_npmUser": {
-    "email": "coolaj86@gmail.com",
-    "name": "coolaj86"
-  },
-  "_npmVersion": "3.3.6",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz",
-  "_shasum": "6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "robert@broofa.com",
-    "name": "Robert Kieffer"
-  },
-  "bin": {
-    "uuid": "./bin/uuid"
-  },
-  "bugs": {
-    "url": "https://github.com/broofa/node-uuid/issues"
-  },
-  "contributors": [
-    {
-      "name": "AJ ONeal",
-      "email": "coolaj86@gmail.com"
-    },
-    {
-      "name": "Christoph Tavan",
-      "email": "dev@tavan.de"
-    }
-  ],
-  "dependencies": {},
-  "description": "Rigorous implementation of RFC4122 (v1 and v4) UUIDs.",
-  "devDependencies": {
-    "nyc": "^2.2.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "6da5a17668c4b3dd59623bda11cf7fa4c1f60a6f",
-    "tarball": "http://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz"
-  },
-  "gitHead": "309512573ec1c60143c257157479a20f7f1f51cd",
-  "homepage": "https://github.com/broofa/node-uuid",
-  "installable": true,
-  "keywords": [
-    "guid",
-    "rfc4122",
-    "uuid"
-  ],
-  "lib": ".",
-  "licenses": [
-    {
-      "type": "MIT",
-      "url": "https://raw.github.com/broofa/node-uuid/master/LICENSE.md"
-    }
-  ],
-  "main": "./uuid.js",
-  "maintainers": [
-    {
-      "name": "broofa",
-      "email": "robert@broofa.com"
-    },
-    {
-      "name": "coolaj86",
-      "email": "coolaj86@gmail.com"
-    }
-  ],
-  "name": "node-uuid",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/broofa/node-uuid.git"
-  },
-  "scripts": {
-    "coverage": "nyc npm test && nyc report",
-    "test": "node test/test.js"
-  },
-  "url": "http://github.com/broofa/node-uuid",
-  "version": "1.4.7"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/compare_v1.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/compare_v1.js
deleted file mode 100644
index 05af82215fd82a212f250d55ed69349ad45f6c4c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/compare_v1.js
+++ /dev/null
@@ -1,63 +0,0 @@
-var assert = require('assert'),
-    nodeuuid = require('../uuid'),
-    uuidjs = require('uuid-js'),
-    libuuid = require('uuid').generate,
-    util = require('util'),
-    exec = require('child_process').exec,
-    os = require('os');
-
-// On Mac Os X / macports there's only the ossp-uuid package that provides uuid
-// On Linux there's uuid-runtime which provides uuidgen
-var uuidCmd = os.type() === 'Darwin' ? 'uuid -1' : 'uuidgen -t';
-
-function compare(ids) {
-  console.log(ids);
-  for (var i = 0; i < ids.length; i++) {
-    var id = ids[i].split('-');
-    id = [id[2], id[1], id[0]].join('');
-    ids[i] = id;
-  }
-  var sorted = ([].concat(ids)).sort();
-
-  if (sorted.toString() !== ids.toString()) {
-    console.log('Warning: sorted !== ids');
-  } else {
-    console.log('everything in order!');
-  }
-}
-
-// Test time order of v1 uuids
-var ids = [];
-while (ids.length < 10e3) ids.push(nodeuuid.v1());
-
-var max = 10;
-console.log('node-uuid:');
-ids = [];
-for (var i = 0; i < max; i++) ids.push(nodeuuid.v1());
-compare(ids);
-
-console.log('');
-console.log('uuidjs:');
-ids = [];
-for (var i = 0; i < max; i++) ids.push(uuidjs.create(1).toString());
-compare(ids);
-
-console.log('');
-console.log('libuuid:');
-ids = [];
-var count = 0;
-var last = function() {
-  compare(ids);
-}
-var cb = function(err, stdout, stderr) {
-  ids.push(stdout.substring(0, stdout.length-1));
-  count++;
-  if (count < max) {
-    return next();
-  }
-  last();
-};
-var next = function() {
-  exec(uuidCmd, cb);
-};
-next();
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.html b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.html
deleted file mode 100644
index d80326ec5a88e5ce6ec01c2d64369775ddfa0c30..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<html>
-  <head>
-    <style>
-      div {
-        font-family: monospace;
-        font-size: 8pt;
-      }
-      div.log {color: #444;}
-      div.warn {color: #550;}
-      div.error {color: #800; font-weight: bold;}
-    </style>
-    <script src="../uuid.js"></script>
-  </head>
-  <body>
-    <script src="./test.js"></script>
-  </body>
-</html>
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.js
deleted file mode 100644
index 5f1113d85727ae6ecc488c8e3231e1a499fdc213..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/test/test.js
+++ /dev/null
@@ -1,231 +0,0 @@
-if (!this.uuid) {
-  // node.js
-  uuid = require('../uuid');
-  if (!/_rb/.test(uuid._rng.toString())) {
-    throw new Error("should use crypto for node.js");
-  }
-}
-
-//
-// x-platform log/assert shims
-//
-
-function _log(msg, type) {
-  type = type || 'log';
-
-  if (typeof(document) != 'undefined') {
-    document.write('<div class="' + type + '">' + msg.replace(/\n/g, '<br />') + '</div>');
-  }
-  if (typeof(console) != 'undefined') {
-    var color = {
-      log: '\033[39m',
-      warn: '\033[33m',
-      error: '\033[31m'
-    };
-    console[type](color[type] + msg + color.log);
-  }
-}
-
-function log(msg) {_log(msg, 'log');}
-function warn(msg) {_log(msg, 'warn');}
-function error(msg) {_log(msg, 'error');}
-
-function assert(res, msg) {
-  if (!res) {
-    error('FAIL: ' + msg);
-  } else {
-    log('Pass: ' + msg);
-  }
-}
-
-//
-// Unit tests
-//
-
-// Verify ordering of v1 ids created with explicit times
-var TIME = 1321644961388; // 2011-11-18 11:36:01.388-08:00
-
-function compare(name, ids) {
-  ids = ids.map(function(id) {
-    return id.split('-').reverse().join('-');
-  }).sort();
-  var sorted = ([].concat(ids)).sort();
-
-  assert(sorted.toString() == ids.toString(), name + ' have expected order');
-}
-
-// Verify ordering of v1 ids created using default behavior
-compare('uuids with current time', [
-  uuid.v1(),
-  uuid.v1(),
-  uuid.v1(),
-  uuid.v1(),
-  uuid.v1()
-]);
-
-// Verify ordering of v1 ids created with explicit times
-compare('uuids with time option', [
-  uuid.v1({msecs: TIME - 10*3600*1000}),
-  uuid.v1({msecs: TIME - 1}),
-  uuid.v1({msecs: TIME}),
-  uuid.v1({msecs: TIME + 1}),
-  uuid.v1({msecs: TIME + 28*24*3600*1000})
-]);
-
-assert(
-  uuid.v1({msecs: TIME}) != uuid.v1({msecs: TIME}),
-  'IDs created at same msec are different'
-);
-
-// Verify throw if too many ids created
-var thrown = false;
-try {
-  uuid.v1({msecs: TIME, nsecs: 10000});
-} catch (e) {
-  thrown = true;
-}
-assert(thrown, 'Exception thrown when > 10K ids created in 1 ms');
-
-// Verify clock regression bumps clockseq
-var uidt = uuid.v1({msecs: TIME});
-var uidtb = uuid.v1({msecs: TIME - 1});
-assert(
-  parseInt(uidtb.split('-')[3], 16) - parseInt(uidt.split('-')[3], 16) === 1,
-  'Clock regression by msec increments the clockseq'
-);
-
-// Verify clock regression bumps clockseq
-var uidtn = uuid.v1({msecs: TIME, nsecs: 10});
-var uidtnb = uuid.v1({msecs: TIME, nsecs: 9});
-assert(
-  parseInt(uidtnb.split('-')[3], 16) - parseInt(uidtn.split('-')[3], 16) === 1,
-  'Clock regression by nsec increments the clockseq'
-);
-
-// Verify explicit options produce expected id
-var id = uuid.v1({
-  msecs: 1321651533573,
-  nsecs: 5432,
-  clockseq: 0x385c,
-  node: [ 0x61, 0xcd, 0x3c, 0xbb, 0x32, 0x10 ]
-});
-assert(id == 'd9428888-122b-11e1-b85c-61cd3cbb3210', 'Explicit options produce expected id');
-
-// Verify adjacent ids across a msec boundary are 1 time unit apart
-var u0 = uuid.v1({msecs: TIME, nsecs: 9999});
-var u1 = uuid.v1({msecs: TIME + 1, nsecs: 0});
-
-var before = u0.split('-')[0], after = u1.split('-')[0];
-var dt = parseInt(after, 16) - parseInt(before, 16);
-assert(dt === 1, 'Ids spanning 1ms boundary are 100ns apart');
-
-//
-// Test parse/unparse
-//
-
-id = '00112233445566778899aabbccddeeff';
-assert(uuid.unparse(uuid.parse(id.substr(0,10))) ==
-  '00112233-4400-0000-0000-000000000000', 'Short parse');
-assert(uuid.unparse(uuid.parse('(this is the uuid -> ' + id + id)) ==
-  '00112233-4455-6677-8899-aabbccddeeff', 'Dirty parse');
-
-//
-// Perf tests
-//
-
-var generators = {
-  v1: uuid.v1,
-  v4: uuid.v4
-};
-
-var UUID_FORMAT = {
-  v1: /[0-9a-f]{8}-[0-9a-f]{4}-1[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i,
-  v4: /[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}/i
-};
-
-var N = 1e4;
-
-// Get %'age an actual value differs from the ideal value
-function divergence(actual, ideal) {
-  return Math.round(100*100*(actual - ideal)/ideal)/100;
-}
-
-function rate(msg, t) {
-  log(msg + ': ' + (N / (Date.now() - t) * 1e3 | 0) + ' uuids\/second');
-}
-
-for (var version in generators) {
-  var counts = {}, max = 0;
-  var generator = generators[version];
-  var format = UUID_FORMAT[version];
-
-  log('\nSanity check ' + N + ' ' + version + ' uuids');
-  for (var i = 0, ok = 0; i < N; i++) {
-    id = generator();
-    if (!format.test(id)) {
-      throw Error(id + ' is not a valid UUID string');
-    }
-
-    if (id != uuid.unparse(uuid.parse(id))) {
-      assert(fail, id + ' is not a valid id');
-    }
-
-    // Count digits for our randomness check
-    if (version == 'v4') {
-      var digits = id.replace(/-/g, '').split('');
-      for (var j = digits.length-1; j >= 0; j--) {
-        var c = digits[j];
-        max = Math.max(max, counts[c] = (counts[c] || 0) + 1);
-      }
-    }
-  }
-
-  // Check randomness for v4 UUIDs
-  if (version == 'v4') {
-    // Limit that we get worried about randomness. (Purely empirical choice, this!)
-    var limit = 2*100*Math.sqrt(1/N);
-
-    log('\nChecking v4 randomness.  Distribution of Hex Digits (% deviation from ideal)');
-
-    for (var i = 0; i < 16; i++) {
-      var c = i.toString(16);
-      var bar = '', n = counts[c], p = Math.round(n/max*100|0);
-
-      // 1-3,5-8, and D-F: 1:16 odds over 30 digits
-      var ideal = N*30/16;
-      if (i == 4) {
-        // 4: 1:1 odds on 1 digit, plus 1:16 odds on 30 digits
-        ideal = N*(1 + 30/16);
-      } else if (i >= 8 && i <= 11) {
-        // 8-B: 1:4 odds on 1 digit, plus 1:16 odds on 30 digits
-        ideal = N*(1/4 + 30/16);
-      } else {
-        // Otherwise: 1:16 odds on 30 digits
-        ideal = N*30/16;
-      }
-      var d = divergence(n, ideal);
-
-      // Draw bar using UTF squares (just for grins)
-      var s = n/max*50 | 0;
-      while (s--) bar += '=';
-
-      assert(Math.abs(d) < limit, c + ' |' + bar + '| ' + counts[c] + ' (' + d + '% < ' + limit + '%)');
-    }
-  }
-}
-
-// Perf tests
-for (var version in generators) {
-  log('\nPerformance testing ' + version + ' UUIDs');
-  var generator = generators[version];
-  var buf = new uuid.BufferClass(16);
-
-  for (var i = 0, t = Date.now(); i < N; i++) generator();
-  rate('uuid.' + version + '()', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) generator('binary');
-  rate('uuid.' + version + '(\'binary\')', t);
-
-  for (var i = 0, t = Date.now(); i < N; i++) generator('binary', buf);
-  rate('uuid.' + version + '(\'binary\', buffer)', t);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/uuid.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/uuid.js
deleted file mode 100644
index 89c5b8fb613948656d298a725e569a57cef448c7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/node-uuid/uuid.js
+++ /dev/null
@@ -1,272 +0,0 @@
-//     uuid.js
-//
-//     Copyright (c) 2010-2012 Robert Kieffer
-//     MIT License - http://opensource.org/licenses/mit-license.php
-
-/*global window, require, define */
-(function(_window) {
-  'use strict';
-
-  // Unique ID creation requires a high quality random # generator.  We feature
-  // detect to determine the best RNG source, normalizing to a function that
-  // returns 128-bits of randomness, since that's what's usually required
-  var _rng, _mathRNG, _nodeRNG, _whatwgRNG, _previousRoot;
-
-  function setupBrowser() {
-    // Allow for MSIE11 msCrypto
-    var _crypto = _window.crypto || _window.msCrypto;
-
-    if (!_rng && _crypto && _crypto.getRandomValues) {
-      // WHATWG crypto-based RNG - http://wiki.whatwg.org/wiki/Crypto
-      //
-      // Moderately fast, high quality
-      try {
-        var _rnds8 = new Uint8Array(16);
-        _whatwgRNG = _rng = function whatwgRNG() {
-          _crypto.getRandomValues(_rnds8);
-          return _rnds8;
-        };
-        _rng();
-      } catch(e) {}
-    }
-
-    if (!_rng) {
-      // Math.random()-based (RNG)
-      //
-      // If all else fails, use Math.random().  It's fast, but is of unspecified
-      // quality.
-      var  _rnds = new Array(16);
-      _mathRNG = _rng = function() {
-        for (var i = 0, r; i < 16; i++) {
-          if ((i & 0x03) === 0) { r = Math.random() * 0x100000000; }
-          _rnds[i] = r >>> ((i & 0x03) << 3) & 0xff;
-        }
-
-        return _rnds;
-      };
-      if ('undefined' !== typeof console && console.warn) {
-        console.warn("[SECURITY] node-uuid: crypto not usable, falling back to insecure Math.random()");
-      }
-    }
-  }
-
-  function setupNode() {
-    // Node.js crypto-based RNG - http://nodejs.org/docs/v0.6.2/api/crypto.html
-    //
-    // Moderately fast, high quality
-    if ('function' === typeof require) {
-      try {
-        var _rb = require('crypto').randomBytes;
-        _nodeRNG = _rng = _rb && function() {return _rb(16);};
-        _rng();
-      } catch(e) {}
-    }
-  }
-
-  if (_window) {
-    setupBrowser();
-  } else {
-    setupNode();
-  }
-
-  // Buffer class to use
-  var BufferClass = ('function' === typeof Buffer) ? Buffer : Array;
-
-  // Maps for number <-> hex string conversion
-  var _byteToHex = [];
-  var _hexToByte = {};
-  for (var i = 0; i < 256; i++) {
-    _byteToHex[i] = (i + 0x100).toString(16).substr(1);
-    _hexToByte[_byteToHex[i]] = i;
-  }
-
-  // **`parse()` - Parse a UUID into it's component bytes**
-  function parse(s, buf, offset) {
-    var i = (buf && offset) || 0, ii = 0;
-
-    buf = buf || [];
-    s.toLowerCase().replace(/[0-9a-f]{2}/g, function(oct) {
-      if (ii < 16) { // Don't overflow!
-        buf[i + ii++] = _hexToByte[oct];
-      }
-    });
-
-    // Zero out remaining bytes if string was short
-    while (ii < 16) {
-      buf[i + ii++] = 0;
-    }
-
-    return buf;
-  }
-
-  // **`unparse()` - Convert UUID byte array (ala parse()) into a string**
-  function unparse(buf, offset) {
-    var i = offset || 0, bth = _byteToHex;
-    return  bth[buf[i++]] + bth[buf[i++]] +
-            bth[buf[i++]] + bth[buf[i++]] + '-' +
-            bth[buf[i++]] + bth[buf[i++]] + '-' +
-            bth[buf[i++]] + bth[buf[i++]] + '-' +
-            bth[buf[i++]] + bth[buf[i++]] + '-' +
-            bth[buf[i++]] + bth[buf[i++]] +
-            bth[buf[i++]] + bth[buf[i++]] +
-            bth[buf[i++]] + bth[buf[i++]];
-  }
-
-  // **`v1()` - Generate time-based UUID**
-  //
-  // Inspired by https://github.com/LiosK/UUID.js
-  // and http://docs.python.org/library/uuid.html
-
-  // random #'s we need to init node and clockseq
-  var _seedBytes = _rng();
-
-  // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)
-  var _nodeId = [
-    _seedBytes[0] | 0x01,
-    _seedBytes[1], _seedBytes[2], _seedBytes[3], _seedBytes[4], _seedBytes[5]
-  ];
-
-  // Per 4.2.2, randomize (14 bit) clockseq
-  var _clockseq = (_seedBytes[6] << 8 | _seedBytes[7]) & 0x3fff;
-
-  // Previous uuid creation time
-  var _lastMSecs = 0, _lastNSecs = 0;
-
-  // See https://github.com/broofa/node-uuid for API details
-  function v1(options, buf, offset) {
-    var i = buf && offset || 0;
-    var b = buf || [];
-
-    options = options || {};
-
-    var clockseq = (options.clockseq != null) ? options.clockseq : _clockseq;
-
-    // UUID timestamps are 100 nano-second units since the Gregorian epoch,
-    // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so
-    // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'
-    // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.
-    var msecs = (options.msecs != null) ? options.msecs : new Date().getTime();
-
-    // Per 4.2.1.2, use count of uuid's generated during the current clock
-    // cycle to simulate higher resolution clock
-    var nsecs = (options.nsecs != null) ? options.nsecs : _lastNSecs + 1;
-
-    // Time since last uuid creation (in msecs)
-    var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;
-
-    // Per 4.2.1.2, Bump clockseq on clock regression
-    if (dt < 0 && options.clockseq == null) {
-      clockseq = clockseq + 1 & 0x3fff;
-    }
-
-    // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new
-    // time interval
-    if ((dt < 0 || msecs > _lastMSecs) && options.nsecs == null) {
-      nsecs = 0;
-    }
-
-    // Per 4.2.1.2 Throw error if too many uuids are requested
-    if (nsecs >= 10000) {
-      throw new Error('uuid.v1(): Can\'t create more than 10M uuids/sec');
-    }
-
-    _lastMSecs = msecs;
-    _lastNSecs = nsecs;
-    _clockseq = clockseq;
-
-    // Per 4.1.4 - Convert from unix epoch to Gregorian epoch
-    msecs += 12219292800000;
-
-    // `time_low`
-    var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;
-    b[i++] = tl >>> 24 & 0xff;
-    b[i++] = tl >>> 16 & 0xff;
-    b[i++] = tl >>> 8 & 0xff;
-    b[i++] = tl & 0xff;
-
-    // `time_mid`
-    var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;
-    b[i++] = tmh >>> 8 & 0xff;
-    b[i++] = tmh & 0xff;
-
-    // `time_high_and_version`
-    b[i++] = tmh >>> 24 & 0xf | 0x10; // include version
-    b[i++] = tmh >>> 16 & 0xff;
-
-    // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)
-    b[i++] = clockseq >>> 8 | 0x80;
-
-    // `clock_seq_low`
-    b[i++] = clockseq & 0xff;
-
-    // `node`
-    var node = options.node || _nodeId;
-    for (var n = 0; n < 6; n++) {
-      b[i + n] = node[n];
-    }
-
-    return buf ? buf : unparse(b);
-  }
-
-  // **`v4()` - Generate random UUID**
-
-  // See https://github.com/broofa/node-uuid for API details
-  function v4(options, buf, offset) {
-    // Deprecated - 'format' argument, as supported in v1.2
-    var i = buf && offset || 0;
-
-    if (typeof(options) === 'string') {
-      buf = (options === 'binary') ? new BufferClass(16) : null;
-      options = null;
-    }
-    options = options || {};
-
-    var rnds = options.random || (options.rng || _rng)();
-
-    // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`
-    rnds[6] = (rnds[6] & 0x0f) | 0x40;
-    rnds[8] = (rnds[8] & 0x3f) | 0x80;
-
-    // Copy bytes to buffer, if provided
-    if (buf) {
-      for (var ii = 0; ii < 16; ii++) {
-        buf[i + ii] = rnds[ii];
-      }
-    }
-
-    return buf || unparse(rnds);
-  }
-
-  // Export public API
-  var uuid = v4;
-  uuid.v1 = v1;
-  uuid.v4 = v4;
-  uuid.parse = parse;
-  uuid.unparse = unparse;
-  uuid.BufferClass = BufferClass;
-  uuid._rng = _rng;
-  uuid._mathRNG = _mathRNG;
-  uuid._nodeRNG = _nodeRNG;
-  uuid._whatwgRNG = _whatwgRNG;
-
-  if (('undefined' !== typeof module) && module.exports) {
-    // Publish as node.js module
-    module.exports = uuid;
-  } else if (typeof define === 'function' && define.amd) {
-    // Publish as AMD module
-    define(function() {return uuid;});
-
-
-  } else {
-    // Publish as global (in browsers)
-    _previousRoot = _window.uuid;
-
-    // **`noConflict()` - (browser only) to reset global 'uuid' var**
-    uuid.noConflict = function() {
-      _window.uuid = _previousRoot;
-      return uuid;
-    };
-
-    _window.uuid = uuid;
-  }
-})('undefined' !== typeof window ? window : null);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/LICENSE
deleted file mode 100644
index a4a9aee0c2fa14a2007895d018bfa06f0592fd34..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/LICENSE
+++ /dev/null
@@ -1,55 +0,0 @@
-Apache License
-
-Version 2.0, January 2004
-
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
-
-"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
-
-You must give any other recipients of the Work or Derivative Works a copy of this License; and
-
-You must cause any modified files to carry prominent notices stating that You changed the files; and
-
-You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
-
-If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/README.md
deleted file mode 100644
index 34c4a85d2dde059f22e22a9d4b770d367448e5c3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-oauth-sign
-==========
-
-OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module. 
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/index.js
deleted file mode 100644
index dadcba9709f79225a43349aa4f3eaf975beb3558..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/index.js
+++ /dev/null
@@ -1,136 +0,0 @@
-var crypto = require('crypto')
-  , qs = require('querystring')
-  ;
-
-function sha1 (key, body) {
-  return crypto.createHmac('sha1', key).update(body).digest('base64')
-}
-
-function rsa (key, body) {
-  return crypto.createSign("RSA-SHA1").update(body).sign(key, 'base64');
-}
-
-function rfc3986 (str) {
-  return encodeURIComponent(str)
-    .replace(/!/g,'%21')
-    .replace(/\*/g,'%2A')
-    .replace(/\(/g,'%28')
-    .replace(/\)/g,'%29')
-    .replace(/'/g,'%27')
-    ;
-}
-
-// Maps object to bi-dimensional array
-// Converts { foo: 'A', bar: [ 'b', 'B' ]} to
-// [ ['foo', 'A'], ['bar', 'b'], ['bar', 'B'] ]
-function map (obj) {
-  var key, val, arr = []
-  for (key in obj) {
-    val = obj[key]
-    if (Array.isArray(val))
-      for (var i = 0; i < val.length; i++)
-        arr.push([key, val[i]])
-    else if (typeof val === "object")
-      for (var prop in val)
-        arr.push([key + '[' + prop + ']', val[prop]]);
-    else
-      arr.push([key, val])
-  }
-  return arr
-}
-
-// Compare function for sort
-function compare (a, b) {
-  return a > b ? 1 : a < b ? -1 : 0
-}
-
-function generateBase (httpMethod, base_uri, params) {
-  // adapted from https://dev.twitter.com/docs/auth/oauth and 
-  // https://dev.twitter.com/docs/auth/creating-signature
-
-  // Parameter normalization
-  // http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2
-  var normalized = map(params)
-  // 1.  First, the name and value of each parameter are encoded
-  .map(function (p) {
-    return [ rfc3986(p[0]), rfc3986(p[1] || '') ]
-  })
-  // 2.  The parameters are sorted by name, using ascending byte value
-  //     ordering.  If two or more parameters share the same name, they
-  //     are sorted by their value.
-  .sort(function (a, b) {
-    return compare(a[0], b[0]) || compare(a[1], b[1])
-  })
-  // 3.  The name of each parameter is concatenated to its corresponding
-  //     value using an "=" character (ASCII code 61) as a separator, even
-  //     if the value is empty.
-  .map(function (p) { return p.join('=') })
-   // 4.  The sorted name/value pairs are concatenated together into a
-   //     single string by using an "&" character (ASCII code 38) as
-   //     separator.
-  .join('&')
-
-  var base = [
-    rfc3986(httpMethod ? httpMethod.toUpperCase() : 'GET'),
-    rfc3986(base_uri),
-    rfc3986(normalized)
-  ].join('&')
-
-  return base
-}
-
-function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) {
-  var base = generateBase(httpMethod, base_uri, params)
-  var key = [
-    consumer_secret || '',
-    token_secret || ''
-  ].map(rfc3986).join('&')
-
-  return sha1(key, base)
-}
-
-function rsasign (httpMethod, base_uri, params, private_key, token_secret) {
-  var base = generateBase(httpMethod, base_uri, params)
-  var key = private_key || ''
-
-  return rsa(key, base)
-}
-
-function plaintext (consumer_secret, token_secret) {
-  var key = [
-    consumer_secret || '',
-    token_secret || ''
-  ].map(rfc3986).join('&')
-
-  return key
-}
-
-function sign (signMethod, httpMethod, base_uri, params, consumer_secret, token_secret) {
-  var method
-  var skipArgs = 1
-
-  switch (signMethod) {
-    case 'RSA-SHA1':
-      method = rsasign
-      break
-    case 'HMAC-SHA1':
-      method = hmacsign
-      break
-    case 'PLAINTEXT':
-      method = plaintext
-      skipArgs = 4
-      break
-    default:
-     throw new Error("Signature method not supported: " + signMethod)
-  }
-
-  return method.apply(null, [].slice.call(arguments, skipArgs))
-}
-
-exports.hmacsign = hmacsign
-exports.rsasign = rsasign
-exports.plaintext = plaintext
-exports.sign = sign
-exports.rfc3986 = rfc3986
-exports.generateBase = generateBase
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/package.json
deleted file mode 100644
index 1f84896e2a3413539c69f23631a9177ef5eb47db..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/oauth-sign/package.json
+++ /dev/null
@@ -1,72 +0,0 @@
-{
-  "_from": "oauth-sign@>=0.8.0 <0.9.0",
-  "_id": "oauth-sign@0.8.2",
-  "_location": "/serialport/node-pre-gyp/request/oauth-sign",
-  "_nodeVersion": "5.9.0",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/oauth-sign-0.8.2.tgz_1462396399020_0.8175400267355144"
-  },
-  "_npmUser": {
-    "email": "simeonvelichkov@gmail.com",
-    "name": "simov"
-  },
-  "_npmVersion": "2.15.3",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
-  "_shasum": "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mikeal.rogers@gmail.com",
-    "name": "Mikeal Rogers",
-    "url": "http://www.futurealoof.com"
-  },
-  "bugs": {
-    "url": "https://github.com/mikeal/oauth-sign/issues"
-  },
-  "dependencies": {},
-  "description": "OAuth 1 signing. Formerly a vendor lib in mikeal/request, now a standalone module.",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43",
-    "tarball": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "files": [
-    "index.js"
-  ],
-  "gitHead": "0b034206316132f57e26970152c2fb18e71bddd5",
-  "homepage": "https://github.com/mikeal/oauth-sign#readme",
-  "license": "Apache-2.0",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "mikeal",
-      "email": "mikeal.rogers@gmail.com"
-    },
-    {
-      "name": "nylen",
-      "email": "jnylen@gmail.com"
-    },
-    {
-      "name": "simov",
-      "email": "simeonvelichkov@gmail.com"
-    }
-  ],
-  "name": "oauth-sign",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "url": "git+https://github.com/mikeal/oauth-sign.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "0.8.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.eslintignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.eslintignore
deleted file mode 100644
index 1521c8b7652b1eec8ed4fe50877aae880c758ee3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.eslintignore
+++ /dev/null
@@ -1 +0,0 @@
-dist
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.eslintrc b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.eslintrc
deleted file mode 100644
index 1faac273ff648881c582a3cb100aad4851dd003c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.eslintrc
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-	"root": true,
-
-	"extends": "@ljharb",
-
-	"rules": {
-		"complexity": [2, 22],
-		"consistent-return": [1],
-		"id-length": [2, { "min": 1, "max": 25, "properties": "never" }],
-		"indent": [2, 4],
-		"max-params": [2, 9],
-		"max-statements": [2, 36],
-		"no-extra-parens": [1],
-		"no-continue": [1],
-		"no-magic-numbers": 0,
-		"no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"],
-		"operator-linebreak": 1
-	}
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.jscs.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.jscs.json
deleted file mode 100644
index 3d099c4b1192c4aa163a21905a1631ad432beae1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/.jscs.json
+++ /dev/null
@@ -1,176 +0,0 @@
-{
-	"es3": true,
-
-	"additionalRules": [],
-
-	"requireSemicolons": true,
-
-	"disallowMultipleSpaces": true,
-
-	"disallowIdentifierNames": [],
-
-	"requireCurlyBraces": {
-		"allExcept": [],
-		"keywords": ["if", "else", "for", "while", "do", "try", "catch"]
-	},
-
-	"requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch", "function"],
-
-	"disallowSpaceAfterKeywords": [],
-
-	"disallowSpaceBeforeComma": true,
-	"disallowSpaceAfterComma": false,
-	"disallowSpaceBeforeSemicolon": true,
-
-	"disallowNodeTypes": [
-		"DebuggerStatement",
-		"ForInStatement",
-		"LabeledStatement",
-		"SwitchCase",
-		"SwitchStatement",
-		"WithStatement"
-	],
-
-	"requireObjectKeysOnNewLine": { "allExcept": ["sameLine"] },
-
-	"requireSpacesInAnonymousFunctionExpression": { "beforeOpeningRoundBrace": true, "beforeOpeningCurlyBrace": true },
-	"requireSpacesInNamedFunctionExpression": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInNamedFunctionExpression": { "beforeOpeningRoundBrace": true },
-	"requireSpacesInFunctionDeclaration": { "beforeOpeningCurlyBrace": true },
-	"disallowSpacesInFunctionDeclaration": { "beforeOpeningRoundBrace": true },
-
-	"requireSpaceBetweenArguments": true,
-
-	"disallowSpacesInsideParentheses": true,
-
-	"disallowSpacesInsideArrayBrackets": true,
-
-	"disallowQuotedKeysInObjects": { "allExcept": ["reserved"] },
-
-	"disallowSpaceAfterObjectKeys": true,
-
-	"requireCommaBeforeLineBreak": true,
-
-	"disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"],
-	"requireSpaceAfterPrefixUnaryOperators": [],
-
-	"disallowSpaceBeforePostfixUnaryOperators": ["++", "--"],
-	"requireSpaceBeforePostfixUnaryOperators": [],
-
-	"disallowSpaceBeforeBinaryOperators": [],
-	"requireSpaceBeforeBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-
-	"requireSpaceAfterBinaryOperators": ["+", "-", "/", "*", "=", "==", "===", "!=", "!=="],
-	"disallowSpaceAfterBinaryOperators": [],
-
-	"disallowImplicitTypeConversion": ["binary", "string"],
-
-	"disallowKeywords": ["with", "eval"],
-
-	"requireKeywordsOnNewLine": [],
-	"disallowKeywordsOnNewLine": ["else"],
-
-	"requireLineFeedAtFileEnd": true,
-
-	"disallowTrailingWhitespace": true,
-
-	"disallowTrailingComma": true,
-
-	"excludeFiles": ["node_modules/**", "vendor/**"],
-
-	"disallowMultipleLineStrings": true,
-
-	"requireDotNotation": { "allExcept": ["keywords"] },
-
-	"requireParenthesesAroundIIFE": true,
-
-	"validateLineBreaks": "LF",
-
-	"validateQuoteMarks": {
-		"escape": true,
-		"mark": "'"
-	},
-
-	"disallowOperatorBeforeLineBreak": [],
-
-	"requireSpaceBeforeKeywords": [
-		"do",
-		"for",
-		"if",
-		"else",
-		"switch",
-		"case",
-		"try",
-		"catch",
-		"finally",
-		"while",
-		"with",
-		"return"
-	],
-
-	"validateAlignedFunctionParameters": {
-		"lineBreakAfterOpeningBraces": true,
-		"lineBreakBeforeClosingBraces": true
-	},
-
-	"requirePaddingNewLinesBeforeExport": true,
-
-	"validateNewlineAfterArrayElements": {
-		"maximum": 1
-	},
-
-	"requirePaddingNewLinesAfterUseStrict": true,
-
-	"disallowArrowFunctions": true,
-
-	"disallowMultiLineTernary": true,
-
-	"validateOrderInObjectKeys": "asc-insensitive",
-
-	"disallowIdenticalDestructuringNames": true,
-
-	"disallowNestedTernaries": { "maxLevel": 1 },
-
-	"requireSpaceAfterComma": { "allExcept": ["trailing"] },
-	"requireAlignedMultilineParams": false,
-
-	"requireSpacesInGenerator": {
-		"afterStar": true
-	},
-
-	"disallowSpacesInGenerator": {
-		"beforeStar": true
-	},
-
-	"disallowVar": false,
-
-	"requireArrayDestructuring": false,
-
-	"requireEnhancedObjectLiterals": false,
-
-	"requireObjectDestructuring": false,
-
-	"requireEarlyReturn": false,
-
-	"requireCapitalizedConstructorsNew": {
-		"allExcept": ["Function", "String", "Object", "Symbol", "Number", "Date", "RegExp", "Error", "Boolean", "Array"]
-	},
-
-	"requireImportAlphabetized": false,
-
-    "requireSpaceBeforeObjectValues": true,
-    "requireSpaceBeforeDestructuredValues": true,
-
-	"disallowSpacesInsideTemplateStringPlaceholders": true,
-
-    "disallowArrayDestructuringReturn": false,
-
-    "requireNewlineBeforeSingleStatementsInIf": false,
-
-	"disallowUnusedVariables": true,
-
-	"requireSpacesInsideImportedObjectBraces": true,
-
-	"requireUseStrict": true
-}
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/CHANGELOG.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/CHANGELOG.md
deleted file mode 100644
index e318a054a90beecbeb4be8abe7942c5c8cc9b01e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/CHANGELOG.md
+++ /dev/null
@@ -1,120 +0,0 @@
-## [**6.2.0**](https://github.com/ljharb/qs/issues?milestone=36&state=closed)
-- [New] pass Buffers to the encoder/decoder directly (#161)
-- [New] add "encoder" and "decoder" options, for custom param encoding/decoding (#160)
-- [Fix] fix compacting of nested sparse arrays (#150)
-
-## [**6.1.0**](https://github.com/ljharb/qs/issues?milestone=35&state=closed)
-- [New] allowDots option for `stringify` (#151)
-- [Fix] "sort" option should work at a depth of 3 or more (#151)
-- [Fix] Restore `dist` directory; will be removed in v7 (#148)
-
-## [**6.0.2**](https://github.com/ljharb/qs/issues?milestone=33&state=closed)
-- Revert ES6 requirement and restore support for node down to v0.8.
-
-## [**6.0.1**](https://github.com/ljharb/qs/issues?milestone=32&state=closed)
-- [**#127**](https://github.com/ljharb/qs/pull/127) Fix engines definition in package.json
-
-## [**6.0.0**](https://github.com/ljharb/qs/issues?milestone=31&state=closed)
-- [**#124**](https://github.com/ljharb/qs/issues/124) Use ES6 and drop support for node < v4
-
-## [**5.2.0**](https://github.com/ljharb/qs/issues?milestone=30&state=closed)
-- [**#64**](https://github.com/ljharb/qs/issues/64) Add option to sort object keys in the query string
-
-## [**5.1.0**](https://github.com/ljharb/qs/issues?milestone=29&state=closed)
-- [**#117**](https://github.com/ljharb/qs/issues/117) make URI encoding stringified results optional
-- [**#106**](https://github.com/ljharb/qs/issues/106) Add flag `skipNulls` to optionally skip null values in stringify
-
-## [**5.0.0**](https://github.com/ljharb/qs/issues?milestone=28&state=closed)
-- [**#114**](https://github.com/ljharb/qs/issues/114) default allowDots to false
-- [**#100**](https://github.com/ljharb/qs/issues/100) include dist to npm
-
-## [**4.0.0**](https://github.com/ljharb/qs/issues?milestone=26&state=closed)
-- [**#98**](https://github.com/ljharb/qs/issues/98) make returning plain objects and allowing prototype overwriting properties optional
-
-## [**3.1.0**](https://github.com/ljharb/qs/issues?milestone=24&state=closed)
-- [**#89**](https://github.com/ljharb/qs/issues/89) Add option to disable "Transform dot notation to bracket notation"
-
-## [**3.0.0**](https://github.com/ljharb/qs/issues?milestone=23&state=closed)
-- [**#80**](https://github.com/ljharb/qs/issues/80) qs.parse silently drops properties
-- [**#77**](https://github.com/ljharb/qs/issues/77) Perf boost
-- [**#60**](https://github.com/ljharb/qs/issues/60) Add explicit option to disable array parsing
-- [**#74**](https://github.com/ljharb/qs/issues/74) Bad parse when turning array into object
-- [**#81**](https://github.com/ljharb/qs/issues/81) Add a `filter` option
-- [**#68**](https://github.com/ljharb/qs/issues/68) Fixed issue with recursion and passing strings into objects.
-- [**#66**](https://github.com/ljharb/qs/issues/66) Add mixed array and object dot notation support Closes: #47
-- [**#76**](https://github.com/ljharb/qs/issues/76) RFC 3986
-- [**#85**](https://github.com/ljharb/qs/issues/85) No equal sign
-- [**#84**](https://github.com/ljharb/qs/issues/84) update license attribute
-
-## [**2.4.1**](https://github.com/ljharb/qs/issues?milestone=20&state=closed)
-- [**#73**](https://github.com/ljharb/qs/issues/73) Property 'hasOwnProperty' of object #<Object> is not a function
-
-## [**2.4.0**](https://github.com/ljharb/qs/issues?milestone=19&state=closed)
-- [**#70**](https://github.com/ljharb/qs/issues/70) Add arrayFormat option
-
-## [**2.3.3**](https://github.com/ljharb/qs/issues?milestone=18&state=closed)
-- [**#59**](https://github.com/ljharb/qs/issues/59) make sure array indexes are >= 0, closes #57
-- [**#58**](https://github.com/ljharb/qs/issues/58) make qs usable for browser loader
-
-## [**2.3.2**](https://github.com/ljharb/qs/issues?milestone=17&state=closed)
-- [**#55**](https://github.com/ljharb/qs/issues/55) allow merging a string into an object
-
-## [**2.3.1**](https://github.com/ljharb/qs/issues?milestone=16&state=closed)
-- [**#52**](https://github.com/ljharb/qs/issues/52) Return "undefined" and "false" instead of throwing "TypeError".
-
-## [**2.3.0**](https://github.com/ljharb/qs/issues?milestone=15&state=closed)
-- [**#50**](https://github.com/ljharb/qs/issues/50) add option to omit array indices, closes #46
-
-## [**2.2.5**](https://github.com/ljharb/qs/issues?milestone=14&state=closed)
-- [**#39**](https://github.com/ljharb/qs/issues/39) Is there an alternative to Buffer.isBuffer?
-- [**#49**](https://github.com/ljharb/qs/issues/49) refactor utils.merge, fixes #45
-- [**#41**](https://github.com/ljharb/qs/issues/41) avoid browserifying Buffer, for #39
-
-## [**2.2.4**](https://github.com/ljharb/qs/issues?milestone=13&state=closed)
-- [**#38**](https://github.com/ljharb/qs/issues/38) how to handle object keys beginning with a number
-
-## [**2.2.3**](https://github.com/ljharb/qs/issues?milestone=12&state=closed)
-- [**#37**](https://github.com/ljharb/qs/issues/37) parser discards first empty value in array
-- [**#36**](https://github.com/ljharb/qs/issues/36) Update to lab 4.x
-
-## [**2.2.2**](https://github.com/ljharb/qs/issues?milestone=11&state=closed)
-- [**#33**](https://github.com/ljharb/qs/issues/33) Error when plain object in a value
-- [**#34**](https://github.com/ljharb/qs/issues/34) use Object.prototype.hasOwnProperty.call instead of obj.hasOwnProperty
-- [**#24**](https://github.com/ljharb/qs/issues/24) Changelog? Semver?
-
-## [**2.2.1**](https://github.com/ljharb/qs/issues?milestone=10&state=closed)
-- [**#32**](https://github.com/ljharb/qs/issues/32) account for circular references properly, closes #31
-- [**#31**](https://github.com/ljharb/qs/issues/31) qs.parse stackoverflow on circular objects
-
-## [**2.2.0**](https://github.com/ljharb/qs/issues?milestone=9&state=closed)
-- [**#26**](https://github.com/ljharb/qs/issues/26) Don't use Buffer global if it's not present
-- [**#30**](https://github.com/ljharb/qs/issues/30) Bug when merging non-object values into arrays
-- [**#29**](https://github.com/ljharb/qs/issues/29) Don't call Utils.clone at the top of Utils.merge
-- [**#23**](https://github.com/ljharb/qs/issues/23) Ability to not limit parameters?
-
-## [**2.1.0**](https://github.com/ljharb/qs/issues?milestone=8&state=closed)
-- [**#22**](https://github.com/ljharb/qs/issues/22) Enable using a RegExp as delimiter
-
-## [**2.0.0**](https://github.com/ljharb/qs/issues?milestone=7&state=closed)
-- [**#18**](https://github.com/ljharb/qs/issues/18) Why is there arrayLimit?
-- [**#20**](https://github.com/ljharb/qs/issues/20) Configurable parametersLimit
-- [**#21**](https://github.com/ljharb/qs/issues/21) make all limits optional, for #18, for #20
-
-## [**1.2.2**](https://github.com/ljharb/qs/issues?milestone=6&state=closed)
-- [**#19**](https://github.com/ljharb/qs/issues/19) Don't overwrite null values
-
-## [**1.2.1**](https://github.com/ljharb/qs/issues?milestone=5&state=closed)
-- [**#16**](https://github.com/ljharb/qs/issues/16) ignore non-string delimiters
-- [**#15**](https://github.com/ljharb/qs/issues/15) Close code block
-
-## [**1.2.0**](https://github.com/ljharb/qs/issues?milestone=4&state=closed)
-- [**#12**](https://github.com/ljharb/qs/issues/12) Add optional delim argument
-- [**#13**](https://github.com/ljharb/qs/issues/13) fix #11: flattened keys in array are now correctly parsed
-
-## [**1.1.0**](https://github.com/ljharb/qs/issues?milestone=3&state=closed)
-- [**#7**](https://github.com/ljharb/qs/issues/7) Empty values of a POST array disappear after being submitted
-- [**#9**](https://github.com/ljharb/qs/issues/9) Should not omit equals signs (=) when value is null
-- [**#6**](https://github.com/ljharb/qs/issues/6) Minor grammar fix in README
-
-## [**1.0.2**](https://github.com/ljharb/qs/issues?milestone=2&state=closed)
-- [**#5**](https://github.com/ljharb/qs/issues/5) array holes incorrectly copied into object on large index
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/CONTRIBUTING.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/CONTRIBUTING.md
deleted file mode 100644
index 892836159ba3c787e7502ce70ed9c5ffe5f9d023..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/CONTRIBUTING.md
+++ /dev/null
@@ -1 +0,0 @@
-Please view our [hapijs contributing guide](https://github.com/hapijs/hapi/blob/master/CONTRIBUTING.md).
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/LICENSE
deleted file mode 100644
index d4569487a094b9ffb6e42ed157c32f8a5440a07a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/LICENSE
+++ /dev/null
@@ -1,28 +0,0 @@
-Copyright (c) 2014 Nathan LaFreniere and other contributors.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above copyright
-      notice, this list of conditions and the following disclaimer in the
-      documentation and/or other materials provided with the distribution.
-    * The names of any contributors may not be used to endorse or promote
-      products derived from this software without specific prior written
-      permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
-DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-                                  *   *   *
-
-The complete list of contributors can be found at: https://github.com/hapijs/qs/graphs/contributors
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/dist/qs.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/dist/qs.js
deleted file mode 100644
index 4cc6f30673e8bbb7567babdca5abcaaff48ff113..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/dist/qs.js
+++ /dev/null
@@ -1,487 +0,0 @@
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Qs = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-'use strict';
-
-var Stringify = require('./stringify');
-var Parse = require('./parse');
-
-module.exports = {
-    stringify: Stringify,
-    parse: Parse
-};
-
-},{"./parse":2,"./stringify":3}],2:[function(require,module,exports){
-'use strict';
-
-var Utils = require('./utils');
-
-var defaults = {
-    delimiter: '&',
-    depth: 5,
-    arrayLimit: 20,
-    parameterLimit: 1000,
-    strictNullHandling: false,
-    plainObjects: false,
-    allowPrototypes: false,
-    allowDots: false,
-    decoder: Utils.decode
-};
-
-var parseValues = function parseValues(str, options) {
-    var obj = {};
-    var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit);
-
-    for (var i = 0; i < parts.length; ++i) {
-        var part = parts[i];
-        var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1;
-
-        if (pos === -1) {
-            obj[options.decoder(part)] = '';
-
-            if (options.strictNullHandling) {
-                obj[options.decoder(part)] = null;
-            }
-        } else {
-            var key = options.decoder(part.slice(0, pos));
-            var val = options.decoder(part.slice(pos + 1));
-
-            if (Object.prototype.hasOwnProperty.call(obj, key)) {
-                obj[key] = [].concat(obj[key]).concat(val);
-            } else {
-                obj[key] = val;
-            }
-        }
-    }
-
-    return obj;
-};
-
-var parseObject = function parseObject(chain, val, options) {
-    if (!chain.length) {
-        return val;
-    }
-
-    var root = chain.shift();
-
-    var obj;
-    if (root === '[]') {
-        obj = [];
-        obj = obj.concat(parseObject(chain, val, options));
-    } else {
-        obj = options.plainObjects ? Object.create(null) : {};
-        var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root;
-        var index = parseInt(cleanRoot, 10);
-        if (
-            !isNaN(index) &&
-            root !== cleanRoot &&
-            String(index) === cleanRoot &&
-            index >= 0 &&
-            (options.parseArrays && index <= options.arrayLimit)
-        ) {
-            obj = [];
-            obj[index] = parseObject(chain, val, options);
-        } else {
-            obj[cleanRoot] = parseObject(chain, val, options);
-        }
-    }
-
-    return obj;
-};
-
-var parseKeys = function parseKeys(givenKey, val, options) {
-    if (!givenKey) {
-        return;
-    }
-
-    // Transform dot notation to bracket notation
-    var key = options.allowDots ? givenKey.replace(/\.([^\.\[]+)/g, '[$1]') : givenKey;
-
-    // The regex chunks
-
-    var parent = /^([^\[\]]*)/;
-    var child = /(\[[^\[\]]*\])/g;
-
-    // Get the parent
-
-    var segment = parent.exec(key);
-
-    // Stash the parent if it exists
-
-    var keys = [];
-    if (segment[1]) {
-        // If we aren't using plain objects, optionally prefix keys
-        // that would overwrite object prototype properties
-        if (!options.plainObjects && Object.prototype.hasOwnProperty(segment[1])) {
-            if (!options.allowPrototypes) {
-                return;
-            }
-        }
-
-        keys.push(segment[1]);
-    }
-
-    // Loop through children appending to the array until we hit depth
-
-    var i = 0;
-    while ((segment = child.exec(key)) !== null && i < options.depth) {
-        i += 1;
-        if (!options.plainObjects && Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) {
-            if (!options.allowPrototypes) {
-                continue;
-            }
-        }
-        keys.push(segment[1]);
-    }
-
-    // If there's a remainder, just add whatever is left
-
-    if (segment) {
-        keys.push('[' + key.slice(segment.index) + ']');
-    }
-
-    return parseObject(keys, val, options);
-};
-
-module.exports = function (str, opts) {
-    var options = opts || {};
-
-    if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {
-        throw new TypeError('Decoder has to be a function.');
-    }
-
-    options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;
-    options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;
-    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;
-    options.parseArrays = options.parseArrays !== false;
-    options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;
-    options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;
-    options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;
-    options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;
-    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;
-    options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
-
-    if (str === '' || str === null || typeof str === 'undefined') {
-        return options.plainObjects ? Object.create(null) : {};
-    }
-
-    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
-    var obj = options.plainObjects ? Object.create(null) : {};
-
-    // Iterate over the keys and setup the new object
-
-    var keys = Object.keys(tempObj);
-    for (var i = 0; i < keys.length; ++i) {
-        var key = keys[i];
-        var newObj = parseKeys(key, tempObj[key], options);
-        obj = Utils.merge(obj, newObj, options);
-    }
-
-    return Utils.compact(obj);
-};
-
-},{"./utils":4}],3:[function(require,module,exports){
-'use strict';
-
-var Utils = require('./utils');
-
-var arrayPrefixGenerators = {
-    brackets: function brackets(prefix) {
-        return prefix + '[]';
-    },
-    indices: function indices(prefix, key) {
-        return prefix + '[' + key + ']';
-    },
-    repeat: function repeat(prefix) {
-        return prefix;
-    }
-};
-
-var defaults = {
-    delimiter: '&',
-    strictNullHandling: false,
-    skipNulls: false,
-    encode: true,
-    encoder: Utils.encode
-};
-
-var stringify = function stringify(object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots) {
-    var obj = object;
-    if (typeof filter === 'function') {
-        obj = filter(prefix, obj);
-    } else if (obj instanceof Date) {
-        obj = obj.toISOString();
-    } else if (obj === null) {
-        if (strictNullHandling) {
-            return encoder ? encoder(prefix) : prefix;
-        }
-
-        obj = '';
-    }
-
-    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || Utils.isBuffer(obj)) {
-        if (encoder) {
-            return [encoder(prefix) + '=' + encoder(obj)];
-        }
-        return [prefix + '=' + String(obj)];
-    }
-
-    var values = [];
-
-    if (typeof obj === 'undefined') {
-        return values;
-    }
-
-    var objKeys;
-    if (Array.isArray(filter)) {
-        objKeys = filter;
-    } else {
-        var keys = Object.keys(obj);
-        objKeys = sort ? keys.sort(sort) : keys;
-    }
-
-    for (var i = 0; i < objKeys.length; ++i) {
-        var key = objKeys[i];
-
-        if (skipNulls && obj[key] === null) {
-            continue;
-        }
-
-        if (Array.isArray(obj)) {
-            values = values.concat(stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
-        } else {
-            values = values.concat(stringify(obj[key], prefix + (allowDots ? '.' + key : '[' + key + ']'), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
-        }
-    }
-
-    return values;
-};
-
-module.exports = function (object, opts) {
-    var obj = object;
-    var options = opts || {};
-    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;
-    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
-    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;
-    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;
-    var encoder = encode ? (typeof options.encoder === 'function' ? options.encoder : defaults.encoder) : null;
-    var sort = typeof options.sort === 'function' ? options.sort : null;
-    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;
-    var objKeys;
-    var filter;
-
-    if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {
-        throw new TypeError('Encoder has to be a function.');
-    }
-
-    if (typeof options.filter === 'function') {
-        filter = options.filter;
-        obj = filter('', obj);
-    } else if (Array.isArray(options.filter)) {
-        objKeys = filter = options.filter;
-    }
-
-    var keys = [];
-
-    if (typeof obj !== 'object' || obj === null) {
-        return '';
-    }
-
-    var arrayFormat;
-    if (options.arrayFormat in arrayPrefixGenerators) {
-        arrayFormat = options.arrayFormat;
-    } else if ('indices' in options) {
-        arrayFormat = options.indices ? 'indices' : 'repeat';
-    } else {
-        arrayFormat = 'indices';
-    }
-
-    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
-
-    if (!objKeys) {
-        objKeys = Object.keys(obj);
-    }
-
-    if (sort) {
-        objKeys.sort(sort);
-    }
-
-    for (var i = 0; i < objKeys.length; ++i) {
-        var key = objKeys[i];
-
-        if (skipNulls && obj[key] === null) {
-            continue;
-        }
-
-        keys = keys.concat(stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
-    }
-
-    return keys.join(delimiter);
-};
-
-},{"./utils":4}],4:[function(require,module,exports){
-'use strict';
-
-var hexTable = (function () {
-    var array = new Array(256);
-    for (var i = 0; i < 256; ++i) {
-        array[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();
-    }
-
-    return array;
-}());
-
-exports.arrayToObject = function (source, options) {
-    var obj = options.plainObjects ? Object.create(null) : {};
-    for (var i = 0; i < source.length; ++i) {
-        if (typeof source[i] !== 'undefined') {
-            obj[i] = source[i];
-        }
-    }
-
-    return obj;
-};
-
-exports.merge = function (target, source, options) {
-    if (!source) {
-        return target;
-    }
-
-    if (typeof source !== 'object') {
-        if (Array.isArray(target)) {
-            target.push(source);
-        } else if (typeof target === 'object') {
-            target[source] = true;
-        } else {
-            return [target, source];
-        }
-
-        return target;
-    }
-
-    if (typeof target !== 'object') {
-        return [target].concat(source);
-    }
-
-    var mergeTarget = target;
-    if (Array.isArray(target) && !Array.isArray(source)) {
-        mergeTarget = exports.arrayToObject(target, options);
-    }
-
-    return Object.keys(source).reduce(function (acc, key) {
-        var value = source[key];
-
-        if (Object.prototype.hasOwnProperty.call(acc, key)) {
-            acc[key] = exports.merge(acc[key], value, options);
-        } else {
-            acc[key] = value;
-        }
-        return acc;
-    }, mergeTarget);
-};
-
-exports.decode = function (str) {
-    try {
-        return decodeURIComponent(str.replace(/\+/g, ' '));
-    } catch (e) {
-        return str;
-    }
-};
-
-exports.encode = function (str) {
-    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
-    // It has been adapted here for stricter adherence to RFC 3986
-    if (str.length === 0) {
-        return str;
-    }
-
-    var string = typeof str === 'string' ? str : String(str);
-
-    var out = '';
-    for (var i = 0; i < string.length; ++i) {
-        var c = string.charCodeAt(i);
-
-        if (
-            c === 0x2D || // -
-            c === 0x2E || // .
-            c === 0x5F || // _
-            c === 0x7E || // ~
-            (c >= 0x30 && c <= 0x39) || // 0-9
-            (c >= 0x41 && c <= 0x5A) || // a-z
-            (c >= 0x61 && c <= 0x7A) // A-Z
-        ) {
-            out += string.charAt(i);
-            continue;
-        }
-
-        if (c < 0x80) {
-            out = out + hexTable[c];
-            continue;
-        }
-
-        if (c < 0x800) {
-            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
-            continue;
-        }
-
-        if (c < 0xD800 || c >= 0xE000) {
-            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
-            continue;
-        }
-
-        i += 1;
-        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
-        out += hexTable[0xF0 | (c >> 18)] + hexTable[0x80 | ((c >> 12) & 0x3F)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)];
-    }
-
-    return out;
-};
-
-exports.compact = function (obj, references) {
-    if (typeof obj !== 'object' || obj === null) {
-        return obj;
-    }
-
-    var refs = references || [];
-    var lookup = refs.indexOf(obj);
-    if (lookup !== -1) {
-        return refs[lookup];
-    }
-
-    refs.push(obj);
-
-    if (Array.isArray(obj)) {
-        var compacted = [];
-
-        for (var i = 0; i < obj.length; ++i) {
-            if (obj[i] && typeof obj[i] === 'object') {
-                compacted.push(exports.compact(obj[i], refs));
-            } else if (typeof obj[i] !== 'undefined') {
-                compacted.push(obj[i]);
-            }
-        }
-
-        return compacted;
-    }
-
-    var keys = Object.keys(obj);
-    for (var j = 0; j < keys.length; ++j) {
-        var key = keys[j];
-        obj[key] = exports.compact(obj[key], refs);
-    }
-
-    return obj;
-};
-
-exports.isRegExp = function (obj) {
-    return Object.prototype.toString.call(obj) === '[object RegExp]';
-};
-
-exports.isBuffer = function (obj) {
-    if (obj === null || typeof obj === 'undefined') {
-        return false;
-    }
-
-    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
-};
-
-},{}]},{},[1])(1)
-});
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/index.js
deleted file mode 100755
index 190195902a0cb0ae966a220fa3789f5ea5c3bfa0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/index.js
+++ /dev/null
@@ -1,9 +0,0 @@
-'use strict';
-
-var Stringify = require('./stringify');
-var Parse = require('./parse');
-
-module.exports = {
-    stringify: Stringify,
-    parse: Parse
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/parse.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/parse.js
deleted file mode 100755
index bf70fd8de87b80c9c11dbf66325bde0e8b881a0f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/parse.js
+++ /dev/null
@@ -1,167 +0,0 @@
-'use strict';
-
-var Utils = require('./utils');
-
-var defaults = {
-    delimiter: '&',
-    depth: 5,
-    arrayLimit: 20,
-    parameterLimit: 1000,
-    strictNullHandling: false,
-    plainObjects: false,
-    allowPrototypes: false,
-    allowDots: false,
-    decoder: Utils.decode
-};
-
-var parseValues = function parseValues(str, options) {
-    var obj = {};
-    var parts = str.split(options.delimiter, options.parameterLimit === Infinity ? undefined : options.parameterLimit);
-
-    for (var i = 0; i < parts.length; ++i) {
-        var part = parts[i];
-        var pos = part.indexOf(']=') === -1 ? part.indexOf('=') : part.indexOf(']=') + 1;
-
-        if (pos === -1) {
-            obj[options.decoder(part)] = '';
-
-            if (options.strictNullHandling) {
-                obj[options.decoder(part)] = null;
-            }
-        } else {
-            var key = options.decoder(part.slice(0, pos));
-            var val = options.decoder(part.slice(pos + 1));
-
-            if (Object.prototype.hasOwnProperty.call(obj, key)) {
-                obj[key] = [].concat(obj[key]).concat(val);
-            } else {
-                obj[key] = val;
-            }
-        }
-    }
-
-    return obj;
-};
-
-var parseObject = function parseObject(chain, val, options) {
-    if (!chain.length) {
-        return val;
-    }
-
-    var root = chain.shift();
-
-    var obj;
-    if (root === '[]') {
-        obj = [];
-        obj = obj.concat(parseObject(chain, val, options));
-    } else {
-        obj = options.plainObjects ? Object.create(null) : {};
-        var cleanRoot = root[0] === '[' && root[root.length - 1] === ']' ? root.slice(1, root.length - 1) : root;
-        var index = parseInt(cleanRoot, 10);
-        if (
-            !isNaN(index) &&
-            root !== cleanRoot &&
-            String(index) === cleanRoot &&
-            index >= 0 &&
-            (options.parseArrays && index <= options.arrayLimit)
-        ) {
-            obj = [];
-            obj[index] = parseObject(chain, val, options);
-        } else {
-            obj[cleanRoot] = parseObject(chain, val, options);
-        }
-    }
-
-    return obj;
-};
-
-var parseKeys = function parseKeys(givenKey, val, options) {
-    if (!givenKey) {
-        return;
-    }
-
-    // Transform dot notation to bracket notation
-    var key = options.allowDots ? givenKey.replace(/\.([^\.\[]+)/g, '[$1]') : givenKey;
-
-    // The regex chunks
-
-    var parent = /^([^\[\]]*)/;
-    var child = /(\[[^\[\]]*\])/g;
-
-    // Get the parent
-
-    var segment = parent.exec(key);
-
-    // Stash the parent if it exists
-
-    var keys = [];
-    if (segment[1]) {
-        // If we aren't using plain objects, optionally prefix keys
-        // that would overwrite object prototype properties
-        if (!options.plainObjects && Object.prototype.hasOwnProperty(segment[1])) {
-            if (!options.allowPrototypes) {
-                return;
-            }
-        }
-
-        keys.push(segment[1]);
-    }
-
-    // Loop through children appending to the array until we hit depth
-
-    var i = 0;
-    while ((segment = child.exec(key)) !== null && i < options.depth) {
-        i += 1;
-        if (!options.plainObjects && Object.prototype.hasOwnProperty(segment[1].replace(/\[|\]/g, ''))) {
-            if (!options.allowPrototypes) {
-                continue;
-            }
-        }
-        keys.push(segment[1]);
-    }
-
-    // If there's a remainder, just add whatever is left
-
-    if (segment) {
-        keys.push('[' + key.slice(segment.index) + ']');
-    }
-
-    return parseObject(keys, val, options);
-};
-
-module.exports = function (str, opts) {
-    var options = opts || {};
-
-    if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {
-        throw new TypeError('Decoder has to be a function.');
-    }
-
-    options.delimiter = typeof options.delimiter === 'string' || Utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;
-    options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;
-    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;
-    options.parseArrays = options.parseArrays !== false;
-    options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;
-    options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;
-    options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;
-    options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;
-    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;
-    options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
-
-    if (str === '' || str === null || typeof str === 'undefined') {
-        return options.plainObjects ? Object.create(null) : {};
-    }
-
-    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;
-    var obj = options.plainObjects ? Object.create(null) : {};
-
-    // Iterate over the keys and setup the new object
-
-    var keys = Object.keys(tempObj);
-    for (var i = 0; i < keys.length; ++i) {
-        var key = keys[i];
-        var newObj = parseKeys(key, tempObj[key], options);
-        obj = Utils.merge(obj, newObj, options);
-    }
-
-    return Utils.compact(obj);
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/stringify.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/stringify.js
deleted file mode 100755
index 6e1c9a263cd9791317a9ee11454d21842f0886e0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/stringify.js
+++ /dev/null
@@ -1,137 +0,0 @@
-'use strict';
-
-var Utils = require('./utils');
-
-var arrayPrefixGenerators = {
-    brackets: function brackets(prefix) {
-        return prefix + '[]';
-    },
-    indices: function indices(prefix, key) {
-        return prefix + '[' + key + ']';
-    },
-    repeat: function repeat(prefix) {
-        return prefix;
-    }
-};
-
-var defaults = {
-    delimiter: '&',
-    strictNullHandling: false,
-    skipNulls: false,
-    encode: true,
-    encoder: Utils.encode
-};
-
-var stringify = function stringify(object, prefix, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots) {
-    var obj = object;
-    if (typeof filter === 'function') {
-        obj = filter(prefix, obj);
-    } else if (obj instanceof Date) {
-        obj = obj.toISOString();
-    } else if (obj === null) {
-        if (strictNullHandling) {
-            return encoder ? encoder(prefix) : prefix;
-        }
-
-        obj = '';
-    }
-
-    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || Utils.isBuffer(obj)) {
-        if (encoder) {
-            return [encoder(prefix) + '=' + encoder(obj)];
-        }
-        return [prefix + '=' + String(obj)];
-    }
-
-    var values = [];
-
-    if (typeof obj === 'undefined') {
-        return values;
-    }
-
-    var objKeys;
-    if (Array.isArray(filter)) {
-        objKeys = filter;
-    } else {
-        var keys = Object.keys(obj);
-        objKeys = sort ? keys.sort(sort) : keys;
-    }
-
-    for (var i = 0; i < objKeys.length; ++i) {
-        var key = objKeys[i];
-
-        if (skipNulls && obj[key] === null) {
-            continue;
-        }
-
-        if (Array.isArray(obj)) {
-            values = values.concat(stringify(obj[key], generateArrayPrefix(prefix, key), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
-        } else {
-            values = values.concat(stringify(obj[key], prefix + (allowDots ? '.' + key : '[' + key + ']'), generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
-        }
-    }
-
-    return values;
-};
-
-module.exports = function (object, opts) {
-    var obj = object;
-    var options = opts || {};
-    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;
-    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;
-    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;
-    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;
-    var encoder = encode ? (typeof options.encoder === 'function' ? options.encoder : defaults.encoder) : null;
-    var sort = typeof options.sort === 'function' ? options.sort : null;
-    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;
-    var objKeys;
-    var filter;
-
-    if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {
-        throw new TypeError('Encoder has to be a function.');
-    }
-
-    if (typeof options.filter === 'function') {
-        filter = options.filter;
-        obj = filter('', obj);
-    } else if (Array.isArray(options.filter)) {
-        objKeys = filter = options.filter;
-    }
-
-    var keys = [];
-
-    if (typeof obj !== 'object' || obj === null) {
-        return '';
-    }
-
-    var arrayFormat;
-    if (options.arrayFormat in arrayPrefixGenerators) {
-        arrayFormat = options.arrayFormat;
-    } else if ('indices' in options) {
-        arrayFormat = options.indices ? 'indices' : 'repeat';
-    } else {
-        arrayFormat = 'indices';
-    }
-
-    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];
-
-    if (!objKeys) {
-        objKeys = Object.keys(obj);
-    }
-
-    if (sort) {
-        objKeys.sort(sort);
-    }
-
-    for (var i = 0; i < objKeys.length; ++i) {
-        var key = objKeys[i];
-
-        if (skipNulls && obj[key] === null) {
-            continue;
-        }
-
-        keys = keys.concat(stringify(obj[key], key, generateArrayPrefix, strictNullHandling, skipNulls, encoder, filter, sort, allowDots));
-    }
-
-    return keys.join(delimiter);
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/utils.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/utils.js
deleted file mode 100755
index 2c5c8ee503355b0fe20b04ad606378b6993bd018..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/lib/utils.js
+++ /dev/null
@@ -1,164 +0,0 @@
-'use strict';
-
-var hexTable = (function () {
-    var array = new Array(256);
-    for (var i = 0; i < 256; ++i) {
-        array[i] = '%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase();
-    }
-
-    return array;
-}());
-
-exports.arrayToObject = function (source, options) {
-    var obj = options.plainObjects ? Object.create(null) : {};
-    for (var i = 0; i < source.length; ++i) {
-        if (typeof source[i] !== 'undefined') {
-            obj[i] = source[i];
-        }
-    }
-
-    return obj;
-};
-
-exports.merge = function (target, source, options) {
-    if (!source) {
-        return target;
-    }
-
-    if (typeof source !== 'object') {
-        if (Array.isArray(target)) {
-            target.push(source);
-        } else if (typeof target === 'object') {
-            target[source] = true;
-        } else {
-            return [target, source];
-        }
-
-        return target;
-    }
-
-    if (typeof target !== 'object') {
-        return [target].concat(source);
-    }
-
-    var mergeTarget = target;
-    if (Array.isArray(target) && !Array.isArray(source)) {
-        mergeTarget = exports.arrayToObject(target, options);
-    }
-
-    return Object.keys(source).reduce(function (acc, key) {
-        var value = source[key];
-
-        if (Object.prototype.hasOwnProperty.call(acc, key)) {
-            acc[key] = exports.merge(acc[key], value, options);
-        } else {
-            acc[key] = value;
-        }
-        return acc;
-    }, mergeTarget);
-};
-
-exports.decode = function (str) {
-    try {
-        return decodeURIComponent(str.replace(/\+/g, ' '));
-    } catch (e) {
-        return str;
-    }
-};
-
-exports.encode = function (str) {
-    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.
-    // It has been adapted here for stricter adherence to RFC 3986
-    if (str.length === 0) {
-        return str;
-    }
-
-    var string = typeof str === 'string' ? str : String(str);
-
-    var out = '';
-    for (var i = 0; i < string.length; ++i) {
-        var c = string.charCodeAt(i);
-
-        if (
-            c === 0x2D || // -
-            c === 0x2E || // .
-            c === 0x5F || // _
-            c === 0x7E || // ~
-            (c >= 0x30 && c <= 0x39) || // 0-9
-            (c >= 0x41 && c <= 0x5A) || // a-z
-            (c >= 0x61 && c <= 0x7A) // A-Z
-        ) {
-            out += string.charAt(i);
-            continue;
-        }
-
-        if (c < 0x80) {
-            out = out + hexTable[c];
-            continue;
-        }
-
-        if (c < 0x800) {
-            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);
-            continue;
-        }
-
-        if (c < 0xD800 || c >= 0xE000) {
-            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);
-            continue;
-        }
-
-        i += 1;
-        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));
-        out += hexTable[0xF0 | (c >> 18)] + hexTable[0x80 | ((c >> 12) & 0x3F)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)];
-    }
-
-    return out;
-};
-
-exports.compact = function (obj, references) {
-    if (typeof obj !== 'object' || obj === null) {
-        return obj;
-    }
-
-    var refs = references || [];
-    var lookup = refs.indexOf(obj);
-    if (lookup !== -1) {
-        return refs[lookup];
-    }
-
-    refs.push(obj);
-
-    if (Array.isArray(obj)) {
-        var compacted = [];
-
-        for (var i = 0; i < obj.length; ++i) {
-            if (obj[i] && typeof obj[i] === 'object') {
-                compacted.push(exports.compact(obj[i], refs));
-            } else if (typeof obj[i] !== 'undefined') {
-                compacted.push(obj[i]);
-            }
-        }
-
-        return compacted;
-    }
-
-    var keys = Object.keys(obj);
-    for (var j = 0; j < keys.length; ++j) {
-        var key = keys[j];
-        obj[key] = exports.compact(obj[key], refs);
-    }
-
-    return obj;
-};
-
-exports.isRegExp = function (obj) {
-    return Object.prototype.toString.call(obj) === '[object RegExp]';
-};
-
-exports.isBuffer = function (obj) {
-    if (obj === null || typeof obj === 'undefined') {
-        return false;
-    }
-
-    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/package.json
deleted file mode 100644
index 67057bd05978f2cb3b569883f7db2b89e10faf53..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/package.json
+++ /dev/null
@@ -1,93 +0,0 @@
-{
-  "_from": "qs@>=6.2.0 <6.3.0",
-  "_id": "qs@6.2.0",
-  "_location": "/serialport/node-pre-gyp/request/qs",
-  "_nodeVersion": "6.1.0",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/qs-6.2.0.tgz_1462749349998_0.03372702235355973"
-  },
-  "_npmUser": {
-    "email": "ljharb@gmail.com",
-    "name": "ljharb"
-  },
-  "_npmVersion": "3.8.6",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz",
-  "_shasum": "3b7848c03c2dece69a9522b0fae8c4126d745f3b",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/ljharb/qs/issues"
-  },
-  "contributors": [
-    {
-      "name": "Jordan Harband",
-      "email": "ljharb@gmail.com",
-      "url": "http://ljharb.codes"
-    }
-  ],
-  "dependencies": {},
-  "description": "A querystring parser that supports nesting and arrays, with a depth limit",
-  "devDependencies": {
-    "@ljharb/eslint-config": "^4.0.0",
-    "browserify": "^13.0.1",
-    "covert": "^1.1.0",
-    "eslint": "^2.9.0",
-    "evalmd": "^0.0.17",
-    "iconv-lite": "^0.4.13",
-    "mkdirp": "^0.5.1",
-    "parallelshell": "^2.0.0",
-    "tape": "^4.5.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "3b7848c03c2dece69a9522b0fae8c4126d745f3b",
-    "tarball": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz"
-  },
-  "engines": {
-    "node": ">=0.6"
-  },
-  "gitHead": "d67d315b606c6bb809fedcbeebbbdb7f863852aa",
-  "homepage": "https://github.com/ljharb/qs",
-  "keywords": [
-    "qs",
-    "querystring"
-  ],
-  "license": "BSD-3-Clause",
-  "main": "lib/index.js",
-  "maintainers": [
-    {
-      "name": "hueniverse",
-      "email": "eran@hammer.io"
-    },
-    {
-      "name": "ljharb",
-      "email": "ljharb@gmail.com"
-    },
-    {
-      "name": "nlf",
-      "email": "quitlahok@gmail.com"
-    }
-  ],
-  "name": "qs",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/ljharb/qs.git"
-  },
-  "scripts": {
-    "coverage": "covert test",
-    "dist": "mkdirp dist && browserify --standalone Qs lib/index.js > dist/qs.js",
-    "lint": "eslint lib/*.js text/*.js",
-    "prepublish": "npm run dist",
-    "pretest": "parallelshell 'npm run --silent readme' 'npm run --silent lint'",
-    "readme": "evalmd README.md",
-    "test": "npm run --silent coverage",
-    "tests-only": "node test"
-  },
-  "version": "6.2.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/index.js
deleted file mode 100644
index b6a7d9526a90b6171e62dad0f4f714c7dff92b9d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-require('./parse');
-
-require('./stringify');
-
-require('./utils');
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/parse.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/parse.js
deleted file mode 100755
index 1b79daf534c2b33cf9fa6ca79c62d09a07fe4dd3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/parse.js
+++ /dev/null
@@ -1,423 +0,0 @@
-'use strict';
-
-var test = require('tape');
-var qs = require('../');
-var iconv = require('iconv-lite');
-
-test('parse()', function (t) {
-    t.test('parses a simple string', function (st) {
-        st.deepEqual(qs.parse('0=foo'), { '0': 'foo' });
-        st.deepEqual(qs.parse('foo=c++'), { foo: 'c  ' });
-        st.deepEqual(qs.parse('a[>=]=23'), { a: { '>=': '23' } });
-        st.deepEqual(qs.parse('a[<=>]==23'), { a: { '<=>': '=23' } });
-        st.deepEqual(qs.parse('a[==]=23'), { a: { '==': '23' } });
-        st.deepEqual(qs.parse('foo', { strictNullHandling: true }), { foo: null });
-        st.deepEqual(qs.parse('foo'), { foo: '' });
-        st.deepEqual(qs.parse('foo='), { foo: '' });
-        st.deepEqual(qs.parse('foo=bar'), { foo: 'bar' });
-        st.deepEqual(qs.parse(' foo = bar = baz '), { ' foo ': ' bar = baz ' });
-        st.deepEqual(qs.parse('foo=bar=baz'), { foo: 'bar=baz' });
-        st.deepEqual(qs.parse('foo=bar&bar=baz'), { foo: 'bar', bar: 'baz' });
-        st.deepEqual(qs.parse('foo2=bar2&baz2='), { foo2: 'bar2', baz2: '' });
-        st.deepEqual(qs.parse('foo=bar&baz', { strictNullHandling: true }), { foo: 'bar', baz: null });
-        st.deepEqual(qs.parse('foo=bar&baz'), { foo: 'bar', baz: '' });
-        st.deepEqual(qs.parse('cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World'), {
-            cht: 'p3',
-            chd: 't:60,40',
-            chs: '250x100',
-            chl: 'Hello|World'
-        });
-        st.end();
-    });
-
-    t.test('allows enabling dot notation', function (st) {
-        st.deepEqual(qs.parse('a.b=c'), { 'a.b': 'c' });
-        st.deepEqual(qs.parse('a.b=c', { allowDots: true }), { a: { b: 'c' } });
-        st.end();
-    });
-
-    t.deepEqual(qs.parse('a[b]=c'), { a: { b: 'c' } }, 'parses a single nested string');
-    t.deepEqual(qs.parse('a[b][c]=d'), { a: { b: { c: 'd' } } }, 'parses a double nested string');
-    t.deepEqual(
-        qs.parse('a[b][c][d][e][f][g][h]=i'),
-        { a: { b: { c: { d: { e: { f: { '[g][h]': 'i' } } } } } } },
-        'defaults to a depth of 5'
-    );
-
-    t.test('only parses one level when depth = 1', function (st) {
-        st.deepEqual(qs.parse('a[b][c]=d', { depth: 1 }), { a: { b: { '[c]': 'd' } } });
-        st.deepEqual(qs.parse('a[b][c][d]=e', { depth: 1 }), { a: { b: { '[c][d]': 'e' } } });
-        st.end();
-    });
-
-    t.deepEqual(qs.parse('a=b&a=c'), { a: ['b', 'c'] }, 'parses a simple array');
-
-    t.test('parses an explicit array', function (st) {
-        st.deepEqual(qs.parse('a[]=b'), { a: ['b'] });
-        st.deepEqual(qs.parse('a[]=b&a[]=c'), { a: ['b', 'c'] });
-        st.deepEqual(qs.parse('a[]=b&a[]=c&a[]=d'), { a: ['b', 'c', 'd'] });
-        st.end();
-    });
-
-    t.test('parses a mix of simple and explicit arrays', function (st) {
-        st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] });
-        st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] });
-        st.deepEqual(qs.parse('a[0]=b&a=c'), { a: ['b', 'c'] });
-        st.deepEqual(qs.parse('a=b&a[0]=c'), { a: ['b', 'c'] });
-        st.deepEqual(qs.parse('a[1]=b&a=c'), { a: ['b', 'c'] });
-        st.deepEqual(qs.parse('a=b&a[1]=c'), { a: ['b', 'c'] });
-        st.end();
-    });
-
-    t.test('parses a nested array', function (st) {
-        st.deepEqual(qs.parse('a[b][]=c&a[b][]=d'), { a: { b: ['c', 'd'] } });
-        st.deepEqual(qs.parse('a[>=]=25'), { a: { '>=': '25' } });
-        st.end();
-    });
-
-    t.test('allows to specify array indices', function (st) {
-        st.deepEqual(qs.parse('a[1]=c&a[0]=b&a[2]=d'), { a: ['b', 'c', 'd'] });
-        st.deepEqual(qs.parse('a[1]=c&a[0]=b'), { a: ['b', 'c'] });
-        st.deepEqual(qs.parse('a[1]=c'), { a: ['c'] });
-        st.end();
-    });
-
-    t.test('limits specific array indices to 20', function (st) {
-        st.deepEqual(qs.parse('a[20]=a'), { a: ['a'] });
-        st.deepEqual(qs.parse('a[21]=a'), { a: { '21': 'a' } });
-        st.end();
-    });
-
-    t.deepEqual(qs.parse('a[12b]=c'), { a: { '12b': 'c' } }, 'supports keys that begin with a number');
-
-    t.test('supports encoded = signs', function (st) {
-        st.deepEqual(qs.parse('he%3Dllo=th%3Dere'), { 'he=llo': 'th=ere' });
-        st.end();
-    });
-
-    t.test('is ok with url encoded strings', function (st) {
-        st.deepEqual(qs.parse('a[b%20c]=d'), { a: { 'b c': 'd' } });
-        st.deepEqual(qs.parse('a[b]=c%20d'), { a: { b: 'c d' } });
-        st.end();
-    });
-
-    t.test('allows brackets in the value', function (st) {
-        st.deepEqual(qs.parse('pets=["tobi"]'), { pets: '["tobi"]' });
-        st.deepEqual(qs.parse('operators=[">=", "<="]'), { operators: '[">=", "<="]' });
-        st.end();
-    });
-
-    t.test('allows empty values', function (st) {
-        st.deepEqual(qs.parse(''), {});
-        st.deepEqual(qs.parse(null), {});
-        st.deepEqual(qs.parse(undefined), {});
-        st.end();
-    });
-
-    t.test('transforms arrays to objects', function (st) {
-        st.deepEqual(qs.parse('foo[0]=bar&foo[bad]=baz'), { foo: { '0': 'bar', bad: 'baz' } });
-        st.deepEqual(qs.parse('foo[bad]=baz&foo[0]=bar'), { foo: { bad: 'baz', '0': 'bar' } });
-        st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar'), { foo: { bad: 'baz', '0': 'bar' } });
-        st.deepEqual(qs.parse('foo[]=bar&foo[bad]=baz'), { foo: { '0': 'bar', bad: 'baz' } });
-        st.deepEqual(qs.parse('foo[bad]=baz&foo[]=bar&foo[]=foo'), { foo: { bad: 'baz', '0': 'bar', '1': 'foo' } });
-        st.deepEqual(qs.parse('foo[0][a]=a&foo[0][b]=b&foo[1][a]=aa&foo[1][b]=bb'), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] });
-        st.deepEqual(qs.parse('a[]=b&a[t]=u&a[hasOwnProperty]=c'), { a: { '0': 'b', t: 'u', c: true } });
-        st.deepEqual(qs.parse('a[]=b&a[hasOwnProperty]=c&a[x]=y'), { a: { '0': 'b', '1': 'c', x: 'y' } });
-        st.end();
-    });
-
-    t.test('transforms arrays to objects (dot notation)', function (st) {
-        st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: 'baz' } });
-        st.deepEqual(qs.parse('foo[0].baz=bar&fool.bad.boo=baz', { allowDots: true }), { foo: [{ baz: 'bar' }], fool: { bad: { boo: 'baz' } } });
-        st.deepEqual(qs.parse('foo[0][0].baz=bar&fool.bad=baz', { allowDots: true }), { foo: [[{ baz: 'bar' }]], fool: { bad: 'baz' } });
-        st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15'], bar: '2' }] });
-        st.deepEqual(qs.parse('foo[0].baz[0]=15&foo[0].baz[1]=16&foo[0].bar=2', { allowDots: true }), { foo: [{ baz: ['15', '16'], bar: '2' }] });
-        st.deepEqual(qs.parse('foo.bad=baz&foo[0]=bar', { allowDots: true }), { foo: { bad: 'baz', '0': 'bar' } });
-        st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar', { allowDots: true }), { foo: { bad: 'baz', '0': 'bar' } });
-        st.deepEqual(qs.parse('foo[]=bar&foo.bad=baz', { allowDots: true }), { foo: { '0': 'bar', bad: 'baz' } });
-        st.deepEqual(qs.parse('foo.bad=baz&foo[]=bar&foo[]=foo', { allowDots: true }), { foo: { bad: 'baz', '0': 'bar', '1': 'foo' } });
-        st.deepEqual(qs.parse('foo[0].a=a&foo[0].b=b&foo[1].a=aa&foo[1].b=bb', { allowDots: true }), { foo: [{ a: 'a', b: 'b' }, { a: 'aa', b: 'bb' }] });
-        st.end();
-    });
-
-    t.deepEqual(qs.parse('a[b]=c&a=d'), { a: { b: 'c', d: true } }, 'can add keys to objects');
-
-    t.test('correctly prunes undefined values when converting an array to an object', function (st) {
-        st.deepEqual(qs.parse('a[2]=b&a[99999999]=c'), { a: { '2': 'b', '99999999': 'c' } });
-        st.end();
-    });
-
-    t.test('supports malformed uri characters', function (st) {
-        st.deepEqual(qs.parse('{%:%}', { strictNullHandling: true }), { '{%:%}': null });
-        st.deepEqual(qs.parse('{%:%}='), { '{%:%}': '' });
-        st.deepEqual(qs.parse('foo=%:%}'), { foo: '%:%}' });
-        st.end();
-    });
-
-    t.test('doesn\'t produce empty keys', function (st) {
-        st.deepEqual(qs.parse('_r=1&'), { '_r': '1' });
-        st.end();
-    });
-
-    t.test('cannot access Object prototype', function (st) {
-        qs.parse('constructor[prototype][bad]=bad');
-        qs.parse('bad[constructor][prototype][bad]=bad');
-        st.equal(typeof Object.prototype.bad, 'undefined');
-        st.end();
-    });
-
-    t.test('parses arrays of objects', function (st) {
-        st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] });
-        st.deepEqual(qs.parse('a[0][b]=c'), { a: [{ b: 'c' }] });
-        st.end();
-    });
-
-    t.test('allows for empty strings in arrays', function (st) {
-        st.deepEqual(qs.parse('a[]=b&a[]=&a[]=c'), { a: ['b', '', 'c'] });
-        st.deepEqual(qs.parse('a[0]=b&a[1]&a[2]=c&a[19]=', { strictNullHandling: true }), { a: ['b', null, 'c', ''] });
-        st.deepEqual(qs.parse('a[0]=b&a[1]=&a[2]=c&a[19]', { strictNullHandling: true }), { a: ['b', '', 'c', null] });
-        st.deepEqual(qs.parse('a[]=&a[]=b&a[]=c'), { a: ['', 'b', 'c'] });
-        st.end();
-    });
-
-    t.test('compacts sparse arrays', function (st) {
-        st.deepEqual(qs.parse('a[10]=1&a[2]=2'), { a: ['2', '1'] });
-        st.deepEqual(qs.parse('a[1][b][2][c]=1'), { a: [{ b: [{ c: '1' }] }] });
-        st.deepEqual(qs.parse('a[1][2][3][c]=1'), { a: [[[{ c: '1' }]]] });
-        st.deepEqual(qs.parse('a[1][2][3][c][1]=1'), { a: [[[{ c: ['1'] }]]] });
-        st.end();
-    });
-
-    t.test('parses semi-parsed strings', function (st) {
-        st.deepEqual(qs.parse({ 'a[b]': 'c' }), { a: { b: 'c' } });
-        st.deepEqual(qs.parse({ 'a[b]': 'c', 'a[d]': 'e' }), { a: { b: 'c', d: 'e' } });
-        st.end();
-    });
-
-    t.test('parses buffers correctly', function (st) {
-        var b = new Buffer('test');
-        st.deepEqual(qs.parse({ a: b }), { a: b });
-        st.end();
-    });
-
-    t.test('continues parsing when no parent is found', function (st) {
-        st.deepEqual(qs.parse('[]=&a=b'), { '0': '', a: 'b' });
-        st.deepEqual(qs.parse('[]&a=b', { strictNullHandling: true }), { '0': null, a: 'b' });
-        st.deepEqual(qs.parse('[foo]=bar'), { foo: 'bar' });
-        st.end();
-    });
-
-    t.test('does not error when parsing a very long array', function (st) {
-        var str = 'a[]=a';
-        while (Buffer.byteLength(str) < 128 * 1024) {
-            str = str + '&' + str;
-        }
-
-        st.doesNotThrow(function () { qs.parse(str); });
-
-        st.end();
-    });
-
-    t.test('should not throw when a native prototype has an enumerable property', { parallel: false }, function (st) {
-        Object.prototype.crash = '';
-        Array.prototype.crash = '';
-        st.doesNotThrow(qs.parse.bind(null, 'a=b'));
-        st.deepEqual(qs.parse('a=b'), { a: 'b' });
-        st.doesNotThrow(qs.parse.bind(null, 'a[][b]=c'));
-        st.deepEqual(qs.parse('a[][b]=c'), { a: [{ b: 'c' }] });
-        delete Object.prototype.crash;
-        delete Array.prototype.crash;
-        st.end();
-    });
-
-    t.test('parses a string with an alternative string delimiter', function (st) {
-        st.deepEqual(qs.parse('a=b;c=d', { delimiter: ';' }), { a: 'b', c: 'd' });
-        st.end();
-    });
-
-    t.test('parses a string with an alternative RegExp delimiter', function (st) {
-        st.deepEqual(qs.parse('a=b; c=d', { delimiter: /[;,] */ }), { a: 'b', c: 'd' });
-        st.end();
-    });
-
-    t.test('does not use non-splittable objects as delimiters', function (st) {
-        st.deepEqual(qs.parse('a=b&c=d', { delimiter: true }), { a: 'b', c: 'd' });
-        st.end();
-    });
-
-    t.test('allows overriding parameter limit', function (st) {
-        st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: 1 }), { a: 'b' });
-        st.end();
-    });
-
-    t.test('allows setting the parameter limit to Infinity', function (st) {
-        st.deepEqual(qs.parse('a=b&c=d', { parameterLimit: Infinity }), { a: 'b', c: 'd' });
-        st.end();
-    });
-
-    t.test('allows overriding array limit', function (st) {
-        st.deepEqual(qs.parse('a[0]=b', { arrayLimit: -1 }), { a: { '0': 'b' } });
-        st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: -1 }), { a: { '-1': 'b' } });
-        st.deepEqual(qs.parse('a[0]=b&a[1]=c', { arrayLimit: 0 }), { a: { '0': 'b', '1': 'c' } });
-        st.end();
-    });
-
-    t.test('allows disabling array parsing', function (st) {
-        st.deepEqual(qs.parse('a[0]=b&a[1]=c', { parseArrays: false }), { a: { '0': 'b', '1': 'c' } });
-        st.end();
-    });
-
-    t.test('parses an object', function (st) {
-        var input = {
-            'user[name]': { 'pop[bob]': 3 },
-            'user[email]': null
-        };
-
-        var expected = {
-            user: {
-                name: { 'pop[bob]': 3 },
-                email: null
-            }
-        };
-
-        var result = qs.parse(input);
-
-        st.deepEqual(result, expected);
-        st.end();
-    });
-
-    t.test('parses an object in dot notation', function (st) {
-        var input = {
-            'user.name': { 'pop[bob]': 3 },
-            'user.email.': null
-        };
-
-        var expected = {
-            user: {
-                name: { 'pop[bob]': 3 },
-                email: null
-            }
-        };
-
-        var result = qs.parse(input, { allowDots: true });
-
-        st.deepEqual(result, expected);
-        st.end();
-    });
-
-    t.test('parses an object and not child values', function (st) {
-        var input = {
-            'user[name]': { 'pop[bob]': { 'test': 3 } },
-            'user[email]': null
-        };
-
-        var expected = {
-            user: {
-                name: { 'pop[bob]': { 'test': 3 } },
-                email: null
-            }
-        };
-
-        var result = qs.parse(input);
-
-        st.deepEqual(result, expected);
-        st.end();
-    });
-
-    t.test('does not blow up when Buffer global is missing', function (st) {
-        var tempBuffer = global.Buffer;
-        delete global.Buffer;
-        var result = qs.parse('a=b&c=d');
-        global.Buffer = tempBuffer;
-        st.deepEqual(result, { a: 'b', c: 'd' });
-        st.end();
-    });
-
-    t.test('does not crash when parsing circular references', function (st) {
-        var a = {};
-        a.b = a;
-
-        var parsed;
-
-        st.doesNotThrow(function () {
-            parsed = qs.parse({ 'foo[bar]': 'baz', 'foo[baz]': a });
-        });
-
-        st.equal('foo' in parsed, true, 'parsed has "foo" property');
-        st.equal('bar' in parsed.foo, true);
-        st.equal('baz' in parsed.foo, true);
-        st.equal(parsed.foo.bar, 'baz');
-        st.deepEqual(parsed.foo.baz, a);
-        st.end();
-    });
-
-    t.test('parses plain objects correctly', function (st) {
-        var a = Object.create(null);
-        a.b = 'c';
-
-        st.deepEqual(qs.parse(a), { b: 'c' });
-        var result = qs.parse({ a: a });
-        st.equal('a' in result, true, 'result has "a" property');
-        st.deepEqual(result.a, a);
-        st.end();
-    });
-
-    t.test('parses dates correctly', function (st) {
-        var now = new Date();
-        st.deepEqual(qs.parse({ a: now }), { a: now });
-        st.end();
-    });
-
-    t.test('parses regular expressions correctly', function (st) {
-        var re = /^test$/;
-        st.deepEqual(qs.parse({ a: re }), { a: re });
-        st.end();
-    });
-
-    t.test('can allow overwriting prototype properties', function (st) {
-        st.deepEqual(qs.parse('a[hasOwnProperty]=b', { allowPrototypes: true }), { a: { hasOwnProperty: 'b' } }, { prototype: false });
-        st.deepEqual(qs.parse('hasOwnProperty=b', { allowPrototypes: true }), { hasOwnProperty: 'b' }, { prototype: false });
-        st.end();
-    });
-
-    t.test('can return plain objects', function (st) {
-        var expected = Object.create(null);
-        expected.a = Object.create(null);
-        expected.a.b = 'c';
-        expected.a.hasOwnProperty = 'd';
-        st.deepEqual(qs.parse('a[b]=c&a[hasOwnProperty]=d', { plainObjects: true }), expected);
-        st.deepEqual(qs.parse(null, { plainObjects: true }), Object.create(null));
-        var expectedArray = Object.create(null);
-        expectedArray.a = Object.create(null);
-        expectedArray.a['0'] = 'b';
-        expectedArray.a.c = 'd';
-        st.deepEqual(qs.parse('a[]=b&a[c]=d', { plainObjects: true }), expectedArray);
-        st.end();
-    });
-
-    t.test('can parse with custom encoding', function (st) {
-        st.deepEqual(qs.parse('%8c%a7=%91%e5%8d%e3%95%7b', {
-            decoder: function (str) {
-                var reg = /\%([0-9A-F]{2})/ig;
-                var result = [];
-                var parts;
-                var last = 0;
-                while (parts = reg.exec(str)) {
-                    result.push(parseInt(parts[1], 16));
-                    last = parts.index + parts[0].length;
-                }
-                return iconv.decode(new Buffer(result), 'shift_jis').toString();
-            }
-        }), { 県: '大阪府' });
-        st.end();
-    });
-
-    t.test('throws error with wrong decoder', function (st) {
-        st.throws(function () {
-            qs.parse({}, {
-                decoder: 'string'
-            });
-        }, new TypeError('Decoder has to be a function.'));
-        st.end();
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/stringify.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/stringify.js
deleted file mode 100755
index 699397e3346a9e0a11bcea0a11e164ec028ae2b8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/stringify.js
+++ /dev/null
@@ -1,305 +0,0 @@
-'use strict';
-
-var test = require('tape');
-var qs = require('../');
-var iconv = require('iconv-lite');
-
-test('stringify()', function (t) {
-    t.test('stringifies a querystring object', function (st) {
-        st.equal(qs.stringify({ a: 'b' }), 'a=b');
-        st.equal(qs.stringify({ a: 1 }), 'a=1');
-        st.equal(qs.stringify({ a: 1, b: 2 }), 'a=1&b=2');
-        st.equal(qs.stringify({ a: 'A_Z' }), 'a=A_Z');
-        st.equal(qs.stringify({ a: '€' }), 'a=%E2%82%AC');
-        st.equal(qs.stringify({ a: '' }), 'a=%EE%80%80');
-        st.equal(qs.stringify({ a: 'א' }), 'a=%D7%90');
-        st.equal(qs.stringify({ a: '𐐷' }), 'a=%F0%90%90%B7');
-        st.end();
-    });
-
-    t.test('stringifies a nested object', function (st) {
-        st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');
-        st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }), 'a%5Bb%5D%5Bc%5D%5Bd%5D=e');
-        st.end();
-    });
-
-    t.test('stringifies a nested object with dots notation', function (st) {
-        st.equal(qs.stringify({ a: { b: 'c' } }, { allowDots: true }), 'a.b=c');
-        st.equal(qs.stringify({ a: { b: { c: { d: 'e' } } } }, { allowDots: true }), 'a.b.c.d=e');
-        st.end();
-    });
-
-    t.test('stringifies an array value', function (st) {
-        st.equal(qs.stringify({ a: ['b', 'c', 'd'] }), 'a%5B0%5D=b&a%5B1%5D=c&a%5B2%5D=d');
-        st.end();
-    });
-
-    t.test('omits nulls when asked', function (st) {
-        st.equal(qs.stringify({ a: 'b', c: null }, { skipNulls: true }), 'a=b');
-        st.end();
-    });
-
-
-    t.test('omits nested nulls when asked', function (st) {
-        st.equal(qs.stringify({ a: { b: 'c', d: null } }, { skipNulls: true }), 'a%5Bb%5D=c');
-        st.end();
-    });
-
-    t.test('omits array indices when asked', function (st) {
-        st.equal(qs.stringify({ a: ['b', 'c', 'd'] }, { indices: false }), 'a=b&a=c&a=d');
-        st.end();
-    });
-
-    t.test('stringifies a nested array value', function (st) {
-        st.equal(qs.stringify({ a: { b: ['c', 'd'] } }), 'a%5Bb%5D%5B0%5D=c&a%5Bb%5D%5B1%5D=d');
-        st.end();
-    });
-
-    t.test('stringifies a nested array value with dots notation', function (st) {
-        st.equal(qs.stringify({ a: { b: ['c', 'd'] } }, { allowDots: true, encode: false }), 'a.b[0]=c&a.b[1]=d');
-        st.end();
-    });
-
-    t.test('stringifies an object inside an array', function (st) {
-        st.equal(qs.stringify({ a: [{ b: 'c' }] }), 'a%5B0%5D%5Bb%5D=c');
-        st.equal(qs.stringify({ a: [{ b: { c: [1] } }] }), 'a%5B0%5D%5Bb%5D%5Bc%5D%5B0%5D=1');
-        st.end();
-    });
-
-    t.test('stringifies an array with mixed objects and primitives', function (st) {
-        st.equal(qs.stringify({ a: [{ b: 1 }, 2, 3] }, { encode: false }), 'a[0][b]=1&a[1]=2&a[2]=3');
-        st.end();
-    });
-
-    t.test('stringifies an object inside an array with dots notation', function (st) {
-        st.equal(qs.stringify({ a: [{ b: 'c' }] }, { allowDots: true, encode: false }), 'a[0].b=c');
-        st.equal(qs.stringify({ a: [{ b: { c: [1] } }] }, { allowDots: true, encode: false }), 'a[0].b.c[0]=1');
-        st.end();
-    });
-
-    t.test('does not omit object keys when indices = false', function (st) {
-        st.equal(qs.stringify({ a: [{ b: 'c' }] }, { indices: false }), 'a%5Bb%5D=c');
-        st.end();
-    });
-
-    t.test('uses indices notation for arrays when indices=true', function (st) {
-        st.equal(qs.stringify({ a: ['b', 'c'] }, { indices: true }), 'a%5B0%5D=b&a%5B1%5D=c');
-        st.end();
-    });
-
-    t.test('uses indices notation for arrays when no arrayFormat is specified', function (st) {
-        st.equal(qs.stringify({ a: ['b', 'c'] }), 'a%5B0%5D=b&a%5B1%5D=c');
-        st.end();
-    });
-
-    t.test('uses indices notation for arrays when no arrayFormat=indices', function (st) {
-        st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'indices' }), 'a%5B0%5D=b&a%5B1%5D=c');
-        st.end();
-    });
-
-    t.test('uses repeat notation for arrays when no arrayFormat=repeat', function (st) {
-        st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'repeat' }), 'a=b&a=c');
-        st.end();
-    });
-
-    t.test('uses brackets notation for arrays when no arrayFormat=brackets', function (st) {
-        st.equal(qs.stringify({ a: ['b', 'c'] }, { arrayFormat: 'brackets' }), 'a%5B%5D=b&a%5B%5D=c');
-        st.end();
-    });
-
-    t.test('stringifies a complicated object', function (st) {
-        st.equal(qs.stringify({ a: { b: 'c', d: 'e' } }), 'a%5Bb%5D=c&a%5Bd%5D=e');
-        st.end();
-    });
-
-    t.test('stringifies an empty value', function (st) {
-        st.equal(qs.stringify({ a: '' }), 'a=');
-        st.equal(qs.stringify({ a: null }, { strictNullHandling: true }), 'a');
-
-        st.equal(qs.stringify({ a: '', b: '' }), 'a=&b=');
-        st.equal(qs.stringify({ a: null, b: '' }, { strictNullHandling: true }), 'a&b=');
-
-        st.equal(qs.stringify({ a: { b: '' } }), 'a%5Bb%5D=');
-        st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: true }), 'a%5Bb%5D');
-        st.equal(qs.stringify({ a: { b: null } }, { strictNullHandling: false }), 'a%5Bb%5D=');
-
-        st.end();
-    });
-
-    t.test('stringifies an empty object', function (st) {
-        var obj = Object.create(null);
-        obj.a = 'b';
-        st.equal(qs.stringify(obj), 'a=b');
-        st.end();
-    });
-
-    t.test('returns an empty string for invalid input', function (st) {
-        st.equal(qs.stringify(undefined), '');
-        st.equal(qs.stringify(false), '');
-        st.equal(qs.stringify(null), '');
-        st.equal(qs.stringify(''), '');
-        st.end();
-    });
-
-    t.test('stringifies an object with an empty object as a child', function (st) {
-        var obj = {
-            a: Object.create(null)
-        };
-
-        obj.a.b = 'c';
-        st.equal(qs.stringify(obj), 'a%5Bb%5D=c');
-        st.end();
-    });
-
-    t.test('drops keys with a value of undefined', function (st) {
-        st.equal(qs.stringify({ a: undefined }), '');
-
-        st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: true }), 'a%5Bc%5D');
-        st.equal(qs.stringify({ a: { b: undefined, c: null } }, { strictNullHandling: false }), 'a%5Bc%5D=');
-        st.equal(qs.stringify({ a: { b: undefined, c: '' } }), 'a%5Bc%5D=');
-        st.end();
-    });
-
-    t.test('url encodes values', function (st) {
-        st.equal(qs.stringify({ a: 'b c' }), 'a=b%20c');
-        st.end();
-    });
-
-    t.test('stringifies a date', function (st) {
-        var now = new Date();
-        var str = 'a=' + encodeURIComponent(now.toISOString());
-        st.equal(qs.stringify({ a: now }), str);
-        st.end();
-    });
-
-    t.test('stringifies the weird object from qs', function (st) {
-        st.equal(qs.stringify({ 'my weird field': '~q1!2"\'w$5&7/z8)?' }), 'my%20weird%20field=~q1%212%22%27w%245%267%2Fz8%29%3F');
-        st.end();
-    });
-
-    t.test('skips properties that are part of the object prototype', function (st) {
-        Object.prototype.crash = 'test';
-        st.equal(qs.stringify({ a: 'b' }), 'a=b');
-        st.equal(qs.stringify({ a: { b: 'c' } }), 'a%5Bb%5D=c');
-        delete Object.prototype.crash;
-        st.end();
-    });
-
-    t.test('stringifies boolean values', function (st) {
-        st.equal(qs.stringify({ a: true }), 'a=true');
-        st.equal(qs.stringify({ a: { b: true } }), 'a%5Bb%5D=true');
-        st.equal(qs.stringify({ b: false }), 'b=false');
-        st.equal(qs.stringify({ b: { c: false } }), 'b%5Bc%5D=false');
-        st.end();
-    });
-
-    t.test('stringifies buffer values', function (st) {
-        st.equal(qs.stringify({ a: new Buffer('test') }), 'a=test');
-        st.equal(qs.stringify({ a: { b: new Buffer('test') } }), 'a%5Bb%5D=test');
-        st.end();
-    });
-
-    t.test('stringifies an object using an alternative delimiter', function (st) {
-        st.equal(qs.stringify({ a: 'b', c: 'd' }, { delimiter: ';' }), 'a=b;c=d');
-        st.end();
-    });
-
-    t.test('doesn\'t blow up when Buffer global is missing', function (st) {
-        var tempBuffer = global.Buffer;
-        delete global.Buffer;
-        var result = qs.stringify({ a: 'b', c: 'd' });
-        global.Buffer = tempBuffer;
-        st.equal(result, 'a=b&c=d');
-        st.end();
-    });
-
-    t.test('selects properties when filter=array', function (st) {
-        st.equal(qs.stringify({ a: 'b' }, { filter: ['a'] }), 'a=b');
-        st.equal(qs.stringify({ a: 1 }, { filter: [] }), '');
-        st.equal(qs.stringify({ a: { b: [1, 2, 3, 4], c: 'd' }, c: 'f' }, { filter: ['a', 'b', 0, 2] }), 'a%5Bb%5D%5B0%5D=1&a%5Bb%5D%5B2%5D=3');
-        st.end();
-    });
-
-    t.test('supports custom representations when filter=function', function (st) {
-        var calls = 0;
-        var obj = { a: 'b', c: 'd', e: { f: new Date(1257894000000) } };
-        var filterFunc = function (prefix, value) {
-            calls++;
-            if (calls === 1) {
-                st.equal(prefix, '', 'prefix is empty');
-                st.equal(value, obj);
-            } else if (prefix === 'c') {
-                return;
-            } else if (value instanceof Date) {
-                st.equal(prefix, 'e[f]');
-                return value.getTime();
-            }
-            return value;
-        };
-
-        st.equal(qs.stringify(obj, { filter: filterFunc }), 'a=b&e%5Bf%5D=1257894000000');
-        st.equal(calls, 5);
-        st.end();
-    });
-
-    t.test('can disable uri encoding', function (st) {
-        st.equal(qs.stringify({ a: 'b' }, { encode: false }), 'a=b');
-        st.equal(qs.stringify({ a: { b: 'c' } }, { encode: false }), 'a[b]=c');
-        st.equal(qs.stringify({ a: 'b', c: null }, { strictNullHandling: true, encode: false }), 'a=b&c');
-        st.end();
-    });
-
-    t.test('can sort the keys', function (st) {
-        var sort = function (a, b) { return a.localeCompare(b); };
-        st.equal(qs.stringify({ a: 'c', z: 'y', b: 'f' }, { sort: sort }), 'a=c&b=f&z=y');
-        st.equal(qs.stringify({ a: 'c', z: { j: 'a', i: 'b' }, b: 'f' }, { sort: sort }), 'a=c&b=f&z%5Bi%5D=b&z%5Bj%5D=a');
-        st.end();
-    });
-
-    t.test('can sort the keys at depth 3 or more too', function (st) {
-        var sort = function (a, b) { return a.localeCompare(b); };
-        st.equal(qs.stringify({ a: 'a', z: { zj: {zjb: 'zjb', zja: 'zja'}, zi: {zib: 'zib', zia: 'zia'} }, b: 'b' }, { sort: sort, encode: false }), 'a=a&b=b&z[zi][zia]=zia&z[zi][zib]=zib&z[zj][zja]=zja&z[zj][zjb]=zjb');
-        st.equal(qs.stringify({ a: 'a', z: { zj: {zjb: 'zjb', zja: 'zja'}, zi: {zib: 'zib', zia: 'zia'} }, b: 'b' }, { sort: null, encode: false }), 'a=a&z[zj][zjb]=zjb&z[zj][zja]=zja&z[zi][zib]=zib&z[zi][zia]=zia&b=b');
-        st.end();
-    });
-
-    t.test('can stringify with custom encoding', function (st) {
-        st.equal(qs.stringify({ 県: '大阪府', '': ''}, {
-            encoder: function (str) {
-                if (str.length === 0) {
-                    return '';
-                }
-                var buf = iconv.encode(str, 'shiftjis');
-                var result = [];
-                for (var i=0; i < buf.length; ++i) {
-                    result.push(buf.readUInt8(i).toString(16));
-                }
-                return '%' + result.join('%');
-            }
-        }), '%8c%a7=%91%e5%8d%e3%95%7b&=');
-        st.end();
-    });
-
-    t.test('throws error with wrong encoder', function (st) {
-        st.throws(function () {
-            qs.stringify({}, {
-                encoder: 'string'
-            });
-        }, new TypeError('Encoder has to be a function.'));
-        st.end();
-    });
-
-    t.test('can use custom encoder for a buffer object', {
-        skip: typeof Buffer === 'undefined'
-    }, function (st) {
-        st.equal(qs.stringify({ a: new Buffer([1]) }, {
-            encoder: function (buffer) {
-                if (typeof buffer === 'string') {
-                    return buffer;
-                }
-                return String.fromCharCode(buffer.readUInt8(0) + 97);
-            }
-        }), 'a=b');
-        st.end();
-    });
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/utils.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/utils.js
deleted file mode 100755
index 4a8d8246c9995c769e02283af320b7a1fa02d3da..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/qs/test/utils.js
+++ /dev/null
@@ -1,9 +0,0 @@
-'use strict';
-
-var test = require('tape');
-var utils = require('../lib/utils');
-
-test('merge()', function (t) {
-    t.deepEqual(utils.merge({ a: 'b' }, { a: 'c' }), { a: ['b', 'c'] }, 'merges two objects with the same key');
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.npmignore
deleted file mode 100644
index 7dccd970766aff6bd61d92a96b35a805c90678c6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.npmignore
+++ /dev/null
@@ -1,15 +0,0 @@
-lib-cov
-*.seed
-*.log
-*.csv
-*.dat
-*.out
-*.pid
-*.gz
-
-pids
-logs
-results
-
-node_modules
-npm-debug.log
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.travis.yml
deleted file mode 100644
index f1d0f13c8a54d0f8d78f86a1f9348f3c59750694..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - 0.4
-  - 0.6
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/LICENSE.txt b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/LICENSE.txt
deleted file mode 100644
index ab861acdc127bc49683648213dc7b34645e1b5c4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/LICENSE.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-Copyright (c) 2012 Michael Hart (michael.hart.au@gmail.com)
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/README.md
deleted file mode 100644
index 32fc9825565cb699948e1d546eacccd469440857..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# Decode streams into strings The Right Way(tm)
-
-```javascript
-var fs   = require('fs')
-var zlib = require('zlib')
-var strs = require('stringstream')
-
-var utf8Stream = fs.createReadStream('massiveLogFile.gz')
-  .pipe(zlib.createGunzip())
-  .pipe(strs('utf8'))
-```
-
-No need to deal with `setEncoding()` weirdness, just compose streams
-like they were supposed to be!
-
-Handles input and output encoding:
-
-```javascript
-// Stream from utf8 to hex to base64... Why not, ay.
-var hex64Stream = fs.createReadStream('myFile')
-  .pipe(strs('utf8', 'hex'))
-  .pipe(strs('hex', 'base64'))
-```
-
-Also deals with `base64` output correctly by aligning each emitted data
-chunk so that there are no dangling `=` characters:
-
-```javascript
-var stream = fs.createReadStream('myFile').pipe(strs('base64'))
-
-var base64Str = ''
-
-stream.on('data', function(data) { base64Str += data })
-stream.on('end', function() {
-  console.log('My base64 encoded file is: ' + base64Str) // Wouldn't work with setEncoding()
-  console.log('Original file is: ' + new Buffer(base64Str, 'base64'))
-})
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/example.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/example.js
deleted file mode 100644
index f82b85edc7ff87eec45f5bef020c85513768966d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/example.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var fs   = require('fs')
-var zlib = require('zlib')
-var strs = require('stringstream')
-
-var utf8Stream = fs.createReadStream('massiveLogFile.gz')
-  .pipe(zlib.createGunzip())
-  .pipe(strs('utf8'))
-
-utf8Stream.pipe(process.stdout)
-
-// Stream from utf8 to hex to base64... Why not, ay.
-var hex64Stream = fs.createReadStream('myFile')
-  .pipe(strs('utf8', 'hex'))
-  .pipe(strs('hex', 'base64'))
-
-hex64Stream.pipe(process.stdout)
-
-// Deals with base64 correctly by aligning chunks
-var stream = fs.createReadStream('myFile').pipe(strs('base64'))
-
-var base64Str = ''
-
-stream.on('data', function(data) { base64Str += data })
-stream.on('end', function() {
-  console.log('My base64 encoded file is: ' + base64Str) // Wouldn't work with setEncoding()
-  console.log('Original file is: ' + new Buffer(base64Str, 'base64'))
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/package.json
deleted file mode 100644
index b8b64c602615cbf0732b041f841e0d35ac59adf8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/package.json
+++ /dev/null
@@ -1,59 +0,0 @@
-{
-  "_from": "stringstream@>=0.0.4 <0.1.0",
-  "_id": "stringstream@0.0.5",
-  "_location": "/serialport/node-pre-gyp/request/stringstream",
-  "_nodeVersion": "4.2.1",
-  "_npmUser": {
-    "email": "michael.hart.au@gmail.com",
-    "name": "hichaelmart"
-  },
-  "_npmVersion": "2.14.8",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
-  "_shasum": "4e484cd4de5a0bbbee18e46307710a8a81621878",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "michael.hart.au@gmail.com",
-    "name": "Michael Hart",
-    "url": "http://github.com/mhart"
-  },
-  "bugs": {
-    "url": "https://github.com/mhart/StringStream/issues"
-  },
-  "dependencies": {},
-  "description": "Encode and decode streams into string streams",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "4e484cd4de5a0bbbee18e46307710a8a81621878",
-    "tarball": "http://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz"
-  },
-  "gitHead": "1efe3bf507bf3a1161f8473908b60e881d41422b",
-  "homepage": "https://github.com/mhart/StringStream#readme",
-  "keywords": [
-    "base64",
-    "gzip",
-    "stream",
-    "string"
-  ],
-  "license": "MIT",
-  "main": "stringstream.js",
-  "maintainers": [
-    {
-      "name": "hichaelmart",
-      "email": "michael.hart.au@gmail.com"
-    }
-  ],
-  "name": "stringstream",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/mhart/StringStream.git"
-  },
-  "scripts": {},
-  "version": "0.0.5"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/stringstream.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/stringstream.js
deleted file mode 100644
index 4ece1275f443858ceb4f61e7c32e1e6f6f09ed62..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/stringstream/stringstream.js
+++ /dev/null
@@ -1,102 +0,0 @@
-var util = require('util')
-var Stream = require('stream')
-var StringDecoder = require('string_decoder').StringDecoder
-
-module.exports = StringStream
-module.exports.AlignedStringDecoder = AlignedStringDecoder
-
-function StringStream(from, to) {
-  if (!(this instanceof StringStream)) return new StringStream(from, to)
-
-  Stream.call(this)
-
-  if (from == null) from = 'utf8'
-
-  this.readable = this.writable = true
-  this.paused = false
-  this.toEncoding = (to == null ? from : to)
-  this.fromEncoding = (to == null ? '' : from)
-  this.decoder = new AlignedStringDecoder(this.toEncoding)
-}
-util.inherits(StringStream, Stream)
-
-StringStream.prototype.write = function(data) {
-  if (!this.writable) {
-    var err = new Error('stream not writable')
-    err.code = 'EPIPE'
-    this.emit('error', err)
-    return false
-  }
-  if (this.fromEncoding) {
-    if (Buffer.isBuffer(data)) data = data.toString()
-    data = new Buffer(data, this.fromEncoding)
-  }
-  var string = this.decoder.write(data)
-  if (string.length) this.emit('data', string)
-  return !this.paused
-}
-
-StringStream.prototype.flush = function() {
-  if (this.decoder.flush) {
-    var string = this.decoder.flush()
-    if (string.length) this.emit('data', string)
-  }
-}
-
-StringStream.prototype.end = function() {
-  if (!this.writable && !this.readable) return
-  this.flush()
-  this.emit('end')
-  this.writable = this.readable = false
-  this.destroy()
-}
-
-StringStream.prototype.destroy = function() {
-  this.decoder = null
-  this.writable = this.readable = false
-  this.emit('close')
-}
-
-StringStream.prototype.pause = function() {
-  this.paused = true
-}
-
-StringStream.prototype.resume = function () {
-  if (this.paused) this.emit('drain')
-  this.paused = false
-}
-
-function AlignedStringDecoder(encoding) {
-  StringDecoder.call(this, encoding)
-
-  switch (this.encoding) {
-    case 'base64':
-      this.write = alignedWrite
-      this.alignedBuffer = new Buffer(3)
-      this.alignedBytes = 0
-      break
-  }
-}
-util.inherits(AlignedStringDecoder, StringDecoder)
-
-AlignedStringDecoder.prototype.flush = function() {
-  if (!this.alignedBuffer || !this.alignedBytes) return ''
-  var leftover = this.alignedBuffer.toString(this.encoding, 0, this.alignedBytes)
-  this.alignedBytes = 0
-  return leftover
-}
-
-function alignedWrite(buffer) {
-  var rem = (this.alignedBytes + buffer.length) % this.alignedBuffer.length
-  if (!rem && !this.alignedBytes) return buffer.toString(this.encoding)
-
-  var returnBuffer = new Buffer(this.alignedBytes + buffer.length - rem)
-
-  this.alignedBuffer.copy(returnBuffer, 0, 0, this.alignedBytes)
-  buffer.copy(returnBuffer, this.alignedBytes, 0, buffer.length - rem)
-
-  buffer.copy(this.alignedBuffer, 0, buffer.length - rem, buffer.length)
-  this.alignedBytes = rem
-
-  return returnBuffer.toString(this.encoding)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/LICENSE
deleted file mode 100644
index 1bc286fb579cd77402c51a5f7149117686577abb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/LICENSE
+++ /dev/null
@@ -1,27 +0,0 @@
-Copyright (c) 2015, Salesforce.com, Inc.
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
-
-2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
-
-3. Neither the name of Salesforce.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-===
-
-The following exceptions apply:
-
-===
-
-`public_suffix_list.dat` was obtained from
-<https://publicsuffix.org/list/public_suffix_list.dat> via
-<http://publicsuffix.org>. The license for this file is MPL/2.0.  The header of
-that file reads as follows:
-
-  // This Source Code Form is subject to the terms of the Mozilla Public
-  // License, v. 2.0. If a copy of the MPL was not distributed with this
-  // file, You can obtain one at http://mozilla.org/MPL/2.0/.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/README.md
deleted file mode 100644
index 9899dbf6eed156c0a50a9ff1ad5c54246a0a7319..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/README.md
+++ /dev/null
@@ -1,492 +0,0 @@
-[RFC6265](https://tools.ietf.org/html/rfc6265) Cookies and CookieJar for Node.js
-
-[![Build Status](https://travis-ci.org/SalesforceEng/tough-cookie.png?branch=master)](https://travis-ci.org/SalesforceEng/tough-cookie)
-
-[![NPM Stats](https://nodei.co/npm/tough-cookie.png?downloads=true&stars=true)](https://npmjs.org/package/tough-cookie)
-![NPM Downloads](https://nodei.co/npm-dl/tough-cookie.png?months=9)
-
-# Synopsis
-
-``` javascript
-var tough = require('tough-cookie');
-var Cookie = tough.Cookie;
-var cookie = Cookie.parse(header);
-cookie.value = 'somethingdifferent';
-header = cookie.toString();
-
-var cookiejar = new tough.CookieJar();
-cookiejar.setCookie(cookie, 'http://currentdomain.example.com/path', cb);
-// ...
-cookiejar.getCookies('http://example.com/otherpath',function(err,cookies) {
-  res.headers['cookie'] = cookies.join('; ');
-});
-```
-
-# Installation
-
-It's _so_ easy!
-
-`npm install tough-cookie`
-
-Why the name?  NPM modules `cookie`, `cookies` and `cookiejar` were already taken.
-
-# API
-
-## tough
-
-Functions on the module you get from `require('tough-cookie')`.  All can be used as pure functions and don't need to be "bound".
-
-**Note**: prior to 1.0.x, several of these functions took a `strict` parameter. This has since been removed from the API as it was no longer necessary.
-
-### `parseDate(string)`
-
-Parse a cookie date string into a `Date`.  Parses according to RFC6265 Section 5.1.1, not `Date.parse()`.
-
-### `formatDate(date)`
-
-Format a Date into a RFC1123 string (the RFC6265-recommended format).
-
-### `canonicalDomain(str)`
-
-Transforms a domain-name into a canonical domain-name.  The canonical domain-name is a trimmed, lowercased, stripped-of-leading-dot and optionally punycode-encoded domain-name (Section 5.1.2 of RFC6265).  For the most part, this function is idempotent (can be run again on its output without ill effects).
-
-### `domainMatch(str,domStr[,canonicalize=true])`
-
-Answers "does this real domain match the domain in a cookie?".  The `str` is the "current" domain-name and the `domStr` is the "cookie" domain-name.  Matches according to RFC6265 Section 5.1.3, but it helps to think of it as a "suffix match".
-
-The `canonicalize` parameter will run the other two paramters through `canonicalDomain` or not.
-
-### `defaultPath(path)`
-
-Given a current request/response path, gives the Path apropriate for storing in a cookie.  This is basically the "directory" of a "file" in the path, but is specified by Section 5.1.4 of the RFC.
-
-The `path` parameter MUST be _only_ the pathname part of a URI (i.e. excludes the hostname, query, fragment, etc.).  This is the `.pathname` property of node's `uri.parse()` output.
-
-### `pathMatch(reqPath,cookiePath)`
-
-Answers "does the request-path path-match a given cookie-path?" as per RFC6265 Section 5.1.4.  Returns a boolean.
-
-This is essentially a prefix-match where `cookiePath` is a prefix of `reqPath`.
-
-### `parse(cookieString[, options])`
-
-alias for `Cookie.parse(cookieString[, options])`
-
-### `fromJSON(string)`
-
-alias for `Cookie.fromJSON(string)`
-
-### `getPublicSuffix(hostname)`
-
-Returns the public suffix of this hostname.  The public suffix is the shortest domain-name upon which a cookie can be set.  Returns `null` if the hostname cannot have cookies set for it.
-
-For example: `www.example.com` and `www.subdomain.example.com` both have public suffix `example.com`.
-
-For further information, see http://publicsuffix.org/.  This module derives its list from that site.
-
-### `cookieCompare(a,b)`
-
-For use with `.sort()`, sorts a list of cookies into the recommended order given in the RFC (Section 5.4 step 2). The sort algorithm is, in order of precedence:
-
-* Longest `.path`
-* oldest `.creation` (which has a 1ms precision, same as `Date`)
-* lowest `.creationIndex` (to get beyond the 1ms precision)
-
-``` javascript
-var cookies = [ /* unsorted array of Cookie objects */ ];
-cookies = cookies.sort(cookieCompare);
-```
-
-**Note**: Since JavaScript's `Date` is limited to a 1ms precision, cookies within the same milisecond are entirely possible. This is especially true when using the `now` option to `.setCookie()`. The `.creationIndex` property is a per-process global counter, assigned during construction with `new Cookie()`. This preserves the spirit of the RFC sorting: older cookies go first. This works great for `MemoryCookieStore`, since `Set-Cookie` headers are parsed in order, but may not be so great for distributed systems. Sophisticated `Store`s may wish to set this to some other _logical clock_ such that if cookies A and B are created in the same millisecond, but cookie A is created before cookie B, then `A.creationIndex < B.creationIndex`. If you want to alter the global counter, which you probably _shouldn't_ do, it's stored in `Cookie.cookiesCreated`.
-
-### `permuteDomain(domain)`
-
-Generates a list of all possible domains that `domainMatch()` the parameter.  May be handy for implementing cookie stores.
-
-### `permutePath(path)`
-
-Generates a list of all possible paths that `pathMatch()` the parameter.  May be handy for implementing cookie stores.
-
-
-## Cookie
-
-Exported via `tough.Cookie`.
-
-### `Cookie.parse(cookieString[, options])`
-
-Parses a single Cookie or Set-Cookie HTTP header into a `Cookie` object.  Returns `undefined` if the string can't be parsed.
-
-The options parameter is not required and currently has only one property:
-
-  * _loose_ - boolean - if `true` enable parsing of key-less cookies like `=abc` and `=`, which are not RFC-compliant.
-
-If options is not an object, it is ignored, which means you can use `Array#map` with it.
-
-Here's how to process the Set-Cookie header(s) on a node HTTP/HTTPS response:
-
-``` javascript
-if (res.headers['set-cookie'] instanceof Array)
-  cookies = res.headers['set-cookie'].map(Cookie.parse);
-else
-  cookies = [Cookie.parse(res.headers['set-cookie'])];
-```
-
-### Properties
-
-Cookie object properties:
-
-  * _key_ - string - the name or key of the cookie (default "")
-  * _value_ - string - the value of the cookie (default "")
-  * _expires_ - `Date` - if set, the `Expires=` attribute of the cookie (defaults to the string `"Infinity"`). See `setExpires()`
-  * _maxAge_ - seconds - if set, the `Max-Age=` attribute _in seconds_ of the cookie.  May also be set to strings `"Infinity"` and `"-Infinity"` for non-expiry and immediate-expiry, respectively.  See `setMaxAge()`
-  * _domain_ - string - the `Domain=` attribute of the cookie
-  * _path_ - string - the `Path=` of the cookie
-  * _secure_ - boolean - the `Secure` cookie flag
-  * _httpOnly_ - boolean - the `HttpOnly` cookie flag
-  * _extensions_ - `Array` - any unrecognized cookie attributes as strings (even if equal-signs inside)
-  * _creation_ - `Date` - when this cookie was constructed
-  * _creationIndex_ - number - set at construction, used to provide greater sort precision (please see `cookieCompare(a,b)` for a full explanation)
-
-After a cookie has been passed through `CookieJar.setCookie()` it will have the following additional attributes:
-
-  * _hostOnly_ - boolean - is this a host-only cookie (i.e. no Domain field was set, but was instead implied)
-  * _pathIsDefault_ - boolean - if true, there was no Path field on the cookie and `defaultPath()` was used to derive one.
-  * _creation_ - `Date` - **modified** from construction to when the cookie was added to the jar
-  * _lastAccessed_ - `Date` - last time the cookie got accessed. Will affect cookie cleaning once implemented.  Using `cookiejar.getCookies(...)` will update this attribute.
-
-### `Cookie([{properties}])`
-
-Receives an options object that can contain any of the above Cookie properties, uses the default for unspecified properties.
-
-### `.toString()`
-
-encode to a Set-Cookie header value.  The Expires cookie field is set using `formatDate()`, but is omitted entirely if `.expires` is `Infinity`.
-
-### `.cookieString()`
-
-encode to a Cookie header value (i.e. the `.key` and `.value` properties joined with '=').
-
-### `.setExpires(String)`
-
-sets the expiry based on a date-string passed through `parseDate()`.  If parseDate returns `null` (i.e. can't parse this date string), `.expires` is set to `"Infinity"` (a string) is set.
-
-### `.setMaxAge(number)`
-
-sets the maxAge in seconds.  Coerces `-Infinity` to `"-Infinity"` and `Infinity` to `"Infinity"` so it JSON serializes correctly.
-
-### `.expiryTime([now=Date.now()])`
-
-### `.expiryDate([now=Date.now()])`
-
-expiryTime() Computes the absolute unix-epoch milliseconds that this cookie expires. expiryDate() works similarly, except it returns a `Date` object.  Note that in both cases the `now` parameter should be milliseconds.
-
-Max-Age takes precedence over Expires (as per the RFC). The `.creation` attribute -- or, by default, the `now` paramter -- is used to offset the `.maxAge` attribute.
-
-If Expires (`.expires`) is set, that's returned.
-
-Otherwise, `expiryTime()` returns `Infinity` and `expiryDate()` returns a `Date` object for "Tue, 19 Jan 2038 03:14:07 GMT" (latest date that can be expressed by a 32-bit `time_t`; the common limit for most user-agents).
-
-### `.TTL([now=Date.now()])`
-
-compute the TTL relative to `now` (milliseconds).  The same precedence rules as for `expiryTime`/`expiryDate` apply.
-
-The "number" `Infinity` is returned for cookies without an explicit expiry and `0` is returned if the cookie is expired.  Otherwise a time-to-live in milliseconds is returned.
-
-### `.canonicalizedDoman()`
-
-### `.cdomain()`
-
-return the canonicalized `.domain` field.  This is lower-cased and punycode (RFC3490) encoded if the domain has any non-ASCII characters.
-
-### `.toJSON()`
-
-For convenience in using `JSON.serialize(cookie)`. Returns a plain-old `Object` that can be JSON-serialized.
-
-Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are exported in ISO format (`.toISOString()`).
-
-**NOTE**: Custom `Cookie` properties will be discarded. In tough-cookie 1.x, since there was no `.toJSON` method explicitly defined, all enumerable properties were captured. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array.
-
-### `Cookie.fromJSON(strOrObj)`
-
-Does the reverse of `cookie.toJSON()`. If passed a string, will `JSON.parse()` that first.
-
-Any `Date` properties (i.e., `.expires`, `.creation`, and `.lastAccessed`) are parsed via `Date.parse()`, not the tough-cookie `parseDate`, since it's JavaScript/JSON-y timestamps being handled at this layer.
-
-Returns `null` upon JSON parsing error.
-
-### `.clone()`
-
-Does a deep clone of this cookie, exactly implemented as `Cookie.fromJSON(cookie.toJSON())`.
-
-### `.validate()`
-
-Status: *IN PROGRESS*. Works for a few things, but is by no means comprehensive.
-
-validates cookie attributes for semantic correctness.  Useful for "lint" checking any Set-Cookie headers you generate.  For now, it returns a boolean, but eventually could return a reason string -- you can future-proof with this construct:
-
-``` javascript
-if (cookie.validate() === true) {
-  // it's tasty
-} else {
-  // yuck!
-}
-```
-
-
-## CookieJar
-
-Exported via `tough.CookieJar`.
-
-### `CookieJar([store],[options])`
-
-Simply use `new CookieJar()`.  If you'd like to use a custom store, pass that to the constructor otherwise a `MemoryCookieStore` will be created and used.
-
-The `options` object can be omitted and can have the following properties:
-
-  * _rejectPublicSuffixes_ - boolean - default `true` - reject cookies with domains like "com" and "co.uk"
-  * _looseMode_ - boolean - default `false` - accept malformed cookies like `bar` and `=bar`, which have an implied empty name.
-    This is not in the standard, but is used sometimes on the web and is accepted by (most) browsers.
-
-Since eventually this module would like to support database/remote/etc. CookieJars, continuation passing style is used for CookieJar methods.
-
-### `.setCookie(cookieOrString, currentUrl, [{options},] cb(err,cookie))`
-
-Attempt to set the cookie in the cookie jar.  If the operation fails, an error will be given to the callback `cb`, otherwise the cookie is passed through.  The cookie will have updated `.creation`, `.lastAccessed` and `.hostOnly` properties.
-
-The `options` object can be omitted and can have the following properties:
-
-  * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API.  Affects HttpOnly cookies.
-  * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API.  If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`.
-  * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies
-  * _ignoreError_ - boolean - default `false` - silently ignore things like parse errors and invalid domains.  `Store` errors aren't ignored by this option.
-
-As per the RFC, the `.hostOnly` property is set if there was no "Domain=" parameter in the cookie string (or `.domain` was null on the Cookie object).  The `.domain` property is set to the fully-qualified hostname of `currentUrl` in this case.  Matching this cookie requires an exact hostname match (not a `domainMatch` as per usual).
-
-### `.setCookieSync(cookieOrString, currentUrl, [{options}])`
-
-Synchronous version of `setCookie`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
-
-### `.getCookies(currentUrl, [{options},] cb(err,cookies))`
-
-Retrieve the list of cookies that can be sent in a Cookie header for the current url.
-
-If an error is encountered, that's passed as `err` to the callback, otherwise an `Array` of `Cookie` objects is passed.  The array is sorted with `cookieCompare()` unless the `{sort:false}` option is given.
-
-The `options` object can be omitted and can have the following properties:
-
-  * _http_ - boolean - default `true` - indicates if this is an HTTP or non-HTTP API.  Affects HttpOnly cookies.
-  * _secure_ - boolean - autodetect from url - indicates if this is a "Secure" API.  If the currentUrl starts with `https:` or `wss:` then this is defaulted to `true`, otherwise `false`.
-  * _now_ - Date - default `new Date()` - what to use for the creation/access time of cookies
-  * _expire_ - boolean - default `true` - perform expiry-time checking of cookies and asynchronously remove expired cookies from the store.  Using `false` will return expired cookies and **not** remove them from the store (which is useful for replaying Set-Cookie headers, potentially).
-  * _allPaths_ - boolean - default `false` - if `true`, do not scope cookies by path. The default uses RFC-compliant path scoping. **Note**: may not be supported by the underlying store (the default `MemoryCookieStore` supports it).
-
-The `.lastAccessed` property of the returned cookies will have been updated.
-
-### `.getCookiesSync(currentUrl, [{options}])`
-
-Synchronous version of `getCookies`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
-
-### `.getCookieString(...)`
-
-Accepts the same options as `.getCookies()` but passes a string suitable for a Cookie header rather than an array to the callback.  Simply maps the `Cookie` array via `.cookieString()`.
-
-### `.getCookieStringSync(...)`
-
-Synchronous version of `getCookieString`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
-
-### `.getSetCookieStrings(...)`
-
-Returns an array of strings suitable for **Set-Cookie** headers. Accepts the same options as `.getCookies()`.  Simply maps the cookie array via `.toString()`.
-
-### `.getSetCookieStringsSync(...)`
-
-Synchronous version of `getSetCookieStrings`; only works with synchronous stores (e.g. the default `MemoryCookieStore`).
-
-### `.serialize(cb(err,serializedObject))`
-
-Serialize the Jar if the underlying store supports `.getAllCookies`.
-
-**NOTE**: Custom `Cookie` properties will be discarded. If you want a property to be serialized, add the property name to the `Cookie.serializableProperties` Array.
-
-See [Serialization Format].
-
-### `.serializeSync()`
-
-Sync version of .serialize
-
-### `.toJSON()`
-
-Alias of .serializeSync() for the convenience of `JSON.stringify(cookiejar)`.
-
-### `CookieJar.deserialize(serialized, [store], cb(err,object))`
-
-A new Jar is created and the serialized Cookies are added to the underlying store. Each `Cookie` is added via `store.putCookie` in the order in which they appear in the serialization.
-
-The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created.
-
-As a convenience, if `serialized` is a string, it is passed through `JSON.parse` first. If that throws an error, this is passed to the callback.
-
-### `CookieJar.deserializeSync(serialized, [store])`
-
-Sync version of `.deserialize`.  _Note_ that the `store` must be synchronous for this to work.
-
-### `CookieJar.fromJSON(string)`
-
-Alias of `.deserializeSync` to provide consistency with `Cookie.fromJSON()`.
-
-### `.clone([store,]cb(err,newJar))`
-
-Produces a deep clone of this jar. Modifications to the original won't affect the clone, and vice versa.
-
-The `store` argument is optional, but should be an instance of `Store`. By default, a new instance of `MemoryCookieStore` is created. Transferring between store types is supported so long as the source implements `.getAllCookies()` and the destination implements `.putCookie()`.
-
-### `.cloneSync([store])`
-
-Synchronous version of `.clone`, returning a new `CookieJar` instance.
-
-The `store` argument is optional, but must be a _synchronous_ `Store` instance if specified. If not passed, a new instance of `MemoryCookieStore` is used.
-
-The _source_ and _destination_ must both be synchronous `Store`s. If one or both stores are asynchronous, use `.clone` instead. Recall that `MemoryCookieStore` supports both synchronous and asynchronous API calls.
-
-## Store
-
-Base class for CookieJar stores. Available as `tough.Store`.
-
-## Store API
-
-The storage model for each `CookieJar` instance can be replaced with a custom implementation.  The default is `MemoryCookieStore` which can be found in the `lib/memstore.js` file.  The API uses continuation-passing-style to allow for asynchronous stores.
-
-Stores should inherit from the base `Store` class, which is available as `require('tough-cookie').Store`.
-
-Stores are asynchronous by default, but if `store.synchronous` is set to `true`, then the `*Sync` methods on the of the containing `CookieJar` can be used (however, the continuation-passing style
-
-All `domain` parameters will have been normalized before calling.
-
-The Cookie store must have all of the following methods.
-
-### `store.findCookie(domain, path, key, cb(err,cookie))`
-
-Retrieve a cookie with the given domain, path and key (a.k.a. name).  The RFC maintains that exactly one of these cookies should exist in a store.  If the store is using versioning, this means that the latest/newest such cookie should be returned.
-
-Callback takes an error and the resulting `Cookie` object.  If no cookie is found then `null` MUST be passed instead (i.e. not an error).
-
-### `store.findCookies(domain, path, cb(err,cookies))`
-
-Locates cookies matching the given domain and path.  This is most often called in the context of `cookiejar.getCookies()` above.
-
-If no cookies are found, the callback MUST be passed an empty array.
-
-The resulting list will be checked for applicability to the current request according to the RFC (domain-match, path-match, http-only-flag, secure-flag, expiry, etc.), so it's OK to use an optimistic search algorithm when implementing this method.  However, the search algorithm used SHOULD try to find cookies that `domainMatch()` the domain and `pathMatch()` the path in order to limit the amount of checking that needs to be done.
-
-As of version 0.9.12, the `allPaths` option to `cookiejar.getCookies()` above will cause the path here to be `null`.  If the path is `null`, path-matching MUST NOT be performed (i.e. domain-matching only).
-
-### `store.putCookie(cookie, cb(err))`
-
-Adds a new cookie to the store.  The implementation SHOULD replace any existing cookie with the same `.domain`, `.path`, and `.key` properties -- depending on the nature of the implementation, it's possible that between the call to `fetchCookie` and `putCookie` that a duplicate `putCookie` can occur.
-
-The `cookie` object MUST NOT be modified; the caller will have already updated the `.creation` and `.lastAccessed` properties.
-
-Pass an error if the cookie cannot be stored.
-
-### `store.updateCookie(oldCookie, newCookie, cb(err))`
-
-Update an existing cookie.  The implementation MUST update the `.value` for a cookie with the same `domain`, `.path` and `.key`.  The implementation SHOULD check that the old value in the store is equivalent to `oldCookie` - how the conflict is resolved is up to the store.
-
-The `.lastAccessed` property will always be different between the two objects (to the precision possible via JavaScript's clock).  Both `.creation` and `.creationIndex` are guaranteed to be the same.  Stores MAY ignore or defer the `.lastAccessed` change at the cost of affecting how cookies are selected for automatic deletion (e.g., least-recently-used, which is up to the store to implement).
-
-Stores may wish to optimize changing the `.value` of the cookie in the store versus storing a new cookie.  If the implementation doesn't define this method a stub that calls `putCookie(newCookie,cb)` will be added to the store object.
-
-The `newCookie` and `oldCookie` objects MUST NOT be modified.
-
-Pass an error if the newCookie cannot be stored.
-
-### `store.removeCookie(domain, path, key, cb(err))`
-
-Remove a cookie from the store (see notes on `findCookie` about the uniqueness constraint).
-
-The implementation MUST NOT pass an error if the cookie doesn't exist; only pass an error due to the failure to remove an existing cookie.
-
-### `store.removeCookies(domain, path, cb(err))`
-
-Removes matching cookies from the store.  The `path` parameter is optional, and if missing means all paths in a domain should be removed.
-
-Pass an error ONLY if removing any existing cookies failed.
-
-### `store.getAllCookies(cb(err, cookies))`
-
-Produces an `Array` of all cookies during `jar.serialize()`. The items in the array can be true `Cookie` objects or generic `Object`s with the [Serialization Format] data structure.
-
-Cookies SHOULD be returned in creation order to preserve sorting via `compareCookies()`. For reference, `MemoryCookieStore` will sort by `.creationIndex` since it uses true `Cookie` objects internally. If you don't return the cookies in creation order, they'll still be sorted by creation time, but this only has a precision of 1ms.  See `compareCookies` for more detail.
-
-Pass an error if retrieval fails.
-
-## MemoryCookieStore
-
-Inherits from `Store`.
-
-A just-in-memory CookieJar synchronous store implementation, used by default. Despite being a synchronous implementation, it's usable with both the synchronous and asynchronous forms of the `CookieJar` API.
-
-# Serialization Format
-
-**NOTE**: if you want to have custom `Cookie` properties serialized, add the property name to `Cookie.serializableProperties`.
-
-```js
-  {
-    // The version of tough-cookie that serialized this jar.
-    version: 'tough-cookie@1.x.y',
-
-    // add the store type, to make humans happy:
-    storeType: 'MemoryCookieStore',
-
-    // CookieJar configuration:
-    rejectPublicSuffixes: true,
-    // ... future items go here
-
-    // Gets filled from jar.store.getAllCookies():
-    cookies: [
-      {
-        key: 'string',
-        value: 'string',
-        // ...
-        /* other Cookie.serializableProperties go here */
-      }
-    ]
-  }
-```
-
-# Copyright and License
-
-(tl;dr: BSD-3-Clause with some MPL/2.0)
-
-```text
- Copyright (c) 2015, Salesforce.com, Inc.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-
- 3. Neither the name of Salesforce.com nor the names of its contributors may
- be used to endorse or promote products derived from this software without
- specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- POSSIBILITY OF SUCH DAMAGE.
-```
-
-Portions may be licensed under different licenses (in particular `public_suffix_list.dat` is MPL/2.0); please read that file and the LICENSE file for full details.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/cookie.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/cookie.js
deleted file mode 100644
index 12da297ac4d20fda50d6995f3631b213b8291043..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/cookie.js
+++ /dev/null
@@ -1,1342 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-'use strict';
-var net = require('net');
-var urlParse = require('url').parse;
-var pubsuffix = require('./pubsuffix');
-var Store = require('./store').Store;
-var MemoryCookieStore = require('./memstore').MemoryCookieStore;
-var pathMatch = require('./pathMatch').pathMatch;
-var VERSION = require('../package.json').version;
-
-var punycode;
-try {
-  punycode = require('punycode');
-} catch(e) {
-  console.warn("cookie: can't load punycode; won't use punycode for domain normalization");
-}
-
-var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/;
-
-// From RFC6265 S4.1.1
-// note that it excludes \x3B ";"
-var COOKIE_OCTET  = /[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]/;
-var COOKIE_OCTETS = new RegExp('^'+COOKIE_OCTET.source+'+$');
-
-var CONTROL_CHARS = /[\x00-\x1F]/;
-
-// Double quotes are part of the value (see: S4.1.1).
-// '\r', '\n' and '\0' should be treated as a terminator in the "relaxed" mode
-// (see: https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60)
-// '=' and ';' are attribute/values separators
-// (see: https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L64)
-var COOKIE_PAIR = /^(([^=;]+))\s*=\s*([^\n\r\0]*)/;
-
-// Used to parse non-RFC-compliant cookies like '=abc' when given the `loose`
-// option in Cookie.parse:
-var LOOSE_COOKIE_PAIR = /^((?:=)?([^=;]*)\s*=\s*)?([^\n\r\0]*)/;
-
-// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or ";"'
-// Note ';' is \x3B
-var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/;
-
-// Used for checking whether or not there is a trailing semi-colon
-var TRAILING_SEMICOLON = /;+$/;
-
-var DAY_OF_MONTH = /^(\d{1,2})[^\d]*$/;
-var TIME = /^(\d{1,2})[^\d]*:(\d{1,2})[^\d]*:(\d{1,2})[^\d]*$/;
-var MONTH = /^(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/i;
-
-var MONTH_TO_NUM = {
-  jan:0, feb:1, mar:2, apr:3, may:4, jun:5,
-  jul:6, aug:7, sep:8, oct:9, nov:10, dec:11
-};
-var NUM_TO_MONTH = [
-  'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'
-];
-var NUM_TO_DAY = [
-  'Sun','Mon','Tue','Wed','Thu','Fri','Sat'
-];
-
-var YEAR = /^(\d{2}|\d{4})$/; // 2 to 4 digits
-
-var MAX_TIME = 2147483647000; // 31-bit max
-var MIN_TIME = 0; // 31-bit min
-
-
-// RFC6265 S5.1.1 date parser:
-function parseDate(str) {
-  if (!str) {
-    return;
-  }
-
-  /* RFC6265 S5.1.1:
-   * 2. Process each date-token sequentially in the order the date-tokens
-   * appear in the cookie-date
-   */
-  var tokens = str.split(DATE_DELIM);
-  if (!tokens) {
-    return;
-  }
-
-  var hour = null;
-  var minutes = null;
-  var seconds = null;
-  var day = null;
-  var month = null;
-  var year = null;
-
-  for (var i=0; i<tokens.length; i++) {
-    var token = tokens[i].trim();
-    if (!token.length) {
-      continue;
-    }
-
-    var result;
-
-    /* 2.1. If the found-time flag is not set and the token matches the time
-     * production, set the found-time flag and set the hour- value,
-     * minute-value, and second-value to the numbers denoted by the digits in
-     * the date-token, respectively.  Skip the remaining sub-steps and continue
-     * to the next date-token.
-     */
-    if (seconds === null) {
-      result = TIME.exec(token);
-      if (result) {
-        hour = parseInt(result[1], 10);
-        minutes = parseInt(result[2], 10);
-        seconds = parseInt(result[3], 10);
-        /* RFC6265 S5.1.1.5:
-         * [fail if]
-         * *  the hour-value is greater than 23,
-         * *  the minute-value is greater than 59, or
-         * *  the second-value is greater than 59.
-         */
-        if(hour > 23 || minutes > 59 || seconds > 59) {
-          return;
-        }
-
-        continue;
-      }
-    }
-
-    /* 2.2. If the found-day-of-month flag is not set and the date-token matches
-     * the day-of-month production, set the found-day-of- month flag and set
-     * the day-of-month-value to the number denoted by the date-token.  Skip
-     * the remaining sub-steps and continue to the next date-token.
-     */
-    if (day === null) {
-      result = DAY_OF_MONTH.exec(token);
-      if (result) {
-        day = parseInt(result, 10);
-        /* RFC6265 S5.1.1.5:
-         * [fail if] the day-of-month-value is less than 1 or greater than 31
-         */
-        if(day < 1 || day > 31) {
-          return;
-        }
-        continue;
-      }
-    }
-
-    /* 2.3. If the found-month flag is not set and the date-token matches the
-     * month production, set the found-month flag and set the month-value to
-     * the month denoted by the date-token.  Skip the remaining sub-steps and
-     * continue to the next date-token.
-     */
-    if (month === null) {
-      result = MONTH.exec(token);
-      if (result) {
-        month = MONTH_TO_NUM[result[1].toLowerCase()];
-        continue;
-      }
-    }
-
-    /* 2.4. If the found-year flag is not set and the date-token matches the year
-     * production, set the found-year flag and set the year-value to the number
-     * denoted by the date-token.  Skip the remaining sub-steps and continue to
-     * the next date-token.
-     */
-    if (year === null) {
-      result = YEAR.exec(token);
-      if (result) {
-        year = parseInt(result[0], 10);
-        /* From S5.1.1:
-         * 3.  If the year-value is greater than or equal to 70 and less
-         * than or equal to 99, increment the year-value by 1900.
-         * 4.  If the year-value is greater than or equal to 0 and less
-         * than or equal to 69, increment the year-value by 2000.
-         */
-        if (70 <= year && year <= 99) {
-          year += 1900;
-        } else if (0 <= year && year <= 69) {
-          year += 2000;
-        }
-
-        if (year < 1601) {
-          return; // 5. ... the year-value is less than 1601
-        }
-      }
-    }
-  }
-
-  if (seconds === null || day === null || month === null || year === null) {
-    return; // 5. ... at least one of the found-day-of-month, found-month, found-
-            // year, or found-time flags is not set,
-  }
-
-  return new Date(Date.UTC(year, month, day, hour, minutes, seconds));
-}
-
-function formatDate(date) {
-  var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d;
-  var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h;
-  var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m;
-  var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s;
-  return NUM_TO_DAY[date.getUTCDay()] + ', ' +
-    d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+
-    h+':'+m+':'+s+' GMT';
-}
-
-// S5.1.2 Canonicalized Host Names
-function canonicalDomain(str) {
-  if (str == null) {
-    return null;
-  }
-  str = str.trim().replace(/^\./,''); // S4.1.2.3 & S5.2.3: ignore leading .
-
-  // convert to IDN if any non-ASCII characters
-  if (punycode && /[^\u0001-\u007f]/.test(str)) {
-    str = punycode.toASCII(str);
-  }
-
-  return str.toLowerCase();
-}
-
-// S5.1.3 Domain Matching
-function domainMatch(str, domStr, canonicalize) {
-  if (str == null || domStr == null) {
-    return null;
-  }
-  if (canonicalize !== false) {
-    str = canonicalDomain(str);
-    domStr = canonicalDomain(domStr);
-  }
-
-  /*
-   * "The domain string and the string are identical. (Note that both the
-   * domain string and the string will have been canonicalized to lower case at
-   * this point)"
-   */
-  if (str == domStr) {
-    return true;
-  }
-
-  /* "All of the following [three] conditions hold:" (order adjusted from the RFC) */
-
-  /* "* The string is a host name (i.e., not an IP address)." */
-  if (net.isIP(str)) {
-    return false;
-  }
-
-  /* "* The domain string is a suffix of the string" */
-  var idx = str.indexOf(domStr);
-  if (idx <= 0) {
-    return false; // it's a non-match (-1) or prefix (0)
-  }
-
-  // e.g "a.b.c".indexOf("b.c") === 2
-  // 5 === 3+2
-  if (str.length !== domStr.length + idx) { // it's not a suffix
-    return false;
-  }
-
-  /* "* The last character of the string that is not included in the domain
-  * string is a %x2E (".") character." */
-  if (str.substr(idx-1,1) !== '.') {
-    return false;
-  }
-
-  return true;
-}
-
-
-// RFC6265 S5.1.4 Paths and Path-Match
-
-/*
- * "The user agent MUST use an algorithm equivalent to the following algorithm
- * to compute the default-path of a cookie:"
- *
- * Assumption: the path (and not query part or absolute uri) is passed in.
- */
-function defaultPath(path) {
-  // "2. If the uri-path is empty or if the first character of the uri-path is not
-  // a %x2F ("/") character, output %x2F ("/") and skip the remaining steps.
-  if (!path || path.substr(0,1) !== "/") {
-    return "/";
-  }
-
-  // "3. If the uri-path contains no more than one %x2F ("/") character, output
-  // %x2F ("/") and skip the remaining step."
-  if (path === "/") {
-    return path;
-  }
-
-  var rightSlash = path.lastIndexOf("/");
-  if (rightSlash === 0) {
-    return "/";
-  }
-
-  // "4. Output the characters of the uri-path from the first character up to,
-  // but not including, the right-most %x2F ("/")."
-  return path.slice(0, rightSlash);
-}
-
-
-function parse(str, options) {
-  if (!options || typeof options !== 'object') {
-    options = {};
-  }
-  str = str.trim();
-
-  // S4.1.1 Trailing semi-colons are not part of the specification.
-  var semiColonCheck = TRAILING_SEMICOLON.exec(str);
-  if (semiColonCheck) {
-    str = str.slice(0, semiColonCheck.index);
-  }
-
-  // We use a regex to parse the "name-value-pair" part of S5.2
-  var firstSemi = str.indexOf(';'); // S5.2 step 1
-  var pairRe = options.loose ? LOOSE_COOKIE_PAIR : COOKIE_PAIR;
-  var result = pairRe.exec(firstSemi === -1 ? str : str.substr(0,firstSemi));
-
-  // Rx satisfies the "the name string is empty" and "lacks a %x3D ("=")"
-  // constraints as well as trimming any whitespace.
-  if (!result) {
-    return;
-  }
-
-  var c = new Cookie();
-  if (result[1]) {
-    c.key = result[2].trim();
-  } else {
-    c.key = '';
-  }
-  c.value = result[3].trim();
-  if (CONTROL_CHARS.test(c.key) || CONTROL_CHARS.test(c.value)) {
-    return;
-  }
-
-  if (firstSemi === -1) {
-    return c;
-  }
-
-  // S5.2.3 "unparsed-attributes consist of the remainder of the set-cookie-string
-  // (including the %x3B (";") in question)." plus later on in the same section
-  // "discard the first ";" and trim".
-  var unparsed = str.slice(firstSemi).replace(/^\s*;\s*/,'').trim();
-
-  // "If the unparsed-attributes string is empty, skip the rest of these
-  // steps."
-  if (unparsed.length === 0) {
-    return c;
-  }
-
-  /*
-   * S5.2 says that when looping over the items "[p]rocess the attribute-name
-   * and attribute-value according to the requirements in the following
-   * subsections" for every item.  Plus, for many of the individual attributes
-   * in S5.3 it says to use the "attribute-value of the last attribute in the
-   * cookie-attribute-list".  Therefore, in this implementation, we overwrite
-   * the previous value.
-   */
-  var cookie_avs = unparsed.split(/\s*;\s*/);
-  while (cookie_avs.length) {
-    var av = cookie_avs.shift();
-    var av_sep = av.indexOf('=');
-    var av_key, av_value;
-
-    if (av_sep === -1) {
-      av_key = av;
-      av_value = null;
-    } else {
-      av_key = av.substr(0,av_sep);
-      av_value = av.substr(av_sep+1);
-    }
-
-    av_key = av_key.trim().toLowerCase();
-
-    if (av_value) {
-      av_value = av_value.trim();
-    }
-
-    switch(av_key) {
-    case 'expires': // S5.2.1
-      if (av_value) {
-        var exp = parseDate(av_value);
-        // "If the attribute-value failed to parse as a cookie date, ignore the
-        // cookie-av."
-        if (exp) {
-          // over and underflow not realistically a concern: V8's getTime() seems to
-          // store something larger than a 32-bit time_t (even with 32-bit node)
-          c.expires = exp;
-        }
-      }
-      break;
-
-    case 'max-age': // S5.2.2
-      if (av_value) {
-        // "If the first character of the attribute-value is not a DIGIT or a "-"
-        // character ...[or]... If the remainder of attribute-value contains a
-        // non-DIGIT character, ignore the cookie-av."
-        if (/^-?[0-9]+$/.test(av_value)) {
-          var delta = parseInt(av_value, 10);
-          // "If delta-seconds is less than or equal to zero (0), let expiry-time
-          // be the earliest representable date and time."
-          c.setMaxAge(delta);
-        }
-      }
-      break;
-
-    case 'domain': // S5.2.3
-      // "If the attribute-value is empty, the behavior is undefined.  However,
-      // the user agent SHOULD ignore the cookie-av entirely."
-      if (av_value) {
-        // S5.2.3 "Let cookie-domain be the attribute-value without the leading %x2E
-        // (".") character."
-        var domain = av_value.trim().replace(/^\./, '');
-        if (domain) {
-          // "Convert the cookie-domain to lower case."
-          c.domain = domain.toLowerCase();
-        }
-      }
-      break;
-
-    case 'path': // S5.2.4
-      /*
-       * "If the attribute-value is empty or if the first character of the
-       * attribute-value is not %x2F ("/"):
-       *   Let cookie-path be the default-path.
-       * Otherwise:
-       *   Let cookie-path be the attribute-value."
-       *
-       * We'll represent the default-path as null since it depends on the
-       * context of the parsing.
-       */
-      c.path = av_value && av_value[0] === "/" ? av_value : null;
-      break;
-
-    case 'secure': // S5.2.5
-      /*
-       * "If the attribute-name case-insensitively matches the string "Secure",
-       * the user agent MUST append an attribute to the cookie-attribute-list
-       * with an attribute-name of Secure and an empty attribute-value."
-       */
-      c.secure = true;
-      break;
-
-    case 'httponly': // S5.2.6 -- effectively the same as 'secure'
-      c.httpOnly = true;
-      break;
-
-    default:
-      c.extensions = c.extensions || [];
-      c.extensions.push(av);
-      break;
-    }
-  }
-
-  return c;
-}
-
-// avoid the V8 deoptimization monster!
-function jsonParse(str) {
-  var obj;
-  try {
-    obj = JSON.parse(str);
-  } catch (e) {
-    return e;
-  }
-  return obj;
-}
-
-function fromJSON(str) {
-  if (!str) {
-    return null;
-  }
-
-  var obj;
-  if (typeof str === 'string') {
-    obj = jsonParse(str);
-    if (obj instanceof Error) {
-      return null;
-    }
-  } else {
-    // assume it's an Object
-    obj = str;
-  }
-
-  var c = new Cookie();
-  for (var i=0; i<Cookie.serializableProperties.length; i++) {
-    var prop = Cookie.serializableProperties[i];
-    if (obj[prop] === undefined ||
-        obj[prop] === Cookie.prototype[prop])
-    {
-      continue; // leave as prototype default
-    }
-
-    if (prop === 'expires' ||
-        prop === 'creation' ||
-        prop === 'lastAccessed')
-    {
-      if (obj[prop] === null) {
-        c[prop] = null;
-      } else {
-        c[prop] = obj[prop] == "Infinity" ?
-          "Infinity" : new Date(obj[prop]);
-      }
-    } else {
-      c[prop] = obj[prop];
-    }
-  }
-
-  return c;
-}
-
-/* Section 5.4 part 2:
- * "*  Cookies with longer paths are listed before cookies with
- *     shorter paths.
- *
- *  *  Among cookies that have equal-length path fields, cookies with
- *     earlier creation-times are listed before cookies with later
- *     creation-times."
- */
-
-function cookieCompare(a,b) {
-  var cmp = 0;
-
-  // descending for length: b CMP a
-  var aPathLen = a.path ? a.path.length : 0;
-  var bPathLen = b.path ? b.path.length : 0;
-  cmp = bPathLen - aPathLen;
-  if (cmp !== 0) {
-    return cmp;
-  }
-
-  // ascending for time: a CMP b
-  var aTime = a.creation ? a.creation.getTime() : MAX_TIME;
-  var bTime = b.creation ? b.creation.getTime() : MAX_TIME;
-  cmp = aTime - bTime;
-  if (cmp !== 0) {
-    return cmp;
-  }
-
-  // break ties for the same millisecond (precision of JavaScript's clock)
-  cmp = a.creationIndex - b.creationIndex;
-
-  return cmp;
-}
-
-// Gives the permutation of all possible pathMatch()es of a given path. The
-// array is in longest-to-shortest order.  Handy for indexing.
-function permutePath(path) {
-  if (path === '/') {
-    return ['/'];
-  }
-  if (path.lastIndexOf('/') === path.length-1) {
-    path = path.substr(0,path.length-1);
-  }
-  var permutations = [path];
-  while (path.length > 1) {
-    var lindex = path.lastIndexOf('/');
-    if (lindex === 0) {
-      break;
-    }
-    path = path.substr(0,lindex);
-    permutations.push(path);
-  }
-  permutations.push('/');
-  return permutations;
-}
-
-function getCookieContext(url) {
-  if (url instanceof Object) {
-    return url;
-  }
-  // NOTE: decodeURI will throw on malformed URIs (see GH-32).
-  // Therefore, we will just skip decoding for such URIs.
-  try {
-    url = decodeURI(url);
-  }
-  catch(err) {
-    // Silently swallow error
-  }
-
-  return urlParse(url);
-}
-
-function Cookie(options) {
-  options = options || {};
-
-  Object.keys(options).forEach(function(prop) {
-    if (Cookie.prototype.hasOwnProperty(prop) &&
-        Cookie.prototype[prop] !== options[prop] &&
-        prop.substr(0,1) !== '_')
-    {
-      this[prop] = options[prop];
-    }
-  }, this);
-
-  this.creation = this.creation || new Date();
-
-  // used to break creation ties in cookieCompare():
-  Object.defineProperty(this, 'creationIndex', {
-    configurable: false,
-    enumerable: false, // important for assert.deepEqual checks
-    writable: true,
-    value: ++Cookie.cookiesCreated
-  });
-}
-
-Cookie.cookiesCreated = 0; // incremented each time a cookie is created
-
-Cookie.parse = parse;
-Cookie.fromJSON = fromJSON;
-
-Cookie.prototype.key = "";
-Cookie.prototype.value = "";
-
-// the order in which the RFC has them:
-Cookie.prototype.expires = "Infinity"; // coerces to literal Infinity
-Cookie.prototype.maxAge = null; // takes precedence over expires for TTL
-Cookie.prototype.domain = null;
-Cookie.prototype.path = null;
-Cookie.prototype.secure = false;
-Cookie.prototype.httpOnly = false;
-Cookie.prototype.extensions = null;
-
-// set by the CookieJar:
-Cookie.prototype.hostOnly = null; // boolean when set
-Cookie.prototype.pathIsDefault = null; // boolean when set
-Cookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse
-Cookie.prototype.lastAccessed = null; // Date when set
-Object.defineProperty(Cookie.prototype, 'creationIndex', {
-  configurable: true,
-  enumerable: false,
-  writable: true,
-  value: 0
-});
-
-Cookie.serializableProperties = Object.keys(Cookie.prototype)
-  .filter(function(prop) {
-    return !(
-      Cookie.prototype[prop] instanceof Function ||
-      prop === 'creationIndex' ||
-      prop.substr(0,1) === '_'
-    );
-  });
-
-Cookie.prototype.inspect = function inspect() {
-  var now = Date.now();
-  return 'Cookie="'+this.toString() +
-    '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') +
-    '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') +
-    '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') +
-    '"';
-};
-
-Cookie.prototype.toJSON = function() {
-  var obj = {};
-
-  var props = Cookie.serializableProperties;
-  for (var i=0; i<props.length; i++) {
-    var prop = props[i];
-    if (this[prop] === Cookie.prototype[prop]) {
-      continue; // leave as prototype default
-    }
-
-    if (prop === 'expires' ||
-        prop === 'creation' ||
-        prop === 'lastAccessed')
-    {
-      if (this[prop] === null) {
-        obj[prop] = null;
-      } else {
-        obj[prop] = this[prop] == "Infinity" ? // intentionally not ===
-          "Infinity" : this[prop].toISOString();
-      }
-    } else if (prop === 'maxAge') {
-      if (this[prop] !== null) {
-        // again, intentionally not ===
-        obj[prop] = (this[prop] == Infinity || this[prop] == -Infinity) ?
-          this[prop].toString() : this[prop];
-      }
-    } else {
-      if (this[prop] !== Cookie.prototype[prop]) {
-        obj[prop] = this[prop];
-      }
-    }
-  }
-
-  return obj;
-};
-
-Cookie.prototype.clone = function() {
-  return fromJSON(this.toJSON());
-};
-
-Cookie.prototype.validate = function validate() {
-  if (!COOKIE_OCTETS.test(this.value)) {
-    return false;
-  }
-  if (this.expires != Infinity && !(this.expires instanceof Date) && !parseDate(this.expires)) {
-    return false;
-  }
-  if (this.maxAge != null && this.maxAge <= 0) {
-    return false; // "Max-Age=" non-zero-digit *DIGIT
-  }
-  if (this.path != null && !PATH_VALUE.test(this.path)) {
-    return false;
-  }
-
-  var cdomain = this.cdomain();
-  if (cdomain) {
-    if (cdomain.match(/\.$/)) {
-      return false; // S4.1.2.3 suggests that this is bad. domainMatch() tests confirm this
-    }
-    var suffix = pubsuffix.getPublicSuffix(cdomain);
-    if (suffix == null) { // it's a public suffix
-      return false;
-    }
-  }
-  return true;
-};
-
-Cookie.prototype.setExpires = function setExpires(exp) {
-  if (exp instanceof Date) {
-    this.expires = exp;
-  } else {
-    this.expires = parseDate(exp) || "Infinity";
-  }
-};
-
-Cookie.prototype.setMaxAge = function setMaxAge(age) {
-  if (age === Infinity || age === -Infinity) {
-    this.maxAge = age.toString(); // so JSON.stringify() works
-  } else {
-    this.maxAge = age;
-  }
-};
-
-// gives Cookie header format
-Cookie.prototype.cookieString = function cookieString() {
-  var val = this.value;
-  if (val == null) {
-    val = '';
-  }
-  if (this.key === '') {
-    return val;
-  }
-  return this.key+'='+val;
-};
-
-// gives Set-Cookie header format
-Cookie.prototype.toString = function toString() {
-  var str = this.cookieString();
-
-  if (this.expires != Infinity) {
-    if (this.expires instanceof Date) {
-      str += '; Expires='+formatDate(this.expires);
-    } else {
-      str += '; Expires='+this.expires;
-    }
-  }
-
-  if (this.maxAge != null && this.maxAge != Infinity) {
-    str += '; Max-Age='+this.maxAge;
-  }
-
-  if (this.domain && !this.hostOnly) {
-    str += '; Domain='+this.domain;
-  }
-  if (this.path) {
-    str += '; Path='+this.path;
-  }
-
-  if (this.secure) {
-    str += '; Secure';
-  }
-  if (this.httpOnly) {
-    str += '; HttpOnly';
-  }
-  if (this.extensions) {
-    this.extensions.forEach(function(ext) {
-      str += '; '+ext;
-    });
-  }
-
-  return str;
-};
-
-// TTL() partially replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
-// elsewhere)
-// S5.3 says to give the "latest representable date" for which we use Infinity
-// For "expired" we use 0
-Cookie.prototype.TTL = function TTL(now) {
-  /* RFC6265 S4.1.2.2 If a cookie has both the Max-Age and the Expires
-   * attribute, the Max-Age attribute has precedence and controls the
-   * expiration date of the cookie.
-   * (Concurs with S5.3 step 3)
-   */
-  if (this.maxAge != null) {
-    return this.maxAge<=0 ? 0 : this.maxAge*1000;
-  }
-
-  var expires = this.expires;
-  if (expires != Infinity) {
-    if (!(expires instanceof Date)) {
-      expires = parseDate(expires) || Infinity;
-    }
-
-    if (expires == Infinity) {
-      return Infinity;
-    }
-
-    return expires.getTime() - (now || Date.now());
-  }
-
-  return Infinity;
-};
-
-// expiryTime() replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
-// elsewhere)
-Cookie.prototype.expiryTime = function expiryTime(now) {
-  if (this.maxAge != null) {
-    var relativeTo = now || this.creation || new Date();
-    var age = (this.maxAge <= 0) ? -Infinity : this.maxAge*1000;
-    return relativeTo.getTime() + age;
-  }
-
-  if (this.expires == Infinity) {
-    return Infinity;
-  }
-  return this.expires.getTime();
-};
-
-// expiryDate() replaces the "expiry-time" parts of S5.3 step 3 (setCookie()
-// elsewhere), except it returns a Date
-Cookie.prototype.expiryDate = function expiryDate(now) {
-  var millisec = this.expiryTime(now);
-  if (millisec == Infinity) {
-    return new Date(MAX_TIME);
-  } else if (millisec == -Infinity) {
-    return new Date(MIN_TIME);
-  } else {
-    return new Date(millisec);
-  }
-};
-
-// This replaces the "persistent-flag" parts of S5.3 step 3
-Cookie.prototype.isPersistent = function isPersistent() {
-  return (this.maxAge != null || this.expires != Infinity);
-};
-
-// Mostly S5.1.2 and S5.2.3:
-Cookie.prototype.cdomain =
-Cookie.prototype.canonicalizedDomain = function canonicalizedDomain() {
-  if (this.domain == null) {
-    return null;
-  }
-  return canonicalDomain(this.domain);
-};
-
-function CookieJar(store, options) {
-  if (typeof options === "boolean") {
-    options = {rejectPublicSuffixes: options};
-  } else if (options == null) {
-    options = {};
-  }
-  if (options.rejectPublicSuffixes != null) {
-    this.rejectPublicSuffixes = options.rejectPublicSuffixes;
-  }
-  if (options.looseMode != null) {
-    this.enableLooseMode = options.looseMode;
-  }
-
-  if (!store) {
-    store = new MemoryCookieStore();
-  }
-  this.store = store;
-}
-CookieJar.prototype.store = null;
-CookieJar.prototype.rejectPublicSuffixes = true;
-CookieJar.prototype.enableLooseMode = false;
-var CAN_BE_SYNC = [];
-
-CAN_BE_SYNC.push('setCookie');
-CookieJar.prototype.setCookie = function(cookie, url, options, cb) {
-  var err;
-  var context = getCookieContext(url);
-  if (options instanceof Function) {
-    cb = options;
-    options = {};
-  }
-
-  var host = canonicalDomain(context.hostname);
-  var loose = this.enableLooseMode;
-  if (options.loose != null) {
-    loose = options.loose;
-  }
-
-  // S5.3 step 1
-  if (!(cookie instanceof Cookie)) {
-    cookie = Cookie.parse(cookie, { loose: loose });
-  }
-  if (!cookie) {
-    err = new Error("Cookie failed to parse");
-    return cb(options.ignoreError ? null : err);
-  }
-
-  // S5.3 step 2
-  var now = options.now || new Date(); // will assign later to save effort in the face of errors
-
-  // S5.3 step 3: NOOP; persistent-flag and expiry-time is handled by getCookie()
-
-  // S5.3 step 4: NOOP; domain is null by default
-
-  // S5.3 step 5: public suffixes
-  if (this.rejectPublicSuffixes && cookie.domain) {
-    var suffix = pubsuffix.getPublicSuffix(cookie.cdomain());
-    if (suffix == null) { // e.g. "com"
-      err = new Error("Cookie has domain set to a public suffix");
-      return cb(options.ignoreError ? null : err);
-    }
-  }
-
-  // S5.3 step 6:
-  if (cookie.domain) {
-    if (!domainMatch(host, cookie.cdomain(), false)) {
-      err = new Error("Cookie not in this host's domain. Cookie:"+cookie.cdomain()+" Request:"+host);
-      return cb(options.ignoreError ? null : err);
-    }
-
-    if (cookie.hostOnly == null) { // don't reset if already set
-      cookie.hostOnly = false;
-    }
-
-  } else {
-    cookie.hostOnly = true;
-    cookie.domain = host;
-  }
-
-  //S5.2.4 If the attribute-value is empty or if the first character of the
-  //attribute-value is not %x2F ("/"):
-  //Let cookie-path be the default-path.
-  if (!cookie.path || cookie.path[0] !== '/') {
-    cookie.path = defaultPath(context.pathname);
-    cookie.pathIsDefault = true;
-  }
-
-  // S5.3 step 8: NOOP; secure attribute
-  // S5.3 step 9: NOOP; httpOnly attribute
-
-  // S5.3 step 10
-  if (options.http === false && cookie.httpOnly) {
-    err = new Error("Cookie is HttpOnly and this isn't an HTTP API");
-    return cb(options.ignoreError ? null : err);
-  }
-
-  var store = this.store;
-
-  if (!store.updateCookie) {
-    store.updateCookie = function(oldCookie, newCookie, cb) {
-      this.putCookie(newCookie, cb);
-    };
-  }
-
-  function withCookie(err, oldCookie) {
-    if (err) {
-      return cb(err);
-    }
-
-    var next = function(err) {
-      if (err) {
-        return cb(err);
-      } else {
-        cb(null, cookie);
-      }
-    };
-
-    if (oldCookie) {
-      // S5.3 step 11 - "If the cookie store contains a cookie with the same name,
-      // domain, and path as the newly created cookie:"
-      if (options.http === false && oldCookie.httpOnly) { // step 11.2
-        err = new Error("old Cookie is HttpOnly and this isn't an HTTP API");
-        return cb(options.ignoreError ? null : err);
-      }
-      cookie.creation = oldCookie.creation; // step 11.3
-      cookie.creationIndex = oldCookie.creationIndex; // preserve tie-breaker
-      cookie.lastAccessed = now;
-      // Step 11.4 (delete cookie) is implied by just setting the new one:
-      store.updateCookie(oldCookie, cookie, next); // step 12
-
-    } else {
-      cookie.creation = cookie.lastAccessed = now;
-      store.putCookie(cookie, next); // step 12
-    }
-  }
-
-  store.findCookie(cookie.domain, cookie.path, cookie.key, withCookie);
-};
-
-// RFC6365 S5.4
-CAN_BE_SYNC.push('getCookies');
-CookieJar.prototype.getCookies = function(url, options, cb) {
-  var context = getCookieContext(url);
-  if (options instanceof Function) {
-    cb = options;
-    options = {};
-  }
-
-  var host = canonicalDomain(context.hostname);
-  var path = context.pathname || '/';
-
-  var secure = options.secure;
-  if (secure == null && context.protocol &&
-      (context.protocol == 'https:' || context.protocol == 'wss:'))
-  {
-    secure = true;
-  }
-
-  var http = options.http;
-  if (http == null) {
-    http = true;
-  }
-
-  var now = options.now || Date.now();
-  var expireCheck = options.expire !== false;
-  var allPaths = !!options.allPaths;
-  var store = this.store;
-
-  function matchingCookie(c) {
-    // "Either:
-    //   The cookie's host-only-flag is true and the canonicalized
-    //   request-host is identical to the cookie's domain.
-    // Or:
-    //   The cookie's host-only-flag is false and the canonicalized
-    //   request-host domain-matches the cookie's domain."
-    if (c.hostOnly) {
-      if (c.domain != host) {
-        return false;
-      }
-    } else {
-      if (!domainMatch(host, c.domain, false)) {
-        return false;
-      }
-    }
-
-    // "The request-uri's path path-matches the cookie's path."
-    if (!allPaths && !pathMatch(path, c.path)) {
-      return false;
-    }
-
-    // "If the cookie's secure-only-flag is true, then the request-uri's
-    // scheme must denote a "secure" protocol"
-    if (c.secure && !secure) {
-      return false;
-    }
-
-    // "If the cookie's http-only-flag is true, then exclude the cookie if the
-    // cookie-string is being generated for a "non-HTTP" API"
-    if (c.httpOnly && !http) {
-      return false;
-    }
-
-    // deferred from S5.3
-    // non-RFC: allow retention of expired cookies by choice
-    if (expireCheck && c.expiryTime() <= now) {
-      store.removeCookie(c.domain, c.path, c.key, function(){}); // result ignored
-      return false;
-    }
-
-    return true;
-  }
-
-  store.findCookies(host, allPaths ? null : path, function(err,cookies) {
-    if (err) {
-      return cb(err);
-    }
-
-    cookies = cookies.filter(matchingCookie);
-
-    // sorting of S5.4 part 2
-    if (options.sort !== false) {
-      cookies = cookies.sort(cookieCompare);
-    }
-
-    // S5.4 part 3
-    var now = new Date();
-    cookies.forEach(function(c) {
-      c.lastAccessed = now;
-    });
-    // TODO persist lastAccessed
-
-    cb(null,cookies);
-  });
-};
-
-CAN_BE_SYNC.push('getCookieString');
-CookieJar.prototype.getCookieString = function(/*..., cb*/) {
-  var args = Array.prototype.slice.call(arguments,0);
-  var cb = args.pop();
-  var next = function(err,cookies) {
-    if (err) {
-      cb(err);
-    } else {
-      cb(null, cookies
-        .sort(cookieCompare)
-        .map(function(c){
-          return c.cookieString();
-        })
-        .join('; '));
-    }
-  };
-  args.push(next);
-  this.getCookies.apply(this,args);
-};
-
-CAN_BE_SYNC.push('getSetCookieStrings');
-CookieJar.prototype.getSetCookieStrings = function(/*..., cb*/) {
-  var args = Array.prototype.slice.call(arguments,0);
-  var cb = args.pop();
-  var next = function(err,cookies) {
-    if (err) {
-      cb(err);
-    } else {
-      cb(null, cookies.map(function(c){
-        return c.toString();
-      }));
-    }
-  };
-  args.push(next);
-  this.getCookies.apply(this,args);
-};
-
-CAN_BE_SYNC.push('serialize');
-CookieJar.prototype.serialize = function(cb) {
-  var type = this.store.constructor.name;
-  if (type === 'Object') {
-    type = null;
-  }
-
-  // update README.md "Serialization Format" if you change this, please!
-  var serialized = {
-    // The version of tough-cookie that serialized this jar. Generally a good
-    // practice since future versions can make data import decisions based on
-    // known past behavior. When/if this matters, use `semver`.
-    version: 'tough-cookie@'+VERSION,
-
-    // add the store type, to make humans happy:
-    storeType: type,
-
-    // CookieJar configuration:
-    rejectPublicSuffixes: !!this.rejectPublicSuffixes,
-
-    // this gets filled from getAllCookies:
-    cookies: []
-  };
-
-  if (!(this.store.getAllCookies &&
-        typeof this.store.getAllCookies === 'function'))
-  {
-    return cb(new Error('store does not support getAllCookies and cannot be serialized'));
-  }
-
-  this.store.getAllCookies(function(err,cookies) {
-    if (err) {
-      return cb(err);
-    }
-
-    serialized.cookies = cookies.map(function(cookie) {
-      // convert to serialized 'raw' cookies
-      cookie = (cookie instanceof Cookie) ? cookie.toJSON() : cookie;
-
-      // Remove the index so new ones get assigned during deserialization
-      delete cookie.creationIndex;
-
-      return cookie;
-    });
-
-    return cb(null, serialized);
-  });
-};
-
-// well-known name that JSON.stringify calls
-CookieJar.prototype.toJSON = function() {
-  return this.serializeSync();
-};
-
-// use the class method CookieJar.deserialize instead of calling this directly
-CAN_BE_SYNC.push('_importCookies');
-CookieJar.prototype._importCookies = function(serialized, cb) {
-  var jar = this;
-  var cookies = serialized.cookies;
-  if (!cookies || !Array.isArray(cookies)) {
-    return cb(new Error('serialized jar has no cookies array'));
-  }
-
-  function putNext(err) {
-    if (err) {
-      return cb(err);
-    }
-
-    if (!cookies.length) {
-      return cb(err, jar);
-    }
-
-    var cookie;
-    try {
-      cookie = fromJSON(cookies.shift());
-    } catch (e) {
-      return cb(e);
-    }
-
-    if (cookie === null) {
-      return putNext(null); // skip this cookie
-    }
-
-    jar.store.putCookie(cookie, putNext);
-  }
-
-  putNext();
-};
-
-CookieJar.deserialize = function(strOrObj, store, cb) {
-  if (arguments.length !== 3) {
-    // store is optional
-    cb = store;
-    store = null;
-  }
-
-  var serialized;
-  if (typeof strOrObj === 'string') {
-    serialized = jsonParse(strOrObj);
-    if (serialized instanceof Error) {
-      return cb(serialized);
-    }
-  } else {
-    serialized = strOrObj;
-  }
-
-  var jar = new CookieJar(store, serialized.rejectPublicSuffixes);
-  jar._importCookies(serialized, function(err) {
-    if (err) {
-      return cb(err);
-    }
-    cb(null, jar);
-  });
-};
-
-CookieJar.deserializeSync = function(strOrObj, store) {
-  var serialized = typeof strOrObj === 'string' ?
-    JSON.parse(strOrObj) : strOrObj;
-  var jar = new CookieJar(store, serialized.rejectPublicSuffixes);
-
-  // catch this mistake early:
-  if (!jar.store.synchronous) {
-    throw new Error('CookieJar store is not synchronous; use async API instead.');
-  }
-
-  jar._importCookiesSync(serialized);
-  return jar;
-};
-CookieJar.fromJSON = CookieJar.deserializeSync;
-
-CAN_BE_SYNC.push('clone');
-CookieJar.prototype.clone = function(newStore, cb) {
-  if (arguments.length === 1) {
-    cb = newStore;
-    newStore = null;
-  }
-
-  this.serialize(function(err,serialized) {
-    if (err) {
-      return cb(err);
-    }
-    CookieJar.deserialize(newStore, serialized, cb);
-  });
-};
-
-// Use a closure to provide a true imperative API for synchronous stores.
-function syncWrap(method) {
-  return function() {
-    if (!this.store.synchronous) {
-      throw new Error('CookieJar store is not synchronous; use async API instead.');
-    }
-
-    var args = Array.prototype.slice.call(arguments);
-    var syncErr, syncResult;
-    args.push(function syncCb(err, result) {
-      syncErr = err;
-      syncResult = result;
-    });
-    this[method].apply(this, args);
-
-    if (syncErr) {
-      throw syncErr;
-    }
-    return syncResult;
-  };
-}
-
-// wrap all declared CAN_BE_SYNC methods in the sync wrapper
-CAN_BE_SYNC.forEach(function(method) {
-  CookieJar.prototype[method+'Sync'] = syncWrap(method);
-});
-
-module.exports = {
-  CookieJar: CookieJar,
-  Cookie: Cookie,
-  Store: Store,
-  MemoryCookieStore: MemoryCookieStore,
-  parseDate: parseDate,
-  formatDate: formatDate,
-  parse: parse,
-  fromJSON: fromJSON,
-  domainMatch: domainMatch,
-  defaultPath: defaultPath,
-  pathMatch: pathMatch,
-  getPublicSuffix: pubsuffix.getPublicSuffix,
-  cookieCompare: cookieCompare,
-  permuteDomain: require('./permuteDomain').permuteDomain,
-  permutePath: permutePath,
-  canonicalDomain: canonicalDomain
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/memstore.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/memstore.js
deleted file mode 100644
index 89ceb690004eff2050878c22150ecd1a5a3a98cb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/memstore.js
+++ /dev/null
@@ -1,170 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-'use strict';
-var Store = require('./store').Store;
-var permuteDomain = require('./permuteDomain').permuteDomain;
-var pathMatch = require('./pathMatch').pathMatch;
-var util = require('util');
-
-function MemoryCookieStore() {
-  Store.call(this);
-  this.idx = {};
-}
-util.inherits(MemoryCookieStore, Store);
-exports.MemoryCookieStore = MemoryCookieStore;
-MemoryCookieStore.prototype.idx = null;
-
-// Since it's just a struct in RAM, this Store is synchronous
-MemoryCookieStore.prototype.synchronous = true;
-
-// force a default depth:
-MemoryCookieStore.prototype.inspect = function() {
-  return "{ idx: "+util.inspect(this.idx, false, 2)+' }';
-};
-
-MemoryCookieStore.prototype.findCookie = function(domain, path, key, cb) {
-  if (!this.idx[domain]) {
-    return cb(null,undefined);
-  }
-  if (!this.idx[domain][path]) {
-    return cb(null,undefined);
-  }
-  return cb(null,this.idx[domain][path][key]||null);
-};
-
-MemoryCookieStore.prototype.findCookies = function(domain, path, cb) {
-  var results = [];
-  if (!domain) {
-    return cb(null,[]);
-  }
-
-  var pathMatcher;
-  if (!path) {
-    // null means "all paths"
-    pathMatcher = function matchAll(domainIndex) {
-      for (var curPath in domainIndex) {
-        var pathIndex = domainIndex[curPath];
-        for (var key in pathIndex) {
-          results.push(pathIndex[key]);
-        }
-      }
-    };
-
-  } else {
-    pathMatcher = function matchRFC(domainIndex) {
-       //NOTE: we should use path-match algorithm from S5.1.4 here
-       //(see : https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/canonical_cookie.cc#L299)
-       Object.keys(domainIndex).forEach(function (cookiePath) {
-         if (pathMatch(path, cookiePath)) {
-           var pathIndex = domainIndex[cookiePath];
-
-           for (var key in pathIndex) {
-             results.push(pathIndex[key]);
-           }
-         }
-       });
-     };
-  }
-
-  var domains = permuteDomain(domain) || [domain];
-  var idx = this.idx;
-  domains.forEach(function(curDomain) {
-    var domainIndex = idx[curDomain];
-    if (!domainIndex) {
-      return;
-    }
-    pathMatcher(domainIndex);
-  });
-
-  cb(null,results);
-};
-
-MemoryCookieStore.prototype.putCookie = function(cookie, cb) {
-  if (!this.idx[cookie.domain]) {
-    this.idx[cookie.domain] = {};
-  }
-  if (!this.idx[cookie.domain][cookie.path]) {
-    this.idx[cookie.domain][cookie.path] = {};
-  }
-  this.idx[cookie.domain][cookie.path][cookie.key] = cookie;
-  cb(null);
-};
-
-MemoryCookieStore.prototype.updateCookie = function(oldCookie, newCookie, cb) {
-  // updateCookie() may avoid updating cookies that are identical.  For example,
-  // lastAccessed may not be important to some stores and an equality
-  // comparison could exclude that field.
-  this.putCookie(newCookie,cb);
-};
-
-MemoryCookieStore.prototype.removeCookie = function(domain, path, key, cb) {
-  if (this.idx[domain] && this.idx[domain][path] && this.idx[domain][path][key]) {
-    delete this.idx[domain][path][key];
-  }
-  cb(null);
-};
-
-MemoryCookieStore.prototype.removeCookies = function(domain, path, cb) {
-  if (this.idx[domain]) {
-    if (path) {
-      delete this.idx[domain][path];
-    } else {
-      delete this.idx[domain];
-    }
-  }
-  return cb(null);
-};
-
-MemoryCookieStore.prototype.getAllCookies = function(cb) {
-  var cookies = [];
-  var idx = this.idx;
-
-  var domains = Object.keys(idx);
-  domains.forEach(function(domain) {
-    var paths = Object.keys(idx[domain]);
-    paths.forEach(function(path) {
-      var keys = Object.keys(idx[domain][path]);
-      keys.forEach(function(key) {
-        if (key !== null) {
-          cookies.push(idx[domain][path][key]);
-        }
-      });
-    });
-  });
-
-  // Sort by creationIndex so deserializing retains the creation order.
-  // When implementing your own store, this SHOULD retain the order too
-  cookies.sort(function(a,b) {
-    return (a.creationIndex||0) - (b.creationIndex||0);
-  });
-
-  cb(null, cookies);
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js
deleted file mode 100644
index 7c7a79f1f09beb6bcf33de6120b82770e1bdc562..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/pathMatch.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-"use strict";
-/*
- * "A request-path path-matches a given cookie-path if at least one of the
- * following conditions holds:"
- */
-function pathMatch (reqPath, cookiePath) {
-  // "o  The cookie-path and the request-path are identical."
-  if (cookiePath === reqPath) {
-    return true;
-  }
-
-  var idx = reqPath.indexOf(cookiePath);
-  if (idx === 0) {
-    // "o  The cookie-path is a prefix of the request-path, and the last
-    // character of the cookie-path is %x2F ("/")."
-    if (cookiePath.substr(-1) === "/") {
-      return true;
-    }
-
-    // " o  The cookie-path is a prefix of the request-path, and the first
-    // character of the request-path that is not included in the cookie- path
-    // is a %x2F ("/") character."
-    if (reqPath.substr(cookiePath.length, 1) === "/") {
-      return true;
-    }
-  }
-
-  return false;
-}
-
-exports.pathMatch = pathMatch;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js
deleted file mode 100644
index 8af841b65eb4a1fba15b923684d7f8c53a33713c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/permuteDomain.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-"use strict";
-var pubsuffix = require('./pubsuffix');
-
-// Gives the permutation of all possible domainMatch()es of a given domain. The
-// array is in shortest-to-longest order.  Handy for indexing.
-function permuteDomain (domain) {
-  var pubSuf = pubsuffix.getPublicSuffix(domain);
-  if (!pubSuf) {
-    return null;
-  }
-  if (pubSuf == domain) {
-    return [domain];
-  }
-
-  var prefix = domain.slice(0, -(pubSuf.length + 1)); // ".example.com"
-  var parts = prefix.split('.').reverse();
-  var cur = pubSuf;
-  var permutations = [cur];
-  while (parts.length) {
-    cur = parts.shift() + '.' + cur;
-    permutations.push(cur);
-  }
-  return permutations;
-}
-
-exports.permuteDomain = permuteDomain;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js
deleted file mode 100644
index 62fd3da3ffaa4d67cd12968c4a13562f7fb16eb1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/pubsuffix.js
+++ /dev/null
@@ -1,98 +0,0 @@
-/****************************************************
- * AUTOMATICALLY GENERATED by generate-pubsuffix.js *
- *                  DO NOT EDIT!                    *
- ****************************************************/
-
-"use strict";
-
-var punycode = require('punycode');
-
-module.exports.getPublicSuffix = function getPublicSuffix(domain) {
-  /*!
-   * Copyright (c) 2015, Salesforce.com, Inc.
-   * All rights reserved.
-   *
-   * Redistribution and use in source and binary forms, with or without
-   * modification, are permitted provided that the following conditions are met:
-   *
-   * 1. Redistributions of source code must retain the above copyright notice,
-   * this list of conditions and the following disclaimer.
-   *
-   * 2. Redistributions in binary form must reproduce the above copyright notice,
-   * this list of conditions and the following disclaimer in the documentation
-   * and/or other materials provided with the distribution.
-   *
-   * 3. Neither the name of Salesforce.com nor the names of its contributors may
-   * be used to endorse or promote products derived from this software without
-   * specific prior written permission.
-   *
-   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-   * POSSIBILITY OF SUCH DAMAGE.
-   */
-  if (!domain) {
-    return null;
-  }
-  if (domain.match(/^\./)) {
-    return null;
-  }
-  var asciiDomain = punycode.toASCII(domain);
-  var converted = false;
-  if (asciiDomain !== domain) {
-    domain = asciiDomain;
-    converted = true;
-  }
-  if (index[domain]) {
-    return null;
-  }
-
-  domain = domain.toLowerCase();
-  var parts = domain.split('.').reverse();
-
-  var suffix = '';
-  var suffixLen = 0;
-  for (var i=0; i<parts.length; i++) {
-    var part = parts[i];
-    var starstr = '*'+suffix;
-    var partstr = part+suffix;
-
-    if (index[starstr]) { // star rule matches
-      suffixLen = i+1;
-      if (index[partstr] === false) { // exception rule matches (NB: false, not undefined)
-        suffixLen--;
-      }
-    } else if (index[partstr]) { // exact match, not exception
-      suffixLen = i+1;
-    }
-
-    suffix = '.'+partstr;
-  }
-
-  if (index['*'+suffix]) { // *.domain exists (e.g. *.kyoto.jp for domain='kyoto.jp');
-    return null;
-  }
-
-  suffixLen = suffixLen || 1;
-  if (parts.length > suffixLen) {
-    var publicSuffix = parts.slice(0,suffixLen+1).reverse().join('.');
-    return converted ? punycode.toUnicode(publicSuffix) : publicSuffix;
-  }
-
-  return null;
-};
-
-// The following generated structure is used under the MPL version 2.0
-// See public-suffix.txt for more information
-
-var index = module.exports.index = Object.freeze(
-{"ac":true,"com.ac":true,"edu.ac":true,"gov.ac":true,"net.ac":true,"mil.ac":true,"org.ac":true,"ad":true,"nom.ad":true,"ae":true,"co.ae":true,"net.ae":true,"org.ae":true,"sch.ae":true,"ac.ae":true,"gov.ae":true,"mil.ae":true,"aero":true,"accident-investigation.aero":true,"accident-prevention.aero":true,"aerobatic.aero":true,"aeroclub.aero":true,"aerodrome.aero":true,"agents.aero":true,"aircraft.aero":true,"airline.aero":true,"airport.aero":true,"air-surveillance.aero":true,"airtraffic.aero":true,"air-traffic-control.aero":true,"ambulance.aero":true,"amusement.aero":true,"association.aero":true,"author.aero":true,"ballooning.aero":true,"broker.aero":true,"caa.aero":true,"cargo.aero":true,"catering.aero":true,"certification.aero":true,"championship.aero":true,"charter.aero":true,"civilaviation.aero":true,"club.aero":true,"conference.aero":true,"consultant.aero":true,"consulting.aero":true,"control.aero":true,"council.aero":true,"crew.aero":true,"design.aero":true,"dgca.aero":true,"educator.aero":true,"emergency.aero":true,"engine.aero":true,"engineer.aero":true,"entertainment.aero":true,"equipment.aero":true,"exchange.aero":true,"express.aero":true,"federation.aero":true,"flight.aero":true,"freight.aero":true,"fuel.aero":true,"gliding.aero":true,"government.aero":true,"groundhandling.aero":true,"group.aero":true,"hanggliding.aero":true,"homebuilt.aero":true,"insurance.aero":true,"journal.aero":true,"journalist.aero":true,"leasing.aero":true,"logistics.aero":true,"magazine.aero":true,"maintenance.aero":true,"marketplace.aero":true,"media.aero":true,"microlight.aero":true,"modelling.aero":true,"navigation.aero":true,"parachuting.aero":true,"paragliding.aero":true,"passenger-association.aero":true,"pilot.aero":true,"press.aero":true,"production.aero":true,"recreation.aero":true,"repbody.aero":true,"res.aero":true,"research.aero":true,"rotorcraft.aero":true,"safety.aero":true,"scientist.aero":true,"services.aero":true,"show.aero":true,"skydiving.aero":true,"software.aero":true,"student.aero":true,"taxi.aero":true,"trader.aero":true,"trading.aero":true,"trainer.aero":true,"union.aero":true,"workinggroup.aero":true,"works.aero":true,"af":true,"gov.af":true,"com.af":true,"org.af":true,"net.af":true,"edu.af":true,"ag":true,"com.ag":true,"org.ag":true,"net.ag":true,"co.ag":true,"nom.ag":true,"ai":true,"off.ai":true,"com.ai":true,"net.ai":true,"org.ai":true,"al":true,"com.al":true,"edu.al":true,"gov.al":true,"mil.al":true,"net.al":true,"org.al":true,"am":true,"an":true,"com.an":true,"net.an":true,"org.an":true,"edu.an":true,"ao":true,"ed.ao":true,"gv.ao":true,"og.ao":true,"co.ao":true,"pb.ao":true,"it.ao":true,"aq":true,"ar":true,"com.ar":true,"edu.ar":true,"gob.ar":true,"gov.ar":true,"int.ar":true,"mil.ar":true,"net.ar":true,"org.ar":true,"tur.ar":true,"arpa":true,"e164.arpa":true,"in-addr.arpa":true,"ip6.arpa":true,"iris.arpa":true,"uri.arpa":true,"urn.arpa":true,"as":true,"gov.as":true,"asia":true,"at":true,"ac.at":true,"co.at":true,"gv.at":true,"or.at":true,"au":true,"com.au":true,"net.au":true,"org.au":true,"edu.au":true,"gov.au":true,"asn.au":true,"id.au":true,"info.au":true,"conf.au":true,"oz.au":true,"act.au":true,"nsw.au":true,"nt.au":true,"qld.au":true,"sa.au":true,"tas.au":true,"vic.au":true,"wa.au":true,"act.edu.au":true,"nsw.edu.au":true,"nt.edu.au":true,"qld.edu.au":true,"sa.edu.au":true,"tas.edu.au":true,"vic.edu.au":true,"wa.edu.au":true,"qld.gov.au":true,"sa.gov.au":true,"tas.gov.au":true,"vic.gov.au":true,"wa.gov.au":true,"aw":true,"com.aw":true,"ax":true,"az":true,"com.az":true,"net.az":true,"int.az":true,"gov.az":true,"org.az":true,"edu.az":true,"info.az":true,"pp.az":true,"mil.az":true,"name.az":true,"pro.az":true,"biz.az":true,"ba":true,"org.ba":true,"net.ba":true,"edu.ba":true,"gov.ba":true,"mil.ba":true,"unsa.ba":true,"unbi.ba":true,"co.ba":true,"com.ba":true,"rs.ba":true,"bb":true,"biz.bb":true,"co.bb":true,"com.bb":true,"edu.bb":true,"gov.bb":true,"info.bb":true,"net.bb":true,"org.bb":true,"store.bb":true,"tv.bb":true,"*.bd":true,"be":true,"ac.be":true,"bf":true,"gov.bf":true,"bg":true,"a.bg":true,"b.bg":true,"c.bg":true,"d.bg":true,"e.bg":true,"f.bg":true,"g.bg":true,"h.bg":true,"i.bg":true,"j.bg":true,"k.bg":true,"l.bg":true,"m.bg":true,"n.bg":true,"o.bg":true,"p.bg":true,"q.bg":true,"r.bg":true,"s.bg":true,"t.bg":true,"u.bg":true,"v.bg":true,"w.bg":true,"x.bg":true,"y.bg":true,"z.bg":true,"0.bg":true,"1.bg":true,"2.bg":true,"3.bg":true,"4.bg":true,"5.bg":true,"6.bg":true,"7.bg":true,"8.bg":true,"9.bg":true,"bh":true,"com.bh":true,"edu.bh":true,"net.bh":true,"org.bh":true,"gov.bh":true,"bi":true,"co.bi":true,"com.bi":true,"edu.bi":true,"or.bi":true,"org.bi":true,"biz":true,"bj":true,"asso.bj":true,"barreau.bj":true,"gouv.bj":true,"bm":true,"com.bm":true,"edu.bm":true,"gov.bm":true,"net.bm":true,"org.bm":true,"*.bn":true,"bo":true,"com.bo":true,"edu.bo":true,"gov.bo":true,"gob.bo":true,"int.bo":true,"org.bo":true,"net.bo":true,"mil.bo":true,"tv.bo":true,"br":true,"adm.br":true,"adv.br":true,"agr.br":true,"am.br":true,"arq.br":true,"art.br":true,"ato.br":true,"b.br":true,"bio.br":true,"blog.br":true,"bmd.br":true,"cim.br":true,"cng.br":true,"cnt.br":true,"com.br":true,"coop.br":true,"ecn.br":true,"eco.br":true,"edu.br":true,"emp.br":true,"eng.br":true,"esp.br":true,"etc.br":true,"eti.br":true,"far.br":true,"flog.br":true,"fm.br":true,"fnd.br":true,"fot.br":true,"fst.br":true,"g12.br":true,"ggf.br":true,"gov.br":true,"imb.br":true,"ind.br":true,"inf.br":true,"jor.br":true,"jus.br":true,"leg.br":true,"lel.br":true,"mat.br":true,"med.br":true,"mil.br":true,"mp.br":true,"mus.br":true,"net.br":true,"*.nom.br":true,"not.br":true,"ntr.br":true,"odo.br":true,"org.br":true,"ppg.br":true,"pro.br":true,"psc.br":true,"psi.br":true,"qsl.br":true,"radio.br":true,"rec.br":true,"slg.br":true,"srv.br":true,"taxi.br":true,"teo.br":true,"tmp.br":true,"trd.br":true,"tur.br":true,"tv.br":true,"vet.br":true,"vlog.br":true,"wiki.br":true,"zlg.br":true,"bs":true,"com.bs":true,"net.bs":true,"org.bs":true,"edu.bs":true,"gov.bs":true,"bt":true,"com.bt":true,"edu.bt":true,"gov.bt":true,"net.bt":true,"org.bt":true,"bv":true,"bw":true,"co.bw":true,"org.bw":true,"by":true,"gov.by":true,"mil.by":true,"com.by":true,"of.by":true,"bz":true,"com.bz":true,"net.bz":true,"org.bz":true,"edu.bz":true,"gov.bz":true,"ca":true,"ab.ca":true,"bc.ca":true,"mb.ca":true,"nb.ca":true,"nf.ca":true,"nl.ca":true,"ns.ca":true,"nt.ca":true,"nu.ca":true,"on.ca":true,"pe.ca":true,"qc.ca":true,"sk.ca":true,"yk.ca":true,"gc.ca":true,"cat":true,"cc":true,"cd":true,"gov.cd":true,"cf":true,"cg":true,"ch":true,"ci":true,"org.ci":true,"or.ci":true,"com.ci":true,"co.ci":true,"edu.ci":true,"ed.ci":true,"ac.ci":true,"net.ci":true,"go.ci":true,"asso.ci":true,"xn--aroport-bya.ci":true,"int.ci":true,"presse.ci":true,"md.ci":true,"gouv.ci":true,"*.ck":true,"www.ck":false,"cl":true,"gov.cl":true,"gob.cl":true,"co.cl":true,"mil.cl":true,"cm":true,"co.cm":true,"com.cm":true,"gov.cm":true,"net.cm":true,"cn":true,"ac.cn":true,"com.cn":true,"edu.cn":true,"gov.cn":true,"net.cn":true,"org.cn":true,"mil.cn":true,"xn--55qx5d.cn":true,"xn--io0a7i.cn":true,"xn--od0alg.cn":true,"ah.cn":true,"bj.cn":true,"cq.cn":true,"fj.cn":true,"gd.cn":true,"gs.cn":true,"gz.cn":true,"gx.cn":true,"ha.cn":true,"hb.cn":true,"he.cn":true,"hi.cn":true,"hl.cn":true,"hn.cn":true,"jl.cn":true,"js.cn":true,"jx.cn":true,"ln.cn":true,"nm.cn":true,"nx.cn":true,"qh.cn":true,"sc.cn":true,"sd.cn":true,"sh.cn":true,"sn.cn":true,"sx.cn":true,"tj.cn":true,"xj.cn":true,"xz.cn":true,"yn.cn":true,"zj.cn":true,"hk.cn":true,"mo.cn":true,"tw.cn":true,"co":true,"arts.co":true,"com.co":true,"edu.co":true,"firm.co":true,"gov.co":true,"info.co":true,"int.co":true,"mil.co":true,"net.co":true,"nom.co":true,"org.co":true,"rec.co":true,"web.co":true,"com":true,"coop":true,"cr":true,"ac.cr":true,"co.cr":true,"ed.cr":true,"fi.cr":true,"go.cr":true,"or.cr":true,"sa.cr":true,"cu":true,"com.cu":true,"edu.cu":true,"org.cu":true,"net.cu":true,"gov.cu":true,"inf.cu":true,"cv":true,"cw":true,"com.cw":true,"edu.cw":true,"net.cw":true,"org.cw":true,"cx":true,"gov.cx":true,"ac.cy":true,"biz.cy":true,"com.cy":true,"ekloges.cy":true,"gov.cy":true,"ltd.cy":true,"name.cy":true,"net.cy":true,"org.cy":true,"parliament.cy":true,"press.cy":true,"pro.cy":true,"tm.cy":true,"cz":true,"de":true,"dj":true,"dk":true,"dm":true,"com.dm":true,"net.dm":true,"org.dm":true,"edu.dm":true,"gov.dm":true,"do":true,"art.do":true,"com.do":true,"edu.do":true,"gob.do":true,"gov.do":true,"mil.do":true,"net.do":true,"org.do":true,"sld.do":true,"web.do":true,"dz":true,"com.dz":true,"org.dz":true,"net.dz":true,"gov.dz":true,"edu.dz":true,"asso.dz":true,"pol.dz":true,"art.dz":true,"ec":true,"com.ec":true,"info.ec":true,"net.ec":true,"fin.ec":true,"k12.ec":true,"med.ec":true,"pro.ec":true,"org.ec":true,"edu.ec":true,"gov.ec":true,"gob.ec":true,"mil.ec":true,"edu":true,"ee":true,"edu.ee":true,"gov.ee":true,"riik.ee":true,"lib.ee":true,"med.ee":true,"com.ee":true,"pri.ee":true,"aip.ee":true,"org.ee":true,"fie.ee":true,"eg":true,"com.eg":true,"edu.eg":true,"eun.eg":true,"gov.eg":true,"mil.eg":true,"name.eg":true,"net.eg":true,"org.eg":true,"sci.eg":true,"*.er":true,"es":true,"com.es":true,"nom.es":true,"org.es":true,"gob.es":true,"edu.es":true,"et":true,"com.et":true,"gov.et":true,"org.et":true,"edu.et":true,"biz.et":true,"name.et":true,"info.et":true,"net.et":true,"eu":true,"fi":true,"aland.fi":true,"*.fj":true,"*.fk":true,"fm":true,"fo":true,"fr":true,"com.fr":true,"asso.fr":true,"nom.fr":true,"prd.fr":true,"presse.fr":true,"tm.fr":true,"aeroport.fr":true,"assedic.fr":true,"avocat.fr":true,"avoues.fr":true,"cci.fr":true,"chambagri.fr":true,"chirurgiens-dentistes.fr":true,"experts-comptables.fr":true,"geometre-expert.fr":true,"gouv.fr":true,"greta.fr":true,"huissier-justice.fr":true,"medecin.fr":true,"notaires.fr":true,"pharmacien.fr":true,"port.fr":true,"veterinaire.fr":true,"ga":true,"gb":true,"gd":true,"ge":true,"com.ge":true,"edu.ge":true,"gov.ge":true,"org.ge":true,"mil.ge":true,"net.ge":true,"pvt.ge":true,"gf":true,"gg":true,"co.gg":true,"net.gg":true,"org.gg":true,"gh":true,"com.gh":true,"edu.gh":true,"gov.gh":true,"org.gh":true,"mil.gh":true,"gi":true,"com.gi":true,"ltd.gi":true,"gov.gi":true,"mod.gi":true,"edu.gi":true,"org.gi":true,"gl":true,"co.gl":true,"com.gl":true,"edu.gl":true,"net.gl":true,"org.gl":true,"gm":true,"gn":true,"ac.gn":true,"com.gn":true,"edu.gn":true,"gov.gn":true,"org.gn":true,"net.gn":true,"gov":true,"gp":true,"com.gp":true,"net.gp":true,"mobi.gp":true,"edu.gp":true,"org.gp":true,"asso.gp":true,"gq":true,"gr":true,"com.gr":true,"edu.gr":true,"net.gr":true,"org.gr":true,"gov.gr":true,"gs":true,"gt":true,"com.gt":true,"edu.gt":true,"gob.gt":true,"ind.gt":true,"mil.gt":true,"net.gt":true,"org.gt":true,"*.gu":true,"gw":true,"gy":true,"co.gy":true,"com.gy":true,"net.gy":true,"hk":true,"com.hk":true,"edu.hk":true,"gov.hk":true,"idv.hk":true,"net.hk":true,"org.hk":true,"xn--55qx5d.hk":true,"xn--wcvs22d.hk":true,"xn--lcvr32d.hk":true,"xn--mxtq1m.hk":true,"xn--gmqw5a.hk":true,"xn--ciqpn.hk":true,"xn--gmq050i.hk":true,"xn--zf0avx.hk":true,"xn--io0a7i.hk":true,"xn--mk0axi.hk":true,"xn--od0alg.hk":true,"xn--od0aq3b.hk":true,"xn--tn0ag.hk":true,"xn--uc0atv.hk":true,"xn--uc0ay4a.hk":true,"hm":true,"hn":true,"com.hn":true,"edu.hn":true,"org.hn":true,"net.hn":true,"mil.hn":true,"gob.hn":true,"hr":true,"iz.hr":true,"from.hr":true,"name.hr":true,"com.hr":true,"ht":true,"com.ht":true,"shop.ht":true,"firm.ht":true,"info.ht":true,"adult.ht":true,"net.ht":true,"pro.ht":true,"org.ht":true,"med.ht":true,"art.ht":true,"coop.ht":true,"pol.ht":true,"asso.ht":true,"edu.ht":true,"rel.ht":true,"gouv.ht":true,"perso.ht":true,"hu":true,"co.hu":true,"info.hu":true,"org.hu":true,"priv.hu":true,"sport.hu":true,"tm.hu":true,"2000.hu":true,"agrar.hu":true,"bolt.hu":true,"casino.hu":true,"city.hu":true,"erotica.hu":true,"erotika.hu":true,"film.hu":true,"forum.hu":true,"games.hu":true,"hotel.hu":true,"ingatlan.hu":true,"jogasz.hu":true,"konyvelo.hu":true,"lakas.hu":true,"media.hu":true,"news.hu":true,"reklam.hu":true,"sex.hu":true,"shop.hu":true,"suli.hu":true,"szex.hu":true,"tozsde.hu":true,"utazas.hu":true,"video.hu":true,"id":true,"ac.id":true,"biz.id":true,"co.id":true,"desa.id":true,"go.id":true,"mil.id":true,"my.id":true,"net.id":true,"or.id":true,"sch.id":true,"web.id":true,"ie":true,"gov.ie":true,"il":true,"ac.il":true,"co.il":true,"gov.il":true,"idf.il":true,"k12.il":true,"muni.il":true,"net.il":true,"org.il":true,"im":true,"ac.im":true,"co.im":true,"com.im":true,"ltd.co.im":true,"net.im":true,"org.im":true,"plc.co.im":true,"tt.im":true,"tv.im":true,"in":true,"co.in":true,"firm.in":true,"net.in":true,"org.in":true,"gen.in":true,"ind.in":true,"nic.in":true,"ac.in":true,"edu.in":true,"res.in":true,"gov.in":true,"mil.in":true,"info":true,"int":true,"eu.int":true,"io":true,"com.io":true,"iq":true,"gov.iq":true,"edu.iq":true,"mil.iq":true,"com.iq":true,"org.iq":true,"net.iq":true,"ir":true,"ac.ir":true,"co.ir":true,"gov.ir":true,"id.ir":true,"net.ir":true,"org.ir":true,"sch.ir":true,"xn--mgba3a4f16a.ir":true,"xn--mgba3a4fra.ir":true,"is":true,"net.is":true,"com.is":true,"edu.is":true,"gov.is":true,"org.is":true,"int.is":true,"it":true,"gov.it":true,"edu.it":true,"abr.it":true,"abruzzo.it":true,"aosta-valley.it":true,"aostavalley.it":true,"bas.it":true,"basilicata.it":true,"cal.it":true,"calabria.it":true,"cam.it":true,"campania.it":true,"emilia-romagna.it":true,"emiliaromagna.it":true,"emr.it":true,"friuli-v-giulia.it":true,"friuli-ve-giulia.it":true,"friuli-vegiulia.it":true,"friuli-venezia-giulia.it":true,"friuli-veneziagiulia.it":true,"friuli-vgiulia.it":true,"friuliv-giulia.it":true,"friulive-giulia.it":true,"friulivegiulia.it":true,"friulivenezia-giulia.it":true,"friuliveneziagiulia.it":true,"friulivgiulia.it":true,"fvg.it":true,"laz.it":true,"lazio.it":true,"lig.it":true,"liguria.it":true,"lom.it":true,"lombardia.it":true,"lombardy.it":true,"lucania.it":true,"mar.it":true,"marche.it":true,"mol.it":true,"molise.it":true,"piedmont.it":true,"piemonte.it":true,"pmn.it":true,"pug.it":true,"puglia.it":true,"sar.it":true,"sardegna.it":true,"sardinia.it":true,"sic.it":true,"sicilia.it":true,"sicily.it":true,"taa.it":true,"tos.it":true,"toscana.it":true,"trentino-a-adige.it":true,"trentino-aadige.it":true,"trentino-alto-adige.it":true,"trentino-altoadige.it":true,"trentino-s-tirol.it":true,"trentino-stirol.it":true,"trentino-sud-tirol.it":true,"trentino-sudtirol.it":true,"trentino-sued-tirol.it":true,"trentino-suedtirol.it":true,"trentinoa-adige.it":true,"trentinoaadige.it":true,"trentinoalto-adige.it":true,"trentinoaltoadige.it":true,"trentinos-tirol.it":true,"trentinostirol.it":true,"trentinosud-tirol.it":true,"trentinosudtirol.it":true,"trentinosued-tirol.it":true,"trentinosuedtirol.it":true,"tuscany.it":true,"umb.it":true,"umbria.it":true,"val-d-aosta.it":true,"val-daosta.it":true,"vald-aosta.it":true,"valdaosta.it":true,"valle-aosta.it":true,"valle-d-aosta.it":true,"valle-daosta.it":true,"valleaosta.it":true,"valled-aosta.it":true,"valledaosta.it":true,"vallee-aoste.it":true,"valleeaoste.it":true,"vao.it":true,"vda.it":true,"ven.it":true,"veneto.it":true,"ag.it":true,"agrigento.it":true,"al.it":true,"alessandria.it":true,"alto-adige.it":true,"altoadige.it":true,"an.it":true,"ancona.it":true,"andria-barletta-trani.it":true,"andria-trani-barletta.it":true,"andriabarlettatrani.it":true,"andriatranibarletta.it":true,"ao.it":true,"aosta.it":true,"aoste.it":true,"ap.it":true,"aq.it":true,"aquila.it":true,"ar.it":true,"arezzo.it":true,"ascoli-piceno.it":true,"ascolipiceno.it":true,"asti.it":true,"at.it":true,"av.it":true,"avellino.it":true,"ba.it":true,"balsan.it":true,"bari.it":true,"barletta-trani-andria.it":true,"barlettatraniandria.it":true,"belluno.it":true,"benevento.it":true,"bergamo.it":true,"bg.it":true,"bi.it":true,"biella.it":true,"bl.it":true,"bn.it":true,"bo.it":true,"bologna.it":true,"bolzano.it":true,"bozen.it":true,"br.it":true,"brescia.it":true,"brindisi.it":true,"bs.it":true,"bt.it":true,"bz.it":true,"ca.it":true,"cagliari.it":true,"caltanissetta.it":true,"campidano-medio.it":true,"campidanomedio.it":true,"campobasso.it":true,"carbonia-iglesias.it":true,"carboniaiglesias.it":true,"carrara-massa.it":true,"carraramassa.it":true,"caserta.it":true,"catania.it":true,"catanzaro.it":true,"cb.it":true,"ce.it":true,"cesena-forli.it":true,"cesenaforli.it":true,"ch.it":true,"chieti.it":true,"ci.it":true,"cl.it":true,"cn.it":true,"co.it":true,"como.it":true,"cosenza.it":true,"cr.it":true,"cremona.it":true,"crotone.it":true,"cs.it":true,"ct.it":true,"cuneo.it":true,"cz.it":true,"dell-ogliastra.it":true,"dellogliastra.it":true,"en.it":true,"enna.it":true,"fc.it":true,"fe.it":true,"fermo.it":true,"ferrara.it":true,"fg.it":true,"fi.it":true,"firenze.it":true,"florence.it":true,"fm.it":true,"foggia.it":true,"forli-cesena.it":true,"forlicesena.it":true,"fr.it":true,"frosinone.it":true,"ge.it":true,"genoa.it":true,"genova.it":true,"go.it":true,"gorizia.it":true,"gr.it":true,"grosseto.it":true,"iglesias-carbonia.it":true,"iglesiascarbonia.it":true,"im.it":true,"imperia.it":true,"is.it":true,"isernia.it":true,"kr.it":true,"la-spezia.it":true,"laquila.it":true,"laspezia.it":true,"latina.it":true,"lc.it":true,"le.it":true,"lecce.it":true,"lecco.it":true,"li.it":true,"livorno.it":true,"lo.it":true,"lodi.it":true,"lt.it":true,"lu.it":true,"lucca.it":true,"macerata.it":true,"mantova.it":true,"massa-carrara.it":true,"massacarrara.it":true,"matera.it":true,"mb.it":true,"mc.it":true,"me.it":true,"medio-campidano.it":true,"mediocampidano.it":true,"messina.it":true,"mi.it":true,"milan.it":true,"milano.it":true,"mn.it":true,"mo.it":true,"modena.it":true,"monza-brianza.it":true,"monza-e-della-brianza.it":true,"monza.it":true,"monzabrianza.it":true,"monzaebrianza.it":true,"monzaedellabrianza.it":true,"ms.it":true,"mt.it":true,"na.it":true,"naples.it":true,"napoli.it":true,"no.it":true,"novara.it":true,"nu.it":true,"nuoro.it":true,"og.it":true,"ogliastra.it":true,"olbia-tempio.it":true,"olbiatempio.it":true,"or.it":true,"oristano.it":true,"ot.it":true,"pa.it":true,"padova.it":true,"padua.it":true,"palermo.it":true,"parma.it":true,"pavia.it":true,"pc.it":true,"pd.it":true,"pe.it":true,"perugia.it":true,"pesaro-urbino.it":true,"pesarourbino.it":true,"pescara.it":true,"pg.it":true,"pi.it":true,"piacenza.it":true,"pisa.it":true,"pistoia.it":true,"pn.it":true,"po.it":true,"pordenone.it":true,"potenza.it":true,"pr.it":true,"prato.it":true,"pt.it":true,"pu.it":true,"pv.it":true,"pz.it":true,"ra.it":true,"ragusa.it":true,"ravenna.it":true,"rc.it":true,"re.it":true,"reggio-calabria.it":true,"reggio-emilia.it":true,"reggiocalabria.it":true,"reggioemilia.it":true,"rg.it":true,"ri.it":true,"rieti.it":true,"rimini.it":true,"rm.it":true,"rn.it":true,"ro.it":true,"roma.it":true,"rome.it":true,"rovigo.it":true,"sa.it":true,"salerno.it":true,"sassari.it":true,"savona.it":true,"si.it":true,"siena.it":true,"siracusa.it":true,"so.it":true,"sondrio.it":true,"sp.it":true,"sr.it":true,"ss.it":true,"suedtirol.it":true,"sv.it":true,"ta.it":true,"taranto.it":true,"te.it":true,"tempio-olbia.it":true,"tempioolbia.it":true,"teramo.it":true,"terni.it":true,"tn.it":true,"to.it":true,"torino.it":true,"tp.it":true,"tr.it":true,"trani-andria-barletta.it":true,"trani-barletta-andria.it":true,"traniandriabarletta.it":true,"tranibarlettaandria.it":true,"trapani.it":true,"trentino.it":true,"trento.it":true,"treviso.it":true,"trieste.it":true,"ts.it":true,"turin.it":true,"tv.it":true,"ud.it":true,"udine.it":true,"urbino-pesaro.it":true,"urbinopesaro.it":true,"va.it":true,"varese.it":true,"vb.it":true,"vc.it":true,"ve.it":true,"venezia.it":true,"venice.it":true,"verbania.it":true,"vercelli.it":true,"verona.it":true,"vi.it":true,"vibo-valentia.it":true,"vibovalentia.it":true,"vicenza.it":true,"viterbo.it":true,"vr.it":true,"vs.it":true,"vt.it":true,"vv.it":true,"je":true,"co.je":true,"net.je":true,"org.je":true,"*.jm":true,"jo":true,"com.jo":true,"org.jo":true,"net.jo":true,"edu.jo":true,"sch.jo":true,"gov.jo":true,"mil.jo":true,"name.jo":true,"jobs":true,"jp":true,"ac.jp":true,"ad.jp":true,"co.jp":true,"ed.jp":true,"go.jp":true,"gr.jp":true,"lg.jp":true,"ne.jp":true,"or.jp":true,"aichi.jp":true,"akita.jp":true,"aomori.jp":true,"chiba.jp":true,"ehime.jp":true,"fukui.jp":true,"fukuoka.jp":true,"fukushima.jp":true,"gifu.jp":true,"gunma.jp":true,"hiroshima.jp":true,"hokkaido.jp":true,"hyogo.jp":true,"ibaraki.jp":true,"ishikawa.jp":true,"iwate.jp":true,"kagawa.jp":true,"kagoshima.jp":true,"kanagawa.jp":true,"kochi.jp":true,"kumamoto.jp":true,"kyoto.jp":true,"mie.jp":true,"miyagi.jp":true,"miyazaki.jp":true,"nagano.jp":true,"nagasaki.jp":true,"nara.jp":true,"niigata.jp":true,"oita.jp":true,"okayama.jp":true,"okinawa.jp":true,"osaka.jp":true,"saga.jp":true,"saitama.jp":true,"shiga.jp":true,"shimane.jp":true,"shizuoka.jp":true,"tochigi.jp":true,"tokushima.jp":true,"tokyo.jp":true,"tottori.jp":true,"toyama.jp":true,"wakayama.jp":true,"yamagata.jp":true,"yamaguchi.jp":true,"yamanashi.jp":true,"xn--4pvxs.jp":true,"xn--vgu402c.jp":true,"xn--c3s14m.jp":true,"xn--f6qx53a.jp":true,"xn--8pvr4u.jp":true,"xn--uist22h.jp":true,"xn--djrs72d6uy.jp":true,"xn--mkru45i.jp":true,"xn--0trq7p7nn.jp":true,"xn--8ltr62k.jp":true,"xn--2m4a15e.jp":true,"xn--efvn9s.jp":true,"xn--32vp30h.jp":true,"xn--4it797k.jp":true,"xn--1lqs71d.jp":true,"xn--5rtp49c.jp":true,"xn--5js045d.jp":true,"xn--ehqz56n.jp":true,"xn--1lqs03n.jp":true,"xn--qqqt11m.jp":true,"xn--kbrq7o.jp":true,"xn--pssu33l.jp":true,"xn--ntsq17g.jp":true,"xn--uisz3g.jp":true,"xn--6btw5a.jp":true,"xn--1ctwo.jp":true,"xn--6orx2r.jp":true,"xn--rht61e.jp":true,"xn--rht27z.jp":true,"xn--djty4k.jp":true,"xn--nit225k.jp":true,"xn--rht3d.jp":true,"xn--klty5x.jp":true,"xn--kltx9a.jp":true,"xn--kltp7d.jp":true,"xn--uuwu58a.jp":true,"xn--zbx025d.jp":true,"xn--ntso0iqx3a.jp":true,"xn--elqq16h.jp":true,"xn--4it168d.jp":true,"xn--klt787d.jp":true,"xn--rny31h.jp":true,"xn--7t0a264c.jp":true,"xn--5rtq34k.jp":true,"xn--k7yn95e.jp":true,"xn--tor131o.jp":true,"xn--d5qv7z876c.jp":true,"*.kawasaki.jp":true,"*.kitakyushu.jp":true,"*.kobe.jp":true,"*.nagoya.jp":true,"*.sapporo.jp":true,"*.sendai.jp":true,"*.yokohama.jp":true,"city.kawasaki.jp":false,"city.kitakyushu.jp":false,"city.kobe.jp":false,"city.nagoya.jp":false,"city.sapporo.jp":false,"city.sendai.jp":false,"city.yokohama.jp":false,"aisai.aichi.jp":true,"ama.aichi.jp":true,"anjo.aichi.jp":true,"asuke.aichi.jp":true,"chiryu.aichi.jp":true,"chita.aichi.jp":true,"fuso.aichi.jp":true,"gamagori.aichi.jp":true,"handa.aichi.jp":true,"hazu.aichi.jp":true,"hekinan.aichi.jp":true,"higashiura.aichi.jp":true,"ichinomiya.aichi.jp":true,"inazawa.aichi.jp":true,"inuyama.aichi.jp":true,"isshiki.aichi.jp":true,"iwakura.aichi.jp":true,"kanie.aichi.jp":true,"kariya.aichi.jp":true,"kasugai.aichi.jp":true,"kira.aichi.jp":true,"kiyosu.aichi.jp":true,"komaki.aichi.jp":true,"konan.aichi.jp":true,"kota.aichi.jp":true,"mihama.aichi.jp":true,"miyoshi.aichi.jp":true,"nishio.aichi.jp":true,"nisshin.aichi.jp":true,"obu.aichi.jp":true,"oguchi.aichi.jp":true,"oharu.aichi.jp":true,"okazaki.aichi.jp":true,"owariasahi.aichi.jp":true,"seto.aichi.jp":true,"shikatsu.aichi.jp":true,"shinshiro.aichi.jp":true,"shitara.aichi.jp":true,"tahara.aichi.jp":true,"takahama.aichi.jp":true,"tobishima.aichi.jp":true,"toei.aichi.jp":true,"togo.aichi.jp":true,"tokai.aichi.jp":true,"tokoname.aichi.jp":true,"toyoake.aichi.jp":true,"toyohashi.aichi.jp":true,"toyokawa.aichi.jp":true,"toyone.aichi.jp":true,"toyota.aichi.jp":true,"tsushima.aichi.jp":true,"yatomi.aichi.jp":true,"akita.akita.jp":true,"daisen.akita.jp":true,"fujisato.akita.jp":true,"gojome.akita.jp":true,"hachirogata.akita.jp":true,"happou.akita.jp":true,"higashinaruse.akita.jp":true,"honjo.akita.jp":true,"honjyo.akita.jp":true,"ikawa.akita.jp":true,"kamikoani.akita.jp":true,"kamioka.akita.jp":true,"katagami.akita.jp":true,"kazuno.akita.jp":true,"kitaakita.akita.jp":true,"kosaka.akita.jp":true,"kyowa.akita.jp":true,"misato.akita.jp":true,"mitane.akita.jp":true,"moriyoshi.akita.jp":true,"nikaho.akita.jp":true,"noshiro.akita.jp":true,"odate.akita.jp":true,"oga.akita.jp":true,"ogata.akita.jp":true,"semboku.akita.jp":true,"yokote.akita.jp":true,"yurihonjo.akita.jp":true,"aomori.aomori.jp":true,"gonohe.aomori.jp":true,"hachinohe.aomori.jp":true,"hashikami.aomori.jp":true,"hiranai.aomori.jp":true,"hirosaki.aomori.jp":true,"itayanagi.aomori.jp":true,"kuroishi.aomori.jp":true,"misawa.aomori.jp":true,"mutsu.aomori.jp":true,"nakadomari.aomori.jp":true,"noheji.aomori.jp":true,"oirase.aomori.jp":true,"owani.aomori.jp":true,"rokunohe.aomori.jp":true,"sannohe.aomori.jp":true,"shichinohe.aomori.jp":true,"shingo.aomori.jp":true,"takko.aomori.jp":true,"towada.aomori.jp":true,"tsugaru.aomori.jp":true,"tsuruta.aomori.jp":true,"abiko.chiba.jp":true,"asahi.chiba.jp":true,"chonan.chiba.jp":true,"chosei.chiba.jp":true,"choshi.chiba.jp":true,"chuo.chiba.jp":true,"funabashi.chiba.jp":true,"futtsu.chiba.jp":true,"hanamigawa.chiba.jp":true,"ichihara.chiba.jp":true,"ichikawa.chiba.jp":true,"ichinomiya.chiba.jp":true,"inzai.chiba.jp":true,"isumi.chiba.jp":true,"kamagaya.chiba.jp":true,"kamogawa.chiba.jp":true,"kashiwa.chiba.jp":true,"katori.chiba.jp":true,"katsuura.chiba.jp":true,"kimitsu.chiba.jp":true,"kisarazu.chiba.jp":true,"kozaki.chiba.jp":true,"kujukuri.chiba.jp":true,"kyonan.chiba.jp":true,"matsudo.chiba.jp":true,"midori.chiba.jp":true,"mihama.chiba.jp":true,"minamiboso.chiba.jp":true,"mobara.chiba.jp":true,"mutsuzawa.chiba.jp":true,"nagara.chiba.jp":true,"nagareyama.chiba.jp":true,"narashino.chiba.jp":true,"narita.chiba.jp":true,"noda.chiba.jp":true,"oamishirasato.chiba.jp":true,"omigawa.chiba.jp":true,"onjuku.chiba.jp":true,"otaki.chiba.jp":true,"sakae.chiba.jp":true,"sakura.chiba.jp":true,"shimofusa.chiba.jp":true,"shirako.chiba.jp":true,"shiroi.chiba.jp":true,"shisui.chiba.jp":true,"sodegaura.chiba.jp":true,"sosa.chiba.jp":true,"tako.chiba.jp":true,"tateyama.chiba.jp":true,"togane.chiba.jp":true,"tohnosho.chiba.jp":true,"tomisato.chiba.jp":true,"urayasu.chiba.jp":true,"yachimata.chiba.jp":true,"yachiyo.chiba.jp":true,"yokaichiba.chiba.jp":true,"yokoshibahikari.chiba.jp":true,"yotsukaido.chiba.jp":true,"ainan.ehime.jp":true,"honai.ehime.jp":true,"ikata.ehime.jp":true,"imabari.ehime.jp":true,"iyo.ehime.jp":true,"kamijima.ehime.jp":true,"kihoku.ehime.jp":true,"kumakogen.ehime.jp":true,"masaki.ehime.jp":true,"matsuno.ehime.jp":true,"matsuyama.ehime.jp":true,"namikata.ehime.jp":true,"niihama.ehime.jp":true,"ozu.ehime.jp":true,"saijo.ehime.jp":true,"seiyo.ehime.jp":true,"shikokuchuo.ehime.jp":true,"tobe.ehime.jp":true,"toon.ehime.jp":true,"uchiko.ehime.jp":true,"uwajima.ehime.jp":true,"yawatahama.ehime.jp":true,"echizen.fukui.jp":true,"eiheiji.fukui.jp":true,"fukui.fukui.jp":true,"ikeda.fukui.jp":true,"katsuyama.fukui.jp":true,"mihama.fukui.jp":true,"minamiechizen.fukui.jp":true,"obama.fukui.jp":true,"ohi.fukui.jp":true,"ono.fukui.jp":true,"sabae.fukui.jp":true,"sakai.fukui.jp":true,"takahama.fukui.jp":true,"tsuruga.fukui.jp":true,"wakasa.fukui.jp":true,"ashiya.fukuoka.jp":true,"buzen.fukuoka.jp":true,"chikugo.fukuoka.jp":true,"chikuho.fukuoka.jp":true,"chikujo.fukuoka.jp":true,"chikushino.fukuoka.jp":true,"chikuzen.fukuoka.jp":true,"chuo.fukuoka.jp":true,"dazaifu.fukuoka.jp":true,"fukuchi.fukuoka.jp":true,"hakata.fukuoka.jp":true,"higashi.fukuoka.jp":true,"hirokawa.fukuoka.jp":true,"hisayama.fukuoka.jp":true,"iizuka.fukuoka.jp":true,"inatsuki.fukuoka.jp":true,"kaho.fukuoka.jp":true,"kasuga.fukuoka.jp":true,"kasuya.fukuoka.jp":true,"kawara.fukuoka.jp":true,"keisen.fukuoka.jp":true,"koga.fukuoka.jp":true,"kurate.fukuoka.jp":true,"kurogi.fukuoka.jp":true,"kurume.fukuoka.jp":true,"minami.fukuoka.jp":true,"miyako.fukuoka.jp":true,"miyama.fukuoka.jp":true,"miyawaka.fukuoka.jp":true,"mizumaki.fukuoka.jp":true,"munakata.fukuoka.jp":true,"nakagawa.fukuoka.jp":true,"nakama.fukuoka.jp":true,"nishi.fukuoka.jp":true,"nogata.fukuoka.jp":true,"ogori.fukuoka.jp":true,"okagaki.fukuoka.jp":true,"okawa.fukuoka.jp":true,"oki.fukuoka.jp":true,"omuta.fukuoka.jp":true,"onga.fukuoka.jp":true,"onojo.fukuoka.jp":true,"oto.fukuoka.jp":true,"saigawa.fukuoka.jp":true,"sasaguri.fukuoka.jp":true,"shingu.fukuoka.jp":true,"shinyoshitomi.fukuoka.jp":true,"shonai.fukuoka.jp":true,"soeda.fukuoka.jp":true,"sue.fukuoka.jp":true,"tachiarai.fukuoka.jp":true,"tagawa.fukuoka.jp":true,"takata.fukuoka.jp":true,"toho.fukuoka.jp":true,"toyotsu.fukuoka.jp":true,"tsuiki.fukuoka.jp":true,"ukiha.fukuoka.jp":true,"umi.fukuoka.jp":true,"usui.fukuoka.jp":true,"yamada.fukuoka.jp":true,"yame.fukuoka.jp":true,"yanagawa.fukuoka.jp":true,"yukuhashi.fukuoka.jp":true,"aizubange.fukushima.jp":true,"aizumisato.fukushima.jp":true,"aizuwakamatsu.fukushima.jp":true,"asakawa.fukushima.jp":true,"bandai.fukushima.jp":true,"date.fukushima.jp":true,"fukushima.fukushima.jp":true,"furudono.fukushima.jp":true,"futaba.fukushima.jp":true,"hanawa.fukushima.jp":true,"higashi.fukushima.jp":true,"hirata.fukushima.jp":true,"hirono.fukushima.jp":true,"iitate.fukushima.jp":true,"inawashiro.fukushima.jp":true,"ishikawa.fukushima.jp":true,"iwaki.fukushima.jp":true,"izumizaki.fukushima.jp":true,"kagamiishi.fukushima.jp":true,"kaneyama.fukushima.jp":true,"kawamata.fukushima.jp":true,"kitakata.fukushima.jp":true,"kitashiobara.fukushima.jp":true,"koori.fukushima.jp":true,"koriyama.fukushima.jp":true,"kunimi.fukushima.jp":true,"miharu.fukushima.jp":true,"mishima.fukushima.jp":true,"namie.fukushima.jp":true,"nango.fukushima.jp":true,"nishiaizu.fukushima.jp":true,"nishigo.fukushima.jp":true,"okuma.fukushima.jp":true,"omotego.fukushima.jp":true,"ono.fukushima.jp":true,"otama.fukushima.jp":true,"samegawa.fukushima.jp":true,"shimogo.fukushima.jp":true,"shirakawa.fukushima.jp":true,"showa.fukushima.jp":true,"soma.fukushima.jp":true,"sukagawa.fukushima.jp":true,"taishin.fukushima.jp":true,"tamakawa.fukushima.jp":true,"tanagura.fukushima.jp":true,"tenei.fukushima.jp":true,"yabuki.fukushima.jp":true,"yamato.fukushima.jp":true,"yamatsuri.fukushima.jp":true,"yanaizu.fukushima.jp":true,"yugawa.fukushima.jp":true,"anpachi.gifu.jp":true,"ena.gifu.jp":true,"gifu.gifu.jp":true,"ginan.gifu.jp":true,"godo.gifu.jp":true,"gujo.gifu.jp":true,"hashima.gifu.jp":true,"hichiso.gifu.jp":true,"hida.gifu.jp":true,"higashishirakawa.gifu.jp":true,"ibigawa.gifu.jp":true,"ikeda.gifu.jp":true,"kakamigahara.gifu.jp":true,"kani.gifu.jp":true,"kasahara.gifu.jp":true,"kasamatsu.gifu.jp":true,"kawaue.gifu.jp":true,"kitagata.gifu.jp":true,"mino.gifu.jp":true,"minokamo.gifu.jp":true,"mitake.gifu.jp":true,"mizunami.gifu.jp":true,"motosu.gifu.jp":true,"nakatsugawa.gifu.jp":true,"ogaki.gifu.jp":true,"sakahogi.gifu.jp":true,"seki.gifu.jp":true,"sekigahara.gifu.jp":true,"shirakawa.gifu.jp":true,"tajimi.gifu.jp":true,"takayama.gifu.jp":true,"tarui.gifu.jp":true,"toki.gifu.jp":true,"tomika.gifu.jp":true,"wanouchi.gifu.jp":true,"yamagata.gifu.jp":true,"yaotsu.gifu.jp":true,"yoro.gifu.jp":true,"annaka.gunma.jp":true,"chiyoda.gunma.jp":true,"fujioka.gunma.jp":true,"higashiagatsuma.gunma.jp":true,"isesaki.gunma.jp":true,"itakura.gunma.jp":true,"kanna.gunma.jp":true,"kanra.gunma.jp":true,"katashina.gunma.jp":true,"kawaba.gunma.jp":true,"kiryu.gunma.jp":true,"kusatsu.gunma.jp":true,"maebashi.gunma.jp":true,"meiwa.gunma.jp":true,"midori.gunma.jp":true,"minakami.gunma.jp":true,"naganohara.gunma.jp":true,"nakanojo.gunma.jp":true,"nanmoku.gunma.jp":true,"numata.gunma.jp":true,"oizumi.gunma.jp":true,"ora.gunma.jp":true,"ota.gunma.jp":true,"shibukawa.gunma.jp":true,"shimonita.gunma.jp":true,"shinto.gunma.jp":true,"showa.gunma.jp":true,"takasaki.gunma.jp":true,"takayama.gunma.jp":true,"tamamura.gunma.jp":true,"tatebayashi.gunma.jp":true,"tomioka.gunma.jp":true,"tsukiyono.gunma.jp":true,"tsumagoi.gunma.jp":true,"ueno.gunma.jp":true,"yoshioka.gunma.jp":true,"asaminami.hiroshima.jp":true,"daiwa.hiroshima.jp":true,"etajima.hiroshima.jp":true,"fuchu.hiroshima.jp":true,"fukuyama.hiroshima.jp":true,"hatsukaichi.hiroshima.jp":true,"higashihiroshima.hiroshima.jp":true,"hongo.hiroshima.jp":true,"jinsekikogen.hiroshima.jp":true,"kaita.hiroshima.jp":true,"kui.hiroshima.jp":true,"kumano.hiroshima.jp":true,"kure.hiroshima.jp":true,"mihara.hiroshima.jp":true,"miyoshi.hiroshima.jp":true,"naka.hiroshima.jp":true,"onomichi.hiroshima.jp":true,"osakikamijima.hiroshima.jp":true,"otake.hiroshima.jp":true,"saka.hiroshima.jp":true,"sera.hiroshima.jp":true,"seranishi.hiroshima.jp":true,"shinichi.hiroshima.jp":true,"shobara.hiroshima.jp":true,"takehara.hiroshima.jp":true,"abashiri.hokkaido.jp":true,"abira.hokkaido.jp":true,"aibetsu.hokkaido.jp":true,"akabira.hokkaido.jp":true,"akkeshi.hokkaido.jp":true,"asahikawa.hokkaido.jp":true,"ashibetsu.hokkaido.jp":true,"ashoro.hokkaido.jp":true,"assabu.hokkaido.jp":true,"atsuma.hokkaido.jp":true,"bibai.hokkaido.jp":true,"biei.hokkaido.jp":true,"bifuka.hokkaido.jp":true,"bihoro.hokkaido.jp":true,"biratori.hokkaido.jp":true,"chippubetsu.hokkaido.jp":true,"chitose.hokkaido.jp":true,"date.hokkaido.jp":true,"ebetsu.hokkaido.jp":true,"embetsu.hokkaido.jp":true,"eniwa.hokkaido.jp":true,"erimo.hokkaido.jp":true,"esan.hokkaido.jp":true,"esashi.hokkaido.jp":true,"fukagawa.hokkaido.jp":true,"fukushima.hokkaido.jp":true,"furano.hokkaido.jp":true,"furubira.hokkaido.jp":true,"haboro.hokkaido.jp":true,"hakodate.hokkaido.jp":true,"hamatonbetsu.hokkaido.jp":true,"hidaka.hokkaido.jp":true,"higashikagura.hokkaido.jp":true,"higashikawa.hokkaido.jp":true,"hiroo.hokkaido.jp":true,"hokuryu.hokkaido.jp":true,"hokuto.hokkaido.jp":true,"honbetsu.hokkaido.jp":true,"horokanai.hokkaido.jp":true,"horonobe.hokkaido.jp":true,"ikeda.hokkaido.jp":true,"imakane.hokkaido.jp":true,"ishikari.hokkaido.jp":true,"iwamizawa.hokkaido.jp":true,"iwanai.hokkaido.jp":true,"kamifurano.hokkaido.jp":true,"kamikawa.hokkaido.jp":true,"kamishihoro.hokkaido.jp":true,"kamisunagawa.hokkaido.jp":true,"kamoenai.hokkaido.jp":true,"kayabe.hokkaido.jp":true,"kembuchi.hokkaido.jp":true,"kikonai.hokkaido.jp":true,"kimobetsu.hokkaido.jp":true,"kitahiroshima.hokkaido.jp":true,"kitami.hokkaido.jp":true,"kiyosato.hokkaido.jp":true,"koshimizu.hokkaido.jp":true,"kunneppu.hokkaido.jp":true,"kuriyama.hokkaido.jp":true,"kuromatsunai.hokkaido.jp":true,"kushiro.hokkaido.jp":true,"kutchan.hokkaido.jp":true,"kyowa.hokkaido.jp":true,"mashike.hokkaido.jp":true,"matsumae.hokkaido.jp":true,"mikasa.hokkaido.jp":true,"minamifurano.hokkaido.jp":true,"mombetsu.hokkaido.jp":true,"moseushi.hokkaido.jp":true,"mukawa.hokkaido.jp":true,"muroran.hokkaido.jp":true,"naie.hokkaido.jp":true,"nakagawa.hokkaido.jp":true,"nakasatsunai.hokkaido.jp":true,"nakatombetsu.hokkaido.jp":true,"nanae.hokkaido.jp":true,"nanporo.hokkaido.jp":true,"nayoro.hokkaido.jp":true,"nemuro.hokkaido.jp":true,"niikappu.hokkaido.jp":true,"niki.hokkaido.jp":true,"nishiokoppe.hokkaido.jp":true,"noboribetsu.hokkaido.jp":true,"numata.hokkaido.jp":true,"obihiro.hokkaido.jp":true,"obira.hokkaido.jp":true,"oketo.hokkaido.jp":true,"okoppe.hokkaido.jp":true,"otaru.hokkaido.jp":true,"otobe.hokkaido.jp":true,"otofuke.hokkaido.jp":true,"otoineppu.hokkaido.jp":true,"oumu.hokkaido.jp":true,"ozora.hokkaido.jp":true,"pippu.hokkaido.jp":true,"rankoshi.hokkaido.jp":true,"rebun.hokkaido.jp":true,"rikubetsu.hokkaido.jp":true,"rishiri.hokkaido.jp":true,"rishirifuji.hokkaido.jp":true,"saroma.hokkaido.jp":true,"sarufutsu.hokkaido.jp":true,"shakotan.hokkaido.jp":true,"shari.hokkaido.jp":true,"shibecha.hokkaido.jp":true,"shibetsu.hokkaido.jp":true,"shikabe.hokkaido.jp":true,"shikaoi.hokkaido.jp":true,"shimamaki.hokkaido.jp":true,"shimizu.hokkaido.jp":true,"shimokawa.hokkaido.jp":true,"shinshinotsu.hokkaido.jp":true,"shintoku.hokkaido.jp":true,"shiranuka.hokkaido.jp":true,"shiraoi.hokkaido.jp":true,"shiriuchi.hokkaido.jp":true,"sobetsu.hokkaido.jp":true,"sunagawa.hokkaido.jp":true,"taiki.hokkaido.jp":true,"takasu.hokkaido.jp":true,"takikawa.hokkaido.jp":true,"takinoue.hokkaido.jp":true,"teshikaga.hokkaido.jp":true,"tobetsu.hokkaido.jp":true,"tohma.hokkaido.jp":true,"tomakomai.hokkaido.jp":true,"tomari.hokkaido.jp":true,"toya.hokkaido.jp":true,"toyako.hokkaido.jp":true,"toyotomi.hokkaido.jp":true,"toyoura.hokkaido.jp":true,"tsubetsu.hokkaido.jp":true,"tsukigata.hokkaido.jp":true,"urakawa.hokkaido.jp":true,"urausu.hokkaido.jp":true,"uryu.hokkaido.jp":true,"utashinai.hokkaido.jp":true,"wakkanai.hokkaido.jp":true,"wassamu.hokkaido.jp":true,"yakumo.hokkaido.jp":true,"yoichi.hokkaido.jp":true,"aioi.hyogo.jp":true,"akashi.hyogo.jp":true,"ako.hyogo.jp":true,"amagasaki.hyogo.jp":true,"aogaki.hyogo.jp":true,"asago.hyogo.jp":true,"ashiya.hyogo.jp":true,"awaji.hyogo.jp":true,"fukusaki.hyogo.jp":true,"goshiki.hyogo.jp":true,"harima.hyogo.jp":true,"himeji.hyogo.jp":true,"ichikawa.hyogo.jp":true,"inagawa.hyogo.jp":true,"itami.hyogo.jp":true,"kakogawa.hyogo.jp":true,"kamigori.hyogo.jp":true,"kamikawa.hyogo.jp":true,"kasai.hyogo.jp":true,"kasuga.hyogo.jp":true,"kawanishi.hyogo.jp":true,"miki.hyogo.jp":true,"minamiawaji.hyogo.jp":true,"nishinomiya.hyogo.jp":true,"nishiwaki.hyogo.jp":true,"ono.hyogo.jp":true,"sanda.hyogo.jp":true,"sannan.hyogo.jp":true,"sasayama.hyogo.jp":true,"sayo.hyogo.jp":true,"shingu.hyogo.jp":true,"shinonsen.hyogo.jp":true,"shiso.hyogo.jp":true,"sumoto.hyogo.jp":true,"taishi.hyogo.jp":true,"taka.hyogo.jp":true,"takarazuka.hyogo.jp":true,"takasago.hyogo.jp":true,"takino.hyogo.jp":true,"tamba.hyogo.jp":true,"tatsuno.hyogo.jp":true,"toyooka.hyogo.jp":true,"yabu.hyogo.jp":true,"yashiro.hyogo.jp":true,"yoka.hyogo.jp":true,"yokawa.hyogo.jp":true,"ami.ibaraki.jp":true,"asahi.ibaraki.jp":true,"bando.ibaraki.jp":true,"chikusei.ibaraki.jp":true,"daigo.ibaraki.jp":true,"fujishiro.ibaraki.jp":true,"hitachi.ibaraki.jp":true,"hitachinaka.ibaraki.jp":true,"hitachiomiya.ibaraki.jp":true,"hitachiota.ibaraki.jp":true,"ibaraki.ibaraki.jp":true,"ina.ibaraki.jp":true,"inashiki.ibaraki.jp":true,"itako.ibaraki.jp":true,"iwama.ibaraki.jp":true,"joso.ibaraki.jp":true,"kamisu.ibaraki.jp":true,"kasama.ibaraki.jp":true,"kashima.ibaraki.jp":true,"kasumigaura.ibaraki.jp":true,"koga.ibaraki.jp":true,"miho.ibaraki.jp":true,"mito.ibaraki.jp":true,"moriya.ibaraki.jp":true,"naka.ibaraki.jp":true,"namegata.ibaraki.jp":true,"oarai.ibaraki.jp":true,"ogawa.ibaraki.jp":true,"omitama.ibaraki.jp":true,"ryugasaki.ibaraki.jp":true,"sakai.ibaraki.jp":true,"sakuragawa.ibaraki.jp":true,"shimodate.ibaraki.jp":true,"shimotsuma.ibaraki.jp":true,"shirosato.ibaraki.jp":true,"sowa.ibaraki.jp":true,"suifu.ibaraki.jp":true,"takahagi.ibaraki.jp":true,"tamatsukuri.ibaraki.jp":true,"tokai.ibaraki.jp":true,"tomobe.ibaraki.jp":true,"tone.ibaraki.jp":true,"toride.ibaraki.jp":true,"tsuchiura.ibaraki.jp":true,"tsukuba.ibaraki.jp":true,"uchihara.ibaraki.jp":true,"ushiku.ibaraki.jp":true,"yachiyo.ibaraki.jp":true,"yamagata.ibaraki.jp":true,"yawara.ibaraki.jp":true,"yuki.ibaraki.jp":true,"anamizu.ishikawa.jp":true,"hakui.ishikawa.jp":true,"hakusan.ishikawa.jp":true,"kaga.ishikawa.jp":true,"kahoku.ishikawa.jp":true,"kanazawa.ishikawa.jp":true,"kawakita.ishikawa.jp":true,"komatsu.ishikawa.jp":true,"nakanoto.ishikawa.jp":true,"nanao.ishikawa.jp":true,"nomi.ishikawa.jp":true,"nonoichi.ishikawa.jp":true,"noto.ishikawa.jp":true,"shika.ishikawa.jp":true,"suzu.ishikawa.jp":true,"tsubata.ishikawa.jp":true,"tsurugi.ishikawa.jp":true,"uchinada.ishikawa.jp":true,"wajima.ishikawa.jp":true,"fudai.iwate.jp":true,"fujisawa.iwate.jp":true,"hanamaki.iwate.jp":true,"hiraizumi.iwate.jp":true,"hirono.iwate.jp":true,"ichinohe.iwate.jp":true,"ichinoseki.iwate.jp":true,"iwaizumi.iwate.jp":true,"iwate.iwate.jp":true,"joboji.iwate.jp":true,"kamaishi.iwate.jp":true,"kanegasaki.iwate.jp":true,"karumai.iwate.jp":true,"kawai.iwate.jp":true,"kitakami.iwate.jp":true,"kuji.iwate.jp":true,"kunohe.iwate.jp":true,"kuzumaki.iwate.jp":true,"miyako.iwate.jp":true,"mizusawa.iwate.jp":true,"morioka.iwate.jp":true,"ninohe.iwate.jp":true,"noda.iwate.jp":true,"ofunato.iwate.jp":true,"oshu.iwate.jp":true,"otsuchi.iwate.jp":true,"rikuzentakata.iwate.jp":true,"shiwa.iwate.jp":true,"shizukuishi.iwate.jp":true,"sumita.iwate.jp":true,"tanohata.iwate.jp":true,"tono.iwate.jp":true,"yahaba.iwate.jp":true,"yamada.iwate.jp":true,"ayagawa.kagawa.jp":true,"higashikagawa.kagawa.jp":true,"kanonji.kagawa.jp":true,"kotohira.kagawa.jp":true,"manno.kagawa.jp":true,"marugame.kagawa.jp":true,"mitoyo.kagawa.jp":true,"naoshima.kagawa.jp":true,"sanuki.kagawa.jp":true,"tadotsu.kagawa.jp":true,"takamatsu.kagawa.jp":true,"tonosho.kagawa.jp":true,"uchinomi.kagawa.jp":true,"utazu.kagawa.jp":true,"zentsuji.kagawa.jp":true,"akune.kagoshima.jp":true,"amami.kagoshima.jp":true,"hioki.kagoshima.jp":true,"isa.kagoshima.jp":true,"isen.kagoshima.jp":true,"izumi.kagoshima.jp":true,"kagoshima.kagoshima.jp":true,"kanoya.kagoshima.jp":true,"kawanabe.kagoshima.jp":true,"kinko.kagoshima.jp":true,"kouyama.kagoshima.jp":true,"makurazaki.kagoshima.jp":true,"matsumoto.kagoshima.jp":true,"minamitane.kagoshima.jp":true,"nakatane.kagoshima.jp":true,"nishinoomote.kagoshima.jp":true,"satsumasendai.kagoshima.jp":true,"soo.kagoshima.jp":true,"tarumizu.kagoshima.jp":true,"yusui.kagoshima.jp":true,"aikawa.kanagawa.jp":true,"atsugi.kanagawa.jp":true,"ayase.kanagawa.jp":true,"chigasaki.kanagawa.jp":true,"ebina.kanagawa.jp":true,"fujisawa.kanagawa.jp":true,"hadano.kanagawa.jp":true,"hakone.kanagawa.jp":true,"hiratsuka.kanagawa.jp":true,"isehara.kanagawa.jp":true,"kaisei.kanagawa.jp":true,"kamakura.kanagawa.jp":true,"kiyokawa.kanagawa.jp":true,"matsuda.kanagawa.jp":true,"minamiashigara.kanagawa.jp":true,"miura.kanagawa.jp":true,"nakai.kanagawa.jp":true,"ninomiya.kanagawa.jp":true,"odawara.kanagawa.jp":true,"oi.kanagawa.jp":true,"oiso.kanagawa.jp":true,"sagamihara.kanagawa.jp":true,"samukawa.kanagawa.jp":true,"tsukui.kanagawa.jp":true,"yamakita.kanagawa.jp":true,"yamato.kanagawa.jp":true,"yokosuka.kanagawa.jp":true,"yugawara.kanagawa.jp":true,"zama.kanagawa.jp":true,"zushi.kanagawa.jp":true,"aki.kochi.jp":true,"geisei.kochi.jp":true,"hidaka.kochi.jp":true,"higashitsuno.kochi.jp":true,"ino.kochi.jp":true,"kagami.kochi.jp":true,"kami.kochi.jp":true,"kitagawa.kochi.jp":true,"kochi.kochi.jp":true,"mihara.kochi.jp":true,"motoyama.kochi.jp":true,"muroto.kochi.jp":true,"nahari.kochi.jp":true,"nakamura.kochi.jp":true,"nankoku.kochi.jp":true,"nishitosa.kochi.jp":true,"niyodogawa.kochi.jp":true,"ochi.kochi.jp":true,"okawa.kochi.jp":true,"otoyo.kochi.jp":true,"otsuki.kochi.jp":true,"sakawa.kochi.jp":true,"sukumo.kochi.jp":true,"susaki.kochi.jp":true,"tosa.kochi.jp":true,"tosashimizu.kochi.jp":true,"toyo.kochi.jp":true,"tsuno.kochi.jp":true,"umaji.kochi.jp":true,"yasuda.kochi.jp":true,"yusuhara.kochi.jp":true,"amakusa.kumamoto.jp":true,"arao.kumamoto.jp":true,"aso.kumamoto.jp":true,"choyo.kumamoto.jp":true,"gyokuto.kumamoto.jp":true,"hitoyoshi.kumamoto.jp":true,"kamiamakusa.kumamoto.jp":true,"kashima.kumamoto.jp":true,"kikuchi.kumamoto.jp":true,"kosa.kumamoto.jp":true,"kumamoto.kumamoto.jp":true,"mashiki.kumamoto.jp":true,"mifune.kumamoto.jp":true,"minamata.kumamoto.jp":true,"minamioguni.kumamoto.jp":true,"nagasu.kumamoto.jp":true,"nishihara.kumamoto.jp":true,"oguni.kumamoto.jp":true,"ozu.kumamoto.jp":true,"sumoto.kumamoto.jp":true,"takamori.kumamoto.jp":true,"uki.kumamoto.jp":true,"uto.kumamoto.jp":true,"yamaga.kumamoto.jp":true,"yamato.kumamoto.jp":true,"yatsushiro.kumamoto.jp":true,"ayabe.kyoto.jp":true,"fukuchiyama.kyoto.jp":true,"higashiyama.kyoto.jp":true,"ide.kyoto.jp":true,"ine.kyoto.jp":true,"joyo.kyoto.jp":true,"kameoka.kyoto.jp":true,"kamo.kyoto.jp":true,"kita.kyoto.jp":true,"kizu.kyoto.jp":true,"kumiyama.kyoto.jp":true,"kyotamba.kyoto.jp":true,"kyotanabe.kyoto.jp":true,"kyotango.kyoto.jp":true,"maizuru.kyoto.jp":true,"minami.kyoto.jp":true,"minamiyamashiro.kyoto.jp":true,"miyazu.kyoto.jp":true,"muko.kyoto.jp":true,"nagaokakyo.kyoto.jp":true,"nakagyo.kyoto.jp":true,"nantan.kyoto.jp":true,"oyamazaki.kyoto.jp":true,"sakyo.kyoto.jp":true,"seika.kyoto.jp":true,"tanabe.kyoto.jp":true,"uji.kyoto.jp":true,"ujitawara.kyoto.jp":true,"wazuka.kyoto.jp":true,"yamashina.kyoto.jp":true,"yawata.kyoto.jp":true,"asahi.mie.jp":true,"inabe.mie.jp":true,"ise.mie.jp":true,"kameyama.mie.jp":true,"kawagoe.mie.jp":true,"kiho.mie.jp":true,"kisosaki.mie.jp":true,"kiwa.mie.jp":true,"komono.mie.jp":true,"kumano.mie.jp":true,"kuwana.mie.jp":true,"matsusaka.mie.jp":true,"meiwa.mie.jp":true,"mihama.mie.jp":true,"minamiise.mie.jp":true,"misugi.mie.jp":true,"miyama.mie.jp":true,"nabari.mie.jp":true,"shima.mie.jp":true,"suzuka.mie.jp":true,"tado.mie.jp":true,"taiki.mie.jp":true,"taki.mie.jp":true,"tamaki.mie.jp":true,"toba.mie.jp":true,"tsu.mie.jp":true,"udono.mie.jp":true,"ureshino.mie.jp":true,"watarai.mie.jp":true,"yokkaichi.mie.jp":true,"furukawa.miyagi.jp":true,"higashimatsushima.miyagi.jp":true,"ishinomaki.miyagi.jp":true,"iwanuma.miyagi.jp":true,"kakuda.miyagi.jp":true,"kami.miyagi.jp":true,"kawasaki.miyagi.jp":true,"kesennuma.miyagi.jp":true,"marumori.miyagi.jp":true,"matsushima.miyagi.jp":true,"minamisanriku.miyagi.jp":true,"misato.miyagi.jp":true,"murata.miyagi.jp":true,"natori.miyagi.jp":true,"ogawara.miyagi.jp":true,"ohira.miyagi.jp":true,"onagawa.miyagi.jp":true,"osaki.miyagi.jp":true,"rifu.miyagi.jp":true,"semine.miyagi.jp":true,"shibata.miyagi.jp":true,"shichikashuku.miyagi.jp":true,"shikama.miyagi.jp":true,"shiogama.miyagi.jp":true,"shiroishi.miyagi.jp":true,"tagajo.miyagi.jp":true,"taiwa.miyagi.jp":true,"tome.miyagi.jp":true,"tomiya.miyagi.jp":true,"wakuya.miyagi.jp":true,"watari.miyagi.jp":true,"yamamoto.miyagi.jp":true,"zao.miyagi.jp":true,"aya.miyazaki.jp":true,"ebino.miyazaki.jp":true,"gokase.miyazaki.jp":true,"hyuga.miyazaki.jp":true,"kadogawa.miyazaki.jp":true,"kawaminami.miyazaki.jp":true,"kijo.miyazaki.jp":true,"kitagawa.miyazaki.jp":true,"kitakata.miyazaki.jp":true,"kitaura.miyazaki.jp":true,"kobayashi.miyazaki.jp":true,"kunitomi.miyazaki.jp":true,"kushima.miyazaki.jp":true,"mimata.miyazaki.jp":true,"miyakonojo.miyazaki.jp":true,"miyazaki.miyazaki.jp":true,"morotsuka.miyazaki.jp":true,"nichinan.miyazaki.jp":true,"nishimera.miyazaki.jp":true,"nobeoka.miyazaki.jp":true,"saito.miyazaki.jp":true,"shiiba.miyazaki.jp":true,"shintomi.miyazaki.jp":true,"takaharu.miyazaki.jp":true,"takanabe.miyazaki.jp":true,"takazaki.miyazaki.jp":true,"tsuno.miyazaki.jp":true,"achi.nagano.jp":true,"agematsu.nagano.jp":true,"anan.nagano.jp":true,"aoki.nagano.jp":true,"asahi.nagano.jp":true,"azumino.nagano.jp":true,"chikuhoku.nagano.jp":true,"chikuma.nagano.jp":true,"chino.nagano.jp":true,"fujimi.nagano.jp":true,"hakuba.nagano.jp":true,"hara.nagano.jp":true,"hiraya.nagano.jp":true,"iida.nagano.jp":true,"iijima.nagano.jp":true,"iiyama.nagano.jp":true,"iizuna.nagano.jp":true,"ikeda.nagano.jp":true,"ikusaka.nagano.jp":true,"ina.nagano.jp":true,"karuizawa.nagano.jp":true,"kawakami.nagano.jp":true,"kiso.nagano.jp":true,"kisofukushima.nagano.jp":true,"kitaaiki.nagano.jp":true,"komagane.nagano.jp":true,"komoro.nagano.jp":true,"matsukawa.nagano.jp":true,"matsumoto.nagano.jp":true,"miasa.nagano.jp":true,"minamiaiki.nagano.jp":true,"minamimaki.nagano.jp":true,"minamiminowa.nagano.jp":true,"minowa.nagano.jp":true,"miyada.nagano.jp":true,"miyota.nagano.jp":true,"mochizuki.nagano.jp":true,"nagano.nagano.jp":true,"nagawa.nagano.jp":true,"nagiso.nagano.jp":true,"nakagawa.nagano.jp":true,"nakano.nagano.jp":true,"nozawaonsen.nagano.jp":true,"obuse.nagano.jp":true,"ogawa.nagano.jp":true,"okaya.nagano.jp":true,"omachi.nagano.jp":true,"omi.nagano.jp":true,"ookuwa.nagano.jp":true,"ooshika.nagano.jp":true,"otaki.nagano.jp":true,"otari.nagano.jp":true,"sakae.nagano.jp":true,"sakaki.nagano.jp":true,"saku.nagano.jp":true,"sakuho.nagano.jp":true,"shimosuwa.nagano.jp":true,"shinanomachi.nagano.jp":true,"shiojiri.nagano.jp":true,"suwa.nagano.jp":true,"suzaka.nagano.jp":true,"takagi.nagano.jp":true,"takamori.nagano.jp":true,"takayama.nagano.jp":true,"tateshina.nagano.jp":true,"tatsuno.nagano.jp":true,"togakushi.nagano.jp":true,"togura.nagano.jp":true,"tomi.nagano.jp":true,"ueda.nagano.jp":true,"wada.nagano.jp":true,"yamagata.nagano.jp":true,"yamanouchi.nagano.jp":true,"yasaka.nagano.jp":true,"yasuoka.nagano.jp":true,"chijiwa.nagasaki.jp":true,"futsu.nagasaki.jp":true,"goto.nagasaki.jp":true,"hasami.nagasaki.jp":true,"hirado.nagasaki.jp":true,"iki.nagasaki.jp":true,"isahaya.nagasaki.jp":true,"kawatana.nagasaki.jp":true,"kuchinotsu.nagasaki.jp":true,"matsuura.nagasaki.jp":true,"nagasaki.nagasaki.jp":true,"obama.nagasaki.jp":true,"omura.nagasaki.jp":true,"oseto.nagasaki.jp":true,"saikai.nagasaki.jp":true,"sasebo.nagasaki.jp":true,"seihi.nagasaki.jp":true,"shimabara.nagasaki.jp":true,"shinkamigoto.nagasaki.jp":true,"togitsu.nagasaki.jp":true,"tsushima.nagasaki.jp":true,"unzen.nagasaki.jp":true,"ando.nara.jp":true,"gose.nara.jp":true,"heguri.nara.jp":true,"higashiyoshino.nara.jp":true,"ikaruga.nara.jp":true,"ikoma.nara.jp":true,"kamikitayama.nara.jp":true,"kanmaki.nara.jp":true,"kashiba.nara.jp":true,"kashihara.nara.jp":true,"katsuragi.nara.jp":true,"kawai.nara.jp":true,"kawakami.nara.jp":true,"kawanishi.nara.jp":true,"koryo.nara.jp":true,"kurotaki.nara.jp":true,"mitsue.nara.jp":true,"miyake.nara.jp":true,"nara.nara.jp":true,"nosegawa.nara.jp":true,"oji.nara.jp":true,"ouda.nara.jp":true,"oyodo.nara.jp":true,"sakurai.nara.jp":true,"sango.nara.jp":true,"shimoichi.nara.jp":true,"shimokitayama.nara.jp":true,"shinjo.nara.jp":true,"soni.nara.jp":true,"takatori.nara.jp":true,"tawaramoto.nara.jp":true,"tenkawa.nara.jp":true,"tenri.nara.jp":true,"uda.nara.jp":true,"yamatokoriyama.nara.jp":true,"yamatotakada.nara.jp":true,"yamazoe.nara.jp":true,"yoshino.nara.jp":true,"aga.niigata.jp":true,"agano.niigata.jp":true,"gosen.niigata.jp":true,"itoigawa.niigata.jp":true,"izumozaki.niigata.jp":true,"joetsu.niigata.jp":true,"kamo.niigata.jp":true,"kariwa.niigata.jp":true,"kashiwazaki.niigata.jp":true,"minamiuonuma.niigata.jp":true,"mitsuke.niigata.jp":true,"muika.niigata.jp":true,"murakami.niigata.jp":true,"myoko.niigata.jp":true,"nagaoka.niigata.jp":true,"niigata.niigata.jp":true,"ojiya.niigata.jp":true,"omi.niigata.jp":true,"sado.niigata.jp":true,"sanjo.niigata.jp":true,"seiro.niigata.jp":true,"seirou.niigata.jp":true,"sekikawa.niigata.jp":true,"shibata.niigata.jp":true,"tagami.niigata.jp":true,"tainai.niigata.jp":true,"tochio.niigata.jp":true,"tokamachi.niigata.jp":true,"tsubame.niigata.jp":true,"tsunan.niigata.jp":true,"uonuma.niigata.jp":true,"yahiko.niigata.jp":true,"yoita.niigata.jp":true,"yuzawa.niigata.jp":true,"beppu.oita.jp":true,"bungoono.oita.jp":true,"bungotakada.oita.jp":true,"hasama.oita.jp":true,"hiji.oita.jp":true,"himeshima.oita.jp":true,"hita.oita.jp":true,"kamitsue.oita.jp":true,"kokonoe.oita.jp":true,"kuju.oita.jp":true,"kunisaki.oita.jp":true,"kusu.oita.jp":true,"oita.oita.jp":true,"saiki.oita.jp":true,"taketa.oita.jp":true,"tsukumi.oita.jp":true,"usa.oita.jp":true,"usuki.oita.jp":true,"yufu.oita.jp":true,"akaiwa.okayama.jp":true,"asakuchi.okayama.jp":true,"bizen.okayama.jp":true,"hayashima.okayama.jp":true,"ibara.okayama.jp":true,"kagamino.okayama.jp":true,"kasaoka.okayama.jp":true,"kibichuo.okayama.jp":true,"kumenan.okayama.jp":true,"kurashiki.okayama.jp":true,"maniwa.okayama.jp":true,"misaki.okayama.jp":true,"nagi.okayama.jp":true,"niimi.okayama.jp":true,"nishiawakura.okayama.jp":true,"okayama.okayama.jp":true,"satosho.okayama.jp":true,"setouchi.okayama.jp":true,"shinjo.okayama.jp":true,"shoo.okayama.jp":true,"soja.okayama.jp":true,"takahashi.okayama.jp":true,"tamano.okayama.jp":true,"tsuyama.okayama.jp":true,"wake.okayama.jp":true,"yakage.okayama.jp":true,"aguni.okinawa.jp":true,"ginowan.okinawa.jp":true,"ginoza.okinawa.jp":true,"gushikami.okinawa.jp":true,"haebaru.okinawa.jp":true,"higashi.okinawa.jp":true,"hirara.okinawa.jp":true,"iheya.okinawa.jp":true,"ishigaki.okinawa.jp":true,"ishikawa.okinawa.jp":true,"itoman.okinawa.jp":true,"izena.okinawa.jp":true,"kadena.okinawa.jp":true,"kin.okinawa.jp":true,"kitadaito.okinawa.jp":true,"kitanakagusuku.okinawa.jp":true,"kumejima.okinawa.jp":true,"kunigami.okinawa.jp":true,"minamidaito.okinawa.jp":true,"motobu.okinawa.jp":true,"nago.okinawa.jp":true,"naha.okinawa.jp":true,"nakagusuku.okinawa.jp":true,"nakijin.okinawa.jp":true,"nanjo.okinawa.jp":true,"nishihara.okinawa.jp":true,"ogimi.okinawa.jp":true,"okinawa.okinawa.jp":true,"onna.okinawa.jp":true,"shimoji.okinawa.jp":true,"taketomi.okinawa.jp":true,"tarama.okinawa.jp":true,"tokashiki.okinawa.jp":true,"tomigusuku.okinawa.jp":true,"tonaki.okinawa.jp":true,"urasoe.okinawa.jp":true,"uruma.okinawa.jp":true,"yaese.okinawa.jp":true,"yomitan.okinawa.jp":true,"yonabaru.okinawa.jp":true,"yonaguni.okinawa.jp":true,"zamami.okinawa.jp":true,"abeno.osaka.jp":true,"chihayaakasaka.osaka.jp":true,"chuo.osaka.jp":true,"daito.osaka.jp":true,"fujiidera.osaka.jp":true,"habikino.osaka.jp":true,"hannan.osaka.jp":true,"higashiosaka.osaka.jp":true,"higashisumiyoshi.osaka.jp":true,"higashiyodogawa.osaka.jp":true,"hirakata.osaka.jp":true,"ibaraki.osaka.jp":true,"ikeda.osaka.jp":true,"izumi.osaka.jp":true,"izumiotsu.osaka.jp":true,"izumisano.osaka.jp":true,"kadoma.osaka.jp":true,"kaizuka.osaka.jp":true,"kanan.osaka.jp":true,"kashiwara.osaka.jp":true,"katano.osaka.jp":true,"kawachinagano.osaka.jp":true,"kishiwada.osaka.jp":true,"kita.osaka.jp":true,"kumatori.osaka.jp":true,"matsubara.osaka.jp":true,"minato.osaka.jp":true,"minoh.osaka.jp":true,"misaki.osaka.jp":true,"moriguchi.osaka.jp":true,"neyagawa.osaka.jp":true,"nishi.osaka.jp":true,"nose.osaka.jp":true,"osakasayama.osaka.jp":true,"sakai.osaka.jp":true,"sayama.osaka.jp":true,"sennan.osaka.jp":true,"settsu.osaka.jp":true,"shijonawate.osaka.jp":true,"shimamoto.osaka.jp":true,"suita.osaka.jp":true,"tadaoka.osaka.jp":true,"taishi.osaka.jp":true,"tajiri.osaka.jp":true,"takaishi.osaka.jp":true,"takatsuki.osaka.jp":true,"tondabayashi.osaka.jp":true,"toyonaka.osaka.jp":true,"toyono.osaka.jp":true,"yao.osaka.jp":true,"ariake.saga.jp":true,"arita.saga.jp":true,"fukudomi.saga.jp":true,"genkai.saga.jp":true,"hamatama.saga.jp":true,"hizen.saga.jp":true,"imari.saga.jp":true,"kamimine.saga.jp":true,"kanzaki.saga.jp":true,"karatsu.saga.jp":true,"kashima.saga.jp":true,"kitagata.saga.jp":true,"kitahata.saga.jp":true,"kiyama.saga.jp":true,"kouhoku.saga.jp":true,"kyuragi.saga.jp":true,"nishiarita.saga.jp":true,"ogi.saga.jp":true,"omachi.saga.jp":true,"ouchi.saga.jp":true,"saga.saga.jp":true,"shiroishi.saga.jp":true,"taku.saga.jp":true,"tara.saga.jp":true,"tosu.saga.jp":true,"yoshinogari.saga.jp":true,"arakawa.saitama.jp":true,"asaka.saitama.jp":true,"chichibu.saitama.jp":true,"fujimi.saitama.jp":true,"fujimino.saitama.jp":true,"fukaya.saitama.jp":true,"hanno.saitama.jp":true,"hanyu.saitama.jp":true,"hasuda.saitama.jp":true,"hatogaya.saitama.jp":true,"hatoyama.saitama.jp":true,"hidaka.saitama.jp":true,"higashichichibu.saitama.jp":true,"higashimatsuyama.saitama.jp":true,"honjo.saitama.jp":true,"ina.saitama.jp":true,"iruma.saitama.jp":true,"iwatsuki.saitama.jp":true,"kamiizumi.saitama.jp":true,"kamikawa.saitama.jp":true,"kamisato.saitama.jp":true,"kasukabe.saitama.jp":true,"kawagoe.saitama.jp":true,"kawaguchi.saitama.jp":true,"kawajima.saitama.jp":true,"kazo.saitama.jp":true,"kitamoto.saitama.jp":true,"koshigaya.saitama.jp":true,"kounosu.saitama.jp":true,"kuki.saitama.jp":true,"kumagaya.saitama.jp":true,"matsubushi.saitama.jp":true,"minano.saitama.jp":true,"misato.saitama.jp":true,"miyashiro.saitama.jp":true,"miyoshi.saitama.jp":true,"moroyama.saitama.jp":true,"nagatoro.saitama.jp":true,"namegawa.saitama.jp":true,"niiza.saitama.jp":true,"ogano.saitama.jp":true,"ogawa.saitama.jp":true,"ogose.saitama.jp":true,"okegawa.saitama.jp":true,"omiya.saitama.jp":true,"otaki.saitama.jp":true,"ranzan.saitama.jp":true,"ryokami.saitama.jp":true,"saitama.saitama.jp":true,"sakado.saitama.jp":true,"satte.saitama.jp":true,"sayama.saitama.jp":true,"shiki.saitama.jp":true,"shiraoka.saitama.jp":true,"soka.saitama.jp":true,"sugito.saitama.jp":true,"toda.saitama.jp":true,"tokigawa.saitama.jp":true,"tokorozawa.saitama.jp":true,"tsurugashima.saitama.jp":true,"urawa.saitama.jp":true,"warabi.saitama.jp":true,"yashio.saitama.jp":true,"yokoze.saitama.jp":true,"yono.saitama.jp":true,"yorii.saitama.jp":true,"yoshida.saitama.jp":true,"yoshikawa.saitama.jp":true,"yoshimi.saitama.jp":true,"aisho.shiga.jp":true,"gamo.shiga.jp":true,"higashiomi.shiga.jp":true,"hikone.shiga.jp":true,"koka.shiga.jp":true,"konan.shiga.jp":true,"kosei.shiga.jp":true,"koto.shiga.jp":true,"kusatsu.shiga.jp":true,"maibara.shiga.jp":true,"moriyama.shiga.jp":true,"nagahama.shiga.jp":true,"nishiazai.shiga.jp":true,"notogawa.shiga.jp":true,"omihachiman.shiga.jp":true,"otsu.shiga.jp":true,"ritto.shiga.jp":true,"ryuoh.shiga.jp":true,"takashima.shiga.jp":true,"takatsuki.shiga.jp":true,"torahime.shiga.jp":true,"toyosato.shiga.jp":true,"yasu.shiga.jp":true,"akagi.shimane.jp":true,"ama.shimane.jp":true,"gotsu.shimane.jp":true,"hamada.shimane.jp":true,"higashiizumo.shimane.jp":true,"hikawa.shimane.jp":true,"hikimi.shimane.jp":true,"izumo.shimane.jp":true,"kakinoki.shimane.jp":true,"masuda.shimane.jp":true,"matsue.shimane.jp":true,"misato.shimane.jp":true,"nishinoshima.shimane.jp":true,"ohda.shimane.jp":true,"okinoshima.shimane.jp":true,"okuizumo.shimane.jp":true,"shimane.shimane.jp":true,"tamayu.shimane.jp":true,"tsuwano.shimane.jp":true,"unnan.shimane.jp":true,"yakumo.shimane.jp":true,"yasugi.shimane.jp":true,"yatsuka.shimane.jp":true,"arai.shizuoka.jp":true,"atami.shizuoka.jp":true,"fuji.shizuoka.jp":true,"fujieda.shizuoka.jp":true,"fujikawa.shizuoka.jp":true,"fujinomiya.shizuoka.jp":true,"fukuroi.shizuoka.jp":true,"gotemba.shizuoka.jp":true,"haibara.shizuoka.jp":true,"hamamatsu.shizuoka.jp":true,"higashiizu.shizuoka.jp":true,"ito.shizuoka.jp":true,"iwata.shizuoka.jp":true,"izu.shizuoka.jp":true,"izunokuni.shizuoka.jp":true,"kakegawa.shizuoka.jp":true,"kannami.shizuoka.jp":true,"kawanehon.shizuoka.jp":true,"kawazu.shizuoka.jp":true,"kikugawa.shizuoka.jp":true,"kosai.shizuoka.jp":true,"makinohara.shizuoka.jp":true,"matsuzaki.shizuoka.jp":true,"minamiizu.shizuoka.jp":true,"mishima.shizuoka.jp":true,"morimachi.shizuoka.jp":true,"nishiizu.shizuoka.jp":true,"numazu.shizuoka.jp":true,"omaezaki.shizuoka.jp":true,"shimada.shizuoka.jp":true,"shimizu.shizuoka.jp":true,"shimoda.shizuoka.jp":true,"shizuoka.shizuoka.jp":true,"susono.shizuoka.jp":true,"yaizu.shizuoka.jp":true,"yoshida.shizuoka.jp":true,"ashikaga.tochigi.jp":true,"bato.tochigi.jp":true,"haga.tochigi.jp":true,"ichikai.tochigi.jp":true,"iwafune.tochigi.jp":true,"kaminokawa.tochigi.jp":true,"kanuma.tochigi.jp":true,"karasuyama.tochigi.jp":true,"kuroiso.tochigi.jp":true,"mashiko.tochigi.jp":true,"mibu.tochigi.jp":true,"moka.tochigi.jp":true,"motegi.tochigi.jp":true,"nasu.tochigi.jp":true,"nasushiobara.tochigi.jp":true,"nikko.tochigi.jp":true,"nishikata.tochigi.jp":true,"nogi.tochigi.jp":true,"ohira.tochigi.jp":true,"ohtawara.tochigi.jp":true,"oyama.tochigi.jp":true,"sakura.tochigi.jp":true,"sano.tochigi.jp":true,"shimotsuke.tochigi.jp":true,"shioya.tochigi.jp":true,"takanezawa.tochigi.jp":true,"tochigi.tochigi.jp":true,"tsuga.tochigi.jp":true,"ujiie.tochigi.jp":true,"utsunomiya.tochigi.jp":true,"yaita.tochigi.jp":true,"aizumi.tokushima.jp":true,"anan.tokushima.jp":true,"ichiba.tokushima.jp":true,"itano.tokushima.jp":true,"kainan.tokushima.jp":true,"komatsushima.tokushima.jp":true,"matsushige.tokushima.jp":true,"mima.tokushima.jp":true,"minami.tokushima.jp":true,"miyoshi.tokushima.jp":true,"mugi.tokushima.jp":true,"nakagawa.tokushima.jp":true,"naruto.tokushima.jp":true,"sanagochi.tokushima.jp":true,"shishikui.tokushima.jp":true,"tokushima.tokushima.jp":true,"wajiki.tokushima.jp":true,"adachi.tokyo.jp":true,"akiruno.tokyo.jp":true,"akishima.tokyo.jp":true,"aogashima.tokyo.jp":true,"arakawa.tokyo.jp":true,"bunkyo.tokyo.jp":true,"chiyoda.tokyo.jp":true,"chofu.tokyo.jp":true,"chuo.tokyo.jp":true,"edogawa.tokyo.jp":true,"fuchu.tokyo.jp":true,"fussa.tokyo.jp":true,"hachijo.tokyo.jp":true,"hachioji.tokyo.jp":true,"hamura.tokyo.jp":true,"higashikurume.tokyo.jp":true,"higashimurayama.tokyo.jp":true,"higashiyamato.tokyo.jp":true,"hino.tokyo.jp":true,"hinode.tokyo.jp":true,"hinohara.tokyo.jp":true,"inagi.tokyo.jp":true,"itabashi.tokyo.jp":true,"katsushika.tokyo.jp":true,"kita.tokyo.jp":true,"kiyose.tokyo.jp":true,"kodaira.tokyo.jp":true,"koganei.tokyo.jp":true,"kokubunji.tokyo.jp":true,"komae.tokyo.jp":true,"koto.tokyo.jp":true,"kouzushima.tokyo.jp":true,"kunitachi.tokyo.jp":true,"machida.tokyo.jp":true,"meguro.tokyo.jp":true,"minato.tokyo.jp":true,"mitaka.tokyo.jp":true,"mizuho.tokyo.jp":true,"musashimurayama.tokyo.jp":true,"musashino.tokyo.jp":true,"nakano.tokyo.jp":true,"nerima.tokyo.jp":true,"ogasawara.tokyo.jp":true,"okutama.tokyo.jp":true,"ome.tokyo.jp":true,"oshima.tokyo.jp":true,"ota.tokyo.jp":true,"setagaya.tokyo.jp":true,"shibuya.tokyo.jp":true,"shinagawa.tokyo.jp":true,"shinjuku.tokyo.jp":true,"suginami.tokyo.jp":true,"sumida.tokyo.jp":true,"tachikawa.tokyo.jp":true,"taito.tokyo.jp":true,"tama.tokyo.jp":true,"toshima.tokyo.jp":true,"chizu.tottori.jp":true,"hino.tottori.jp":true,"kawahara.tottori.jp":true,"koge.tottori.jp":true,"kotoura.tottori.jp":true,"misasa.tottori.jp":true,"nanbu.tottori.jp":true,"nichinan.tottori.jp":true,"sakaiminato.tottori.jp":true,"tottori.tottori.jp":true,"wakasa.tottori.jp":true,"yazu.tottori.jp":true,"yonago.tottori.jp":true,"asahi.toyama.jp":true,"fuchu.toyama.jp":true,"fukumitsu.toyama.jp":true,"funahashi.toyama.jp":true,"himi.toyama.jp":true,"imizu.toyama.jp":true,"inami.toyama.jp":true,"johana.toyama.jp":true,"kamiichi.toyama.jp":true,"kurobe.toyama.jp":true,"nakaniikawa.toyama.jp":true,"namerikawa.toyama.jp":true,"nanto.toyama.jp":true,"nyuzen.toyama.jp":true,"oyabe.toyama.jp":true,"taira.toyama.jp":true,"takaoka.toyama.jp":true,"tateyama.toyama.jp":true,"toga.toyama.jp":true,"tonami.toyama.jp":true,"toyama.toyama.jp":true,"unazuki.toyama.jp":true,"uozu.toyama.jp":true,"yamada.toyama.jp":true,"arida.wakayama.jp":true,"aridagawa.wakayama.jp":true,"gobo.wakayama.jp":true,"hashimoto.wakayama.jp":true,"hidaka.wakayama.jp":true,"hirogawa.wakayama.jp":true,"inami.wakayama.jp":true,"iwade.wakayama.jp":true,"kainan.wakayama.jp":true,"kamitonda.wakayama.jp":true,"katsuragi.wakayama.jp":true,"kimino.wakayama.jp":true,"kinokawa.wakayama.jp":true,"kitayama.wakayama.jp":true,"koya.wakayama.jp":true,"koza.wakayama.jp":true,"kozagawa.wakayama.jp":true,"kudoyama.wakayama.jp":true,"kushimoto.wakayama.jp":true,"mihama.wakayama.jp":true,"misato.wakayama.jp":true,"nachikatsuura.wakayama.jp":true,"shingu.wakayama.jp":true,"shirahama.wakayama.jp":true,"taiji.wakayama.jp":true,"tanabe.wakayama.jp":true,"wakayama.wakayama.jp":true,"yuasa.wakayama.jp":true,"yura.wakayama.jp":true,"asahi.yamagata.jp":true,"funagata.yamagata.jp":true,"higashine.yamagata.jp":true,"iide.yamagata.jp":true,"kahoku.yamagata.jp":true,"kaminoyama.yamagata.jp":true,"kaneyama.yamagata.jp":true,"kawanishi.yamagata.jp":true,"mamurogawa.yamagata.jp":true,"mikawa.yamagata.jp":true,"murayama.yamagata.jp":true,"nagai.yamagata.jp":true,"nakayama.yamagata.jp":true,"nanyo.yamagata.jp":true,"nishikawa.yamagata.jp":true,"obanazawa.yamagata.jp":true,"oe.yamagata.jp":true,"oguni.yamagata.jp":true,"ohkura.yamagata.jp":true,"oishida.yamagata.jp":true,"sagae.yamagata.jp":true,"sakata.yamagata.jp":true,"sakegawa.yamagata.jp":true,"shinjo.yamagata.jp":true,"shirataka.yamagata.jp":true,"shonai.yamagata.jp":true,"takahata.yamagata.jp":true,"tendo.yamagata.jp":true,"tozawa.yamagata.jp":true,"tsuruoka.yamagata.jp":true,"yamagata.yamagata.jp":true,"yamanobe.yamagata.jp":true,"yonezawa.yamagata.jp":true,"yuza.yamagata.jp":true,"abu.yamaguchi.jp":true,"hagi.yamaguchi.jp":true,"hikari.yamaguchi.jp":true,"hofu.yamaguchi.jp":true,"iwakuni.yamaguchi.jp":true,"kudamatsu.yamaguchi.jp":true,"mitou.yamaguchi.jp":true,"nagato.yamaguchi.jp":true,"oshima.yamaguchi.jp":true,"shimonoseki.yamaguchi.jp":true,"shunan.yamaguchi.jp":true,"tabuse.yamaguchi.jp":true,"tokuyama.yamaguchi.jp":true,"toyota.yamaguchi.jp":true,"ube.yamaguchi.jp":true,"yuu.yamaguchi.jp":true,"chuo.yamanashi.jp":true,"doshi.yamanashi.jp":true,"fuefuki.yamanashi.jp":true,"fujikawa.yamanashi.jp":true,"fujikawaguchiko.yamanashi.jp":true,"fujiyoshida.yamanashi.jp":true,"hayakawa.yamanashi.jp":true,"hokuto.yamanashi.jp":true,"ichikawamisato.yamanashi.jp":true,"kai.yamanashi.jp":true,"kofu.yamanashi.jp":true,"koshu.yamanashi.jp":true,"kosuge.yamanashi.jp":true,"minami-alps.yamanashi.jp":true,"minobu.yamanashi.jp":true,"nakamichi.yamanashi.jp":true,"nanbu.yamanashi.jp":true,"narusawa.yamanashi.jp":true,"nirasaki.yamanashi.jp":true,"nishikatsura.yamanashi.jp":true,"oshino.yamanashi.jp":true,"otsuki.yamanashi.jp":true,"showa.yamanashi.jp":true,"tabayama.yamanashi.jp":true,"tsuru.yamanashi.jp":true,"uenohara.yamanashi.jp":true,"yamanakako.yamanashi.jp":true,"yamanashi.yamanashi.jp":true,"*.ke":true,"kg":true,"org.kg":true,"net.kg":true,"com.kg":true,"edu.kg":true,"gov.kg":true,"mil.kg":true,"*.kh":true,"ki":true,"edu.ki":true,"biz.ki":true,"net.ki":true,"org.ki":true,"gov.ki":true,"info.ki":true,"com.ki":true,"km":true,"org.km":true,"nom.km":true,"gov.km":true,"prd.km":true,"tm.km":true,"edu.km":true,"mil.km":true,"ass.km":true,"com.km":true,"coop.km":true,"asso.km":true,"presse.km":true,"medecin.km":true,"notaires.km":true,"pharmaciens.km":true,"veterinaire.km":true,"gouv.km":true,"kn":true,"net.kn":true,"org.kn":true,"edu.kn":true,"gov.kn":true,"kp":true,"com.kp":true,"edu.kp":true,"gov.kp":true,"org.kp":true,"rep.kp":true,"tra.kp":true,"kr":true,"ac.kr":true,"co.kr":true,"es.kr":true,"go.kr":true,"hs.kr":true,"kg.kr":true,"mil.kr":true,"ms.kr":true,"ne.kr":true,"or.kr":true,"pe.kr":true,"re.kr":true,"sc.kr":true,"busan.kr":true,"chungbuk.kr":true,"chungnam.kr":true,"daegu.kr":true,"daejeon.kr":true,"gangwon.kr":true,"gwangju.kr":true,"gyeongbuk.kr":true,"gyeonggi.kr":true,"gyeongnam.kr":true,"incheon.kr":true,"jeju.kr":true,"jeonbuk.kr":true,"jeonnam.kr":true,"seoul.kr":true,"ulsan.kr":true,"*.kw":true,"ky":true,"edu.ky":true,"gov.ky":true,"com.ky":true,"org.ky":true,"net.ky":true,"kz":true,"org.kz":true,"edu.kz":true,"net.kz":true,"gov.kz":true,"mil.kz":true,"com.kz":true,"la":true,"int.la":true,"net.la":true,"info.la":true,"edu.la":true,"gov.la":true,"per.la":true,"com.la":true,"org.la":true,"lb":true,"com.lb":true,"edu.lb":true,"gov.lb":true,"net.lb":true,"org.lb":true,"lc":true,"com.lc":true,"net.lc":true,"co.lc":true,"org.lc":true,"edu.lc":true,"gov.lc":true,"li":true,"lk":true,"gov.lk":true,"sch.lk":true,"net.lk":true,"int.lk":true,"com.lk":true,"org.lk":true,"edu.lk":true,"ngo.lk":true,"soc.lk":true,"web.lk":true,"ltd.lk":true,"assn.lk":true,"grp.lk":true,"hotel.lk":true,"ac.lk":true,"lr":true,"com.lr":true,"edu.lr":true,"gov.lr":true,"org.lr":true,"net.lr":true,"ls":true,"co.ls":true,"org.ls":true,"lt":true,"gov.lt":true,"lu":true,"lv":true,"com.lv":true,"edu.lv":true,"gov.lv":true,"org.lv":true,"mil.lv":true,"id.lv":true,"net.lv":true,"asn.lv":true,"conf.lv":true,"ly":true,"com.ly":true,"net.ly":true,"gov.ly":true,"plc.ly":true,"edu.ly":true,"sch.ly":true,"med.ly":true,"org.ly":true,"id.ly":true,"ma":true,"co.ma":true,"net.ma":true,"gov.ma":true,"org.ma":true,"ac.ma":true,"press.ma":true,"mc":true,"tm.mc":true,"asso.mc":true,"md":true,"me":true,"co.me":true,"net.me":true,"org.me":true,"edu.me":true,"ac.me":true,"gov.me":true,"its.me":true,"priv.me":true,"mg":true,"org.mg":true,"nom.mg":true,"gov.mg":true,"prd.mg":true,"tm.mg":true,"edu.mg":true,"mil.mg":true,"com.mg":true,"co.mg":true,"mh":true,"mil":true,"mk":true,"com.mk":true,"org.mk":true,"net.mk":true,"edu.mk":true,"gov.mk":true,"inf.mk":true,"name.mk":true,"ml":true,"com.ml":true,"edu.ml":true,"gouv.ml":true,"gov.ml":true,"net.ml":true,"org.ml":true,"presse.ml":true,"*.mm":true,"mn":true,"gov.mn":true,"edu.mn":true,"org.mn":true,"mo":true,"com.mo":true,"net.mo":true,"org.mo":true,"edu.mo":true,"gov.mo":true,"mobi":true,"mp":true,"mq":true,"mr":true,"gov.mr":true,"ms":true,"com.ms":true,"edu.ms":true,"gov.ms":true,"net.ms":true,"org.ms":true,"mt":true,"com.mt":true,"edu.mt":true,"net.mt":true,"org.mt":true,"mu":true,"com.mu":true,"net.mu":true,"org.mu":true,"gov.mu":true,"ac.mu":true,"co.mu":true,"or.mu":true,"museum":true,"academy.museum":true,"agriculture.museum":true,"air.museum":true,"airguard.museum":true,"alabama.museum":true,"alaska.museum":true,"amber.museum":true,"ambulance.museum":true,"american.museum":true,"americana.museum":true,"americanantiques.museum":true,"americanart.museum":true,"amsterdam.museum":true,"and.museum":true,"annefrank.museum":true,"anthro.museum":true,"anthropology.museum":true,"antiques.museum":true,"aquarium.museum":true,"arboretum.museum":true,"archaeological.museum":true,"archaeology.museum":true,"architecture.museum":true,"art.museum":true,"artanddesign.museum":true,"artcenter.museum":true,"artdeco.museum":true,"arteducation.museum":true,"artgallery.museum":true,"arts.museum":true,"artsandcrafts.museum":true,"asmatart.museum":true,"assassination.museum":true,"assisi.museum":true,"association.museum":true,"astronomy.museum":true,"atlanta.museum":true,"austin.museum":true,"australia.museum":true,"automotive.museum":true,"aviation.museum":true,"axis.museum":true,"badajoz.museum":true,"baghdad.museum":true,"bahn.museum":true,"bale.museum":true,"baltimore.museum":true,"barcelona.museum":true,"baseball.museum":true,"basel.museum":true,"baths.museum":true,"bauern.museum":true,"beauxarts.museum":true,"beeldengeluid.museum":true,"bellevue.museum":true,"bergbau.museum":true,"berkeley.museum":true,"berlin.museum":true,"bern.museum":true,"bible.museum":true,"bilbao.museum":true,"bill.museum":true,"birdart.museum":true,"birthplace.museum":true,"bonn.museum":true,"boston.museum":true,"botanical.museum":true,"botanicalgarden.museum":true,"botanicgarden.museum":true,"botany.museum":true,"brandywinevalley.museum":true,"brasil.museum":true,"bristol.museum":true,"british.museum":true,"britishcolumbia.museum":true,"broadcast.museum":true,"brunel.museum":true,"brussel.museum":true,"brussels.museum":true,"bruxelles.museum":true,"building.museum":true,"burghof.museum":true,"bus.museum":true,"bushey.museum":true,"cadaques.museum":true,"california.museum":true,"cambridge.museum":true,"can.museum":true,"canada.museum":true,"capebreton.museum":true,"carrier.museum":true,"cartoonart.museum":true,"casadelamoneda.museum":true,"castle.museum":true,"castres.museum":true,"celtic.museum":true,"center.museum":true,"chattanooga.museum":true,"cheltenham.museum":true,"chesapeakebay.museum":true,"chicago.museum":true,"children.museum":true,"childrens.museum":true,"childrensgarden.museum":true,"chiropractic.museum":true,"chocolate.museum":true,"christiansburg.museum":true,"cincinnati.museum":true,"cinema.museum":true,"circus.museum":true,"civilisation.museum":true,"civilization.museum":true,"civilwar.museum":true,"clinton.museum":true,"clock.museum":true,"coal.museum":true,"coastaldefence.museum":true,"cody.museum":true,"coldwar.museum":true,"collection.museum":true,"colonialwilliamsburg.museum":true,"coloradoplateau.museum":true,"columbia.museum":true,"columbus.museum":true,"communication.museum":true,"communications.museum":true,"community.museum":true,"computer.museum":true,"computerhistory.museum":true,"xn--comunicaes-v6a2o.museum":true,"contemporary.museum":true,"contemporaryart.museum":true,"convent.museum":true,"copenhagen.museum":true,"corporation.museum":true,"xn--correios-e-telecomunicaes-ghc29a.museum":true,"corvette.museum":true,"costume.museum":true,"countryestate.museum":true,"county.museum":true,"crafts.museum":true,"cranbrook.museum":true,"creation.museum":true,"cultural.museum":true,"culturalcenter.museum":true,"culture.museum":true,"cyber.museum":true,"cymru.museum":true,"dali.museum":true,"dallas.museum":true,"database.museum":true,"ddr.museum":true,"decorativearts.museum":true,"delaware.museum":true,"delmenhorst.museum":true,"denmark.museum":true,"depot.museum":true,"design.museum":true,"detroit.museum":true,"dinosaur.museum":true,"discovery.museum":true,"dolls.museum":true,"donostia.museum":true,"durham.museum":true,"eastafrica.museum":true,"eastcoast.museum":true,"education.museum":true,"educational.museum":true,"egyptian.museum":true,"eisenbahn.museum":true,"elburg.museum":true,"elvendrell.museum":true,"embroidery.museum":true,"encyclopedic.museum":true,"england.museum":true,"entomology.museum":true,"environment.museum":true,"environmentalconservation.museum":true,"epilepsy.museum":true,"essex.museum":true,"estate.museum":true,"ethnology.museum":true,"exeter.museum":true,"exhibition.museum":true,"family.museum":true,"farm.museum":true,"farmequipment.museum":true,"farmers.museum":true,"farmstead.museum":true,"field.museum":true,"figueres.museum":true,"filatelia.museum":true,"film.museum":true,"fineart.museum":true,"finearts.museum":true,"finland.museum":true,"flanders.museum":true,"florida.museum":true,"force.museum":true,"fortmissoula.museum":true,"fortworth.museum":true,"foundation.museum":true,"francaise.museum":true,"frankfurt.museum":true,"franziskaner.museum":true,"freemasonry.museum":true,"freiburg.museum":true,"fribourg.museum":true,"frog.museum":true,"fundacio.museum":true,"furniture.museum":true,"gallery.museum":true,"garden.museum":true,"gateway.museum":true,"geelvinck.museum":true,"gemological.museum":true,"geology.museum":true,"georgia.museum":true,"giessen.museum":true,"glas.museum":true,"glass.museum":true,"gorge.museum":true,"grandrapids.museum":true,"graz.museum":true,"guernsey.museum":true,"halloffame.museum":true,"hamburg.museum":true,"handson.museum":true,"harvestcelebration.museum":true,"hawaii.museum":true,"health.museum":true,"heimatunduhren.museum":true,"hellas.museum":true,"helsinki.museum":true,"hembygdsforbund.museum":true,"heritage.museum":true,"histoire.museum":true,"historical.museum":true,"historicalsociety.museum":true,"historichouses.museum":true,"historisch.museum":true,"historisches.museum":true,"history.museum":true,"historyofscience.museum":true,"horology.museum":true,"house.museum":true,"humanities.museum":true,"illustration.museum":true,"imageandsound.museum":true,"indian.museum":true,"indiana.museum":true,"indianapolis.museum":true,"indianmarket.museum":true,"intelligence.museum":true,"interactive.museum":true,"iraq.museum":true,"iron.museum":true,"isleofman.museum":true,"jamison.museum":true,"jefferson.museum":true,"jerusalem.museum":true,"jewelry.museum":true,"jewish.museum":true,"jewishart.museum":true,"jfk.museum":true,"journalism.museum":true,"judaica.museum":true,"judygarland.museum":true,"juedisches.museum":true,"juif.museum":true,"karate.museum":true,"karikatur.museum":true,"kids.museum":true,"koebenhavn.museum":true,"koeln.museum":true,"kunst.museum":true,"kunstsammlung.museum":true,"kunstunddesign.museum":true,"labor.museum":true,"labour.museum":true,"lajolla.museum":true,"lancashire.museum":true,"landes.museum":true,"lans.museum":true,"xn--lns-qla.museum":true,"larsson.museum":true,"lewismiller.museum":true,"lincoln.museum":true,"linz.museum":true,"living.museum":true,"livinghistory.museum":true,"localhistory.museum":true,"london.museum":true,"losangeles.museum":true,"louvre.museum":true,"loyalist.museum":true,"lucerne.museum":true,"luxembourg.museum":true,"luzern.museum":true,"mad.museum":true,"madrid.museum":true,"mallorca.museum":true,"manchester.museum":true,"mansion.museum":true,"mansions.museum":true,"manx.museum":true,"marburg.museum":true,"maritime.museum":true,"maritimo.museum":true,"maryland.museum":true,"marylhurst.museum":true,"media.museum":true,"medical.museum":true,"medizinhistorisches.museum":true,"meeres.museum":true,"memorial.museum":true,"mesaverde.museum":true,"michigan.museum":true,"midatlantic.museum":true,"military.museum":true,"mill.museum":true,"miners.museum":true,"mining.museum":true,"minnesota.museum":true,"missile.museum":true,"missoula.museum":true,"modern.museum":true,"moma.museum":true,"money.museum":true,"monmouth.museum":true,"monticello.museum":true,"montreal.museum":true,"moscow.museum":true,"motorcycle.museum":true,"muenchen.museum":true,"muenster.museum":true,"mulhouse.museum":true,"muncie.museum":true,"museet.museum":true,"museumcenter.museum":true,"museumvereniging.museum":true,"music.museum":true,"national.museum":true,"nationalfirearms.museum":true,"nationalheritage.museum":true,"nativeamerican.museum":true,"naturalhistory.museum":true,"naturalhistorymuseum.museum":true,"naturalsciences.museum":true,"nature.museum":true,"naturhistorisches.museum":true,"natuurwetenschappen.museum":true,"naumburg.museum":true,"naval.museum":true,"nebraska.museum":true,"neues.museum":true,"newhampshire.museum":true,"newjersey.museum":true,"newmexico.museum":true,"newport.museum":true,"newspaper.museum":true,"newyork.museum":true,"niepce.museum":true,"norfolk.museum":true,"north.museum":true,"nrw.museum":true,"nuernberg.museum":true,"nuremberg.museum":true,"nyc.museum":true,"nyny.museum":true,"oceanographic.museum":true,"oceanographique.museum":true,"omaha.museum":true,"online.museum":true,"ontario.museum":true,"openair.museum":true,"oregon.museum":true,"oregontrail.museum":true,"otago.museum":true,"oxford.museum":true,"pacific.museum":true,"paderborn.museum":true,"palace.museum":true,"paleo.museum":true,"palmsprings.museum":true,"panama.museum":true,"paris.museum":true,"pasadena.museum":true,"pharmacy.museum":true,"philadelphia.museum":true,"philadelphiaarea.museum":true,"philately.museum":true,"phoenix.museum":true,"photography.museum":true,"pilots.museum":true,"pittsburgh.museum":true,"planetarium.museum":true,"plantation.museum":true,"plants.museum":true,"plaza.museum":true,"portal.museum":true,"portland.museum":true,"portlligat.museum":true,"posts-and-telecommunications.museum":true,"preservation.museum":true,"presidio.museum":true,"press.museum":true,"project.museum":true,"public.museum":true,"pubol.museum":true,"quebec.museum":true,"railroad.museum":true,"railway.museum":true,"research.museum":true,"resistance.museum":true,"riodejaneiro.museum":true,"rochester.museum":true,"rockart.museum":true,"roma.museum":true,"russia.museum":true,"saintlouis.museum":true,"salem.museum":true,"salvadordali.museum":true,"salzburg.museum":true,"sandiego.museum":true,"sanfrancisco.museum":true,"santabarbara.museum":true,"santacruz.museum":true,"santafe.museum":true,"saskatchewan.museum":true,"satx.museum":true,"savannahga.museum":true,"schlesisches.museum":true,"schoenbrunn.museum":true,"schokoladen.museum":true,"school.museum":true,"schweiz.museum":true,"science.museum":true,"scienceandhistory.museum":true,"scienceandindustry.museum":true,"sciencecenter.museum":true,"sciencecenters.museum":true,"science-fiction.museum":true,"sciencehistory.museum":true,"sciences.museum":true,"sciencesnaturelles.museum":true,"scotland.museum":true,"seaport.museum":true,"settlement.museum":true,"settlers.museum":true,"shell.museum":true,"sherbrooke.museum":true,"sibenik.museum":true,"silk.museum":true,"ski.museum":true,"skole.museum":true,"society.museum":true,"sologne.museum":true,"soundandvision.museum":true,"southcarolina.museum":true,"southwest.museum":true,"space.museum":true,"spy.museum":true,"square.museum":true,"stadt.museum":true,"stalbans.museum":true,"starnberg.museum":true,"state.museum":true,"stateofdelaware.museum":true,"station.museum":true,"steam.museum":true,"steiermark.museum":true,"stjohn.museum":true,"stockholm.museum":true,"stpetersburg.museum":true,"stuttgart.museum":true,"suisse.museum":true,"surgeonshall.museum":true,"surrey.museum":true,"svizzera.museum":true,"sweden.museum":true,"sydney.museum":true,"tank.museum":true,"tcm.museum":true,"technology.museum":true,"telekommunikation.museum":true,"television.museum":true,"texas.museum":true,"textile.museum":true,"theater.museum":true,"time.museum":true,"timekeeping.museum":true,"topology.museum":true,"torino.museum":true,"touch.museum":true,"town.museum":true,"transport.museum":true,"tree.museum":true,"trolley.museum":true,"trust.museum":true,"trustee.museum":true,"uhren.museum":true,"ulm.museum":true,"undersea.museum":true,"university.museum":true,"usa.museum":true,"usantiques.museum":true,"usarts.museum":true,"uscountryestate.museum":true,"usculture.museum":true,"usdecorativearts.museum":true,"usgarden.museum":true,"ushistory.museum":true,"ushuaia.museum":true,"uslivinghistory.museum":true,"utah.museum":true,"uvic.museum":true,"valley.museum":true,"vantaa.museum":true,"versailles.museum":true,"viking.museum":true,"village.museum":true,"virginia.museum":true,"virtual.museum":true,"virtuel.museum":true,"vlaanderen.museum":true,"volkenkunde.museum":true,"wales.museum":true,"wallonie.museum":true,"war.museum":true,"washingtondc.museum":true,"watchandclock.museum":true,"watch-and-clock.museum":true,"western.museum":true,"westfalen.museum":true,"whaling.museum":true,"wildlife.museum":true,"williamsburg.museum":true,"windmill.museum":true,"workshop.museum":true,"york.museum":true,"yorkshire.museum":true,"yosemite.museum":true,"youth.museum":true,"zoological.museum":true,"zoology.museum":true,"xn--9dbhblg6di.museum":true,"xn--h1aegh.museum":true,"mv":true,"aero.mv":true,"biz.mv":true,"com.mv":true,"coop.mv":true,"edu.mv":true,"gov.mv":true,"info.mv":true,"int.mv":true,"mil.mv":true,"museum.mv":true,"name.mv":true,"net.mv":true,"org.mv":true,"pro.mv":true,"mw":true,"ac.mw":true,"biz.mw":true,"co.mw":true,"com.mw":true,"coop.mw":true,"edu.mw":true,"gov.mw":true,"int.mw":true,"museum.mw":true,"net.mw":true,"org.mw":true,"mx":true,"com.mx":true,"org.mx":true,"gob.mx":true,"edu.mx":true,"net.mx":true,"my":true,"com.my":true,"net.my":true,"org.my":true,"gov.my":true,"edu.my":true,"mil.my":true,"name.my":true,"*.mz":true,"teledata.mz":false,"na":true,"info.na":true,"pro.na":true,"name.na":true,"school.na":true,"or.na":true,"dr.na":true,"us.na":true,"mx.na":true,"ca.na":true,"in.na":true,"cc.na":true,"tv.na":true,"ws.na":true,"mobi.na":true,"co.na":true,"com.na":true,"org.na":true,"name":true,"nc":true,"asso.nc":true,"ne":true,"net":true,"nf":true,"com.nf":true,"net.nf":true,"per.nf":true,"rec.nf":true,"web.nf":true,"arts.nf":true,"firm.nf":true,"info.nf":true,"other.nf":true,"store.nf":true,"ng":true,"com.ng":true,"edu.ng":true,"name.ng":true,"net.ng":true,"org.ng":true,"sch.ng":true,"gov.ng":true,"mil.ng":true,"mobi.ng":true,"*.ni":true,"nl":true,"bv.nl":true,"no":true,"fhs.no":true,"vgs.no":true,"fylkesbibl.no":true,"folkebibl.no":true,"museum.no":true,"idrett.no":true,"priv.no":true,"mil.no":true,"stat.no":true,"dep.no":true,"kommune.no":true,"herad.no":true,"aa.no":true,"ah.no":true,"bu.no":true,"fm.no":true,"hl.no":true,"hm.no":true,"jan-mayen.no":true,"mr.no":true,"nl.no":true,"nt.no":true,"of.no":true,"ol.no":true,"oslo.no":true,"rl.no":true,"sf.no":true,"st.no":true,"svalbard.no":true,"tm.no":true,"tr.no":true,"va.no":true,"vf.no":true,"gs.aa.no":true,"gs.ah.no":true,"gs.bu.no":true,"gs.fm.no":true,"gs.hl.no":true,"gs.hm.no":true,"gs.jan-mayen.no":true,"gs.mr.no":true,"gs.nl.no":true,"gs.nt.no":true,"gs.of.no":true,"gs.ol.no":true,"gs.oslo.no":true,"gs.rl.no":true,"gs.sf.no":true,"gs.st.no":true,"gs.svalbard.no":true,"gs.tm.no":true,"gs.tr.no":true,"gs.va.no":true,"gs.vf.no":true,"akrehamn.no":true,"xn--krehamn-dxa.no":true,"algard.no":true,"xn--lgrd-poac.no":true,"arna.no":true,"brumunddal.no":true,"bryne.no":true,"bronnoysund.no":true,"xn--brnnysund-m8ac.no":true,"drobak.no":true,"xn--drbak-wua.no":true,"egersund.no":true,"fetsund.no":true,"floro.no":true,"xn--flor-jra.no":true,"fredrikstad.no":true,"hokksund.no":true,"honefoss.no":true,"xn--hnefoss-q1a.no":true,"jessheim.no":true,"jorpeland.no":true,"xn--jrpeland-54a.no":true,"kirkenes.no":true,"kopervik.no":true,"krokstadelva.no":true,"langevag.no":true,"xn--langevg-jxa.no":true,"leirvik.no":true,"mjondalen.no":true,"xn--mjndalen-64a.no":true,"mo-i-rana.no":true,"mosjoen.no":true,"xn--mosjen-eya.no":true,"nesoddtangen.no":true,"orkanger.no":true,"osoyro.no":true,"xn--osyro-wua.no":true,"raholt.no":true,"xn--rholt-mra.no":true,"sandnessjoen.no":true,"xn--sandnessjen-ogb.no":true,"skedsmokorset.no":true,"slattum.no":true,"spjelkavik.no":true,"stathelle.no":true,"stavern.no":true,"stjordalshalsen.no":true,"xn--stjrdalshalsen-sqb.no":true,"tananger.no":true,"tranby.no":true,"vossevangen.no":true,"afjord.no":true,"xn--fjord-lra.no":true,"agdenes.no":true,"al.no":true,"xn--l-1fa.no":true,"alesund.no":true,"xn--lesund-hua.no":true,"alstahaug.no":true,"alta.no":true,"xn--lt-liac.no":true,"alaheadju.no":true,"xn--laheadju-7ya.no":true,"alvdal.no":true,"amli.no":true,"xn--mli-tla.no":true,"amot.no":true,"xn--mot-tla.no":true,"andebu.no":true,"andoy.no":true,"xn--andy-ira.no":true,"andasuolo.no":true,"ardal.no":true,"xn--rdal-poa.no":true,"aremark.no":true,"arendal.no":true,"xn--s-1fa.no":true,"aseral.no":true,"xn--seral-lra.no":true,"asker.no":true,"askim.no":true,"askvoll.no":true,"askoy.no":true,"xn--asky-ira.no":true,"asnes.no":true,"xn--snes-poa.no":true,"audnedaln.no":true,"aukra.no":true,"aure.no":true,"aurland.no":true,"aurskog-holand.no":true,"xn--aurskog-hland-jnb.no":true,"austevoll.no":true,"austrheim.no":true,"averoy.no":true,"xn--avery-yua.no":true,"balestrand.no":true,"ballangen.no":true,"balat.no":true,"xn--blt-elab.no":true,"balsfjord.no":true,"bahccavuotna.no":true,"xn--bhccavuotna-k7a.no":true,"bamble.no":true,"bardu.no":true,"beardu.no":true,"beiarn.no":true,"bajddar.no":true,"xn--bjddar-pta.no":true,"baidar.no":true,"xn--bidr-5nac.no":true,"berg.no":true,"bergen.no":true,"berlevag.no":true,"xn--berlevg-jxa.no":true,"bearalvahki.no":true,"xn--bearalvhki-y4a.no":true,"bindal.no":true,"birkenes.no":true,"bjarkoy.no":true,"xn--bjarky-fya.no":true,"bjerkreim.no":true,"bjugn.no":true,"bodo.no":true,"xn--bod-2na.no":true,"badaddja.no":true,"xn--bdddj-mrabd.no":true,"budejju.no":true,"bokn.no":true,"bremanger.no":true,"bronnoy.no":true,"xn--brnny-wuac.no":true,"bygland.no":true,"bykle.no":true,"barum.no":true,"xn--brum-voa.no":true,"bo.telemark.no":true,"xn--b-5ga.telemark.no":true,"bo.nordland.no":true,"xn--b-5ga.nordland.no":true,"bievat.no":true,"xn--bievt-0qa.no":true,"bomlo.no":true,"xn--bmlo-gra.no":true,"batsfjord.no":true,"xn--btsfjord-9za.no":true,"bahcavuotna.no":true,"xn--bhcavuotna-s4a.no":true,"dovre.no":true,"drammen.no":true,"drangedal.no":true,"dyroy.no":true,"xn--dyry-ira.no":true,"donna.no":true,"xn--dnna-gra.no":true,"eid.no":true,"eidfjord.no":true,"eidsberg.no":true,"eidskog.no":true,"eidsvoll.no":true,"eigersund.no":true,"elverum.no":true,"enebakk.no":true,"engerdal.no":true,"etne.no":true,"etnedal.no":true,"evenes.no":true,"evenassi.no":true,"xn--eveni-0qa01ga.no":true,"evje-og-hornnes.no":true,"farsund.no":true,"fauske.no":true,"fuossko.no":true,"fuoisku.no":true,"fedje.no":true,"fet.no":true,"finnoy.no":true,"xn--finny-yua.no":true,"fitjar.no":true,"fjaler.no":true,"fjell.no":true,"flakstad.no":true,"flatanger.no":true,"flekkefjord.no":true,"flesberg.no":true,"flora.no":true,"fla.no":true,"xn--fl-zia.no":true,"folldal.no":true,"forsand.no":true,"fosnes.no":true,"frei.no":true,"frogn.no":true,"froland.no":true,"frosta.no":true,"frana.no":true,"xn--frna-woa.no":true,"froya.no":true,"xn--frya-hra.no":true,"fusa.no":true,"fyresdal.no":true,"forde.no":true,"xn--frde-gra.no":true,"gamvik.no":true,"gangaviika.no":true,"xn--ggaviika-8ya47h.no":true,"gaular.no":true,"gausdal.no":true,"gildeskal.no":true,"xn--gildeskl-g0a.no":true,"giske.no":true,"gjemnes.no":true,"gjerdrum.no":true,"gjerstad.no":true,"gjesdal.no":true,"gjovik.no":true,"xn--gjvik-wua.no":true,"gloppen.no":true,"gol.no":true,"gran.no":true,"grane.no":true,"granvin.no":true,"gratangen.no":true,"grimstad.no":true,"grong.no":true,"kraanghke.no":true,"xn--kranghke-b0a.no":true,"grue.no":true,"gulen.no":true,"hadsel.no":true,"halden.no":true,"halsa.no":true,"hamar.no":true,"hamaroy.no":true,"habmer.no":true,"xn--hbmer-xqa.no":true,"hapmir.no":true,"xn--hpmir-xqa.no":true,"hammerfest.no":true,"hammarfeasta.no":true,"xn--hmmrfeasta-s4ac.no":true,"haram.no":true,"hareid.no":true,"harstad.no":true,"hasvik.no":true,"aknoluokta.no":true,"xn--koluokta-7ya57h.no":true,"hattfjelldal.no":true,"aarborte.no":true,"haugesund.no":true,"hemne.no":true,"hemnes.no":true,"hemsedal.no":true,"heroy.more-og-romsdal.no":true,"xn--hery-ira.xn--mre-og-romsdal-qqb.no":true,"heroy.nordland.no":true,"xn--hery-ira.nordland.no":true,"hitra.no":true,"hjartdal.no":true,"hjelmeland.no":true,"hobol.no":true,"xn--hobl-ira.no":true,"hof.no":true,"hol.no":true,"hole.no":true,"holmestrand.no":true,"holtalen.no":true,"xn--holtlen-hxa.no":true,"hornindal.no":true,"horten.no":true,"hurdal.no":true,"hurum.no":true,"hvaler.no":true,"hyllestad.no":true,"hagebostad.no":true,"xn--hgebostad-g3a.no":true,"hoyanger.no":true,"xn--hyanger-q1a.no":true,"hoylandet.no":true,"xn--hylandet-54a.no":true,"ha.no":true,"xn--h-2fa.no":true,"ibestad.no":true,"inderoy.no":true,"xn--indery-fya.no":true,"iveland.no":true,"jevnaker.no":true,"jondal.no":true,"jolster.no":true,"xn--jlster-bya.no":true,"karasjok.no":true,"karasjohka.no":true,"xn--krjohka-hwab49j.no":true,"karlsoy.no":true,"galsa.no":true,"xn--gls-elac.no":true,"karmoy.no":true,"xn--karmy-yua.no":true,"kautokeino.no":true,"guovdageaidnu.no":true,"klepp.no":true,"klabu.no":true,"xn--klbu-woa.no":true,"kongsberg.no":true,"kongsvinger.no":true,"kragero.no":true,"xn--krager-gya.no":true,"kristiansand.no":true,"kristiansund.no":true,"krodsherad.no":true,"xn--krdsherad-m8a.no":true,"kvalsund.no":true,"rahkkeravju.no":true,"xn--rhkkervju-01af.no":true,"kvam.no":true,"kvinesdal.no":true,"kvinnherad.no":true,"kviteseid.no":true,"kvitsoy.no":true,"xn--kvitsy-fya.no":true,"kvafjord.no":true,"xn--kvfjord-nxa.no":true,"giehtavuoatna.no":true,"kvanangen.no":true,"xn--kvnangen-k0a.no":true,"navuotna.no":true,"xn--nvuotna-hwa.no":true,"kafjord.no":true,"xn--kfjord-iua.no":true,"gaivuotna.no":true,"xn--givuotna-8ya.no":true,"larvik.no":true,"lavangen.no":true,"lavagis.no":true,"loabat.no":true,"xn--loabt-0qa.no":true,"lebesby.no":true,"davvesiida.no":true,"leikanger.no":true,"leirfjord.no":true,"leka.no":true,"leksvik.no":true,"lenvik.no":true,"leangaviika.no":true,"xn--leagaviika-52b.no":true,"lesja.no":true,"levanger.no":true,"lier.no":true,"lierne.no":true,"lillehammer.no":true,"lillesand.no":true,"lindesnes.no":true,"lindas.no":true,"xn--linds-pra.no":true,"lom.no":true,"loppa.no":true,"lahppi.no":true,"xn--lhppi-xqa.no":true,"lund.no":true,"lunner.no":true,"luroy.no":true,"xn--lury-ira.no":true,"luster.no":true,"lyngdal.no":true,"lyngen.no":true,"ivgu.no":true,"lardal.no":true,"lerdal.no":true,"xn--lrdal-sra.no":true,"lodingen.no":true,"xn--ldingen-q1a.no":true,"lorenskog.no":true,"xn--lrenskog-54a.no":true,"loten.no":true,"xn--lten-gra.no":true,"malvik.no":true,"masoy.no":true,"xn--msy-ula0h.no":true,"muosat.no":true,"xn--muost-0qa.no":true,"mandal.no":true,"marker.no":true,"marnardal.no":true,"masfjorden.no":true,"meland.no":true,"meldal.no":true,"melhus.no":true,"meloy.no":true,"xn--mely-ira.no":true,"meraker.no":true,"xn--merker-kua.no":true,"moareke.no":true,"xn--moreke-jua.no":true,"midsund.no":true,"midtre-gauldal.no":true,"modalen.no":true,"modum.no":true,"molde.no":true,"moskenes.no":true,"moss.no":true,"mosvik.no":true,"malselv.no":true,"xn--mlselv-iua.no":true,"malatvuopmi.no":true,"xn--mlatvuopmi-s4a.no":true,"namdalseid.no":true,"aejrie.no":true,"namsos.no":true,"namsskogan.no":true,"naamesjevuemie.no":true,"xn--nmesjevuemie-tcba.no":true,"laakesvuemie.no":true,"nannestad.no":true,"narvik.no":true,"narviika.no":true,"naustdal.no":true,"nedre-eiker.no":true,"nes.akershus.no":true,"nes.buskerud.no":true,"nesna.no":true,"nesodden.no":true,"nesseby.no":true,"unjarga.no":true,"xn--unjrga-rta.no":true,"nesset.no":true,"nissedal.no":true,"nittedal.no":true,"nord-aurdal.no":true,"nord-fron.no":true,"nord-odal.no":true,"norddal.no":true,"nordkapp.no":true,"davvenjarga.no":true,"xn--davvenjrga-y4a.no":true,"nordre-land.no":true,"nordreisa.no":true,"raisa.no":true,"xn--risa-5na.no":true,"nore-og-uvdal.no":true,"notodden.no":true,"naroy.no":true,"xn--nry-yla5g.no":true,"notteroy.no":true,"xn--nttery-byae.no":true,"odda.no":true,"oksnes.no":true,"xn--ksnes-uua.no":true,"oppdal.no":true,"oppegard.no":true,"xn--oppegrd-ixa.no":true,"orkdal.no":true,"orland.no":true,"xn--rland-uua.no":true,"orskog.no":true,"xn--rskog-uua.no":true,"orsta.no":true,"xn--rsta-fra.no":true,"os.hedmark.no":true,"os.hordaland.no":true,"osen.no":true,"osteroy.no":true,"xn--ostery-fya.no":true,"ostre-toten.no":true,"xn--stre-toten-zcb.no":true,"overhalla.no":true,"ovre-eiker.no":true,"xn--vre-eiker-k8a.no":true,"oyer.no":true,"xn--yer-zna.no":true,"oygarden.no":true,"xn--ygarden-p1a.no":true,"oystre-slidre.no":true,"xn--ystre-slidre-ujb.no":true,"porsanger.no":true,"porsangu.no":true,"xn--porsgu-sta26f.no":true,"porsgrunn.no":true,"radoy.no":true,"xn--rady-ira.no":true,"rakkestad.no":true,"rana.no":true,"ruovat.no":true,"randaberg.no":true,"rauma.no":true,"rendalen.no":true,"rennebu.no":true,"rennesoy.no":true,"xn--rennesy-v1a.no":true,"rindal.no":true,"ringebu.no":true,"ringerike.no":true,"ringsaker.no":true,"rissa.no":true,"risor.no":true,"xn--risr-ira.no":true,"roan.no":true,"rollag.no":true,"rygge.no":true,"ralingen.no":true,"xn--rlingen-mxa.no":true,"rodoy.no":true,"xn--rdy-0nab.no":true,"romskog.no":true,"xn--rmskog-bya.no":true,"roros.no":true,"xn--rros-gra.no":true,"rost.no":true,"xn--rst-0na.no":true,"royken.no":true,"xn--ryken-vua.no":true,"royrvik.no":true,"xn--ryrvik-bya.no":true,"rade.no":true,"xn--rde-ula.no":true,"salangen.no":true,"siellak.no":true,"saltdal.no":true,"salat.no":true,"xn--slt-elab.no":true,"xn--slat-5na.no":true,"samnanger.no":true,"sande.more-og-romsdal.no":true,"sande.xn--mre-og-romsdal-qqb.no":true,"sande.vestfold.no":true,"sandefjord.no":true,"sandnes.no":true,"sandoy.no":true,"xn--sandy-yua.no":true,"sarpsborg.no":true,"sauda.no":true,"sauherad.no":true,"sel.no":true,"selbu.no":true,"selje.no":true,"seljord.no":true,"sigdal.no":true,"siljan.no":true,"sirdal.no":true,"skaun.no":true,"skedsmo.no":true,"ski.no":true,"skien.no":true,"skiptvet.no":true,"skjervoy.no":true,"xn--skjervy-v1a.no":true,"skierva.no":true,"xn--skierv-uta.no":true,"skjak.no":true,"xn--skjk-soa.no":true,"skodje.no":true,"skanland.no":true,"xn--sknland-fxa.no":true,"skanit.no":true,"xn--sknit-yqa.no":true,"smola.no":true,"xn--smla-hra.no":true,"snillfjord.no":true,"snasa.no":true,"xn--snsa-roa.no":true,"snoasa.no":true,"snaase.no":true,"xn--snase-nra.no":true,"sogndal.no":true,"sokndal.no":true,"sola.no":true,"solund.no":true,"songdalen.no":true,"sortland.no":true,"spydeberg.no":true,"stange.no":true,"stavanger.no":true,"steigen.no":true,"steinkjer.no":true,"stjordal.no":true,"xn--stjrdal-s1a.no":true,"stokke.no":true,"stor-elvdal.no":true,"stord.no":true,"stordal.no":true,"storfjord.no":true,"omasvuotna.no":true,"strand.no":true,"stranda.no":true,"stryn.no":true,"sula.no":true,"suldal.no":true,"sund.no":true,"sunndal.no":true,"surnadal.no":true,"sveio.no":true,"svelvik.no":true,"sykkylven.no":true,"sogne.no":true,"xn--sgne-gra.no":true,"somna.no":true,"xn--smna-gra.no":true,"sondre-land.no":true,"xn--sndre-land-0cb.no":true,"sor-aurdal.no":true,"xn--sr-aurdal-l8a.no":true,"sor-fron.no":true,"xn--sr-fron-q1a.no":true,"sor-odal.no":true,"xn--sr-odal-q1a.no":true,"sor-varanger.no":true,"xn--sr-varanger-ggb.no":true,"matta-varjjat.no":true,"xn--mtta-vrjjat-k7af.no":true,"sorfold.no":true,"xn--srfold-bya.no":true,"sorreisa.no":true,"xn--srreisa-q1a.no":true,"sorum.no":true,"xn--srum-gra.no":true,"tana.no":true,"deatnu.no":true,"time.no":true,"tingvoll.no":true,"tinn.no":true,"tjeldsund.no":true,"dielddanuorri.no":true,"tjome.no":true,"xn--tjme-hra.no":true,"tokke.no":true,"tolga.no":true,"torsken.no":true,"tranoy.no":true,"xn--trany-yua.no":true,"tromso.no":true,"xn--troms-zua.no":true,"tromsa.no":true,"romsa.no":true,"trondheim.no":true,"troandin.no":true,"trysil.no":true,"trana.no":true,"xn--trna-woa.no":true,"trogstad.no":true,"xn--trgstad-r1a.no":true,"tvedestrand.no":true,"tydal.no":true,"tynset.no":true,"tysfjord.no":true,"divtasvuodna.no":true,"divttasvuotna.no":true,"tysnes.no":true,"tysvar.no":true,"xn--tysvr-vra.no":true,"tonsberg.no":true,"xn--tnsberg-q1a.no":true,"ullensaker.no":true,"ullensvang.no":true,"ulvik.no":true,"utsira.no":true,"vadso.no":true,"xn--vads-jra.no":true,"cahcesuolo.no":true,"xn--hcesuolo-7ya35b.no":true,"vaksdal.no":true,"valle.no":true,"vang.no":true,"vanylven.no":true,"vardo.no":true,"xn--vard-jra.no":true,"varggat.no":true,"xn--vrggt-xqad.no":true,"vefsn.no":true,"vaapste.no":true,"vega.no":true,"vegarshei.no":true,"xn--vegrshei-c0a.no":true,"vennesla.no":true,"verdal.no":true,"verran.no":true,"vestby.no":true,"vestnes.no":true,"vestre-slidre.no":true,"vestre-toten.no":true,"vestvagoy.no":true,"xn--vestvgy-ixa6o.no":true,"vevelstad.no":true,"vik.no":true,"vikna.no":true,"vindafjord.no":true,"volda.no":true,"voss.no":true,"varoy.no":true,"xn--vry-yla5g.no":true,"vagan.no":true,"xn--vgan-qoa.no":true,"voagat.no":true,"vagsoy.no":true,"xn--vgsy-qoa0j.no":true,"vaga.no":true,"xn--vg-yiab.no":true,"valer.ostfold.no":true,"xn--vler-qoa.xn--stfold-9xa.no":true,"valer.hedmark.no":true,"xn--vler-qoa.hedmark.no":true,"*.np":true,"nr":true,"biz.nr":true,"info.nr":true,"gov.nr":true,"edu.nr":true,"org.nr":true,"net.nr":true,"com.nr":true,"nu":true,"nz":true,"ac.nz":true,"co.nz":true,"cri.nz":true,"geek.nz":true,"gen.nz":true,"govt.nz":true,"health.nz":true,"iwi.nz":true,"kiwi.nz":true,"maori.nz":true,"mil.nz":true,"xn--mori-qsa.nz":true,"net.nz":true,"org.nz":true,"parliament.nz":true,"school.nz":true,"om":true,"co.om":true,"com.om":true,"edu.om":true,"gov.om":true,"med.om":true,"museum.om":true,"net.om":true,"org.om":true,"pro.om":true,"org":true,"pa":true,"ac.pa":true,"gob.pa":true,"com.pa":true,"org.pa":true,"sld.pa":true,"edu.pa":true,"net.pa":true,"ing.pa":true,"abo.pa":true,"med.pa":true,"nom.pa":true,"pe":true,"edu.pe":true,"gob.pe":true,"nom.pe":true,"mil.pe":true,"org.pe":true,"com.pe":true,"net.pe":true,"pf":true,"com.pf":true,"org.pf":true,"edu.pf":true,"*.pg":true,"ph":true,"com.ph":true,"net.ph":true,"org.ph":true,"gov.ph":true,"edu.ph":true,"ngo.ph":true,"mil.ph":true,"i.ph":true,"pk":true,"com.pk":true,"net.pk":true,"edu.pk":true,"org.pk":true,"fam.pk":true,"biz.pk":true,"web.pk":true,"gov.pk":true,"gob.pk":true,"gok.pk":true,"gon.pk":true,"gop.pk":true,"gos.pk":true,"info.pk":true,"pl":true,"com.pl":true,"net.pl":true,"org.pl":true,"aid.pl":true,"agro.pl":true,"atm.pl":true,"auto.pl":true,"biz.pl":true,"edu.pl":true,"gmina.pl":true,"gsm.pl":true,"info.pl":true,"mail.pl":true,"miasta.pl":true,"media.pl":true,"mil.pl":true,"nieruchomosci.pl":true,"nom.pl":true,"pc.pl":true,"powiat.pl":true,"priv.pl":true,"realestate.pl":true,"rel.pl":true,"sex.pl":true,"shop.pl":true,"sklep.pl":true,"sos.pl":true,"szkola.pl":true,"targi.pl":true,"tm.pl":true,"tourism.pl":true,"travel.pl":true,"turystyka.pl":true,"gov.pl":true,"ap.gov.pl":true,"ic.gov.pl":true,"is.gov.pl":true,"us.gov.pl":true,"kmpsp.gov.pl":true,"kppsp.gov.pl":true,"kwpsp.gov.pl":true,"psp.gov.pl":true,"wskr.gov.pl":true,"kwp.gov.pl":true,"mw.gov.pl":true,"ug.gov.pl":true,"um.gov.pl":true,"umig.gov.pl":true,"ugim.gov.pl":true,"upow.gov.pl":true,"uw.gov.pl":true,"starostwo.gov.pl":true,"pa.gov.pl":true,"po.gov.pl":true,"psse.gov.pl":true,"pup.gov.pl":true,"rzgw.gov.pl":true,"sa.gov.pl":true,"so.gov.pl":true,"sr.gov.pl":true,"wsa.gov.pl":true,"sko.gov.pl":true,"uzs.gov.pl":true,"wiih.gov.pl":true,"winb.gov.pl":true,"pinb.gov.pl":true,"wios.gov.pl":true,"witd.gov.pl":true,"wzmiuw.gov.pl":true,"piw.gov.pl":true,"wiw.gov.pl":true,"griw.gov.pl":true,"wif.gov.pl":true,"oum.gov.pl":true,"sdn.gov.pl":true,"zp.gov.pl":true,"uppo.gov.pl":true,"mup.gov.pl":true,"wuoz.gov.pl":true,"konsulat.gov.pl":true,"oirm.gov.pl":true,"augustow.pl":true,"babia-gora.pl":true,"bedzin.pl":true,"beskidy.pl":true,"bialowieza.pl":true,"bialystok.pl":true,"bielawa.pl":true,"bieszczady.pl":true,"boleslawiec.pl":true,"bydgoszcz.pl":true,"bytom.pl":true,"cieszyn.pl":true,"czeladz.pl":true,"czest.pl":true,"dlugoleka.pl":true,"elblag.pl":true,"elk.pl":true,"glogow.pl":true,"gniezno.pl":true,"gorlice.pl":true,"grajewo.pl":true,"ilawa.pl":true,"jaworzno.pl":true,"jelenia-gora.pl":true,"jgora.pl":true,"kalisz.pl":true,"kazimierz-dolny.pl":true,"karpacz.pl":true,"kartuzy.pl":true,"kaszuby.pl":true,"katowice.pl":true,"kepno.pl":true,"ketrzyn.pl":true,"klodzko.pl":true,"kobierzyce.pl":true,"kolobrzeg.pl":true,"konin.pl":true,"konskowola.pl":true,"kutno.pl":true,"lapy.pl":true,"lebork.pl":true,"legnica.pl":true,"lezajsk.pl":true,"limanowa.pl":true,"lomza.pl":true,"lowicz.pl":true,"lubin.pl":true,"lukow.pl":true,"malbork.pl":true,"malopolska.pl":true,"mazowsze.pl":true,"mazury.pl":true,"mielec.pl":true,"mielno.pl":true,"mragowo.pl":true,"naklo.pl":true,"nowaruda.pl":true,"nysa.pl":true,"olawa.pl":true,"olecko.pl":true,"olkusz.pl":true,"olsztyn.pl":true,"opoczno.pl":true,"opole.pl":true,"ostroda.pl":true,"ostroleka.pl":true,"ostrowiec.pl":true,"ostrowwlkp.pl":true,"pila.pl":true,"pisz.pl":true,"podhale.pl":true,"podlasie.pl":true,"polkowice.pl":true,"pomorze.pl":true,"pomorskie.pl":true,"prochowice.pl":true,"pruszkow.pl":true,"przeworsk.pl":true,"pulawy.pl":true,"radom.pl":true,"rawa-maz.pl":true,"rybnik.pl":true,"rzeszow.pl":true,"sanok.pl":true,"sejny.pl":true,"slask.pl":true,"slupsk.pl":true,"sosnowiec.pl":true,"stalowa-wola.pl":true,"skoczow.pl":true,"starachowice.pl":true,"stargard.pl":true,"suwalki.pl":true,"swidnica.pl":true,"swiebodzin.pl":true,"swinoujscie.pl":true,"szczecin.pl":true,"szczytno.pl":true,"tarnobrzeg.pl":true,"tgory.pl":true,"turek.pl":true,"tychy.pl":true,"ustka.pl":true,"walbrzych.pl":true,"warmia.pl":true,"warszawa.pl":true,"waw.pl":true,"wegrow.pl":true,"wielun.pl":true,"wlocl.pl":true,"wloclawek.pl":true,"wodzislaw.pl":true,"wolomin.pl":true,"wroclaw.pl":true,"zachpomor.pl":true,"zagan.pl":true,"zarow.pl":true,"zgora.pl":true,"zgorzelec.pl":true,"pm":true,"pn":true,"gov.pn":true,"co.pn":true,"org.pn":true,"edu.pn":true,"net.pn":true,"post":true,"pr":true,"com.pr":true,"net.pr":true,"org.pr":true,"gov.pr":true,"edu.pr":true,"isla.pr":true,"pro.pr":true,"biz.pr":true,"info.pr":true,"name.pr":true,"est.pr":true,"prof.pr":true,"ac.pr":true,"pro":true,"aca.pro":true,"bar.pro":true,"cpa.pro":true,"jur.pro":true,"law.pro":true,"med.pro":true,"eng.pro":true,"ps":true,"edu.ps":true,"gov.ps":true,"sec.ps":true,"plo.ps":true,"com.ps":true,"org.ps":true,"net.ps":true,"pt":true,"net.pt":true,"gov.pt":true,"org.pt":true,"edu.pt":true,"int.pt":true,"publ.pt":true,"com.pt":true,"nome.pt":true,"pw":true,"co.pw":true,"ne.pw":true,"or.pw":true,"ed.pw":true,"go.pw":true,"belau.pw":true,"py":true,"com.py":true,"coop.py":true,"edu.py":true,"gov.py":true,"mil.py":true,"net.py":true,"org.py":true,"qa":true,"com.qa":true,"edu.qa":true,"gov.qa":true,"mil.qa":true,"name.qa":true,"net.qa":true,"org.qa":true,"sch.qa":true,"re":true,"com.re":true,"asso.re":true,"nom.re":true,"ro":true,"com.ro":true,"org.ro":true,"tm.ro":true,"nt.ro":true,"nom.ro":true,"info.ro":true,"rec.ro":true,"arts.ro":true,"firm.ro":true,"store.ro":true,"www.ro":true,"rs":true,"co.rs":true,"org.rs":true,"edu.rs":true,"ac.rs":true,"gov.rs":true,"in.rs":true,"ru":true,"ac.ru":true,"com.ru":true,"edu.ru":true,"int.ru":true,"net.ru":true,"org.ru":true,"pp.ru":true,"adygeya.ru":true,"altai.ru":true,"amur.ru":true,"arkhangelsk.ru":true,"astrakhan.ru":true,"bashkiria.ru":true,"belgorod.ru":true,"bir.ru":true,"bryansk.ru":true,"buryatia.ru":true,"cbg.ru":true,"chel.ru":true,"chelyabinsk.ru":true,"chita.ru":true,"chukotka.ru":true,"chuvashia.ru":true,"dagestan.ru":true,"dudinka.ru":true,"e-burg.ru":true,"grozny.ru":true,"irkutsk.ru":true,"ivanovo.ru":true,"izhevsk.ru":true,"jar.ru":true,"joshkar-ola.ru":true,"kalmykia.ru":true,"kaluga.ru":true,"kamchatka.ru":true,"karelia.ru":true,"kazan.ru":true,"kchr.ru":true,"kemerovo.ru":true,"khabarovsk.ru":true,"khakassia.ru":true,"khv.ru":true,"kirov.ru":true,"koenig.ru":true,"komi.ru":true,"kostroma.ru":true,"krasnoyarsk.ru":true,"kuban.ru":true,"kurgan.ru":true,"kursk.ru":true,"lipetsk.ru":true,"magadan.ru":true,"mari.ru":true,"mari-el.ru":true,"marine.ru":true,"mordovia.ru":true,"msk.ru":true,"murmansk.ru":true,"nalchik.ru":true,"nnov.ru":true,"nov.ru":true,"novosibirsk.ru":true,"nsk.ru":true,"omsk.ru":true,"orenburg.ru":true,"oryol.ru":true,"palana.ru":true,"penza.ru":true,"perm.ru":true,"ptz.ru":true,"rnd.ru":true,"ryazan.ru":true,"sakhalin.ru":true,"samara.ru":true,"saratov.ru":true,"simbirsk.ru":true,"smolensk.ru":true,"spb.ru":true,"stavropol.ru":true,"stv.ru":true,"surgut.ru":true,"tambov.ru":true,"tatarstan.ru":true,"tom.ru":true,"tomsk.ru":true,"tsaritsyn.ru":true,"tsk.ru":true,"tula.ru":true,"tuva.ru":true,"tver.ru":true,"tyumen.ru":true,"udm.ru":true,"udmurtia.ru":true,"ulan-ude.ru":true,"vladikavkaz.ru":true,"vladimir.ru":true,"vladivostok.ru":true,"volgograd.ru":true,"vologda.ru":true,"voronezh.ru":true,"vrn.ru":true,"vyatka.ru":true,"yakutia.ru":true,"yamal.ru":true,"yaroslavl.ru":true,"yekaterinburg.ru":true,"yuzhno-sakhalinsk.ru":true,"amursk.ru":true,"baikal.ru":true,"cmw.ru":true,"fareast.ru":true,"jamal.ru":true,"kms.ru":true,"k-uralsk.ru":true,"kustanai.ru":true,"kuzbass.ru":true,"magnitka.ru":true,"mytis.ru":true,"nakhodka.ru":true,"nkz.ru":true,"norilsk.ru":true,"oskol.ru":true,"pyatigorsk.ru":true,"rubtsovsk.ru":true,"snz.ru":true,"syzran.ru":true,"vdonsk.ru":true,"zgrad.ru":true,"gov.ru":true,"mil.ru":true,"test.ru":true,"rw":true,"gov.rw":true,"net.rw":true,"edu.rw":true,"ac.rw":true,"com.rw":true,"co.rw":true,"int.rw":true,"mil.rw":true,"gouv.rw":true,"sa":true,"com.sa":true,"net.sa":true,"org.sa":true,"gov.sa":true,"med.sa":true,"pub.sa":true,"edu.sa":true,"sch.sa":true,"sb":true,"com.sb":true,"edu.sb":true,"gov.sb":true,"net.sb":true,"org.sb":true,"sc":true,"com.sc":true,"gov.sc":true,"net.sc":true,"org.sc":true,"edu.sc":true,"sd":true,"com.sd":true,"net.sd":true,"org.sd":true,"edu.sd":true,"med.sd":true,"tv.sd":true,"gov.sd":true,"info.sd":true,"se":true,"a.se":true,"ac.se":true,"b.se":true,"bd.se":true,"brand.se":true,"c.se":true,"d.se":true,"e.se":true,"f.se":true,"fh.se":true,"fhsk.se":true,"fhv.se":true,"g.se":true,"h.se":true,"i.se":true,"k.se":true,"komforb.se":true,"kommunalforbund.se":true,"komvux.se":true,"l.se":true,"lanbib.se":true,"m.se":true,"n.se":true,"naturbruksgymn.se":true,"o.se":true,"org.se":true,"p.se":true,"parti.se":true,"pp.se":true,"press.se":true,"r.se":true,"s.se":true,"t.se":true,"tm.se":true,"u.se":true,"w.se":true,"x.se":true,"y.se":true,"z.se":true,"sg":true,"com.sg":true,"net.sg":true,"org.sg":true,"gov.sg":true,"edu.sg":true,"per.sg":true,"sh":true,"com.sh":true,"net.sh":true,"gov.sh":true,"org.sh":true,"mil.sh":true,"si":true,"sj":true,"sk":true,"sl":true,"com.sl":true,"net.sl":true,"edu.sl":true,"gov.sl":true,"org.sl":true,"sm":true,"sn":true,"art.sn":true,"com.sn":true,"edu.sn":true,"gouv.sn":true,"org.sn":true,"perso.sn":true,"univ.sn":true,"so":true,"com.so":true,"net.so":true,"org.so":true,"sr":true,"st":true,"co.st":true,"com.st":true,"consulado.st":true,"edu.st":true,"embaixada.st":true,"gov.st":true,"mil.st":true,"net.st":true,"org.st":true,"principe.st":true,"saotome.st":true,"store.st":true,"su":true,"adygeya.su":true,"arkhangelsk.su":true,"balashov.su":true,"bashkiria.su":true,"bryansk.su":true,"dagestan.su":true,"grozny.su":true,"ivanovo.su":true,"kalmykia.su":true,"kaluga.su":true,"karelia.su":true,"khakassia.su":true,"krasnodar.su":true,"kurgan.su":true,"lenug.su":true,"mordovia.su":true,"msk.su":true,"murmansk.su":true,"nalchik.su":true,"nov.su":true,"obninsk.su":true,"penza.su":true,"pokrovsk.su":true,"sochi.su":true,"spb.su":true,"togliatti.su":true,"troitsk.su":true,"tula.su":true,"tuva.su":true,"vladikavkaz.su":true,"vladimir.su":true,"vologda.su":true,"sv":true,"com.sv":true,"edu.sv":true,"gob.sv":true,"org.sv":true,"red.sv":true,"sx":true,"gov.sx":true,"sy":true,"edu.sy":true,"gov.sy":true,"net.sy":true,"mil.sy":true,"com.sy":true,"org.sy":true,"sz":true,"co.sz":true,"ac.sz":true,"org.sz":true,"tc":true,"td":true,"tel":true,"tf":true,"tg":true,"th":true,"ac.th":true,"co.th":true,"go.th":true,"in.th":true,"mi.th":true,"net.th":true,"or.th":true,"tj":true,"ac.tj":true,"biz.tj":true,"co.tj":true,"com.tj":true,"edu.tj":true,"go.tj":true,"gov.tj":true,"int.tj":true,"mil.tj":true,"name.tj":true,"net.tj":true,"nic.tj":true,"org.tj":true,"test.tj":true,"web.tj":true,"tk":true,"tl":true,"gov.tl":true,"tm":true,"com.tm":true,"co.tm":true,"org.tm":true,"net.tm":true,"nom.tm":true,"gov.tm":true,"mil.tm":true,"edu.tm":true,"tn":true,"com.tn":true,"ens.tn":true,"fin.tn":true,"gov.tn":true,"ind.tn":true,"intl.tn":true,"nat.tn":true,"net.tn":true,"org.tn":true,"info.tn":true,"perso.tn":true,"tourism.tn":true,"edunet.tn":true,"rnrt.tn":true,"rns.tn":true,"rnu.tn":true,"mincom.tn":true,"agrinet.tn":true,"defense.tn":true,"turen.tn":true,"to":true,"com.to":true,"gov.to":true,"net.to":true,"org.to":true,"edu.to":true,"mil.to":true,"tp":true,"tr":true,"com.tr":true,"info.tr":true,"biz.tr":true,"net.tr":true,"org.tr":true,"web.tr":true,"gen.tr":true,"tv.tr":true,"av.tr":true,"dr.tr":true,"bbs.tr":true,"name.tr":true,"tel.tr":true,"gov.tr":true,"bel.tr":true,"pol.tr":true,"mil.tr":true,"k12.tr":true,"edu.tr":true,"kep.tr":true,"nc.tr":true,"gov.nc.tr":true,"travel":true,"tt":true,"co.tt":true,"com.tt":true,"org.tt":true,"net.tt":true,"biz.tt":true,"info.tt":true,"pro.tt":true,"int.tt":true,"coop.tt":true,"jobs.tt":true,"mobi.tt":true,"travel.tt":true,"museum.tt":true,"aero.tt":true,"name.tt":true,"gov.tt":true,"edu.tt":true,"tv":true,"tw":true,"edu.tw":true,"gov.tw":true,"mil.tw":true,"com.tw":true,"net.tw":true,"org.tw":true,"idv.tw":true,"game.tw":true,"ebiz.tw":true,"club.tw":true,"xn--zf0ao64a.tw":true,"xn--uc0atv.tw":true,"xn--czrw28b.tw":true,"tz":true,"ac.tz":true,"co.tz":true,"go.tz":true,"hotel.tz":true,"info.tz":true,"me.tz":true,"mil.tz":true,"mobi.tz":true,"ne.tz":true,"or.tz":true,"sc.tz":true,"tv.tz":true,"ua":true,"com.ua":true,"edu.ua":true,"gov.ua":true,"in.ua":true,"net.ua":true,"org.ua":true,"cherkassy.ua":true,"cherkasy.ua":true,"chernigov.ua":true,"chernihiv.ua":true,"chernivtsi.ua":true,"chernovtsy.ua":true,"ck.ua":true,"cn.ua":true,"cr.ua":true,"crimea.ua":true,"cv.ua":true,"dn.ua":true,"dnepropetrovsk.ua":true,"dnipropetrovsk.ua":true,"dominic.ua":true,"donetsk.ua":true,"dp.ua":true,"if.ua":true,"ivano-frankivsk.ua":true,"kh.ua":true,"kharkiv.ua":true,"kharkov.ua":true,"kherson.ua":true,"khmelnitskiy.ua":true,"khmelnytskyi.ua":true,"kiev.ua":true,"kirovograd.ua":true,"km.ua":true,"kr.ua":true,"krym.ua":true,"ks.ua":true,"kv.ua":true,"kyiv.ua":true,"lg.ua":true,"lt.ua":true,"lugansk.ua":true,"lutsk.ua":true,"lv.ua":true,"lviv.ua":true,"mk.ua":true,"mykolaiv.ua":true,"nikolaev.ua":true,"od.ua":true,"odesa.ua":true,"odessa.ua":true,"pl.ua":true,"poltava.ua":true,"rivne.ua":true,"rovno.ua":true,"rv.ua":true,"sb.ua":true,"sebastopol.ua":true,"sevastopol.ua":true,"sm.ua":true,"sumy.ua":true,"te.ua":true,"ternopil.ua":true,"uz.ua":true,"uzhgorod.ua":true,"vinnica.ua":true,"vinnytsia.ua":true,"vn.ua":true,"volyn.ua":true,"yalta.ua":true,"zaporizhzhe.ua":true,"zaporizhzhia.ua":true,"zhitomir.ua":true,"zhytomyr.ua":true,"zp.ua":true,"zt.ua":true,"ug":true,"co.ug":true,"or.ug":true,"ac.ug":true,"sc.ug":true,"go.ug":true,"ne.ug":true,"com.ug":true,"org.ug":true,"uk":true,"ac.uk":true,"co.uk":true,"gov.uk":true,"ltd.uk":true,"me.uk":true,"net.uk":true,"nhs.uk":true,"org.uk":true,"plc.uk":true,"police.uk":true,"*.sch.uk":true,"us":true,"dni.us":true,"fed.us":true,"isa.us":true,"kids.us":true,"nsn.us":true,"ak.us":true,"al.us":true,"ar.us":true,"as.us":true,"az.us":true,"ca.us":true,"co.us":true,"ct.us":true,"dc.us":true,"de.us":true,"fl.us":true,"ga.us":true,"gu.us":true,"hi.us":true,"ia.us":true,"id.us":true,"il.us":true,"in.us":true,"ks.us":true,"ky.us":true,"la.us":true,"ma.us":true,"md.us":true,"me.us":true,"mi.us":true,"mn.us":true,"mo.us":true,"ms.us":true,"mt.us":true,"nc.us":true,"nd.us":true,"ne.us":true,"nh.us":true,"nj.us":true,"nm.us":true,"nv.us":true,"ny.us":true,"oh.us":true,"ok.us":true,"or.us":true,"pa.us":true,"pr.us":true,"ri.us":true,"sc.us":true,"sd.us":true,"tn.us":true,"tx.us":true,"ut.us":true,"vi.us":true,"vt.us":true,"va.us":true,"wa.us":true,"wi.us":true,"wv.us":true,"wy.us":true,"k12.ak.us":true,"k12.al.us":true,"k12.ar.us":true,"k12.as.us":true,"k12.az.us":true,"k12.ca.us":true,"k12.co.us":true,"k12.ct.us":true,"k12.dc.us":true,"k12.de.us":true,"k12.fl.us":true,"k12.ga.us":true,"k12.gu.us":true,"k12.ia.us":true,"k12.id.us":true,"k12.il.us":true,"k12.in.us":true,"k12.ks.us":true,"k12.ky.us":true,"k12.la.us":true,"k12.ma.us":true,"k12.md.us":true,"k12.me.us":true,"k12.mi.us":true,"k12.mn.us":true,"k12.mo.us":true,"k12.ms.us":true,"k12.mt.us":true,"k12.nc.us":true,"k12.ne.us":true,"k12.nh.us":true,"k12.nj.us":true,"k12.nm.us":true,"k12.nv.us":true,"k12.ny.us":true,"k12.oh.us":true,"k12.ok.us":true,"k12.or.us":true,"k12.pa.us":true,"k12.pr.us":true,"k12.ri.us":true,"k12.sc.us":true,"k12.tn.us":true,"k12.tx.us":true,"k12.ut.us":true,"k12.vi.us":true,"k12.vt.us":true,"k12.va.us":true,"k12.wa.us":true,"k12.wi.us":true,"k12.wy.us":true,"cc.ak.us":true,"cc.al.us":true,"cc.ar.us":true,"cc.as.us":true,"cc.az.us":true,"cc.ca.us":true,"cc.co.us":true,"cc.ct.us":true,"cc.dc.us":true,"cc.de.us":true,"cc.fl.us":true,"cc.ga.us":true,"cc.gu.us":true,"cc.hi.us":true,"cc.ia.us":true,"cc.id.us":true,"cc.il.us":true,"cc.in.us":true,"cc.ks.us":true,"cc.ky.us":true,"cc.la.us":true,"cc.ma.us":true,"cc.md.us":true,"cc.me.us":true,"cc.mi.us":true,"cc.mn.us":true,"cc.mo.us":true,"cc.ms.us":true,"cc.mt.us":true,"cc.nc.us":true,"cc.nd.us":true,"cc.ne.us":true,"cc.nh.us":true,"cc.nj.us":true,"cc.nm.us":true,"cc.nv.us":true,"cc.ny.us":true,"cc.oh.us":true,"cc.ok.us":true,"cc.or.us":true,"cc.pa.us":true,"cc.pr.us":true,"cc.ri.us":true,"cc.sc.us":true,"cc.sd.us":true,"cc.tn.us":true,"cc.tx.us":true,"cc.ut.us":true,"cc.vi.us":true,"cc.vt.us":true,"cc.va.us":true,"cc.wa.us":true,"cc.wi.us":true,"cc.wv.us":true,"cc.wy.us":true,"lib.ak.us":true,"lib.al.us":true,"lib.ar.us":true,"lib.as.us":true,"lib.az.us":true,"lib.ca.us":true,"lib.co.us":true,"lib.ct.us":true,"lib.dc.us":true,"lib.de.us":true,"lib.fl.us":true,"lib.ga.us":true,"lib.gu.us":true,"lib.hi.us":true,"lib.ia.us":true,"lib.id.us":true,"lib.il.us":true,"lib.in.us":true,"lib.ks.us":true,"lib.ky.us":true,"lib.la.us":true,"lib.ma.us":true,"lib.md.us":true,"lib.me.us":true,"lib.mi.us":true,"lib.mn.us":true,"lib.mo.us":true,"lib.ms.us":true,"lib.mt.us":true,"lib.nc.us":true,"lib.nd.us":true,"lib.ne.us":true,"lib.nh.us":true,"lib.nj.us":true,"lib.nm.us":true,"lib.nv.us":true,"lib.ny.us":true,"lib.oh.us":true,"lib.ok.us":true,"lib.or.us":true,"lib.pa.us":true,"lib.pr.us":true,"lib.ri.us":true,"lib.sc.us":true,"lib.sd.us":true,"lib.tn.us":true,"lib.tx.us":true,"lib.ut.us":true,"lib.vi.us":true,"lib.vt.us":true,"lib.va.us":true,"lib.wa.us":true,"lib.wi.us":true,"lib.wy.us":true,"pvt.k12.ma.us":true,"chtr.k12.ma.us":true,"paroch.k12.ma.us":true,"uy":true,"com.uy":true,"edu.uy":true,"gub.uy":true,"mil.uy":true,"net.uy":true,"org.uy":true,"uz":true,"co.uz":true,"com.uz":true,"net.uz":true,"org.uz":true,"va":true,"vc":true,"com.vc":true,"net.vc":true,"org.vc":true,"gov.vc":true,"mil.vc":true,"edu.vc":true,"ve":true,"arts.ve":true,"co.ve":true,"com.ve":true,"e12.ve":true,"edu.ve":true,"firm.ve":true,"gob.ve":true,"gov.ve":true,"info.ve":true,"int.ve":true,"mil.ve":true,"net.ve":true,"org.ve":true,"rec.ve":true,"store.ve":true,"tec.ve":true,"web.ve":true,"vg":true,"vi":true,"co.vi":true,"com.vi":true,"k12.vi":true,"net.vi":true,"org.vi":true,"vn":true,"com.vn":true,"net.vn":true,"org.vn":true,"edu.vn":true,"gov.vn":true,"int.vn":true,"ac.vn":true,"biz.vn":true,"info.vn":true,"name.vn":true,"pro.vn":true,"health.vn":true,"vu":true,"com.vu":true,"edu.vu":true,"net.vu":true,"org.vu":true,"wf":true,"ws":true,"com.ws":true,"net.ws":true,"org.ws":true,"gov.ws":true,"edu.ws":true,"yt":true,"xn--mgbaam7a8h":true,"xn--y9a3aq":true,"xn--54b7fta0cc":true,"xn--90ais":true,"xn--fiqs8s":true,"xn--fiqz9s":true,"xn--lgbbat1ad8j":true,"xn--wgbh1c":true,"xn--node":true,"xn--qxam":true,"xn--j6w193g":true,"xn--h2brj9c":true,"xn--mgbbh1a71e":true,"xn--fpcrj9c3d":true,"xn--gecrj9c":true,"xn--s9brj9c":true,"xn--45brj9c":true,"xn--xkc2dl3a5ee0h":true,"xn--mgba3a4f16a":true,"xn--mgba3a4fra":true,"xn--mgbtx2b":true,"xn--mgbayh7gpa":true,"xn--3e0b707e":true,"xn--80ao21a":true,"xn--fzc2c9e2c":true,"xn--xkc2al3hye2a":true,"xn--mgbc0a9azcg":true,"xn--d1alf":true,"xn--l1acc":true,"xn--mix891f":true,"xn--mix082f":true,"xn--mgbx4cd0ab":true,"xn--mgb9awbf":true,"xn--mgbai9azgqp6j":true,"xn--mgbai9a5eva00b":true,"xn--ygbi2ammx":true,"xn--90a3ac":true,"xn--o1ac.xn--90a3ac":true,"xn--c1avg.xn--90a3ac":true,"xn--90azh.xn--90a3ac":true,"xn--d1at.xn--90a3ac":true,"xn--o1ach.xn--90a3ac":true,"xn--80au.xn--90a3ac":true,"xn--p1ai":true,"xn--wgbl6a":true,"xn--mgberp4a5d4ar":true,"xn--mgberp4a5d4a87g":true,"xn--mgbqly7c0a67fbc":true,"xn--mgbqly7cvafr":true,"xn--mgbpl2fh":true,"xn--yfro4i67o":true,"xn--clchc0ea0b2g2a9gcd":true,"xn--ogbpf8fl":true,"xn--mgbtf8fl":true,"xn--o3cw4h":true,"xn--pgbs0dh":true,"xn--kpry57d":true,"xn--kprw13d":true,"xn--nnx388a":true,"xn--j1amh":true,"xn--mgb2ddes":true,"xxx":true,"*.ye":true,"ac.za":true,"agrica.za":true,"alt.za":true,"co.za":true,"edu.za":true,"gov.za":true,"grondar.za":true,"law.za":true,"mil.za":true,"net.za":true,"ngo.za":true,"nis.za":true,"nom.za":true,"org.za":true,"school.za":true,"tm.za":true,"web.za":true,"*.zm":true,"*.zw":true,"aaa":true,"aarp":true,"abarth":true,"abb":true,"abbott":true,"abbvie":true,"abc":true,"able":true,"abogado":true,"abudhabi":true,"academy":true,"accenture":true,"accountant":true,"accountants":true,"aco":true,"active":true,"actor":true,"adac":true,"ads":true,"adult":true,"aeg":true,"aetna":true,"afamilycompany":true,"afl":true,"africa":true,"africamagic":true,"agakhan":true,"agency":true,"aig":true,"aigo":true,"airbus":true,"airforce":true,"airtel":true,"akdn":true,"alfaromeo":true,"alibaba":true,"alipay":true,"allfinanz":true,"allstate":true,"ally":true,"alsace":true,"alstom":true,"americanexpress":true,"americanfamily":true,"amex":true,"amfam":true,"amica":true,"amsterdam":true,"analytics":true,"android":true,"anquan":true,"anz":true,"aol":true,"apartments":true,"app":true,"apple":true,"aquarelle":true,"aramco":true,"archi":true,"army":true,"arte":true,"asda":true,"associates":true,"athleta":true,"attorney":true,"auction":true,"audi":true,"audible":true,"audio":true,"auspost":true,"author":true,"auto":true,"autos":true,"avianca":true,"aws":true,"axa":true,"azure":true,"baby":true,"baidu":true,"banamex":true,"bananarepublic":true,"band":true,"bank":true,"bar":true,"barcelona":true,"barclaycard":true,"barclays":true,"barefoot":true,"bargains":true,"basketball":true,"bauhaus":true,"bayern":true,"bbc":true,"bbt":true,"bbva":true,"bcg":true,"bcn":true,"beats":true,"beer":true,"bentley":true,"berlin":true,"best":true,"bestbuy":true,"bet":true,"bharti":true,"bible":true,"bid":true,"bike":true,"bing":true,"bingo":true,"bio":true,"black":true,"blackfriday":true,"blanco":true,"blockbuster":true,"blog":true,"bloomberg":true,"blue":true,"bms":true,"bmw":true,"bnl":true,"bnpparibas":true,"boats":true,"boehringer":true,"bofa":true,"bom":true,"bond":true,"boo":true,"book":true,"booking":true,"boots":true,"bosch":true,"bostik":true,"bot":true,"boutique":true,"bradesco":true,"bridgestone":true,"broadway":true,"broker":true,"brother":true,"brussels":true,"budapest":true,"bugatti":true,"build":true,"builders":true,"business":true,"buy":true,"buzz":true,"bzh":true,"cab":true,"cafe":true,"cal":true,"call":true,"calvinklein":true,"camera":true,"camp":true,"cancerresearch":true,"canon":true,"capetown":true,"capital":true,"capitalone":true,"car":true,"caravan":true,"cards":true,"care":true,"career":true,"careers":true,"cars":true,"cartier":true,"casa":true,"case":true,"caseih":true,"cash":true,"casino":true,"catering":true,"cba":true,"cbn":true,"cbre":true,"cbs":true,"ceb":true,"center":true,"ceo":true,"cern":true,"cfa":true,"cfd":true,"chanel":true,"channel":true,"chase":true,"chat":true,"cheap":true,"chintai":true,"chloe":true,"christmas":true,"chrome":true,"chrysler":true,"church":true,"cipriani":true,"circle":true,"cisco":true,"citadel":true,"citi":true,"citic":true,"city":true,"cityeats":true,"claims":true,"cleaning":true,"click":true,"clinic":true,"clothing":true,"cloud":true,"club":true,"clubmed":true,"coach":true,"codes":true,"coffee":true,"college":true,"cologne":true,"comcast":true,"commbank":true,"community":true,"company":true,"computer":true,"comsec":true,"condos":true,"construction":true,"consulting":true,"contact":true,"contractors":true,"cooking":true,"cookingchannel":true,"cool":true,"corsica":true,"country":true,"coupon":true,"coupons":true,"courses":true,"credit":true,"creditcard":true,"creditunion":true,"cricket":true,"crown":true,"crs":true,"cruises":true,"csc":true,"cuisinella":true,"cymru":true,"cyou":true,"dabur":true,"dad":true,"dance":true,"date":true,"dating":true,"datsun":true,"day":true,"dclk":true,"dds":true,"deal":true,"dealer":true,"deals":true,"degree":true,"delivery":true,"dell":true,"deloitte":true,"delta":true,"democrat":true,"dental":true,"dentist":true,"desi":true,"design":true,"dev":true,"dhl":true,"diamonds":true,"diet":true,"digital":true,"direct":true,"directory":true,"discount":true,"discover":true,"dish":true,"dnp":true,"docs":true,"dodge":true,"dog":true,"doha":true,"domains":true,"doosan":true,"dot":true,"download":true,"drive":true,"dstv":true,"dtv":true,"dubai":true,"duck":true,"dunlop":true,"duns":true,"dupont":true,"durban":true,"dvag":true,"dwg":true,"earth":true,"eat":true,"edeka":true,"education":true,"email":true,"emerck":true,"emerson":true,"energy":true,"engineer":true,"engineering":true,"enterprises":true,"epost":true,"epson":true,"equipment":true,"ericsson":true,"erni":true,"esq":true,"estate":true,"esurance":true,"etisalat":true,"eurovision":true,"eus":true,"events":true,"everbank":true,"exchange":true,"expert":true,"exposed":true,"express":true,"extraspace":true,"fage":true,"fail":true,"fairwinds":true,"faith":true,"family":true,"fan":true,"fans":true,"farm":true,"farmers":true,"fashion":true,"fast":true,"fedex":true,"feedback":true,"ferrari":true,"ferrero":true,"fiat":true,"fidelity":true,"fido":true,"film":true,"final":true,"finance":true,"financial":true,"fire":true,"firestone":true,"firmdale":true,"fish":true,"fishing":true,"fit":true,"fitness":true,"flickr":true,"flights":true,"flir":true,"florist":true,"flowers":true,"flsmidth":true,"fly":true,"foo":true,"foodnetwork":true,"football":true,"ford":true,"forex":true,"forsale":true,"forum":true,"foundation":true,"fox":true,"fresenius":true,"frl":true,"frogans":true,"frontdoor":true,"frontier":true,"ftr":true,"fujitsu":true,"fujixerox":true,"fund":true,"furniture":true,"futbol":true,"fyi":true,"gal":true,"gallery":true,"gallo":true,"gallup":true,"game":true,"games":true,"gap":true,"garden":true,"gbiz":true,"gdn":true,"gea":true,"gent":true,"genting":true,"george":true,"ggee":true,"gift":true,"gifts":true,"gives":true,"giving":true,"glade":true,"glass":true,"gle":true,"global":true,"globo":true,"gmail":true,"gmo":true,"gmx":true,"godaddy":true,"gold":true,"goldpoint":true,"golf":true,"goo":true,"goodhands":true,"goodyear":true,"goog":true,"google":true,"gop":true,"got":true,"gotv":true,"grainger":true,"graphics":true,"gratis":true,"green":true,"gripe":true,"group":true,"guardian":true,"gucci":true,"guge":true,"guide":true,"guitars":true,"guru":true,"hamburg":true,"hangout":true,"haus":true,"hbo":true,"hdfc":true,"hdfcbank":true,"health":true,"healthcare":true,"help":true,"helsinki":true,"here":true,"hermes":true,"hgtv":true,"hiphop":true,"hisamitsu":true,"hitachi":true,"hiv":true,"hkt":true,"hockey":true,"holdings":true,"holiday":true,"homedepot":true,"homegoods":true,"homes":true,"homesense":true,"honda":true,"honeywell":true,"horse":true,"host":true,"hosting":true,"hot":true,"hoteles":true,"hotmail":true,"house":true,"how":true,"hsbc":true,"htc":true,"hughes":true,"hyatt":true,"hyundai":true,"ibm":true,"icbc":true,"ice":true,"icu":true,"ieee":true,"ifm":true,"iinet":true,"ikano":true,"imamat":true,"imdb":true,"immo":true,"immobilien":true,"industries":true,"infiniti":true,"ing":true,"ink":true,"institute":true,"insurance":true,"insure":true,"intel":true,"international":true,"intuit":true,"investments":true,"ipiranga":true,"irish":true,"iselect":true,"ismaili":true,"ist":true,"istanbul":true,"itau":true,"itv":true,"iveco":true,"iwc":true,"jaguar":true,"java":true,"jcb":true,"jcp":true,"jeep":true,"jetzt":true,"jewelry":true,"jio":true,"jlc":true,"jll":true,"jmp":true,"jnj":true,"joburg":true,"jot":true,"joy":true,"jpmorgan":true,"jprs":true,"juegos":true,"juniper":true,"kaufen":true,"kddi":true,"kerryhotels":true,"kerrylogistics":true,"kerryproperties":true,"kfh":true,"kia":true,"kim":true,"kinder":true,"kindle":true,"kitchen":true,"kiwi":true,"koeln":true,"komatsu":true,"kosher":true,"kpmg":true,"kpn":true,"krd":true,"kred":true,"kuokgroup":true,"kyknet":true,"kyoto":true,"lacaixa":true,"ladbrokes":true,"lamborghini":true,"lancaster":true,"lancia":true,"lancome":true,"land":true,"landrover":true,"lanxess":true,"lasalle":true,"lat":true,"latino":true,"latrobe":true,"law":true,"lawyer":true,"lds":true,"lease":true,"leclerc":true,"lefrak":true,"legal":true,"lego":true,"lexus":true,"lgbt":true,"liaison":true,"lidl":true,"life":true,"lifeinsurance":true,"lifestyle":true,"lighting":true,"like":true,"lilly":true,"limited":true,"limo":true,"lincoln":true,"linde":true,"link":true,"lipsy":true,"live":true,"living":true,"lixil":true,"loan":true,"loans":true,"locker":true,"locus":true,"loft":true,"lol":true,"london":true,"lotte":true,"lotto":true,"love":true,"lpl":true,"lplfinancial":true,"ltd":true,"ltda":true,"lundbeck":true,"lupin":true,"luxe":true,"luxury":true,"macys":true,"madrid":true,"maif":true,"maison":true,"makeup":true,"man":true,"management":true,"mango":true,"market":true,"marketing":true,"markets":true,"marriott":true,"marshalls":true,"maserati":true,"mattel":true,"mba":true,"mcd":true,"mcdonalds":true,"mckinsey":true,"med":true,"media":true,"meet":true,"melbourne":true,"meme":true,"memorial":true,"men":true,"menu":true,"meo":true,"metlife":true,"miami":true,"microsoft":true,"mini":true,"mint":true,"mit":true,"mitsubishi":true,"mlb":true,"mls":true,"mma":true,"mnet":true,"mobily":true,"moda":true,"moe":true,"moi":true,"mom":true,"monash":true,"money":true,"monster":true,"montblanc":true,"mopar":true,"mormon":true,"mortgage":true,"moscow":true,"moto":true,"motorcycles":true,"mov":true,"movie":true,"movistar":true,"msd":true,"mtn":true,"mtpc":true,"mtr":true,"multichoice":true,"mutual":true,"mutuelle":true,"mzansimagic":true,"nab":true,"nadex":true,"nagoya":true,"naspers":true,"nationwide":true,"natura":true,"navy":true,"nba":true,"nec":true,"netbank":true,"netflix":true,"network":true,"neustar":true,"new":true,"newholland":true,"news":true,"next":true,"nextdirect":true,"nexus":true,"nfl":true,"ngo":true,"nhk":true,"nico":true,"nike":true,"nikon":true,"ninja":true,"nissan":true,"nokia":true,"northwesternmutual":true,"norton":true,"now":true,"nowruz":true,"nowtv":true,"nra":true,"nrw":true,"ntt":true,"nyc":true,"obi":true,"observer":true,"off":true,"office":true,"okinawa":true,"olayan":true,"olayangroup":true,"oldnavy":true,"ollo":true,"omega":true,"one":true,"ong":true,"onl":true,"online":true,"onyourside":true,"ooo":true,"open":true,"oracle":true,"orange":true,"organic":true,"orientexpress":true,"osaka":true,"otsuka":true,"ott":true,"ovh":true,"page":true,"pamperedchef":true,"panasonic":true,"panerai":true,"paris":true,"pars":true,"partners":true,"parts":true,"party":true,"passagens":true,"pay":true,"payu":true,"pccw":true,"pet":true,"pfizer":true,"pharmacy":true,"philips":true,"photo":true,"photography":true,"photos":true,"physio":true,"piaget":true,"pics":true,"pictet":true,"pictures":true,"pid":true,"pin":true,"ping":true,"pink":true,"pioneer":true,"pizza":true,"place":true,"play":true,"playstation":true,"plumbing":true,"plus":true,"pnc":true,"pohl":true,"poker":true,"politie":true,"porn":true,"pramerica":true,"praxi":true,"press":true,"prime":true,"prod":true,"productions":true,"prof":true,"progressive":true,"promo":true,"properties":true,"property":true,"protection":true,"pru":true,"prudential":true,"pub":true,"qpon":true,"quebec":true,"quest":true,"qvc":true,"racing":true,"raid":true,"read":true,"realestate":true,"realtor":true,"realty":true,"recipes":true,"red":true,"redstone":true,"redumbrella":true,"rehab":true,"reise":true,"reisen":true,"reit":true,"reliance":true,"ren":true,"rent":true,"rentals":true,"repair":true,"report":true,"republican":true,"rest":true,"restaurant":true,"review":true,"reviews":true,"rexroth":true,"rich":true,"richardli":true,"ricoh":true,"rightathome":true,"ril":true,"rio":true,"rip":true,"rocher":true,"rocks":true,"rodeo":true,"rogers":true,"room":true,"rsvp":true,"ruhr":true,"run":true,"rwe":true,"ryukyu":true,"saarland":true,"safe":true,"safety":true,"sakura":true,"sale":true,"salon":true,"samsclub":true,"samsung":true,"sandvik":true,"sandvikcoromant":true,"sanofi":true,"sap":true,"sapo":true,"sarl":true,"sas":true,"save":true,"saxo":true,"sbi":true,"sbs":true,"sca":true,"scb":true,"schaeffler":true,"schmidt":true,"scholarships":true,"school":true,"schule":true,"schwarz":true,"science":true,"scjohnson":true,"scor":true,"scot":true,"seat":true,"secure":true,"security":true,"seek":true,"sener":true,"services":true,"ses":true,"seven":true,"sew":true,"sex":true,"sexy":true,"sfr":true,"shangrila":true,"sharp":true,"shaw":true,"shell":true,"shia":true,"shiksha":true,"shoes":true,"shouji":true,"show":true,"showtime":true,"shriram":true,"silk":true,"sina":true,"singles":true,"site":true,"ski":true,"skin":true,"sky":true,"skype":true,"sling":true,"smart":true,"smile":true,"sncf":true,"soccer":true,"social":true,"softbank":true,"software":true,"sohu":true,"solar":true,"solutions":true,"song":true,"sony":true,"soy":true,"space":true,"spiegel":true,"spot":true,"spreadbetting":true,"srl":true,"srt":true,"stada":true,"staples":true,"star":true,"starhub":true,"statebank":true,"statefarm":true,"statoil":true,"stc":true,"stcgroup":true,"stockholm":true,"storage":true,"store":true,"studio":true,"study":true,"style":true,"sucks":true,"supersport":true,"supplies":true,"supply":true,"support":true,"surf":true,"surgery":true,"suzuki":true,"swatch":true,"swiftcover":true,"swiss":true,"sydney":true,"symantec":true,"systems":true,"tab":true,"taipei":true,"talk":true,"taobao":true,"target":true,"tatamotors":true,"tatar":true,"tattoo":true,"tax":true,"taxi":true,"tci":true,"tdk":true,"team":true,"tech":true,"technology":true,"telecity":true,"telefonica":true,"temasek":true,"tennis":true,"teva":true,"thd":true,"theater":true,"theatre":true,"theguardian":true,"tiaa":true,"tickets":true,"tienda":true,"tiffany":true,"tips":true,"tires":true,"tirol":true,"tjmaxx":true,"tjx":true,"tkmaxx":true,"tmall":true,"today":true,"tokyo":true,"tools":true,"top":true,"toray":true,"toshiba":true,"total":true,"tours":true,"town":true,"toyota":true,"toys":true,"trade":true,"trading":true,"training":true,"travelchannel":true,"travelers":true,"travelersinsurance":true,"trust":true,"trv":true,"tube":true,"tui":true,"tunes":true,"tushu":true,"tvs":true,"ubank":true,"ubs":true,"uconnect":true,"university":true,"uno":true,"uol":true,"ups":true,"vacations":true,"vana":true,"vanguard":true,"vegas":true,"ventures":true,"verisign":true,"versicherung":true,"vet":true,"viajes":true,"video":true,"vig":true,"viking":true,"villas":true,"vin":true,"vip":true,"virgin":true,"visa":true,"vision":true,"vista":true,"vistaprint":true,"viva":true,"vivo":true,"vlaanderen":true,"vodka":true,"volkswagen":true,"vote":true,"voting":true,"voto":true,"voyage":true,"vuelos":true,"wales":true,"walmart":true,"walter":true,"wang":true,"wanggou":true,"warman":true,"watch":true,"watches":true,"weather":true,"weatherchannel":true,"webcam":true,"weber":true,"website":true,"wed":true,"wedding":true,"weibo":true,"weir":true,"whoswho":true,"wien":true,"wiki":true,"williamhill":true,"win":true,"windows":true,"wine":true,"winners":true,"wme":true,"wolterskluwer":true,"woodside":true,"work":true,"works":true,"world":true,"wtc":true,"wtf":true,"xbox":true,"xerox":true,"xfinity":true,"xihuan":true,"xin":true,"xn--11b4c3d":true,"xn--1ck2e1b":true,"xn--1qqw23a":true,"xn--30rr7y":true,"xn--3bst00m":true,"xn--3ds443g":true,"xn--3oq18vl8pn36a":true,"xn--3pxu8k":true,"xn--42c2d9a":true,"xn--45q11c":true,"xn--4gbrim":true,"xn--4gq48lf9j":true,"xn--55qw42g":true,"xn--55qx5d":true,"xn--5su34j936bgsg":true,"xn--5tzm5g":true,"xn--6frz82g":true,"xn--6qq986b3xl":true,"xn--80adxhks":true,"xn--80asehdb":true,"xn--80aswg":true,"xn--8y0a063a":true,"xn--9dbq2a":true,"xn--9et52u":true,"xn--9krt00a":true,"xn--b4w605ferd":true,"xn--bck1b9a5dre4c":true,"xn--c1avg":true,"xn--c2br7g":true,"xn--cck2b3b":true,"xn--cg4bki":true,"xn--czr694b":true,"xn--czrs0t":true,"xn--czru2d":true,"xn--d1acj3b":true,"xn--eckvdtc9d":true,"xn--efvy88h":true,"xn--estv75g":true,"xn--fct429k":true,"xn--fhbei":true,"xn--fiq228c5hs":true,"xn--fiq64b":true,"xn--fjq720a":true,"xn--flw351e":true,"xn--fzys8d69uvgm":true,"xn--g2xx48c":true,"xn--gckr3f0f":true,"xn--hxt814e":true,"xn--i1b6b1a6a2e":true,"xn--imr513n":true,"xn--io0a7i":true,"xn--j1aef":true,"xn--jlq61u9w7b":true,"xn--jvr189m":true,"xn--kcrx77d1x4a":true,"xn--kpu716f":true,"xn--kput3i":true,"xn--mgba3a3ejt":true,"xn--mgba7c0bbn0a":true,"xn--mgbaakc7dvf":true,"xn--mgbab2bd":true,"xn--mgbb9fbpob":true,"xn--mgbca7dzdo":true,"xn--mgbt3dhd":true,"xn--mk1bu44c":true,"xn--mxtq1m":true,"xn--ngbc5azd":true,"xn--ngbe9e0a":true,"xn--nqv7f":true,"xn--nqv7fs00ema":true,"xn--nyqy26a":true,"xn--p1acf":true,"xn--pbt977c":true,"xn--pssy2u":true,"xn--q9jyb4c":true,"xn--qcka1pmc":true,"xn--rhqv96g":true,"xn--rovu88b":true,"xn--ses554g":true,"xn--t60b56a":true,"xn--tckwe":true,"xn--unup4y":true,"xn--vermgensberater-ctb":true,"xn--vermgensberatung-pwb":true,"xn--vhquv":true,"xn--vuq861b":true,"xn--w4r85el8fhu5dnra":true,"xn--w4rs40l":true,"xn--xhq521b":true,"xn--zfr164b":true,"xperia":true,"xyz":true,"yachts":true,"yahoo":true,"yamaxun":true,"yandex":true,"yodobashi":true,"yoga":true,"yokohama":true,"you":true,"youtube":true,"yun":true,"zappos":true,"zara":true,"zero":true,"zip":true,"zippo":true,"zone":true,"zuerich":true,"cloudfront.net":true,"ap-northeast-1.compute.amazonaws.com":true,"ap-southeast-1.compute.amazonaws.com":true,"ap-southeast-2.compute.amazonaws.com":true,"cn-north-1.compute.amazonaws.cn":true,"compute.amazonaws.cn":true,"compute.amazonaws.com":true,"compute-1.amazonaws.com":true,"eu-west-1.compute.amazonaws.com":true,"eu-central-1.compute.amazonaws.com":true,"sa-east-1.compute.amazonaws.com":true,"us-east-1.amazonaws.com":true,"us-gov-west-1.compute.amazonaws.com":true,"us-west-1.compute.amazonaws.com":true,"us-west-2.compute.amazonaws.com":true,"z-1.compute-1.amazonaws.com":true,"z-2.compute-1.amazonaws.com":true,"elasticbeanstalk.com":true,"elb.amazonaws.com":true,"s3.amazonaws.com":true,"s3-ap-northeast-1.amazonaws.com":true,"s3-ap-southeast-1.amazonaws.com":true,"s3-ap-southeast-2.amazonaws.com":true,"s3-external-1.amazonaws.com":true,"s3-external-2.amazonaws.com":true,"s3-fips-us-gov-west-1.amazonaws.com":true,"s3-eu-central-1.amazonaws.com":true,"s3-eu-west-1.amazonaws.com":true,"s3-sa-east-1.amazonaws.com":true,"s3-us-gov-west-1.amazonaws.com":true,"s3-us-west-1.amazonaws.com":true,"s3-us-west-2.amazonaws.com":true,"s3.cn-north-1.amazonaws.com.cn":true,"s3.eu-central-1.amazonaws.com":true,"betainabox.com":true,"ae.org":true,"ar.com":true,"br.com":true,"cn.com":true,"com.de":true,"com.se":true,"de.com":true,"eu.com":true,"gb.com":true,"gb.net":true,"hu.com":true,"hu.net":true,"jp.net":true,"jpn.com":true,"kr.com":true,"mex.com":true,"no.com":true,"qc.com":true,"ru.com":true,"sa.com":true,"se.com":true,"se.net":true,"uk.com":true,"uk.net":true,"us.com":true,"uy.com":true,"za.bz":true,"za.com":true,"africa.com":true,"gr.com":true,"in.net":true,"us.org":true,"co.com":true,"c.la":true,"cloudcontrolled.com":true,"cloudcontrolapp.com":true,"co.ca":true,"c.cdn77.org":true,"cdn77-ssl.net":true,"r.cdn77.net":true,"rsc.cdn77.org":true,"ssl.origin.cdn77-secure.org":true,"co.nl":true,"co.no":true,"*.platform.sh":true,"cupcake.is":true,"dreamhosters.com":true,"duckdns.org":true,"dyndns-at-home.com":true,"dyndns-at-work.com":true,"dyndns-blog.com":true,"dyndns-free.com":true,"dyndns-home.com":true,"dyndns-ip.com":true,"dyndns-mail.com":true,"dyndns-office.com":true,"dyndns-pics.com":true,"dyndns-remote.com":true,"dyndns-server.com":true,"dyndns-web.com":true,"dyndns-wiki.com":true,"dyndns-work.com":true,"dyndns.biz":true,"dyndns.info":true,"dyndns.org":true,"dyndns.tv":true,"at-band-camp.net":true,"ath.cx":true,"barrel-of-knowledge.info":true,"barrell-of-knowledge.info":true,"better-than.tv":true,"blogdns.com":true,"blogdns.net":true,"blogdns.org":true,"blogsite.org":true,"boldlygoingnowhere.org":true,"broke-it.net":true,"buyshouses.net":true,"cechire.com":true,"dnsalias.com":true,"dnsalias.net":true,"dnsalias.org":true,"dnsdojo.com":true,"dnsdojo.net":true,"dnsdojo.org":true,"does-it.net":true,"doesntexist.com":true,"doesntexist.org":true,"dontexist.com":true,"dontexist.net":true,"dontexist.org":true,"doomdns.com":true,"doomdns.org":true,"dvrdns.org":true,"dyn-o-saur.com":true,"dynalias.com":true,"dynalias.net":true,"dynalias.org":true,"dynathome.net":true,"dyndns.ws":true,"endofinternet.net":true,"endofinternet.org":true,"endoftheinternet.org":true,"est-a-la-maison.com":true,"est-a-la-masion.com":true,"est-le-patron.com":true,"est-mon-blogueur.com":true,"for-better.biz":true,"for-more.biz":true,"for-our.info":true,"for-some.biz":true,"for-the.biz":true,"forgot.her.name":true,"forgot.his.name":true,"from-ak.com":true,"from-al.com":true,"from-ar.com":true,"from-az.net":true,"from-ca.com":true,"from-co.net":true,"from-ct.com":true,"from-dc.com":true,"from-de.com":true,"from-fl.com":true,"from-ga.com":true,"from-hi.com":true,"from-ia.com":true,"from-id.com":true,"from-il.com":true,"from-in.com":true,"from-ks.com":true,"from-ky.com":true,"from-la.net":true,"from-ma.com":true,"from-md.com":true,"from-me.org":true,"from-mi.com":true,"from-mn.com":true,"from-mo.com":true,"from-ms.com":true,"from-mt.com":true,"from-nc.com":true,"from-nd.com":true,"from-ne.com":true,"from-nh.com":true,"from-nj.com":true,"from-nm.com":true,"from-nv.com":true,"from-ny.net":true,"from-oh.com":true,"from-ok.com":true,"from-or.com":true,"from-pa.com":true,"from-pr.com":true,"from-ri.com":true,"from-sc.com":true,"from-sd.com":true,"from-tn.com":true,"from-tx.com":true,"from-ut.com":true,"from-va.com":true,"from-vt.com":true,"from-wa.com":true,"from-wi.com":true,"from-wv.com":true,"from-wy.com":true,"ftpaccess.cc":true,"fuettertdasnetz.de":true,"game-host.org":true,"game-server.cc":true,"getmyip.com":true,"gets-it.net":true,"go.dyndns.org":true,"gotdns.com":true,"gotdns.org":true,"groks-the.info":true,"groks-this.info":true,"ham-radio-op.net":true,"here-for-more.info":true,"hobby-site.com":true,"hobby-site.org":true,"home.dyndns.org":true,"homedns.org":true,"homeftp.net":true,"homeftp.org":true,"homeip.net":true,"homelinux.com":true,"homelinux.net":true,"homelinux.org":true,"homeunix.com":true,"homeunix.net":true,"homeunix.org":true,"iamallama.com":true,"in-the-band.net":true,"is-a-anarchist.com":true,"is-a-blogger.com":true,"is-a-bookkeeper.com":true,"is-a-bruinsfan.org":true,"is-a-bulls-fan.com":true,"is-a-candidate.org":true,"is-a-caterer.com":true,"is-a-celticsfan.org":true,"is-a-chef.com":true,"is-a-chef.net":true,"is-a-chef.org":true,"is-a-conservative.com":true,"is-a-cpa.com":true,"is-a-cubicle-slave.com":true,"is-a-democrat.com":true,"is-a-designer.com":true,"is-a-doctor.com":true,"is-a-financialadvisor.com":true,"is-a-geek.com":true,"is-a-geek.net":true,"is-a-geek.org":true,"is-a-green.com":true,"is-a-guru.com":true,"is-a-hard-worker.com":true,"is-a-hunter.com":true,"is-a-knight.org":true,"is-a-landscaper.com":true,"is-a-lawyer.com":true,"is-a-liberal.com":true,"is-a-libertarian.com":true,"is-a-linux-user.org":true,"is-a-llama.com":true,"is-a-musician.com":true,"is-a-nascarfan.com":true,"is-a-nurse.com":true,"is-a-painter.com":true,"is-a-patsfan.org":true,"is-a-personaltrainer.com":true,"is-a-photographer.com":true,"is-a-player.com":true,"is-a-republican.com":true,"is-a-rockstar.com":true,"is-a-socialist.com":true,"is-a-soxfan.org":true,"is-a-student.com":true,"is-a-teacher.com":true,"is-a-techie.com":true,"is-a-therapist.com":true,"is-an-accountant.com":true,"is-an-actor.com":true,"is-an-actress.com":true,"is-an-anarchist.com":true,"is-an-artist.com":true,"is-an-engineer.com":true,"is-an-entertainer.com":true,"is-by.us":true,"is-certified.com":true,"is-found.org":true,"is-gone.com":true,"is-into-anime.com":true,"is-into-cars.com":true,"is-into-cartoons.com":true,"is-into-games.com":true,"is-leet.com":true,"is-lost.org":true,"is-not-certified.com":true,"is-saved.org":true,"is-slick.com":true,"is-uberleet.com":true,"is-very-bad.org":true,"is-very-evil.org":true,"is-very-good.org":true,"is-very-nice.org":true,"is-very-sweet.org":true,"is-with-theband.com":true,"isa-geek.com":true,"isa-geek.net":true,"isa-geek.org":true,"isa-hockeynut.com":true,"issmarterthanyou.com":true,"isteingeek.de":true,"istmein.de":true,"kicks-ass.net":true,"kicks-ass.org":true,"knowsitall.info":true,"land-4-sale.us":true,"lebtimnetz.de":true,"leitungsen.de":true,"likes-pie.com":true,"likescandy.com":true,"merseine.nu":true,"mine.nu":true,"misconfused.org":true,"mypets.ws":true,"myphotos.cc":true,"neat-url.com":true,"office-on-the.net":true,"on-the-web.tv":true,"podzone.net":true,"podzone.org":true,"readmyblog.org":true,"saves-the-whales.com":true,"scrapper-site.net":true,"scrapping.cc":true,"selfip.biz":true,"selfip.com":true,"selfip.info":true,"selfip.net":true,"selfip.org":true,"sells-for-less.com":true,"sells-for-u.com":true,"sells-it.net":true,"sellsyourhome.org":true,"servebbs.com":true,"servebbs.net":true,"servebbs.org":true,"serveftp.net":true,"serveftp.org":true,"servegame.org":true,"shacknet.nu":true,"simple-url.com":true,"space-to-rent.com":true,"stuff-4-sale.org":true,"stuff-4-sale.us":true,"teaches-yoga.com":true,"thruhere.net":true,"traeumtgerade.de":true,"webhop.biz":true,"webhop.info":true,"webhop.net":true,"webhop.org":true,"worse-than.tv":true,"writesthisblog.com":true,"eu.org":true,"al.eu.org":true,"asso.eu.org":true,"at.eu.org":true,"au.eu.org":true,"be.eu.org":true,"bg.eu.org":true,"ca.eu.org":true,"cd.eu.org":true,"ch.eu.org":true,"cn.eu.org":true,"cy.eu.org":true,"cz.eu.org":true,"de.eu.org":true,"dk.eu.org":true,"edu.eu.org":true,"ee.eu.org":true,"es.eu.org":true,"fi.eu.org":true,"fr.eu.org":true,"gr.eu.org":true,"hr.eu.org":true,"hu.eu.org":true,"ie.eu.org":true,"il.eu.org":true,"in.eu.org":true,"int.eu.org":true,"is.eu.org":true,"it.eu.org":true,"jp.eu.org":true,"kr.eu.org":true,"lt.eu.org":true,"lu.eu.org":true,"lv.eu.org":true,"mc.eu.org":true,"me.eu.org":true,"mk.eu.org":true,"mt.eu.org":true,"my.eu.org":true,"net.eu.org":true,"ng.eu.org":true,"nl.eu.org":true,"no.eu.org":true,"nz.eu.org":true,"paris.eu.org":true,"pl.eu.org":true,"pt.eu.org":true,"q-a.eu.org":true,"ro.eu.org":true,"ru.eu.org":true,"se.eu.org":true,"si.eu.org":true,"sk.eu.org":true,"tr.eu.org":true,"uk.eu.org":true,"us.eu.org":true,"a.ssl.fastly.net":true,"b.ssl.fastly.net":true,"global.ssl.fastly.net":true,"a.prod.fastly.net":true,"global.prod.fastly.net":true,"firebaseapp.com":true,"flynnhub.com":true,"service.gov.uk":true,"github.io":true,"githubusercontent.com":true,"ro.com":true,"appspot.com":true,"blogspot.ae":true,"blogspot.al":true,"blogspot.am":true,"blogspot.ba":true,"blogspot.be":true,"blogspot.bg":true,"blogspot.bj":true,"blogspot.ca":true,"blogspot.cf":true,"blogspot.ch":true,"blogspot.cl":true,"blogspot.co.at":true,"blogspot.co.id":true,"blogspot.co.il":true,"blogspot.co.ke":true,"blogspot.co.nz":true,"blogspot.co.uk":true,"blogspot.co.za":true,"blogspot.com":true,"blogspot.com.ar":true,"blogspot.com.au":true,"blogspot.com.br":true,"blogspot.com.by":true,"blogspot.com.co":true,"blogspot.com.cy":true,"blogspot.com.ee":true,"blogspot.com.eg":true,"blogspot.com.es":true,"blogspot.com.mt":true,"blogspot.com.ng":true,"blogspot.com.tr":true,"blogspot.com.uy":true,"blogspot.cv":true,"blogspot.cz":true,"blogspot.de":true,"blogspot.dk":true,"blogspot.fi":true,"blogspot.fr":true,"blogspot.gr":true,"blogspot.hk":true,"blogspot.hr":true,"blogspot.hu":true,"blogspot.ie":true,"blogspot.in":true,"blogspot.is":true,"blogspot.it":true,"blogspot.jp":true,"blogspot.kr":true,"blogspot.li":true,"blogspot.lt":true,"blogspot.lu":true,"blogspot.md":true,"blogspot.mk":true,"blogspot.mr":true,"blogspot.mx":true,"blogspot.my":true,"blogspot.nl":true,"blogspot.no":true,"blogspot.pe":true,"blogspot.pt":true,"blogspot.qa":true,"blogspot.re":true,"blogspot.ro":true,"blogspot.rs":true,"blogspot.ru":true,"blogspot.se":true,"blogspot.sg":true,"blogspot.si":true,"blogspot.sk":true,"blogspot.sn":true,"blogspot.td":true,"blogspot.tw":true,"blogspot.ug":true,"blogspot.vn":true,"codespot.com":true,"googleapis.com":true,"googlecode.com":true,"pagespeedmobilizer.com":true,"withgoogle.com":true,"withyoutube.com":true,"herokuapp.com":true,"herokussl.com":true,"iki.fi":true,"biz.at":true,"info.at":true,"co.pl":true,"azurewebsites.net":true,"azure-mobile.net":true,"cloudapp.net":true,"bmoattachments.org":true,"4u.com":true,"nfshost.com":true,"nyc.mn":true,"nid.io":true,"operaunite.com":true,"outsystemscloud.com":true,"art.pl":true,"gliwice.pl":true,"krakow.pl":true,"poznan.pl":true,"wroc.pl":true,"zakopane.pl":true,"pantheon.io":true,"gotpantheon.com":true,"priv.at":true,"qa2.com":true,"rhcloud.com":true,"sandcats.io":true,"biz.ua":true,"co.ua":true,"pp.ua":true,"sinaapp.com":true,"vipsinaapp.com":true,"1kapp.com":true,"gda.pl":true,"gdansk.pl":true,"gdynia.pl":true,"med.pl":true,"sopot.pl":true,"hk.com":true,"hk.org":true,"ltd.hk":true,"inc.hk":true,"yolasite.com":true,"za.net":true,"za.org":true});
-
-// END of automatically generated file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/store.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/store.js
deleted file mode 100644
index bce52925db1cdd4175b3368d53266f890b3c58db..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/lib/store.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/*!
- * Copyright (c) 2015, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
-'use strict';
-/*jshint unused:false */
-
-function Store() {
-}
-exports.Store = Store;
-
-// Stores may be synchronous, but are still required to use a
-// Continuation-Passing Style API.  The CookieJar itself will expose a "*Sync"
-// API that converts from synchronous-callbacks to imperative style.
-Store.prototype.synchronous = false;
-
-Store.prototype.findCookie = function(domain, path, key, cb) {
-  throw new Error('findCookie is not implemented');
-};
-
-Store.prototype.findCookies = function(domain, path, cb) {
-  throw new Error('findCookies is not implemented');
-};
-
-Store.prototype.putCookie = function(cookie, cb) {
-  throw new Error('putCookie is not implemented');
-};
-
-Store.prototype.updateCookie = function(oldCookie, newCookie, cb) {
-  // recommended default implementation:
-  // return this.putCookie(newCookie, cb);
-  throw new Error('updateCookie is not implemented');
-};
-
-Store.prototype.removeCookie = function(domain, path, key, cb) {
-  throw new Error('removeCookie is not implemented');
-};
-
-Store.prototype.removeCookies = function(domain, path, cb) {
-  throw new Error('removeCookies is not implemented');
-};
-
-Store.prototype.getAllCookies = function(cb) {
-  throw new Error('getAllCookies is not implemented (therefore jar cannot be serialized)');
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/package.json
deleted file mode 100644
index 37e314ac6a9ebe4c263a736662a3ddc792855e96..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tough-cookie/package.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
-  "_from": "tough-cookie@>=2.2.0 <2.3.0",
-  "_id": "tough-cookie@2.2.2",
-  "_location": "/serialport/node-pre-gyp/request/tough-cookie",
-  "_nodeVersion": "5.1.1",
-  "_npmOperationalInternal": {
-    "host": "packages-13-west.internal.npmjs.com",
-    "tmp": "tmp/tough-cookie-2.2.2.tgz_1457564639182_0.5129188685677946"
-  },
-  "_npmUser": {
-    "email": "jstash@gmail.com",
-    "name": "jstash"
-  },
-  "_npmVersion": "3.3.12",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz",
-  "_shasum": "c83a1830f4e5ef0b93ef2a3488e724f8de016ac7",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "jstashewsky@salesforce.com",
-    "name": "Jeremy Stashewsky"
-  },
-  "bugs": {
-    "url": "https://github.com/SalesforceEng/tough-cookie/issues"
-  },
-  "contributors": [
-    {
-      "name": "Alexander Savin"
-    },
-    {
-      "name": "Ian Livingstone"
-    },
-    {
-      "name": "Ivan Nikulin"
-    },
-    {
-      "name": "Lalit Kapoor"
-    },
-    {
-      "name": "Sam Thompson"
-    },
-    {
-      "name": "Sebastian Mayr"
-    }
-  ],
-  "dependencies": {},
-  "description": "RFC6265 Cookies and Cookie Jar for node.js",
-  "devDependencies": {
-    "async": "^1.4.2",
-    "vows": "^0.8.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "c83a1830f4e5ef0b93ef2a3488e724f8de016ac7",
-    "tarball": "http://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.2.tgz"
-  },
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "lib"
-  ],
-  "gitHead": "cc46628c4d7d2e8c372ecba29293ca8a207ec192",
-  "homepage": "https://github.com/SalesforceEng/tough-cookie",
-  "keywords": [
-    "HTTP",
-    "RFC2965",
-    "RFC6265",
-    "cookie",
-    "cookiejar",
-    "cookies",
-    "jar",
-    "set-cookie"
-  ],
-  "license": "BSD-3-Clause",
-  "main": "./lib/cookie",
-  "maintainers": [
-    {
-      "name": "jstash",
-      "email": "jeremy@goinstant.com"
-    },
-    {
-      "name": "goinstant",
-      "email": "services@goinstant.com"
-    }
-  ],
-  "name": "tough-cookie",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/SalesforceEng/tough-cookie.git"
-  },
-  "scripts": {
-    "suffixup": "curl -o public_suffix_list.dat https://publicsuffix.org/list/public_suffix_list.dat && ./generate-pubsuffix.js",
-    "test": "vows test/*_test.js"
-  },
-  "version": "2.2.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/LICENSE
deleted file mode 100644
index a4a9aee0c2fa14a2007895d018bfa06f0592fd34..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/LICENSE
+++ /dev/null
@@ -1,55 +0,0 @@
-Apache License
-
-Version 2.0, January 2004
-
-http://www.apache.org/licenses/
-
-TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-1. Definitions.
-
-"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
-
-"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
-
-"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
-
-"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
-
-"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
-
-"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
-
-"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
-
-"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
-
-"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
-
-"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
-
-2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
-
-3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
-
-4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
-
-You must give any other recipients of the Work or Derivative Works a copy of this License; and
-
-You must cause any modified files to carry prominent notices stating that You changed the files; and
-
-You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
-
-If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
-
-5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
-
-6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
-
-7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
-
-8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
-
-9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
-
-END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/README.md
deleted file mode 100644
index bb533d56b1aa239cbd5088c04cb62a18a20ce840..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-tunnel-agent
-============
-
-HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/index.js
deleted file mode 100644
index 68013ac1f4ef3302bab403e941f99f5babe43232..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/index.js
+++ /dev/null
@@ -1,243 +0,0 @@
-'use strict'
-
-var net = require('net')
-  , tls = require('tls')
-  , http = require('http')
-  , https = require('https')
-  , events = require('events')
-  , assert = require('assert')
-  , util = require('util')
-  ;
-
-exports.httpOverHttp = httpOverHttp
-exports.httpsOverHttp = httpsOverHttp
-exports.httpOverHttps = httpOverHttps
-exports.httpsOverHttps = httpsOverHttps
-
-
-function httpOverHttp(options) {
-  var agent = new TunnelingAgent(options)
-  agent.request = http.request
-  return agent
-}
-
-function httpsOverHttp(options) {
-  var agent = new TunnelingAgent(options)
-  agent.request = http.request
-  agent.createSocket = createSecureSocket
-  agent.defaultPort = 443
-  return agent
-}
-
-function httpOverHttps(options) {
-  var agent = new TunnelingAgent(options)
-  agent.request = https.request
-  return agent
-}
-
-function httpsOverHttps(options) {
-  var agent = new TunnelingAgent(options)
-  agent.request = https.request
-  agent.createSocket = createSecureSocket
-  agent.defaultPort = 443
-  return agent
-}
-
-
-function TunnelingAgent(options) {
-  var self = this
-  self.options = options || {}
-  self.proxyOptions = self.options.proxy || {}
-  self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets
-  self.requests = []
-  self.sockets = []
-
-  self.on('free', function onFree(socket, host, port) {
-    for (var i = 0, len = self.requests.length; i < len; ++i) {
-      var pending = self.requests[i]
-      if (pending.host === host && pending.port === port) {
-        // Detect the request to connect same origin server,
-        // reuse the connection.
-        self.requests.splice(i, 1)
-        pending.request.onSocket(socket)
-        return
-      }
-    }
-    socket.destroy()
-    self.removeSocket(socket)
-  })
-}
-util.inherits(TunnelingAgent, events.EventEmitter)
-
-TunnelingAgent.prototype.addRequest = function addRequest(req, options) {
-  var self = this
-
-   // Legacy API: addRequest(req, host, port, path)
-  if (typeof options === 'string') {
-    options = {
-      host: options,
-      port: arguments[2],
-      path: arguments[3]
-    };
-  }
-
-  if (self.sockets.length >= this.maxSockets) {
-    // We are over limit so we'll add it to the queue.
-    self.requests.push({host: options.host, port: options.port, request: req})
-    return
-  }
-
-  // If we are under maxSockets create a new one.
-  self.createConnection({host: options.host, port: options.port, request: req})
-}
-
-TunnelingAgent.prototype.createConnection = function createConnection(pending) {
-  var self = this
-
-  self.createSocket(pending, function(socket) {
-    socket.on('free', onFree)
-    socket.on('close', onCloseOrRemove)
-    socket.on('agentRemove', onCloseOrRemove)
-    pending.request.onSocket(socket)
-
-    function onFree() {
-      self.emit('free', socket, pending.host, pending.port)
-    }
-
-    function onCloseOrRemove(err) {
-      self.removeSocket(socket)
-      socket.removeListener('free', onFree)
-      socket.removeListener('close', onCloseOrRemove)
-      socket.removeListener('agentRemove', onCloseOrRemove)
-    }
-  })
-}
-
-TunnelingAgent.prototype.createSocket = function createSocket(options, cb) {
-  var self = this
-  var placeholder = {}
-  self.sockets.push(placeholder)
-
-  var connectOptions = mergeOptions({}, self.proxyOptions, 
-    { method: 'CONNECT'
-    , path: options.host + ':' + options.port
-    , agent: false
-    }
-  )
-  if (connectOptions.proxyAuth) {
-    connectOptions.headers = connectOptions.headers || {}
-    connectOptions.headers['Proxy-Authorization'] = 'Basic ' +
-        new Buffer(connectOptions.proxyAuth).toString('base64')
-  }
-
-  debug('making CONNECT request')
-  var connectReq = self.request(connectOptions)
-  connectReq.useChunkedEncodingByDefault = false // for v0.6
-  connectReq.once('response', onResponse) // for v0.6
-  connectReq.once('upgrade', onUpgrade)   // for v0.6
-  connectReq.once('connect', onConnect)   // for v0.7 or later
-  connectReq.once('error', onError)
-  connectReq.end()
-
-  function onResponse(res) {
-    // Very hacky. This is necessary to avoid http-parser leaks.
-    res.upgrade = true
-  }
-
-  function onUpgrade(res, socket, head) {
-    // Hacky.
-    process.nextTick(function() {
-      onConnect(res, socket, head)
-    })
-  }
-
-  function onConnect(res, socket, head) {
-    connectReq.removeAllListeners()
-    socket.removeAllListeners()
-
-    if (res.statusCode === 200) {
-      assert.equal(head.length, 0)
-      debug('tunneling connection has established')
-      self.sockets[self.sockets.indexOf(placeholder)] = socket
-      cb(socket)
-    } else {
-      debug('tunneling socket could not be established, statusCode=%d', res.statusCode)
-      var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode)
-      error.code = 'ECONNRESET'
-      options.request.emit('error', error)
-      self.removeSocket(placeholder)
-    }
-  }
-
-  function onError(cause) {
-    connectReq.removeAllListeners()
-
-    debug('tunneling socket could not be established, cause=%s\n', cause.message, cause.stack)
-    var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message)
-    error.code = 'ECONNRESET'
-    options.request.emit('error', error)
-    self.removeSocket(placeholder)
-  }
-}
-
-TunnelingAgent.prototype.removeSocket = function removeSocket(socket) {
-  var pos = this.sockets.indexOf(socket)
-  if (pos === -1) return
-  
-  this.sockets.splice(pos, 1)
-
-  var pending = this.requests.shift()
-  if (pending) {
-    // If we have pending requests and a socket gets closed a new one
-    // needs to be created to take over in the pool for the one that closed.
-    this.createConnection(pending)
-  }
-}
-
-function createSecureSocket(options, cb) {
-  var self = this
-  TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {
-    // 0 is dummy port for v0.6
-    var secureSocket = tls.connect(0, mergeOptions({}, self.options, 
-      { servername: options.host
-      , socket: socket
-      }
-    ))
-    self.sockets[self.sockets.indexOf(socket)] = secureSocket
-    cb(secureSocket)
-  })
-}
-
-
-function mergeOptions(target) {
-  for (var i = 1, len = arguments.length; i < len; ++i) {
-    var overrides = arguments[i]
-    if (typeof overrides === 'object') {
-      var keys = Object.keys(overrides)
-      for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {
-        var k = keys[j]
-        if (overrides[k] !== undefined) {
-          target[k] = overrides[k]
-        }
-      }
-    }
-  }
-  return target
-}
-
-
-var debug
-if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
-  debug = function() {
-    var args = Array.prototype.slice.call(arguments)
-    if (typeof args[0] === 'string') {
-      args[0] = 'TUNNEL: ' + args[0]
-    } else {
-      args.unshift('TUNNEL:')
-    }
-    console.error.apply(console, args)
-  }
-} else {
-  debug = function() {}
-}
-exports.debug = debug // for test
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/package.json
deleted file mode 100644
index 7dd31c3b9cb99cd420c5c19d15b15a7744ad94a3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/node_modules/tunnel-agent/package.json
+++ /dev/null
@@ -1,74 +0,0 @@
-{
-  "_from": "tunnel-agent@>=0.4.1 <0.5.0",
-  "_id": "tunnel-agent@0.4.3",
-  "_location": "/serialport/node-pre-gyp/request/tunnel-agent",
-  "_nodeVersion": "5.9.0",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/tunnel-agent-0.4.3.tgz_1462396470295_0.23639482469297945"
-  },
-  "_npmUser": {
-    "email": "simeonvelichkov@gmail.com",
-    "name": "simov"
-  },
-  "_npmVersion": "2.15.3",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/request"
-  ],
-  "_resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
-  "_shasum": "6373db76909fe570e08d73583365ed828a74eeeb",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mikeal.rogers@gmail.com",
-    "name": "Mikeal Rogers",
-    "url": "http://www.futurealoof.com"
-  },
-  "bugs": {
-    "url": "https://github.com/mikeal/tunnel-agent/issues"
-  },
-  "dependencies": {},
-  "description": "HTTP proxy tunneling agent. Formerly part of mikeal/request, now a standalone module.",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "6373db76909fe570e08d73583365ed828a74eeeb",
-    "tarball": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "files": [
-    "index.js"
-  ],
-  "gitHead": "e72d830f5ed388a2a71d37ce062c38e3fb34bdde",
-  "homepage": "https://github.com/mikeal/tunnel-agent#readme",
-  "license": "Apache-2.0",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "mikeal",
-      "email": "mikeal.rogers@gmail.com"
-    },
-    {
-      "name": "nylen",
-      "email": "jnylen@gmail.com"
-    },
-    {
-      "name": "fredkschott",
-      "email": "fkschott@gmail.com"
-    },
-    {
-      "name": "simov",
-      "email": "simeonvelichkov@gmail.com"
-    }
-  ],
-  "name": "tunnel-agent",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "url": "git+https://github.com/mikeal/tunnel-agent.git"
-  },
-  "scripts": {},
-  "version": "0.4.3"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/package.json
deleted file mode 100644
index e5810545c7eaa430ede670aec09412c17304f85d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/package.json
+++ /dev/null
@@ -1,129 +0,0 @@
-{
-  "_from": "request@>=2.0.0 <3.0.0",
-  "_id": "request@2.73.0",
-  "_location": "/serialport/node-pre-gyp/request",
-  "_nodeVersion": "6.2.2",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/request-2.73.0.tgz_1468050202545_0.40326908184215426"
-  },
-  "_npmUser": {
-    "email": "simeonvelichkov@gmail.com",
-    "name": "simov"
-  },
-  "_npmVersion": "2.15.6",
-  "_phantomChildren": {
-    "commander": "2.9.0"
-  },
-  "_requiredBy": [
-    "/serialport/node-pre-gyp"
-  ],
-  "_resolved": "https://registry.npmjs.org/request/-/request-2.73.0.tgz",
-  "_shasum": "5f78a9fde4370abc8ff6479d7a84a71a14b878a2",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mikeal.rogers@gmail.com",
-    "name": "Mikeal Rogers"
-  },
-  "bugs": {
-    "url": "http://github.com/request/request/issues"
-  },
-  "dependencies": {
-    "aws-sign2": "~0.6.0",
-    "aws4": "^1.2.1",
-    "bl": "~1.1.2",
-    "caseless": "~0.11.0",
-    "combined-stream": "~1.0.5",
-    "extend": "~3.0.0",
-    "forever-agent": "~0.6.1",
-    "form-data": "~1.0.0-rc4",
-    "har-validator": "~2.0.6",
-    "hawk": "~3.1.3",
-    "http-signature": "~1.1.0",
-    "is-typedarray": "~1.0.0",
-    "isstream": "~0.1.2",
-    "json-stringify-safe": "~5.0.1",
-    "mime-types": "~2.1.7",
-    "node-uuid": "~1.4.7",
-    "oauth-sign": "~0.8.1",
-    "qs": "~6.2.0",
-    "stringstream": "~0.0.4",
-    "tough-cookie": "~2.2.0",
-    "tunnel-agent": "~0.4.1"
-  },
-  "description": "Simplified HTTP request client.",
-  "devDependencies": {
-    "bluebird": "^3.2.1",
-    "browserify": "^13.0.1",
-    "browserify-istanbul": "^2.0.0",
-    "buffer-equal": "^1.0.0",
-    "codecov": "^1.0.1",
-    "coveralls": "^2.11.4",
-    "eslint": "^2.5.3",
-    "function-bind": "^1.0.2",
-    "istanbul": "^0.4.0",
-    "karma": "^1.1.1",
-    "karma-browserify": "^5.0.1",
-    "karma-cli": "^1.0.0",
-    "karma-coverage": "^1.0.0",
-    "karma-phantomjs-launcher": "^1.0.0",
-    "karma-tap": "^1.0.3",
-    "phantomjs-prebuilt": "^2.1.3",
-    "rimraf": "^2.2.8",
-    "server-destroy": "^1.0.1",
-    "tape": "^4.6.0",
-    "taper": "^0.4.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "5f78a9fde4370abc8ff6479d7a84a71a14b878a2",
-    "tarball": "https://registry.npmjs.org/request/-/request-2.73.0.tgz"
-  },
-  "engines": {
-    "node": ">=0.8.0"
-  },
-  "gitHead": "fa46be421b165c737c93672a8f920245cfb090a2",
-  "homepage": "https://github.com/request/request#readme",
-  "license": "Apache-2.0",
-  "main": "index.js",
-  "maintainers": [
-    {
-      "name": "mikeal",
-      "email": "mikeal.rogers@gmail.com"
-    },
-    {
-      "name": "nylen",
-      "email": "jnylen@gmail.com"
-    },
-    {
-      "name": "fredkschott",
-      "email": "fkschott@gmail.com"
-    },
-    {
-      "name": "simov",
-      "email": "simeonvelichkov@gmail.com"
-    }
-  ],
-  "name": "request",
-  "optionalDependencies": {},
-  "readme": "\n# Request - Simplified HTTP client\n\n[![npm package](https://nodei.co/npm/request.png?downloads=true&downloadRank=true&stars=true)](https://nodei.co/npm/request/)\n\n[![Build status](https://img.shields.io/travis/request/request/master.svg?style=flat-square)](https://travis-ci.org/request/request)\n[![Coverage](https://img.shields.io/codecov/c/github/request/request.svg?style=flat-square)](https://codecov.io/github/request/request?branch=master)\n[![Coverage](https://img.shields.io/coveralls/request/request.svg?style=flat-square)](https://coveralls.io/r/request/request)\n[![Dependency Status](https://img.shields.io/david/request/request.svg?style=flat-square)](https://david-dm.org/request/request)\n[![Known Vulnerabilities](https://snyk.io/test/npm/request/badge.svg?style=flat-square)](https://snyk.io/test/npm/request)\n[![Gitter](https://img.shields.io/badge/gitter-join_chat-blue.svg?style=flat-square)](https://gitter.im/request/request?utm_source=badge)\n\n\n## Super simple to use\n\nRequest is designed to be the simplest way possible to make http calls. It supports HTTPS and follows redirects by default.\n\n```js\nvar request = require('request');\nrequest('http://www.google.com', function (error, response, body) {\n  if (!error && response.statusCode == 200) {\n    console.log(body) // Show the HTML for the Google homepage.\n  }\n})\n```\n\n\n## Table of contents\n\n- [Streaming](#streaming)\n- [Forms](#forms)\n- [HTTP Authentication](#http-authentication)\n- [Custom HTTP Headers](#custom-http-headers)\n- [OAuth Signing](#oauth-signing)\n- [Proxies](#proxies)\n- [Unix Domain Sockets](#unix-domain-sockets)\n- [TLS/SSL Protocol](#tlsssl-protocol)\n- [Support for HAR 1.2](#support-for-har-12)\n- [**All Available Options**](#requestoptions-callback)\n\nRequest also offers [convenience methods](#convenience-methods) like\n`request.defaults` and `request.post`, and there are\nlots of [usage examples](#examples) and several\n[debugging techniques](#debugging).\n\n\n---\n\n\n## Streaming\n\nYou can stream any response to a file stream.\n\n```js\nrequest('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))\n```\n\nYou can also stream a file to a PUT or POST request. This method will also check the file extension against a mapping of file extensions to content-types (in this case `application/json`) and use the proper `content-type` in the PUT request (if the headers don’t already provide one).\n\n```js\nfs.createReadStream('file.json').pipe(request.put('http://mysite.com/obj.json'))\n```\n\nRequest can also `pipe` to itself. When doing so, `content-type` and `content-length` are preserved in the PUT headers.\n\n```js\nrequest.get('http://google.com/img.png').pipe(request.put('http://mysite.com/img.png'))\n```\n\nRequest emits a \"response\" event when a response is received. The `response` argument will be an instance of [http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage).\n\n```js\nrequest\n  .get('http://google.com/img.png')\n  .on('response', function(response) {\n    console.log(response.statusCode) // 200\n    console.log(response.headers['content-type']) // 'image/png'\n  })\n  .pipe(request.put('http://mysite.com/img.png'))\n```\n\nTo easily handle errors when streaming requests, listen to the `error` event before piping:\n\n```js\nrequest\n  .get('http://mysite.com/doodle.png')\n  .on('error', function(err) {\n    console.log(err)\n  })\n  .pipe(fs.createWriteStream('doodle.png'))\n```\n\nNow let’s get fancy.\n\n```js\nhttp.createServer(function (req, resp) {\n  if (req.url === '/doodle.png') {\n    if (req.method === 'PUT') {\n      req.pipe(request.put('http://mysite.com/doodle.png'))\n    } else if (req.method === 'GET' || req.method === 'HEAD') {\n      request.get('http://mysite.com/doodle.png').pipe(resp)\n    }\n  }\n})\n```\n\nYou can also `pipe()` from `http.ServerRequest` instances, as well as to `http.ServerResponse` instances. The HTTP method, headers, and entity-body data will be sent. Which means that, if you don't really care about security, you can do:\n\n```js\nhttp.createServer(function (req, resp) {\n  if (req.url === '/doodle.png') {\n    var x = request('http://mysite.com/doodle.png')\n    req.pipe(x)\n    x.pipe(resp)\n  }\n})\n```\n\nAnd since `pipe()` returns the destination stream in ≥ Node 0.5.x you can do one line proxying. :)\n\n```js\nreq.pipe(request('http://mysite.com/doodle.png')).pipe(resp)\n```\n\nAlso, none of this new functionality conflicts with requests previous features, it just expands them.\n\n```js\nvar r = request.defaults({'proxy':'http://localproxy.com'})\n\nhttp.createServer(function (req, resp) {\n  if (req.url === '/doodle.png') {\n    r.get('http://google.com/doodle.png').pipe(resp)\n  }\n})\n```\n\nYou can still use intermediate proxies, the requests will still follow HTTP forwards, etc.\n\n[back to top](#table-of-contents)\n\n\n---\n\n\n## Forms\n\n`request` supports `application/x-www-form-urlencoded` and `multipart/form-data` form uploads. For `multipart/related` refer to the `multipart` API.\n\n\n#### application/x-www-form-urlencoded (URL-Encoded Forms)\n\nURL-encoded forms are simple.\n\n```js\nrequest.post('http://service.com/upload', {form:{key:'value'}})\n// or\nrequest.post('http://service.com/upload').form({key:'value'})\n// or\nrequest.post({url:'http://service.com/upload', form: {key:'value'}}, function(err,httpResponse,body){ /* ... */ })\n```\n\n\n#### multipart/form-data (Multipart Form Uploads)\n\nFor `multipart/form-data` we use the [form-data](https://github.com/form-data/form-data) library by [@felixge](https://github.com/felixge). For the most cases, you can pass your upload form data via the `formData` option.\n\n\n```js\nvar formData = {\n  // Pass a simple key-value pair\n  my_field: 'my_value',\n  // Pass data via Buffers\n  my_buffer: new Buffer([1, 2, 3]),\n  // Pass data via Streams\n  my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),\n  // Pass multiple values /w an Array\n  attachments: [\n    fs.createReadStream(__dirname + '/attachment1.jpg'),\n    fs.createReadStream(__dirname + '/attachment2.jpg')\n  ],\n  // Pass optional meta-data with an 'options' object with style: {value: DATA, options: OPTIONS}\n  // Use case: for some types of streams, you'll need to provide \"file\"-related information manually.\n  // See the `form-data` README for more information about options: https://github.com/form-data/form-data\n  custom_file: {\n    value:  fs.createReadStream('/dev/urandom'),\n    options: {\n      filename: 'topsecret.jpg',\n      contentType: 'image/jpg'\n    }\n  }\n};\nrequest.post({url:'http://service.com/upload', formData: formData}, function optionalCallback(err, httpResponse, body) {\n  if (err) {\n    return console.error('upload failed:', err);\n  }\n  console.log('Upload successful!  Server responded with:', body);\n});\n```\n\nFor advanced cases, you can access the form-data object itself via `r.form()`. This can be modified until the request is fired on the next cycle of the event-loop. (Note that this calling `form()` will clear the currently set form data for that request.)\n\n```js\n// NOTE: Advanced use-case, for normal use see 'formData' usage above\nvar r = request.post('http://service.com/upload', function optionalCallback(err, httpResponse, body) {...})\nvar form = r.form();\nform.append('my_field', 'my_value');\nform.append('my_buffer', new Buffer([1, 2, 3]));\nform.append('custom_file', fs.createReadStream(__dirname + '/unicycle.jpg'), {filename: 'unicycle.jpg'});\n```\nSee the [form-data README](https://github.com/form-data/form-data) for more information & examples.\n\n\n#### multipart/related\n\nSome variations in different HTTP implementations require a newline/CRLF before, after, or both before and after the boundary of a `multipart/related` request (using the multipart option). This has been observed in the .NET WebAPI version 4.0. You can turn on a boundary preambleCRLF or postamble by passing them as `true` to your request options.\n\n```js\n  request({\n    method: 'PUT',\n    preambleCRLF: true,\n    postambleCRLF: true,\n    uri: 'http://service.com/upload',\n    multipart: [\n      {\n        'content-type': 'application/json',\n        body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n      },\n      { body: 'I am an attachment' },\n      { body: fs.createReadStream('image.png') }\n    ],\n    // alternatively pass an object containing additional options\n    multipart: {\n      chunked: false,\n      data: [\n        {\n          'content-type': 'application/json',\n          body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n        },\n        { body: 'I am an attachment' }\n      ]\n    }\n  },\n  function (error, response, body) {\n    if (error) {\n      return console.error('upload failed:', error);\n    }\n    console.log('Upload successful!  Server responded with:', body);\n  })\n```\n\n[back to top](#table-of-contents)\n\n\n---\n\n\n## HTTP Authentication\n\n```js\nrequest.get('http://some.server.com/').auth('username', 'password', false);\n// or\nrequest.get('http://some.server.com/', {\n  'auth': {\n    'user': 'username',\n    'pass': 'password',\n    'sendImmediately': false\n  }\n});\n// or\nrequest.get('http://some.server.com/').auth(null, null, true, 'bearerToken');\n// or\nrequest.get('http://some.server.com/', {\n  'auth': {\n    'bearer': 'bearerToken'\n  }\n});\n```\n\nIf passed as an option, `auth` should be a hash containing values:\n\n- `user` || `username`\n- `pass` || `password`\n- `sendImmediately` (optional)\n- `bearer` (optional)\n\nThe method form takes parameters\n`auth(username, password, sendImmediately, bearer)`.\n\n`sendImmediately` defaults to `true`, which causes a basic or bearer\nauthentication header to be sent.  If `sendImmediately` is `false`, then\n`request` will retry with a proper authentication header after receiving a\n`401` response from the server (which must contain a `WWW-Authenticate` header\nindicating the required authentication method).\n\nNote that you can also specify basic authentication using the URL itself, as\ndetailed in [RFC 1738](http://www.ietf.org/rfc/rfc1738.txt).  Simply pass the\n`user:password` before the host with an `@` sign:\n\n```js\nvar username = 'username',\n    password = 'password',\n    url = 'http://' + username + ':' + password + '@some.server.com';\n\nrequest({url: url}, function (error, response, body) {\n   // Do more stuff with 'body' here\n});\n```\n\nDigest authentication is supported, but it only works with `sendImmediately`\nset to `false`; otherwise `request` will send basic authentication on the\ninitial request, which will probably cause the request to fail.\n\nBearer authentication is supported, and is activated when the `bearer` value is\navailable. The value may be either a `String` or a `Function` returning a\n`String`. Using a function to supply the bearer token is particularly useful if\nused in conjunction with `defaults` to allow a single function to supply the\nlast known token at the time of sending a request, or to compute one on the fly.\n\n[back to top](#table-of-contents)\n\n\n---\n\n\n## Custom HTTP Headers\n\nHTTP Headers, such as `User-Agent`, can be set in the `options` object.\nIn the example below, we call the github API to find out the number\nof stars and forks for the request repository. This requires a\ncustom `User-Agent` header as well as https.\n\n```js\nvar request = require('request');\n\nvar options = {\n  url: 'https://api.github.com/repos/request/request',\n  headers: {\n    'User-Agent': 'request'\n  }\n};\n\nfunction callback(error, response, body) {\n  if (!error && response.statusCode == 200) {\n    var info = JSON.parse(body);\n    console.log(info.stargazers_count + \" Stars\");\n    console.log(info.forks_count + \" Forks\");\n  }\n}\n\nrequest(options, callback);\n```\n\n[back to top](#table-of-contents)\n\n\n---\n\n\n## OAuth Signing\n\n[OAuth version 1.0](https://tools.ietf.org/html/rfc5849) is supported.  The\ndefault signing algorithm is\n[HMAC-SHA1](https://tools.ietf.org/html/rfc5849#section-3.4.2):\n\n```js\n// OAuth1.0 - 3-legged server side flow (Twitter example)\n// step 1\nvar qs = require('querystring')\n  , oauth =\n    { callback: 'http://mysite.com/callback/'\n    , consumer_key: CONSUMER_KEY\n    , consumer_secret: CONSUMER_SECRET\n    }\n  , url = 'https://api.twitter.com/oauth/request_token'\n  ;\nrequest.post({url:url, oauth:oauth}, function (e, r, body) {\n  // Ideally, you would take the body in the response\n  // and construct a URL that a user clicks on (like a sign in button).\n  // The verifier is only available in the response after a user has\n  // verified with twitter that they are authorizing your app.\n\n  // step 2\n  var req_data = qs.parse(body)\n  var uri = 'https://api.twitter.com/oauth/authenticate'\n    + '?' + qs.stringify({oauth_token: req_data.oauth_token})\n  // redirect the user to the authorize uri\n\n  // step 3\n  // after the user is redirected back to your server\n  var auth_data = qs.parse(body)\n    , oauth =\n      { consumer_key: CONSUMER_KEY\n      , consumer_secret: CONSUMER_SECRET\n      , token: auth_data.oauth_token\n      , token_secret: req_data.oauth_token_secret\n      , verifier: auth_data.oauth_verifier\n      }\n    , url = 'https://api.twitter.com/oauth/access_token'\n    ;\n  request.post({url:url, oauth:oauth}, function (e, r, body) {\n    // ready to make signed requests on behalf of the user\n    var perm_data = qs.parse(body)\n      , oauth =\n        { consumer_key: CONSUMER_KEY\n        , consumer_secret: CONSUMER_SECRET\n        , token: perm_data.oauth_token\n        , token_secret: perm_data.oauth_token_secret\n        }\n      , url = 'https://api.twitter.com/1.1/users/show.json'\n      , qs =\n        { screen_name: perm_data.screen_name\n        , user_id: perm_data.user_id\n        }\n      ;\n    request.get({url:url, oauth:oauth, qs:qs, json:true}, function (e, r, user) {\n      console.log(user)\n    })\n  })\n})\n```\n\nFor [RSA-SHA1 signing](https://tools.ietf.org/html/rfc5849#section-3.4.3), make\nthe following changes to the OAuth options object:\n* Pass `signature_method : 'RSA-SHA1'`\n* Instead of `consumer_secret`, specify a `private_key` string in\n  [PEM format](http://how2ssl.com/articles/working_with_pem_files/)\n\nFor [PLAINTEXT signing](http://oauth.net/core/1.0/#anchor22), make\nthe following changes to the OAuth options object:\n* Pass `signature_method : 'PLAINTEXT'`\n\nTo send OAuth parameters via query params or in a post body as described in The\n[Consumer Request Parameters](http://oauth.net/core/1.0/#consumer_req_param)\nsection of the oauth1 spec:\n* Pass `transport_method : 'query'` or `transport_method : 'body'` in the OAuth\n  options object.\n* `transport_method` defaults to `'header'`\n\nTo use [Request Body Hash](https://oauth.googlecode.com/svn/spec/ext/body_hash/1.0/oauth-bodyhash.html) you can either\n* Manually generate the body hash and pass it as a string `body_hash: '...'`\n* Automatically generate the body hash by passing `body_hash: true`\n\n[back to top](#table-of-contents)\n\n\n---\n\n\n## Proxies\n\nIf you specify a `proxy` option, then the request (and any subsequent\nredirects) will be sent via a connection to the proxy server.\n\nIf your endpoint is an `https` url, and you are using a proxy, then\nrequest will send a `CONNECT` request to the proxy server *first*, and\nthen use the supplied connection to connect to the endpoint.\n\nThat is, first it will make a request like:\n\n```\nHTTP/1.1 CONNECT endpoint-server.com:80\nHost: proxy-server.com\nUser-Agent: whatever user agent you specify\n```\n\nand then the proxy server make a TCP connection to `endpoint-server`\non port `80`, and return a response that looks like:\n\n```\nHTTP/1.1 200 OK\n```\n\nAt this point, the connection is left open, and the client is\ncommunicating directly with the `endpoint-server.com` machine.\n\nSee [the wikipedia page on HTTP Tunneling](https://en.wikipedia.org/wiki/HTTP_tunnel)\nfor more information.\n\nBy default, when proxying `http` traffic, request will simply make a\nstandard proxied `http` request.  This is done by making the `url`\nsection of the initial line of the request a fully qualified url to\nthe endpoint.\n\nFor example, it will make a single request that looks like:\n\n```\nHTTP/1.1 GET http://endpoint-server.com/some-url\nHost: proxy-server.com\nOther-Headers: all go here\n\nrequest body or whatever\n```\n\nBecause a pure \"http over http\" tunnel offers no additional security\nor other features, it is generally simpler to go with a\nstraightforward HTTP proxy in this case.  However, if you would like\nto force a tunneling proxy, you may set the `tunnel` option to `true`.\n\nYou can also make a standard proxied `http` request by explicitly setting\n`tunnel : false`, but **note that this will allow the proxy to see the traffic\nto/from the destination server**.\n\nIf you are using a tunneling proxy, you may set the\n`proxyHeaderWhiteList` to share certain headers with the proxy.\n\nYou can also set the `proxyHeaderExclusiveList` to share certain\nheaders only with the proxy and not with destination host.\n\nBy default, this set is:\n\n```\naccept\naccept-charset\naccept-encoding\naccept-language\naccept-ranges\ncache-control\ncontent-encoding\ncontent-language\ncontent-length\ncontent-location\ncontent-md5\ncontent-range\ncontent-type\nconnection\ndate\nexpect\nmax-forwards\npragma\nproxy-authorization\nreferer\nte\ntransfer-encoding\nuser-agent\nvia\n```\n\nNote that, when using a tunneling proxy, the `proxy-authorization`\nheader and any headers from custom `proxyHeaderExclusiveList` are\n*never* sent to the endpoint server, but only to the proxy server.\n\n\n### Controlling proxy behaviour using environment variables\n\nThe following environment variables are respected by `request`:\n\n * `HTTP_PROXY` / `http_proxy`\n * `HTTPS_PROXY` / `https_proxy`\n * `NO_PROXY` / `no_proxy`\n\nWhen `HTTP_PROXY` / `http_proxy` are set, they will be used to proxy non-SSL requests that do not have an explicit `proxy` configuration option present. Similarly, `HTTPS_PROXY` / `https_proxy` will be respected for SSL requests that do not have an explicit `proxy` configuration option. It is valid to define a proxy in one of the environment variables, but then override it for a specific request, using the `proxy` configuration option. Furthermore, the `proxy` configuration option can be explicitly set to false / null to opt out of proxying altogether for that request.\n\n`request` is also aware of the `NO_PROXY`/`no_proxy` environment variables. These variables provide a granular way to opt out of proxying, on a per-host basis. It should contain a comma separated list of hosts to opt out of proxying. It is also possible to opt of proxying when a particular destination port is used. Finally, the variable may be set to `*` to opt out of the implicit proxy configuration of the other environment variables.\n\nHere's some examples of valid `no_proxy` values:\n\n * `google.com` - don't proxy HTTP/HTTPS requests to Google.\n * `google.com:443` - don't proxy HTTPS requests to Google, but *do* proxy HTTP requests to Google.\n * `google.com:443, yahoo.com:80` - don't proxy HTTPS requests to Google, and don't proxy HTTP requests to Yahoo!\n * `*` - ignore `https_proxy`/`http_proxy` environment variables altogether.\n\n[back to top](#table-of-contents)\n\n\n---\n\n\n## UNIX Domain Sockets\n\n`request` supports making requests to [UNIX Domain Sockets](https://en.wikipedia.org/wiki/Unix_domain_socket). To make one, use the following URL scheme:\n\n```js\n/* Pattern */ 'http://unix:SOCKET:PATH'\n/* Example */ request.get('http://unix:/absolute/path/to/unix.socket:/request/path')\n```\n\nNote: The `SOCKET` path is assumed to be absolute to the root of the host file system.\n\n[back to top](#table-of-contents)\n\n\n---\n\n\n## TLS/SSL Protocol\n\nTLS/SSL Protocol options, such as `cert`, `key` and `passphrase`, can be\nset directly in `options` object, in the `agentOptions` property of the `options` object, or even in `https.globalAgent.options`. Keep in mind that, although `agentOptions` allows for a slightly wider range of configurations, the recommended way is via `options` object directly, as using `agentOptions` or `https.globalAgent.options` would not be applied in the same way in proxied environments (as data travels through a TLS connection instead of an http/https agent).\n\n```js\nvar fs = require('fs')\n    , path = require('path')\n    , certFile = path.resolve(__dirname, 'ssl/client.crt')\n    , keyFile = path.resolve(__dirname, 'ssl/client.key')\n    , caFile = path.resolve(__dirname, 'ssl/ca.cert.pem')\n    , request = require('request');\n\nvar options = {\n    url: 'https://api.some-server.com/',\n    cert: fs.readFileSync(certFile),\n    key: fs.readFileSync(keyFile),\n    passphrase: 'password',\n    ca: fs.readFileSync(caFile)\n};\n\nrequest.get(options);\n```\n\n### Using `options.agentOptions`\n\nIn the example below, we call an API requires client side SSL certificate\n(in PEM format) with passphrase protected private key (in PEM format) and disable the SSLv3 protocol:\n\n```js\nvar fs = require('fs')\n    , path = require('path')\n    , certFile = path.resolve(__dirname, 'ssl/client.crt')\n    , keyFile = path.resolve(__dirname, 'ssl/client.key')\n    , request = require('request');\n\nvar options = {\n    url: 'https://api.some-server.com/',\n    agentOptions: {\n        cert: fs.readFileSync(certFile),\n        key: fs.readFileSync(keyFile),\n        // Or use `pfx` property replacing `cert` and `key` when using private key, certificate and CA certs in PFX or PKCS12 format:\n        // pfx: fs.readFileSync(pfxFilePath),\n        passphrase: 'password',\n        securityOptions: 'SSL_OP_NO_SSLv3'\n    }\n};\n\nrequest.get(options);\n```\n\nIt is able to force using SSLv3 only by specifying `secureProtocol`:\n\n```js\nrequest.get({\n    url: 'https://api.some-server.com/',\n    agentOptions: {\n        secureProtocol: 'SSLv3_method'\n    }\n});\n```\n\nIt is possible to accept other certificates than those signed by generally allowed Certificate Authorities (CAs).\nThis can be useful, for example,  when using self-signed certificates.\nTo require a different root certificate, you can specify the signing CA by adding the contents of the CA's certificate file to the `agentOptions`.\nThe certificate the domain presents must be signed by the root certificate specified:\n\n```js\nrequest.get({\n    url: 'https://api.some-server.com/',\n    agentOptions: {\n        ca: fs.readFileSync('ca.cert.pem')\n    }\n});\n```\n\n[back to top](#table-of-contents)\n\n\n---\n\n## Support for HAR 1.2\n\nThe `options.har` property will override the values: `url`, `method`, `qs`, `headers`, `form`, `formData`, `body`, `json`, as well as construct multipart data and read files from disk when `request.postData.params[].fileName` is present without a matching `value`.\n\na validation step will check if the HAR Request format matches the latest spec (v1.2) and will skip parsing if not matching.\n\n```js\n  var request = require('request')\n  request({\n    // will be ignored\n    method: 'GET',\n    uri: 'http://www.google.com',\n\n    // HTTP Archive Request Object\n    har: {\n      url: 'http://www.mockbin.com/har',\n      method: 'POST',\n      headers: [\n        {\n          name: 'content-type',\n          value: 'application/x-www-form-urlencoded'\n        }\n      ],\n      postData: {\n        mimeType: 'application/x-www-form-urlencoded',\n        params: [\n          {\n            name: 'foo',\n            value: 'bar'\n          },\n          {\n            name: 'hello',\n            value: 'world'\n          }\n        ]\n      }\n    }\n  })\n\n  // a POST request will be sent to http://www.mockbin.com\n  // with body an application/x-www-form-urlencoded body:\n  // foo=bar&hello=world\n```\n\n[back to top](#table-of-contents)\n\n\n---\n\n## request(options, callback)\n\nThe first argument can be either a `url` or an `options` object. The only required option is `uri`; all others are optional.\n\n- `uri` || `url` - fully qualified uri or a parsed url object from `url.parse()`\n- `baseUrl` - fully qualified uri string used as the base url. Most useful with `request.defaults`, for example when you want to do many requests to the same domain.  If `baseUrl` is `https://example.com/api/`, then requesting `/end/point?test=true` will fetch `https://example.com/api/end/point?test=true`. When `baseUrl` is given, `uri` must also be a string.\n- `method` - http method (default: `\"GET\"`)\n- `headers` - http headers (default: `{}`)\n\n---\n\n- `qs` - object containing querystring values to be appended to the `uri`\n- `qsParseOptions` - object containing options to pass to the [qs.parse](https://github.com/hapijs/qs#parsing-objects) method. Alternatively pass options to the [querystring.parse](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_parse_str_sep_eq_options) method using this format `{sep:';', eq:':', options:{}}`\n- `qsStringifyOptions` - object containing options to pass to the [qs.stringify](https://github.com/hapijs/qs#stringifying) method. Alternatively pass options to the  [querystring.stringify](https://nodejs.org/docs/v0.12.0/api/querystring.html#querystring_querystring_stringify_obj_sep_eq_options) method using this format `{sep:';', eq:':', options:{}}`. For example, to change the way arrays are converted to query strings using the `qs` module pass the `arrayFormat` option with one of `indices|brackets|repeat`\n- `useQuerystring` - If true, use `querystring` to stringify and parse\n  querystrings, otherwise use `qs` (default: `false`).  Set this option to\n  `true` if you need arrays to be serialized as `foo=bar&foo=baz` instead of the\n  default `foo[0]=bar&foo[1]=baz`.\n\n---\n\n- `body` - entity body for PATCH, POST and PUT requests. Must be a `Buffer`, `String` or `ReadStream`. If `json` is `true`, then `body` must be a JSON-serializable object.\n- `form` - when passed an object or a querystring, this sets `body` to a querystring representation of value, and adds `Content-type: application/x-www-form-urlencoded` header. When passed no options, a `FormData` instance is returned (and is piped to request). See \"Forms\" section above.\n- `formData` - Data to pass for a `multipart/form-data` request. See\n  [Forms](#forms) section above.\n- `multipart` - array of objects which contain their own headers and `body`\n  attributes. Sends a `multipart/related` request. See [Forms](#forms) section\n  above.\n  - Alternatively you can pass in an object `{chunked: false, data: []}` where\n    `chunked` is used to specify whether the request is sent in\n    [chunked transfer encoding](https://en.wikipedia.org/wiki/Chunked_transfer_encoding)\n    In non-chunked requests, data items with body streams are not allowed.\n- `preambleCRLF` - append a newline/CRLF before the boundary of your `multipart/form-data` request.\n- `postambleCRLF` - append a newline/CRLF at the end of the boundary of your `multipart/form-data` request.\n- `json` - sets `body` to JSON representation of value and adds `Content-type: application/json` header.  Additionally, parses the response body as JSON.\n- `jsonReviver` - a [reviver function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse) that will be passed to `JSON.parse()` when parsing a JSON response body.\n- `jsonReplacer` - a [replacer function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify) that will be passed to `JSON.stringify()` when stringifying a JSON request body.\n\n---\n\n- `auth` - A hash containing values `user` || `username`, `pass` || `password`, and `sendImmediately` (optional).  See documentation above.\n- `oauth` - Options for OAuth HMAC-SHA1 signing. See documentation above.\n- `hawk` - Options for [Hawk signing](https://github.com/hueniverse/hawk). The `credentials` key must contain the necessary signing info, [see hawk docs for details](https://github.com/hueniverse/hawk#usage-example).\n- `aws` - `object` containing AWS signing information. Should have the properties `key`, `secret`. Also requires the property `bucket`, unless you’re specifying your `bucket` as part of the path, or the request doesn’t use a bucket (i.e. GET Services). If you want to use AWS sign version 4 use the parameter `sign_version` with value `4` otherwise the default is version 2. **Note:** you need to `npm install aws4` first.\n- `httpSignature` - Options for the [HTTP Signature Scheme](https://github.com/joyent/node-http-signature/blob/master/http_signing.md) using [Joyent's library](https://github.com/joyent/node-http-signature). The `keyId` and `key` properties must be specified. See the docs for other options.\n\n---\n\n- `followRedirect` - follow HTTP 3xx responses as redirects (default: `true`). This property can also be implemented as function which gets `response` object as a single argument and should return `true` if redirects should continue or `false` otherwise.\n- `followAllRedirects` - follow non-GET HTTP 3xx responses as redirects (default: `false`)\n- `maxRedirects` - the maximum number of redirects to follow (default: `10`)\n- `removeRefererHeader` - removes the referer header when a redirect happens (default: `false`). **Note:** if true, referer header set in the initial request is preserved during redirect chain.\n\n---\n\n- `encoding` - Encoding to be used on `setEncoding` of response data. If `null`, the `body` is returned as a `Buffer`. Anything else **(including the default value of `undefined`)** will be passed as the [encoding](http://nodejs.org/api/buffer.html#buffer_buffer) parameter to `toString()` (meaning this is effectively `utf8` by default). (**Note:** if you expect binary data, you should set `encoding: null`.)\n- `gzip` - If `true`, add an `Accept-Encoding` header to request compressed content encodings from the server (if not already present) and decode supported content encodings in the response.  **Note:** Automatic decoding of the response content is performed on the body data returned through `request` (both through the `request` stream and passed to the callback function) but is not performed on the `response` stream (available from the `response` event) which is the unmodified `http.IncomingMessage` object which may contain compressed data. See example below.\n- `jar` - If `true`, remember cookies for future use (or define your custom cookie jar; see examples section)\n\n---\n\n- `agent` - `http(s).Agent` instance to use\n- `agentClass` - alternatively specify your agent's class name\n- `agentOptions` - and pass its options. **Note:** for HTTPS see [tls API doc for TLS/SSL options](http://nodejs.org/api/tls.html#tls_tls_connect_options_callback) and the [documentation above](#using-optionsagentoptions).\n- `forever` - set to `true` to use the [forever-agent](https://github.com/request/forever-agent) **Note:** Defaults to `http(s).Agent({keepAlive:true})` in node 0.12+\n- `pool` - An object describing which agents to use for the request. If this option is omitted the request will use the global agent (as long as your options allow for it). Otherwise, request will search the pool for your custom agent. If no custom agent is found, a new agent will be created and added to the pool. **Note:** `pool` is used only when the `agent` option is not specified.\n  - A `maxSockets` property can also be provided on the `pool` object to set the max number of sockets for all agents created (ex: `pool: {maxSockets: Infinity}`).\n  - Note that if you are sending multiple requests in a loop and creating\n    multiple new `pool` objects, `maxSockets` will not work as intended.  To\n    work around this, either use [`request.defaults`](#requestdefaultsoptions)\n    with your pool options or create the pool object with the `maxSockets`\n    property outside of the loop.\n- `timeout` - Integer containing the number of milliseconds to wait for a\nserver to send response headers (and start the response body) before aborting\nthe request. Note that if the underlying TCP connection cannot be established,\nthe OS-wide TCP connection timeout will overrule the `timeout` option ([the\ndefault in Linux can be anywhere from 20-120 seconds][linux-timeout]).\n\n[linux-timeout]: http://www.sekuda.com/overriding_the_default_linux_kernel_20_second_tcp_socket_connect_timeout\n\n---\n\n- `localAddress` - Local interface to bind for network connections.\n- `proxy` - An HTTP proxy to be used. Supports proxy Auth with Basic Auth, identical to support for the `url` parameter (by embedding the auth info in the `uri`)\n- `strictSSL` - If `true`, requires SSL certificates be valid. **Note:** to use your own certificate authority, you need to specify an agent that was created with that CA as an option.\n- `tunnel` - controls the behavior of\n  [HTTP `CONNECT` tunneling](https://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_tunneling)\n  as follows:\n   - `undefined` (default) - `true` if the destination is `https`, `false` otherwise\n   - `true` - always tunnel to the destination by making a `CONNECT` request to\n     the proxy\n   - `false` - request the destination as a `GET` request.\n- `proxyHeaderWhiteList` - A whitelist of headers to send to a\n  tunneling proxy.\n- `proxyHeaderExclusiveList` - A whitelist of headers to send\n  exclusively to a tunneling proxy and not to destination.\n\n---\n\n- `time` - If `true`, the request-response cycle (including all redirects) is timed at millisecond resolution, and the result provided on the response's `elapsedTime` property.\n- `har` - A [HAR 1.2 Request Object](http://www.softwareishard.com/blog/har-12-spec/#request), will be processed from HAR format into options overwriting matching values *(see the [HAR 1.2 section](#support-for-har-1.2) for details)*\n- `callback` - alternatively pass the request's callback in the options object\n\nThe callback argument gets 3 arguments:\n\n1. An `error` when applicable (usually from [`http.ClientRequest`](http://nodejs.org/api/http.html#http_class_http_clientrequest) object)\n2. An [`http.IncomingMessage`](https://nodejs.org/api/http.html#http_class_http_incomingmessage) object\n3. The third is the `response` body (`String` or `Buffer`, or JSON object if the `json` option is supplied)\n\n[back to top](#table-of-contents)\n\n\n---\n\n## Convenience methods\n\nThere are also shorthand methods for different HTTP METHODs and some other conveniences.\n\n\n### request.defaults(options)\n\nThis method **returns a wrapper** around the normal request API that defaults\nto whatever options you pass to it.\n\n**Note:** `request.defaults()` **does not** modify the global request API;\ninstead, it **returns a wrapper** that has your default settings applied to it.\n\n**Note:** You can call `.defaults()` on the wrapper that is returned from\n`request.defaults` to add/override defaults that were previously defaulted.\n\nFor example:\n```js\n//requests using baseRequest() will set the 'x-token' header\nvar baseRequest = request.defaults({\n  headers: {'x-token': 'my-token'}\n})\n\n//requests using specialRequest() will include the 'x-token' header set in\n//baseRequest and will also include the 'special' header\nvar specialRequest = baseRequest.defaults({\n  headers: {special: 'special value'}\n})\n```\n\n### request.put\n\nSame as `request()`, but defaults to `method: \"PUT\"`.\n\n```js\nrequest.put(url)\n```\n\n### request.patch\n\nSame as `request()`, but defaults to `method: \"PATCH\"`.\n\n```js\nrequest.patch(url)\n```\n\n### request.post\n\nSame as `request()`, but defaults to `method: \"POST\"`.\n\n```js\nrequest.post(url)\n```\n\n### request.head\n\nSame as `request()`, but defaults to `method: \"HEAD\"`.\n\n```js\nrequest.head(url)\n```\n\n### request.del / request.delete\n\nSame as `request()`, but defaults to `method: \"DELETE\"`.\n\n```js\nrequest.del(url)\nrequest.delete(url)\n```\n\n### request.get\n\nSame as `request()` (for uniformity).\n\n```js\nrequest.get(url)\n```\n### request.cookie\n\nFunction that creates a new cookie.\n\n```js\nrequest.cookie('key1=value1')\n```\n### request.jar()\n\nFunction that creates a new cookie jar.\n\n```js\nrequest.jar()\n```\n\n[back to top](#table-of-contents)\n\n\n---\n\n\n## Debugging\n\nThere are at least three ways to debug the operation of `request`:\n\n1. Launch the node process like `NODE_DEBUG=request node script.js`\n   (`lib,request,otherlib` works too).\n\n2. Set `require('request').debug = true` at any time (this does the same thing\n   as #1).\n\n3. Use the [request-debug module](https://github.com/request/request-debug) to\n   view request and response headers and bodies.\n\n[back to top](#table-of-contents)\n\n\n---\n\n## Timeouts\n\nMost requests to external servers should have a timeout attached, in case the\nserver is not responding in a timely manner. Without a timeout, your code may\nhave a socket open/consume resources for minutes or more.\n\nThere are two main types of timeouts: **connection timeouts** and **read\ntimeouts**. A connect timeout occurs if the timeout is hit while your client is\nattempting to establish a connection to a remote machine (corresponding to the\n[connect() call][connect] on the socket). A read timeout occurs any time the\nserver is too slow to send back a part of the response.\n\nThese two situations have widely different implications for what went wrong\nwith the request, so it's useful to be able to distinguish them. You can detect\ntimeout errors by checking `err.code` for an 'ETIMEDOUT' value. Further, you\ncan detect whether the timeout was a connection timeout by checking if the\n`err.connect` property is set to `true`.\n\n```js\nrequest.get('http://10.255.255.1', {timeout: 1500}, function(err) {\n    console.log(err.code === 'ETIMEDOUT');\n    // Set to `true` if the timeout was a connection timeout, `false` or\n    // `undefined` otherwise.\n    console.log(err.connect === true);\n    process.exit(0);\n});\n```\n\n[connect]: http://linux.die.net/man/2/connect\n\n## Examples:\n\n```js\n  var request = require('request')\n    , rand = Math.floor(Math.random()*100000000).toString()\n    ;\n  request(\n    { method: 'PUT'\n    , uri: 'http://mikeal.iriscouch.com/testjs/' + rand\n    , multipart:\n      [ { 'content-type': 'application/json'\n        ,  body: JSON.stringify({foo: 'bar', _attachments: {'message.txt': {follows: true, length: 18, 'content_type': 'text/plain' }}})\n        }\n      , { body: 'I am an attachment' }\n      ]\n    }\n  , function (error, response, body) {\n      if(response.statusCode == 201){\n        console.log('document saved as: http://mikeal.iriscouch.com/testjs/'+ rand)\n      } else {\n        console.log('error: '+ response.statusCode)\n        console.log(body)\n      }\n    }\n  )\n```\n\nFor backwards-compatibility, response compression is not supported by default.\nTo accept gzip-compressed responses, set the `gzip` option to `true`.  Note\nthat the body data passed through `request` is automatically decompressed\nwhile the response object is unmodified and will contain compressed data if\nthe server sent a compressed response.\n\n```js\n  var request = require('request')\n  request(\n    { method: 'GET'\n    , uri: 'http://www.google.com'\n    , gzip: true\n    }\n  , function (error, response, body) {\n      // body is the decompressed response body\n      console.log('server encoded the data as: ' + (response.headers['content-encoding'] || 'identity'))\n      console.log('the decoded data is: ' + body)\n    }\n  ).on('data', function(data) {\n    // decompressed data as it is received\n    console.log('decoded chunk: ' + data)\n  })\n  .on('response', function(response) {\n    // unmodified http.IncomingMessage object\n    response.on('data', function(data) {\n      // compressed data as it is received\n      console.log('received ' + data.length + ' bytes of compressed data')\n    })\n  })\n```\n\nCookies are disabled by default (else, they would be used in subsequent requests). To enable cookies, set `jar` to `true` (either in `defaults` or `options`).\n\n```js\nvar request = request.defaults({jar: true})\nrequest('http://www.google.com', function () {\n  request('http://images.google.com')\n})\n```\n\nTo use a custom cookie jar (instead of `request`’s global cookie jar), set `jar` to an instance of `request.jar()` (either in `defaults` or `options`)\n\n```js\nvar j = request.jar()\nvar request = request.defaults({jar:j})\nrequest('http://www.google.com', function () {\n  request('http://images.google.com')\n})\n```\n\nOR\n\n```js\nvar j = request.jar();\nvar cookie = request.cookie('key1=value1');\nvar url = 'http://www.google.com';\nj.setCookie(cookie, url);\nrequest({url: url, jar: j}, function () {\n  request('http://images.google.com')\n})\n```\n\nTo use a custom cookie store (such as a\n[`FileCookieStore`](https://github.com/mitsuru/tough-cookie-filestore)\nwhich supports saving to and restoring from JSON files), pass it as a parameter\nto `request.jar()`:\n\n```js\nvar FileCookieStore = require('tough-cookie-filestore');\n// NOTE - currently the 'cookies.json' file must already exist!\nvar j = request.jar(new FileCookieStore('cookies.json'));\nrequest = request.defaults({ jar : j })\nrequest('http://www.google.com', function() {\n  request('http://images.google.com')\n})\n```\n\nThe cookie store must be a\n[`tough-cookie`](https://github.com/SalesforceEng/tough-cookie)\nstore and it must support synchronous operations; see the\n[`CookieStore` API docs](https://github.com/SalesforceEng/tough-cookie#cookiestore-api)\nfor details.\n\nTo inspect your cookie jar after a request:\n\n```js\nvar j = request.jar()\nrequest({url: 'http://www.google.com', jar: j}, function () {\n  var cookie_string = j.getCookieString(url); // \"key1=value1; key2=value2; ...\"\n  var cookies = j.getCookies(url);\n  // [{key: 'key1', value: 'value1', domain: \"www.google.com\", ...}, ...]\n})\n```\n\n[back to top](#table-of-contents)\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/request/request.git"
-  },
-  "scripts": {
-    "lint": "eslint lib/ *.js tests/ && echo Lint passed.",
-    "test": "npm run lint && npm run test-ci && npm run test-browser",
-    "test-browser": "node tests/browser/start.js",
-    "test-ci": "taper tests/test-*.js",
-    "test-cov": "istanbul cover tape tests/test-*.js"
-  },
-  "tags": [
-    "http",
-    "simple",
-    "util",
-    "utility"
-  ],
-  "version": "2.73.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/request.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/request.js
deleted file mode 100644
index 8267c125375af48623d73411cecadcbd85148af6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/request/request.js
+++ /dev/null
@@ -1,1434 +0,0 @@
-'use strict'
-
-var http = require('http')
-  , https = require('https')
-  , url = require('url')
-  , util = require('util')
-  , stream = require('stream')
-  , zlib = require('zlib')
-  , bl = require('bl')
-  , hawk = require('hawk')
-  , aws2 = require('aws-sign2')
-  , aws4 = require('aws4')
-  , httpSignature = require('http-signature')
-  , mime = require('mime-types')
-  , stringstream = require('stringstream')
-  , caseless = require('caseless')
-  , ForeverAgent = require('forever-agent')
-  , FormData = require('form-data')
-  , extend = require('extend')
-  , isstream = require('isstream')
-  , isTypedArray = require('is-typedarray').strict
-  , helpers = require('./lib/helpers')
-  , cookies = require('./lib/cookies')
-  , getProxyFromURI = require('./lib/getProxyFromURI')
-  , Querystring = require('./lib/querystring').Querystring
-  , Har = require('./lib/har').Har
-  , Auth = require('./lib/auth').Auth
-  , OAuth = require('./lib/oauth').OAuth
-  , Multipart = require('./lib/multipart').Multipart
-  , Redirect = require('./lib/redirect').Redirect
-  , Tunnel = require('./lib/tunnel').Tunnel
-
-var safeStringify = helpers.safeStringify
-  , isReadStream = helpers.isReadStream
-  , toBase64 = helpers.toBase64
-  , defer = helpers.defer
-  , copy = helpers.copy
-  , version = helpers.version
-  , globalCookieJar = cookies.jar()
-
-
-var globalPool = {}
-
-function filterForNonReserved(reserved, options) {
-  // Filter out properties that are not reserved.
-  // Reserved values are passed in at call site.
-
-  var object = {}
-  for (var i in options) {
-    var notReserved = (reserved.indexOf(i) === -1)
-    if (notReserved) {
-      object[i] = options[i]
-    }
-  }
-  return object
-}
-
-function filterOutReservedFunctions(reserved, options) {
-  // Filter out properties that are functions and are reserved.
-  // Reserved values are passed in at call site.
-
-  var object = {}
-  for (var i in options) {
-    var isReserved = !(reserved.indexOf(i) === -1)
-    var isFunction = (typeof options[i] === 'function')
-    if (!(isReserved && isFunction)) {
-      object[i] = options[i]
-    }
-  }
-  return object
-
-}
-
-// Return a simpler request object to allow serialization
-function requestToJSON() {
-  var self = this
-  return {
-    uri: self.uri,
-    method: self.method,
-    headers: self.headers
-  }
-}
-
-// Return a simpler response object to allow serialization
-function responseToJSON() {
-  var self = this
-  return {
-    statusCode: self.statusCode,
-    body: self.body,
-    headers: self.headers,
-    request: requestToJSON.call(self.request)
-  }
-}
-
-function Request (options) {
-  // if given the method property in options, set property explicitMethod to true
-
-  // extend the Request instance with any non-reserved properties
-  // remove any reserved functions from the options object
-  // set Request instance to be readable and writable
-  // call init
-
-  var self = this
-
-  // start with HAR, then override with additional options
-  if (options.har) {
-    self._har = new Har(self)
-    options = self._har.options(options)
-  }
-
-  stream.Stream.call(self)
-  var reserved = Object.keys(Request.prototype)
-  var nonReserved = filterForNonReserved(reserved, options)
-
-  extend(self, nonReserved)
-  options = filterOutReservedFunctions(reserved, options)
-
-  self.readable = true
-  self.writable = true
-  if (options.method) {
-    self.explicitMethod = true
-  }
-  self._qs = new Querystring(self)
-  self._auth = new Auth(self)
-  self._oauth = new OAuth(self)
-  self._multipart = new Multipart(self)
-  self._redirect = new Redirect(self)
-  self._tunnel = new Tunnel(self)
-  self.init(options)
-}
-
-util.inherits(Request, stream.Stream)
-
-// Debugging
-Request.debug = process.env.NODE_DEBUG && /\brequest\b/.test(process.env.NODE_DEBUG)
-function debug() {
-  if (Request.debug) {
-    console.error('REQUEST %s', util.format.apply(util, arguments))
-  }
-}
-Request.prototype.debug = debug
-
-Request.prototype.init = function (options) {
-  // init() contains all the code to setup the request object.
-  // the actual outgoing request is not started until start() is called
-  // this function is called from both the constructor and on redirect.
-  var self = this
-  if (!options) {
-    options = {}
-  }
-  self.headers = self.headers ? copy(self.headers) : {}
-
-  // Delete headers with value undefined since they break
-  // ClientRequest.OutgoingMessage.setHeader in node 0.12
-  for (var headerName in self.headers) {
-    if (typeof self.headers[headerName] === 'undefined') {
-      delete self.headers[headerName]
-    }
-  }
-
-  caseless.httpify(self, self.headers)
-
-  if (!self.method) {
-    self.method = options.method || 'GET'
-  }
-  if (!self.localAddress) {
-    self.localAddress = options.localAddress
-  }
-
-  self._qs.init(options)
-
-  debug(options)
-  if (!self.pool && self.pool !== false) {
-    self.pool = globalPool
-  }
-  self.dests = self.dests || []
-  self.__isRequestRequest = true
-
-  // Protect against double callback
-  if (!self._callback && self.callback) {
-    self._callback = self.callback
-    self.callback = function () {
-      if (self._callbackCalled) {
-        return // Print a warning maybe?
-      }
-      self._callbackCalled = true
-      self._callback.apply(self, arguments)
-    }
-    self.on('error', self.callback.bind())
-    self.on('complete', self.callback.bind(self, null))
-  }
-
-  // People use this property instead all the time, so support it
-  if (!self.uri && self.url) {
-    self.uri = self.url
-    delete self.url
-  }
-
-  // If there's a baseUrl, then use it as the base URL (i.e. uri must be
-  // specified as a relative path and is appended to baseUrl).
-  if (self.baseUrl) {
-    if (typeof self.baseUrl !== 'string') {
-      return self.emit('error', new Error('options.baseUrl must be a string'))
-    }
-
-    if (typeof self.uri !== 'string') {
-      return self.emit('error', new Error('options.uri must be a string when using options.baseUrl'))
-    }
-
-    if (self.uri.indexOf('//') === 0 || self.uri.indexOf('://') !== -1) {
-      return self.emit('error', new Error('options.uri must be a path when using options.baseUrl'))
-    }
-
-    // Handle all cases to make sure that there's only one slash between
-    // baseUrl and uri.
-    var baseUrlEndsWithSlash = self.baseUrl.lastIndexOf('/') === self.baseUrl.length - 1
-    var uriStartsWithSlash = self.uri.indexOf('/') === 0
-
-    if (baseUrlEndsWithSlash && uriStartsWithSlash) {
-      self.uri = self.baseUrl + self.uri.slice(1)
-    } else if (baseUrlEndsWithSlash || uriStartsWithSlash) {
-      self.uri = self.baseUrl + self.uri
-    } else if (self.uri === '') {
-      self.uri = self.baseUrl
-    } else {
-      self.uri = self.baseUrl + '/' + self.uri
-    }
-    delete self.baseUrl
-  }
-
-  // A URI is needed by this point, emit error if we haven't been able to get one
-  if (!self.uri) {
-    return self.emit('error', new Error('options.uri is a required argument'))
-  }
-
-  // If a string URI/URL was given, parse it into a URL object
-  if (typeof self.uri === 'string') {
-    self.uri = url.parse(self.uri)
-  }
-
-  // Some URL objects are not from a URL parsed string and need href added
-  if (!self.uri.href) {
-    self.uri.href = url.format(self.uri)
-  }
-
-  // DEPRECATED: Warning for users of the old Unix Sockets URL Scheme
-  if (self.uri.protocol === 'unix:') {
-    return self.emit('error', new Error('`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`'))
-  }
-
-  // Support Unix Sockets
-  if (self.uri.host === 'unix') {
-    self.enableUnixSocket()
-  }
-
-  if (self.strictSSL === false) {
-    self.rejectUnauthorized = false
-  }
-
-  if (!self.uri.pathname) {self.uri.pathname = '/'}
-
-  if (!(self.uri.host || (self.uri.hostname && self.uri.port)) && !self.uri.isUnix) {
-    // Invalid URI: it may generate lot of bad errors, like 'TypeError: Cannot call method `indexOf` of undefined' in CookieJar
-    // Detect and reject it as soon as possible
-    var faultyUri = url.format(self.uri)
-    var message = 'Invalid URI "' + faultyUri + '"'
-    if (Object.keys(options).length === 0) {
-      // No option ? This can be the sign of a redirect
-      // As this is a case where the user cannot do anything (they didn't call request directly with this URL)
-      // they should be warned that it can be caused by a redirection (can save some hair)
-      message += '. This can be caused by a crappy redirection.'
-    }
-    // This error was fatal
-    self.abort()
-    return self.emit('error', new Error(message))
-  }
-
-  if (!self.hasOwnProperty('proxy')) {
-    self.proxy = getProxyFromURI(self.uri)
-  }
-
-  self.tunnel = self._tunnel.isEnabled()
-  if (self.proxy) {
-    self._tunnel.setup(options)
-  }
-
-  self._redirect.onRequest(options)
-
-  self.setHost = false
-  if (!self.hasHeader('host')) {
-    var hostHeaderName = self.originalHostHeaderName || 'host'
-    self.setHeader(hostHeaderName, self.uri.hostname)
-    if (self.uri.port) {
-      if ( !(self.uri.port === 80 && self.uri.protocol === 'http:') &&
-           !(self.uri.port === 443 && self.uri.protocol === 'https:') ) {
-        self.setHeader(hostHeaderName, self.getHeader('host') + (':' + self.uri.port) )
-      }
-    }
-    self.setHost = true
-  }
-
-  self.jar(self._jar || options.jar)
-
-  if (!self.uri.port) {
-    if (self.uri.protocol === 'http:') {self.uri.port = 80}
-    else if (self.uri.protocol === 'https:') {self.uri.port = 443}
-  }
-
-  if (self.proxy && !self.tunnel) {
-    self.port = self.proxy.port
-    self.host = self.proxy.hostname
-  } else {
-    self.port = self.uri.port
-    self.host = self.uri.hostname
-  }
-
-  if (options.form) {
-    self.form(options.form)
-  }
-
-  if (options.formData) {
-    var formData = options.formData
-    var requestForm = self.form()
-    var appendFormValue = function (key, value) {
-      if (value && value.hasOwnProperty('value') && value.hasOwnProperty('options')) {
-        requestForm.append(key, value.value, value.options)
-      } else {
-        requestForm.append(key, value)
-      }
-    }
-    for (var formKey in formData) {
-      if (formData.hasOwnProperty(formKey)) {
-        var formValue = formData[formKey]
-        if (formValue instanceof Array) {
-          for (var j = 0; j < formValue.length; j++) {
-            appendFormValue(formKey, formValue[j])
-          }
-        } else {
-          appendFormValue(formKey, formValue)
-        }
-      }
-    }
-  }
-
-  if (options.qs) {
-    self.qs(options.qs)
-  }
-
-  if (self.uri.path) {
-    self.path = self.uri.path
-  } else {
-    self.path = self.uri.pathname + (self.uri.search || '')
-  }
-
-  if (self.path.length === 0) {
-    self.path = '/'
-  }
-
-  // Auth must happen last in case signing is dependent on other headers
-  if (options.aws) {
-    self.aws(options.aws)
-  }
-
-  if (options.hawk) {
-    self.hawk(options.hawk)
-  }
-
-  if (options.httpSignature) {
-    self.httpSignature(options.httpSignature)
-  }
-
-  if (options.auth) {
-    if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) {
-      options.auth.user = options.auth.username
-    }
-    if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) {
-      options.auth.pass = options.auth.password
-    }
-
-    self.auth(
-      options.auth.user,
-      options.auth.pass,
-      options.auth.sendImmediately,
-      options.auth.bearer
-    )
-  }
-
-  if (self.gzip && !self.hasHeader('accept-encoding')) {
-    self.setHeader('accept-encoding', 'gzip, deflate')
-  }
-
-  if (self.uri.auth && !self.hasHeader('authorization')) {
-    var uriAuthPieces = self.uri.auth.split(':').map(function(item) {return self._qs.unescape(item)})
-    self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true)
-  }
-
-  if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) {
-    var proxyAuthPieces = self.proxy.auth.split(':').map(function(item) {return self._qs.unescape(item)})
-    var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':'))
-    self.setHeader('proxy-authorization', authHeader)
-  }
-
-  if (self.proxy && !self.tunnel) {
-    self.path = (self.uri.protocol + '//' + self.uri.host + self.path)
-  }
-
-  if (options.json) {
-    self.json(options.json)
-  }
-  if (options.multipart) {
-    self.multipart(options.multipart)
-  }
-
-  if (options.time) {
-    self.timing = true
-    self.elapsedTime = self.elapsedTime || 0
-  }
-
-  function setContentLength () {
-    if (isTypedArray(self.body)) {
-      self.body = new Buffer(self.body)
-    }
-
-    if (!self.hasHeader('content-length')) {
-      var length
-      if (typeof self.body === 'string') {
-        length = Buffer.byteLength(self.body)
-      }
-      else if (Array.isArray(self.body)) {
-        length = self.body.reduce(function (a, b) {return a + b.length}, 0)
-      }
-      else {
-        length = self.body.length
-      }
-
-      if (length) {
-        self.setHeader('content-length', length)
-      } else {
-        self.emit('error', new Error('Argument error, options.body.'))
-      }
-    }
-  }
-  if (self.body && !isstream(self.body)) {
-    setContentLength()
-  }
-
-  if (options.oauth) {
-    self.oauth(options.oauth)
-  } else if (self._oauth.params && self.hasHeader('authorization')) {
-    self.oauth(self._oauth.params)
-  }
-
-  var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol
-    , defaultModules = {'http:':http, 'https:':https}
-    , httpModules = self.httpModules || {}
-
-  self.httpModule = httpModules[protocol] || defaultModules[protocol]
-
-  if (!self.httpModule) {
-    return self.emit('error', new Error('Invalid protocol: ' + protocol))
-  }
-
-  if (options.ca) {
-    self.ca = options.ca
-  }
-
-  if (!self.agent) {
-    if (options.agentOptions) {
-      self.agentOptions = options.agentOptions
-    }
-
-    if (options.agentClass) {
-      self.agentClass = options.agentClass
-    } else if (options.forever) {
-      var v = version()
-      // use ForeverAgent in node 0.10- only
-      if (v.major === 0 && v.minor <= 10) {
-        self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL
-      } else {
-        self.agentClass = self.httpModule.Agent
-        self.agentOptions = self.agentOptions || {}
-        self.agentOptions.keepAlive = true
-      }
-    } else {
-      self.agentClass = self.httpModule.Agent
-    }
-  }
-
-  if (self.pool === false) {
-    self.agent = false
-  } else {
-    self.agent = self.agent || self.getNewAgent()
-  }
-
-  self.on('pipe', function (src) {
-    if (self.ntick && self._started) {
-      self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.'))
-    }
-    self.src = src
-    if (isReadStream(src)) {
-      if (!self.hasHeader('content-type')) {
-        self.setHeader('content-type', mime.lookup(src.path))
-      }
-    } else {
-      if (src.headers) {
-        for (var i in src.headers) {
-          if (!self.hasHeader(i)) {
-            self.setHeader(i, src.headers[i])
-          }
-        }
-      }
-      if (self._json && !self.hasHeader('content-type')) {
-        self.setHeader('content-type', 'application/json')
-      }
-      if (src.method && !self.explicitMethod) {
-        self.method = src.method
-      }
-    }
-
-    // self.on('pipe', function () {
-    //   console.error('You have already piped to this stream. Pipeing twice is likely to break the request.')
-    // })
-  })
-
-  defer(function () {
-    if (self._aborted) {
-      return
-    }
-
-    var end = function () {
-      if (self._form) {
-        if (!self._auth.hasAuth) {
-          self._form.pipe(self)
-        }
-        else if (self._auth.hasAuth && self._auth.sentAuth) {
-          self._form.pipe(self)
-        }
-      }
-      if (self._multipart && self._multipart.chunked) {
-        self._multipart.body.pipe(self)
-      }
-      if (self.body) {
-        if (isstream(self.body)) {
-          self.body.pipe(self)
-        } else {
-          setContentLength()
-          if (Array.isArray(self.body)) {
-            self.body.forEach(function (part) {
-              self.write(part)
-            })
-          } else {
-            self.write(self.body)
-          }
-          self.end()
-        }
-      } else if (self.requestBodyStream) {
-        console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.')
-        self.requestBodyStream.pipe(self)
-      } else if (!self.src) {
-        if (self._auth.hasAuth && !self._auth.sentAuth) {
-          self.end()
-          return
-        }
-        if (self.method !== 'GET' && typeof self.method !== 'undefined') {
-          self.setHeader('content-length', 0)
-        }
-        self.end()
-      }
-    }
-
-    if (self._form && !self.hasHeader('content-length')) {
-      // Before ending the request, we had to compute the length of the whole form, asyncly
-      self.setHeader(self._form.getHeaders(), true)
-      self._form.getLength(function (err, length) {
-        if (!err && !isNaN(length)) {
-          self.setHeader('content-length', length)
-        }
-        end()
-      })
-    } else {
-      end()
-    }
-
-    self.ntick = true
-  })
-
-}
-
-Request.prototype.getNewAgent = function () {
-  var self = this
-  var Agent = self.agentClass
-  var options = {}
-  if (self.agentOptions) {
-    for (var i in self.agentOptions) {
-      options[i] = self.agentOptions[i]
-    }
-  }
-  if (self.ca) {
-    options.ca = self.ca
-  }
-  if (self.ciphers) {
-    options.ciphers = self.ciphers
-  }
-  if (self.secureProtocol) {
-    options.secureProtocol = self.secureProtocol
-  }
-  if (self.secureOptions) {
-    options.secureOptions = self.secureOptions
-  }
-  if (typeof self.rejectUnauthorized !== 'undefined') {
-    options.rejectUnauthorized = self.rejectUnauthorized
-  }
-
-  if (self.cert && self.key) {
-    options.key = self.key
-    options.cert = self.cert
-  }
-
-  if (self.pfx) {
-    options.pfx = self.pfx
-  }
-
-  if (self.passphrase) {
-    options.passphrase = self.passphrase
-  }
-
-  var poolKey = ''
-
-  // different types of agents are in different pools
-  if (Agent !== self.httpModule.Agent) {
-    poolKey += Agent.name
-  }
-
-  // ca option is only relevant if proxy or destination are https
-  var proxy = self.proxy
-  if (typeof proxy === 'string') {
-    proxy = url.parse(proxy)
-  }
-  var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:'
-
-  if (isHttps) {
-    if (options.ca) {
-      if (poolKey) {
-        poolKey += ':'
-      }
-      poolKey += options.ca
-    }
-
-    if (typeof options.rejectUnauthorized !== 'undefined') {
-      if (poolKey) {
-        poolKey += ':'
-      }
-      poolKey += options.rejectUnauthorized
-    }
-
-    if (options.cert) {
-      if (poolKey) {
-        poolKey += ':'
-      }
-      poolKey += options.cert.toString('ascii') + options.key.toString('ascii')
-    }
-
-    if (options.pfx) {
-      if (poolKey) {
-        poolKey += ':'
-      }
-      poolKey += options.pfx.toString('ascii')
-    }
-
-    if (options.ciphers) {
-      if (poolKey) {
-        poolKey += ':'
-      }
-      poolKey += options.ciphers
-    }
-
-    if (options.secureProtocol) {
-      if (poolKey) {
-        poolKey += ':'
-      }
-      poolKey += options.secureProtocol
-    }
-
-    if (options.secureOptions) {
-      if (poolKey) {
-        poolKey += ':'
-      }
-      poolKey += options.secureOptions
-    }
-  }
-
-  if (self.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self.httpModule.globalAgent) {
-    // not doing anything special.  Use the globalAgent
-    return self.httpModule.globalAgent
-  }
-
-  // we're using a stored agent.  Make sure it's protocol-specific
-  poolKey = self.uri.protocol + poolKey
-
-  // generate a new agent for this setting if none yet exists
-  if (!self.pool[poolKey]) {
-    self.pool[poolKey] = new Agent(options)
-    // properly set maxSockets on new agents
-    if (self.pool.maxSockets) {
-      self.pool[poolKey].maxSockets = self.pool.maxSockets
-    }
-  }
-
-  return self.pool[poolKey]
-}
-
-Request.prototype.start = function () {
-  // start() is called once we are ready to send the outgoing HTTP request.
-  // this is usually called on the first write(), end() or on nextTick()
-  var self = this
-
-  if (self._aborted) {
-    return
-  }
-
-  self._started = true
-  self.method = self.method || 'GET'
-  self.href = self.uri.href
-
-  if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) {
-    self.setHeader('content-length', self.src.stat.size)
-  }
-  if (self._aws) {
-    self.aws(self._aws, true)
-  }
-
-  // We have a method named auth, which is completely different from the http.request
-  // auth option.  If we don't remove it, we're gonna have a bad time.
-  var reqOptions = copy(self)
-  delete reqOptions.auth
-
-  debug('make request', self.uri.href)
-
-  try {
-    self.req = self.httpModule.request(reqOptions)
-  } catch (err) {
-    self.emit('error', err)
-    return
-  }
-
-  if (self.timing) {
-    self.startTime = new Date().getTime()
-  }
-
-  if (self.timeout && !self.timeoutTimer) {
-    var timeout = self.timeout < 0 ? 0 : self.timeout
-    // Set a timeout in memory - this block will throw if the server takes more
-    // than `timeout` to write the HTTP status and headers (corresponding to
-    // the on('response') event on the client). NB: this measures wall-clock
-    // time, not the time between bytes sent by the server.
-    self.timeoutTimer = setTimeout(function () {
-      var connectTimeout = self.req.socket && self.req.socket.readable === false
-      self.abort()
-      var e = new Error('ETIMEDOUT')
-      e.code = 'ETIMEDOUT'
-      e.connect = connectTimeout
-      self.emit('error', e)
-    }, timeout)
-
-    if (self.req.setTimeout) { // only works on node 0.6+
-      // Set an additional timeout on the socket, via the `setsockopt` syscall.
-      // This timeout sets the amount of time to wait *between* bytes sent
-      // from the server, and may or may not correspond to the wall-clock time
-      // elapsed from the start of the request.
-      //
-      // In particular, it's useful for erroring if the server fails to send
-      // data halfway through streaming a response.
-      self.req.setTimeout(timeout, function () {
-        if (self.req) {
-          self.req.abort()
-          var e = new Error('ESOCKETTIMEDOUT')
-          e.code = 'ESOCKETTIMEDOUT'
-          e.connect = false
-          self.emit('error', e)
-        }
-      })
-    }
-  }
-
-  self.req.on('response', self.onRequestResponse.bind(self))
-  self.req.on('error', self.onRequestError.bind(self))
-  self.req.on('drain', function() {
-    self.emit('drain')
-  })
-  self.req.on('socket', function(socket) {
-    self.emit('socket', socket)
-  })
-
-  self.emit('request', self.req)
-}
-
-Request.prototype.onRequestError = function (error) {
-  var self = this
-  if (self._aborted) {
-    return
-  }
-  if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET'
-      && self.agent.addRequestNoreuse) {
-    self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) }
-    self.start()
-    self.req.end()
-    return
-  }
-  if (self.timeout && self.timeoutTimer) {
-    clearTimeout(self.timeoutTimer)
-    self.timeoutTimer = null
-  }
-  self.emit('error', error)
-}
-
-Request.prototype.onRequestResponse = function (response) {
-  var self = this
-  debug('onRequestResponse', self.uri.href, response.statusCode, response.headers)
-  response.on('end', function() {
-    if (self.timing) {
-      self.elapsedTime += (new Date().getTime() - self.startTime)
-      debug('elapsed time', self.elapsedTime)
-      response.elapsedTime = self.elapsedTime
-    }
-    debug('response end', self.uri.href, response.statusCode, response.headers)
-  })
-
-  if (self._aborted) {
-    debug('aborted', self.uri.href)
-    response.resume()
-    return
-  }
-
-  self.response = response
-  response.request = self
-  response.toJSON = responseToJSON
-
-  // XXX This is different on 0.10, because SSL is strict by default
-  if (self.httpModule === https &&
-      self.strictSSL && (!response.hasOwnProperty('socket') ||
-      !response.socket.authorized)) {
-    debug('strict ssl error', self.uri.href)
-    var sslErr = response.hasOwnProperty('socket') ? response.socket.authorizationError : self.uri.href + ' does not support SSL'
-    self.emit('error', new Error('SSL Error: ' + sslErr))
-    return
-  }
-
-  // Save the original host before any redirect (if it changes, we need to
-  // remove any authorization headers).  Also remember the case of the header
-  // name because lots of broken servers expect Host instead of host and we
-  // want the caller to be able to specify this.
-  self.originalHost = self.getHeader('host')
-  if (!self.originalHostHeaderName) {
-    self.originalHostHeaderName = self.hasHeader('host')
-  }
-  if (self.setHost) {
-    self.removeHeader('host')
-  }
-  if (self.timeout && self.timeoutTimer) {
-    clearTimeout(self.timeoutTimer)
-    self.timeoutTimer = null
-  }
-
-  var targetCookieJar = (self._jar && self._jar.setCookie) ? self._jar : globalCookieJar
-  var addCookie = function (cookie) {
-    //set the cookie if it's domain in the href's domain.
-    try {
-      targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true})
-    } catch (e) {
-      self.emit('error', e)
-    }
-  }
-
-  response.caseless = caseless(response.headers)
-
-  if (response.caseless.has('set-cookie') && (!self._disableCookies)) {
-    var headerName = response.caseless.has('set-cookie')
-    if (Array.isArray(response.headers[headerName])) {
-      response.headers[headerName].forEach(addCookie)
-    } else {
-      addCookie(response.headers[headerName])
-    }
-  }
-
-  if (self._redirect.onResponse(response)) {
-    return // Ignore the rest of the response
-  } else {
-    // Be a good stream and emit end when the response is finished.
-    // Hack to emit end on close because of a core bug that never fires end
-    response.on('close', function () {
-      if (!self._ended) {
-        self.response.emit('end')
-      }
-    })
-
-    response.on('end', function () {
-      self._ended = true
-    })
-
-    var noBody = function (code) {
-      return (
-        self.method === 'HEAD'
-        // Informational
-        || (code >= 100 && code < 200)
-        // No Content
-        || code === 204
-        // Not Modified
-        || code === 304
-      )
-    }
-
-    var responseContent
-    if (self.gzip && !noBody(response.statusCode)) {
-      var contentEncoding = response.headers['content-encoding'] || 'identity'
-      contentEncoding = contentEncoding.trim().toLowerCase()
-
-      if (contentEncoding === 'gzip') {
-        responseContent = zlib.createGunzip()
-        response.pipe(responseContent)
-      } else if (contentEncoding === 'deflate') {
-        responseContent = zlib.createInflate()
-        response.pipe(responseContent)
-      } else {
-        // Since previous versions didn't check for Content-Encoding header,
-        // ignore any invalid values to preserve backwards-compatibility
-        if (contentEncoding !== 'identity') {
-          debug('ignoring unrecognized Content-Encoding ' + contentEncoding)
-        }
-        responseContent = response
-      }
-    } else {
-      responseContent = response
-    }
-
-    if (self.encoding) {
-      if (self.dests.length !== 0) {
-        console.error('Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.')
-      } else if (responseContent.setEncoding) {
-        responseContent.setEncoding(self.encoding)
-      } else {
-        // Should only occur on node pre-v0.9.4 (joyent/node@9b5abe5) with
-        // zlib streams.
-        // If/When support for 0.9.4 is dropped, this should be unnecessary.
-        responseContent = responseContent.pipe(stringstream(self.encoding))
-      }
-    }
-
-    if (self._paused) {
-      responseContent.pause()
-    }
-
-    self.responseContent = responseContent
-
-    self.emit('response', response)
-
-    self.dests.forEach(function (dest) {
-      self.pipeDest(dest)
-    })
-
-    responseContent.on('data', function (chunk) {
-      self._destdata = true
-      self.emit('data', chunk)
-    })
-    responseContent.on('end', function (chunk) {
-      self.emit('end', chunk)
-    })
-    responseContent.on('error', function (error) {
-      self.emit('error', error)
-    })
-    responseContent.on('close', function () {self.emit('close')})
-
-    if (self.callback) {
-      self.readResponseBody(response)
-    }
-    //if no callback
-    else {
-      self.on('end', function () {
-        if (self._aborted) {
-          debug('aborted', self.uri.href)
-          return
-        }
-        self.emit('complete', response)
-      })
-    }
-  }
-  debug('finish init function', self.uri.href)
-}
-
-Request.prototype.readResponseBody = function (response) {
-  var self = this
-  debug('reading response\'s body')
-  var buffer = bl()
-    , strings = []
-
-  self.on('data', function (chunk) {
-    if (Buffer.isBuffer(chunk)) {
-      buffer.append(chunk)
-    } else {
-      strings.push(chunk)
-    }
-  })
-  self.on('end', function () {
-    debug('end event', self.uri.href)
-    if (self._aborted) {
-      debug('aborted', self.uri.href)
-      // `buffer` is defined in the parent scope and used in a closure it exists for the life of the request.
-      // This can lead to leaky behavior if the user retains a reference to the request object.
-      buffer.destroy()
-      return
-    }
-
-    if (buffer.length) {
-      debug('has body', self.uri.href, buffer.length)
-      if (self.encoding === null) {
-        // response.body = buffer
-        // can't move to this until https://github.com/rvagg/bl/issues/13
-        response.body = buffer.slice()
-      } else {
-        response.body = buffer.toString(self.encoding)
-      }
-      // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request.
-      // This can lead to leaky behavior if the user retains a reference to the request object.
-      buffer.destroy()
-    } else if (strings.length) {
-      // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation.
-      // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse().
-      if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\uFEFF') {
-        strings[0] = strings[0].substring(1)
-      }
-      response.body = strings.join('')
-    }
-
-    if (self._json) {
-      try {
-        response.body = JSON.parse(response.body, self._jsonReviver)
-      } catch (e) {
-        debug('invalid JSON received', self.uri.href)
-      }
-    }
-    debug('emitting complete', self.uri.href)
-    if (typeof response.body === 'undefined' && !self._json) {
-      response.body = self.encoding === null ? new Buffer(0) : ''
-    }
-    self.emit('complete', response, response.body)
-  })
-}
-
-Request.prototype.abort = function () {
-  var self = this
-  self._aborted = true
-
-  if (self.req) {
-    self.req.abort()
-  }
-  else if (self.response) {
-    self.response.destroy()
-  }
-
-  self.emit('abort')
-}
-
-Request.prototype.pipeDest = function (dest) {
-  var self = this
-  var response = self.response
-  // Called after the response is received
-  if (dest.headers && !dest.headersSent) {
-    if (response.caseless.has('content-type')) {
-      var ctname = response.caseless.has('content-type')
-      if (dest.setHeader) {
-        dest.setHeader(ctname, response.headers[ctname])
-      }
-      else {
-        dest.headers[ctname] = response.headers[ctname]
-      }
-    }
-
-    if (response.caseless.has('content-length')) {
-      var clname = response.caseless.has('content-length')
-      if (dest.setHeader) {
-        dest.setHeader(clname, response.headers[clname])
-      } else {
-        dest.headers[clname] = response.headers[clname]
-      }
-    }
-  }
-  if (dest.setHeader && !dest.headersSent) {
-    for (var i in response.headers) {
-      // If the response content is being decoded, the Content-Encoding header
-      // of the response doesn't represent the piped content, so don't pass it.
-      if (!self.gzip || i !== 'content-encoding') {
-        dest.setHeader(i, response.headers[i])
-      }
-    }
-    dest.statusCode = response.statusCode
-  }
-  if (self.pipefilter) {
-    self.pipefilter(response, dest)
-  }
-}
-
-Request.prototype.qs = function (q, clobber) {
-  var self = this
-  var base
-  if (!clobber && self.uri.query) {
-    base = self._qs.parse(self.uri.query)
-  } else {
-    base = {}
-  }
-
-  for (var i in q) {
-    base[i] = q[i]
-  }
-
-  var qs = self._qs.stringify(base)
-
-  if (qs === '') {
-    return self
-  }
-
-  self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs)
-  self.url = self.uri
-  self.path = self.uri.path
-
-  if (self.uri.host === 'unix') {
-    self.enableUnixSocket()
-  }
-
-  return self
-}
-Request.prototype.form = function (form) {
-  var self = this
-  if (form) {
-    if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) {
-      self.setHeader('content-type', 'application/x-www-form-urlencoded')
-    }
-    self.body = (typeof form === 'string')
-      ? self._qs.rfc3986(form.toString('utf8'))
-      : self._qs.stringify(form).toString('utf8')
-    return self
-  }
-  // create form-data object
-  self._form = new FormData()
-  self._form.on('error', function(err) {
-    err.message = 'form-data: ' + err.message
-    self.emit('error', err)
-    self.abort()
-  })
-  return self._form
-}
-Request.prototype.multipart = function (multipart) {
-  var self = this
-
-  self._multipart.onRequest(multipart)
-
-  if (!self._multipart.chunked) {
-    self.body = self._multipart.body
-  }
-
-  return self
-}
-Request.prototype.json = function (val) {
-  var self = this
-
-  if (!self.hasHeader('accept')) {
-    self.setHeader('accept', 'application/json')
-  }
-
-  if (typeof self.jsonReplacer === 'function') {
-    self._jsonReplacer = self.jsonReplacer
-  }
-
-  self._json = true
-  if (typeof val === 'boolean') {
-    if (self.body !== undefined) {
-      if (!/^application\/x-www-form-urlencoded\b/.test(self.getHeader('content-type'))) {
-        self.body = safeStringify(self.body, self._jsonReplacer)
-      } else {
-        self.body = self._qs.rfc3986(self.body)
-      }
-      if (!self.hasHeader('content-type')) {
-        self.setHeader('content-type', 'application/json')
-      }
-    }
-  } else {
-    self.body = safeStringify(val, self._jsonReplacer)
-    if (!self.hasHeader('content-type')) {
-      self.setHeader('content-type', 'application/json')
-    }
-  }
-
-  if (typeof self.jsonReviver === 'function') {
-    self._jsonReviver = self.jsonReviver
-  }
-
-  return self
-}
-Request.prototype.getHeader = function (name, headers) {
-  var self = this
-  var result, re, match
-  if (!headers) {
-    headers = self.headers
-  }
-  Object.keys(headers).forEach(function (key) {
-    if (key.length !== name.length) {
-      return
-    }
-    re = new RegExp(name, 'i')
-    match = key.match(re)
-    if (match) {
-      result = headers[key]
-    }
-  })
-  return result
-}
-Request.prototype.enableUnixSocket = function () {
-  // Get the socket & request paths from the URL
-  var unixParts = this.uri.path.split(':')
-    , host = unixParts[0]
-    , path = unixParts[1]
-  // Apply unix properties to request
-  this.socketPath = host
-  this.uri.pathname = path
-  this.uri.path = path
-  this.uri.host = host
-  this.uri.hostname = host
-  this.uri.isUnix = true
-}
-
-
-Request.prototype.auth = function (user, pass, sendImmediately, bearer) {
-  var self = this
-
-  self._auth.onRequest(user, pass, sendImmediately, bearer)
-
-  return self
-}
-Request.prototype.aws = function (opts, now) {
-  var self = this
-
-  if (!now) {
-    self._aws = opts
-    return self
-  }
-
-  if (opts.sign_version == 4 || opts.sign_version == '4') {
-    // use aws4
-    var options = {
-      host: self.uri.host,
-      path: self.uri.path,
-      method: self.method,
-      headers: {
-        'content-type': self.getHeader('content-type') || ''
-      },
-      body: self.body
-    }
-    var signRes = aws4.sign(options, {
-      accessKeyId: opts.key,
-      secretAccessKey: opts.secret
-    })
-    self.setHeader('authorization', signRes.headers.Authorization)
-    self.setHeader('x-amz-date', signRes.headers['X-Amz-Date'])
-  }
-  else {
-    // default: use aws-sign2
-    var date = new Date()
-    self.setHeader('date', date.toUTCString())
-    var auth =
-      { key: opts.key
-      , secret: opts.secret
-      , verb: self.method.toUpperCase()
-      , date: date
-      , contentType: self.getHeader('content-type') || ''
-      , md5: self.getHeader('content-md5') || ''
-      , amazonHeaders: aws2.canonicalizeHeaders(self.headers)
-      }
-    var path = self.uri.path
-    if (opts.bucket && path) {
-      auth.resource = '/' + opts.bucket + path
-    } else if (opts.bucket && !path) {
-      auth.resource = '/' + opts.bucket
-    } else if (!opts.bucket && path) {
-      auth.resource = path
-    } else if (!opts.bucket && !path) {
-      auth.resource = '/'
-    }
-    auth.resource = aws2.canonicalizeResource(auth.resource)
-    self.setHeader('authorization', aws2.authorization(auth))
-  }
-
-  return self
-}
-Request.prototype.httpSignature = function (opts) {
-  var self = this
-  httpSignature.signRequest({
-    getHeader: function(header) {
-      return self.getHeader(header, self.headers)
-    },
-    setHeader: function(header, value) {
-      self.setHeader(header, value)
-    },
-    method: self.method,
-    path: self.path
-  }, opts)
-  debug('httpSignature authorization', self.getHeader('authorization'))
-
-  return self
-}
-Request.prototype.hawk = function (opts) {
-  var self = this
-  self.setHeader('Authorization', hawk.client.header(self.uri, self.method, opts).field)
-}
-Request.prototype.oauth = function (_oauth) {
-  var self = this
-
-  self._oauth.onRequest(_oauth)
-
-  return self
-}
-
-Request.prototype.jar = function (jar) {
-  var self = this
-  var cookies
-
-  if (self._redirect.redirectsFollowed === 0) {
-    self.originalCookieHeader = self.getHeader('cookie')
-  }
-
-  if (!jar) {
-    // disable cookies
-    cookies = false
-    self._disableCookies = true
-  } else {
-    var targetCookieJar = (jar && jar.getCookieString) ? jar : globalCookieJar
-    var urihref = self.uri.href
-    //fetch cookie in the Specified host
-    if (targetCookieJar) {
-      cookies = targetCookieJar.getCookieString(urihref)
-    }
-  }
-
-  //if need cookie and cookie is not empty
-  if (cookies && cookies.length) {
-    if (self.originalCookieHeader) {
-      // Don't overwrite existing Cookie header
-      self.setHeader('cookie', self.originalCookieHeader + '; ' + cookies)
-    } else {
-      self.setHeader('cookie', cookies)
-    }
-  }
-  self._jar = jar
-  return self
-}
-
-
-// Stream API
-Request.prototype.pipe = function (dest, opts) {
-  var self = this
-
-  if (self.response) {
-    if (self._destdata) {
-      self.emit('error', new Error('You cannot pipe after data has been emitted from the response.'))
-    } else if (self._ended) {
-      self.emit('error', new Error('You cannot pipe after the response has been ended.'))
-    } else {
-      stream.Stream.prototype.pipe.call(self, dest, opts)
-      self.pipeDest(dest)
-      return dest
-    }
-  } else {
-    self.dests.push(dest)
-    stream.Stream.prototype.pipe.call(self, dest, opts)
-    return dest
-  }
-}
-Request.prototype.write = function () {
-  var self = this
-  if (self._aborted) {return}
-
-  if (!self._started) {
-    self.start()
-  }
-  if (self.req) {
-    return self.req.write.apply(self.req, arguments)
-  }
-}
-Request.prototype.end = function (chunk) {
-  var self = this
-  if (self._aborted) {return}
-
-  if (chunk) {
-    self.write(chunk)
-  }
-  if (!self._started) {
-    self.start()
-  }
-  if (self.req) {
-    self.req.end()
-  }
-}
-Request.prototype.pause = function () {
-  var self = this
-  if (!self.responseContent) {
-    self._paused = true
-  } else {
-    self.responseContent.pause.apply(self.responseContent, arguments)
-  }
-}
-Request.prototype.resume = function () {
-  var self = this
-  if (!self.responseContent) {
-    self._paused = false
-  } else {
-    self.responseContent.resume.apply(self.responseContent, arguments)
-  }
-}
-Request.prototype.destroy = function () {
-  var self = this
-  if (!self._ended) {
-    self.end()
-  } else if (self.response) {
-    self.response.destroy()
-  }
-}
-
-Request.defaultProxyHeaderWhiteList =
-  Tunnel.defaultProxyHeaderWhiteList.slice()
-
-Request.defaultProxyHeaderExclusiveList =
-  Tunnel.defaultProxyHeaderExclusiveList.slice()
-
-// Exports
-
-Request.prototype.toJSON = requestToJSON
-module.exports = Request
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/README.md
deleted file mode 100644
index 423b8cf854ad3efabde7cc13fc4da155a4b5664c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/README.md
+++ /dev/null
@@ -1,101 +0,0 @@
-[![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies)
-
-The [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node.
-
-Install with `npm install rimraf`, or just drop rimraf.js somewhere.
-
-## API
-
-`rimraf(f, [opts], callback)`
-
-The first parameter will be interpreted as a globbing pattern for files. If you
-want to disable globbing you can do so with `opts.disableGlob` (defaults to
-`false`). This might be handy, for instance, if you have filenames that contain
-globbing wildcard characters.
-
-The callback will be called with an error if there is one.  Certain
-errors are handled for you:
-
-* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of
-  `opts.maxBusyTries` times before giving up, adding 100ms of wait
-  between each attempt.  The default `maxBusyTries` is 3.
-* `ENOENT` - If the file doesn't exist, rimraf will return
-  successfully, since your desired outcome is already the case.
-* `EMFILE` - Since `readdir` requires opening a file descriptor, it's
-  possible to hit `EMFILE` if too many file descriptors are in use.
-  In the sync case, there's nothing to be done for this.  But in the
-  async case, rimraf will gradually back off with timeouts up to
-  `opts.emfileWait` ms, which defaults to 1000.
-
-## options
-
-* unlink, chmod, stat, lstat, rmdir, readdir,
-  unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync
-
-    In order to use a custom file system library, you can override
-    specific fs functions on the options object.
-
-    If any of these functions are present on the options object, then
-    the supplied function will be used instead of the default fs
-    method.
-
-    Sync methods are only relevant for `rimraf.sync()`, of course.
-
-    For example:
-
-    ```javascript
-    var myCustomFS = require('some-custom-fs')
-
-    rimraf('some-thing', myCustomFS, callback)
-    ```
-
-* maxBusyTries
-
-    If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered
-    on Windows systems, then rimraf will retry with a linear backoff
-    wait of 100ms longer on each try.  The default maxBusyTries is 3.
-
-    Only relevant for async usage.
-
-* emfileWait
-
-    If an `EMFILE` error is encountered, then rimraf will retry
-    repeatedly with a linear backoff of 1ms longer on each try, until
-    the timeout counter hits this max.  The default limit is 1000.
-
-    If you repeatedly encounter `EMFILE` errors, then consider using
-    [graceful-fs](http://npm.im/graceful-fs) in your program.
-
-    Only relevant for async usage.
-
-* glob
-
-    Set to `false` to disable [glob](http://npm.im/glob) pattern
-    matching.
-
-    Set to an object to pass options to the glob module.  The default
-    glob options are `{ nosort: true, silent: true }`.
-
-    Glob version 6 is used in this module.
-
-    Relevant for both sync and async usage.
-
-* disableGlob
-
-    Set to any non-falsey value to disable globbing entirely.
-    (Equivalent to setting `glob: false`.)
-
-## rimraf.sync
-
-It can remove stuff synchronously, too.  But that's not so good.  Use
-the async API.  It's better.
-
-## CLI
-
-If installed with `npm install rimraf -g` it can be used as a global
-command `rimraf <path> [<path> ...]` which is useful for cross platform support.
-
-## mkdirp
-
-If you need to create a directory recursively, check out
-[mkdirp](https://github.com/substack/node-mkdirp).
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/bin.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/bin.js
deleted file mode 100755
index 1bd5a0d16ac2bbfe4c914cc96151a00a3d9da63c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/bin.js
+++ /dev/null
@@ -1,40 +0,0 @@
-#!/usr/bin/env node
-
-var rimraf = require('./')
-
-var help = false
-var dashdash = false
-var args = process.argv.slice(2).filter(function(arg) {
-  if (dashdash)
-    return !!arg
-  else if (arg === '--')
-    dashdash = true
-  else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/))
-    help = true
-  else
-    return !!arg
-});
-
-if (help || args.length === 0) {
-  // If they didn't ask for help, then this is not a "success"
-  var log = help ? console.log : console.error
-  log('Usage: rimraf <path> [<path> ...]')
-  log('')
-  log('  Deletes all files and folders at "path" recursively.')
-  log('')
-  log('Options:')
-  log('')
-  log('  -h, --help    Display this usage info')
-  process.exit(help ? 0 : 1)
-} else
-  go(0)
-
-function go (n) {
-  if (n >= args.length)
-    return
-  rimraf(args[n], function (er) {
-    if (er)
-      throw er
-    go(n+1)
-  })
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/README.md
deleted file mode 100644
index 9dd9384fa143c309285a58dc85d9b7a3b7852408..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/README.md
+++ /dev/null
@@ -1,365 +0,0 @@
-# Glob
-
-Match files using the patterns the shell uses, like stars and stuff.
-
-[![Build Status](https://travis-ci.org/isaacs/node-glob.svg?branch=master)](https://travis-ci.org/isaacs/node-glob/) [![Build Status](https://ci.appveyor.com/api/projects/status/kd7f3yftf7unxlsx?svg=true)](https://ci.appveyor.com/project/isaacs/node-glob) [![Coverage Status](https://coveralls.io/repos/isaacs/node-glob/badge.svg?branch=master&service=github)](https://coveralls.io/github/isaacs/node-glob?branch=master)
-
-This is a glob implementation in JavaScript.  It uses the `minimatch`
-library to do its matching.
-
-![](oh-my-glob.gif)
-
-## Usage
-
-Install with npm
-
-```
-npm i glob
-```
-
-```javascript
-var glob = require("glob")
-
-// options is optional
-glob("**/*.js", options, function (er, files) {
-  // files is an array of filenames.
-  // If the `nonull` option is set, and nothing
-  // was found, then files is ["**/*.js"]
-  // er is an error object or null.
-})
-```
-
-## Glob Primer
-
-"Globs" are the patterns you type when you do stuff like `ls *.js` on
-the command line, or put `build/*` in a `.gitignore` file.
-
-Before parsing the path part patterns, braced sections are expanded
-into a set.  Braced sections start with `{` and end with `}`, with any
-number of comma-delimited sections within.  Braced sections may contain
-slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`.
-
-The following characters have special magic meaning when used in a
-path portion:
-
-* `*` Matches 0 or more characters in a single path portion
-* `?` Matches 1 character
-* `[...]` Matches a range of characters, similar to a RegExp range.
-  If the first character of the range is `!` or `^` then it matches
-  any character not in the range.
-* `!(pattern|pattern|pattern)` Matches anything that does not match
-  any of the patterns provided.
-* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the
-  patterns provided.
-* `+(pattern|pattern|pattern)` Matches one or more occurrences of the
-  patterns provided.
-* `*(a|b|c)` Matches zero or more occurrences of the patterns provided
-* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns
-  provided
-* `**` If a "globstar" is alone in a path portion, then it matches
-  zero or more directories and subdirectories searching for matches.
-  It does not crawl symlinked directories.
-
-### Dots
-
-If a file or directory path portion has a `.` as the first character,
-then it will not match any glob pattern unless that pattern's
-corresponding path part also has a `.` as its first character.
-
-For example, the pattern `a/.*/c` would match the file at `a/.b/c`.
-However the pattern `a/*/c` would not, because `*` does not start with
-a dot character.
-
-You can make glob treat dots as normal characters by setting
-`dot:true` in the options.
-
-### Basename Matching
-
-If you set `matchBase:true` in the options, and the pattern has no
-slashes in it, then it will seek for any file anywhere in the tree
-with a matching basename.  For example, `*.js` would match
-`test/simple/basic.js`.
-
-### Empty Sets
-
-If no matching files are found, then an empty array is returned.  This
-differs from the shell, where the pattern itself is returned.  For
-example:
-
-    $ echo a*s*d*f
-    a*s*d*f
-
-To get the bash-style behavior, set the `nonull:true` in the options.
-
-### See Also:
-
-* `man sh`
-* `man bash` (Search for "Pattern Matching")
-* `man 3 fnmatch`
-* `man 5 gitignore`
-* [minimatch documentation](https://github.com/isaacs/minimatch)
-
-## glob.hasMagic(pattern, [options])
-
-Returns `true` if there are any special characters in the pattern, and
-`false` otherwise.
-
-Note that the options affect the results.  If `noext:true` is set in
-the options object, then `+(a|b)` will not be considered a magic
-pattern.  If the pattern has a brace expansion, like `a/{b/c,x/y}`
-then that is considered magical, unless `nobrace:true` is set in the
-options.
-
-## glob(pattern, [options], cb)
-
-* `pattern` `{String}` Pattern to be matched
-* `options` `{Object}`
-* `cb` `{Function}`
-  * `err` `{Error | null}`
-  * `matches` `{Array<String>}` filenames found matching the pattern
-
-Perform an asynchronous glob search.
-
-## glob.sync(pattern, [options])
-
-* `pattern` `{String}` Pattern to be matched
-* `options` `{Object}`
-* return: `{Array<String>}` filenames found matching the pattern
-
-Perform a synchronous glob search.
-
-## Class: glob.Glob
-
-Create a Glob object by instantiating the `glob.Glob` class.
-
-```javascript
-var Glob = require("glob").Glob
-var mg = new Glob(pattern, options, cb)
-```
-
-It's an EventEmitter, and starts walking the filesystem to find matches
-immediately.
-
-### new glob.Glob(pattern, [options], [cb])
-
-* `pattern` `{String}` pattern to search for
-* `options` `{Object}`
-* `cb` `{Function}` Called when an error occurs, or matches are found
-  * `err` `{Error | null}`
-  * `matches` `{Array<String>}` filenames found matching the pattern
-
-Note that if the `sync` flag is set in the options, then matches will
-be immediately available on the `g.found` member.
-
-### Properties
-
-* `minimatch` The minimatch object that the glob uses.
-* `options` The options object passed in.
-* `aborted` Boolean which is set to true when calling `abort()`.  There
-  is no way at this time to continue a glob search after aborting, but
-  you can re-use the statCache to avoid having to duplicate syscalls.
-* `cache` Convenience object.  Each field has the following possible
-  values:
-  * `false` - Path does not exist
-  * `true` - Path exists
-  * `'FILE'` - Path exists, and is not a directory
-  * `'DIR'` - Path exists, and is a directory
-  * `[file, entries, ...]` - Path exists, is a directory, and the
-    array value is the results of `fs.readdir`
-* `statCache` Cache of `fs.stat` results, to prevent statting the same
-  path multiple times.
-* `symlinks` A record of which paths are symbolic links, which is
-  relevant in resolving `**` patterns.
-* `realpathCache` An optional object which is passed to `fs.realpath`
-  to minimize unnecessary syscalls.  It is stored on the instantiated
-  Glob object, and may be re-used.
-
-### Events
-
-* `end` When the matching is finished, this is emitted with all the
-  matches found.  If the `nonull` option is set, and no match was found,
-  then the `matches` list contains the original pattern.  The matches
-  are sorted, unless the `nosort` flag is set.
-* `match` Every time a match is found, this is emitted with the specific
-  thing that matched. It is not deduplicated or resolved to a realpath.
-* `error` Emitted when an unexpected error is encountered, or whenever
-  any fs error occurs if `options.strict` is set.
-* `abort` When `abort()` is called, this event is raised.
-
-### Methods
-
-* `pause` Temporarily stop the search
-* `resume` Resume the search
-* `abort` Stop the search forever
-
-### Options
-
-All the options that can be passed to Minimatch can also be passed to
-Glob to change pattern matching behavior.  Also, some have been added,
-or have glob-specific ramifications.
-
-All options are false by default, unless otherwise noted.
-
-All options are added to the Glob object, as well.
-
-If you are running many `glob` operations, you can pass a Glob object
-as the `options` argument to a subsequent operation to shortcut some
-`stat` and `readdir` calls.  At the very least, you may pass in shared
-`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that
-parallel glob operations will be sped up by sharing information about
-the filesystem.
-
-* `cwd` The current working directory in which to search.  Defaults
-  to `process.cwd()`.
-* `root` The place where patterns starting with `/` will be mounted
-  onto.  Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix
-  systems, and `C:\` or some such on Windows.)
-* `dot` Include `.dot` files in normal matches and `globstar` matches.
-  Note that an explicit dot in a portion of the pattern will always
-  match dot files.
-* `nomount` By default, a pattern starting with a forward-slash will be
-  "mounted" onto the root setting, so that a valid filesystem path is
-  returned.  Set this flag to disable that behavior.
-* `mark` Add a `/` character to directory matches.  Note that this
-  requires additional stat calls.
-* `nosort` Don't sort the results.
-* `stat` Set to true to stat *all* results.  This reduces performance
-  somewhat, and is completely unnecessary, unless `readdir` is presumed
-  to be an untrustworthy indicator of file existence.
-* `silent` When an unusual error is encountered when attempting to
-  read a directory, a warning will be printed to stderr.  Set the
-  `silent` option to true to suppress these warnings.
-* `strict` When an unusual error is encountered when attempting to
-  read a directory, the process will just continue on in search of
-  other matches.  Set the `strict` option to raise an error in these
-  cases.
-* `cache` See `cache` property above.  Pass in a previously generated
-  cache object to save some fs calls.
-* `statCache` A cache of results of filesystem information, to prevent
-  unnecessary stat calls.  While it should not normally be necessary
-  to set this, you may pass the statCache from one glob() call to the
-  options object of another, if you know that the filesystem will not
-  change between calls.  (See "Race Conditions" below.)
-* `symlinks` A cache of known symbolic links.  You may pass in a
-  previously generated `symlinks` object to save `lstat` calls when
-  resolving `**` matches.
-* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead.
-* `nounique` In some cases, brace-expanded patterns can result in the
-  same file showing up multiple times in the result set.  By default,
-  this implementation prevents duplicates in the result set.  Set this
-  flag to disable that behavior.
-* `nonull` Set to never return an empty set, instead returning a set
-  containing the pattern itself.  This is the default in glob(3).
-* `debug` Set to enable debug logging in minimatch and glob.
-* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets.
-* `noglobstar` Do not match `**` against multiple filenames.  (Ie,
-  treat it as a normal `*` instead.)
-* `noext` Do not match `+(a|b)` "extglob" patterns.
-* `nocase` Perform a case-insensitive match.  Note: on
-  case-insensitive filesystems, non-magic patterns will match by
-  default, since `stat` and `readdir` will not raise errors.
-* `matchBase` Perform a basename-only match if the pattern does not
-  contain any slash characters.  That is, `*.js` would be treated as
-  equivalent to `**/*.js`, matching all js files in all directories.
-* `nodir` Do not match directories, only files.  (Note: to match
-  *only* directories, simply put a `/` at the end of the pattern.)
-* `ignore` Add a pattern or an array of glob patterns to exclude matches.
-  Note: `ignore` patterns are *always* in `dot:true` mode, regardless
-  of any other settings.
-* `follow` Follow symlinked directories when expanding `**` patterns.
-  Note that this can result in a lot of duplicate references in the
-  presence of cyclic links.
-* `realpath` Set to true to call `fs.realpath` on all of the results.
-  In the case of a symlink that cannot be resolved, the full absolute
-  path to the matched entry is returned (though it will usually be a
-  broken symlink)
-
-## Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between node-glob and other
-implementations, and are intentional.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.3, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.
-
-Note that symlinked directories are not crawled as part of a `**`,
-though their contents may match against subsequent portions of the
-pattern.  This prevents infinite loops and duplicates and the like.
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then glob returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
-
-### Comments and Negation
-
-Previously, this module let you mark a pattern as a "comment" if it
-started with a `#` character, or a "negated" pattern if it started
-with a `!` character.
-
-These options were deprecated in version 5, and removed in version 6.
-
-To specify things that should not match, use the `ignore` option.
-
-## Windows
-
-**Please only use forward-slashes in glob expressions.**
-
-Though windows uses either `/` or `\` as its path separator, only `/`
-characters are used by this glob implementation.  You must use
-forward-slashes **only** in glob expressions.  Back-slashes will always
-be interpreted as escape characters, not path separators.
-
-Results from absolute patterns such as `/foo/*` are mounted onto the
-root setting using `path.join`.  On windows, this will by default result
-in `/foo/*` matching `C:\foo\bar.txt`.
-
-## Race Conditions
-
-Glob searching, by its very nature, is susceptible to race conditions,
-since it relies on directory walking and such.
-
-As a result, it is possible that a file that exists when glob looks for
-it may have been deleted or modified by the time it returns the result.
-
-As part of its internal implementation, this program caches all stat
-and readdir calls that it makes, in order to cut down on system
-overhead.  However, this also makes it even more susceptible to races,
-especially if the cache or statCache objects are reused between glob
-calls.
-
-Users are thus advised not to use a glob result as a guarantee of
-filesystem state in the face of rapid changes.  For the vast majority
-of operations, this is never a problem.
-
-## Contributing
-
-Any change to behavior (including bugfixes) must come with a test.
-
-Patches that fail tests or reduce performance will be rejected.
-
-```
-# to run tests
-npm test
-
-# to re-generate test fixtures
-npm run test-regen
-
-# to benchmark against bash/zsh
-npm run bench
-
-# to profile javascript
-npm run prof
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/changelog.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/changelog.md
deleted file mode 100644
index 41636771e3a7cda353a836f38d5a7c6a3ed829cc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/changelog.md
+++ /dev/null
@@ -1,67 +0,0 @@
-## 7.0
-
-- Raise error if `options.cwd` is specified, and not a directory
-
-## 6.0
-
-- Remove comment and negation pattern support
-- Ignore patterns are always in `dot:true` mode
-
-## 5.0
-
-- Deprecate comment and negation patterns
-- Fix regression in `mark` and `nodir` options from making all cache
-  keys absolute path.
-- Abort if `fs.readdir` returns an error that's unexpected
-- Don't emit `match` events for ignored items
-- Treat ENOTSUP like ENOTDIR in readdir
-
-## 4.5
-
-- Add `options.follow` to always follow directory symlinks in globstar
-- Add `options.realpath` to call `fs.realpath` on all results
-- Always cache based on absolute path
-
-## 4.4
-
-- Add `options.ignore`
-- Fix handling of broken symlinks
-
-## 4.3
-
-- Bump minimatch to 2.x
-- Pass all tests on Windows
-
-## 4.2
-
-- Add `glob.hasMagic` function
-- Add `options.nodir` flag
-
-## 4.1
-
-- Refactor sync and async implementations for performance
-- Throw if callback provided to sync glob function
-- Treat symbolic links in globstar results the same as Bash 4.3
-
-## 4.0
-
-- Use `^` for dependency versions (bumped major because this breaks
-  older npm versions)
-- Ensure callbacks are only ever called once
-- switch to ISC license
-
-## 3.x
-
-- Rewrite in JavaScript
-- Add support for setting root, cwd, and windows support
-- Cache many fs calls
-- Add globstar support
-- emit match events
-
-## 2.x
-
-- Use `glob.h` and `fnmatch.h` from NetBSD
-
-## 1.x
-
-- `glob.h` static binding.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/common.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/common.js
deleted file mode 100644
index 58dc41e66321606e08c00abdd4cb196c52a2caa9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/common.js
+++ /dev/null
@@ -1,235 +0,0 @@
-exports.alphasort = alphasort
-exports.alphasorti = alphasorti
-exports.setopts = setopts
-exports.ownProp = ownProp
-exports.makeAbs = makeAbs
-exports.finish = finish
-exports.mark = mark
-exports.isIgnored = isIgnored
-exports.childrenIgnored = childrenIgnored
-
-function ownProp (obj, field) {
-  return Object.prototype.hasOwnProperty.call(obj, field)
-}
-
-var path = require("path")
-var minimatch = require("minimatch")
-var isAbsolute = require("path-is-absolute")
-var Minimatch = minimatch.Minimatch
-
-function alphasorti (a, b) {
-  return a.toLowerCase().localeCompare(b.toLowerCase())
-}
-
-function alphasort (a, b) {
-  return a.localeCompare(b)
-}
-
-function setupIgnores (self, options) {
-  self.ignore = options.ignore || []
-
-  if (!Array.isArray(self.ignore))
-    self.ignore = [self.ignore]
-
-  if (self.ignore.length) {
-    self.ignore = self.ignore.map(ignoreMap)
-  }
-}
-
-// ignore patterns are always in dot:true mode.
-function ignoreMap (pattern) {
-  var gmatcher = null
-  if (pattern.slice(-3) === '/**') {
-    var gpattern = pattern.replace(/(\/\*\*)+$/, '')
-    gmatcher = new Minimatch(gpattern, { dot: true })
-  }
-
-  return {
-    matcher: new Minimatch(pattern, { dot: true }),
-    gmatcher: gmatcher
-  }
-}
-
-function setopts (self, pattern, options) {
-  if (!options)
-    options = {}
-
-  // base-matching: just use globstar for that.
-  if (options.matchBase && -1 === pattern.indexOf("/")) {
-    if (options.noglobstar) {
-      throw new Error("base matching requires globstar")
-    }
-    pattern = "**/" + pattern
-  }
-
-  self.silent = !!options.silent
-  self.pattern = pattern
-  self.strict = options.strict !== false
-  self.realpath = !!options.realpath
-  self.realpathCache = options.realpathCache || Object.create(null)
-  self.follow = !!options.follow
-  self.dot = !!options.dot
-  self.mark = !!options.mark
-  self.nodir = !!options.nodir
-  if (self.nodir)
-    self.mark = true
-  self.sync = !!options.sync
-  self.nounique = !!options.nounique
-  self.nonull = !!options.nonull
-  self.nosort = !!options.nosort
-  self.nocase = !!options.nocase
-  self.stat = !!options.stat
-  self.noprocess = !!options.noprocess
-
-  self.maxLength = options.maxLength || Infinity
-  self.cache = options.cache || Object.create(null)
-  self.statCache = options.statCache || Object.create(null)
-  self.symlinks = options.symlinks || Object.create(null)
-
-  setupIgnores(self, options)
-
-  self.changedCwd = false
-  var cwd = process.cwd()
-  if (!ownProp(options, "cwd"))
-    self.cwd = cwd
-  else {
-    self.cwd = path.resolve(options.cwd)
-    self.changedCwd = self.cwd !== cwd
-  }
-
-  self.root = options.root || path.resolve(self.cwd, "/")
-  self.root = path.resolve(self.root)
-  if (process.platform === "win32")
-    self.root = self.root.replace(/\\/g, "/")
-
-  self.cwdAbs = makeAbs(self, self.cwd)
-  self.nomount = !!options.nomount
-
-  // disable comments and negation in Minimatch.
-  // Note that they are not supported in Glob itself anyway.
-  options.nonegate = true
-  options.nocomment = true
-
-  self.minimatch = new Minimatch(pattern, options)
-  self.options = self.minimatch.options
-}
-
-function finish (self) {
-  var nou = self.nounique
-  var all = nou ? [] : Object.create(null)
-
-  for (var i = 0, l = self.matches.length; i < l; i ++) {
-    var matches = self.matches[i]
-    if (!matches || Object.keys(matches).length === 0) {
-      if (self.nonull) {
-        // do like the shell, and spit out the literal glob
-        var literal = self.minimatch.globSet[i]
-        if (nou)
-          all.push(literal)
-        else
-          all[literal] = true
-      }
-    } else {
-      // had matches
-      var m = Object.keys(matches)
-      if (nou)
-        all.push.apply(all, m)
-      else
-        m.forEach(function (m) {
-          all[m] = true
-        })
-    }
-  }
-
-  if (!nou)
-    all = Object.keys(all)
-
-  if (!self.nosort)
-    all = all.sort(self.nocase ? alphasorti : alphasort)
-
-  // at *some* point we statted all of these
-  if (self.mark) {
-    for (var i = 0; i < all.length; i++) {
-      all[i] = self._mark(all[i])
-    }
-    if (self.nodir) {
-      all = all.filter(function (e) {
-        var notDir = !(/\/$/.test(e))
-        var c = self.cache[e] || self.cache[makeAbs(self, e)]
-        if (notDir && c)
-          notDir = c !== 'DIR' && !Array.isArray(c)
-        return notDir
-      })
-    }
-  }
-
-  if (self.ignore.length)
-    all = all.filter(function(m) {
-      return !isIgnored(self, m)
-    })
-
-  self.found = all
-}
-
-function mark (self, p) {
-  var abs = makeAbs(self, p)
-  var c = self.cache[abs]
-  var m = p
-  if (c) {
-    var isDir = c === 'DIR' || Array.isArray(c)
-    var slash = p.slice(-1) === '/'
-
-    if (isDir && !slash)
-      m += '/'
-    else if (!isDir && slash)
-      m = m.slice(0, -1)
-
-    if (m !== p) {
-      var mabs = makeAbs(self, m)
-      self.statCache[mabs] = self.statCache[abs]
-      self.cache[mabs] = self.cache[abs]
-    }
-  }
-
-  return m
-}
-
-// lotta situps...
-function makeAbs (self, f) {
-  var abs = f
-  if (f.charAt(0) === '/') {
-    abs = path.join(self.root, f)
-  } else if (isAbsolute(f) || f === '') {
-    abs = f
-  } else if (self.changedCwd) {
-    abs = path.resolve(self.cwd, f)
-  } else {
-    abs = path.resolve(f)
-  }
-
-  if (process.platform === 'win32')
-    abs = abs.replace(/\\/g, '/')
-
-  return abs
-}
-
-
-// Return true, if pattern ends with globstar '**', for the accompanying parent directory.
-// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents
-function isIgnored (self, path) {
-  if (!self.ignore.length)
-    return false
-
-  return self.ignore.some(function(item) {
-    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))
-  })
-}
-
-function childrenIgnored (self, path) {
-  if (!self.ignore.length)
-    return false
-
-  return self.ignore.some(function(item) {
-    return !!(item.gmatcher && item.gmatcher.match(path))
-  })
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/glob.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/glob.js
deleted file mode 100644
index 02d15b755dd84eddf6a1d951f605b5fdcf67ce6f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/glob.js
+++ /dev/null
@@ -1,783 +0,0 @@
-// Approach:
-//
-// 1. Get the minimatch set
-// 2. For each pattern in the set, PROCESS(pattern, false)
-// 3. Store matches per-set, then uniq them
-//
-// PROCESS(pattern, inGlobStar)
-// Get the first [n] items from pattern that are all strings
-// Join these together.  This is PREFIX.
-//   If there is no more remaining, then stat(PREFIX) and
-//   add to matches if it succeeds.  END.
-//
-// If inGlobStar and PREFIX is symlink and points to dir
-//   set ENTRIES = []
-// else readdir(PREFIX) as ENTRIES
-//   If fail, END
-//
-// with ENTRIES
-//   If pattern[n] is GLOBSTAR
-//     // handle the case where the globstar match is empty
-//     // by pruning it out, and testing the resulting pattern
-//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)
-//     // handle other cases.
-//     for ENTRY in ENTRIES (not dotfiles)
-//       // attach globstar + tail onto the entry
-//       // Mark that this entry is a globstar match
-//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)
-//
-//   else // not globstar
-//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
-//       Test ENTRY against pattern[n]
-//       If fails, continue
-//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
-//
-// Caveat:
-//   Cache all stats and readdirs results to minimize syscall.  Since all
-//   we ever care about is existence and directory-ness, we can just keep
-//   `true` for files, and [children,...] for directories, or `false` for
-//   things that don't exist.
-
-module.exports = glob
-
-var fs = require('fs')
-var rp = require('fs.realpath')
-var minimatch = require('minimatch')
-var Minimatch = minimatch.Minimatch
-var inherits = require('inherits')
-var EE = require('events').EventEmitter
-var path = require('path')
-var assert = require('assert')
-var isAbsolute = require('path-is-absolute')
-var globSync = require('./sync.js')
-var common = require('./common.js')
-var alphasort = common.alphasort
-var alphasorti = common.alphasorti
-var setopts = common.setopts
-var ownProp = common.ownProp
-var inflight = require('inflight')
-var util = require('util')
-var childrenIgnored = common.childrenIgnored
-var isIgnored = common.isIgnored
-
-var once = require('once')
-
-function glob (pattern, options, cb) {
-  if (typeof options === 'function') cb = options, options = {}
-  if (!options) options = {}
-
-  if (options.sync) {
-    if (cb)
-      throw new TypeError('callback provided to sync glob')
-    return globSync(pattern, options)
-  }
-
-  return new Glob(pattern, options, cb)
-}
-
-glob.sync = globSync
-var GlobSync = glob.GlobSync = globSync.GlobSync
-
-// old api surface
-glob.glob = glob
-
-function extend (origin, add) {
-  if (add === null || typeof add !== 'object') {
-    return origin
-  }
-
-  var keys = Object.keys(add)
-  var i = keys.length
-  while (i--) {
-    origin[keys[i]] = add[keys[i]]
-  }
-  return origin
-}
-
-glob.hasMagic = function (pattern, options_) {
-  var options = extend({}, options_)
-  options.noprocess = true
-
-  var g = new Glob(pattern, options)
-  var set = g.minimatch.set
-  if (set.length > 1)
-    return true
-
-  for (var j = 0; j < set[0].length; j++) {
-    if (typeof set[0][j] !== 'string')
-      return true
-  }
-
-  return false
-}
-
-glob.Glob = Glob
-inherits(Glob, EE)
-function Glob (pattern, options, cb) {
-  if (typeof options === 'function') {
-    cb = options
-    options = null
-  }
-
-  if (options && options.sync) {
-    if (cb)
-      throw new TypeError('callback provided to sync glob')
-    return new GlobSync(pattern, options)
-  }
-
-  if (!(this instanceof Glob))
-    return new Glob(pattern, options, cb)
-
-  setopts(this, pattern, options)
-  this._didRealPath = false
-
-  // process each pattern in the minimatch set
-  var n = this.minimatch.set.length
-
-  // The matches are stored as {<filename>: true,...} so that
-  // duplicates are automagically pruned.
-  // Later, we do an Object.keys() on these.
-  // Keep them as a list so we can fill in when nonull is set.
-  this.matches = new Array(n)
-
-  if (typeof cb === 'function') {
-    cb = once(cb)
-    this.on('error', cb)
-    this.on('end', function (matches) {
-      cb(null, matches)
-    })
-  }
-
-  var self = this
-  var n = this.minimatch.set.length
-  this._processing = 0
-  this.matches = new Array(n)
-
-  this._emitQueue = []
-  this._processQueue = []
-  this.paused = false
-
-  if (this.noprocess)
-    return this
-
-  if (n === 0)
-    return done()
-
-  var sync = true
-  for (var i = 0; i < n; i ++) {
-    this._process(this.minimatch.set[i], i, false, done)
-  }
-  sync = false
-
-  function done () {
-    --self._processing
-    if (self._processing <= 0) {
-      if (sync) {
-        process.nextTick(function () {
-          self._finish()
-        })
-      } else {
-        self._finish()
-      }
-    }
-  }
-}
-
-Glob.prototype._finish = function () {
-  assert(this instanceof Glob)
-  if (this.aborted)
-    return
-
-  if (this.realpath && !this._didRealpath)
-    return this._realpath()
-
-  common.finish(this)
-  this.emit('end', this.found)
-}
-
-Glob.prototype._realpath = function () {
-  if (this._didRealpath)
-    return
-
-  this._didRealpath = true
-
-  var n = this.matches.length
-  if (n === 0)
-    return this._finish()
-
-  var self = this
-  for (var i = 0; i < this.matches.length; i++)
-    this._realpathSet(i, next)
-
-  function next () {
-    if (--n === 0)
-      self._finish()
-  }
-}
-
-Glob.prototype._realpathSet = function (index, cb) {
-  var matchset = this.matches[index]
-  if (!matchset)
-    return cb()
-
-  var found = Object.keys(matchset)
-  var self = this
-  var n = found.length
-
-  if (n === 0)
-    return cb()
-
-  var set = this.matches[index] = Object.create(null)
-  found.forEach(function (p, i) {
-    // If there's a problem with the stat, then it means that
-    // one or more of the links in the realpath couldn't be
-    // resolved.  just return the abs value in that case.
-    p = self._makeAbs(p)
-    rp.realpath(p, self.realpathCache, function (er, real) {
-      if (!er)
-        set[real] = true
-      else if (er.syscall === 'stat')
-        set[p] = true
-      else
-        self.emit('error', er) // srsly wtf right here
-
-      if (--n === 0) {
-        self.matches[index] = set
-        cb()
-      }
-    })
-  })
-}
-
-Glob.prototype._mark = function (p) {
-  return common.mark(this, p)
-}
-
-Glob.prototype._makeAbs = function (f) {
-  return common.makeAbs(this, f)
-}
-
-Glob.prototype.abort = function () {
-  this.aborted = true
-  this.emit('abort')
-}
-
-Glob.prototype.pause = function () {
-  if (!this.paused) {
-    this.paused = true
-    this.emit('pause')
-  }
-}
-
-Glob.prototype.resume = function () {
-  if (this.paused) {
-    this.emit('resume')
-    this.paused = false
-    if (this._emitQueue.length) {
-      var eq = this._emitQueue.slice(0)
-      this._emitQueue.length = 0
-      for (var i = 0; i < eq.length; i ++) {
-        var e = eq[i]
-        this._emitMatch(e[0], e[1])
-      }
-    }
-    if (this._processQueue.length) {
-      var pq = this._processQueue.slice(0)
-      this._processQueue.length = 0
-      for (var i = 0; i < pq.length; i ++) {
-        var p = pq[i]
-        this._processing--
-        this._process(p[0], p[1], p[2], p[3])
-      }
-    }
-  }
-}
-
-Glob.prototype._process = function (pattern, index, inGlobStar, cb) {
-  assert(this instanceof Glob)
-  assert(typeof cb === 'function')
-
-  if (this.aborted)
-    return
-
-  this._processing++
-  if (this.paused) {
-    this._processQueue.push([pattern, index, inGlobStar, cb])
-    return
-  }
-
-  //console.error('PROCESS %d', this._processing, pattern)
-
-  // Get the first [n] parts of pattern that are all strings.
-  var n = 0
-  while (typeof pattern[n] === 'string') {
-    n ++
-  }
-  // now n is the index of the first one that is *not* a string.
-
-  // see if there's anything else
-  var prefix
-  switch (n) {
-    // if not, then this is rather simple
-    case pattern.length:
-      this._processSimple(pattern.join('/'), index, cb)
-      return
-
-    case 0:
-      // pattern *starts* with some non-trivial item.
-      // going to readdir(cwd), but not include the prefix in matches.
-      prefix = null
-      break
-
-    default:
-      // pattern has some string bits in the front.
-      // whatever it starts with, whether that's 'absolute' like /foo/bar,
-      // or 'relative' like '../baz'
-      prefix = pattern.slice(0, n).join('/')
-      break
-  }
-
-  var remain = pattern.slice(n)
-
-  // get the list of entries.
-  var read
-  if (prefix === null)
-    read = '.'
-  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
-    if (!prefix || !isAbsolute(prefix))
-      prefix = '/' + prefix
-    read = prefix
-  } else
-    read = prefix
-
-  var abs = this._makeAbs(read)
-
-  //if ignored, skip _processing
-  if (childrenIgnored(this, read))
-    return cb()
-
-  var isGlobStar = remain[0] === minimatch.GLOBSTAR
-  if (isGlobStar)
-    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)
-  else
-    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)
-}
-
-Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {
-  var self = this
-  this._readdir(abs, inGlobStar, function (er, entries) {
-    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
-  })
-}
-
-Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
-
-  // if the abs isn't a dir, then nothing can match!
-  if (!entries)
-    return cb()
-
-  // It will only match dot entries if it starts with a dot, or if
-  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
-  var pn = remain[0]
-  var negate = !!this.minimatch.negate
-  var rawGlob = pn._glob
-  var dotOk = this.dot || rawGlob.charAt(0) === '.'
-
-  var matchedEntries = []
-  for (var i = 0; i < entries.length; i++) {
-    var e = entries[i]
-    if (e.charAt(0) !== '.' || dotOk) {
-      var m
-      if (negate && !prefix) {
-        m = !e.match(pn)
-      } else {
-        m = e.match(pn)
-      }
-      if (m)
-        matchedEntries.push(e)
-    }
-  }
-
-  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)
-
-  var len = matchedEntries.length
-  // If there are no matched entries, then nothing matches.
-  if (len === 0)
-    return cb()
-
-  // if this is the last remaining pattern bit, then no need for
-  // an additional stat *unless* the user has specified mark or
-  // stat explicitly.  We know they exist, since readdir returned
-  // them.
-
-  if (remain.length === 1 && !this.mark && !this.stat) {
-    if (!this.matches[index])
-      this.matches[index] = Object.create(null)
-
-    for (var i = 0; i < len; i ++) {
-      var e = matchedEntries[i]
-      if (prefix) {
-        if (prefix !== '/')
-          e = prefix + '/' + e
-        else
-          e = prefix + e
-      }
-
-      if (e.charAt(0) === '/' && !this.nomount) {
-        e = path.join(this.root, e)
-      }
-      this._emitMatch(index, e)
-    }
-    // This was the last one, and no stats were needed
-    return cb()
-  }
-
-  // now test all matched entries as stand-ins for that part
-  // of the pattern.
-  remain.shift()
-  for (var i = 0; i < len; i ++) {
-    var e = matchedEntries[i]
-    var newPattern
-    if (prefix) {
-      if (prefix !== '/')
-        e = prefix + '/' + e
-      else
-        e = prefix + e
-    }
-    this._process([e].concat(remain), index, inGlobStar, cb)
-  }
-  cb()
-}
-
-Glob.prototype._emitMatch = function (index, e) {
-  if (this.aborted)
-    return
-
-  if (this.matches[index][e])
-    return
-
-  if (isIgnored(this, e))
-    return
-
-  if (this.paused) {
-    this._emitQueue.push([index, e])
-    return
-  }
-
-  var abs = this._makeAbs(e)
-
-  if (this.nodir) {
-    var c = this.cache[abs]
-    if (c === 'DIR' || Array.isArray(c))
-      return
-  }
-
-  if (this.mark)
-    e = this._mark(e)
-
-  this.matches[index][e] = true
-
-  var st = this.statCache[abs]
-  if (st)
-    this.emit('stat', e, st)
-
-  this.emit('match', e)
-}
-
-Glob.prototype._readdirInGlobStar = function (abs, cb) {
-  if (this.aborted)
-    return
-
-  // follow all symlinked directories forever
-  // just proceed as if this is a non-globstar situation
-  if (this.follow)
-    return this._readdir(abs, false, cb)
-
-  var lstatkey = 'lstat\0' + abs
-  var self = this
-  var lstatcb = inflight(lstatkey, lstatcb_)
-
-  if (lstatcb)
-    fs.lstat(abs, lstatcb)
-
-  function lstatcb_ (er, lstat) {
-    if (er)
-      return cb()
-
-    var isSym = lstat.isSymbolicLink()
-    self.symlinks[abs] = isSym
-
-    // If it's not a symlink or a dir, then it's definitely a regular file.
-    // don't bother doing a readdir in that case.
-    if (!isSym && !lstat.isDirectory()) {
-      self.cache[abs] = 'FILE'
-      cb()
-    } else
-      self._readdir(abs, false, cb)
-  }
-}
-
-Glob.prototype._readdir = function (abs, inGlobStar, cb) {
-  if (this.aborted)
-    return
-
-  cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb)
-  if (!cb)
-    return
-
-  //console.error('RD %j %j', +inGlobStar, abs)
-  if (inGlobStar && !ownProp(this.symlinks, abs))
-    return this._readdirInGlobStar(abs, cb)
-
-  if (ownProp(this.cache, abs)) {
-    var c = this.cache[abs]
-    if (!c || c === 'FILE')
-      return cb()
-
-    if (Array.isArray(c))
-      return cb(null, c)
-  }
-
-  var self = this
-  fs.readdir(abs, readdirCb(this, abs, cb))
-}
-
-function readdirCb (self, abs, cb) {
-  return function (er, entries) {
-    if (er)
-      self._readdirError(abs, er, cb)
-    else
-      self._readdirEntries(abs, entries, cb)
-  }
-}
-
-Glob.prototype._readdirEntries = function (abs, entries, cb) {
-  if (this.aborted)
-    return
-
-  // if we haven't asked to stat everything, then just
-  // assume that everything in there exists, so we can avoid
-  // having to stat it a second time.
-  if (!this.mark && !this.stat) {
-    for (var i = 0; i < entries.length; i ++) {
-      var e = entries[i]
-      if (abs === '/')
-        e = abs + e
-      else
-        e = abs + '/' + e
-      this.cache[e] = true
-    }
-  }
-
-  this.cache[abs] = entries
-  return cb(null, entries)
-}
-
-Glob.prototype._readdirError = function (f, er, cb) {
-  if (this.aborted)
-    return
-
-  // handle errors, and cache the information
-  switch (er.code) {
-    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
-    case 'ENOTDIR': // totally normal. means it *does* exist.
-      var abs = this._makeAbs(f)
-      this.cache[abs] = 'FILE'
-      if (abs === this.cwdAbs) {
-        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
-        error.path = this.cwd
-        error.code = er.code
-        this.emit('error', error)
-        this.abort()
-      }
-      break
-
-    case 'ENOENT': // not terribly unusual
-    case 'ELOOP':
-    case 'ENAMETOOLONG':
-    case 'UNKNOWN':
-      this.cache[this._makeAbs(f)] = false
-      break
-
-    default: // some unusual error.  Treat as failure.
-      this.cache[this._makeAbs(f)] = false
-      if (this.strict) {
-        this.emit('error', er)
-        // If the error is handled, then we abort
-        // if not, we threw out of here
-        this.abort()
-      }
-      if (!this.silent)
-        console.error('glob error', er)
-      break
-  }
-
-  return cb()
-}
-
-Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {
-  var self = this
-  this._readdir(abs, inGlobStar, function (er, entries) {
-    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)
-  })
-}
-
-
-Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {
-  //console.error('pgs2', prefix, remain[0], entries)
-
-  // no entries means not a dir, so it can never have matches
-  // foo.txt/** doesn't match foo.txt
-  if (!entries)
-    return cb()
-
-  // test without the globstar, and with every child both below
-  // and replacing the globstar.
-  var remainWithoutGlobStar = remain.slice(1)
-  var gspref = prefix ? [ prefix ] : []
-  var noGlobStar = gspref.concat(remainWithoutGlobStar)
-
-  // the noGlobStar pattern exits the inGlobStar state
-  this._process(noGlobStar, index, false, cb)
-
-  var isSym = this.symlinks[abs]
-  var len = entries.length
-
-  // If it's a symlink, and we're in a globstar, then stop
-  if (isSym && inGlobStar)
-    return cb()
-
-  for (var i = 0; i < len; i++) {
-    var e = entries[i]
-    if (e.charAt(0) === '.' && !this.dot)
-      continue
-
-    // these two cases enter the inGlobStar state
-    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
-    this._process(instead, index, true, cb)
-
-    var below = gspref.concat(entries[i], remain)
-    this._process(below, index, true, cb)
-  }
-
-  cb()
-}
-
-Glob.prototype._processSimple = function (prefix, index, cb) {
-  // XXX review this.  Shouldn't it be doing the mounting etc
-  // before doing stat?  kinda weird?
-  var self = this
-  this._stat(prefix, function (er, exists) {
-    self._processSimple2(prefix, index, er, exists, cb)
-  })
-}
-Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {
-
-  //console.error('ps2', prefix, exists)
-
-  if (!this.matches[index])
-    this.matches[index] = Object.create(null)
-
-  // If it doesn't exist, then just mark the lack of results
-  if (!exists)
-    return cb()
-
-  if (prefix && isAbsolute(prefix) && !this.nomount) {
-    var trail = /[\/\\]$/.test(prefix)
-    if (prefix.charAt(0) === '/') {
-      prefix = path.join(this.root, prefix)
-    } else {
-      prefix = path.resolve(this.root, prefix)
-      if (trail)
-        prefix += '/'
-    }
-  }
-
-  if (process.platform === 'win32')
-    prefix = prefix.replace(/\\/g, '/')
-
-  // Mark this as a match
-  this._emitMatch(index, prefix)
-  cb()
-}
-
-// Returns either 'DIR', 'FILE', or false
-Glob.prototype._stat = function (f, cb) {
-  var abs = this._makeAbs(f)
-  var needDir = f.slice(-1) === '/'
-
-  if (f.length > this.maxLength)
-    return cb()
-
-  if (!this.stat && ownProp(this.cache, abs)) {
-    var c = this.cache[abs]
-
-    if (Array.isArray(c))
-      c = 'DIR'
-
-    // It exists, but maybe not how we need it
-    if (!needDir || c === 'DIR')
-      return cb(null, c)
-
-    if (needDir && c === 'FILE')
-      return cb()
-
-    // otherwise we have to stat, because maybe c=true
-    // if we know it exists, but not what it is.
-  }
-
-  var exists
-  var stat = this.statCache[abs]
-  if (stat !== undefined) {
-    if (stat === false)
-      return cb(null, stat)
-    else {
-      var type = stat.isDirectory() ? 'DIR' : 'FILE'
-      if (needDir && type === 'FILE')
-        return cb()
-      else
-        return cb(null, type, stat)
-    }
-  }
-
-  var self = this
-  var statcb = inflight('stat\0' + abs, lstatcb_)
-  if (statcb)
-    fs.lstat(abs, statcb)
-
-  function lstatcb_ (er, lstat) {
-    if (lstat && lstat.isSymbolicLink()) {
-      // If it's a symlink, then treat it as the target, unless
-      // the target does not exist, then treat it as a file.
-      return fs.stat(abs, function (er, stat) {
-        if (er)
-          self._stat2(f, abs, null, lstat, cb)
-        else
-          self._stat2(f, abs, er, stat, cb)
-      })
-    } else {
-      self._stat2(f, abs, er, lstat, cb)
-    }
-  }
-}
-
-Glob.prototype._stat2 = function (f, abs, er, stat, cb) {
-  if (er) {
-    this.statCache[abs] = false
-    return cb()
-  }
-
-  var needDir = f.slice(-1) === '/'
-  this.statCache[abs] = stat
-
-  if (abs.slice(-1) === '/' && !stat.isDirectory())
-    return cb(null, false, stat)
-
-  var c = stat.isDirectory() ? 'DIR' : 'FILE'
-  this.cache[abs] = this.cache[abs] || c
-
-  if (needDir && c !== 'DIR')
-    return cb()
-
-  return cb(null, c, stat)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/LICENSE
deleted file mode 100644
index 5bd884c252ac49343524aa20cc67d1c370c0749a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/LICENSE
+++ /dev/null
@@ -1,43 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-----
-
-This library bundles a version of the `fs.realpath` and `fs.realpathSync`
-methods from Node.js v0.10 under the terms of the Node.js MIT license.
-
-Node's license follows, also included at the header of `old.js` which contains
-the licensed code:
-
-  Copyright Joyent, Inc. and other Node contributors.
-
-  Permission is hereby granted, free of charge, to any person obtaining a
-  copy of this software and associated documentation files (the "Software"),
-  to deal in the Software without restriction, including without limitation
-  the rights to use, copy, modify, merge, publish, distribute, sublicense,
-  and/or sell copies of the Software, and to permit persons to whom the
-  Software is furnished to do so, subject to the following conditions:
-
-  The above copyright notice and this permission notice shall be included in
-  all copies or substantial portions of the Software.
-
-  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-  DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/README.md
deleted file mode 100644
index a42ceac62663ac72a9d39e17e8cbb6f53cf49bff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/README.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# fs.realpath
-
-A backwards-compatible fs.realpath for Node v6 and above
-
-In Node v6, the JavaScript implementation of fs.realpath was replaced
-with a faster (but less resilient) native implementation.  That raises
-new and platform-specific errors and cannot handle long or excessively
-symlink-looping paths.
-
-This module handles those cases by detecting the new errors and
-falling back to the JavaScript implementation.  On versions of Node
-prior to v6, it has no effect.
-
-## USAGE
-
-```js
-var rp = require('fs.realpath')
-
-// async version
-rp.realpath(someLongAndLoopingPath, function (er, real) {
-  // the ELOOP was handled, but it was a bit slower
-})
-
-// sync version
-var real = rp.realpathSync(someLongAndLoopingPath)
-
-// monkeypatch at your own risk!
-// This replaces the fs.realpath/fs.realpathSync builtins
-rp.monkeypatch()
-
-// un-do the monkeypatching
-rp.unmonkeypatch()
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/index.js
deleted file mode 100644
index b09c7c7e6364dad82ad4b5f4e358a06e66ed8bdd..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/index.js
+++ /dev/null
@@ -1,66 +0,0 @@
-module.exports = realpath
-realpath.realpath = realpath
-realpath.sync = realpathSync
-realpath.realpathSync = realpathSync
-realpath.monkeypatch = monkeypatch
-realpath.unmonkeypatch = unmonkeypatch
-
-var fs = require('fs')
-var origRealpath = fs.realpath
-var origRealpathSync = fs.realpathSync
-
-var version = process.version
-var ok = /^v[0-5]\./.test(version)
-var old = require('./old.js')
-
-function newError (er) {
-  return er && er.syscall === 'realpath' && (
-    er.code === 'ELOOP' ||
-    er.code === 'ENOMEM' ||
-    er.code === 'ENAMETOOLONG'
-  )
-}
-
-function realpath (p, cache, cb) {
-  if (ok) {
-    return origRealpath(p, cache, cb)
-  }
-
-  if (typeof cache === 'function') {
-    cb = cache
-    cache = null
-  }
-  origRealpath(p, cache, function (er, result) {
-    if (newError(er)) {
-      old.realpath(p, cache, cb)
-    } else {
-      cb(er, result)
-    }
-  })
-}
-
-function realpathSync (p, cache) {
-  if (ok) {
-    return origRealpathSync(p, cache)
-  }
-
-  try {
-    return origRealpathSync(p, cache)
-  } catch (er) {
-    if (newError(er)) {
-      return old.realpathSync(p, cache)
-    } else {
-      throw er
-    }
-  }
-}
-
-function monkeypatch () {
-  fs.realpath = realpath
-  fs.realpathSync = realpathSync
-}
-
-function unmonkeypatch () {
-  fs.realpath = origRealpath
-  fs.realpathSync = origRealpathSync
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/old.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/old.js
deleted file mode 100644
index b40305e73fd583364d50dde4daf74f17c19ce1a8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/old.js
+++ /dev/null
@@ -1,303 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var pathModule = require('path');
-var isWindows = process.platform === 'win32';
-var fs = require('fs');
-
-// JavaScript implementation of realpath, ported from node pre-v6
-
-var DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);
-
-function rethrow() {
-  // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and
-  // is fairly slow to generate.
-  var callback;
-  if (DEBUG) {
-    var backtrace = new Error;
-    callback = debugCallback;
-  } else
-    callback = missingCallback;
-
-  return callback;
-
-  function debugCallback(err) {
-    if (err) {
-      backtrace.message = err.message;
-      err = backtrace;
-      missingCallback(err);
-    }
-  }
-
-  function missingCallback(err) {
-    if (err) {
-      if (process.throwDeprecation)
-        throw err;  // Forgot a callback but don't know where? Use NODE_DEBUG=fs
-      else if (!process.noDeprecation) {
-        var msg = 'fs: missing callback ' + (err.stack || err.message);
-        if (process.traceDeprecation)
-          console.trace(msg);
-        else
-          console.error(msg);
-      }
-    }
-  }
-}
-
-function maybeCallback(cb) {
-  return typeof cb === 'function' ? cb : rethrow();
-}
-
-var normalize = pathModule.normalize;
-
-// Regexp that finds the next partion of a (partial) path
-// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']
-if (isWindows) {
-  var nextPartRe = /(.*?)(?:[\/\\]+|$)/g;
-} else {
-  var nextPartRe = /(.*?)(?:[\/]+|$)/g;
-}
-
-// Regex to find the device root, including trailing slash. E.g. 'c:\\'.
-if (isWindows) {
-  var splitRootRe = /^(?:[a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/][^\\\/]+)?[\\\/]*/;
-} else {
-  var splitRootRe = /^[\/]*/;
-}
-
-exports.realpathSync = function realpathSync(p, cache) {
-  // make p is absolute
-  p = pathModule.resolve(p);
-
-  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
-    return cache[p];
-  }
-
-  var original = p,
-      seenLinks = {},
-      knownHard = {};
-
-  // current character position in p
-  var pos;
-  // the partial path so far, including a trailing slash if any
-  var current;
-  // the partial path without a trailing slash (except when pointing at a root)
-  var base;
-  // the partial path scanned in the previous round, with slash
-  var previous;
-
-  start();
-
-  function start() {
-    // Skip over roots
-    var m = splitRootRe.exec(p);
-    pos = m[0].length;
-    current = m[0];
-    base = m[0];
-    previous = '';
-
-    // On windows, check that the root exists. On unix there is no need.
-    if (isWindows && !knownHard[base]) {
-      fs.lstatSync(base);
-      knownHard[base] = true;
-    }
-  }
-
-  // walk down the path, swapping out linked pathparts for their real
-  // values
-  // NB: p.length changes.
-  while (pos < p.length) {
-    // find the next part
-    nextPartRe.lastIndex = pos;
-    var result = nextPartRe.exec(p);
-    previous = current;
-    current += result[0];
-    base = previous + result[1];
-    pos = nextPartRe.lastIndex;
-
-    // continue if not a symlink
-    if (knownHard[base] || (cache && cache[base] === base)) {
-      continue;
-    }
-
-    var resolvedLink;
-    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
-      // some known symbolic link.  no need to stat again.
-      resolvedLink = cache[base];
-    } else {
-      var stat = fs.lstatSync(base);
-      if (!stat.isSymbolicLink()) {
-        knownHard[base] = true;
-        if (cache) cache[base] = base;
-        continue;
-      }
-
-      // read the link if it wasn't read before
-      // dev/ino always return 0 on windows, so skip the check.
-      var linkTarget = null;
-      if (!isWindows) {
-        var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
-        if (seenLinks.hasOwnProperty(id)) {
-          linkTarget = seenLinks[id];
-        }
-      }
-      if (linkTarget === null) {
-        fs.statSync(base);
-        linkTarget = fs.readlinkSync(base);
-      }
-      resolvedLink = pathModule.resolve(previous, linkTarget);
-      // track this, if given a cache.
-      if (cache) cache[base] = resolvedLink;
-      if (!isWindows) seenLinks[id] = linkTarget;
-    }
-
-    // resolve the link, then start over
-    p = pathModule.resolve(resolvedLink, p.slice(pos));
-    start();
-  }
-
-  if (cache) cache[original] = p;
-
-  return p;
-};
-
-
-exports.realpath = function realpath(p, cache, cb) {
-  if (typeof cb !== 'function') {
-    cb = maybeCallback(cache);
-    cache = null;
-  }
-
-  // make p is absolute
-  p = pathModule.resolve(p);
-
-  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {
-    return process.nextTick(cb.bind(null, null, cache[p]));
-  }
-
-  var original = p,
-      seenLinks = {},
-      knownHard = {};
-
-  // current character position in p
-  var pos;
-  // the partial path so far, including a trailing slash if any
-  var current;
-  // the partial path without a trailing slash (except when pointing at a root)
-  var base;
-  // the partial path scanned in the previous round, with slash
-  var previous;
-
-  start();
-
-  function start() {
-    // Skip over roots
-    var m = splitRootRe.exec(p);
-    pos = m[0].length;
-    current = m[0];
-    base = m[0];
-    previous = '';
-
-    // On windows, check that the root exists. On unix there is no need.
-    if (isWindows && !knownHard[base]) {
-      fs.lstat(base, function(err) {
-        if (err) return cb(err);
-        knownHard[base] = true;
-        LOOP();
-      });
-    } else {
-      process.nextTick(LOOP);
-    }
-  }
-
-  // walk down the path, swapping out linked pathparts for their real
-  // values
-  function LOOP() {
-    // stop if scanned past end of path
-    if (pos >= p.length) {
-      if (cache) cache[original] = p;
-      return cb(null, p);
-    }
-
-    // find the next part
-    nextPartRe.lastIndex = pos;
-    var result = nextPartRe.exec(p);
-    previous = current;
-    current += result[0];
-    base = previous + result[1];
-    pos = nextPartRe.lastIndex;
-
-    // continue if not a symlink
-    if (knownHard[base] || (cache && cache[base] === base)) {
-      return process.nextTick(LOOP);
-    }
-
-    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {
-      // known symbolic link.  no need to stat again.
-      return gotResolvedLink(cache[base]);
-    }
-
-    return fs.lstat(base, gotStat);
-  }
-
-  function gotStat(err, stat) {
-    if (err) return cb(err);
-
-    // if not a symlink, skip to the next path part
-    if (!stat.isSymbolicLink()) {
-      knownHard[base] = true;
-      if (cache) cache[base] = base;
-      return process.nextTick(LOOP);
-    }
-
-    // stat & read the link if not read before
-    // call gotTarget as soon as the link target is known
-    // dev/ino always return 0 on windows, so skip the check.
-    if (!isWindows) {
-      var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);
-      if (seenLinks.hasOwnProperty(id)) {
-        return gotTarget(null, seenLinks[id], base);
-      }
-    }
-    fs.stat(base, function(err) {
-      if (err) return cb(err);
-
-      fs.readlink(base, function(err, target) {
-        if (!isWindows) seenLinks[id] = target;
-        gotTarget(err, target);
-      });
-    });
-  }
-
-  function gotTarget(err, target, base) {
-    if (err) return cb(err);
-
-    var resolvedLink = pathModule.resolve(previous, target);
-    if (cache) cache[base] = resolvedLink;
-    gotResolvedLink(resolvedLink);
-  }
-
-  function gotResolvedLink(resolvedLink) {
-    // resolve the link, then start over
-    p = pathModule.resolve(resolvedLink, p.slice(pos));
-    start();
-  }
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/package.json
deleted file mode 100644
index 89452ef4f44b8f0b5f48398c3a8dcc73f1ebc3f3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/fs.realpath/package.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
-  "_from": "fs.realpath@>=1.0.0 <2.0.0",
-  "_id": "fs.realpath@1.0.0",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob/fs.realpath",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf/glob"
-  ],
-  "_resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-  "_shasum": "1504ad2523158caa40db4a2787cb01411994ea4f",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/fs.realpath/issues"
-  },
-  "dependencies": {},
-  "description": "Use node's fs.realpath, but fall back to the JS implementation if the native one fails",
-  "devDependencies": {},
-  "files": [
-    "index.js",
-    "old.js"
-  ],
-  "homepage": "https://github.com/isaacs/fs.realpath#readme",
-  "keywords": [
-    "fs",
-    "polyfill",
-    "realpath"
-  ],
-  "license": "ISC",
-  "main": "index.js",
-  "name": "fs.realpath",
-  "optionalDependencies": {},
-  "readme": "# fs.realpath\n\nA backwards-compatible fs.realpath for Node v6 and above\n\nIn Node v6, the JavaScript implementation of fs.realpath was replaced\nwith a faster (but less resilient) native implementation.  That raises\nnew and platform-specific errors and cannot handle long or excessively\nsymlink-looping paths.\n\nThis module handles those cases by detecting the new errors and\nfalling back to the JavaScript implementation.  On versions of Node\nprior to v6, it has no effect.\n\n## USAGE\n\n```js\nvar rp = require('fs.realpath')\n\n// async version\nrp.realpath(someLongAndLoopingPath, function (er, real) {\n  // the ELOOP was handled, but it was a bit slower\n})\n\n// sync version\nvar real = rp.realpathSync(someLongAndLoopingPath)\n\n// monkeypatch at your own risk!\n// This replaces the fs.realpath/fs.realpathSync builtins\nrp.monkeypatch()\n\n// un-do the monkeypatching\nrp.unmonkeypatch()\n```\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/isaacs/fs.realpath.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js --cov"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/LICENSE
deleted file mode 100644
index 05eeeb88c2ef4cc9bacbcc46d6cfcb6962f8b385..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/README.md
deleted file mode 100644
index 6dc8929171a8c50c0ab8c216b6000fe9c146f3fb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# inflight
-
-Add callbacks to requests in flight to avoid async duplication
-
-## USAGE
-
-```javascript
-var inflight = require('inflight')
-
-// some request that does some stuff
-function req(key, callback) {
-  // key is any random string.  like a url or filename or whatever.
-  //
-  // will return either a falsey value, indicating that the
-  // request for this key is already in flight, or a new callback
-  // which when called will call all callbacks passed to inflightk
-  // with the same key
-  callback = inflight(key, callback)
-
-  // If we got a falsey value back, then there's already a req going
-  if (!callback) return
-
-  // this is where you'd fetch the url or whatever
-  // callback is also once()-ified, so it can safely be assigned
-  // to multiple events etc.  First call wins.
-  setTimeout(function() {
-    callback(null, key)
-  }, 100)
-}
-
-// only assigns a single setTimeout
-// when it dings, all cbs get called
-req('foo', cb1)
-req('foo', cb2)
-req('foo', cb3)
-req('foo', cb4)
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/inflight.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/inflight.js
deleted file mode 100644
index 8bc96cbd3730b5d30f407bb801234707c5a21cb9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/inflight.js
+++ /dev/null
@@ -1,44 +0,0 @@
-var wrappy = require('wrappy')
-var reqs = Object.create(null)
-var once = require('once')
-
-module.exports = wrappy(inflight)
-
-function inflight (key, cb) {
-  if (reqs[key]) {
-    reqs[key].push(cb)
-    return null
-  } else {
-    reqs[key] = [cb]
-    return makeres(key)
-  }
-}
-
-function makeres (key) {
-  return once(function RES () {
-    var cbs = reqs[key]
-    var len = cbs.length
-    var args = slice(arguments)
-    for (var i = 0; i < len; i++) {
-      cbs[i].apply(null, args)
-    }
-    if (cbs.length > len) {
-      // added more in the interim.
-      // de-zalgo, just in case, but don't call again.
-      cbs.splice(0, len)
-      process.nextTick(function () {
-        RES.apply(null, args)
-      })
-    } else {
-      delete reqs[key]
-    }
-  })
-}
-
-function slice (args) {
-  var length = args.length
-  var array = []
-
-  for (var i = 0; i < length; i++) array[i] = args[i]
-  return array
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md
deleted file mode 100644
index 98eab2522b86e5fe32c92524c4ec778b98066cbf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# wrappy
-
-Callback wrapping utility
-
-## USAGE
-
-```javascript
-var wrappy = require("wrappy")
-
-// var wrapper = wrappy(wrapperFunction)
-
-// make sure a cb is called only once
-// See also: http://npm.im/once for this specific use case
-var once = wrappy(function (cb) {
-  var called = false
-  return function () {
-    if (called) return
-    called = true
-    return cb.apply(this, arguments)
-  }
-})
-
-function printBoo () {
-  console.log('boo')
-}
-// has some rando property
-printBoo.iAmBooPrinter = true
-
-var onlyPrintOnce = once(printBoo)
-
-onlyPrintOnce() // prints 'boo'
-onlyPrintOnce() // does nothing
-
-// random property is retained!
-assert.equal(onlyPrintOnce.iAmBooPrinter, true)
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json
deleted file mode 100644
index 12fc2f1b78ebf3af27c3f29a0111ea63c9f07f2b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "_from": "wrappy@>=1.0.0 <2.0.0",
-  "_id": "wrappy@1.0.2",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob/inflight/wrappy",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf/glob/inflight"
-  ],
-  "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-  "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/wrappy/issues"
-  },
-  "dependencies": {},
-  "description": "Callback wrapping utility",
-  "devDependencies": {
-    "tap": "^2.3.1"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "files": [
-    "wrappy.js"
-  ],
-  "homepage": "https://github.com/npm/wrappy",
-  "license": "ISC",
-  "main": "wrappy.js",
-  "name": "wrappy",
-  "optionalDependencies": {},
-  "readme": "# wrappy\n\nCallback wrapping utility\n\n## USAGE\n\n```javascript\nvar wrappy = require(\"wrappy\")\n\n// var wrapper = wrappy(wrapperFunction)\n\n// make sure a cb is called only once\n// See also: http://npm.im/once for this specific use case\nvar once = wrappy(function (cb) {\n  var called = false\n  return function () {\n    if (called) return\n    called = true\n    return cb.apply(this, arguments)\n  }\n})\n\nfunction printBoo () {\n  console.log('boo')\n}\n// has some rando property\nprintBoo.iAmBooPrinter = true\n\nvar onlyPrintOnce = once(printBoo)\n\nonlyPrintOnce() // prints 'boo'\nonlyPrintOnce() // does nothing\n\n// random property is retained!\nassert.equal(onlyPrintOnce.iAmBooPrinter, true)\n```\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/wrappy.git"
-  },
-  "scripts": {
-    "test": "tap --coverage test/*.js"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js
deleted file mode 100644
index bb7e7d6fcf70fdff4c5a48b7fa2ae3c9ba36fe47..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/node_modules/wrappy/wrappy.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// Returns a wrapper function that returns a wrapped callback
-// The wrapper function should do some stuff, and return a
-// presumably different callback function.
-// This makes sure that own properties are retained, so that
-// decorations and such are not lost along the way.
-module.exports = wrappy
-function wrappy (fn, cb) {
-  if (fn && cb) return wrappy(fn)(cb)
-
-  if (typeof fn !== 'function')
-    throw new TypeError('need wrapper function')
-
-  Object.keys(fn).forEach(function (k) {
-    wrapper[k] = fn[k]
-  })
-
-  return wrapper
-
-  function wrapper() {
-    var args = new Array(arguments.length)
-    for (var i = 0; i < args.length; i++) {
-      args[i] = arguments[i]
-    }
-    var ret = fn.apply(this, args)
-    var cb = args[args.length-1]
-    if (typeof ret === 'function' && ret !== cb) {
-      Object.keys(cb).forEach(function (k) {
-        ret[k] = cb[k]
-      })
-    }
-    return ret
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/package.json
deleted file mode 100644
index 0cbcef5bc86d91c1c3dcdb7c184a11346af7ed14..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inflight/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "_from": "inflight@>=1.0.4 <2.0.0",
-  "_id": "inflight@1.0.5",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob/inflight",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf/glob"
-  ],
-  "_resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.5.tgz",
-  "_shasum": "db3204cd5a9de2e6cd890b85c6e2f66bcf4f620a",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/inflight/issues"
-  },
-  "dependencies": {
-    "once": "^1.3.0",
-    "wrappy": "1"
-  },
-  "description": "Add callbacks to requests in flight to avoid async duplication",
-  "devDependencies": {
-    "tap": "^1.2.0"
-  },
-  "files": [
-    "inflight.js"
-  ],
-  "homepage": "https://github.com/isaacs/inflight",
-  "license": "ISC",
-  "main": "inflight.js",
-  "name": "inflight",
-  "optionalDependencies": {},
-  "readme": "# inflight\n\nAdd callbacks to requests in flight to avoid async duplication\n\n## USAGE\n\n```javascript\nvar inflight = require('inflight')\n\n// some request that does some stuff\nfunction req(key, callback) {\n  // key is any random string.  like a url or filename or whatever.\n  //\n  // will return either a falsey value, indicating that the\n  // request for this key is already in flight, or a new callback\n  // which when called will call all callbacks passed to inflightk\n  // with the same key\n  callback = inflight(key, callback)\n\n  // If we got a falsey value back, then there's already a req going\n  if (!callback) return\n\n  // this is where you'd fetch the url or whatever\n  // callback is also once()-ified, so it can safely be assigned\n  // to multiple events etc.  First call wins.\n  setTimeout(function() {\n    callback(null, key)\n  }, 100)\n}\n\n// only assigns a single setTimeout\n// when it dings, all cbs get called\nreq('foo', cb1)\nreq('foo', cb2)\nreq('foo', cb3)\nreq('foo', cb4)\n```\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/inflight.git"
-  },
-  "scripts": {
-    "test": "tap test.js"
-  },
-  "version": "1.0.5"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/LICENSE
deleted file mode 100644
index dea3013d6710ee273f49ac606a65d5211d480c88..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/LICENSE
+++ /dev/null
@@ -1,16 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/README.md
deleted file mode 100644
index b1c56658557b8162aa9f5ba8610ed03a5e558d9d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-Browser-friendly inheritance fully compatible with standard node.js
-[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
-
-This package exports standard `inherits` from node.js `util` module in
-node environment, but also provides alternative browser-friendly
-implementation through [browser
-field](https://gist.github.com/shtylman/4339901). Alternative
-implementation is a literal copy of standard one located in standalone
-module to avoid requiring of `util`. It also has a shim for old
-browsers with no `Object.create` support.
-
-While keeping you sure you are using standard `inherits`
-implementation in node.js environment, it allows bundlers such as
-[browserify](https://github.com/substack/node-browserify) to not
-include full `util` package to your client code if all you need is
-just `inherits` function. It worth, because browser shim for `util`
-package is large and `inherits` is often the single function you need
-from it.
-
-It's recommended to use this package instead of
-`require('util').inherits` for any code that has chances to be used
-not only in node.js but in browser too.
-
-## usage
-
-```js
-var inherits = require('inherits');
-// then use exactly as the standard one
-```
-
-## note on version ~1.0
-
-Version ~1.0 had completely different motivation and is not compatible
-neither with 2.0 nor with standard node.js `inherits`.
-
-If you are using version ~1.0 and planning to switch to ~2.0, be
-careful:
-
-* new version uses `super_` instead of `super` for referencing
-  superclass
-* new version overwrites current prototype while old one preserves any
-  existing fields on it
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits.js
deleted file mode 100644
index 29f5e24f57b5aacb9f199dea05a57fcbf4918bc1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('util').inherits
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits_browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits_browser.js
deleted file mode 100644
index c1e78a75e6b52b7434e7e8aa0d64d8abd593763b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/inherits_browser.js
+++ /dev/null
@@ -1,23 +0,0 @@
-if (typeof Object.create === 'function') {
-  // implementation from standard node.js 'util' module
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    ctor.prototype = Object.create(superCtor.prototype, {
-      constructor: {
-        value: ctor,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-  };
-} else {
-  // old school shim for old browsers
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    var TempCtor = function () {}
-    TempCtor.prototype = superCtor.prototype
-    ctor.prototype = new TempCtor()
-    ctor.prototype.constructor = ctor
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json
deleted file mode 100644
index df8ef4dcc2883d6fac90066624e962ab46693d0b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "_from": "inherits@>=2.0.0 <3.0.0",
-  "_id": "inherits@2.0.1",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob/inherits",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf/glob"
-  ],
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-  "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1",
-  "_shrinkwrap": null,
-  "browser": "./inherits_browser.js",
-  "bugs": {
-    "url": "https://github.com/isaacs/inherits/issues"
-  },
-  "dependencies": {},
-  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
-  "devDependencies": {},
-  "homepage": "https://github.com/isaacs/inherits#readme",
-  "keywords": [
-    "browser",
-    "browserify",
-    "class",
-    "inheritance",
-    "inherits",
-    "klass",
-    "object-oriented",
-    "oop"
-  ],
-  "license": "ISC",
-  "main": "./inherits.js",
-  "name": "inherits",
-  "optionalDependencies": {},
-  "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n  superclass\n* new version overwrites current prototype while old one preserves any\n  existing fields on it\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/inherits.git"
-  },
-  "scripts": {
-    "test": "node test"
-  },
-  "version": "2.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/test.js
deleted file mode 100644
index fc53012d31c0cde4f4bca408e7470e35a06f88fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/inherits/test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var inherits = require('./inherits.js')
-var assert = require('assert')
-
-function test(c) {
-  assert(c.constructor === Child)
-  assert(c.constructor.super_ === Parent)
-  assert(Object.getPrototypeOf(c) === Child.prototype)
-  assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype)
-  assert(c instanceof Child)
-  assert(c instanceof Parent)
-}
-
-function Child() {
-  Parent.call(this)
-  test(this)
-}
-
-function Parent() {}
-
-inherits(Child, Parent)
-
-var c = new Child
-test(c)
-
-console.log('ok')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/README.md
deleted file mode 100644
index ad72b8133eaf5e40329fa85dab2425f44cbf3aff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/README.md
+++ /dev/null
@@ -1,209 +0,0 @@
-# minimatch
-
-A minimal matching utility.
-
-[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.svg)](http://travis-ci.org/isaacs/minimatch)
-
-
-This is the matching library used internally by npm.
-
-It works by converting glob expressions into JavaScript `RegExp`
-objects.
-
-## Usage
-
-```javascript
-var minimatch = require("minimatch")
-
-minimatch("bar.foo", "*.foo") // true!
-minimatch("bar.foo", "*.bar") // false!
-minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
-```
-
-## Features
-
-Supports these glob features:
-
-* Brace Expansion
-* Extended glob matching
-* "Globstar" `**` matching
-
-See:
-
-* `man sh`
-* `man bash`
-* `man 3 fnmatch`
-* `man 5 gitignore`
-
-## Minimatch Class
-
-Create a minimatch object by instantiating the `minimatch.Minimatch` class.
-
-```javascript
-var Minimatch = require("minimatch").Minimatch
-var mm = new Minimatch(pattern, options)
-```
-
-### Properties
-
-* `pattern` The original pattern the minimatch object represents.
-* `options` The options supplied to the constructor.
-* `set` A 2-dimensional array of regexp or string expressions.
-  Each row in the
-  array corresponds to a brace-expanded pattern.  Each item in the row
-  corresponds to a single path-part.  For example, the pattern
-  `{a,b/c}/d` would expand to a set of patterns like:
-
-        [ [ a, d ]
-        , [ b, c, d ] ]
-
-    If a portion of the pattern doesn't have any "magic" in it
-    (that is, it's something like `"foo"` rather than `fo*o?`), then it
-    will be left as a string rather than converted to a regular
-    expression.
-
-* `regexp` Created by the `makeRe` method.  A single regular expression
-  expressing the entire pattern.  This is useful in cases where you wish
-  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
-* `negate` True if the pattern is negated.
-* `comment` True if the pattern is a comment.
-* `empty` True if the pattern is `""`.
-
-### Methods
-
-* `makeRe` Generate the `regexp` member if necessary, and return it.
-  Will return `false` if the pattern is invalid.
-* `match(fname)` Return true if the filename matches the pattern, or
-  false otherwise.
-* `matchOne(fileArray, patternArray, partial)` Take a `/`-split
-  filename, and match it against a single row in the `regExpSet`.  This
-  method is mainly for internal use, but is exposed so that it can be
-  used by a glob-walker that needs to avoid excessive filesystem calls.
-
-All other methods are internal, and will be called as necessary.
-
-### minimatch(path, pattern, options)
-
-Main export.  Tests a path against the pattern using the options.
-
-```javascript
-var isJS = minimatch(file, "*.js", { matchBase: true })
-```
-
-### minimatch.filter(pattern, options)
-
-Returns a function that tests its
-supplied argument, suitable for use with `Array.filter`.  Example:
-
-```javascript
-var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true}))
-```
-
-### minimatch.match(list, pattern, options)
-
-Match against the list of
-files, in the style of fnmatch or glob.  If nothing is matched, and
-options.nonull is set, then return a list containing the pattern itself.
-
-```javascript
-var javascripts = minimatch.match(fileList, "*.js", {matchBase: true}))
-```
-
-### minimatch.makeRe(pattern, options)
-
-Make a regular expression object from the pattern.
-
-## Options
-
-All options are `false` by default.
-
-### debug
-
-Dump a ton of stuff to stderr.
-
-### nobrace
-
-Do not expand `{a,b}` and `{1..3}` brace sets.
-
-### noglobstar
-
-Disable `**` matching against multiple folder names.
-
-### dot
-
-Allow patterns to match filenames starting with a period, even if
-the pattern does not explicitly have a period in that spot.
-
-Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
-is set.
-
-### noext
-
-Disable "extglob" style patterns like `+(a|b)`.
-
-### nocase
-
-Perform a case-insensitive match.
-
-### nonull
-
-When a match is not found by `minimatch.match`, return a list containing
-the pattern itself if this option is set.  When not set, an empty list
-is returned if there are no matches.
-
-### matchBase
-
-If set, then patterns without slashes will be matched
-against the basename of the path if it contains slashes.  For example,
-`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
-
-### nocomment
-
-Suppress the behavior of treating `#` at the start of a pattern as a
-comment.
-
-### nonegate
-
-Suppress the behavior of treating a leading `!` character as negation.
-
-### flipNegate
-
-Returns from negate expressions the same as if they were not negated.
-(Ie, true on a hit, false on a miss.)
-
-
-## Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between minimatch and other
-implementations, and are intentional.
-
-If the pattern starts with a `!` character, then it is negated.  Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally.  This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything.  Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/minimatch.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/minimatch.js
deleted file mode 100644
index 830a27246cd6bdfad8437ee80421b54191549e2d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/minimatch.js
+++ /dev/null
@@ -1,924 +0,0 @@
-module.exports = minimatch
-minimatch.Minimatch = Minimatch
-
-var path = { sep: '/' }
-try {
-  path = require('path')
-} catch (er) {}
-
-var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
-var expand = require('brace-expansion')
-
-// any single thing other than /
-// don't need to escape / when using new RegExp()
-var qmark = '[^/]'
-
-// * => any number of characters
-var star = qmark + '*?'
-
-// ** when dots are allowed.  Anything goes, except .. and .
-// not (^ or / followed by one or two dots followed by $ or /),
-// followed by anything, any number of times.
-var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
-
-// not a ^ or / followed by a dot,
-// followed by anything, any number of times.
-var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
-
-// characters that need to be escaped in RegExp.
-var reSpecials = charSet('().*{}+?[]^$\\!')
-
-// "abc" -> { a:true, b:true, c:true }
-function charSet (s) {
-  return s.split('').reduce(function (set, c) {
-    set[c] = true
-    return set
-  }, {})
-}
-
-// normalizes slashes.
-var slashSplit = /\/+/
-
-minimatch.filter = filter
-function filter (pattern, options) {
-  options = options || {}
-  return function (p, i, list) {
-    return minimatch(p, pattern, options)
-  }
-}
-
-function ext (a, b) {
-  a = a || {}
-  b = b || {}
-  var t = {}
-  Object.keys(b).forEach(function (k) {
-    t[k] = b[k]
-  })
-  Object.keys(a).forEach(function (k) {
-    t[k] = a[k]
-  })
-  return t
-}
-
-minimatch.defaults = function (def) {
-  if (!def || !Object.keys(def).length) return minimatch
-
-  var orig = minimatch
-
-  var m = function minimatch (p, pattern, options) {
-    return orig.minimatch(p, pattern, ext(def, options))
-  }
-
-  m.Minimatch = function Minimatch (pattern, options) {
-    return new orig.Minimatch(pattern, ext(def, options))
-  }
-
-  return m
-}
-
-Minimatch.defaults = function (def) {
-  if (!def || !Object.keys(def).length) return Minimatch
-  return minimatch.defaults(def).Minimatch
-}
-
-function minimatch (p, pattern, options) {
-  if (typeof pattern !== 'string') {
-    throw new TypeError('glob pattern string required')
-  }
-
-  if (!options) options = {}
-
-  // shortcut: comments match nothing.
-  if (!options.nocomment && pattern.charAt(0) === '#') {
-    return false
-  }
-
-  // "" only matches ""
-  if (pattern.trim() === '') return p === ''
-
-  return new Minimatch(pattern, options).match(p)
-}
-
-function Minimatch (pattern, options) {
-  if (!(this instanceof Minimatch)) {
-    return new Minimatch(pattern, options)
-  }
-
-  if (typeof pattern !== 'string') {
-    throw new TypeError('glob pattern string required')
-  }
-
-  if (!options) options = {}
-  pattern = pattern.trim()
-
-  // windows support: need to use /, not \
-  if (path.sep !== '/') {
-    pattern = pattern.split(path.sep).join('/')
-  }
-
-  this.options = options
-  this.set = []
-  this.pattern = pattern
-  this.regexp = null
-  this.negate = false
-  this.comment = false
-  this.empty = false
-
-  // make the set of regexps etc.
-  this.make()
-}
-
-Minimatch.prototype.debug = function () {}
-
-Minimatch.prototype.make = make
-function make () {
-  // don't do it more than once.
-  if (this._made) return
-
-  var pattern = this.pattern
-  var options = this.options
-
-  // empty patterns and comments match nothing.
-  if (!options.nocomment && pattern.charAt(0) === '#') {
-    this.comment = true
-    return
-  }
-  if (!pattern) {
-    this.empty = true
-    return
-  }
-
-  // step 1: figure out negation, etc.
-  this.parseNegate()
-
-  // step 2: expand braces
-  var set = this.globSet = this.braceExpand()
-
-  if (options.debug) this.debug = console.error
-
-  this.debug(this.pattern, set)
-
-  // step 3: now we have a set, so turn each one into a series of path-portion
-  // matching patterns.
-  // These will be regexps, except in the case of "**", which is
-  // set to the GLOBSTAR object for globstar behavior,
-  // and will not contain any / characters
-  set = this.globParts = set.map(function (s) {
-    return s.split(slashSplit)
-  })
-
-  this.debug(this.pattern, set)
-
-  // glob --> regexps
-  set = set.map(function (s, si, set) {
-    return s.map(this.parse, this)
-  }, this)
-
-  this.debug(this.pattern, set)
-
-  // filter out everything that didn't compile properly.
-  set = set.filter(function (s) {
-    return s.indexOf(false) === -1
-  })
-
-  this.debug(this.pattern, set)
-
-  this.set = set
-}
-
-Minimatch.prototype.parseNegate = parseNegate
-function parseNegate () {
-  var pattern = this.pattern
-  var negate = false
-  var options = this.options
-  var negateOffset = 0
-
-  if (options.nonegate) return
-
-  for (var i = 0, l = pattern.length
-    ; i < l && pattern.charAt(i) === '!'
-    ; i++) {
-    negate = !negate
-    negateOffset++
-  }
-
-  if (negateOffset) this.pattern = pattern.substr(negateOffset)
-  this.negate = negate
-}
-
-// Brace expansion:
-// a{b,c}d -> abd acd
-// a{b,}c -> abc ac
-// a{0..3}d -> a0d a1d a2d a3d
-// a{b,c{d,e}f}g -> abg acdfg acefg
-// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
-//
-// Invalid sets are not expanded.
-// a{2..}b -> a{2..}b
-// a{b}c -> a{b}c
-minimatch.braceExpand = function (pattern, options) {
-  return braceExpand(pattern, options)
-}
-
-Minimatch.prototype.braceExpand = braceExpand
-
-function braceExpand (pattern, options) {
-  if (!options) {
-    if (this instanceof Minimatch) {
-      options = this.options
-    } else {
-      options = {}
-    }
-  }
-
-  pattern = typeof pattern === 'undefined'
-    ? this.pattern : pattern
-
-  if (typeof pattern === 'undefined') {
-    throw new TypeError('undefined pattern')
-  }
-
-  if (options.nobrace ||
-    !pattern.match(/\{.*\}/)) {
-    // shortcut. no need to expand.
-    return [pattern]
-  }
-
-  return expand(pattern)
-}
-
-// parse a component of the expanded set.
-// At this point, no pattern may contain "/" in it
-// so we're going to return a 2d array, where each entry is the full
-// pattern, split on '/', and then turned into a regular expression.
-// A regexp is made at the end which joins each array with an
-// escaped /, and another full one which joins each regexp with |.
-//
-// Following the lead of Bash 4.1, note that "**" only has special meaning
-// when it is the *only* thing in a path portion.  Otherwise, any series
-// of * is equivalent to a single *.  Globstar behavior is enabled by
-// default, and can be disabled by setting options.noglobstar.
-Minimatch.prototype.parse = parse
-var SUBPARSE = {}
-function parse (pattern, isSub) {
-  if (pattern.length > 1024 * 64) {
-    throw new TypeError('pattern is too long')
-  }
-
-  var options = this.options
-
-  // shortcuts
-  if (!options.noglobstar && pattern === '**') return GLOBSTAR
-  if (pattern === '') return ''
-
-  var re = ''
-  var hasMagic = !!options.nocase
-  var escaping = false
-  // ? => one single character
-  var patternListStack = []
-  var negativeLists = []
-  var plType
-  var stateChar
-  var inClass = false
-  var reClassStart = -1
-  var classStart = -1
-  // . and .. never match anything that doesn't start with .,
-  // even when options.dot is set.
-  var patternStart = pattern.charAt(0) === '.' ? '' // anything
-  // not (start or / followed by . or .. followed by / or end)
-  : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
-  : '(?!\\.)'
-  var self = this
-
-  function clearStateChar () {
-    if (stateChar) {
-      // we had some state-tracking character
-      // that wasn't consumed by this pass.
-      switch (stateChar) {
-        case '*':
-          re += star
-          hasMagic = true
-        break
-        case '?':
-          re += qmark
-          hasMagic = true
-        break
-        default:
-          re += '\\' + stateChar
-        break
-      }
-      self.debug('clearStateChar %j %j', stateChar, re)
-      stateChar = false
-    }
-  }
-
-  for (var i = 0, len = pattern.length, c
-    ; (i < len) && (c = pattern.charAt(i))
-    ; i++) {
-    this.debug('%s\t%s %s %j', pattern, i, re, c)
-
-    // skip over any that are escaped.
-    if (escaping && reSpecials[c]) {
-      re += '\\' + c
-      escaping = false
-      continue
-    }
-
-    switch (c) {
-      case '/':
-        // completely not allowed, even escaped.
-        // Should already be path-split by now.
-        return false
-
-      case '\\':
-        clearStateChar()
-        escaping = true
-      continue
-
-      // the various stateChar values
-      // for the "extglob" stuff.
-      case '?':
-      case '*':
-      case '+':
-      case '@':
-      case '!':
-        this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
-
-        // all of those are literals inside a class, except that
-        // the glob [!a] means [^a] in regexp
-        if (inClass) {
-          this.debug('  in class')
-          if (c === '!' && i === classStart + 1) c = '^'
-          re += c
-          continue
-        }
-
-        // if we already have a stateChar, then it means
-        // that there was something like ** or +? in there.
-        // Handle the stateChar, then proceed with this one.
-        self.debug('call clearStateChar %j', stateChar)
-        clearStateChar()
-        stateChar = c
-        // if extglob is disabled, then +(asdf|foo) isn't a thing.
-        // just clear the statechar *now*, rather than even diving into
-        // the patternList stuff.
-        if (options.noext) clearStateChar()
-      continue
-
-      case '(':
-        if (inClass) {
-          re += '('
-          continue
-        }
-
-        if (!stateChar) {
-          re += '\\('
-          continue
-        }
-
-        plType = stateChar
-        patternListStack.push({
-          type: plType,
-          start: i - 1,
-          reStart: re.length
-        })
-        // negation is (?:(?!js)[^/]*)
-        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
-        this.debug('plType %j %j', stateChar, re)
-        stateChar = false
-      continue
-
-      case ')':
-        if (inClass || !patternListStack.length) {
-          re += '\\)'
-          continue
-        }
-
-        clearStateChar()
-        hasMagic = true
-        re += ')'
-        var pl = patternListStack.pop()
-        plType = pl.type
-        // negation is (?:(?!js)[^/]*)
-        // The others are (?:<pattern>)<type>
-        switch (plType) {
-          case '!':
-            negativeLists.push(pl)
-            re += ')[^/]*?)'
-            pl.reEnd = re.length
-            break
-          case '?':
-          case '+':
-          case '*':
-            re += plType
-            break
-          case '@': break // the default anyway
-        }
-      continue
-
-      case '|':
-        if (inClass || !patternListStack.length || escaping) {
-          re += '\\|'
-          escaping = false
-          continue
-        }
-
-        clearStateChar()
-        re += '|'
-      continue
-
-      // these are mostly the same in regexp and glob
-      case '[':
-        // swallow any state-tracking char before the [
-        clearStateChar()
-
-        if (inClass) {
-          re += '\\' + c
-          continue
-        }
-
-        inClass = true
-        classStart = i
-        reClassStart = re.length
-        re += c
-      continue
-
-      case ']':
-        //  a right bracket shall lose its special
-        //  meaning and represent itself in
-        //  a bracket expression if it occurs
-        //  first in the list.  -- POSIX.2 2.8.3.2
-        if (i === classStart + 1 || !inClass) {
-          re += '\\' + c
-          escaping = false
-          continue
-        }
-
-        // handle the case where we left a class open.
-        // "[z-a]" is valid, equivalent to "\[z-a\]"
-        if (inClass) {
-          // split where the last [ was, make sure we don't have
-          // an invalid re. if so, re-walk the contents of the
-          // would-be class to re-translate any characters that
-          // were passed through as-is
-          // TODO: It would probably be faster to determine this
-          // without a try/catch and a new RegExp, but it's tricky
-          // to do safely.  For now, this is safe and works.
-          var cs = pattern.substring(classStart + 1, i)
-          try {
-            RegExp('[' + cs + ']')
-          } catch (er) {
-            // not a valid class!
-            var sp = this.parse(cs, SUBPARSE)
-            re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
-            hasMagic = hasMagic || sp[1]
-            inClass = false
-            continue
-          }
-        }
-
-        // finish up the class.
-        hasMagic = true
-        inClass = false
-        re += c
-      continue
-
-      default:
-        // swallow any state char that wasn't consumed
-        clearStateChar()
-
-        if (escaping) {
-          // no need
-          escaping = false
-        } else if (reSpecials[c]
-          && !(c === '^' && inClass)) {
-          re += '\\'
-        }
-
-        re += c
-
-    } // switch
-  } // for
-
-  // handle the case where we left a class open.
-  // "[abc" is valid, equivalent to "\[abc"
-  if (inClass) {
-    // split where the last [ was, and escape it
-    // this is a huge pita.  We now have to re-walk
-    // the contents of the would-be class to re-translate
-    // any characters that were passed through as-is
-    cs = pattern.substr(classStart + 1)
-    sp = this.parse(cs, SUBPARSE)
-    re = re.substr(0, reClassStart) + '\\[' + sp[0]
-    hasMagic = hasMagic || sp[1]
-  }
-
-  // handle the case where we had a +( thing at the *end*
-  // of the pattern.
-  // each pattern list stack adds 3 chars, and we need to go through
-  // and escape any | chars that were passed through as-is for the regexp.
-  // Go through and escape them, taking care not to double-escape any
-  // | chars that were already escaped.
-  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
-    var tail = re.slice(pl.reStart + 3)
-    // maybe some even number of \, then maybe 1 \, followed by a |
-    tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
-      if (!$2) {
-        // the | isn't already escaped, so escape it.
-        $2 = '\\'
-      }
-
-      // need to escape all those slashes *again*, without escaping the
-      // one that we need for escaping the | character.  As it works out,
-      // escaping an even number of slashes can be done by simply repeating
-      // it exactly after itself.  That's why this trick works.
-      //
-      // I am sorry that you have to see this.
-      return $1 + $1 + $2 + '|'
-    })
-
-    this.debug('tail=%j\n   %s', tail, tail)
-    var t = pl.type === '*' ? star
-      : pl.type === '?' ? qmark
-      : '\\' + pl.type
-
-    hasMagic = true
-    re = re.slice(0, pl.reStart) + t + '\\(' + tail
-  }
-
-  // handle trailing things that only matter at the very end.
-  clearStateChar()
-  if (escaping) {
-    // trailing \\
-    re += '\\\\'
-  }
-
-  // only need to apply the nodot start if the re starts with
-  // something that could conceivably capture a dot
-  var addPatternStart = false
-  switch (re.charAt(0)) {
-    case '.':
-    case '[':
-    case '(': addPatternStart = true
-  }
-
-  // Hack to work around lack of negative lookbehind in JS
-  // A pattern like: *.!(x).!(y|z) needs to ensure that a name
-  // like 'a.xyz.yz' doesn't match.  So, the first negative
-  // lookahead, has to look ALL the way ahead, to the end of
-  // the pattern.
-  for (var n = negativeLists.length - 1; n > -1; n--) {
-    var nl = negativeLists[n]
-
-    var nlBefore = re.slice(0, nl.reStart)
-    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
-    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
-    var nlAfter = re.slice(nl.reEnd)
-
-    nlLast += nlAfter
-
-    // Handle nested stuff like *(*.js|!(*.json)), where open parens
-    // mean that we should *not* include the ) in the bit that is considered
-    // "after" the negated section.
-    var openParensBefore = nlBefore.split('(').length - 1
-    var cleanAfter = nlAfter
-    for (i = 0; i < openParensBefore; i++) {
-      cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
-    }
-    nlAfter = cleanAfter
-
-    var dollar = ''
-    if (nlAfter === '' && isSub !== SUBPARSE) {
-      dollar = '$'
-    }
-    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
-    re = newRe
-  }
-
-  // if the re is not "" at this point, then we need to make sure
-  // it doesn't match against an empty path part.
-  // Otherwise a/* will match a/, which it should not.
-  if (re !== '' && hasMagic) {
-    re = '(?=.)' + re
-  }
-
-  if (addPatternStart) {
-    re = patternStart + re
-  }
-
-  // parsing just a piece of a larger pattern.
-  if (isSub === SUBPARSE) {
-    return [re, hasMagic]
-  }
-
-  // skip the regexp for non-magical patterns
-  // unescape anything in it, though, so that it'll be
-  // an exact match against a file etc.
-  if (!hasMagic) {
-    return globUnescape(pattern)
-  }
-
-  var flags = options.nocase ? 'i' : ''
-  try {
-    var regExp = new RegExp('^' + re + '$', flags)
-  } catch (er) {
-    // If it was an invalid regular expression, then it can't match
-    // anything.  This trick looks for a character after the end of
-    // the string, which is of course impossible, except in multi-line
-    // mode, but it's not a /m regex.
-    return new RegExp('$.')
-  }
-
-  regExp._glob = pattern
-  regExp._src = re
-
-  return regExp
-}
-
-minimatch.makeRe = function (pattern, options) {
-  return new Minimatch(pattern, options || {}).makeRe()
-}
-
-Minimatch.prototype.makeRe = makeRe
-function makeRe () {
-  if (this.regexp || this.regexp === false) return this.regexp
-
-  // at this point, this.set is a 2d array of partial
-  // pattern strings, or "**".
-  //
-  // It's better to use .match().  This function shouldn't
-  // be used, really, but it's pretty convenient sometimes,
-  // when you just want to work with a regex.
-  var set = this.set
-
-  if (!set.length) {
-    this.regexp = false
-    return this.regexp
-  }
-  var options = this.options
-
-  var twoStar = options.noglobstar ? star
-    : options.dot ? twoStarDot
-    : twoStarNoDot
-  var flags = options.nocase ? 'i' : ''
-
-  var re = set.map(function (pattern) {
-    return pattern.map(function (p) {
-      return (p === GLOBSTAR) ? twoStar
-      : (typeof p === 'string') ? regExpEscape(p)
-      : p._src
-    }).join('\\\/')
-  }).join('|')
-
-  // must match entire pattern
-  // ending in a * or ** will make it less strict.
-  re = '^(?:' + re + ')$'
-
-  // can match anything, as long as it's not this.
-  if (this.negate) re = '^(?!' + re + ').*$'
-
-  try {
-    this.regexp = new RegExp(re, flags)
-  } catch (ex) {
-    this.regexp = false
-  }
-  return this.regexp
-}
-
-minimatch.match = function (list, pattern, options) {
-  options = options || {}
-  var mm = new Minimatch(pattern, options)
-  list = list.filter(function (f) {
-    return mm.match(f)
-  })
-  if (mm.options.nonull && !list.length) {
-    list.push(pattern)
-  }
-  return list
-}
-
-Minimatch.prototype.match = match
-function match (f, partial) {
-  this.debug('match', f, this.pattern)
-  // short-circuit in the case of busted things.
-  // comments, etc.
-  if (this.comment) return false
-  if (this.empty) return f === ''
-
-  if (f === '/' && partial) return true
-
-  var options = this.options
-
-  // windows: need to use /, not \
-  if (path.sep !== '/') {
-    f = f.split(path.sep).join('/')
-  }
-
-  // treat the test path as a set of pathparts.
-  f = f.split(slashSplit)
-  this.debug(this.pattern, 'split', f)
-
-  // just ONE of the pattern sets in this.set needs to match
-  // in order for it to be valid.  If negating, then just one
-  // match means that we have failed.
-  // Either way, return on the first hit.
-
-  var set = this.set
-  this.debug(this.pattern, 'set', set)
-
-  // Find the basename of the path by looking for the last non-empty segment
-  var filename
-  var i
-  for (i = f.length - 1; i >= 0; i--) {
-    filename = f[i]
-    if (filename) break
-  }
-
-  for (i = 0; i < set.length; i++) {
-    var pattern = set[i]
-    var file = f
-    if (options.matchBase && pattern.length === 1) {
-      file = [filename]
-    }
-    var hit = this.matchOne(file, pattern, partial)
-    if (hit) {
-      if (options.flipNegate) return true
-      return !this.negate
-    }
-  }
-
-  // didn't get any hits.  this is success if it's a negative
-  // pattern, failure otherwise.
-  if (options.flipNegate) return false
-  return this.negate
-}
-
-// set partial to true to test if, for example,
-// "/a/b" matches the start of "/*/b/*/d"
-// Partial means, if you run out of file before you run
-// out of pattern, then that's fine, as long as all
-// the parts match.
-Minimatch.prototype.matchOne = function (file, pattern, partial) {
-  var options = this.options
-
-  this.debug('matchOne',
-    { 'this': this, file: file, pattern: pattern })
-
-  this.debug('matchOne', file.length, pattern.length)
-
-  for (var fi = 0,
-      pi = 0,
-      fl = file.length,
-      pl = pattern.length
-      ; (fi < fl) && (pi < pl)
-      ; fi++, pi++) {
-    this.debug('matchOne loop')
-    var p = pattern[pi]
-    var f = file[fi]
-
-    this.debug(pattern, p, f)
-
-    // should be impossible.
-    // some invalid regexp stuff in the set.
-    if (p === false) return false
-
-    if (p === GLOBSTAR) {
-      this.debug('GLOBSTAR', [pattern, p, f])
-
-      // "**"
-      // a/**/b/**/c would match the following:
-      // a/b/x/y/z/c
-      // a/x/y/z/b/c
-      // a/b/x/b/x/c
-      // a/b/c
-      // To do this, take the rest of the pattern after
-      // the **, and see if it would match the file remainder.
-      // If so, return success.
-      // If not, the ** "swallows" a segment, and try again.
-      // This is recursively awful.
-      //
-      // a/**/b/**/c matching a/b/x/y/z/c
-      // - a matches a
-      // - doublestar
-      //   - matchOne(b/x/y/z/c, b/**/c)
-      //     - b matches b
-      //     - doublestar
-      //       - matchOne(x/y/z/c, c) -> no
-      //       - matchOne(y/z/c, c) -> no
-      //       - matchOne(z/c, c) -> no
-      //       - matchOne(c, c) yes, hit
-      var fr = fi
-      var pr = pi + 1
-      if (pr === pl) {
-        this.debug('** at the end')
-        // a ** at the end will just swallow the rest.
-        // We have found a match.
-        // however, it will not swallow /.x, unless
-        // options.dot is set.
-        // . and .. are *never* matched by **, for explosively
-        // exponential reasons.
-        for (; fi < fl; fi++) {
-          if (file[fi] === '.' || file[fi] === '..' ||
-            (!options.dot && file[fi].charAt(0) === '.')) return false
-        }
-        return true
-      }
-
-      // ok, let's see if we can swallow whatever we can.
-      while (fr < fl) {
-        var swallowee = file[fr]
-
-        this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
-
-        // XXX remove this slice.  Just pass the start index.
-        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-          this.debug('globstar found match!', fr, fl, swallowee)
-          // found a match.
-          return true
-        } else {
-          // can't swallow "." or ".." ever.
-          // can only swallow ".foo" when explicitly asked.
-          if (swallowee === '.' || swallowee === '..' ||
-            (!options.dot && swallowee.charAt(0) === '.')) {
-            this.debug('dot detected!', file, fr, pattern, pr)
-            break
-          }
-
-          // ** swallows a segment, and continue.
-          this.debug('globstar swallow a segment, and continue')
-          fr++
-        }
-      }
-
-      // no match was found.
-      // However, in partial mode, we can't say this is necessarily over.
-      // If there's more *pattern* left, then
-      if (partial) {
-        // ran out of file
-        this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
-        if (fr === fl) return true
-      }
-      return false
-    }
-
-    // something other than **
-    // non-magic patterns just have to match exactly
-    // patterns with magic have been turned into regexps.
-    var hit
-    if (typeof p === 'string') {
-      if (options.nocase) {
-        hit = f.toLowerCase() === p.toLowerCase()
-      } else {
-        hit = f === p
-      }
-      this.debug('string match', p, f, hit)
-    } else {
-      hit = f.match(p)
-      this.debug('pattern match', p, f, hit)
-    }
-
-    if (!hit) return false
-  }
-
-  // Note: ending in / means that we'll get a final ""
-  // at the end of the pattern.  This can only match a
-  // corresponding "" at the end of the file.
-  // If the file ends in /, then it can only match a
-  // a pattern that ends in /, unless the pattern just
-  // doesn't have any more for it. But, a/b/ should *not*
-  // match "a/b/*", even though "" matches against the
-  // [^/]*? pattern, except in partial mode, where it might
-  // simply not be reached yet.
-  // However, a/b/ should still satisfy a/*
-
-  // now either we fell off the end of the pattern, or we're done.
-  if (fi === fl && pi === pl) {
-    // ran out of pattern and filename at the same time.
-    // an exact hit!
-    return true
-  } else if (fi === fl) {
-    // ran out of file, but still had pattern left.
-    // this is ok if we're doing the match as part of
-    // a glob fs traversal.
-    return partial
-  } else if (pi === pl) {
-    // ran out of pattern, still have file left.
-    // this is only acceptable if we're on the very last
-    // empty segment of a file with a trailing slash.
-    // a/* should match a/b/
-    var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')
-    return emptyFileEnd
-  }
-
-  // should be unreachable.
-  throw new Error('wtf?')
-}
-
-// replace stuff like \* with *
-function globUnescape (s) {
-  return s.replace(/\\(.)/g, '$1')
-}
-
-function regExpEscape (s) {
-  return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md
deleted file mode 100644
index 179392978d30fe42f7825cbc2ce49455bf2d0743..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/README.md
+++ /dev/null
@@ -1,122 +0,0 @@
-# brace-expansion
-
-[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), 
-as known from sh/bash, in JavaScript.
-
-[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion)
-[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)
-
-[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion)
-
-## Example
-
-```js
-var expand = require('brace-expansion');
-
-expand('file-{a,b,c}.jpg')
-// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
-
-expand('-v{,,}')
-// => ['-v', '-v', '-v']
-
-expand('file{0..2}.jpg')
-// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
-
-expand('file-{a..c}.jpg')
-// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
-
-expand('file{2..0}.jpg')
-// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
-
-expand('file{0..4..2}.jpg')
-// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
-
-expand('file-{a..e..2}.jpg')
-// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
-
-expand('file{00..10..5}.jpg')
-// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
-
-expand('{{A..C},{a..c}}')
-// => ['A', 'B', 'C', 'a', 'b', 'c']
-
-expand('ppp{,config,oe{,conf}}')
-// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
-```
-
-## API
-
-```js
-var expand = require('brace-expansion');
-```
-
-### var expanded = expand(str)
-
-Return an array of all possible and valid expansions of `str`. If none are
-found, `[str]` is returned.
-
-Valid expansions are:
-
-```js
-/^(.*,)+(.+)?$/
-// {a,b,...}
-```
-
-A comma seperated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
-
-```js
-/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
-// {x..y[..incr]}
-```
-
-A numeric sequence from `x` to `y` inclusive, with optional increment.
-If `x` or `y` start with a leading `0`, all the numbers will be padded
-to have equal length. Negative numbers and backwards iteration work too.
-
-```js
-/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
-// {x..y[..incr]}
-```
-
-An alphabetic sequence from `x` to `y` inclusive, with optional increment.
-`x` and `y` must be exactly one character, and if given, `incr` must be a
-number.
-
-For compatibility reasons, the string `${` is not eligible for brace expansion.
-
-## Installation
-
-With [npm](https://npmjs.org) do:
-
-```bash
-npm install brace-expansion
-```
-
-## Contributors
-
-- [Julian Gruber](https://github.com/juliangruber)
-- [Isaac Z. Schlueter](https://github.com/isaacs)
-
-## License
-
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js
deleted file mode 100644
index 932718f92871731947b65be3641112d66dc4b413..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/index.js
+++ /dev/null
@@ -1,191 +0,0 @@
-var concatMap = require('concat-map');
-var balanced = require('balanced-match');
-
-module.exports = expandTop;
-
-var escSlash = '\0SLASH'+Math.random()+'\0';
-var escOpen = '\0OPEN'+Math.random()+'\0';
-var escClose = '\0CLOSE'+Math.random()+'\0';
-var escComma = '\0COMMA'+Math.random()+'\0';
-var escPeriod = '\0PERIOD'+Math.random()+'\0';
-
-function numeric(str) {
-  return parseInt(str, 10) == str
-    ? parseInt(str, 10)
-    : str.charCodeAt(0);
-}
-
-function escapeBraces(str) {
-  return str.split('\\\\').join(escSlash)
-            .split('\\{').join(escOpen)
-            .split('\\}').join(escClose)
-            .split('\\,').join(escComma)
-            .split('\\.').join(escPeriod);
-}
-
-function unescapeBraces(str) {
-  return str.split(escSlash).join('\\')
-            .split(escOpen).join('{')
-            .split(escClose).join('}')
-            .split(escComma).join(',')
-            .split(escPeriod).join('.');
-}
-
-
-// Basically just str.split(","), but handling cases
-// where we have nested braced sections, which should be
-// treated as individual members, like {a,{b,c},d}
-function parseCommaParts(str) {
-  if (!str)
-    return [''];
-
-  var parts = [];
-  var m = balanced('{', '}', str);
-
-  if (!m)
-    return str.split(',');
-
-  var pre = m.pre;
-  var body = m.body;
-  var post = m.post;
-  var p = pre.split(',');
-
-  p[p.length-1] += '{' + body + '}';
-  var postParts = parseCommaParts(post);
-  if (post.length) {
-    p[p.length-1] += postParts.shift();
-    p.push.apply(p, postParts);
-  }
-
-  parts.push.apply(parts, p);
-
-  return parts;
-}
-
-function expandTop(str) {
-  if (!str)
-    return [];
-
-  return expand(escapeBraces(str), true).map(unescapeBraces);
-}
-
-function identity(e) {
-  return e;
-}
-
-function embrace(str) {
-  return '{' + str + '}';
-}
-function isPadded(el) {
-  return /^-?0\d/.test(el);
-}
-
-function lte(i, y) {
-  return i <= y;
-}
-function gte(i, y) {
-  return i >= y;
-}
-
-function expand(str, isTop) {
-  var expansions = [];
-
-  var m = balanced('{', '}', str);
-  if (!m || /\$$/.test(m.pre)) return [str];
-
-  var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
-  var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
-  var isSequence = isNumericSequence || isAlphaSequence;
-  var isOptions = /^(.*,)+(.+)?$/.test(m.body);
-  if (!isSequence && !isOptions) {
-    // {a},b}
-    if (m.post.match(/,.*\}/)) {
-      str = m.pre + '{' + m.body + escClose + m.post;
-      return expand(str);
-    }
-    return [str];
-  }
-
-  var n;
-  if (isSequence) {
-    n = m.body.split(/\.\./);
-  } else {
-    n = parseCommaParts(m.body);
-    if (n.length === 1) {
-      // x{{a,b}}y ==> x{a}y x{b}y
-      n = expand(n[0], false).map(embrace);
-      if (n.length === 1) {
-        var post = m.post.length
-          ? expand(m.post, false)
-          : [''];
-        return post.map(function(p) {
-          return m.pre + n[0] + p;
-        });
-      }
-    }
-  }
-
-  // at this point, n is the parts, and we know it's not a comma set
-  // with a single entry.
-
-  // no need to expand pre, since it is guaranteed to be free of brace-sets
-  var pre = m.pre;
-  var post = m.post.length
-    ? expand(m.post, false)
-    : [''];
-
-  var N;
-
-  if (isSequence) {
-    var x = numeric(n[0]);
-    var y = numeric(n[1]);
-    var width = Math.max(n[0].length, n[1].length)
-    var incr = n.length == 3
-      ? Math.abs(numeric(n[2]))
-      : 1;
-    var test = lte;
-    var reverse = y < x;
-    if (reverse) {
-      incr *= -1;
-      test = gte;
-    }
-    var pad = n.some(isPadded);
-
-    N = [];
-
-    for (var i = x; test(i, y); i += incr) {
-      var c;
-      if (isAlphaSequence) {
-        c = String.fromCharCode(i);
-        if (c === '\\')
-          c = '';
-      } else {
-        c = String(i);
-        if (pad) {
-          var need = width - c.length;
-          if (need > 0) {
-            var z = new Array(need + 1).join('0');
-            if (i < 0)
-              c = '-' + z + c.slice(1);
-            else
-              c = z + c;
-          }
-        }
-      }
-      N.push(c);
-    }
-  } else {
-    N = concatMap(n, function(el) { return expand(el, false) });
-  }
-
-  for (var j = 0; j < N.length; j++) {
-    for (var k = 0; k < post.length; k++) {
-      var expansion = pre + N[j] + post[k];
-      if (!isTop || isSequence || expansion)
-        expansions.push(expansion);
-    }
-  }
-
-  return expansions;
-}
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore
deleted file mode 100644
index ae5d8c36ac6522065cc0df746b8d61c947fb76e0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-test
-.gitignore
-.travis.yml
-Makefile
-example.js
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/LICENSE.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/LICENSE.md
deleted file mode 100644
index 2cdc8e4148cc0aa1f788b25dbec4b22878644cdf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/LICENSE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md
deleted file mode 100644
index d6880b2f36e72ba16479f9500181e84bb6a58d5c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md
+++ /dev/null
@@ -1,91 +0,0 @@
-# balanced-match
-
-Match balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!
-
-[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match)
-[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match)
-
-[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match)
-
-## Example
-
-Get the first matching pair of braces:
-
-```js
-var balanced = require('balanced-match');
-
-console.log(balanced('{', '}', 'pre{in{nested}}post'));
-console.log(balanced('{', '}', 'pre{first}between{second}post'));
-console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre  {   in{nest}   }  post'));
-```
-
-The matches are:
-
-```bash
-$ node example.js
-{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
-{ start: 3,
-  end: 9,
-  pre: 'pre',
-  body: 'first',
-  post: 'between{second}post' }
-{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }
-```
-
-## API
-
-### var m = balanced(a, b, str)
-
-For the first non-nested matching pair of `a` and `b` in `str`, return an
-object with those keys:
-
-* **start** the index of the first match of `a`
-* **end** the index of the matching `b`
-* **pre** the preamble, `a` and `b` not included
-* **body** the match, `a` and `b` not included
-* **post** the postscript, `a` and `b` not included
-
-If there's no match, `undefined` will be returned.
-
-If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']`.
-
-### var r = balanced.range(a, b, str)
-
-For the first non-nested matching pair of `a` and `b` in `str`, return an
-array with indexes: `[ <a index>, <b index> ]`.
-
-If there's no match, `undefined` will be returned.
-
-If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]`.
-
-## Installation
-
-With [npm](https://npmjs.org) do:
-
-```bash
-npm install balanced-match
-```
-
-## License
-
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js
deleted file mode 100644
index 4670f7f79f4d2ae4d8f4e4115b90e9f9547e9a33..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js
+++ /dev/null
@@ -1,58 +0,0 @@
-module.exports = balanced;
-function balanced(a, b, str) {
-  if (a instanceof RegExp) a = maybeMatch(a, str);
-  if (b instanceof RegExp) b = maybeMatch(b, str);
-
-  var r = range(a, b, str);
-
-  return r && {
-    start: r[0],
-    end: r[1],
-    pre: str.slice(0, r[0]),
-    body: str.slice(r[0] + a.length, r[1]),
-    post: str.slice(r[1] + b.length)
-  };
-}
-
-function maybeMatch(reg, str) {
-  var m = str.match(reg);
-  return m ? m[0] : null;
-}
-
-balanced.range = range;
-function range(a, b, str) {
-  var begs, beg, left, right, result;
-  var ai = str.indexOf(a);
-  var bi = str.indexOf(b, ai + 1);
-  var i = ai;
-
-  if (ai >= 0 && bi > 0) {
-    begs = [];
-    left = str.length;
-
-    while (i < str.length && i >= 0 && ! result) {
-      if (i == ai) {
-        begs.push(i);
-        ai = str.indexOf(a, i + 1);
-      } else if (begs.length == 1) {
-        result = [ begs.pop(), bi ];
-      } else {
-        beg = begs.pop();
-        if (beg < left) {
-          left = beg;
-          right = bi;
-        }
-
-        bi = str.indexOf(b, i + 1);
-      }
-
-      i = ai < bi && ai >= 0 ? ai : bi;
-    }
-
-    if (begs.length) {
-      result = [ left, right ];
-    }
-  }
-
-  return result;
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json
deleted file mode 100644
index 787c6cc0ce8c6c11fa4d85de096b6cdcc00b9435..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "_from": "balanced-match@>=0.4.1 <0.5.0",
-  "_id": "balanced-match@0.4.1",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob/minimatch/brace-expansion/balanced-match",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf/glob/minimatch/brace-expansion"
-  ],
-  "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz",
-  "_shasum": "19053e2e0748eadb379da6c09d455cf5e1039335",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@juliangruber.com",
-    "name": "Julian Gruber",
-    "url": "http://juliangruber.com"
-  },
-  "bugs": {
-    "url": "https://github.com/juliangruber/balanced-match/issues"
-  },
-  "dependencies": {},
-  "description": "Match balanced character pairs, like \"{\" and \"}\"",
-  "devDependencies": {
-    "tape": "~4.5.0"
-  },
-  "homepage": "https://github.com/juliangruber/balanced-match",
-  "keywords": [
-    "balanced",
-    "match",
-    "parse",
-    "regexp",
-    "test"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "balanced-match",
-  "optionalDependencies": {},
-  "readme": "# balanced-match\n\nMatch balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!\n\n[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match)\n[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match)\n\n[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match)\n\n## Example\n\nGet the first matching pair of braces:\n\n```js\nvar balanced = require('balanced-match');\n\nconsole.log(balanced('{', '}', 'pre{in{nested}}post'));\nconsole.log(balanced('{', '}', 'pre{first}between{second}post'));\nconsole.log(balanced(/\\s+\\{\\s+/, /\\s+\\}\\s+/, 'pre  {   in{nest}   }  post'));\n```\n\nThe matches are:\n\n```bash\n$ node example.js\n{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }\n{ start: 3,\n  end: 9,\n  pre: 'pre',\n  body: 'first',\n  post: 'between{second}post' }\n{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }\n```\n\n## API\n\n### var m = balanced(a, b, str)\n\nFor the first non-nested matching pair of `a` and `b` in `str`, return an\nobject with those keys:\n\n* **start** the index of the first match of `a`\n* **end** the index of the matching `b`\n* **pre** the preamble, `a` and `b` not included\n* **body** the match, `a` and `b` not included\n* **post** the postscript, `a` and `b` not included\n\nIf there's no match, `undefined` will be returned.\n\nIf the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']`.\n\n### var r = balanced.range(a, b, str)\n\nFor the first non-nested matching pair of `a` and `b` in `str`, return an\narray with indexes: `[ <a index>, <b index> ]`.\n\nIf there's no match, `undefined` will be returned.\n\nIf the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]`.\n\n## Installation\n\nWith [npm](https://npmjs.org) do:\n\n```bash\nnpm install balanced-match\n```\n\n## License\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/balanced-match.git"
-  },
-  "scripts": {
-    "test": "make test"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2..latest",
-      "chrome/25..latest",
-      "chrome/canary",
-      "firefox/20..latest",
-      "firefox/nightly",
-      "ie/8..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest"
-    ],
-    "files": "test/*.js"
-  },
-  "version": "0.4.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml
deleted file mode 100644
index f1d0f13c8a54d0f8d78f86a1f9348f3c59750694..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - 0.4
-  - 0.6
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE
deleted file mode 100644
index ee27ba4b4412b0e4a05af5e3d8a005bc6681fdf3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-This software is released under the MIT license:
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown
deleted file mode 100644
index 408f70a1be473c86e729fe8cc1d5fb4e0e364ce9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown
+++ /dev/null
@@ -1,62 +0,0 @@
-concat-map
-==========
-
-Concatenative mapdashery.
-
-[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)
-
-[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)
-
-example
-=======
-
-``` js
-var concatMap = require('concat-map');
-var xs = [ 1, 2, 3, 4, 5, 6 ];
-var ys = concatMap(xs, function (x) {
-    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-});
-console.dir(ys);
-```
-
-***
-
-```
-[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
-```
-
-methods
-=======
-
-``` js
-var concatMap = require('concat-map')
-```
-
-concatMap(xs, fn)
------------------
-
-Return an array of concatenated elements by calling `fn(x, i)` for each element
-`x` and each index `i` in the array `xs`.
-
-When `fn(x, i)` returns an array, its result will be concatenated with the
-result array. If `fn(x, i)` returns anything else, that value will be pushed
-onto the end of the result array.
-
-install
-=======
-
-With [npm](http://npmjs.org) do:
-
-```
-npm install concat-map
-```
-
-license
-=======
-
-MIT
-
-notes
-=====
-
-This module was written while sitting high above the ground in a tree.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js
deleted file mode 100644
index 33656217b61d8f06a55db4631ec95eea828495d2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var concatMap = require('../');
-var xs = [ 1, 2, 3, 4, 5, 6 ];
-var ys = concatMap(xs, function (x) {
-    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-});
-console.dir(ys);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js
deleted file mode 100644
index b29a7812e5055ae915e771447e1380e01bf3bfdd..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-module.exports = function (xs, fn) {
-    var res = [];
-    for (var i = 0; i < xs.length; i++) {
-        var x = fn(xs[i], i);
-        if (isArray(x)) res.push.apply(res, x);
-        else res.push(x);
-    }
-    return res;
-};
-
-var isArray = Array.isArray || function (xs) {
-    return Object.prototype.toString.call(xs) === '[object Array]';
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json
deleted file mode 100644
index 28a88811eb9932104728095855097dfa38490aa2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
-  "_from": "concat-map@0.0.1",
-  "_id": "concat-map@0.0.1",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob/minimatch/brace-expansion/concat-map",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf/glob/minimatch/brace-expansion"
-  ],
-  "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-  "_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@substack.net",
-    "name": "James Halliday",
-    "url": "http://substack.net"
-  },
-  "bugs": {
-    "url": "https://github.com/substack/node-concat-map/issues"
-  },
-  "dependencies": {},
-  "description": "concatenative mapdashery",
-  "devDependencies": {
-    "tape": "~2.4.0"
-  },
-  "directories": {
-    "example": "example",
-    "test": "test"
-  },
-  "homepage": "https://github.com/substack/node-concat-map#readme",
-  "keywords": [
-    "concat",
-    "concatMap",
-    "functional",
-    "higher-order",
-    "map"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "concat-map",
-  "optionalDependencies": {},
-  "readme": "concat-map\n==========\n\nConcatenative mapdashery.\n\n[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)\n\n[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)\n\nexample\n=======\n\n``` js\nvar concatMap = require('concat-map');\nvar xs = [ 1, 2, 3, 4, 5, 6 ];\nvar ys = concatMap(xs, function (x) {\n    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];\n});\nconsole.dir(ys);\n```\n\n***\n\n```\n[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]\n```\n\nmethods\n=======\n\n``` js\nvar concatMap = require('concat-map')\n```\n\nconcatMap(xs, fn)\n-----------------\n\nReturn an array of concatenated elements by calling `fn(x, i)` for each element\n`x` and each index `i` in the array `xs`.\n\nWhen `fn(x, i)` returns an array, its result will be concatenated with the\nresult array. If `fn(x, i)` returns anything else, that value will be pushed\nonto the end of the result array.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install concat-map\n```\n\nlicense\n=======\n\nMIT\n\nnotes\n=====\n\nThis module was written while sitting high above the ground in a tree.\n",
-  "readmeFilename": "README.markdown",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/substack/node-concat-map.git"
-  },
-  "scripts": {
-    "test": "tape test/*.js"
-  },
-  "testling": {
-    "browsers": {
-      "chrome": [
-        10,
-        22
-      ],
-      "ff": [
-        10,
-        15,
-        3.5
-      ],
-      "ie": [
-        6,
-        7,
-        8,
-        9
-      ],
-      "opera": [
-        12
-      ],
-      "safari": [
-        5.1
-      ]
-    },
-    "files": "test/*.js"
-  },
-  "version": "0.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js
deleted file mode 100644
index fdbd7022f6da17600dad4d477734115bf28287e0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var concatMap = require('../');
-var test = require('tape');
-
-test('empty or not', function (t) {
-    var xs = [ 1, 2, 3, 4, 5, 6 ];
-    var ixes = [];
-    var ys = concatMap(xs, function (x, ix) {
-        ixes.push(ix);
-        return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-    });
-    t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]);
-    t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]);
-    t.end();
-});
-
-test('always something', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function (x) {
-        return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ];
-    });
-    t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
-    t.end();
-});
-
-test('scalars', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function (x) {
-        return x === 'b' ? [ 'B', 'B', 'B' ] : x;
-    });
-    t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
-    t.end();
-});
-
-test('undefs', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function () {});
-    t.same(ys, [ undefined, undefined, undefined, undefined ]);
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json
deleted file mode 100644
index 1ec0e646baee7a32f1678f630c82eb05d8dcb1f4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "_from": "brace-expansion@>=1.0.0 <2.0.0",
-  "_id": "brace-expansion@1.1.5",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob/minimatch/brace-expansion",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf/glob/minimatch"
-  ],
-  "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz",
-  "_shasum": "f5b4ad574e2cb7ccc1eb83e6fe79b8ecadf7a526",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@juliangruber.com",
-    "name": "Julian Gruber",
-    "url": "http://juliangruber.com"
-  },
-  "bugs": {
-    "url": "https://github.com/juliangruber/brace-expansion/issues"
-  },
-  "dependencies": {
-    "balanced-match": "^0.4.1",
-    "concat-map": "0.0.1"
-  },
-  "description": "Brace expansion as known from sh/bash",
-  "devDependencies": {
-    "tape": "4.5.1"
-  },
-  "homepage": "https://github.com/juliangruber/brace-expansion",
-  "keywords": [],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "brace-expansion",
-  "optionalDependencies": {},
-  "readme": "# brace-expansion\n\n[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), \nas known from sh/bash, in JavaScript.\n\n[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion)\n[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)\n\n[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion)\n\n## Example\n\n```js\nvar expand = require('brace-expansion');\n\nexpand('file-{a,b,c}.jpg')\n// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']\n\nexpand('-v{,,}')\n// => ['-v', '-v', '-v']\n\nexpand('file{0..2}.jpg')\n// => ['file0.jpg', 'file1.jpg', 'file2.jpg']\n\nexpand('file-{a..c}.jpg')\n// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']\n\nexpand('file{2..0}.jpg')\n// => ['file2.jpg', 'file1.jpg', 'file0.jpg']\n\nexpand('file{0..4..2}.jpg')\n// => ['file0.jpg', 'file2.jpg', 'file4.jpg']\n\nexpand('file-{a..e..2}.jpg')\n// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']\n\nexpand('file{00..10..5}.jpg')\n// => ['file00.jpg', 'file05.jpg', 'file10.jpg']\n\nexpand('{{A..C},{a..c}}')\n// => ['A', 'B', 'C', 'a', 'b', 'c']\n\nexpand('ppp{,config,oe{,conf}}')\n// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']\n```\n\n## API\n\n```js\nvar expand = require('brace-expansion');\n```\n\n### var expanded = expand(str)\n\nReturn an array of all possible and valid expansions of `str`. If none are\nfound, `[str]` is returned.\n\nValid expansions are:\n\n```js\n/^(.*,)+(.+)?$/\n// {a,b,...}\n```\n\nA comma seperated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.\n\n```js\n/^-?\\d+\\.\\.-?\\d+(\\.\\.-?\\d+)?$/\n// {x..y[..incr]}\n```\n\nA numeric sequence from `x` to `y` inclusive, with optional increment.\nIf `x` or `y` start with a leading `0`, all the numbers will be padded\nto have equal length. Negative numbers and backwards iteration work too.\n\n```js\n/^-?\\d+\\.\\.-?\\d+(\\.\\.-?\\d+)?$/\n// {x..y[..incr]}\n```\n\nAn alphabetic sequence from `x` to `y` inclusive, with optional increment.\n`x` and `y` must be exactly one character, and if given, `incr` must be a\nnumber.\n\nFor compatibility reasons, the string `${` is not eligible for brace expansion.\n\n## Installation\n\nWith [npm](https://npmjs.org) do:\n\n```bash\nnpm install brace-expansion\n```\n\n## Contributors\n\n- [Julian Gruber](https://github.com/juliangruber)\n- [Isaac Z. Schlueter](https://github.com/isaacs)\n\n## License\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/brace-expansion.git"
-  },
-  "scripts": {
-    "gentest": "bash test/generate.sh",
-    "test": "tape test/*.js"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2..latest",
-      "chrome/25..latest",
-      "chrome/canary",
-      "firefox/20..latest",
-      "firefox/nightly",
-      "ie/8..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest"
-    ],
-    "files": "test/*.js"
-  },
-  "version": "1.1.5"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/package.json
deleted file mode 100644
index 64504c8a0a1f0ee4ca9c132df577390ab5ce72b5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/minimatch/package.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
-  "_from": "minimatch@>=3.0.2 <4.0.0",
-  "_id": "minimatch@3.0.2",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob/minimatch",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf/glob"
-  ],
-  "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz",
-  "_shasum": "0f398a7300ea441e9c348c83d98ab8c9dbf9c40a",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/minimatch/issues"
-  },
-  "dependencies": {
-    "brace-expansion": "^1.0.0"
-  },
-  "description": "a glob matcher in javascript",
-  "devDependencies": {
-    "standard": "^3.7.2",
-    "tap": "^5.6.0"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "files": [
-    "minimatch.js"
-  ],
-  "homepage": "https://github.com/isaacs/minimatch#readme",
-  "license": "ISC",
-  "main": "minimatch.js",
-  "name": "minimatch",
-  "optionalDependencies": {},
-  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.svg)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instantiating the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself if this option is set.  When not set, an empty list\nis returned if there are no matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/minimatch.git"
-  },
-  "scripts": {
-    "posttest": "standard minimatch.js test/*.js",
-    "test": "tap test/*.js"
-  },
-  "version": "3.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/README.md
deleted file mode 100644
index a2981ea0705196c52a01d2c09cf026110f96de72..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/README.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# once
-
-Only call a function once.
-
-## usage
-
-```javascript
-var once = require('once')
-
-function load (file, cb) {
-  cb = once(cb)
-  loader.load('file')
-  loader.once('load', cb)
-  loader.once('error', cb)
-}
-```
-
-Or add to the Function.prototype in a responsible way:
-
-```javascript
-// only has to be done once
-require('once').proto()
-
-function load (file, cb) {
-  cb = cb.once()
-  loader.load('file')
-  loader.once('load', cb)
-  loader.once('error', cb)
-}
-```
-
-Ironically, the prototype feature makes this module twice as
-complicated as necessary.
-
-To check whether you function has been called, use `fn.called`. Once the
-function is called for the first time the return value of the original
-function is saved in `fn.value` and subsequent calls will continue to
-return this value.
-
-```javascript
-var once = require('once')
-
-function load (cb) {
-  cb = once(cb)
-  var stream = createStream()
-  stream.once('data', cb)
-  stream.once('end', function () {
-    if (!cb.called) cb(new Error('not found'))
-  })
-}
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/README.md
deleted file mode 100644
index 98eab2522b86e5fe32c92524c4ec778b98066cbf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# wrappy
-
-Callback wrapping utility
-
-## USAGE
-
-```javascript
-var wrappy = require("wrappy")
-
-// var wrapper = wrappy(wrapperFunction)
-
-// make sure a cb is called only once
-// See also: http://npm.im/once for this specific use case
-var once = wrappy(function (cb) {
-  var called = false
-  return function () {
-    if (called) return
-    called = true
-    return cb.apply(this, arguments)
-  }
-})
-
-function printBoo () {
-  console.log('boo')
-}
-// has some rando property
-printBoo.iAmBooPrinter = true
-
-var onlyPrintOnce = once(printBoo)
-
-onlyPrintOnce() // prints 'boo'
-onlyPrintOnce() // does nothing
-
-// random property is retained!
-assert.equal(onlyPrintOnce.iAmBooPrinter, true)
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/package.json
deleted file mode 100644
index e0205c78eadf131100e6bdb0f6f9fad6229df6de..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "_from": "wrappy@>=1.0.0 <2.0.0",
-  "_id": "wrappy@1.0.2",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob/once/wrappy",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf/glob/once"
-  ],
-  "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-  "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/wrappy/issues"
-  },
-  "dependencies": {},
-  "description": "Callback wrapping utility",
-  "devDependencies": {
-    "tap": "^2.3.1"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "files": [
-    "wrappy.js"
-  ],
-  "homepage": "https://github.com/npm/wrappy",
-  "license": "ISC",
-  "main": "wrappy.js",
-  "name": "wrappy",
-  "optionalDependencies": {},
-  "readme": "# wrappy\n\nCallback wrapping utility\n\n## USAGE\n\n```javascript\nvar wrappy = require(\"wrappy\")\n\n// var wrapper = wrappy(wrapperFunction)\n\n// make sure a cb is called only once\n// See also: http://npm.im/once for this specific use case\nvar once = wrappy(function (cb) {\n  var called = false\n  return function () {\n    if (called) return\n    called = true\n    return cb.apply(this, arguments)\n  }\n})\n\nfunction printBoo () {\n  console.log('boo')\n}\n// has some rando property\nprintBoo.iAmBooPrinter = true\n\nvar onlyPrintOnce = once(printBoo)\n\nonlyPrintOnce() // prints 'boo'\nonlyPrintOnce() // does nothing\n\n// random property is retained!\nassert.equal(onlyPrintOnce.iAmBooPrinter, true)\n```\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/wrappy.git"
-  },
-  "scripts": {
-    "test": "tap --coverage test/*.js"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js
deleted file mode 100644
index bb7e7d6fcf70fdff4c5a48b7fa2ae3c9ba36fe47..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/node_modules/wrappy/wrappy.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// Returns a wrapper function that returns a wrapped callback
-// The wrapper function should do some stuff, and return a
-// presumably different callback function.
-// This makes sure that own properties are retained, so that
-// decorations and such are not lost along the way.
-module.exports = wrappy
-function wrappy (fn, cb) {
-  if (fn && cb) return wrappy(fn)(cb)
-
-  if (typeof fn !== 'function')
-    throw new TypeError('need wrapper function')
-
-  Object.keys(fn).forEach(function (k) {
-    wrapper[k] = fn[k]
-  })
-
-  return wrapper
-
-  function wrapper() {
-    var args = new Array(arguments.length)
-    for (var i = 0; i < args.length; i++) {
-      args[i] = arguments[i]
-    }
-    var ret = fn.apply(this, args)
-    var cb = args[args.length-1]
-    if (typeof ret === 'function' && ret !== cb) {
-      Object.keys(cb).forEach(function (k) {
-        ret[k] = cb[k]
-      })
-    }
-    return ret
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/once.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/once.js
deleted file mode 100644
index 2e1e721bfecec364ca8a6aab8a261067a2c74716..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/once.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var wrappy = require('wrappy')
-module.exports = wrappy(once)
-
-once.proto = once(function () {
-  Object.defineProperty(Function.prototype, 'once', {
-    value: function () {
-      return once(this)
-    },
-    configurable: true
-  })
-})
-
-function once (fn) {
-  var f = function () {
-    if (f.called) return f.value
-    f.called = true
-    return f.value = fn.apply(this, arguments)
-  }
-  f.called = false
-  return f
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/package.json
deleted file mode 100644
index 8a8da246b5443d29252af80376b862809593d351..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/once/package.json
+++ /dev/null
@@ -1,55 +0,0 @@
-{
-  "_from": "once@>=1.3.0 <2.0.0",
-  "_id": "once@1.3.3",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob/once",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf/glob",
-    "/serialport/node-pre-gyp/rimraf/glob/inflight"
-  ],
-  "_resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
-  "_shasum": "b2e261557ce4c314ec8304f3fa82663e4297ca20",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/once/issues"
-  },
-  "dependencies": {
-    "wrappy": "1"
-  },
-  "description": "Run a function exactly one time",
-  "devDependencies": {
-    "tap": "^1.2.0"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "files": [
-    "once.js"
-  ],
-  "homepage": "https://github.com/isaacs/once#readme",
-  "keywords": [
-    "function",
-    "once",
-    "one",
-    "single"
-  ],
-  "license": "ISC",
-  "main": "once.js",
-  "name": "once",
-  "optionalDependencies": {},
-  "readme": "# once\n\nOnly call a function once.\n\n## usage\n\n```javascript\nvar once = require('once')\n\nfunction load (file, cb) {\n  cb = once(cb)\n  loader.load('file')\n  loader.once('load', cb)\n  loader.once('error', cb)\n}\n```\n\nOr add to the Function.prototype in a responsible way:\n\n```javascript\n// only has to be done once\nrequire('once').proto()\n\nfunction load (file, cb) {\n  cb = cb.once()\n  loader.load('file')\n  loader.once('load', cb)\n  loader.once('error', cb)\n}\n```\n\nIronically, the prototype feature makes this module twice as\ncomplicated as necessary.\n\nTo check whether you function has been called, use `fn.called`. Once the\nfunction is called for the first time the return value of the original\nfunction is saved in `fn.value` and subsequent calls will continue to\nreturn this value.\n\n```javascript\nvar once = require('once')\n\nfunction load (cb) {\n  cb = once(cb)\n  var stream = createStream()\n  stream.once('data', cb)\n  stream.once('end', function () {\n    if (!cb.called) cb(new Error('not found'))\n  })\n}\n```\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/once.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "1.3.3"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/index.js
deleted file mode 100644
index 19f103f908ac722f8d1cb03ad3631f55f460e882..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-'use strict';
-
-function posix(path) {
-	return path.charAt(0) === '/';
-};
-
-function win32(path) {
-	// https://github.com/joyent/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56
-	var splitDeviceRe = /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/;
-	var result = splitDeviceRe.exec(path);
-	var device = result[1] || '';
-	var isUnc = !!device && device.charAt(1) !== ':';
-
-	// UNC paths are always absolute
-	return !!result[2] || isUnc;
-};
-
-module.exports = process.platform === 'win32' ? win32 : posix;
-module.exports.posix = posix;
-module.exports.win32 = win32;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/license b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/license
deleted file mode 100644
index 654d0bfe943437d43242325b1fbcff5f400d84ee..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/license
+++ /dev/null
@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/package.json
deleted file mode 100644
index 65538868ccd788c7349b46742a0f94c2f2c14e6b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/package.json
+++ /dev/null
@@ -1,62 +0,0 @@
-{
-  "_from": "path-is-absolute@>=1.0.0 <2.0.0",
-  "_id": "path-is-absolute@1.0.0",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob/path-is-absolute",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf/glob"
-  ],
-  "_resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz",
-  "_shasum": "263dada66ab3f2fb10bf7f9d24dd8f3e570ef912",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "sindresorhus@gmail.com",
-    "name": "Sindre Sorhus",
-    "url": "sindresorhus.com"
-  },
-  "bugs": {
-    "url": "https://github.com/sindresorhus/path-is-absolute/issues"
-  },
-  "dependencies": {},
-  "description": "Node.js 0.12 path.isAbsolute() ponyfill",
-  "devDependencies": {},
-  "engines": {
-    "node": ">=0.10.0"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/sindresorhus/path-is-absolute#readme",
-  "keywords": [
-    "absolute",
-    "built-in",
-    "check",
-    "core",
-    "detect",
-    "dir",
-    "file",
-    "is",
-    "is-absolute",
-    "isabsolute",
-    "path",
-    "paths",
-    "polyfill",
-    "ponyfill",
-    "shim",
-    "util",
-    "utils"
-  ],
-  "license": "MIT",
-  "name": "path-is-absolute",
-  "optionalDependencies": {},
-  "readme": "# path-is-absolute [![Build Status](https://travis-ci.org/sindresorhus/path-is-absolute.svg?branch=master)](https://travis-ci.org/sindresorhus/path-is-absolute)\n\n> Node.js 0.12 [`path.isAbsolute()`](http://nodejs.org/api/path.html#path_path_isabsolute_path) ponyfill\n\n> Ponyfill: A polyfill that doesn't overwrite the native method\n\n\n## Install\n\n```\n$ npm install --save path-is-absolute\n```\n\n\n## Usage\n\n```js\nvar pathIsAbsolute = require('path-is-absolute');\n\n// Linux\npathIsAbsolute('/home/foo');\n//=> true\n\n// Windows\npathIsAbsolute('C:/Users/');\n//=> true\n\n// Any OS\npathIsAbsolute.posix('/home/foo');\n//=> true\n```\n\n\n## API\n\nSee the [`path.isAbsolute()` docs](http://nodejs.org/api/path.html#path_path_isabsolute_path).\n\n### pathIsAbsolute(path)\n\n### pathIsAbsolute.posix(path)\n\nThe Posix specific version.\n\n### pathIsAbsolute.win32(path)\n\nThe Windows specific version.\n\n\n## License\n\nMIT © [Sindre Sorhus](http://sindresorhus.com)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sindresorhus/path-is-absolute.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/readme.md
deleted file mode 100644
index cdf94f4309a27e4e3f1f200370977d599868b261..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/node_modules/path-is-absolute/readme.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# path-is-absolute [![Build Status](https://travis-ci.org/sindresorhus/path-is-absolute.svg?branch=master)](https://travis-ci.org/sindresorhus/path-is-absolute)
-
-> Node.js 0.12 [`path.isAbsolute()`](http://nodejs.org/api/path.html#path_path_isabsolute_path) ponyfill
-
-> Ponyfill: A polyfill that doesn't overwrite the native method
-
-
-## Install
-
-```
-$ npm install --save path-is-absolute
-```
-
-
-## Usage
-
-```js
-var pathIsAbsolute = require('path-is-absolute');
-
-// Linux
-pathIsAbsolute('/home/foo');
-//=> true
-
-// Windows
-pathIsAbsolute('C:/Users/');
-//=> true
-
-// Any OS
-pathIsAbsolute.posix('/home/foo');
-//=> true
-```
-
-
-## API
-
-See the [`path.isAbsolute()` docs](http://nodejs.org/api/path.html#path_path_isabsolute_path).
-
-### pathIsAbsolute(path)
-
-### pathIsAbsolute.posix(path)
-
-The Posix specific version.
-
-### pathIsAbsolute.win32(path)
-
-The Windows specific version.
-
-
-## License
-
-MIT © [Sindre Sorhus](http://sindresorhus.com)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/package.json
deleted file mode 100644
index e026deed13a83e76becec30e0e49b80dd18af6e6..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/package.json
+++ /dev/null
@@ -1,85 +0,0 @@
-{
-  "_from": "glob@>=7.0.5 <8.0.0",
-  "_id": "glob@7.0.5",
-  "_location": "/serialport/node-pre-gyp/rimraf/glob",
-  "_nodeVersion": "4.4.4",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/glob-7.0.5.tgz_1466471133629_0.7749870484694839"
-  },
-  "_npmUser": {
-    "email": "i@izs.me",
-    "name": "isaacs"
-  },
-  "_npmVersion": "3.9.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/rimraf"
-  ],
-  "_resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz",
-  "_shasum": "b4202a69099bbb4d292a7c1b95b6682b67ebdc95",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/node-glob/issues"
-  },
-  "dependencies": {
-    "fs.realpath": "^1.0.0",
-    "inflight": "^1.0.4",
-    "inherits": "2",
-    "minimatch": "^3.0.2",
-    "once": "^1.3.0",
-    "path-is-absolute": "^1.0.0"
-  },
-  "description": "a little globber",
-  "devDependencies": {
-    "mkdirp": "0",
-    "rimraf": "^2.2.8",
-    "tap": "^5.7.0",
-    "tick": "0.0.6"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "b4202a69099bbb4d292a7c1b95b6682b67ebdc95",
-    "tarball": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "files": [
-    "common.js",
-    "glob.js",
-    "sync.js"
-  ],
-  "gitHead": "1319866c764e1a1bb39114dcbc2c1d518bb9b476",
-  "homepage": "https://github.com/isaacs/node-glob#readme",
-  "license": "ISC",
-  "main": "glob.js",
-  "maintainers": [
-    {
-      "name": "isaacs",
-      "email": "i@izs.me"
-    }
-  ],
-  "name": "glob",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/node-glob.git"
-  },
-  "scripts": {
-    "bench": "bash benchmark.sh",
-    "benchclean": "node benchclean.js",
-    "prepublish": "npm run benchclean",
-    "prof": "bash prof.sh && cat profile.txt",
-    "profclean": "rm -f v8.log profile.txt",
-    "test": "tap test/*.js --cov",
-    "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js"
-  },
-  "version": "7.0.5"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/sync.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/sync.js
deleted file mode 100644
index bba2dc6a0c14e1bfb809acb3d00e8c6cad719139..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/node_modules/glob/sync.js
+++ /dev/null
@@ -1,468 +0,0 @@
-module.exports = globSync
-globSync.GlobSync = GlobSync
-
-var fs = require('fs')
-var rp = require('fs.realpath')
-var minimatch = require('minimatch')
-var Minimatch = minimatch.Minimatch
-var Glob = require('./glob.js').Glob
-var util = require('util')
-var path = require('path')
-var assert = require('assert')
-var isAbsolute = require('path-is-absolute')
-var common = require('./common.js')
-var alphasort = common.alphasort
-var alphasorti = common.alphasorti
-var setopts = common.setopts
-var ownProp = common.ownProp
-var childrenIgnored = common.childrenIgnored
-
-function globSync (pattern, options) {
-  if (typeof options === 'function' || arguments.length === 3)
-    throw new TypeError('callback provided to sync glob\n'+
-                        'See: https://github.com/isaacs/node-glob/issues/167')
-
-  return new GlobSync(pattern, options).found
-}
-
-function GlobSync (pattern, options) {
-  if (!pattern)
-    throw new Error('must provide pattern')
-
-  if (typeof options === 'function' || arguments.length === 3)
-    throw new TypeError('callback provided to sync glob\n'+
-                        'See: https://github.com/isaacs/node-glob/issues/167')
-
-  if (!(this instanceof GlobSync))
-    return new GlobSync(pattern, options)
-
-  setopts(this, pattern, options)
-
-  if (this.noprocess)
-    return this
-
-  var n = this.minimatch.set.length
-  this.matches = new Array(n)
-  for (var i = 0; i < n; i ++) {
-    this._process(this.minimatch.set[i], i, false)
-  }
-  this._finish()
-}
-
-GlobSync.prototype._finish = function () {
-  assert(this instanceof GlobSync)
-  if (this.realpath) {
-    var self = this
-    this.matches.forEach(function (matchset, index) {
-      var set = self.matches[index] = Object.create(null)
-      for (var p in matchset) {
-        try {
-          p = self._makeAbs(p)
-          var real = rp.realpathSync(p, self.realpathCache)
-          set[real] = true
-        } catch (er) {
-          if (er.syscall === 'stat')
-            set[self._makeAbs(p)] = true
-          else
-            throw er
-        }
-      }
-    })
-  }
-  common.finish(this)
-}
-
-
-GlobSync.prototype._process = function (pattern, index, inGlobStar) {
-  assert(this instanceof GlobSync)
-
-  // Get the first [n] parts of pattern that are all strings.
-  var n = 0
-  while (typeof pattern[n] === 'string') {
-    n ++
-  }
-  // now n is the index of the first one that is *not* a string.
-
-  // See if there's anything else
-  var prefix
-  switch (n) {
-    // if not, then this is rather simple
-    case pattern.length:
-      this._processSimple(pattern.join('/'), index)
-      return
-
-    case 0:
-      // pattern *starts* with some non-trivial item.
-      // going to readdir(cwd), but not include the prefix in matches.
-      prefix = null
-      break
-
-    default:
-      // pattern has some string bits in the front.
-      // whatever it starts with, whether that's 'absolute' like /foo/bar,
-      // or 'relative' like '../baz'
-      prefix = pattern.slice(0, n).join('/')
-      break
-  }
-
-  var remain = pattern.slice(n)
-
-  // get the list of entries.
-  var read
-  if (prefix === null)
-    read = '.'
-  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {
-    if (!prefix || !isAbsolute(prefix))
-      prefix = '/' + prefix
-    read = prefix
-  } else
-    read = prefix
-
-  var abs = this._makeAbs(read)
-
-  //if ignored, skip processing
-  if (childrenIgnored(this, read))
-    return
-
-  var isGlobStar = remain[0] === minimatch.GLOBSTAR
-  if (isGlobStar)
-    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)
-  else
-    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)
-}
-
-
-GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {
-  var entries = this._readdir(abs, inGlobStar)
-
-  // if the abs isn't a dir, then nothing can match!
-  if (!entries)
-    return
-
-  // It will only match dot entries if it starts with a dot, or if
-  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.
-  var pn = remain[0]
-  var negate = !!this.minimatch.negate
-  var rawGlob = pn._glob
-  var dotOk = this.dot || rawGlob.charAt(0) === '.'
-
-  var matchedEntries = []
-  for (var i = 0; i < entries.length; i++) {
-    var e = entries[i]
-    if (e.charAt(0) !== '.' || dotOk) {
-      var m
-      if (negate && !prefix) {
-        m = !e.match(pn)
-      } else {
-        m = e.match(pn)
-      }
-      if (m)
-        matchedEntries.push(e)
-    }
-  }
-
-  var len = matchedEntries.length
-  // If there are no matched entries, then nothing matches.
-  if (len === 0)
-    return
-
-  // if this is the last remaining pattern bit, then no need for
-  // an additional stat *unless* the user has specified mark or
-  // stat explicitly.  We know they exist, since readdir returned
-  // them.
-
-  if (remain.length === 1 && !this.mark && !this.stat) {
-    if (!this.matches[index])
-      this.matches[index] = Object.create(null)
-
-    for (var i = 0; i < len; i ++) {
-      var e = matchedEntries[i]
-      if (prefix) {
-        if (prefix.slice(-1) !== '/')
-          e = prefix + '/' + e
-        else
-          e = prefix + e
-      }
-
-      if (e.charAt(0) === '/' && !this.nomount) {
-        e = path.join(this.root, e)
-      }
-      this.matches[index][e] = true
-    }
-    // This was the last one, and no stats were needed
-    return
-  }
-
-  // now test all matched entries as stand-ins for that part
-  // of the pattern.
-  remain.shift()
-  for (var i = 0; i < len; i ++) {
-    var e = matchedEntries[i]
-    var newPattern
-    if (prefix)
-      newPattern = [prefix, e]
-    else
-      newPattern = [e]
-    this._process(newPattern.concat(remain), index, inGlobStar)
-  }
-}
-
-
-GlobSync.prototype._emitMatch = function (index, e) {
-  var abs = this._makeAbs(e)
-  if (this.mark)
-    e = this._mark(e)
-
-  if (this.matches[index][e])
-    return
-
-  if (this.nodir) {
-    var c = this.cache[this._makeAbs(e)]
-    if (c === 'DIR' || Array.isArray(c))
-      return
-  }
-
-  this.matches[index][e] = true
-  if (this.stat)
-    this._stat(e)
-}
-
-
-GlobSync.prototype._readdirInGlobStar = function (abs) {
-  // follow all symlinked directories forever
-  // just proceed as if this is a non-globstar situation
-  if (this.follow)
-    return this._readdir(abs, false)
-
-  var entries
-  var lstat
-  var stat
-  try {
-    lstat = fs.lstatSync(abs)
-  } catch (er) {
-    // lstat failed, doesn't exist
-    return null
-  }
-
-  var isSym = lstat.isSymbolicLink()
-  this.symlinks[abs] = isSym
-
-  // If it's not a symlink or a dir, then it's definitely a regular file.
-  // don't bother doing a readdir in that case.
-  if (!isSym && !lstat.isDirectory())
-    this.cache[abs] = 'FILE'
-  else
-    entries = this._readdir(abs, false)
-
-  return entries
-}
-
-GlobSync.prototype._readdir = function (abs, inGlobStar) {
-  var entries
-
-  if (inGlobStar && !ownProp(this.symlinks, abs))
-    return this._readdirInGlobStar(abs)
-
-  if (ownProp(this.cache, abs)) {
-    var c = this.cache[abs]
-    if (!c || c === 'FILE')
-      return null
-
-    if (Array.isArray(c))
-      return c
-  }
-
-  try {
-    return this._readdirEntries(abs, fs.readdirSync(abs))
-  } catch (er) {
-    this._readdirError(abs, er)
-    return null
-  }
-}
-
-GlobSync.prototype._readdirEntries = function (abs, entries) {
-  // if we haven't asked to stat everything, then just
-  // assume that everything in there exists, so we can avoid
-  // having to stat it a second time.
-  if (!this.mark && !this.stat) {
-    for (var i = 0; i < entries.length; i ++) {
-      var e = entries[i]
-      if (abs === '/')
-        e = abs + e
-      else
-        e = abs + '/' + e
-      this.cache[e] = true
-    }
-  }
-
-  this.cache[abs] = entries
-
-  // mark and cache dir-ness
-  return entries
-}
-
-GlobSync.prototype._readdirError = function (f, er) {
-  // handle errors, and cache the information
-  switch (er.code) {
-    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205
-    case 'ENOTDIR': // totally normal. means it *does* exist.
-      var abs = this._makeAbs(f)
-      this.cache[abs] = 'FILE'
-      if (abs === this.cwdAbs) {
-        var error = new Error(er.code + ' invalid cwd ' + this.cwd)
-        error.path = this.cwd
-        error.code = er.code
-        throw error
-      }
-      break
-
-    case 'ENOENT': // not terribly unusual
-    case 'ELOOP':
-    case 'ENAMETOOLONG':
-    case 'UNKNOWN':
-      this.cache[this._makeAbs(f)] = false
-      break
-
-    default: // some unusual error.  Treat as failure.
-      this.cache[this._makeAbs(f)] = false
-      if (this.strict)
-        throw er
-      if (!this.silent)
-        console.error('glob error', er)
-      break
-  }
-}
-
-GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {
-
-  var entries = this._readdir(abs, inGlobStar)
-
-  // no entries means not a dir, so it can never have matches
-  // foo.txt/** doesn't match foo.txt
-  if (!entries)
-    return
-
-  // test without the globstar, and with every child both below
-  // and replacing the globstar.
-  var remainWithoutGlobStar = remain.slice(1)
-  var gspref = prefix ? [ prefix ] : []
-  var noGlobStar = gspref.concat(remainWithoutGlobStar)
-
-  // the noGlobStar pattern exits the inGlobStar state
-  this._process(noGlobStar, index, false)
-
-  var len = entries.length
-  var isSym = this.symlinks[abs]
-
-  // If it's a symlink, and we're in a globstar, then stop
-  if (isSym && inGlobStar)
-    return
-
-  for (var i = 0; i < len; i++) {
-    var e = entries[i]
-    if (e.charAt(0) === '.' && !this.dot)
-      continue
-
-    // these two cases enter the inGlobStar state
-    var instead = gspref.concat(entries[i], remainWithoutGlobStar)
-    this._process(instead, index, true)
-
-    var below = gspref.concat(entries[i], remain)
-    this._process(below, index, true)
-  }
-}
-
-GlobSync.prototype._processSimple = function (prefix, index) {
-  // XXX review this.  Shouldn't it be doing the mounting etc
-  // before doing stat?  kinda weird?
-  var exists = this._stat(prefix)
-
-  if (!this.matches[index])
-    this.matches[index] = Object.create(null)
-
-  // If it doesn't exist, then just mark the lack of results
-  if (!exists)
-    return
-
-  if (prefix && isAbsolute(prefix) && !this.nomount) {
-    var trail = /[\/\\]$/.test(prefix)
-    if (prefix.charAt(0) === '/') {
-      prefix = path.join(this.root, prefix)
-    } else {
-      prefix = path.resolve(this.root, prefix)
-      if (trail)
-        prefix += '/'
-    }
-  }
-
-  if (process.platform === 'win32')
-    prefix = prefix.replace(/\\/g, '/')
-
-  // Mark this as a match
-  this.matches[index][prefix] = true
-}
-
-// Returns either 'DIR', 'FILE', or false
-GlobSync.prototype._stat = function (f) {
-  var abs = this._makeAbs(f)
-  var needDir = f.slice(-1) === '/'
-
-  if (f.length > this.maxLength)
-    return false
-
-  if (!this.stat && ownProp(this.cache, abs)) {
-    var c = this.cache[abs]
-
-    if (Array.isArray(c))
-      c = 'DIR'
-
-    // It exists, but maybe not how we need it
-    if (!needDir || c === 'DIR')
-      return c
-
-    if (needDir && c === 'FILE')
-      return false
-
-    // otherwise we have to stat, because maybe c=true
-    // if we know it exists, but not what it is.
-  }
-
-  var exists
-  var stat = this.statCache[abs]
-  if (!stat) {
-    var lstat
-    try {
-      lstat = fs.lstatSync(abs)
-    } catch (er) {
-      return false
-    }
-
-    if (lstat.isSymbolicLink()) {
-      try {
-        stat = fs.statSync(abs)
-      } catch (er) {
-        stat = lstat
-      }
-    } else {
-      stat = lstat
-    }
-  }
-
-  this.statCache[abs] = stat
-
-  var c = stat.isDirectory() ? 'DIR' : 'FILE'
-  this.cache[abs] = this.cache[abs] || c
-
-  if (needDir && c !== 'DIR')
-    return false
-
-  return c
-}
-
-GlobSync.prototype._mark = function (p) {
-  return common.mark(this, p)
-}
-
-GlobSync.prototype._makeAbs = function (f) {
-  return common.makeAbs(this, f)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/package.json
deleted file mode 100644
index fd4c494dc8e3908622d7a805db77513d1b92dce0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/package.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
-  "_from": "rimraf@>=2.5.0 <2.6.0",
-  "_id": "rimraf@2.5.3",
-  "_location": "/serialport/node-pre-gyp/rimraf",
-  "_nodeVersion": "4.4.4",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/rimraf-2.5.3.tgz_1467582915019_0.6380921453237534"
-  },
-  "_npmUser": {
-    "email": "i@izs.me",
-    "name": "isaacs"
-  },
-  "_npmVersion": "3.10.2",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp",
-    "/serialport/node-pre-gyp/tar-pack",
-    "/serialport/node-pre-gyp/tar-pack/fstream",
-    "/serialport/node-pre-gyp/tar/fstream"
-  ],
-  "_resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz",
-  "_shasum": "6e5efdda4aa2f03417f6b2a574aec29f4b652705",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bin": {
-    "rimraf": "./bin.js"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/rimraf/issues"
-  },
-  "dependencies": {
-    "glob": "^7.0.5"
-  },
-  "description": "A deep deletion module for node (like `rm -rf`)",
-  "devDependencies": {
-    "mkdirp": "^0.5.1",
-    "tap": "^6.1.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "6e5efdda4aa2f03417f6b2a574aec29f4b652705",
-    "tarball": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.3.tgz"
-  },
-  "files": [
-    "LICENSE",
-    "README.md",
-    "bin.js",
-    "rimraf.js"
-  ],
-  "gitHead": "7263a784e8f08d94dd6caf6ee934fceb525a6f3d",
-  "homepage": "https://github.com/isaacs/rimraf#readme",
-  "license": "ISC",
-  "main": "rimraf.js",
-  "maintainers": [
-    {
-      "name": "isaacs",
-      "email": "i@izs.me"
-    }
-  ],
-  "name": "rimraf",
-  "optionalDependencies": {},
-  "readme": "[![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies)\n\nThe [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node.\n\nInstall with `npm install rimraf`, or just drop rimraf.js somewhere.\n\n## API\n\n`rimraf(f, [opts], callback)`\n\nThe first parameter will be interpreted as a globbing pattern for files. If you\nwant to disable globbing you can do so with `opts.disableGlob` (defaults to\n`false`). This might be handy, for instance, if you have filenames that contain\nglobbing wildcard characters.\n\nThe callback will be called with an error if there is one.  Certain\nerrors are handled for you:\n\n* Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of\n  `opts.maxBusyTries` times before giving up, adding 100ms of wait\n  between each attempt.  The default `maxBusyTries` is 3.\n* `ENOENT` - If the file doesn't exist, rimraf will return\n  successfully, since your desired outcome is already the case.\n* `EMFILE` - Since `readdir` requires opening a file descriptor, it's\n  possible to hit `EMFILE` if too many file descriptors are in use.\n  In the sync case, there's nothing to be done for this.  But in the\n  async case, rimraf will gradually back off with timeouts up to\n  `opts.emfileWait` ms, which defaults to 1000.\n\n## options\n\n* unlink, chmod, stat, lstat, rmdir, readdir,\n  unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync\n\n    In order to use a custom file system library, you can override\n    specific fs functions on the options object.\n\n    If any of these functions are present on the options object, then\n    the supplied function will be used instead of the default fs\n    method.\n\n    Sync methods are only relevant for `rimraf.sync()`, of course.\n\n    For example:\n\n    ```javascript\n    var myCustomFS = require('some-custom-fs')\n\n    rimraf('some-thing', myCustomFS, callback)\n    ```\n\n* maxBusyTries\n\n    If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered\n    on Windows systems, then rimraf will retry with a linear backoff\n    wait of 100ms longer on each try.  The default maxBusyTries is 3.\n\n    Only relevant for async usage.\n\n* emfileWait\n\n    If an `EMFILE` error is encountered, then rimraf will retry\n    repeatedly with a linear backoff of 1ms longer on each try, until\n    the timeout counter hits this max.  The default limit is 1000.\n\n    If you repeatedly encounter `EMFILE` errors, then consider using\n    [graceful-fs](http://npm.im/graceful-fs) in your program.\n\n    Only relevant for async usage.\n\n* glob\n\n    Set to `false` to disable [glob](http://npm.im/glob) pattern\n    matching.\n\n    Set to an object to pass options to the glob module.  The default\n    glob options are `{ nosort: true, silent: true }`.\n\n    Glob version 6 is used in this module.\n\n    Relevant for both sync and async usage.\n\n* disableGlob\n\n    Set to any non-falsey value to disable globbing entirely.\n    (Equivalent to setting `glob: false`.)\n\n## rimraf.sync\n\nIt can remove stuff synchronously, too.  But that's not so good.  Use\nthe async API.  It's better.\n\n## CLI\n\nIf installed with `npm install rimraf -g` it can be used as a global\ncommand `rimraf <path> [<path> ...]` which is useful for cross platform support.\n\n## mkdirp\n\nIf you need to create a directory recursively, check out\n[mkdirp](https://github.com/substack/node-mkdirp).\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/rimraf.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "2.5.3"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/rimraf.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/rimraf.js
deleted file mode 100644
index db518a9d6cc1c1f6619f35a152683cacb7f43b9b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/rimraf/rimraf.js
+++ /dev/null
@@ -1,343 +0,0 @@
-module.exports = rimraf
-rimraf.sync = rimrafSync
-
-var assert = require("assert")
-var path = require("path")
-var fs = require("fs")
-var glob = require("glob")
-
-var defaultGlobOpts = {
-  nosort: true,
-  silent: true
-}
-
-// for EMFILE handling
-var timeout = 0
-
-var isWindows = (process.platform === "win32")
-
-function defaults (options) {
-  var methods = [
-    'unlink',
-    'chmod',
-    'stat',
-    'lstat',
-    'rmdir',
-    'readdir'
-  ]
-  methods.forEach(function(m) {
-    options[m] = options[m] || fs[m]
-    m = m + 'Sync'
-    options[m] = options[m] || fs[m]
-  })
-
-  options.maxBusyTries = options.maxBusyTries || 3
-  options.emfileWait = options.emfileWait || 1000
-  if (options.glob === false) {
-    options.disableGlob = true
-  }
-  options.disableGlob = options.disableGlob || false
-  options.glob = options.glob || defaultGlobOpts
-}
-
-function rimraf (p, options, cb) {
-  if (typeof options === 'function') {
-    cb = options
-    options = {}
-  }
-
-  assert(p, 'rimraf: missing path')
-  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
-  assert(options, 'rimraf: missing options')
-  assert.equal(typeof options, 'object', 'rimraf: options should be object')
-  assert.equal(typeof cb, 'function', 'rimraf: callback function required')
-
-  defaults(options)
-
-  var busyTries = 0
-  var errState = null
-  var n = 0
-
-  if (options.disableGlob || !glob.hasMagic(p))
-    return afterGlob(null, [p])
-
-  options.lstat(p, function (er, stat) {
-    if (!er)
-      return afterGlob(null, [p])
-
-    glob(p, options.glob, afterGlob)
-  })
-
-  function next (er) {
-    errState = errState || er
-    if (--n === 0)
-      cb(errState)
-  }
-
-  function afterGlob (er, results) {
-    if (er)
-      return cb(er)
-
-    n = results.length
-    if (n === 0)
-      return cb()
-
-    results.forEach(function (p) {
-      rimraf_(p, options, function CB (er) {
-        if (er) {
-          if (isWindows && (er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") &&
-              busyTries < options.maxBusyTries) {
-            busyTries ++
-            var time = busyTries * 100
-            // try again, with the same exact callback as this one.
-            return setTimeout(function () {
-              rimraf_(p, options, CB)
-            }, time)
-          }
-
-          // this one won't happen if graceful-fs is used.
-          if (er.code === "EMFILE" && timeout < options.emfileWait) {
-            return setTimeout(function () {
-              rimraf_(p, options, CB)
-            }, timeout ++)
-          }
-
-          // already gone
-          if (er.code === "ENOENT") er = null
-        }
-
-        timeout = 0
-        next(er)
-      })
-    })
-  }
-}
-
-// Two possible strategies.
-// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
-// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
-//
-// Both result in an extra syscall when you guess wrong.  However, there
-// are likely far more normal files in the world than directories.  This
-// is based on the assumption that a the average number of files per
-// directory is >= 1.
-//
-// If anyone ever complains about this, then I guess the strategy could
-// be made configurable somehow.  But until then, YAGNI.
-function rimraf_ (p, options, cb) {
-  assert(p)
-  assert(options)
-  assert(typeof cb === 'function')
-
-  // sunos lets the root user unlink directories, which is... weird.
-  // so we have to lstat here and make sure it's not a dir.
-  options.lstat(p, function (er, st) {
-    if (er && er.code === "ENOENT")
-      return cb(null)
-
-    // Windows can EPERM on stat.  Life is suffering.
-    if (er && er.code === "EPERM" && isWindows)
-      fixWinEPERM(p, options, er, cb)
-
-    if (st && st.isDirectory())
-      return rmdir(p, options, er, cb)
-
-    options.unlink(p, function (er) {
-      if (er) {
-        if (er.code === "ENOENT")
-          return cb(null)
-        if (er.code === "EPERM")
-          return (isWindows)
-            ? fixWinEPERM(p, options, er, cb)
-            : rmdir(p, options, er, cb)
-        if (er.code === "EISDIR")
-          return rmdir(p, options, er, cb)
-      }
-      return cb(er)
-    })
-  })
-}
-
-function fixWinEPERM (p, options, er, cb) {
-  assert(p)
-  assert(options)
-  assert(typeof cb === 'function')
-  if (er)
-    assert(er instanceof Error)
-
-  options.chmod(p, 666, function (er2) {
-    if (er2)
-      cb(er2.code === "ENOENT" ? null : er)
-    else
-      options.stat(p, function(er3, stats) {
-        if (er3)
-          cb(er3.code === "ENOENT" ? null : er)
-        else if (stats.isDirectory())
-          rmdir(p, options, er, cb)
-        else
-          options.unlink(p, cb)
-      })
-  })
-}
-
-function fixWinEPERMSync (p, options, er) {
-  assert(p)
-  assert(options)
-  if (er)
-    assert(er instanceof Error)
-
-  try {
-    options.chmodSync(p, 666)
-  } catch (er2) {
-    if (er2.code === "ENOENT")
-      return
-    else
-      throw er
-  }
-
-  try {
-    var stats = options.statSync(p)
-  } catch (er3) {
-    if (er3.code === "ENOENT")
-      return
-    else
-      throw er
-  }
-
-  if (stats.isDirectory())
-    rmdirSync(p, options, er)
-  else
-    options.unlinkSync(p)
-}
-
-function rmdir (p, options, originalEr, cb) {
-  assert(p)
-  assert(options)
-  if (originalEr)
-    assert(originalEr instanceof Error)
-  assert(typeof cb === 'function')
-
-  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
-  // if we guessed wrong, and it's not a directory, then
-  // raise the original error.
-  options.rmdir(p, function (er) {
-    if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
-      rmkids(p, options, cb)
-    else if (er && er.code === "ENOTDIR")
-      cb(originalEr)
-    else
-      cb(er)
-  })
-}
-
-function rmkids(p, options, cb) {
-  assert(p)
-  assert(options)
-  assert(typeof cb === 'function')
-
-  options.readdir(p, function (er, files) {
-    if (er)
-      return cb(er)
-    var n = files.length
-    if (n === 0)
-      return options.rmdir(p, cb)
-    var errState
-    files.forEach(function (f) {
-      rimraf(path.join(p, f), options, function (er) {
-        if (errState)
-          return
-        if (er)
-          return cb(errState = er)
-        if (--n === 0)
-          options.rmdir(p, cb)
-      })
-    })
-  })
-}
-
-// this looks simpler, and is strictly *faster*, but will
-// tie up the JavaScript thread and fail on excessively
-// deep directory trees.
-function rimrafSync (p, options) {
-  options = options || {}
-  defaults(options)
-
-  assert(p, 'rimraf: missing path')
-  assert.equal(typeof p, 'string', 'rimraf: path should be a string')
-  assert(options, 'rimraf: missing options')
-  assert.equal(typeof options, 'object', 'rimraf: options should be object')
-
-  var results
-
-  if (options.disableGlob || !glob.hasMagic(p)) {
-    results = [p]
-  } else {
-    try {
-      options.lstatSync(p)
-      results = [p]
-    } catch (er) {
-      results = glob.sync(p, options.glob)
-    }
-  }
-
-  if (!results.length)
-    return
-
-  for (var i = 0; i < results.length; i++) {
-    var p = results[i]
-
-    try {
-      var st = options.lstatSync(p)
-    } catch (er) {
-      if (er.code === "ENOENT")
-        return
-
-      // Windows can EPERM on stat.  Life is suffering.
-      if (er.code === "EPERM" && isWindows)
-        fixWinEPERMSync(p, options, er)
-    }
-
-    try {
-      // sunos lets the root user unlink directories, which is... weird.
-      if (st && st.isDirectory())
-        rmdirSync(p, options, null)
-      else
-        options.unlinkSync(p)
-    } catch (er) {
-      if (er.code === "ENOENT")
-        return
-      if (er.code === "EPERM")
-        return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
-      if (er.code !== "EISDIR")
-        throw er
-      rmdirSync(p, options, er)
-    }
-  }
-}
-
-function rmdirSync (p, options, originalEr) {
-  assert(p)
-  assert(options)
-  if (originalEr)
-    assert(originalEr instanceof Error)
-
-  try {
-    options.rmdirSync(p)
-  } catch (er) {
-    if (er.code === "ENOENT")
-      return
-    if (er.code === "ENOTDIR")
-      throw originalEr
-    if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
-      rmkidsSync(p, options)
-  }
-}
-
-function rmkidsSync (p, options) {
-  assert(p)
-  assert(options)
-  options.readdirSync(p).forEach(function (f) {
-    rimrafSync(path.join(p, f), options)
-  })
-  options.rmdirSync(p, options)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/README.md
deleted file mode 100644
index 27b044ecd89d4cc69224eb2df5da0568898e665b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/README.md
+++ /dev/null
@@ -1,346 +0,0 @@
-semver(1) -- The semantic versioner for npm
-===========================================
-
-## Usage
-
-    $ npm install semver
-
-    semver.valid('1.2.3') // '1.2.3'
-    semver.valid('a.b.c') // null
-    semver.clean('  =v1.2.3   ') // '1.2.3'
-    semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
-    semver.gt('1.2.3', '9.8.7') // false
-    semver.lt('1.2.3', '9.8.7') // true
-
-As a command-line utility:
-
-    $ semver -h
-
-    SemVer 5.1.0
-
-    A JavaScript implementation of the http://semver.org/ specification
-    Copyright Isaac Z. Schlueter
-
-    Usage: semver [options] <version> [<version> [...]]
-    Prints valid versions sorted by SemVer precedence
-
-    Options:
-    -r --range <range>
-            Print versions that match the specified range.
-
-    -i --increment [<level>]
-            Increment a version by the specified level.  Level can
-            be one of: major, minor, patch, premajor, preminor,
-            prepatch, or prerelease.  Default level is 'patch'.
-            Only one version may be specified.
-
-    --preid <identifier>
-            Identifier to be used to prefix premajor, preminor,
-            prepatch or prerelease version increments.
-
-    -l --loose
-            Interpret versions and ranges loosely
-
-    Program exits successfully if any valid version satisfies
-    all supplied ranges, and prints all satisfying versions.
-
-    If no satisfying versions are found, then exits failure.
-
-    Versions are printed in ascending order, so supplying
-    multiple versions to the utility will just sort them.
-
-## Versions
-
-A "version" is described by the `v2.0.0` specification found at
-<http://semver.org/>.
-
-A leading `"="` or `"v"` character is stripped off and ignored.
-
-## Ranges
-
-A `version range` is a set of `comparators` which specify versions
-that satisfy the range.
-
-A `comparator` is composed of an `operator` and a `version`.  The set
-of primitive `operators` is:
-
-* `<` Less than
-* `<=` Less than or equal to
-* `>` Greater than
-* `>=` Greater than or equal to
-* `=` Equal.  If no operator is specified, then equality is assumed,
-  so this operator is optional, but MAY be included.
-
-For example, the comparator `>=1.2.7` would match the versions
-`1.2.7`, `1.2.8`, `2.5.3`, and `1.3.9`, but not the versions `1.2.6`
-or `1.1.0`.
-
-Comparators can be joined by whitespace to form a `comparator set`,
-which is satisfied by the **intersection** of all of the comparators
-it includes.
-
-A range is composed of one or more comparator sets, joined by `||`.  A
-version matches a range if and only if every comparator in at least
-one of the `||`-separated comparator sets is satisfied by the version.
-
-For example, the range `>=1.2.7 <1.3.0` would match the versions
-`1.2.7`, `1.2.8`, and `1.2.99`, but not the versions `1.2.6`, `1.3.0`,
-or `1.1.0`.
-
-The range `1.2.7 || >=1.2.9 <2.0.0` would match the versions `1.2.7`,
-`1.2.9`, and `1.4.6`, but not the versions `1.2.8` or `2.0.0`.
-
-### Prerelease Tags
-
-If a version has a prerelease tag (for example, `1.2.3-alpha.3`) then
-it will only be allowed to satisfy comparator sets if at least one
-comparator with the same `[major, minor, patch]` tuple also has a
-prerelease tag.
-
-For example, the range `>1.2.3-alpha.3` would be allowed to match the
-version `1.2.3-alpha.7`, but it would *not* be satisfied by
-`3.4.5-alpha.9`, even though `3.4.5-alpha.9` is technically "greater
-than" `1.2.3-alpha.3` according to the SemVer sort rules.  The version
-range only accepts prerelease tags on the `1.2.3` version.  The
-version `3.4.5` *would* satisfy the range, because it does not have a
-prerelease flag, and `3.4.5` is greater than `1.2.3-alpha.7`.
-
-The purpose for this behavior is twofold.  First, prerelease versions
-frequently are updated very quickly, and contain many breaking changes
-that are (by the author's design) not yet fit for public consumption.
-Therefore, by default, they are excluded from range matching
-semantics.
-
-Second, a user who has opted into using a prerelease version has
-clearly indicated the intent to use *that specific* set of
-alpha/beta/rc versions.  By including a prerelease tag in the range,
-the user is indicating that they are aware of the risk.  However, it
-is still not appropriate to assume that they have opted into taking a
-similar risk on the *next* set of prerelease versions.
-
-#### Prerelease Identifiers
-
-The method `.inc` takes an additional `identifier` string argument that
-will append the value of the string as a prerelease identifier:
-
-```javascript
-> semver.inc('1.2.3', 'prerelease', 'beta')
-'1.2.4-beta.0'
-```
-
-command-line example:
-
-```shell
-$ semver 1.2.3 -i prerelease --preid beta
-1.2.4-beta.0
-```
-
-Which then can be used to increment further:
-
-```shell
-$ semver 1.2.4-beta.0 -i prerelease
-1.2.4-beta.1
-```
-
-### Advanced Range Syntax
-
-Advanced range syntax desugars to primitive comparators in
-deterministic ways.
-
-Advanced ranges may be combined in the same way as primitive
-comparators using white space or `||`.
-
-#### Hyphen Ranges `X.Y.Z - A.B.C`
-
-Specifies an inclusive set.
-
-* `1.2.3 - 2.3.4` := `>=1.2.3 <=2.3.4`
-
-If a partial version is provided as the first version in the inclusive
-range, then the missing pieces are replaced with zeroes.
-
-* `1.2 - 2.3.4` := `>=1.2.0 <=2.3.4`
-
-If a partial version is provided as the second version in the
-inclusive range, then all versions that start with the supplied parts
-of the tuple are accepted, but nothing that would be greater than the
-provided tuple parts.
-
-* `1.2.3 - 2.3` := `>=1.2.3 <2.4.0`
-* `1.2.3 - 2` := `>=1.2.3 <3.0.0`
-
-#### X-Ranges `1.2.x` `1.X` `1.2.*` `*`
-
-Any of `X`, `x`, or `*` may be used to "stand in" for one of the
-numeric values in the `[major, minor, patch]` tuple.
-
-* `*` := `>=0.0.0` (Any version satisfies)
-* `1.x` := `>=1.0.0 <2.0.0` (Matching major version)
-* `1.2.x` := `>=1.2.0 <1.3.0` (Matching major and minor versions)
-
-A partial version range is treated as an X-Range, so the special
-character is in fact optional.
-
-* `""` (empty string) := `*` := `>=0.0.0`
-* `1` := `1.x.x` := `>=1.0.0 <2.0.0`
-* `1.2` := `1.2.x` := `>=1.2.0 <1.3.0`
-
-#### Tilde Ranges `~1.2.3` `~1.2` `~1`
-
-Allows patch-level changes if a minor version is specified on the
-comparator.  Allows minor-level changes if not.
-
-* `~1.2.3` := `>=1.2.3 <1.(2+1).0` := `>=1.2.3 <1.3.0`
-* `~1.2` := `>=1.2.0 <1.(2+1).0` := `>=1.2.0 <1.3.0` (Same as `1.2.x`)
-* `~1` := `>=1.0.0 <(1+1).0.0` := `>=1.0.0 <2.0.0` (Same as `1.x`)
-* `~0.2.3` := `>=0.2.3 <0.(2+1).0` := `>=0.2.3 <0.3.0`
-* `~0.2` := `>=0.2.0 <0.(2+1).0` := `>=0.2.0 <0.3.0` (Same as `0.2.x`)
-* `~0` := `>=0.0.0 <(0+1).0.0` := `>=0.0.0 <1.0.0` (Same as `0.x`)
-* `~1.2.3-beta.2` := `>=1.2.3-beta.2 <1.3.0` Note that prereleases in
-  the `1.2.3` version will be allowed, if they are greater than or
-  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but
-  `1.2.4-beta.2` would not, because it is a prerelease of a
-  different `[major, minor, patch]` tuple.
-
-#### Caret Ranges `^1.2.3` `^0.2.5` `^0.0.4`
-
-Allows changes that do not modify the left-most non-zero digit in the
-`[major, minor, patch]` tuple.  In other words, this allows patch and
-minor updates for versions `1.0.0` and above, patch updates for
-versions `0.X >=0.1.0`, and *no* updates for versions `0.0.X`.
-
-Many authors treat a `0.x` version as if the `x` were the major
-"breaking-change" indicator.
-
-Caret ranges are ideal when an author may make breaking changes
-between `0.2.4` and `0.3.0` releases, which is a common practice.
-However, it presumes that there will *not* be breaking changes between
-`0.2.4` and `0.2.5`.  It allows for changes that are presumed to be
-additive (but non-breaking), according to commonly observed practices.
-
-* `^1.2.3` := `>=1.2.3 <2.0.0`
-* `^0.2.3` := `>=0.2.3 <0.3.0`
-* `^0.0.3` := `>=0.0.3 <0.0.4`
-* `^1.2.3-beta.2` := `>=1.2.3-beta.2 <2.0.0` Note that prereleases in
-  the `1.2.3` version will be allowed, if they are greater than or
-  equal to `beta.2`.  So, `1.2.3-beta.4` would be allowed, but
-  `1.2.4-beta.2` would not, because it is a prerelease of a
-  different `[major, minor, patch]` tuple.
-* `^0.0.3-beta` := `>=0.0.3-beta <0.0.4`  Note that prereleases in the
-  `0.0.3` version *only* will be allowed, if they are greater than or
-  equal to `beta`.  So, `0.0.3-pr.2` would be allowed.
-
-When parsing caret ranges, a missing `patch` value desugars to the
-number `0`, but will allow flexibility within that value, even if the
-major and minor versions are both `0`.
-
-* `^1.2.x` := `>=1.2.0 <2.0.0`
-* `^0.0.x` := `>=0.0.0 <0.1.0`
-* `^0.0` := `>=0.0.0 <0.1.0`
-
-A missing `minor` and `patch` values will desugar to zero, but also
-allow flexibility within those values, even if the major version is
-zero.
-
-* `^1.x` := `>=1.0.0 <2.0.0`
-* `^0.x` := `>=0.0.0 <1.0.0`
-
-### Range Grammar
-
-Putting all this together, here is a Backus-Naur grammar for ranges,
-for the benefit of parser authors:
-
-```bnf
-range-set  ::= range ( logical-or range ) *
-logical-or ::= ( ' ' ) * '||' ( ' ' ) *
-range      ::= hyphen | simple ( ' ' simple ) * | ''
-hyphen     ::= partial ' - ' partial
-simple     ::= primitive | partial | tilde | caret
-primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' | ) partial
-partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
-xr         ::= 'x' | 'X' | '*' | nr
-nr         ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
-tilde      ::= '~' partial
-caret      ::= '^' partial
-qualifier  ::= ( '-' pre )? ( '+' build )?
-pre        ::= parts
-build      ::= parts
-parts      ::= part ( '.' part ) *
-part       ::= nr | [-0-9A-Za-z]+
-```
-
-## Functions
-
-All methods and classes take a final `loose` boolean argument that, if
-true, will be more forgiving about not-quite-valid semver strings.
-The resulting output will always be 100% strict, of course.
-
-Strict-mode Comparators and Ranges will be strict about the SemVer
-strings that they parse.
-
-* `valid(v)`: Return the parsed version, or null if it's not valid.
-* `inc(v, release)`: Return the version incremented by the release
-  type (`major`,   `premajor`, `minor`, `preminor`, `patch`,
-  `prepatch`, or `prerelease`), or null if it's not valid
-  * `premajor` in one call will bump the version up to the next major
-    version and down to a prerelease of that major version.
-    `preminor`, and `prepatch` work the same way.
-  * If called from a non-prerelease version, the `prerelease` will work the
-    same as `prepatch`. It increments the patch version, then makes a
-    prerelease. If the input version is already a prerelease it simply
-    increments it.
-* `prerelease(v)`: Returns an array of prerelease components, or null
-  if none exist. Example: `prerelease('1.2.3-alpha.1') -> ['alpha', 1]`
-* `major(v)`: Return the major version number.
-* `minor(v)`: Return the minor version number.
-* `patch(v)`: Return the patch version number.
-
-### Comparison
-
-* `gt(v1, v2)`: `v1 > v2`
-* `gte(v1, v2)`: `v1 >= v2`
-* `lt(v1, v2)`: `v1 < v2`
-* `lte(v1, v2)`: `v1 <= v2`
-* `eq(v1, v2)`: `v1 == v2` This is true if they're logically equivalent,
-  even if they're not the exact same string.  You already know how to
-  compare strings.
-* `neq(v1, v2)`: `v1 != v2` The opposite of `eq`.
-* `cmp(v1, comparator, v2)`: Pass in a comparison string, and it'll call
-  the corresponding function above.  `"==="` and `"!=="` do simple
-  string comparison, but are included for completeness.  Throws if an
-  invalid comparison string is provided.
-* `compare(v1, v2)`: Return `0` if `v1 == v2`, or `1` if `v1` is greater, or `-1` if
-  `v2` is greater.  Sorts in ascending order if passed to `Array.sort()`.
-* `rcompare(v1, v2)`: The reverse of compare.  Sorts an array of versions
-  in descending order when passed to `Array.sort()`.
-* `diff(v1, v2)`: Returns difference between two versions by the release type
-  (`major`, `premajor`, `minor`, `preminor`, `patch`, `prepatch`, or `prerelease`),
-  or null if the versions are the same.
-
-
-### Ranges
-
-* `validRange(range)`: Return the valid range or null if it's not valid
-* `satisfies(version, range)`: Return true if the version satisfies the
-  range.
-* `maxSatisfying(versions, range)`: Return the highest version in the list
-  that satisfies the range, or `null` if none of them do.
-* `gtr(version, range)`: Return `true` if version is greater than all the
-  versions possible in the range.
-* `ltr(version, range)`: Return `true` if version is less than all the
-  versions possible in the range.
-* `outside(version, range, hilo)`: Return true if the version is outside
-  the bounds of the range in either the high or low direction.  The
-  `hilo` argument must be either the string `'>'` or `'<'`.  (This is
-  the function called by `gtr` and `ltr`.)
-
-Note that, since ranges may be non-contiguous, a version might not be
-greater than a range, less than a range, *or* satisfy a range!  For
-example, the range `1.2 <1.2.9 || >2.0.0` would have a hole from `1.2.9`
-until `2.0.0`, so the version `1.2.10` would not be greater than the
-range (because `2.0.1` satisfies, which is higher), nor less than the
-range (since `1.2.8` satisfies, which is lower), and it also does not
-satisfy the range.
-
-If you want to know if a version satisfies or does not satisfy a
-range, use the `satisfies(version, range)` function.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/bin/semver b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/bin/semver
deleted file mode 100755
index c5f2e857e8279083438589cfb06427997b6a5618..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/bin/semver
+++ /dev/null
@@ -1,133 +0,0 @@
-#!/usr/bin/env node
-// Standalone semver comparison program.
-// Exits successfully and prints matching version(s) if
-// any supplied version is valid and passes all tests.
-
-var argv = process.argv.slice(2)
-  , versions = []
-  , range = []
-  , gt = []
-  , lt = []
-  , eq = []
-  , inc = null
-  , version = require("../package.json").version
-  , loose = false
-  , identifier = undefined
-  , semver = require("../semver")
-  , reverse = false
-
-main()
-
-function main () {
-  if (!argv.length) return help()
-  while (argv.length) {
-    var a = argv.shift()
-    var i = a.indexOf('=')
-    if (i !== -1) {
-      a = a.slice(0, i)
-      argv.unshift(a.slice(i + 1))
-    }
-    switch (a) {
-      case "-rv": case "-rev": case "--rev": case "--reverse":
-        reverse = true
-        break
-      case "-l": case "--loose":
-        loose = true
-        break
-      case "-v": case "--version":
-        versions.push(argv.shift())
-        break
-      case "-i": case "--inc": case "--increment":
-        switch (argv[0]) {
-          case "major": case "minor": case "patch": case "prerelease":
-          case "premajor": case "preminor": case "prepatch":
-            inc = argv.shift()
-            break
-          default:
-            inc = "patch"
-            break
-        }
-        break
-      case "--preid":
-        identifier = argv.shift()
-        break
-      case "-r": case "--range":
-        range.push(argv.shift())
-        break
-      case "-h": case "--help": case "-?":
-        return help()
-      default:
-        versions.push(a)
-        break
-    }
-  }
-
-  versions = versions.filter(function (v) {
-    return semver.valid(v, loose)
-  })
-  if (!versions.length) return fail()
-  if (inc && (versions.length !== 1 || range.length))
-    return failInc()
-
-  for (var i = 0, l = range.length; i < l ; i ++) {
-    versions = versions.filter(function (v) {
-      return semver.satisfies(v, range[i], loose)
-    })
-    if (!versions.length) return fail()
-  }
-  return success(versions)
-}
-
-function failInc () {
-  console.error("--inc can only be used on a single version with no range")
-  fail()
-}
-
-function fail () { process.exit(1) }
-
-function success () {
-  var compare = reverse ? "rcompare" : "compare"
-  versions.sort(function (a, b) {
-    return semver[compare](a, b, loose)
-  }).map(function (v) {
-    return semver.clean(v, loose)
-  }).map(function (v) {
-    return inc ? semver.inc(v, inc, loose, identifier) : v
-  }).forEach(function (v,i,_) { console.log(v) })
-}
-
-function help () {
-  console.log(["SemVer " + version
-              ,""
-              ,"A JavaScript implementation of the http://semver.org/ specification"
-              ,"Copyright Isaac Z. Schlueter"
-              ,""
-              ,"Usage: semver [options] <version> [<version> [...]]"
-              ,"Prints valid versions sorted by SemVer precedence"
-              ,""
-              ,"Options:"
-              ,"-r --range <range>"
-              ,"        Print versions that match the specified range."
-              ,""
-              ,"-i --increment [<level>]"
-              ,"        Increment a version by the specified level.  Level can"
-              ,"        be one of: major, minor, patch, premajor, preminor,"
-              ,"        prepatch, or prerelease.  Default level is 'patch'."
-              ,"        Only one version may be specified."
-              ,""
-              ,"--preid <identifier>"
-              ,"        Identifier to be used to prefix premajor, preminor,"
-              ,"        prepatch or prerelease version increments."
-              ,""
-              ,"-l --loose"
-              ,"        Interpret versions and ranges loosely"
-              ,""
-              ,"Program exits successfully if any valid version satisfies"
-              ,"all supplied ranges, and prints all satisfying versions."
-              ,""
-              ,"If no satisfying versions are found, then exits failure."
-              ,""
-              ,"Versions are printed in ascending order, so supplying"
-              ,"multiple versions to the utility will just sort them."
-              ].join("\n"))
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/package.json
deleted file mode 100644
index 76c5c274ac2fedc4971819c33a299b3940a1e713..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/package.json
+++ /dev/null
@@ -1,68 +0,0 @@
-{
-  "_from": "semver@>=5.2.0 <5.3.0",
-  "_id": "semver@5.2.0",
-  "_location": "/serialport/node-pre-gyp/semver",
-  "_nodeVersion": "4.4.4",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/semver-5.2.0.tgz_1467136841238_0.2250258030835539"
-  },
-  "_npmUser": {
-    "email": "i@izs.me",
-    "name": "isaacs"
-  },
-  "_npmVersion": "3.10.2",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp"
-  ],
-  "_resolved": "https://registry.npmjs.org/semver/-/semver-5.2.0.tgz",
-  "_shasum": "281995b80c1448209415ddbc4cf50c269cef55c5",
-  "_shrinkwrap": null,
-  "bin": {
-    "semver": "./bin/semver"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/node-semver/issues"
-  },
-  "dependencies": {},
-  "description": "The semantic version parser used by npm.",
-  "devDependencies": {
-    "tap": "^2.0.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "281995b80c1448209415ddbc4cf50c269cef55c5",
-    "tarball": "https://registry.npmjs.org/semver/-/semver-5.2.0.tgz"
-  },
-  "files": [
-    "bin",
-    "range.bnf",
-    "semver.js"
-  ],
-  "gitHead": "f7fef36765c53ebe237bf415c3ea002f24aa5621",
-  "homepage": "https://github.com/npm/node-semver#readme",
-  "license": "ISC",
-  "main": "semver.js",
-  "maintainers": [
-    {
-      "name": "isaacs",
-      "email": "isaacs@npmjs.com"
-    },
-    {
-      "name": "othiym23",
-      "email": "ogd@aoaioxxysz.net"
-    }
-  ],
-  "name": "semver",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/node-semver.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "5.2.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/range.bnf b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/range.bnf
deleted file mode 100644
index 25ebd5c83254887f10ca1ea890066968d3ac061b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/range.bnf
+++ /dev/null
@@ -1,16 +0,0 @@
-range-set  ::= range ( logical-or range ) *
-logical-or ::= ( ' ' ) * '||' ( ' ' ) *
-range      ::= hyphen | simple ( ' ' simple ) * | ''
-hyphen     ::= partial ' - ' partial
-simple     ::= primitive | partial | tilde | caret
-primitive  ::= ( '<' | '>' | '>=' | '<=' | '=' | ) partial
-partial    ::= xr ( '.' xr ( '.' xr qualifier ? )? )?
-xr         ::= 'x' | 'X' | '*' | nr
-nr         ::= '0' | ['1'-'9'] ( ['0'-'9'] ) *
-tilde      ::= '~' partial
-caret      ::= '^' partial
-qualifier  ::= ( '-' pre )? ( '+' build )?
-pre        ::= parts
-build      ::= parts
-parts      ::= part ( '.' part ) *
-part       ::= nr | [-0-9A-Za-z]+
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/semver.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/semver.js
deleted file mode 100644
index b2d7298c6ef7198b2ac11ea43e5fee597ce69a64..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/semver/semver.js
+++ /dev/null
@@ -1,1194 +0,0 @@
-exports = module.exports = SemVer;
-
-// The debug function is excluded entirely from the minified version.
-/* nomin */ var debug;
-/* nomin */ if (typeof process === 'object' &&
-    /* nomin */ process.env &&
-    /* nomin */ process.env.NODE_DEBUG &&
-    /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG))
-  /* nomin */ debug = function() {
-    /* nomin */ var args = Array.prototype.slice.call(arguments, 0);
-    /* nomin */ args.unshift('SEMVER');
-    /* nomin */ console.log.apply(console, args);
-    /* nomin */ };
-/* nomin */ else
-  /* nomin */ debug = function() {};
-
-// Note: this is the semver.org version of the spec that it implements
-// Not necessarily the package version of this code.
-exports.SEMVER_SPEC_VERSION = '2.0.0';
-
-var MAX_LENGTH = 256;
-var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;
-
-// The actual regexps go on exports.re
-var re = exports.re = [];
-var src = exports.src = [];
-var R = 0;
-
-// The following Regular Expressions can be used for tokenizing,
-// validating, and parsing SemVer version strings.
-
-// ## Numeric Identifier
-// A single `0`, or a non-zero digit followed by zero or more digits.
-
-var NUMERICIDENTIFIER = R++;
-src[NUMERICIDENTIFIER] = '0|[1-9]\\d*';
-var NUMERICIDENTIFIERLOOSE = R++;
-src[NUMERICIDENTIFIERLOOSE] = '[0-9]+';
-
-
-// ## Non-numeric Identifier
-// Zero or more digits, followed by a letter or hyphen, and then zero or
-// more letters, digits, or hyphens.
-
-var NONNUMERICIDENTIFIER = R++;
-src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*';
-
-
-// ## Main Version
-// Three dot-separated numeric identifiers.
-
-var MAINVERSION = R++;
-src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' +
-                   '(' + src[NUMERICIDENTIFIER] + ')\\.' +
-                   '(' + src[NUMERICIDENTIFIER] + ')';
-
-var MAINVERSIONLOOSE = R++;
-src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
-                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' +
-                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')';
-
-// ## Pre-release Version Identifier
-// A numeric identifier, or a non-numeric identifier.
-
-var PRERELEASEIDENTIFIER = R++;
-src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +
-                            '|' + src[NONNUMERICIDENTIFIER] + ')';
-
-var PRERELEASEIDENTIFIERLOOSE = R++;
-src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +
-                                 '|' + src[NONNUMERICIDENTIFIER] + ')';
-
-
-// ## Pre-release Version
-// Hyphen, followed by one or more dot-separated pre-release version
-// identifiers.
-
-var PRERELEASE = R++;
-src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +
-                  '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))';
-
-var PRERELEASELOOSE = R++;
-src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +
-                       '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))';
-
-// ## Build Metadata Identifier
-// Any combination of digits, letters, or hyphens.
-
-var BUILDIDENTIFIER = R++;
-src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+';
-
-// ## Build Metadata
-// Plus sign, followed by one or more period-separated build metadata
-// identifiers.
-
-var BUILD = R++;
-src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] +
-             '(?:\\.' + src[BUILDIDENTIFIER] + ')*))';
-
-
-// ## Full Version String
-// A main version, followed optionally by a pre-release version and
-// build metadata.
-
-// Note that the only major, minor, patch, and pre-release sections of
-// the version string are capturing groups.  The build metadata is not a
-// capturing group, because it should not ever be used in version
-// comparison.
-
-var FULL = R++;
-var FULLPLAIN = 'v?' + src[MAINVERSION] +
-                src[PRERELEASE] + '?' +
-                src[BUILD] + '?';
-
-src[FULL] = '^' + FULLPLAIN + '$';
-
-// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.
-// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty
-// common in the npm registry.
-var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] +
-                 src[PRERELEASELOOSE] + '?' +
-                 src[BUILD] + '?';
-
-var LOOSE = R++;
-src[LOOSE] = '^' + LOOSEPLAIN + '$';
-
-var GTLT = R++;
-src[GTLT] = '((?:<|>)?=?)';
-
-// Something like "2.*" or "1.2.x".
-// Note that "x.x" is a valid xRange identifer, meaning "any version"
-// Only the first item is strictly required.
-var XRANGEIDENTIFIERLOOSE = R++;
-src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*';
-var XRANGEIDENTIFIER = R++;
-src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*';
-
-var XRANGEPLAIN = R++;
-src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' +
-                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
-                   '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' +
-                   '(?:' + src[PRERELEASE] + ')?' +
-                   src[BUILD] + '?' +
-                   ')?)?';
-
-var XRANGEPLAINLOOSE = R++;
-src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
-                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
-                        '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +
-                        '(?:' + src[PRERELEASELOOSE] + ')?' +
-                        src[BUILD] + '?' +
-                        ')?)?';
-
-var XRANGE = R++;
-src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$';
-var XRANGELOOSE = R++;
-src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$';
-
-// Tilde ranges.
-// Meaning is "reasonably at or greater than"
-var LONETILDE = R++;
-src[LONETILDE] = '(?:~>?)';
-
-var TILDETRIM = R++;
-src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+';
-re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');
-var tildeTrimReplace = '$1~';
-
-var TILDE = R++;
-src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';
-var TILDELOOSE = R++;
-src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';
-
-// Caret ranges.
-// Meaning is "at least and backwards compatible with"
-var LONECARET = R++;
-src[LONECARET] = '(?:\\^)';
-
-var CARETTRIM = R++;
-src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+';
-re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');
-var caretTrimReplace = '$1^';
-
-var CARET = R++;
-src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';
-var CARETLOOSE = R++;
-src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';
-
-// A simple gt/lt/eq thing, or just "" to indicate "any version"
-var COMPARATORLOOSE = R++;
-src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$';
-var COMPARATOR = R++;
-src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$';
-
-
-// An expression to strip any whitespace between the gtlt and the thing
-// it modifies, so that `> 1.2.3` ==> `>1.2.3`
-var COMPARATORTRIM = R++;
-src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] +
-                      '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')';
-
-// this one has to use the /g flag
-re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g');
-var comparatorTrimReplace = '$1$2$3';
-
-
-// Something like `1.2.3 - 1.2.4`
-// Note that these all use the loose form, because they'll be
-// checked against either the strict or loose comparator form
-// later.
-var HYPHENRANGE = R++;
-src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' +
-                   '\\s+-\\s+' +
-                   '(' + src[XRANGEPLAIN] + ')' +
-                   '\\s*$';
-
-var HYPHENRANGELOOSE = R++;
-src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' +
-                        '\\s+-\\s+' +
-                        '(' + src[XRANGEPLAINLOOSE] + ')' +
-                        '\\s*$';
-
-// Star ranges basically just allow anything at all.
-var STAR = R++;
-src[STAR] = '(<|>)?=?\\s*\\*';
-
-// Compile to actual regexp objects.
-// All are flag-free, unless they were created above with a flag.
-for (var i = 0; i < R; i++) {
-  debug(i, src[i]);
-  if (!re[i])
-    re[i] = new RegExp(src[i]);
-}
-
-exports.parse = parse;
-function parse(version, loose) {
-  if (version instanceof SemVer)
-    return version;
-
-  if (typeof version !== 'string')
-    return null;
-
-  if (version.length > MAX_LENGTH)
-    return null;
-
-  var r = loose ? re[LOOSE] : re[FULL];
-  if (!r.test(version))
-    return null;
-
-  try {
-    return new SemVer(version, loose);
-  } catch (er) {
-    return null;
-  }
-}
-
-exports.valid = valid;
-function valid(version, loose) {
-  var v = parse(version, loose);
-  return v ? v.version : null;
-}
-
-
-exports.clean = clean;
-function clean(version, loose) {
-  var s = parse(version.trim().replace(/^[=v]+/, ''), loose);
-  return s ? s.version : null;
-}
-
-exports.SemVer = SemVer;
-
-function SemVer(version, loose) {
-  if (version instanceof SemVer) {
-    if (version.loose === loose)
-      return version;
-    else
-      version = version.version;
-  } else if (typeof version !== 'string') {
-    throw new TypeError('Invalid Version: ' + version);
-  }
-
-  if (version.length > MAX_LENGTH)
-    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')
-
-  if (!(this instanceof SemVer))
-    return new SemVer(version, loose);
-
-  debug('SemVer', version, loose);
-  this.loose = loose;
-  var m = version.trim().match(loose ? re[LOOSE] : re[FULL]);
-
-  if (!m)
-    throw new TypeError('Invalid Version: ' + version);
-
-  this.raw = version;
-
-  // these are actually numbers
-  this.major = +m[1];
-  this.minor = +m[2];
-  this.patch = +m[3];
-
-  if (this.major > MAX_SAFE_INTEGER || this.major < 0)
-    throw new TypeError('Invalid major version')
-
-  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0)
-    throw new TypeError('Invalid minor version')
-
-  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0)
-    throw new TypeError('Invalid patch version')
-
-  // numberify any prerelease numeric ids
-  if (!m[4])
-    this.prerelease = [];
-  else
-    this.prerelease = m[4].split('.').map(function(id) {
-      if (/^[0-9]+$/.test(id)) {
-        var num = +id
-        if (num >= 0 && num < MAX_SAFE_INTEGER)
-          return num
-      }
-      return id;
-    });
-
-  this.build = m[5] ? m[5].split('.') : [];
-  this.format();
-}
-
-SemVer.prototype.format = function() {
-  this.version = this.major + '.' + this.minor + '.' + this.patch;
-  if (this.prerelease.length)
-    this.version += '-' + this.prerelease.join('.');
-  return this.version;
-};
-
-SemVer.prototype.toString = function() {
-  return this.version;
-};
-
-SemVer.prototype.compare = function(other) {
-  debug('SemVer.compare', this.version, this.loose, other);
-  if (!(other instanceof SemVer))
-    other = new SemVer(other, this.loose);
-
-  return this.compareMain(other) || this.comparePre(other);
-};
-
-SemVer.prototype.compareMain = function(other) {
-  if (!(other instanceof SemVer))
-    other = new SemVer(other, this.loose);
-
-  return compareIdentifiers(this.major, other.major) ||
-         compareIdentifiers(this.minor, other.minor) ||
-         compareIdentifiers(this.patch, other.patch);
-};
-
-SemVer.prototype.comparePre = function(other) {
-  if (!(other instanceof SemVer))
-    other = new SemVer(other, this.loose);
-
-  // NOT having a prerelease is > having one
-  if (this.prerelease.length && !other.prerelease.length)
-    return -1;
-  else if (!this.prerelease.length && other.prerelease.length)
-    return 1;
-  else if (!this.prerelease.length && !other.prerelease.length)
-    return 0;
-
-  var i = 0;
-  do {
-    var a = this.prerelease[i];
-    var b = other.prerelease[i];
-    debug('prerelease compare', i, a, b);
-    if (a === undefined && b === undefined)
-      return 0;
-    else if (b === undefined)
-      return 1;
-    else if (a === undefined)
-      return -1;
-    else if (a === b)
-      continue;
-    else
-      return compareIdentifiers(a, b);
-  } while (++i);
-};
-
-// preminor will bump the version up to the next minor release, and immediately
-// down to pre-release. premajor and prepatch work the same way.
-SemVer.prototype.inc = function(release, identifier) {
-  switch (release) {
-    case 'premajor':
-      this.prerelease.length = 0;
-      this.patch = 0;
-      this.minor = 0;
-      this.major++;
-      this.inc('pre', identifier);
-      break;
-    case 'preminor':
-      this.prerelease.length = 0;
-      this.patch = 0;
-      this.minor++;
-      this.inc('pre', identifier);
-      break;
-    case 'prepatch':
-      // If this is already a prerelease, it will bump to the next version
-      // drop any prereleases that might already exist, since they are not
-      // relevant at this point.
-      this.prerelease.length = 0;
-      this.inc('patch', identifier);
-      this.inc('pre', identifier);
-      break;
-    // If the input is a non-prerelease version, this acts the same as
-    // prepatch.
-    case 'prerelease':
-      if (this.prerelease.length === 0)
-        this.inc('patch', identifier);
-      this.inc('pre', identifier);
-      break;
-
-    case 'major':
-      // If this is a pre-major version, bump up to the same major version.
-      // Otherwise increment major.
-      // 1.0.0-5 bumps to 1.0.0
-      // 1.1.0 bumps to 2.0.0
-      if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0)
-        this.major++;
-      this.minor = 0;
-      this.patch = 0;
-      this.prerelease = [];
-      break;
-    case 'minor':
-      // If this is a pre-minor version, bump up to the same minor version.
-      // Otherwise increment minor.
-      // 1.2.0-5 bumps to 1.2.0
-      // 1.2.1 bumps to 1.3.0
-      if (this.patch !== 0 || this.prerelease.length === 0)
-        this.minor++;
-      this.patch = 0;
-      this.prerelease = [];
-      break;
-    case 'patch':
-      // If this is not a pre-release version, it will increment the patch.
-      // If it is a pre-release it will bump up to the same patch version.
-      // 1.2.0-5 patches to 1.2.0
-      // 1.2.0 patches to 1.2.1
-      if (this.prerelease.length === 0)
-        this.patch++;
-      this.prerelease = [];
-      break;
-    // This probably shouldn't be used publicly.
-    // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction.
-    case 'pre':
-      if (this.prerelease.length === 0)
-        this.prerelease = [0];
-      else {
-        var i = this.prerelease.length;
-        while (--i >= 0) {
-          if (typeof this.prerelease[i] === 'number') {
-            this.prerelease[i]++;
-            i = -2;
-          }
-        }
-        if (i === -1) // didn't increment anything
-          this.prerelease.push(0);
-      }
-      if (identifier) {
-        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,
-        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0
-        if (this.prerelease[0] === identifier) {
-          if (isNaN(this.prerelease[1]))
-            this.prerelease = [identifier, 0];
-        } else
-          this.prerelease = [identifier, 0];
-      }
-      break;
-
-    default:
-      throw new Error('invalid increment argument: ' + release);
-  }
-  this.format();
-  this.raw = this.version;
-  return this;
-};
-
-exports.inc = inc;
-function inc(version, release, loose, identifier) {
-  if (typeof(loose) === 'string') {
-    identifier = loose;
-    loose = undefined;
-  }
-
-  try {
-    return new SemVer(version, loose).inc(release, identifier).version;
-  } catch (er) {
-    return null;
-  }
-}
-
-exports.diff = diff;
-function diff(version1, version2) {
-  if (eq(version1, version2)) {
-    return null;
-  } else {
-    var v1 = parse(version1);
-    var v2 = parse(version2);
-    if (v1.prerelease.length || v2.prerelease.length) {
-      for (var key in v1) {
-        if (key === 'major' || key === 'minor' || key === 'patch') {
-          if (v1[key] !== v2[key]) {
-            return 'pre'+key;
-          }
-        }
-      }
-      return 'prerelease';
-    }
-    for (var key in v1) {
-      if (key === 'major' || key === 'minor' || key === 'patch') {
-        if (v1[key] !== v2[key]) {
-          return key;
-        }
-      }
-    }
-  }
-}
-
-exports.compareIdentifiers = compareIdentifiers;
-
-var numeric = /^[0-9]+$/;
-function compareIdentifiers(a, b) {
-  var anum = numeric.test(a);
-  var bnum = numeric.test(b);
-
-  if (anum && bnum) {
-    a = +a;
-    b = +b;
-  }
-
-  return (anum && !bnum) ? -1 :
-         (bnum && !anum) ? 1 :
-         a < b ? -1 :
-         a > b ? 1 :
-         0;
-}
-
-exports.rcompareIdentifiers = rcompareIdentifiers;
-function rcompareIdentifiers(a, b) {
-  return compareIdentifiers(b, a);
-}
-
-exports.major = major;
-function major(a, loose) {
-  return new SemVer(a, loose).major;
-}
-
-exports.minor = minor;
-function minor(a, loose) {
-  return new SemVer(a, loose).minor;
-}
-
-exports.patch = patch;
-function patch(a, loose) {
-  return new SemVer(a, loose).patch;
-}
-
-exports.compare = compare;
-function compare(a, b, loose) {
-  return new SemVer(a, loose).compare(b);
-}
-
-exports.compareLoose = compareLoose;
-function compareLoose(a, b) {
-  return compare(a, b, true);
-}
-
-exports.rcompare = rcompare;
-function rcompare(a, b, loose) {
-  return compare(b, a, loose);
-}
-
-exports.sort = sort;
-function sort(list, loose) {
-  return list.sort(function(a, b) {
-    return exports.compare(a, b, loose);
-  });
-}
-
-exports.rsort = rsort;
-function rsort(list, loose) {
-  return list.sort(function(a, b) {
-    return exports.rcompare(a, b, loose);
-  });
-}
-
-exports.gt = gt;
-function gt(a, b, loose) {
-  return compare(a, b, loose) > 0;
-}
-
-exports.lt = lt;
-function lt(a, b, loose) {
-  return compare(a, b, loose) < 0;
-}
-
-exports.eq = eq;
-function eq(a, b, loose) {
-  return compare(a, b, loose) === 0;
-}
-
-exports.neq = neq;
-function neq(a, b, loose) {
-  return compare(a, b, loose) !== 0;
-}
-
-exports.gte = gte;
-function gte(a, b, loose) {
-  return compare(a, b, loose) >= 0;
-}
-
-exports.lte = lte;
-function lte(a, b, loose) {
-  return compare(a, b, loose) <= 0;
-}
-
-exports.cmp = cmp;
-function cmp(a, op, b, loose) {
-  var ret;
-  switch (op) {
-    case '===':
-      if (typeof a === 'object') a = a.version;
-      if (typeof b === 'object') b = b.version;
-      ret = a === b;
-      break;
-    case '!==':
-      if (typeof a === 'object') a = a.version;
-      if (typeof b === 'object') b = b.version;
-      ret = a !== b;
-      break;
-    case '': case '=': case '==': ret = eq(a, b, loose); break;
-    case '!=': ret = neq(a, b, loose); break;
-    case '>': ret = gt(a, b, loose); break;
-    case '>=': ret = gte(a, b, loose); break;
-    case '<': ret = lt(a, b, loose); break;
-    case '<=': ret = lte(a, b, loose); break;
-    default: throw new TypeError('Invalid operator: ' + op);
-  }
-  return ret;
-}
-
-exports.Comparator = Comparator;
-function Comparator(comp, loose) {
-  if (comp instanceof Comparator) {
-    if (comp.loose === loose)
-      return comp;
-    else
-      comp = comp.value;
-  }
-
-  if (!(this instanceof Comparator))
-    return new Comparator(comp, loose);
-
-  debug('comparator', comp, loose);
-  this.loose = loose;
-  this.parse(comp);
-
-  if (this.semver === ANY)
-    this.value = '';
-  else
-    this.value = this.operator + this.semver.version;
-
-  debug('comp', this);
-}
-
-var ANY = {};
-Comparator.prototype.parse = function(comp) {
-  var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
-  var m = comp.match(r);
-
-  if (!m)
-    throw new TypeError('Invalid comparator: ' + comp);
-
-  this.operator = m[1];
-  if (this.operator === '=')
-    this.operator = '';
-
-  // if it literally is just '>' or '' then allow anything.
-  if (!m[2])
-    this.semver = ANY;
-  else
-    this.semver = new SemVer(m[2], this.loose);
-};
-
-Comparator.prototype.toString = function() {
-  return this.value;
-};
-
-Comparator.prototype.test = function(version) {
-  debug('Comparator.test', version, this.loose);
-
-  if (this.semver === ANY)
-    return true;
-
-  if (typeof version === 'string')
-    version = new SemVer(version, this.loose);
-
-  return cmp(version, this.operator, this.semver, this.loose);
-};
-
-
-exports.Range = Range;
-function Range(range, loose) {
-  if ((range instanceof Range) && range.loose === loose)
-    return range;
-
-  if (!(this instanceof Range))
-    return new Range(range, loose);
-
-  this.loose = loose;
-
-  // First, split based on boolean or ||
-  this.raw = range;
-  this.set = range.split(/\s*\|\|\s*/).map(function(range) {
-    return this.parseRange(range.trim());
-  }, this).filter(function(c) {
-    // throw out any that are not relevant for whatever reason
-    return c.length;
-  });
-
-  if (!this.set.length) {
-    throw new TypeError('Invalid SemVer Range: ' + range);
-  }
-
-  this.format();
-}
-
-Range.prototype.format = function() {
-  this.range = this.set.map(function(comps) {
-    return comps.join(' ').trim();
-  }).join('||').trim();
-  return this.range;
-};
-
-Range.prototype.toString = function() {
-  return this.range;
-};
-
-Range.prototype.parseRange = function(range) {
-  var loose = this.loose;
-  range = range.trim();
-  debug('range', range, loose);
-  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`
-  var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];
-  range = range.replace(hr, hyphenReplace);
-  debug('hyphen replace', range);
-  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`
-  range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);
-  debug('comparator trim', range, re[COMPARATORTRIM]);
-
-  // `~ 1.2.3` => `~1.2.3`
-  range = range.replace(re[TILDETRIM], tildeTrimReplace);
-
-  // `^ 1.2.3` => `^1.2.3`
-  range = range.replace(re[CARETTRIM], caretTrimReplace);
-
-  // normalize spaces
-  range = range.split(/\s+/).join(' ');
-
-  // At this point, the range is completely trimmed and
-  // ready to be split into comparators.
-
-  var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];
-  var set = range.split(' ').map(function(comp) {
-    return parseComparator(comp, loose);
-  }).join(' ').split(/\s+/);
-  if (this.loose) {
-    // in loose mode, throw out any that are not valid comparators
-    set = set.filter(function(comp) {
-      return !!comp.match(compRe);
-    });
-  }
-  set = set.map(function(comp) {
-    return new Comparator(comp, loose);
-  });
-
-  return set;
-};
-
-// Mostly just for testing and legacy API reasons
-exports.toComparators = toComparators;
-function toComparators(range, loose) {
-  return new Range(range, loose).set.map(function(comp) {
-    return comp.map(function(c) {
-      return c.value;
-    }).join(' ').trim().split(' ');
-  });
-}
-
-// comprised of xranges, tildes, stars, and gtlt's at this point.
-// already replaced the hyphen ranges
-// turn into a set of JUST comparators.
-function parseComparator(comp, loose) {
-  debug('comp', comp);
-  comp = replaceCarets(comp, loose);
-  debug('caret', comp);
-  comp = replaceTildes(comp, loose);
-  debug('tildes', comp);
-  comp = replaceXRanges(comp, loose);
-  debug('xrange', comp);
-  comp = replaceStars(comp, loose);
-  debug('stars', comp);
-  return comp;
-}
-
-function isX(id) {
-  return !id || id.toLowerCase() === 'x' || id === '*';
-}
-
-// ~, ~> --> * (any, kinda silly)
-// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0
-// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0
-// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0
-// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0
-// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0
-function replaceTildes(comp, loose) {
-  return comp.trim().split(/\s+/).map(function(comp) {
-    return replaceTilde(comp, loose);
-  }).join(' ');
-}
-
-function replaceTilde(comp, loose) {
-  var r = loose ? re[TILDELOOSE] : re[TILDE];
-  return comp.replace(r, function(_, M, m, p, pr) {
-    debug('tilde', comp, _, M, m, p, pr);
-    var ret;
-
-    if (isX(M))
-      ret = '';
-    else if (isX(m))
-      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
-    else if (isX(p))
-      // ~1.2 == >=1.2.0 <1.3.0
-      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
-    else if (pr) {
-      debug('replaceTilde pr', pr);
-      if (pr.charAt(0) !== '-')
-        pr = '-' + pr;
-      ret = '>=' + M + '.' + m + '.' + p + pr +
-            ' <' + M + '.' + (+m + 1) + '.0';
-    } else
-      // ~1.2.3 == >=1.2.3 <1.3.0
-      ret = '>=' + M + '.' + m + '.' + p +
-            ' <' + M + '.' + (+m + 1) + '.0';
-
-    debug('tilde return', ret);
-    return ret;
-  });
-}
-
-// ^ --> * (any, kinda silly)
-// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0
-// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0
-// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0
-// ^1.2.3 --> >=1.2.3 <2.0.0
-// ^1.2.0 --> >=1.2.0 <2.0.0
-function replaceCarets(comp, loose) {
-  return comp.trim().split(/\s+/).map(function(comp) {
-    return replaceCaret(comp, loose);
-  }).join(' ');
-}
-
-function replaceCaret(comp, loose) {
-  debug('caret', comp, loose);
-  var r = loose ? re[CARETLOOSE] : re[CARET];
-  return comp.replace(r, function(_, M, m, p, pr) {
-    debug('caret', comp, _, M, m, p, pr);
-    var ret;
-
-    if (isX(M))
-      ret = '';
-    else if (isX(m))
-      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
-    else if (isX(p)) {
-      if (M === '0')
-        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
-      else
-        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0';
-    } else if (pr) {
-      debug('replaceCaret pr', pr);
-      if (pr.charAt(0) !== '-')
-        pr = '-' + pr;
-      if (M === '0') {
-        if (m === '0')
-          ret = '>=' + M + '.' + m + '.' + p + pr +
-                ' <' + M + '.' + m + '.' + (+p + 1);
-        else
-          ret = '>=' + M + '.' + m + '.' + p + pr +
-                ' <' + M + '.' + (+m + 1) + '.0';
-      } else
-        ret = '>=' + M + '.' + m + '.' + p + pr +
-              ' <' + (+M + 1) + '.0.0';
-    } else {
-      debug('no pr');
-      if (M === '0') {
-        if (m === '0')
-          ret = '>=' + M + '.' + m + '.' + p +
-                ' <' + M + '.' + m + '.' + (+p + 1);
-        else
-          ret = '>=' + M + '.' + m + '.' + p +
-                ' <' + M + '.' + (+m + 1) + '.0';
-      } else
-        ret = '>=' + M + '.' + m + '.' + p +
-              ' <' + (+M + 1) + '.0.0';
-    }
-
-    debug('caret return', ret);
-    return ret;
-  });
-}
-
-function replaceXRanges(comp, loose) {
-  debug('replaceXRanges', comp, loose);
-  return comp.split(/\s+/).map(function(comp) {
-    return replaceXRange(comp, loose);
-  }).join(' ');
-}
-
-function replaceXRange(comp, loose) {
-  comp = comp.trim();
-  var r = loose ? re[XRANGELOOSE] : re[XRANGE];
-  return comp.replace(r, function(ret, gtlt, M, m, p, pr) {
-    debug('xRange', comp, ret, gtlt, M, m, p, pr);
-    var xM = isX(M);
-    var xm = xM || isX(m);
-    var xp = xm || isX(p);
-    var anyX = xp;
-
-    if (gtlt === '=' && anyX)
-      gtlt = '';
-
-    if (xM) {
-      if (gtlt === '>' || gtlt === '<') {
-        // nothing is allowed
-        ret = '<0.0.0';
-      } else {
-        // nothing is forbidden
-        ret = '*';
-      }
-    } else if (gtlt && anyX) {
-      // replace X with 0
-      if (xm)
-        m = 0;
-      if (xp)
-        p = 0;
-
-      if (gtlt === '>') {
-        // >1 => >=2.0.0
-        // >1.2 => >=1.3.0
-        // >1.2.3 => >= 1.2.4
-        gtlt = '>=';
-        if (xm) {
-          M = +M + 1;
-          m = 0;
-          p = 0;
-        } else if (xp) {
-          m = +m + 1;
-          p = 0;
-        }
-      } else if (gtlt === '<=') {
-        // <=0.7.x is actually <0.8.0, since any 0.7.x should
-        // pass.  Similarly, <=7.x is actually <8.0.0, etc.
-        gtlt = '<'
-        if (xm)
-          M = +M + 1
-        else
-          m = +m + 1
-      }
-
-      ret = gtlt + M + '.' + m + '.' + p;
-    } else if (xm) {
-      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';
-    } else if (xp) {
-      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';
-    }
-
-    debug('xRange return', ret);
-
-    return ret;
-  });
-}
-
-// Because * is AND-ed with everything else in the comparator,
-// and '' means "any version", just remove the *s entirely.
-function replaceStars(comp, loose) {
-  debug('replaceStars', comp, loose);
-  // Looseness is ignored here.  star is always as loose as it gets!
-  return comp.trim().replace(re[STAR], '');
-}
-
-// This function is passed to string.replace(re[HYPHENRANGE])
-// M, m, patch, prerelease, build
-// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5
-// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do
-// 1.2 - 3.4 => >=1.2.0 <3.5.0
-function hyphenReplace($0,
-                       from, fM, fm, fp, fpr, fb,
-                       to, tM, tm, tp, tpr, tb) {
-
-  if (isX(fM))
-    from = '';
-  else if (isX(fm))
-    from = '>=' + fM + '.0.0';
-  else if (isX(fp))
-    from = '>=' + fM + '.' + fm + '.0';
-  else
-    from = '>=' + from;
-
-  if (isX(tM))
-    to = '';
-  else if (isX(tm))
-    to = '<' + (+tM + 1) + '.0.0';
-  else if (isX(tp))
-    to = '<' + tM + '.' + (+tm + 1) + '.0';
-  else if (tpr)
-    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;
-  else
-    to = '<=' + to;
-
-  return (from + ' ' + to).trim();
-}
-
-
-// if ANY of the sets match ALL of its comparators, then pass
-Range.prototype.test = function(version) {
-  if (!version)
-    return false;
-
-  if (typeof version === 'string')
-    version = new SemVer(version, this.loose);
-
-  for (var i = 0; i < this.set.length; i++) {
-    if (testSet(this.set[i], version))
-      return true;
-  }
-  return false;
-};
-
-function testSet(set, version) {
-  for (var i = 0; i < set.length; i++) {
-    if (!set[i].test(version))
-      return false;
-  }
-
-  if (version.prerelease.length) {
-    // Find the set of versions that are allowed to have prereleases
-    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0
-    // That should allow `1.2.3-pr.2` to pass.
-    // However, `1.2.4-alpha.notready` should NOT be allowed,
-    // even though it's within the range set by the comparators.
-    for (var i = 0; i < set.length; i++) {
-      debug(set[i].semver);
-      if (set[i].semver === ANY)
-        continue;
-
-      if (set[i].semver.prerelease.length > 0) {
-        var allowed = set[i].semver;
-        if (allowed.major === version.major &&
-            allowed.minor === version.minor &&
-            allowed.patch === version.patch)
-          return true;
-      }
-    }
-
-    // Version has a -pre, but it's not one of the ones we like.
-    return false;
-  }
-
-  return true;
-}
-
-exports.satisfies = satisfies;
-function satisfies(version, range, loose) {
-  try {
-    range = new Range(range, loose);
-  } catch (er) {
-    return false;
-  }
-  return range.test(version);
-}
-
-exports.maxSatisfying = maxSatisfying;
-function maxSatisfying(versions, range, loose) {
-  return versions.filter(function(version) {
-    return satisfies(version, range, loose);
-  }).sort(function(a, b) {
-    return rcompare(a, b, loose);
-  })[0] || null;
-}
-
-exports.validRange = validRange;
-function validRange(range, loose) {
-  try {
-    // Return '*' instead of '' so that truthiness works.
-    // This will throw if it's invalid anyway
-    return new Range(range, loose).range || '*';
-  } catch (er) {
-    return null;
-  }
-}
-
-// Determine if version is less than all the versions possible in the range
-exports.ltr = ltr;
-function ltr(version, range, loose) {
-  return outside(version, range, '<', loose);
-}
-
-// Determine if version is greater than all the versions possible in the range.
-exports.gtr = gtr;
-function gtr(version, range, loose) {
-  return outside(version, range, '>', loose);
-}
-
-exports.outside = outside;
-function outside(version, range, hilo, loose) {
-  version = new SemVer(version, loose);
-  range = new Range(range, loose);
-
-  var gtfn, ltefn, ltfn, comp, ecomp;
-  switch (hilo) {
-    case '>':
-      gtfn = gt;
-      ltefn = lte;
-      ltfn = lt;
-      comp = '>';
-      ecomp = '>=';
-      break;
-    case '<':
-      gtfn = lt;
-      ltefn = gte;
-      ltfn = gt;
-      comp = '<';
-      ecomp = '<=';
-      break;
-    default:
-      throw new TypeError('Must provide a hilo val of "<" or ">"');
-  }
-
-  // If it satisifes the range it is not outside
-  if (satisfies(version, range, loose)) {
-    return false;
-  }
-
-  // From now on, variable terms are as if we're in "gtr" mode.
-  // but note that everything is flipped for the "ltr" function.
-
-  for (var i = 0; i < range.set.length; ++i) {
-    var comparators = range.set[i];
-
-    var high = null;
-    var low = null;
-
-    comparators.forEach(function(comparator) {
-      if (comparator.semver === ANY) {
-        comparator = new Comparator('>=0.0.0')
-      }
-      high = high || comparator;
-      low = low || comparator;
-      if (gtfn(comparator.semver, high.semver, loose)) {
-        high = comparator;
-      } else if (ltfn(comparator.semver, low.semver, loose)) {
-        low = comparator;
-      }
-    });
-
-    // If the edge version comparator has a operator then our version
-    // isn't outside it
-    if (high.operator === comp || high.operator === ecomp) {
-      return false;
-    }
-
-    // If the lowest version comparator has an operator and our version
-    // is less than it then it isn't higher than the range
-    if ((!low.operator || low.operator === comp) &&
-        ltefn(version, low.semver)) {
-      return false;
-    } else if (low.operator === ecomp && ltfn(version, low.semver)) {
-      return false;
-    }
-  }
-  return true;
-}
-
-exports.prerelease = prerelease;
-function prerelease(version, loose) {
-  var parsed = parse(version, loose);
-  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null;
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/.npmignore
deleted file mode 100644
index c6f386f85f31808168a6ed3153f8d49a20cc64af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/.npmignore
+++ /dev/null
@@ -1,14 +0,0 @@
-lib-cov
-*.seed
-*.log
-*.csv
-*.dat
-*.out
-*.pid
-
-pids
-logs
-results
-
-npm-debug.log
-node_modules
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/.travis.yml
deleted file mode 100644
index cf5d63687de27c8de226081c4fd3648becf68a35..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/.travis.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-sudo: false
-language: node_js
-node_js:
-  - stable
-  - "0.10"
-  - "0.8"
-before_install: if [[ `npm --version` != 3* ]]; then npm install -g npm; fi;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/LICENSE
deleted file mode 100644
index 67b20da30893d601e720d4585f7c7d1d783e2d52..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/LICENSE
+++ /dev/null
@@ -1,23 +0,0 @@
-Copyright (c) 2014, Forbes Lindesay
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this
-  list of conditions and the following disclaimer.
-
-* Redistributions in binary form must reproduce the above copyright notice,
-  this list of conditions and the following disclaimer in the documentation
-  and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/README.md
deleted file mode 100644
index dab8dc99f5ae877ee008b3319e1ad75d6866d361..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/README.md
+++ /dev/null
@@ -1,81 +0,0 @@
-# Tar Pack
-
-Package and un-package modules of some sort (in tar/gz bundles).  This is mostly useful for package managers.  Note that it doesn't check for or touch `package.json` so it can be used even if that's not the way you store your package info.
-
-[![Build Status](https://img.shields.io/travis/ForbesLindesay/tar-pack/master.svg)](https://travis-ci.org/ForbesLindesay/tar-pack)
-[![Dependency Status](https://img.shields.io/david/ForbesLindesay/tar-pack.svg)](https://david-dm.org/ForbesLindesay/tar-pack)
-[![NPM version](https://img.shields.io/npm/v/tar-pack.svg)](https://www.npmjs.com/package/tar-pack)
-
-## Installation
-
-    $ npm install tar-pack
-
-## API
-
-### pack(folder|packer, [options])
-
-Pack the folder at `folder` into a gzipped tarball and return the tgz as a stream.  Files ignored by `.gitignore` will not be in the package.
-
-You can optionally pass a `fstream.DirReader` directly, instead of folder.  For example, to create an npm package, do:
-
-```js
-pack(require("fstream-npm")(folder), [options])
-```
-
-Options:
-
- - `noProprietary` (defaults to `false`) Set this to `true` to prevent any proprietary attributes being added to the tarball.  These attributes are allowed by the spec, but may trip up some poorly written tarball parsers.
- - `ignoreFiles` (defaults to `['.gitignore']`) These files can specify files to be excluded from the package using the syntax of `.gitignore`.  This option is ignored if you parse a `fstream.DirReader` instead of a string for folder.
- - `filter` (defaults to `entry => true`) A function that takes an entry and returns `true` if it should be included in the package and `false` if it should not.  Entryies are of the form `{path, basename, dirname, type}` where (type is "Directory" or "File").  This function is ignored if you parse a `fstream.DirReader` instead of a string for folder.
-
-Example:
-
-```js
-var write = require('fs').createWriteStream
-var pack = require('tar-pack').pack
-pack(process.cwd())
-  .pipe(write(__dirname + '/package.tar.gz'))
-  .on('error', function (err) {
-    console.error(err.stack)
-  })
-  .on('close', function () {
-    console.log('done')
-  })
-```
-
-### unpack(folder, [options,] cb)
-
-Return a stream that unpacks a tarball into a folder at `folder`.  N.B. the output folder will be removed first if it already exists.
-
-The callback is called with an optional error and, as its second argument, a string which is one of:
-
- - `'directory'`, indicating that the extracted package was a directory (either `.tar.gz` or `.tar`)
- - `'file'`, incating that the extracted package was just a single file (extracted to `defaultName`, see options)
-
-Basic Options:
-
- - `defaultName` (defaults to `index.js`) If the package is a single file, rather than a tarball, it will be "extracted" to this file name, set to `false` to disable.
-
-Advanced Options (you probably don't need any of these):
-
- - `gid` - (defaults to `null`) the `gid` to use when writing files
- - `uid` - (defaults to `null`) the `uid` to use when writing files
- - `dmode` - (defaults to `0777`) The mode to use when creating directories
- - `fmode` - (defaults to `0666`) The mode to use when creating files
- - `unsafe` - (defaults to `false`) (on non win32 OSes it overrides `gid` and `uid` with the current processes IDs)
-
-Example:
-
-```js
-var read = require('fs').createReadStream
-var unpack = require('tar-pack').unpack
-read(process.cwd() + '/package.tar.gz')
-  .pipe(unpack(__dirname + '/package/', function (err) {
-    if (err) console.error(err.stack)
-    else console.log('done')
-  }))
-```
-
-## License
-
-  BSD
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/index.js
deleted file mode 100644
index 8a1539ba172b2ea877c29ff3bc628e7305861610..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/index.js
+++ /dev/null
@@ -1,240 +0,0 @@
-"use strict"
-
-var debug = require('debug')('tar-pack')
-var uidNumber = require('uid-number')
-var rm = require('rimraf')
-var tar = require('tar')
-var once = require('once')
-var fstream = require('fstream')
-var packer = require('fstream-ignore')
-
-var PassThrough = require('stream').PassThrough || require('readable-stream').PassThrough
-var zlib = require('zlib')
-var path = require('path')
-
-var win32 = process.platform === 'win32'
-var myUid = process.getuid && process.getuid()
-var myGid = process.getgid && process.getgid()
-
-if (process.env.SUDO_UID && myUid === 0) {
-  if (!isNaN(process.env.SUDO_UID)) myUid = +process.env.SUDO_UID
-  if (!isNaN(process.env.SUDO_GID)) myGid = +process.env.SUDO_GID
-}
-
-exports.pack = pack
-exports.unpack = unpack
-
-function pack(folder, options) {
-  options = options || {}
-  if (typeof folder === 'string') {
-
-    var filter = options.filter || function (entry) { return true; }
-
-    folder = packer({
-      path: folder,
-      type: 'Directory',
-      isDirectory: true,
-      ignoreFiles: options.ignoreFiles || ['.gitignore'],
-      filter: function (entry) { // {path, basename, dirname, type} (type is "Directory" or "File")
-        var basename = entry.basename
-        // some files are *never* allowed under any circumstances
-        // these files should always be either temporary files or
-        // version control related files
-        if (basename === '.git' || basename === '.lock-wscript' || basename.match(/^\.wafpickle-[0-9]+$/) ||
-            basename === 'CVS' || basename === '.svn' || basename === '.hg' || basename.match(/^\..*\.swp$/) ||
-            basename === '.DS_Store' ||  basename.match(/^\._/)) {
-          return false
-        }
-        //custom excludes
-        return filter(entry)
-      }
-    })
-  }
-  // By default, npm includes some proprietary attributes in the
-  // package tarball.  This is sane, and allowed by the spec.
-  // However, npm *itself* excludes these from its own package,
-  // so that it can be more easily bootstrapped using old and
-  // non-compliant tar implementations.
-  var tarPack = tar.Pack({ noProprietary: options.noProprietary || false })
-  var gzip = zlib.Gzip()
-
-  folder
-    .on('error', function (er) {
-      if (er) debug('Error reading folder')
-      return gzip.emit('error', er)
-    })
-  tarPack
-    .on('error', function (er) {
-      if (er) debug('tar creation error')
-      gzip.emit('error', er)
-    })
-  return folder.pipe(tarPack).pipe(gzip)
-}
-
-function unpack(unpackTarget, options, cb) {
-  if (typeof options === 'function' && cb === undefined) cb = options, options = undefined
-
-  var tarball = new PassThrough()
-  if (typeof cb === 'function') {
-    cb = once(cb)
-    tarball.on('error', cb)
-    tarball.on('close', function () {
-      cb()
-    })
-  }
-
-  var parent = path.dirname(unpackTarget)
-  var base = path.basename(unpackTarget)
-
-  options = options || {}
-  var gid = options.gid || null
-  var uid = options.uid || null
-  var dMode = options.dmode || 0x0777 //npm.modes.exec
-  var fMode = options.fmode || 0x0666 //npm.modes.file
-  var defaultName = options.defaultName || (options.defaultName === false ? false : 'index.js')
-
-  // figure out who we're supposed to be, if we're not pretending
-  // to be a specific user.
-  if (options.unsafe && !win32) {
-    uid = myUid
-    gid = myGid
-  }
-
-  var pending = 2
-  uidNumber(uid, gid, function (er, uid, gid) {
-    if (er) {
-      tarball.emit('error', er)
-      return tarball.end()
-    }
-    if (0 === --pending) next()
-  })
-  rm(unpackTarget, function (er) {
-    if (er) {
-      tarball.emit('error', er)
-      return tarball.end()
-    }
-    if (0 === --pending) next()
-  })
-  function next() {
-    // gzip {tarball} --decompress --stdout \
-    //   | tar -mvxpf - --strip-components=1 -C {unpackTarget}
-    gunzTarPerm(tarball, unpackTarget, dMode, fMode, uid, gid, defaultName)
-  }
-  return tarball
-}
-
-
-function gunzTarPerm(tarball, target, dMode, fMode, uid, gid, defaultName) {
-  debug('modes %j', [dMode.toString(8), fMode.toString(8)])
-
-  function fixEntry(entry) {
-    debug('fixEntry %j', entry.path)
-    // never create things that are user-unreadable,
-    // or dirs that are user-un-listable. Only leads to headaches.
-    var originalMode = entry.mode = entry.mode || entry.props.mode
-    entry.mode = entry.mode | (entry.type === 'Directory' ? dMode : fMode)
-    entry.props.mode = entry.mode
-    if (originalMode !== entry.mode) {
-      debug('modified mode %j', [entry.path, originalMode, entry.mode])
-    }
-
-    // if there's a specific owner uid/gid that we want, then set that
-    if (!win32 &&  typeof uid === 'number' && typeof gid === 'number') {
-      entry.props.uid = entry.uid = uid
-      entry.props.gid = entry.gid = gid
-    }
-  }
-
-  var extractOpts = { type: 'Directory', path: target, strip: 1 }
-
-  if (!win32 && typeof uid === 'number' && typeof gid === 'number') {
-    extractOpts.uid = uid
-    extractOpts.gid = gid
-  }
-
-  extractOpts.filter = function () {
-    // symbolic links are not allowed in packages.
-    if (this.type.match(/^.*Link$/)) {
-      debug('excluding symbolic link: ' + this.path.substr(target.length + 1) + ' -> ' + this.linkpath)
-      return false
-    }
-    return true
-  }
-
-
-  type(tarball, function (err, type) {
-    if (err) return tarball.emit('error', err)
-    var strm = tarball
-    if (type === 'gzip') {
-      strm = strm.pipe(zlib.Unzip())
-      strm.on('error', function (er) {
-          if (er) debug('unzip error')
-          tarball.emit('error', er)
-        })
-      type = 'tar'
-    }
-    if (type === 'tar') {
-      strm
-        .pipe(tar.Extract(extractOpts))
-        .on('entry', fixEntry)
-        .on('error', function (er) {
-          if (er) debug('untar error')
-          tarball.emit('error', er)
-        })
-        .on('close', function () {
-          tarball.emit('close')
-        })
-      return
-    }
-    if (type === 'naked-file' && defaultName) {
-      var jsOpts = { path: path.resolve(target, defaultName) }
-
-      if (!win32 && typeof uid === 'number' && typeof gid === 'number') {
-        jsOpts.uid = uid
-        jsOpts.gid = gid
-      }
-
-      strm
-        .pipe(fstream.Writer(jsOpts))
-        .on('error', function (er) {
-          if (er) debug('copy error')
-          tarball.emit('error', er)
-        })
-        .on('close', function () {
-          tarball.emit('close')
-        })
-      return
-    }
-
-    return cb(new Error('Unrecognised package type'));
-  })
-}
-
-function type(stream, callback) {
-  stream.on('error', handle)
-  stream.on('data', parse)
-  function handle(err) {
-    stream.removeListener('data', parse)
-    stream.removeListener('error', handle)
-  }
-  function parse(chunk) {
-    // detect what it is.
-    // Then, depending on that, we'll figure out whether it's
-    // a single-file module, gzipped tarball, or naked tarball.
-
-    // gzipped files all start with 1f8b08
-    if (chunk[0] === 0x1F && chunk[1] === 0x8B && chunk[2] === 0x08) {
-      callback(null, 'gzip')
-    } else if (chunk.toString().match(/^package\/\u0000/)) {
-      // note, this will only pick up on tarballs with a root directory called package
-      callback(null, 'tar')
-    } else {
-      callback(null, 'naked-file')
-    }
-
-    // now un-hook, and re-emit the chunk
-    stream.removeListener('data', parse)
-    stream.removeListener('error', handle)
-    stream.unshift(chunk)
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/README.md
deleted file mode 100644
index 31170feae4e7d0859dff64e14fc5ad2615acf173..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/README.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# fstream-ignore
-
-A fstream DirReader that filters out files that match globs in `.ignore`
-files throughout the tree, like how git ignores files based on a
-`.gitignore` file.
-
-Here's an example:
-
-```javascript
-var Ignore = require("fstream-ignore")
-Ignore({ path: __dirname
-       , ignoreFiles: [".ignore", ".gitignore"]
-       })
-  .on("child", function (c) {
-    console.error(c.path.substr(c.root.path.length + 1))
-  })
-  .pipe(tar.Pack())
-  .pipe(fs.createWriteStream("foo.tar"))
-```
-
-This will tar up the files in __dirname into `foo.tar`, ignoring
-anything matched by the globs in any .iginore or .gitignore file.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/ignore.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/ignore.js
deleted file mode 100644
index 212fc7bdea9835379d79459886e5eacc89789e74..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/ignore.js
+++ /dev/null
@@ -1,275 +0,0 @@
-// Essentially, this is a fstream.DirReader class, but with a
-// bit of special logic to read the specified sort of ignore files,
-// and a filter that prevents it from picking up anything excluded
-// by those files.
-
-var Minimatch = require("minimatch").Minimatch
-, fstream = require("fstream")
-, DirReader = fstream.DirReader
-, inherits = require("inherits")
-, path = require("path")
-, fs = require("fs")
-
-module.exports = IgnoreReader
-
-inherits(IgnoreReader, DirReader)
-
-function IgnoreReader (props) {
-  if (!(this instanceof IgnoreReader)) {
-    return new IgnoreReader(props)
-  }
-
-  // must be a Directory type
-  if (typeof props === "string") {
-    props = { path: path.resolve(props) }
-  }
-
-  props.type = "Directory"
-  props.Directory = true
-
-  if (!props.ignoreFiles) props.ignoreFiles = [".ignore"]
-  this.ignoreFiles = props.ignoreFiles
-
-  this.ignoreRules = null
-
-  // ensure that .ignore files always show up at the top of the list
-  // that way, they can be read before proceeding to handle other
-  // entries in that same folder
-  if (props.sort) {
-    this._sort = props.sort === "alpha" ? alphasort : props.sort
-    props.sort = null
-  }
-
-  this.on("entries", function () {
-    // if there are any ignore files in the list, then
-    // pause and add them.
-    // then, filter the list based on our ignoreRules
-
-    var hasIg = this.entries.some(this.isIgnoreFile, this)
-
-    if (!hasIg) return this.filterEntries()
-
-    this.addIgnoreFiles()
-  })
-
-  // we filter entries before we know what they are.
-  // however, directories have to be re-tested against
-  // rules with a "/" appended, because "a/b/" will only
-  // match if "a/b" is a dir, and not otherwise.
-  this.on("_entryStat", function (entry, props) {
-    var t = entry.basename
-    if (!this.applyIgnores(entry.basename,
-                           entry.type === "Directory",
-                           entry)) {
-      entry.abort()
-    }
-  }.bind(this))
-
-  DirReader.call(this, props)
-}
-
-
-IgnoreReader.prototype.addIgnoreFiles = function () {
-  if (this._paused) {
-    this.once("resume", this.addIgnoreFiles)
-    return
-  }
-  if (this._ignoreFilesAdded) return
-  this._ignoreFilesAdded = true
-
-  var newIg = this.entries.filter(this.isIgnoreFile, this)
-  , count = newIg.length
-  , errState = null
-
-  if (!count) return
-
-  this.pause()
-
-  var then = function (er) {
-    if (errState) return
-    if (er) return this.emit("error", errState = er)
-    if (-- count === 0) {
-      this.filterEntries()
-      this.resume()
-    } else {
-      this.addIgnoreFile(newIg[newIg.length - count], then)
-    }
-  }.bind(this)
-
-  this.addIgnoreFile(newIg[0], then)
-}
-
-
-IgnoreReader.prototype.isIgnoreFile = function (e) {
-  return e !== "." &&
-         e !== ".." &&
-         -1 !== this.ignoreFiles.indexOf(e)
-}
-
-
-IgnoreReader.prototype.getChildProps = function (stat) {
-  var props = DirReader.prototype.getChildProps.call(this, stat)
-  props.ignoreFiles = this.ignoreFiles
-
-  // Directories have to be read as IgnoreReaders
-  // otherwise fstream.Reader will create a DirReader instead.
-  if (stat.isDirectory()) {
-    props.type = this.constructor
-  }
-  return props
-}
-
-
-IgnoreReader.prototype.addIgnoreFile = function (e, cb) {
-  // read the file, and then call addIgnoreRules
-  // if there's an error, then tell the cb about it.
-
-  var ig = path.resolve(this.path, e)
-  fs.readFile(ig, function (er, data) {
-    if (er) return cb(er)
-
-    this.emit("ignoreFile", e, data)
-    var rules = this.readRules(data, e)
-    this.addIgnoreRules(rules, e)
-    cb()
-  }.bind(this))
-}
-
-
-IgnoreReader.prototype.readRules = function (buf, e) {
-  return buf.toString().split(/\r?\n/)
-}
-
-
-// Override this to do fancier things, like read the
-// "files" array from a package.json file or something.
-IgnoreReader.prototype.addIgnoreRules = function (set, e) {
-  // filter out anything obvious
-  set = set.filter(function (s) {
-    s = s.trim()
-    return s && !s.match(/^#/)
-  })
-
-  // no rules to add!
-  if (!set.length) return
-
-  // now get a minimatch object for each one of these.
-  // Note that we need to allow dot files by default, and
-  // not switch the meaning of their exclusion
-  var mmopt = { matchBase: true, dot: true, flipNegate: true }
-  , mm = set.map(function (s) {
-    var m = new Minimatch(s, mmopt)
-    m.ignoreFile = e
-    return m
-  })
-
-  if (!this.ignoreRules) this.ignoreRules = []
-  this.ignoreRules.push.apply(this.ignoreRules, mm)
-}
-
-
-IgnoreReader.prototype.filterEntries = function () {
-  // this exclusion is at the point where we know the list of
-  // entries in the dir, but don't know what they are.  since
-  // some of them *might* be directories, we have to run the
-  // match in dir-mode as well, so that we'll pick up partials
-  // of files that will be included later.  Anything included
-  // at this point will be checked again later once we know
-  // what it is.
-  this.entries = this.entries.filter(function (entry) {
-    // at this point, we don't know if it's a dir or not.
-    return this.applyIgnores(entry) || this.applyIgnores(entry, true)
-  }, this)
-}
-
-
-IgnoreReader.prototype.applyIgnores = function (entry, partial, obj) {
-  var included = true
-
-  // this = /a/b/c
-  // entry = d
-  // parent /a/b sees c/d
-  if (this.parent && this.parent.applyIgnores) {
-    var pt = this.basename + "/" + entry
-    included = this.parent.applyIgnores(pt, partial)
-  }
-
-  // Negated Rules
-  // Since we're *ignoring* things here, negating means that a file
-  // is re-included, if it would have been excluded by a previous
-  // rule.  So, negated rules are only relevant if the file
-  // has been excluded.
-  //
-  // Similarly, if a file has been excluded, then there's no point
-  // trying it against rules that have already been applied
-  //
-  // We're using the "flipnegate" flag here, which tells minimatch
-  // to set the "negate" for our information, but still report
-  // whether the core pattern was a hit or a miss.
-
-  if (!this.ignoreRules) {
-    return included
-  }
-
-  this.ignoreRules.forEach(function (rule) {
-    // negation means inclusion
-    if (rule.negate && included ||
-        !rule.negate && !included) {
-      // unnecessary
-      return
-    }
-
-    // first, match against /foo/bar
-    var match = rule.match("/" + entry)
-
-    if (!match) {
-      // try with the leading / trimmed off the test
-      // eg: foo/bar instead of /foo/bar
-      match = rule.match(entry)
-    }
-
-    // if the entry is a directory, then it will match
-    // with a trailing slash. eg: /foo/bar/ or foo/bar/
-    if (!match && partial) {
-      match = rule.match("/" + entry + "/") ||
-              rule.match(entry + "/")
-    }
-
-    // When including a file with a negated rule, it's
-    // relevant if a directory partially matches, since
-    // it may then match a file within it.
-    // Eg, if you ignore /a, but !/a/b/c
-    if (!match && rule.negate && partial) {
-      match = rule.match("/" + entry, true) ||
-              rule.match(entry, true)
-    }
-
-    if (match) {
-      included = rule.negate
-    }
-  }, this)
-
-  return included
-}
-
-
-IgnoreReader.prototype.sort = function (a, b) {
-  var aig = this.ignoreFiles.indexOf(a) !== -1
-  , big = this.ignoreFiles.indexOf(b) !== -1
-
-  if (aig && !big) return -1
-  if (big && !aig) return 1
-  return this._sort(a, b)
-}
-
-IgnoreReader.prototype._sort = function (a, b) {
-  return 0
-}
-
-function alphasort (a, b) {
-  return a === b ? 0
-       : a.toLowerCase() > b.toLowerCase() ? 1
-       : a.toLowerCase() < b.toLowerCase() ? -1
-       : a > b ? 1
-       : -1
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/LICENSE
deleted file mode 100644
index dea3013d6710ee273f49ac606a65d5211d480c88..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/LICENSE
+++ /dev/null
@@ -1,16 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/README.md
deleted file mode 100644
index b1c56658557b8162aa9f5ba8610ed03a5e558d9d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-Browser-friendly inheritance fully compatible with standard node.js
-[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
-
-This package exports standard `inherits` from node.js `util` module in
-node environment, but also provides alternative browser-friendly
-implementation through [browser
-field](https://gist.github.com/shtylman/4339901). Alternative
-implementation is a literal copy of standard one located in standalone
-module to avoid requiring of `util`. It also has a shim for old
-browsers with no `Object.create` support.
-
-While keeping you sure you are using standard `inherits`
-implementation in node.js environment, it allows bundlers such as
-[browserify](https://github.com/substack/node-browserify) to not
-include full `util` package to your client code if all you need is
-just `inherits` function. It worth, because browser shim for `util`
-package is large and `inherits` is often the single function you need
-from it.
-
-It's recommended to use this package instead of
-`require('util').inherits` for any code that has chances to be used
-not only in node.js but in browser too.
-
-## usage
-
-```js
-var inherits = require('inherits');
-// then use exactly as the standard one
-```
-
-## note on version ~1.0
-
-Version ~1.0 had completely different motivation and is not compatible
-neither with 2.0 nor with standard node.js `inherits`.
-
-If you are using version ~1.0 and planning to switch to ~2.0, be
-careful:
-
-* new version uses `super_` instead of `super` for referencing
-  superclass
-* new version overwrites current prototype while old one preserves any
-  existing fields on it
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits.js
deleted file mode 100644
index 29f5e24f57b5aacb9f199dea05a57fcbf4918bc1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('util').inherits
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits_browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits_browser.js
deleted file mode 100644
index c1e78a75e6b52b7434e7e8aa0d64d8abd593763b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/inherits_browser.js
+++ /dev/null
@@ -1,23 +0,0 @@
-if (typeof Object.create === 'function') {
-  // implementation from standard node.js 'util' module
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    ctor.prototype = Object.create(superCtor.prototype, {
-      constructor: {
-        value: ctor,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-  };
-} else {
-  // old school shim for old browsers
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    var TempCtor = function () {}
-    TempCtor.prototype = superCtor.prototype
-    ctor.prototype = new TempCtor()
-    ctor.prototype.constructor = ctor
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/package.json
deleted file mode 100644
index 53f465fbcad2150821a8457d308914df0af453a7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "_from": "inherits@>=2.0.0 <3.0.0",
-  "_id": "inherits@2.0.1",
-  "_location": "/serialport/node-pre-gyp/tar-pack/fstream-ignore/inherits",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/fstream-ignore"
-  ],
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-  "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1",
-  "_shrinkwrap": null,
-  "browser": "./inherits_browser.js",
-  "bugs": {
-    "url": "https://github.com/isaacs/inherits/issues"
-  },
-  "dependencies": {},
-  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
-  "devDependencies": {},
-  "homepage": "https://github.com/isaacs/inherits#readme",
-  "keywords": [
-    "browser",
-    "browserify",
-    "class",
-    "inheritance",
-    "inherits",
-    "klass",
-    "object-oriented",
-    "oop"
-  ],
-  "license": "ISC",
-  "main": "./inherits.js",
-  "name": "inherits",
-  "optionalDependencies": {},
-  "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n  superclass\n* new version overwrites current prototype while old one preserves any\n  existing fields on it\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/inherits.git"
-  },
-  "scripts": {
-    "test": "node test"
-  },
-  "version": "2.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/test.js
deleted file mode 100644
index fc53012d31c0cde4f4bca408e7470e35a06f88fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/inherits/test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var inherits = require('./inherits.js')
-var assert = require('assert')
-
-function test(c) {
-  assert(c.constructor === Child)
-  assert(c.constructor.super_ === Parent)
-  assert(Object.getPrototypeOf(c) === Child.prototype)
-  assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype)
-  assert(c instanceof Child)
-  assert(c instanceof Parent)
-}
-
-function Child() {
-  Parent.call(this)
-  test(this)
-}
-
-function Parent() {}
-
-inherits(Child, Parent)
-
-var c = new Child
-test(c)
-
-console.log('ok')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/README.md
deleted file mode 100644
index ad72b8133eaf5e40329fa85dab2425f44cbf3aff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/README.md
+++ /dev/null
@@ -1,209 +0,0 @@
-# minimatch
-
-A minimal matching utility.
-
-[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.svg)](http://travis-ci.org/isaacs/minimatch)
-
-
-This is the matching library used internally by npm.
-
-It works by converting glob expressions into JavaScript `RegExp`
-objects.
-
-## Usage
-
-```javascript
-var minimatch = require("minimatch")
-
-minimatch("bar.foo", "*.foo") // true!
-minimatch("bar.foo", "*.bar") // false!
-minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
-```
-
-## Features
-
-Supports these glob features:
-
-* Brace Expansion
-* Extended glob matching
-* "Globstar" `**` matching
-
-See:
-
-* `man sh`
-* `man bash`
-* `man 3 fnmatch`
-* `man 5 gitignore`
-
-## Minimatch Class
-
-Create a minimatch object by instantiating the `minimatch.Minimatch` class.
-
-```javascript
-var Minimatch = require("minimatch").Minimatch
-var mm = new Minimatch(pattern, options)
-```
-
-### Properties
-
-* `pattern` The original pattern the minimatch object represents.
-* `options` The options supplied to the constructor.
-* `set` A 2-dimensional array of regexp or string expressions.
-  Each row in the
-  array corresponds to a brace-expanded pattern.  Each item in the row
-  corresponds to a single path-part.  For example, the pattern
-  `{a,b/c}/d` would expand to a set of patterns like:
-
-        [ [ a, d ]
-        , [ b, c, d ] ]
-
-    If a portion of the pattern doesn't have any "magic" in it
-    (that is, it's something like `"foo"` rather than `fo*o?`), then it
-    will be left as a string rather than converted to a regular
-    expression.
-
-* `regexp` Created by the `makeRe` method.  A single regular expression
-  expressing the entire pattern.  This is useful in cases where you wish
-  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
-* `negate` True if the pattern is negated.
-* `comment` True if the pattern is a comment.
-* `empty` True if the pattern is `""`.
-
-### Methods
-
-* `makeRe` Generate the `regexp` member if necessary, and return it.
-  Will return `false` if the pattern is invalid.
-* `match(fname)` Return true if the filename matches the pattern, or
-  false otherwise.
-* `matchOne(fileArray, patternArray, partial)` Take a `/`-split
-  filename, and match it against a single row in the `regExpSet`.  This
-  method is mainly for internal use, but is exposed so that it can be
-  used by a glob-walker that needs to avoid excessive filesystem calls.
-
-All other methods are internal, and will be called as necessary.
-
-### minimatch(path, pattern, options)
-
-Main export.  Tests a path against the pattern using the options.
-
-```javascript
-var isJS = minimatch(file, "*.js", { matchBase: true })
-```
-
-### minimatch.filter(pattern, options)
-
-Returns a function that tests its
-supplied argument, suitable for use with `Array.filter`.  Example:
-
-```javascript
-var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true}))
-```
-
-### minimatch.match(list, pattern, options)
-
-Match against the list of
-files, in the style of fnmatch or glob.  If nothing is matched, and
-options.nonull is set, then return a list containing the pattern itself.
-
-```javascript
-var javascripts = minimatch.match(fileList, "*.js", {matchBase: true}))
-```
-
-### minimatch.makeRe(pattern, options)
-
-Make a regular expression object from the pattern.
-
-## Options
-
-All options are `false` by default.
-
-### debug
-
-Dump a ton of stuff to stderr.
-
-### nobrace
-
-Do not expand `{a,b}` and `{1..3}` brace sets.
-
-### noglobstar
-
-Disable `**` matching against multiple folder names.
-
-### dot
-
-Allow patterns to match filenames starting with a period, even if
-the pattern does not explicitly have a period in that spot.
-
-Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
-is set.
-
-### noext
-
-Disable "extglob" style patterns like `+(a|b)`.
-
-### nocase
-
-Perform a case-insensitive match.
-
-### nonull
-
-When a match is not found by `minimatch.match`, return a list containing
-the pattern itself if this option is set.  When not set, an empty list
-is returned if there are no matches.
-
-### matchBase
-
-If set, then patterns without slashes will be matched
-against the basename of the path if it contains slashes.  For example,
-`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
-
-### nocomment
-
-Suppress the behavior of treating `#` at the start of a pattern as a
-comment.
-
-### nonegate
-
-Suppress the behavior of treating a leading `!` character as negation.
-
-### flipNegate
-
-Returns from negate expressions the same as if they were not negated.
-(Ie, true on a hit, false on a miss.)
-
-
-## Comparisons to other fnmatch/glob implementations
-
-While strict compliance with the existing standards is a worthwhile
-goal, some discrepancies exist between minimatch and other
-implementations, and are intentional.
-
-If the pattern starts with a `!` character, then it is negated.  Set the
-`nonegate` flag to suppress this behavior, and treat leading `!`
-characters normally.  This is perhaps relevant if you wish to start the
-pattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`
-characters at the start of a pattern will negate the pattern multiple
-times.
-
-If a pattern starts with `#`, then it is treated as a comment, and
-will not match anything.  Use `\#` to match a literal `#` at the
-start of a line, or set the `nocomment` flag to suppress this behavior.
-
-The double-star character `**` is supported by default, unless the
-`noglobstar` flag is set.  This is supported in the manner of bsdglob
-and bash 4.1, where `**` only has special significance if it is the only
-thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but
-`a/**b` will not.
-
-If an escaped pattern has no matches, and the `nonull` flag is set,
-then minimatch.match returns the pattern as-provided, rather than
-interpreting the character escapes.  For example,
-`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
-`"*a?"`.  This is akin to setting the `nullglob` option in bash, except
-that it does not resolve escaped pattern characters.
-
-If brace expansion is not disabled, then it is performed before any
-other interpretation of the glob pattern.  Thus, a pattern like
-`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
-**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
-checked for validity.  Since those two are valid, matching proceeds.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/minimatch.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/minimatch.js
deleted file mode 100644
index 830a27246cd6bdfad8437ee80421b54191549e2d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/minimatch.js
+++ /dev/null
@@ -1,924 +0,0 @@
-module.exports = minimatch
-minimatch.Minimatch = Minimatch
-
-var path = { sep: '/' }
-try {
-  path = require('path')
-} catch (er) {}
-
-var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
-var expand = require('brace-expansion')
-
-// any single thing other than /
-// don't need to escape / when using new RegExp()
-var qmark = '[^/]'
-
-// * => any number of characters
-var star = qmark + '*?'
-
-// ** when dots are allowed.  Anything goes, except .. and .
-// not (^ or / followed by one or two dots followed by $ or /),
-// followed by anything, any number of times.
-var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
-
-// not a ^ or / followed by a dot,
-// followed by anything, any number of times.
-var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
-
-// characters that need to be escaped in RegExp.
-var reSpecials = charSet('().*{}+?[]^$\\!')
-
-// "abc" -> { a:true, b:true, c:true }
-function charSet (s) {
-  return s.split('').reduce(function (set, c) {
-    set[c] = true
-    return set
-  }, {})
-}
-
-// normalizes slashes.
-var slashSplit = /\/+/
-
-minimatch.filter = filter
-function filter (pattern, options) {
-  options = options || {}
-  return function (p, i, list) {
-    return minimatch(p, pattern, options)
-  }
-}
-
-function ext (a, b) {
-  a = a || {}
-  b = b || {}
-  var t = {}
-  Object.keys(b).forEach(function (k) {
-    t[k] = b[k]
-  })
-  Object.keys(a).forEach(function (k) {
-    t[k] = a[k]
-  })
-  return t
-}
-
-minimatch.defaults = function (def) {
-  if (!def || !Object.keys(def).length) return minimatch
-
-  var orig = minimatch
-
-  var m = function minimatch (p, pattern, options) {
-    return orig.minimatch(p, pattern, ext(def, options))
-  }
-
-  m.Minimatch = function Minimatch (pattern, options) {
-    return new orig.Minimatch(pattern, ext(def, options))
-  }
-
-  return m
-}
-
-Minimatch.defaults = function (def) {
-  if (!def || !Object.keys(def).length) return Minimatch
-  return minimatch.defaults(def).Minimatch
-}
-
-function minimatch (p, pattern, options) {
-  if (typeof pattern !== 'string') {
-    throw new TypeError('glob pattern string required')
-  }
-
-  if (!options) options = {}
-
-  // shortcut: comments match nothing.
-  if (!options.nocomment && pattern.charAt(0) === '#') {
-    return false
-  }
-
-  // "" only matches ""
-  if (pattern.trim() === '') return p === ''
-
-  return new Minimatch(pattern, options).match(p)
-}
-
-function Minimatch (pattern, options) {
-  if (!(this instanceof Minimatch)) {
-    return new Minimatch(pattern, options)
-  }
-
-  if (typeof pattern !== 'string') {
-    throw new TypeError('glob pattern string required')
-  }
-
-  if (!options) options = {}
-  pattern = pattern.trim()
-
-  // windows support: need to use /, not \
-  if (path.sep !== '/') {
-    pattern = pattern.split(path.sep).join('/')
-  }
-
-  this.options = options
-  this.set = []
-  this.pattern = pattern
-  this.regexp = null
-  this.negate = false
-  this.comment = false
-  this.empty = false
-
-  // make the set of regexps etc.
-  this.make()
-}
-
-Minimatch.prototype.debug = function () {}
-
-Minimatch.prototype.make = make
-function make () {
-  // don't do it more than once.
-  if (this._made) return
-
-  var pattern = this.pattern
-  var options = this.options
-
-  // empty patterns and comments match nothing.
-  if (!options.nocomment && pattern.charAt(0) === '#') {
-    this.comment = true
-    return
-  }
-  if (!pattern) {
-    this.empty = true
-    return
-  }
-
-  // step 1: figure out negation, etc.
-  this.parseNegate()
-
-  // step 2: expand braces
-  var set = this.globSet = this.braceExpand()
-
-  if (options.debug) this.debug = console.error
-
-  this.debug(this.pattern, set)
-
-  // step 3: now we have a set, so turn each one into a series of path-portion
-  // matching patterns.
-  // These will be regexps, except in the case of "**", which is
-  // set to the GLOBSTAR object for globstar behavior,
-  // and will not contain any / characters
-  set = this.globParts = set.map(function (s) {
-    return s.split(slashSplit)
-  })
-
-  this.debug(this.pattern, set)
-
-  // glob --> regexps
-  set = set.map(function (s, si, set) {
-    return s.map(this.parse, this)
-  }, this)
-
-  this.debug(this.pattern, set)
-
-  // filter out everything that didn't compile properly.
-  set = set.filter(function (s) {
-    return s.indexOf(false) === -1
-  })
-
-  this.debug(this.pattern, set)
-
-  this.set = set
-}
-
-Minimatch.prototype.parseNegate = parseNegate
-function parseNegate () {
-  var pattern = this.pattern
-  var negate = false
-  var options = this.options
-  var negateOffset = 0
-
-  if (options.nonegate) return
-
-  for (var i = 0, l = pattern.length
-    ; i < l && pattern.charAt(i) === '!'
-    ; i++) {
-    negate = !negate
-    negateOffset++
-  }
-
-  if (negateOffset) this.pattern = pattern.substr(negateOffset)
-  this.negate = negate
-}
-
-// Brace expansion:
-// a{b,c}d -> abd acd
-// a{b,}c -> abc ac
-// a{0..3}d -> a0d a1d a2d a3d
-// a{b,c{d,e}f}g -> abg acdfg acefg
-// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
-//
-// Invalid sets are not expanded.
-// a{2..}b -> a{2..}b
-// a{b}c -> a{b}c
-minimatch.braceExpand = function (pattern, options) {
-  return braceExpand(pattern, options)
-}
-
-Minimatch.prototype.braceExpand = braceExpand
-
-function braceExpand (pattern, options) {
-  if (!options) {
-    if (this instanceof Minimatch) {
-      options = this.options
-    } else {
-      options = {}
-    }
-  }
-
-  pattern = typeof pattern === 'undefined'
-    ? this.pattern : pattern
-
-  if (typeof pattern === 'undefined') {
-    throw new TypeError('undefined pattern')
-  }
-
-  if (options.nobrace ||
-    !pattern.match(/\{.*\}/)) {
-    // shortcut. no need to expand.
-    return [pattern]
-  }
-
-  return expand(pattern)
-}
-
-// parse a component of the expanded set.
-// At this point, no pattern may contain "/" in it
-// so we're going to return a 2d array, where each entry is the full
-// pattern, split on '/', and then turned into a regular expression.
-// A regexp is made at the end which joins each array with an
-// escaped /, and another full one which joins each regexp with |.
-//
-// Following the lead of Bash 4.1, note that "**" only has special meaning
-// when it is the *only* thing in a path portion.  Otherwise, any series
-// of * is equivalent to a single *.  Globstar behavior is enabled by
-// default, and can be disabled by setting options.noglobstar.
-Minimatch.prototype.parse = parse
-var SUBPARSE = {}
-function parse (pattern, isSub) {
-  if (pattern.length > 1024 * 64) {
-    throw new TypeError('pattern is too long')
-  }
-
-  var options = this.options
-
-  // shortcuts
-  if (!options.noglobstar && pattern === '**') return GLOBSTAR
-  if (pattern === '') return ''
-
-  var re = ''
-  var hasMagic = !!options.nocase
-  var escaping = false
-  // ? => one single character
-  var patternListStack = []
-  var negativeLists = []
-  var plType
-  var stateChar
-  var inClass = false
-  var reClassStart = -1
-  var classStart = -1
-  // . and .. never match anything that doesn't start with .,
-  // even when options.dot is set.
-  var patternStart = pattern.charAt(0) === '.' ? '' // anything
-  // not (start or / followed by . or .. followed by / or end)
-  : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
-  : '(?!\\.)'
-  var self = this
-
-  function clearStateChar () {
-    if (stateChar) {
-      // we had some state-tracking character
-      // that wasn't consumed by this pass.
-      switch (stateChar) {
-        case '*':
-          re += star
-          hasMagic = true
-        break
-        case '?':
-          re += qmark
-          hasMagic = true
-        break
-        default:
-          re += '\\' + stateChar
-        break
-      }
-      self.debug('clearStateChar %j %j', stateChar, re)
-      stateChar = false
-    }
-  }
-
-  for (var i = 0, len = pattern.length, c
-    ; (i < len) && (c = pattern.charAt(i))
-    ; i++) {
-    this.debug('%s\t%s %s %j', pattern, i, re, c)
-
-    // skip over any that are escaped.
-    if (escaping && reSpecials[c]) {
-      re += '\\' + c
-      escaping = false
-      continue
-    }
-
-    switch (c) {
-      case '/':
-        // completely not allowed, even escaped.
-        // Should already be path-split by now.
-        return false
-
-      case '\\':
-        clearStateChar()
-        escaping = true
-      continue
-
-      // the various stateChar values
-      // for the "extglob" stuff.
-      case '?':
-      case '*':
-      case '+':
-      case '@':
-      case '!':
-        this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
-
-        // all of those are literals inside a class, except that
-        // the glob [!a] means [^a] in regexp
-        if (inClass) {
-          this.debug('  in class')
-          if (c === '!' && i === classStart + 1) c = '^'
-          re += c
-          continue
-        }
-
-        // if we already have a stateChar, then it means
-        // that there was something like ** or +? in there.
-        // Handle the stateChar, then proceed with this one.
-        self.debug('call clearStateChar %j', stateChar)
-        clearStateChar()
-        stateChar = c
-        // if extglob is disabled, then +(asdf|foo) isn't a thing.
-        // just clear the statechar *now*, rather than even diving into
-        // the patternList stuff.
-        if (options.noext) clearStateChar()
-      continue
-
-      case '(':
-        if (inClass) {
-          re += '('
-          continue
-        }
-
-        if (!stateChar) {
-          re += '\\('
-          continue
-        }
-
-        plType = stateChar
-        patternListStack.push({
-          type: plType,
-          start: i - 1,
-          reStart: re.length
-        })
-        // negation is (?:(?!js)[^/]*)
-        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
-        this.debug('plType %j %j', stateChar, re)
-        stateChar = false
-      continue
-
-      case ')':
-        if (inClass || !patternListStack.length) {
-          re += '\\)'
-          continue
-        }
-
-        clearStateChar()
-        hasMagic = true
-        re += ')'
-        var pl = patternListStack.pop()
-        plType = pl.type
-        // negation is (?:(?!js)[^/]*)
-        // The others are (?:<pattern>)<type>
-        switch (plType) {
-          case '!':
-            negativeLists.push(pl)
-            re += ')[^/]*?)'
-            pl.reEnd = re.length
-            break
-          case '?':
-          case '+':
-          case '*':
-            re += plType
-            break
-          case '@': break // the default anyway
-        }
-      continue
-
-      case '|':
-        if (inClass || !patternListStack.length || escaping) {
-          re += '\\|'
-          escaping = false
-          continue
-        }
-
-        clearStateChar()
-        re += '|'
-      continue
-
-      // these are mostly the same in regexp and glob
-      case '[':
-        // swallow any state-tracking char before the [
-        clearStateChar()
-
-        if (inClass) {
-          re += '\\' + c
-          continue
-        }
-
-        inClass = true
-        classStart = i
-        reClassStart = re.length
-        re += c
-      continue
-
-      case ']':
-        //  a right bracket shall lose its special
-        //  meaning and represent itself in
-        //  a bracket expression if it occurs
-        //  first in the list.  -- POSIX.2 2.8.3.2
-        if (i === classStart + 1 || !inClass) {
-          re += '\\' + c
-          escaping = false
-          continue
-        }
-
-        // handle the case where we left a class open.
-        // "[z-a]" is valid, equivalent to "\[z-a\]"
-        if (inClass) {
-          // split where the last [ was, make sure we don't have
-          // an invalid re. if so, re-walk the contents of the
-          // would-be class to re-translate any characters that
-          // were passed through as-is
-          // TODO: It would probably be faster to determine this
-          // without a try/catch and a new RegExp, but it's tricky
-          // to do safely.  For now, this is safe and works.
-          var cs = pattern.substring(classStart + 1, i)
-          try {
-            RegExp('[' + cs + ']')
-          } catch (er) {
-            // not a valid class!
-            var sp = this.parse(cs, SUBPARSE)
-            re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
-            hasMagic = hasMagic || sp[1]
-            inClass = false
-            continue
-          }
-        }
-
-        // finish up the class.
-        hasMagic = true
-        inClass = false
-        re += c
-      continue
-
-      default:
-        // swallow any state char that wasn't consumed
-        clearStateChar()
-
-        if (escaping) {
-          // no need
-          escaping = false
-        } else if (reSpecials[c]
-          && !(c === '^' && inClass)) {
-          re += '\\'
-        }
-
-        re += c
-
-    } // switch
-  } // for
-
-  // handle the case where we left a class open.
-  // "[abc" is valid, equivalent to "\[abc"
-  if (inClass) {
-    // split where the last [ was, and escape it
-    // this is a huge pita.  We now have to re-walk
-    // the contents of the would-be class to re-translate
-    // any characters that were passed through as-is
-    cs = pattern.substr(classStart + 1)
-    sp = this.parse(cs, SUBPARSE)
-    re = re.substr(0, reClassStart) + '\\[' + sp[0]
-    hasMagic = hasMagic || sp[1]
-  }
-
-  // handle the case where we had a +( thing at the *end*
-  // of the pattern.
-  // each pattern list stack adds 3 chars, and we need to go through
-  // and escape any | chars that were passed through as-is for the regexp.
-  // Go through and escape them, taking care not to double-escape any
-  // | chars that were already escaped.
-  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
-    var tail = re.slice(pl.reStart + 3)
-    // maybe some even number of \, then maybe 1 \, followed by a |
-    tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
-      if (!$2) {
-        // the | isn't already escaped, so escape it.
-        $2 = '\\'
-      }
-
-      // need to escape all those slashes *again*, without escaping the
-      // one that we need for escaping the | character.  As it works out,
-      // escaping an even number of slashes can be done by simply repeating
-      // it exactly after itself.  That's why this trick works.
-      //
-      // I am sorry that you have to see this.
-      return $1 + $1 + $2 + '|'
-    })
-
-    this.debug('tail=%j\n   %s', tail, tail)
-    var t = pl.type === '*' ? star
-      : pl.type === '?' ? qmark
-      : '\\' + pl.type
-
-    hasMagic = true
-    re = re.slice(0, pl.reStart) + t + '\\(' + tail
-  }
-
-  // handle trailing things that only matter at the very end.
-  clearStateChar()
-  if (escaping) {
-    // trailing \\
-    re += '\\\\'
-  }
-
-  // only need to apply the nodot start if the re starts with
-  // something that could conceivably capture a dot
-  var addPatternStart = false
-  switch (re.charAt(0)) {
-    case '.':
-    case '[':
-    case '(': addPatternStart = true
-  }
-
-  // Hack to work around lack of negative lookbehind in JS
-  // A pattern like: *.!(x).!(y|z) needs to ensure that a name
-  // like 'a.xyz.yz' doesn't match.  So, the first negative
-  // lookahead, has to look ALL the way ahead, to the end of
-  // the pattern.
-  for (var n = negativeLists.length - 1; n > -1; n--) {
-    var nl = negativeLists[n]
-
-    var nlBefore = re.slice(0, nl.reStart)
-    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
-    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
-    var nlAfter = re.slice(nl.reEnd)
-
-    nlLast += nlAfter
-
-    // Handle nested stuff like *(*.js|!(*.json)), where open parens
-    // mean that we should *not* include the ) in the bit that is considered
-    // "after" the negated section.
-    var openParensBefore = nlBefore.split('(').length - 1
-    var cleanAfter = nlAfter
-    for (i = 0; i < openParensBefore; i++) {
-      cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
-    }
-    nlAfter = cleanAfter
-
-    var dollar = ''
-    if (nlAfter === '' && isSub !== SUBPARSE) {
-      dollar = '$'
-    }
-    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
-    re = newRe
-  }
-
-  // if the re is not "" at this point, then we need to make sure
-  // it doesn't match against an empty path part.
-  // Otherwise a/* will match a/, which it should not.
-  if (re !== '' && hasMagic) {
-    re = '(?=.)' + re
-  }
-
-  if (addPatternStart) {
-    re = patternStart + re
-  }
-
-  // parsing just a piece of a larger pattern.
-  if (isSub === SUBPARSE) {
-    return [re, hasMagic]
-  }
-
-  // skip the regexp for non-magical patterns
-  // unescape anything in it, though, so that it'll be
-  // an exact match against a file etc.
-  if (!hasMagic) {
-    return globUnescape(pattern)
-  }
-
-  var flags = options.nocase ? 'i' : ''
-  try {
-    var regExp = new RegExp('^' + re + '$', flags)
-  } catch (er) {
-    // If it was an invalid regular expression, then it can't match
-    // anything.  This trick looks for a character after the end of
-    // the string, which is of course impossible, except in multi-line
-    // mode, but it's not a /m regex.
-    return new RegExp('$.')
-  }
-
-  regExp._glob = pattern
-  regExp._src = re
-
-  return regExp
-}
-
-minimatch.makeRe = function (pattern, options) {
-  return new Minimatch(pattern, options || {}).makeRe()
-}
-
-Minimatch.prototype.makeRe = makeRe
-function makeRe () {
-  if (this.regexp || this.regexp === false) return this.regexp
-
-  // at this point, this.set is a 2d array of partial
-  // pattern strings, or "**".
-  //
-  // It's better to use .match().  This function shouldn't
-  // be used, really, but it's pretty convenient sometimes,
-  // when you just want to work with a regex.
-  var set = this.set
-
-  if (!set.length) {
-    this.regexp = false
-    return this.regexp
-  }
-  var options = this.options
-
-  var twoStar = options.noglobstar ? star
-    : options.dot ? twoStarDot
-    : twoStarNoDot
-  var flags = options.nocase ? 'i' : ''
-
-  var re = set.map(function (pattern) {
-    return pattern.map(function (p) {
-      return (p === GLOBSTAR) ? twoStar
-      : (typeof p === 'string') ? regExpEscape(p)
-      : p._src
-    }).join('\\\/')
-  }).join('|')
-
-  // must match entire pattern
-  // ending in a * or ** will make it less strict.
-  re = '^(?:' + re + ')$'
-
-  // can match anything, as long as it's not this.
-  if (this.negate) re = '^(?!' + re + ').*$'
-
-  try {
-    this.regexp = new RegExp(re, flags)
-  } catch (ex) {
-    this.regexp = false
-  }
-  return this.regexp
-}
-
-minimatch.match = function (list, pattern, options) {
-  options = options || {}
-  var mm = new Minimatch(pattern, options)
-  list = list.filter(function (f) {
-    return mm.match(f)
-  })
-  if (mm.options.nonull && !list.length) {
-    list.push(pattern)
-  }
-  return list
-}
-
-Minimatch.prototype.match = match
-function match (f, partial) {
-  this.debug('match', f, this.pattern)
-  // short-circuit in the case of busted things.
-  // comments, etc.
-  if (this.comment) return false
-  if (this.empty) return f === ''
-
-  if (f === '/' && partial) return true
-
-  var options = this.options
-
-  // windows: need to use /, not \
-  if (path.sep !== '/') {
-    f = f.split(path.sep).join('/')
-  }
-
-  // treat the test path as a set of pathparts.
-  f = f.split(slashSplit)
-  this.debug(this.pattern, 'split', f)
-
-  // just ONE of the pattern sets in this.set needs to match
-  // in order for it to be valid.  If negating, then just one
-  // match means that we have failed.
-  // Either way, return on the first hit.
-
-  var set = this.set
-  this.debug(this.pattern, 'set', set)
-
-  // Find the basename of the path by looking for the last non-empty segment
-  var filename
-  var i
-  for (i = f.length - 1; i >= 0; i--) {
-    filename = f[i]
-    if (filename) break
-  }
-
-  for (i = 0; i < set.length; i++) {
-    var pattern = set[i]
-    var file = f
-    if (options.matchBase && pattern.length === 1) {
-      file = [filename]
-    }
-    var hit = this.matchOne(file, pattern, partial)
-    if (hit) {
-      if (options.flipNegate) return true
-      return !this.negate
-    }
-  }
-
-  // didn't get any hits.  this is success if it's a negative
-  // pattern, failure otherwise.
-  if (options.flipNegate) return false
-  return this.negate
-}
-
-// set partial to true to test if, for example,
-// "/a/b" matches the start of "/*/b/*/d"
-// Partial means, if you run out of file before you run
-// out of pattern, then that's fine, as long as all
-// the parts match.
-Minimatch.prototype.matchOne = function (file, pattern, partial) {
-  var options = this.options
-
-  this.debug('matchOne',
-    { 'this': this, file: file, pattern: pattern })
-
-  this.debug('matchOne', file.length, pattern.length)
-
-  for (var fi = 0,
-      pi = 0,
-      fl = file.length,
-      pl = pattern.length
-      ; (fi < fl) && (pi < pl)
-      ; fi++, pi++) {
-    this.debug('matchOne loop')
-    var p = pattern[pi]
-    var f = file[fi]
-
-    this.debug(pattern, p, f)
-
-    // should be impossible.
-    // some invalid regexp stuff in the set.
-    if (p === false) return false
-
-    if (p === GLOBSTAR) {
-      this.debug('GLOBSTAR', [pattern, p, f])
-
-      // "**"
-      // a/**/b/**/c would match the following:
-      // a/b/x/y/z/c
-      // a/x/y/z/b/c
-      // a/b/x/b/x/c
-      // a/b/c
-      // To do this, take the rest of the pattern after
-      // the **, and see if it would match the file remainder.
-      // If so, return success.
-      // If not, the ** "swallows" a segment, and try again.
-      // This is recursively awful.
-      //
-      // a/**/b/**/c matching a/b/x/y/z/c
-      // - a matches a
-      // - doublestar
-      //   - matchOne(b/x/y/z/c, b/**/c)
-      //     - b matches b
-      //     - doublestar
-      //       - matchOne(x/y/z/c, c) -> no
-      //       - matchOne(y/z/c, c) -> no
-      //       - matchOne(z/c, c) -> no
-      //       - matchOne(c, c) yes, hit
-      var fr = fi
-      var pr = pi + 1
-      if (pr === pl) {
-        this.debug('** at the end')
-        // a ** at the end will just swallow the rest.
-        // We have found a match.
-        // however, it will not swallow /.x, unless
-        // options.dot is set.
-        // . and .. are *never* matched by **, for explosively
-        // exponential reasons.
-        for (; fi < fl; fi++) {
-          if (file[fi] === '.' || file[fi] === '..' ||
-            (!options.dot && file[fi].charAt(0) === '.')) return false
-        }
-        return true
-      }
-
-      // ok, let's see if we can swallow whatever we can.
-      while (fr < fl) {
-        var swallowee = file[fr]
-
-        this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
-
-        // XXX remove this slice.  Just pass the start index.
-        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
-          this.debug('globstar found match!', fr, fl, swallowee)
-          // found a match.
-          return true
-        } else {
-          // can't swallow "." or ".." ever.
-          // can only swallow ".foo" when explicitly asked.
-          if (swallowee === '.' || swallowee === '..' ||
-            (!options.dot && swallowee.charAt(0) === '.')) {
-            this.debug('dot detected!', file, fr, pattern, pr)
-            break
-          }
-
-          // ** swallows a segment, and continue.
-          this.debug('globstar swallow a segment, and continue')
-          fr++
-        }
-      }
-
-      // no match was found.
-      // However, in partial mode, we can't say this is necessarily over.
-      // If there's more *pattern* left, then
-      if (partial) {
-        // ran out of file
-        this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
-        if (fr === fl) return true
-      }
-      return false
-    }
-
-    // something other than **
-    // non-magic patterns just have to match exactly
-    // patterns with magic have been turned into regexps.
-    var hit
-    if (typeof p === 'string') {
-      if (options.nocase) {
-        hit = f.toLowerCase() === p.toLowerCase()
-      } else {
-        hit = f === p
-      }
-      this.debug('string match', p, f, hit)
-    } else {
-      hit = f.match(p)
-      this.debug('pattern match', p, f, hit)
-    }
-
-    if (!hit) return false
-  }
-
-  // Note: ending in / means that we'll get a final ""
-  // at the end of the pattern.  This can only match a
-  // corresponding "" at the end of the file.
-  // If the file ends in /, then it can only match a
-  // a pattern that ends in /, unless the pattern just
-  // doesn't have any more for it. But, a/b/ should *not*
-  // match "a/b/*", even though "" matches against the
-  // [^/]*? pattern, except in partial mode, where it might
-  // simply not be reached yet.
-  // However, a/b/ should still satisfy a/*
-
-  // now either we fell off the end of the pattern, or we're done.
-  if (fi === fl && pi === pl) {
-    // ran out of pattern and filename at the same time.
-    // an exact hit!
-    return true
-  } else if (fi === fl) {
-    // ran out of file, but still had pattern left.
-    // this is ok if we're doing the match as part of
-    // a glob fs traversal.
-    return partial
-  } else if (pi === pl) {
-    // ran out of pattern, still have file left.
-    // this is only acceptable if we're on the very last
-    // empty segment of a file with a trailing slash.
-    // a/* should match a/b/
-    var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')
-    return emptyFileEnd
-  }
-
-  // should be unreachable.
-  throw new Error('wtf?')
-}
-
-// replace stuff like \* with *
-function globUnescape (s) {
-  return s.replace(/\\(.)/g, '$1')
-}
-
-function regExpEscape (s) {
-  return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/README.md
deleted file mode 100644
index 179392978d30fe42f7825cbc2ce49455bf2d0743..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/README.md
+++ /dev/null
@@ -1,122 +0,0 @@
-# brace-expansion
-
-[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), 
-as known from sh/bash, in JavaScript.
-
-[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion)
-[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)
-
-[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion)
-
-## Example
-
-```js
-var expand = require('brace-expansion');
-
-expand('file-{a,b,c}.jpg')
-// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
-
-expand('-v{,,}')
-// => ['-v', '-v', '-v']
-
-expand('file{0..2}.jpg')
-// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
-
-expand('file-{a..c}.jpg')
-// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
-
-expand('file{2..0}.jpg')
-// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
-
-expand('file{0..4..2}.jpg')
-// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
-
-expand('file-{a..e..2}.jpg')
-// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
-
-expand('file{00..10..5}.jpg')
-// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
-
-expand('{{A..C},{a..c}}')
-// => ['A', 'B', 'C', 'a', 'b', 'c']
-
-expand('ppp{,config,oe{,conf}}')
-// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
-```
-
-## API
-
-```js
-var expand = require('brace-expansion');
-```
-
-### var expanded = expand(str)
-
-Return an array of all possible and valid expansions of `str`. If none are
-found, `[str]` is returned.
-
-Valid expansions are:
-
-```js
-/^(.*,)+(.+)?$/
-// {a,b,...}
-```
-
-A comma seperated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
-
-```js
-/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
-// {x..y[..incr]}
-```
-
-A numeric sequence from `x` to `y` inclusive, with optional increment.
-If `x` or `y` start with a leading `0`, all the numbers will be padded
-to have equal length. Negative numbers and backwards iteration work too.
-
-```js
-/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
-// {x..y[..incr]}
-```
-
-An alphabetic sequence from `x` to `y` inclusive, with optional increment.
-`x` and `y` must be exactly one character, and if given, `incr` must be a
-number.
-
-For compatibility reasons, the string `${` is not eligible for brace expansion.
-
-## Installation
-
-With [npm](https://npmjs.org) do:
-
-```bash
-npm install brace-expansion
-```
-
-## Contributors
-
-- [Julian Gruber](https://github.com/juliangruber)
-- [Isaac Z. Schlueter](https://github.com/isaacs)
-
-## License
-
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/index.js
deleted file mode 100644
index 932718f92871731947b65be3641112d66dc4b413..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/index.js
+++ /dev/null
@@ -1,191 +0,0 @@
-var concatMap = require('concat-map');
-var balanced = require('balanced-match');
-
-module.exports = expandTop;
-
-var escSlash = '\0SLASH'+Math.random()+'\0';
-var escOpen = '\0OPEN'+Math.random()+'\0';
-var escClose = '\0CLOSE'+Math.random()+'\0';
-var escComma = '\0COMMA'+Math.random()+'\0';
-var escPeriod = '\0PERIOD'+Math.random()+'\0';
-
-function numeric(str) {
-  return parseInt(str, 10) == str
-    ? parseInt(str, 10)
-    : str.charCodeAt(0);
-}
-
-function escapeBraces(str) {
-  return str.split('\\\\').join(escSlash)
-            .split('\\{').join(escOpen)
-            .split('\\}').join(escClose)
-            .split('\\,').join(escComma)
-            .split('\\.').join(escPeriod);
-}
-
-function unescapeBraces(str) {
-  return str.split(escSlash).join('\\')
-            .split(escOpen).join('{')
-            .split(escClose).join('}')
-            .split(escComma).join(',')
-            .split(escPeriod).join('.');
-}
-
-
-// Basically just str.split(","), but handling cases
-// where we have nested braced sections, which should be
-// treated as individual members, like {a,{b,c},d}
-function parseCommaParts(str) {
-  if (!str)
-    return [''];
-
-  var parts = [];
-  var m = balanced('{', '}', str);
-
-  if (!m)
-    return str.split(',');
-
-  var pre = m.pre;
-  var body = m.body;
-  var post = m.post;
-  var p = pre.split(',');
-
-  p[p.length-1] += '{' + body + '}';
-  var postParts = parseCommaParts(post);
-  if (post.length) {
-    p[p.length-1] += postParts.shift();
-    p.push.apply(p, postParts);
-  }
-
-  parts.push.apply(parts, p);
-
-  return parts;
-}
-
-function expandTop(str) {
-  if (!str)
-    return [];
-
-  return expand(escapeBraces(str), true).map(unescapeBraces);
-}
-
-function identity(e) {
-  return e;
-}
-
-function embrace(str) {
-  return '{' + str + '}';
-}
-function isPadded(el) {
-  return /^-?0\d/.test(el);
-}
-
-function lte(i, y) {
-  return i <= y;
-}
-function gte(i, y) {
-  return i >= y;
-}
-
-function expand(str, isTop) {
-  var expansions = [];
-
-  var m = balanced('{', '}', str);
-  if (!m || /\$$/.test(m.pre)) return [str];
-
-  var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
-  var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
-  var isSequence = isNumericSequence || isAlphaSequence;
-  var isOptions = /^(.*,)+(.+)?$/.test(m.body);
-  if (!isSequence && !isOptions) {
-    // {a},b}
-    if (m.post.match(/,.*\}/)) {
-      str = m.pre + '{' + m.body + escClose + m.post;
-      return expand(str);
-    }
-    return [str];
-  }
-
-  var n;
-  if (isSequence) {
-    n = m.body.split(/\.\./);
-  } else {
-    n = parseCommaParts(m.body);
-    if (n.length === 1) {
-      // x{{a,b}}y ==> x{a}y x{b}y
-      n = expand(n[0], false).map(embrace);
-      if (n.length === 1) {
-        var post = m.post.length
-          ? expand(m.post, false)
-          : [''];
-        return post.map(function(p) {
-          return m.pre + n[0] + p;
-        });
-      }
-    }
-  }
-
-  // at this point, n is the parts, and we know it's not a comma set
-  // with a single entry.
-
-  // no need to expand pre, since it is guaranteed to be free of brace-sets
-  var pre = m.pre;
-  var post = m.post.length
-    ? expand(m.post, false)
-    : [''];
-
-  var N;
-
-  if (isSequence) {
-    var x = numeric(n[0]);
-    var y = numeric(n[1]);
-    var width = Math.max(n[0].length, n[1].length)
-    var incr = n.length == 3
-      ? Math.abs(numeric(n[2]))
-      : 1;
-    var test = lte;
-    var reverse = y < x;
-    if (reverse) {
-      incr *= -1;
-      test = gte;
-    }
-    var pad = n.some(isPadded);
-
-    N = [];
-
-    for (var i = x; test(i, y); i += incr) {
-      var c;
-      if (isAlphaSequence) {
-        c = String.fromCharCode(i);
-        if (c === '\\')
-          c = '';
-      } else {
-        c = String(i);
-        if (pad) {
-          var need = width - c.length;
-          if (need > 0) {
-            var z = new Array(need + 1).join('0');
-            if (i < 0)
-              c = '-' + z + c.slice(1);
-            else
-              c = z + c;
-          }
-        }
-      }
-      N.push(c);
-    }
-  } else {
-    N = concatMap(n, function(el) { return expand(el, false) });
-  }
-
-  for (var j = 0; j < N.length; j++) {
-    for (var k = 0; k < post.length; k++) {
-      var expansion = pre + N[j] + post[k];
-      if (!isTop || isSequence || expansion)
-        expansions.push(expansion);
-    }
-  }
-
-  return expansions;
-}
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore
deleted file mode 100644
index ae5d8c36ac6522065cc0df746b8d61c947fb76e0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-test
-.gitignore
-.travis.yml
-Makefile
-example.js
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/LICENSE.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/LICENSE.md
deleted file mode 100644
index 2cdc8e4148cc0aa1f788b25dbec4b22878644cdf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/LICENSE.md
+++ /dev/null
@@ -1,21 +0,0 @@
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md
deleted file mode 100644
index d6880b2f36e72ba16479f9500181e84bb6a58d5c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md
+++ /dev/null
@@ -1,91 +0,0 @@
-# balanced-match
-
-Match balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!
-
-[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match)
-[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match)
-
-[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match)
-
-## Example
-
-Get the first matching pair of braces:
-
-```js
-var balanced = require('balanced-match');
-
-console.log(balanced('{', '}', 'pre{in{nested}}post'));
-console.log(balanced('{', '}', 'pre{first}between{second}post'));
-console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre  {   in{nest}   }  post'));
-```
-
-The matches are:
-
-```bash
-$ node example.js
-{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
-{ start: 3,
-  end: 9,
-  pre: 'pre',
-  body: 'first',
-  post: 'between{second}post' }
-{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }
-```
-
-## API
-
-### var m = balanced(a, b, str)
-
-For the first non-nested matching pair of `a` and `b` in `str`, return an
-object with those keys:
-
-* **start** the index of the first match of `a`
-* **end** the index of the matching `b`
-* **pre** the preamble, `a` and `b` not included
-* **body** the match, `a` and `b` not included
-* **post** the postscript, `a` and `b` not included
-
-If there's no match, `undefined` will be returned.
-
-If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']`.
-
-### var r = balanced.range(a, b, str)
-
-For the first non-nested matching pair of `a` and `b` in `str`, return an
-array with indexes: `[ <a index>, <b index> ]`.
-
-If there's no match, `undefined` will be returned.
-
-If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]`.
-
-## Installation
-
-With [npm](https://npmjs.org) do:
-
-```bash
-npm install balanced-match
-```
-
-## License
-
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js
deleted file mode 100644
index 4670f7f79f4d2ae4d8f4e4115b90e9f9547e9a33..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js
+++ /dev/null
@@ -1,58 +0,0 @@
-module.exports = balanced;
-function balanced(a, b, str) {
-  if (a instanceof RegExp) a = maybeMatch(a, str);
-  if (b instanceof RegExp) b = maybeMatch(b, str);
-
-  var r = range(a, b, str);
-
-  return r && {
-    start: r[0],
-    end: r[1],
-    pre: str.slice(0, r[0]),
-    body: str.slice(r[0] + a.length, r[1]),
-    post: str.slice(r[1] + b.length)
-  };
-}
-
-function maybeMatch(reg, str) {
-  var m = str.match(reg);
-  return m ? m[0] : null;
-}
-
-balanced.range = range;
-function range(a, b, str) {
-  var begs, beg, left, right, result;
-  var ai = str.indexOf(a);
-  var bi = str.indexOf(b, ai + 1);
-  var i = ai;
-
-  if (ai >= 0 && bi > 0) {
-    begs = [];
-    left = str.length;
-
-    while (i < str.length && i >= 0 && ! result) {
-      if (i == ai) {
-        begs.push(i);
-        ai = str.indexOf(a, i + 1);
-      } else if (begs.length == 1) {
-        result = [ begs.pop(), bi ];
-      } else {
-        beg = begs.pop();
-        if (beg < left) {
-          left = beg;
-          right = bi;
-        }
-
-        bi = str.indexOf(b, i + 1);
-      }
-
-      i = ai < bi && ai >= 0 ? ai : bi;
-    }
-
-    if (begs.length) {
-      result = [ left, right ];
-    }
-  }
-
-  return result;
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json
deleted file mode 100644
index 18f774d4fd3910b772330c41c055acd20488b4a7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json
+++ /dev/null
@@ -1,63 +0,0 @@
-{
-  "_from": "balanced-match@>=0.4.1 <0.5.0",
-  "_id": "balanced-match@0.4.1",
-  "_location": "/serialport/node-pre-gyp/tar-pack/fstream-ignore/minimatch/brace-expansion/balanced-match",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/fstream-ignore/minimatch/brace-expansion"
-  ],
-  "_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.1.tgz",
-  "_shasum": "19053e2e0748eadb379da6c09d455cf5e1039335",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@juliangruber.com",
-    "name": "Julian Gruber",
-    "url": "http://juliangruber.com"
-  },
-  "bugs": {
-    "url": "https://github.com/juliangruber/balanced-match/issues"
-  },
-  "dependencies": {},
-  "description": "Match balanced character pairs, like \"{\" and \"}\"",
-  "devDependencies": {
-    "tape": "~4.5.0"
-  },
-  "homepage": "https://github.com/juliangruber/balanced-match",
-  "keywords": [
-    "balanced",
-    "match",
-    "parse",
-    "regexp",
-    "test"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "balanced-match",
-  "optionalDependencies": {},
-  "readme": "# balanced-match\n\nMatch balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!\n\n[![build status](https://secure.travis-ci.org/juliangruber/balanced-match.svg)](http://travis-ci.org/juliangruber/balanced-match)\n[![downloads](https://img.shields.io/npm/dm/balanced-match.svg)](https://www.npmjs.org/package/balanced-match)\n\n[![testling badge](https://ci.testling.com/juliangruber/balanced-match.png)](https://ci.testling.com/juliangruber/balanced-match)\n\n## Example\n\nGet the first matching pair of braces:\n\n```js\nvar balanced = require('balanced-match');\n\nconsole.log(balanced('{', '}', 'pre{in{nested}}post'));\nconsole.log(balanced('{', '}', 'pre{first}between{second}post'));\nconsole.log(balanced(/\\s+\\{\\s+/, /\\s+\\}\\s+/, 'pre  {   in{nest}   }  post'));\n```\n\nThe matches are:\n\n```bash\n$ node example.js\n{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }\n{ start: 3,\n  end: 9,\n  pre: 'pre',\n  body: 'first',\n  post: 'between{second}post' }\n{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }\n```\n\n## API\n\n### var m = balanced(a, b, str)\n\nFor the first non-nested matching pair of `a` and `b` in `str`, return an\nobject with those keys:\n\n* **start** the index of the first match of `a`\n* **end** the index of the matching `b`\n* **pre** the preamble, `a` and `b` not included\n* **body** the match, `a` and `b` not included\n* **post** the postscript, `a` and `b` not included\n\nIf there's no match, `undefined` will be returned.\n\nIf the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']`.\n\n### var r = balanced.range(a, b, str)\n\nFor the first non-nested matching pair of `a` and `b` in `str`, return an\narray with indexes: `[ <a index>, <b index> ]`.\n\nIf there's no match, `undefined` will be returned.\n\nIf the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]`.\n\n## Installation\n\nWith [npm](https://npmjs.org) do:\n\n```bash\nnpm install balanced-match\n```\n\n## License\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/balanced-match.git"
-  },
-  "scripts": {
-    "test": "make test"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2..latest",
-      "chrome/25..latest",
-      "chrome/canary",
-      "firefox/20..latest",
-      "firefox/nightly",
-      "ie/8..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest"
-    ],
-    "files": "test/*.js"
-  },
-  "version": "0.4.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml
deleted file mode 100644
index f1d0f13c8a54d0f8d78f86a1f9348f3c59750694..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - 0.4
-  - 0.6
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE
deleted file mode 100644
index ee27ba4b4412b0e4a05af5e3d8a005bc6681fdf3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-This software is released under the MIT license:
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
-the Software, and to permit persons to whom the Software is furnished to do so,
-subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown
deleted file mode 100644
index 408f70a1be473c86e729fe8cc1d5fb4e0e364ce9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown
+++ /dev/null
@@ -1,62 +0,0 @@
-concat-map
-==========
-
-Concatenative mapdashery.
-
-[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)
-
-[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)
-
-example
-=======
-
-``` js
-var concatMap = require('concat-map');
-var xs = [ 1, 2, 3, 4, 5, 6 ];
-var ys = concatMap(xs, function (x) {
-    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-});
-console.dir(ys);
-```
-
-***
-
-```
-[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
-```
-
-methods
-=======
-
-``` js
-var concatMap = require('concat-map')
-```
-
-concatMap(xs, fn)
------------------
-
-Return an array of concatenated elements by calling `fn(x, i)` for each element
-`x` and each index `i` in the array `xs`.
-
-When `fn(x, i)` returns an array, its result will be concatenated with the
-result array. If `fn(x, i)` returns anything else, that value will be pushed
-onto the end of the result array.
-
-install
-=======
-
-With [npm](http://npmjs.org) do:
-
-```
-npm install concat-map
-```
-
-license
-=======
-
-MIT
-
-notes
-=====
-
-This module was written while sitting high above the ground in a tree.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js
deleted file mode 100644
index 33656217b61d8f06a55db4631ec95eea828495d2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js
+++ /dev/null
@@ -1,6 +0,0 @@
-var concatMap = require('../');
-var xs = [ 1, 2, 3, 4, 5, 6 ];
-var ys = concatMap(xs, function (x) {
-    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-});
-console.dir(ys);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js
deleted file mode 100644
index b29a7812e5055ae915e771447e1380e01bf3bfdd..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js
+++ /dev/null
@@ -1,13 +0,0 @@
-module.exports = function (xs, fn) {
-    var res = [];
-    for (var i = 0; i < xs.length; i++) {
-        var x = fn(xs[i], i);
-        if (isArray(x)) res.push.apply(res, x);
-        else res.push(x);
-    }
-    return res;
-};
-
-var isArray = Array.isArray || function (xs) {
-    return Object.prototype.toString.call(xs) === '[object Array]';
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json
deleted file mode 100644
index 055f5d521a53c0951dfe514f8c68971630f93e94..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
-  "_from": "concat-map@0.0.1",
-  "_id": "concat-map@0.0.1",
-  "_location": "/serialport/node-pre-gyp/tar-pack/fstream-ignore/minimatch/brace-expansion/concat-map",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/fstream-ignore/minimatch/brace-expansion"
-  ],
-  "_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-  "_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@substack.net",
-    "name": "James Halliday",
-    "url": "http://substack.net"
-  },
-  "bugs": {
-    "url": "https://github.com/substack/node-concat-map/issues"
-  },
-  "dependencies": {},
-  "description": "concatenative mapdashery",
-  "devDependencies": {
-    "tape": "~2.4.0"
-  },
-  "directories": {
-    "example": "example",
-    "test": "test"
-  },
-  "homepage": "https://github.com/substack/node-concat-map#readme",
-  "keywords": [
-    "concat",
-    "concatMap",
-    "functional",
-    "higher-order",
-    "map"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "concat-map",
-  "optionalDependencies": {},
-  "readme": "concat-map\n==========\n\nConcatenative mapdashery.\n\n[![browser support](http://ci.testling.com/substack/node-concat-map.png)](http://ci.testling.com/substack/node-concat-map)\n\n[![build status](https://secure.travis-ci.org/substack/node-concat-map.png)](http://travis-ci.org/substack/node-concat-map)\n\nexample\n=======\n\n``` js\nvar concatMap = require('concat-map');\nvar xs = [ 1, 2, 3, 4, 5, 6 ];\nvar ys = concatMap(xs, function (x) {\n    return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];\n});\nconsole.dir(ys);\n```\n\n***\n\n```\n[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]\n```\n\nmethods\n=======\n\n``` js\nvar concatMap = require('concat-map')\n```\n\nconcatMap(xs, fn)\n-----------------\n\nReturn an array of concatenated elements by calling `fn(x, i)` for each element\n`x` and each index `i` in the array `xs`.\n\nWhen `fn(x, i)` returns an array, its result will be concatenated with the\nresult array. If `fn(x, i)` returns anything else, that value will be pushed\nonto the end of the result array.\n\ninstall\n=======\n\nWith [npm](http://npmjs.org) do:\n\n```\nnpm install concat-map\n```\n\nlicense\n=======\n\nMIT\n\nnotes\n=====\n\nThis module was written while sitting high above the ground in a tree.\n",
-  "readmeFilename": "README.markdown",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/substack/node-concat-map.git"
-  },
-  "scripts": {
-    "test": "tape test/*.js"
-  },
-  "testling": {
-    "browsers": {
-      "chrome": [
-        10,
-        22
-      ],
-      "ff": [
-        10,
-        15,
-        3.5
-      ],
-      "ie": [
-        6,
-        7,
-        8,
-        9
-      ],
-      "opera": [
-        12
-      ],
-      "safari": [
-        5.1
-      ]
-    },
-    "files": "test/*.js"
-  },
-  "version": "0.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js
deleted file mode 100644
index fdbd7022f6da17600dad4d477734115bf28287e0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js
+++ /dev/null
@@ -1,39 +0,0 @@
-var concatMap = require('../');
-var test = require('tape');
-
-test('empty or not', function (t) {
-    var xs = [ 1, 2, 3, 4, 5, 6 ];
-    var ixes = [];
-    var ys = concatMap(xs, function (x, ix) {
-        ixes.push(ix);
-        return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
-    });
-    t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]);
-    t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]);
-    t.end();
-});
-
-test('always something', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function (x) {
-        return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ];
-    });
-    t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
-    t.end();
-});
-
-test('scalars', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function (x) {
-        return x === 'b' ? [ 'B', 'B', 'B' ] : x;
-    });
-    t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
-    t.end();
-});
-
-test('undefs', function (t) {
-    var xs = [ 'a', 'b', 'c', 'd' ];
-    var ys = concatMap(xs, function () {});
-    t.same(ys, [ undefined, undefined, undefined, undefined ]);
-    t.end();
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/package.json
deleted file mode 100644
index d3ef0d7cdad57cb801963adbf3df04f22060cdb3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/node_modules/brace-expansion/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "_from": "brace-expansion@>=1.0.0 <2.0.0",
-  "_id": "brace-expansion@1.1.5",
-  "_location": "/serialport/node-pre-gyp/tar-pack/fstream-ignore/minimatch/brace-expansion",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/fstream-ignore/minimatch"
-  ],
-  "_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.5.tgz",
-  "_shasum": "f5b4ad574e2cb7ccc1eb83e6fe79b8ecadf7a526",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@juliangruber.com",
-    "name": "Julian Gruber",
-    "url": "http://juliangruber.com"
-  },
-  "bugs": {
-    "url": "https://github.com/juliangruber/brace-expansion/issues"
-  },
-  "dependencies": {
-    "balanced-match": "^0.4.1",
-    "concat-map": "0.0.1"
-  },
-  "description": "Brace expansion as known from sh/bash",
-  "devDependencies": {
-    "tape": "4.5.1"
-  },
-  "homepage": "https://github.com/juliangruber/brace-expansion",
-  "keywords": [],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "brace-expansion",
-  "optionalDependencies": {},
-  "readme": "# brace-expansion\n\n[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html), \nas known from sh/bash, in JavaScript.\n\n[![build status](https://secure.travis-ci.org/juliangruber/brace-expansion.svg)](http://travis-ci.org/juliangruber/brace-expansion)\n[![downloads](https://img.shields.io/npm/dm/brace-expansion.svg)](https://www.npmjs.org/package/brace-expansion)\n\n[![testling badge](https://ci.testling.com/juliangruber/brace-expansion.png)](https://ci.testling.com/juliangruber/brace-expansion)\n\n## Example\n\n```js\nvar expand = require('brace-expansion');\n\nexpand('file-{a,b,c}.jpg')\n// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']\n\nexpand('-v{,,}')\n// => ['-v', '-v', '-v']\n\nexpand('file{0..2}.jpg')\n// => ['file0.jpg', 'file1.jpg', 'file2.jpg']\n\nexpand('file-{a..c}.jpg')\n// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']\n\nexpand('file{2..0}.jpg')\n// => ['file2.jpg', 'file1.jpg', 'file0.jpg']\n\nexpand('file{0..4..2}.jpg')\n// => ['file0.jpg', 'file2.jpg', 'file4.jpg']\n\nexpand('file-{a..e..2}.jpg')\n// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']\n\nexpand('file{00..10..5}.jpg')\n// => ['file00.jpg', 'file05.jpg', 'file10.jpg']\n\nexpand('{{A..C},{a..c}}')\n// => ['A', 'B', 'C', 'a', 'b', 'c']\n\nexpand('ppp{,config,oe{,conf}}')\n// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']\n```\n\n## API\n\n```js\nvar expand = require('brace-expansion');\n```\n\n### var expanded = expand(str)\n\nReturn an array of all possible and valid expansions of `str`. If none are\nfound, `[str]` is returned.\n\nValid expansions are:\n\n```js\n/^(.*,)+(.+)?$/\n// {a,b,...}\n```\n\nA comma seperated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.\n\n```js\n/^-?\\d+\\.\\.-?\\d+(\\.\\.-?\\d+)?$/\n// {x..y[..incr]}\n```\n\nA numeric sequence from `x` to `y` inclusive, with optional increment.\nIf `x` or `y` start with a leading `0`, all the numbers will be padded\nto have equal length. Negative numbers and backwards iteration work too.\n\n```js\n/^-?\\d+\\.\\.-?\\d+(\\.\\.-?\\d+)?$/\n// {x..y[..incr]}\n```\n\nAn alphabetic sequence from `x` to `y` inclusive, with optional increment.\n`x` and `y` must be exactly one character, and if given, `incr` must be a\nnumber.\n\nFor compatibility reasons, the string `${` is not eligible for brace expansion.\n\n## Installation\n\nWith [npm](https://npmjs.org) do:\n\n```bash\nnpm install brace-expansion\n```\n\n## Contributors\n\n- [Julian Gruber](https://github.com/juliangruber)\n- [Isaac Z. Schlueter](https://github.com/isaacs)\n\n## License\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/brace-expansion.git"
-  },
-  "scripts": {
-    "gentest": "bash test/generate.sh",
-    "test": "tape test/*.js"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2..latest",
-      "chrome/25..latest",
-      "chrome/canary",
-      "firefox/20..latest",
-      "firefox/nightly",
-      "ie/8..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest"
-    ],
-    "files": "test/*.js"
-  },
-  "version": "1.1.5"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/package.json
deleted file mode 100644
index ebf0f8d55386bb2a3d4ea82ceae0d824ea580793..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/node_modules/minimatch/package.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
-  "_from": "minimatch@>=3.0.0 <4.0.0",
-  "_id": "minimatch@3.0.2",
-  "_location": "/serialport/node-pre-gyp/tar-pack/fstream-ignore/minimatch",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/fstream-ignore"
-  ],
-  "_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.2.tgz",
-  "_shasum": "0f398a7300ea441e9c348c83d98ab8c9dbf9c40a",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/minimatch/issues"
-  },
-  "dependencies": {
-    "brace-expansion": "^1.0.0"
-  },
-  "description": "a glob matcher in javascript",
-  "devDependencies": {
-    "standard": "^3.7.2",
-    "tap": "^5.6.0"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "files": [
-    "minimatch.js"
-  ],
-  "homepage": "https://github.com/isaacs/minimatch#readme",
-  "license": "ISC",
-  "main": "minimatch.js",
-  "name": "minimatch",
-  "optionalDependencies": {},
-  "readme": "# minimatch\n\nA minimal matching utility.\n\n[![Build Status](https://secure.travis-ci.org/isaacs/minimatch.svg)](http://travis-ci.org/isaacs/minimatch)\n\n\nThis is the matching library used internally by npm.\n\nIt works by converting glob expressions into JavaScript `RegExp`\nobjects.\n\n## Usage\n\n```javascript\nvar minimatch = require(\"minimatch\")\n\nminimatch(\"bar.foo\", \"*.foo\") // true!\nminimatch(\"bar.foo\", \"*.bar\") // false!\nminimatch(\"bar.foo\", \"*.+(bar|foo)\", { debug: true }) // true, and noisy!\n```\n\n## Features\n\nSupports these glob features:\n\n* Brace Expansion\n* Extended glob matching\n* \"Globstar\" `**` matching\n\nSee:\n\n* `man sh`\n* `man bash`\n* `man 3 fnmatch`\n* `man 5 gitignore`\n\n## Minimatch Class\n\nCreate a minimatch object by instantiating the `minimatch.Minimatch` class.\n\n```javascript\nvar Minimatch = require(\"minimatch\").Minimatch\nvar mm = new Minimatch(pattern, options)\n```\n\n### Properties\n\n* `pattern` The original pattern the minimatch object represents.\n* `options` The options supplied to the constructor.\n* `set` A 2-dimensional array of regexp or string expressions.\n  Each row in the\n  array corresponds to a brace-expanded pattern.  Each item in the row\n  corresponds to a single path-part.  For example, the pattern\n  `{a,b/c}/d` would expand to a set of patterns like:\n\n        [ [ a, d ]\n        , [ b, c, d ] ]\n\n    If a portion of the pattern doesn't have any \"magic\" in it\n    (that is, it's something like `\"foo\"` rather than `fo*o?`), then it\n    will be left as a string rather than converted to a regular\n    expression.\n\n* `regexp` Created by the `makeRe` method.  A single regular expression\n  expressing the entire pattern.  This is useful in cases where you wish\n  to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.\n* `negate` True if the pattern is negated.\n* `comment` True if the pattern is a comment.\n* `empty` True if the pattern is `\"\"`.\n\n### Methods\n\n* `makeRe` Generate the `regexp` member if necessary, and return it.\n  Will return `false` if the pattern is invalid.\n* `match(fname)` Return true if the filename matches the pattern, or\n  false otherwise.\n* `matchOne(fileArray, patternArray, partial)` Take a `/`-split\n  filename, and match it against a single row in the `regExpSet`.  This\n  method is mainly for internal use, but is exposed so that it can be\n  used by a glob-walker that needs to avoid excessive filesystem calls.\n\nAll other methods are internal, and will be called as necessary.\n\n### minimatch(path, pattern, options)\n\nMain export.  Tests a path against the pattern using the options.\n\n```javascript\nvar isJS = minimatch(file, \"*.js\", { matchBase: true })\n```\n\n### minimatch.filter(pattern, options)\n\nReturns a function that tests its\nsupplied argument, suitable for use with `Array.filter`.  Example:\n\n```javascript\nvar javascripts = fileList.filter(minimatch.filter(\"*.js\", {matchBase: true}))\n```\n\n### minimatch.match(list, pattern, options)\n\nMatch against the list of\nfiles, in the style of fnmatch or glob.  If nothing is matched, and\noptions.nonull is set, then return a list containing the pattern itself.\n\n```javascript\nvar javascripts = minimatch.match(fileList, \"*.js\", {matchBase: true}))\n```\n\n### minimatch.makeRe(pattern, options)\n\nMake a regular expression object from the pattern.\n\n## Options\n\nAll options are `false` by default.\n\n### debug\n\nDump a ton of stuff to stderr.\n\n### nobrace\n\nDo not expand `{a,b}` and `{1..3}` brace sets.\n\n### noglobstar\n\nDisable `**` matching against multiple folder names.\n\n### dot\n\nAllow patterns to match filenames starting with a period, even if\nthe pattern does not explicitly have a period in that spot.\n\nNote that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`\nis set.\n\n### noext\n\nDisable \"extglob\" style patterns like `+(a|b)`.\n\n### nocase\n\nPerform a case-insensitive match.\n\n### nonull\n\nWhen a match is not found by `minimatch.match`, return a list containing\nthe pattern itself if this option is set.  When not set, an empty list\nis returned if there are no matches.\n\n### matchBase\n\nIf set, then patterns without slashes will be matched\nagainst the basename of the path if it contains slashes.  For example,\n`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.\n\n### nocomment\n\nSuppress the behavior of treating `#` at the start of a pattern as a\ncomment.\n\n### nonegate\n\nSuppress the behavior of treating a leading `!` character as negation.\n\n### flipNegate\n\nReturns from negate expressions the same as if they were not negated.\n(Ie, true on a hit, false on a miss.)\n\n\n## Comparisons to other fnmatch/glob implementations\n\nWhile strict compliance with the existing standards is a worthwhile\ngoal, some discrepancies exist between minimatch and other\nimplementations, and are intentional.\n\nIf the pattern starts with a `!` character, then it is negated.  Set the\n`nonegate` flag to suppress this behavior, and treat leading `!`\ncharacters normally.  This is perhaps relevant if you wish to start the\npattern with a negative extglob pattern like `!(a|B)`.  Multiple `!`\ncharacters at the start of a pattern will negate the pattern multiple\ntimes.\n\nIf a pattern starts with `#`, then it is treated as a comment, and\nwill not match anything.  Use `\\#` to match a literal `#` at the\nstart of a line, or set the `nocomment` flag to suppress this behavior.\n\nThe double-star character `**` is supported by default, unless the\n`noglobstar` flag is set.  This is supported in the manner of bsdglob\nand bash 4.1, where `**` only has special significance if it is the only\nthing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but\n`a/**b` will not.\n\nIf an escaped pattern has no matches, and the `nonull` flag is set,\nthen minimatch.match returns the pattern as-provided, rather than\ninterpreting the character escapes.  For example,\n`minimatch.match([], \"\\\\*a\\\\?\")` will return `\"\\\\*a\\\\?\"` rather than\n`\"*a?\"`.  This is akin to setting the `nullglob` option in bash, except\nthat it does not resolve escaped pattern characters.\n\nIf brace expansion is not disabled, then it is performed before any\nother interpretation of the glob pattern.  Thus, a pattern like\n`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded\n**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are\nchecked for validity.  Since those two are valid, matching proceeds.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/minimatch.git"
-  },
-  "scripts": {
-    "posttest": "standard minimatch.js test/*.js",
-    "test": "tap test/*.js"
-  },
-  "version": "3.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/package.json
deleted file mode 100644
index 2d8df9915432c54296c8b08dc686583d8d490145..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream-ignore/package.json
+++ /dev/null
@@ -1,78 +0,0 @@
-{
-  "_from": "fstream-ignore@>=1.0.5 <1.1.0",
-  "_id": "fstream-ignore@1.0.5",
-  "_location": "/serialport/node-pre-gyp/tar-pack/fstream-ignore",
-  "_nodeVersion": "5.10.1",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/fstream-ignore-1.0.5.tgz_1463518095640_0.10221575922332704"
-  },
-  "_npmUser": {
-    "email": "kat@sykosomatic.org",
-    "name": "zkat"
-  },
-  "_npmVersion": "3.9.1",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack"
-  ],
-  "_resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz",
-  "_shasum": "9c31dae34767018fe1d249b24dada67d092da105",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/fstream-ignore/issues"
-  },
-  "dependencies": {
-    "fstream": "^1.0.0",
-    "inherits": "2",
-    "minimatch": "^3.0.0"
-  },
-  "description": "A thing for ignoring files based on globs",
-  "devDependencies": {
-    "mkdirp": "",
-    "rimraf": "",
-    "tap": "^5.7.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "9c31dae34767018fe1d249b24dada67d092da105",
-    "tarball": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz"
-  },
-  "files": [
-    "ignore.js"
-  ],
-  "gitHead": "1438a1a2c25fee71327c36c86de787a14a53ffd4",
-  "homepage": "https://github.com/isaacs/fstream-ignore#readme",
-  "license": "ISC",
-  "main": "ignore.js",
-  "maintainers": [
-    {
-      "name": "isaacs",
-      "email": "i@izs.me"
-    },
-    {
-      "name": "othiym23",
-      "email": "ogd@aoaioxxysz.net"
-    },
-    {
-      "name": "zkat",
-      "email": "kat@sykosomatic.org"
-    }
-  ],
-  "name": "fstream-ignore",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/fstream-ignore.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js --cov"
-  },
-  "version": "1.0.5"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.npmignore
deleted file mode 100644
index 494272a81afb6f29e423cce250d2b3dfe9b5f3f3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-.*.swp
-node_modules/
-examples/deep-copy/
-examples/path/
-examples/filter-copy/
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.travis.yml
deleted file mode 100644
index 9f5972ab5aa1cd8e656ada1abd8e43a244d736fe..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: node_js
-node_js:
-  - "6"
-  - "4"
-  - "0.10"
-  - "0.12"
-before_install:
-  - "npm config set spin false"
-  - "npm install -g npm/npm"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/README.md
deleted file mode 100644
index 9d8cb77e5c30bad07fb1a50eefa428fa2a48c98a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/README.md
+++ /dev/null
@@ -1,76 +0,0 @@
-Like FS streams, but with stat on them, and supporting directories and
-symbolic links, as well as normal files.  Also, you can use this to set
-the stats on a file, even if you don't change its contents, or to create
-a symlink, etc.
-
-So, for example, you can "write" a directory, and it'll call `mkdir`.  You
-can specify a uid and gid, and it'll call `chown`.  You can specify a
-`mtime` and `atime`, and it'll call `utimes`.  You can call it a symlink
-and provide a `linkpath` and it'll call `symlink`.
-
-Note that it won't automatically resolve symbolic links.  So, if you
-call `fstream.Reader('/some/symlink')` then you'll get an object
-that stats and then ends immediately (since it has no data).  To follow
-symbolic links, do this: `fstream.Reader({path:'/some/symlink', follow:
-true })`.
-
-There are various checks to make sure that the bytes emitted are the
-same as the intended size, if the size is set.
-
-## Examples
-
-```javascript
-fstream
-  .Writer({ path: "path/to/file"
-          , mode: 0755
-          , size: 6
-          })
-  .write("hello\n")
-  .end()
-```
-
-This will create the directories if they're missing, and then write
-`hello\n` into the file, chmod it to 0755, and assert that 6 bytes have
-been written when it's done.
-
-```javascript
-fstream
-  .Writer({ path: "path/to/file"
-          , mode: 0755
-          , size: 6
-          , flags: "a"
-          })
-  .write("hello\n")
-  .end()
-```
-
-You can pass flags in, if you want to append to a file.
-
-```javascript
-fstream
-  .Writer({ path: "path/to/symlink"
-          , linkpath: "./file"
-          , SymbolicLink: true
-          , mode: "0755" // octal strings supported
-          })
-  .end()
-```
-
-If isSymbolicLink is a function, it'll be called, and if it returns
-true, then it'll treat it as a symlink.  If it's not a function, then
-any truish value will make a symlink, or you can set `type:
-'SymbolicLink'`, which does the same thing.
-
-Note that the linkpath is relative to the symbolic link location, not
-the parent dir or cwd.
-
-```javascript
-fstream
-  .Reader("path/to/dir")
-  .pipe(fstream.Writer("path/to/other/dir"))
-```
-
-This will do like `cp -Rp path/to/dir path/to/other/dir`.  If the other
-dir exists and isn't a directory, then it'll emit an error.  It'll also
-set the uid, gid, mode, etc. to be identical.  In this way, it's more
-like `rsync -a` than simply a copy.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/filter-pipe.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/filter-pipe.js
deleted file mode 100644
index 83dadef8a6f39bf24e73bd608d0e3f342fc03e9a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/filter-pipe.js
+++ /dev/null
@@ -1,134 +0,0 @@
-var fstream = require('../fstream.js')
-var path = require('path')
-
-var r = fstream.Reader({
-  path: path.dirname(__dirname),
-  filter: function () {
-    return !this.basename.match(/^\./) &&
-      !this.basename.match(/^node_modules$/) &&
-      !this.basename.match(/^deep-copy$/) &&
-      !this.basename.match(/^filter-copy$/)
-  }
-})
-
-// this writer will only write directories
-var w = fstream.Writer({
-  path: path.resolve(__dirname, 'filter-copy'),
-  type: 'Directory',
-  filter: function () {
-    return this.type === 'Directory'
-  }
-})
-
-var indent = ''
-
-r.on('entry', appears)
-r.on('ready', function () {
-  console.error('ready to begin!', r.path)
-})
-
-function appears (entry) {
-  console.error(indent + 'a %s appears!', entry.type, entry.basename, typeof entry.basename)
-  if (foggy) {
-    console.error('FOGGY!')
-    var p = entry
-    do {
-      console.error(p.depth, p.path, p._paused)
-      p = p.parent
-    } while (p)
-
-    throw new Error('\u001b[mshould not have entries while foggy')
-  }
-  indent += '\t'
-  entry.on('data', missile(entry))
-  entry.on('end', runaway(entry))
-  entry.on('entry', appears)
-}
-
-var foggy
-function missile (entry) {
-  function liftFog (who) {
-    if (!foggy) return
-    if (who) {
-      console.error('%s breaks the spell!', who && who.path)
-    } else {
-      console.error('the spell expires!')
-    }
-    console.error('\u001b[mthe fog lifts!\n')
-    clearTimeout(foggy)
-    foggy = null
-    if (entry._paused) entry.resume()
-  }
-
-  if (entry.type === 'Directory') {
-    var ended = false
-    entry.once('end', function () { ended = true })
-    return function (c) {
-      // throw in some pathological pause()/resume() behavior
-      // just for extra fun.
-      process.nextTick(function () {
-        if (!foggy && !ended) { // && Math.random() < 0.3) {
-          console.error(indent + '%s casts a spell', entry.basename)
-          console.error('\na slowing fog comes over the battlefield...\n\u001b[32m')
-          entry.pause()
-          entry.once('resume', liftFog)
-          foggy = setTimeout(liftFog, 1000)
-        }
-      })
-    }
-  }
-
-  return function (c) {
-    var e = Math.random() < 0.5
-    console.error(indent + '%s %s for %d damage!',
-      entry.basename,
-      e ? 'is struck' : 'fires a chunk',
-      c.length)
-  }
-}
-
-function runaway (entry) {
-  return function () {
-    var e = Math.random() < 0.5
-    console.error(indent + '%s %s',
-      entry.basename,
-      e ? 'turns to flee' : 'is vanquished!')
-    indent = indent.slice(0, -1)
-  }
-}
-
-w.on('entry', attacks)
-// w.on('ready', function () { attacks(w) })
-function attacks (entry) {
-  console.error(indent + '%s %s!', entry.basename,
-    entry.type === 'Directory' ? 'calls for backup' : 'attacks')
-  entry.on('entry', attacks)
-}
-
-var ended = false
-var i = 1
-r.on('end', function () {
-  if (foggy) clearTimeout(foggy)
-  console.error("\u001b[mIT'S OVER!!")
-  console.error('A WINNAR IS YOU!')
-
-  console.log('ok ' + (i++) + ' A WINNAR IS YOU')
-  ended = true
-  // now go through and verify that everything in there is a dir.
-  var p = path.resolve(__dirname, 'filter-copy')
-  var checker = fstream.Reader({ path: p })
-  checker.checker = true
-  checker.on('child', function (e) {
-    var ok = e.type === 'Directory'
-    console.log((ok ? '' : 'not ') + 'ok ' + (i++) +
-      ' should be a dir: ' +
-      e.path.substr(checker.path.length + 1))
-  })
-})
-
-process.on('exit', function () {
-  console.log((ended ? '' : 'not ') + 'ok ' + (i) + ' ended')
-  console.log('1..' + i)
-})
-
-r.pipe(w)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/pipe.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/pipe.js
deleted file mode 100644
index 3de42ef32bfd7b74a359742319ec48ad718833b0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/pipe.js
+++ /dev/null
@@ -1,118 +0,0 @@
-var fstream = require('../fstream.js')
-var path = require('path')
-
-var r = fstream.Reader({
-  path: path.dirname(__dirname),
-  filter: function () {
-    return !this.basename.match(/^\./) &&
-      !this.basename.match(/^node_modules$/) &&
-      !this.basename.match(/^deep-copy$/)
-  }
-})
-
-var w = fstream.Writer({
-  path: path.resolve(__dirname, 'deep-copy'),
-  type: 'Directory'
-})
-
-var indent = ''
-
-r.on('entry', appears)
-r.on('ready', function () {
-  console.error('ready to begin!', r.path)
-})
-
-function appears (entry) {
-  console.error(indent + 'a %s appears!', entry.type, entry.basename, typeof entry.basename, entry)
-  if (foggy) {
-    console.error('FOGGY!')
-    var p = entry
-    do {
-      console.error(p.depth, p.path, p._paused)
-      p = p.parent
-    } while (p)
-
-    throw new Error('\u001b[mshould not have entries while foggy')
-  }
-  indent += '\t'
-  entry.on('data', missile(entry))
-  entry.on('end', runaway(entry))
-  entry.on('entry', appears)
-}
-
-var foggy
-function missile (entry) {
-  function liftFog (who) {
-    if (!foggy) return
-    if (who) {
-      console.error('%s breaks the spell!', who && who.path)
-    } else {
-      console.error('the spell expires!')
-    }
-    console.error('\u001b[mthe fog lifts!\n')
-    clearTimeout(foggy)
-    foggy = null
-    if (entry._paused) entry.resume()
-  }
-
-  if (entry.type === 'Directory') {
-    var ended = false
-    entry.once('end', function () { ended = true })
-    return function (c) {
-      // throw in some pathological pause()/resume() behavior
-      // just for extra fun.
-      process.nextTick(function () {
-        if (!foggy && !ended) { // && Math.random() < 0.3) {
-          console.error(indent + '%s casts a spell', entry.basename)
-          console.error('\na slowing fog comes over the battlefield...\n\u001b[32m')
-          entry.pause()
-          entry.once('resume', liftFog)
-          foggy = setTimeout(liftFog, 10)
-        }
-      })
-    }
-  }
-
-  return function (c) {
-    var e = Math.random() < 0.5
-    console.error(indent + '%s %s for %d damage!',
-      entry.basename,
-      e ? 'is struck' : 'fires a chunk',
-      c.length)
-  }
-}
-
-function runaway (entry) {
-  return function () {
-    var e = Math.random() < 0.5
-    console.error(indent + '%s %s',
-      entry.basename,
-      e ? 'turns to flee' : 'is vanquished!')
-    indent = indent.slice(0, -1)
-  }
-}
-
-w.on('entry', attacks)
-// w.on('ready', function () { attacks(w) })
-function attacks (entry) {
-  console.error(indent + '%s %s!', entry.basename,
-    entry.type === 'Directory' ? 'calls for backup' : 'attacks')
-  entry.on('entry', attacks)
-}
-
-var ended = false
-r.on('end', function () {
-  if (foggy) clearTimeout(foggy)
-  console.error("\u001b[mIT'S OVER!!")
-  console.error('A WINNAR IS YOU!')
-
-  console.log('ok 1 A WINNAR IS YOU')
-  ended = true
-})
-
-process.on('exit', function () {
-  console.log((ended ? '' : 'not ') + 'ok 2 ended')
-  console.log('1..2')
-})
-
-r.pipe(w)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/reader.js
deleted file mode 100644
index 19affbe7e6e23db44ec155dee14564174d927376..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/reader.js
+++ /dev/null
@@ -1,68 +0,0 @@
-var fstream = require('../fstream.js')
-var tap = require('tap')
-var fs = require('fs')
-var path = require('path')
-var dir = path.dirname(__dirname)
-
-tap.test('reader test', function (t) {
-  var children = -1
-  var gotReady = false
-  var ended = false
-
-  var r = fstream.Reader({
-    path: dir,
-    filter: function () {
-      // return this.parent === r
-      return this.parent === r || this === r
-    }
-  })
-
-  r.on('ready', function () {
-    gotReady = true
-    children = fs.readdirSync(dir).length
-    console.error('Setting expected children to ' + children)
-    t.equal(r.type, 'Directory', 'should be a directory')
-  })
-
-  r.on('entry', function (entry) {
-    children--
-    if (!gotReady) {
-      t.fail('children before ready!')
-    }
-    t.equal(entry.dirname, r.path, 'basename is parent dir')
-  })
-
-  r.on('error', function (er) {
-    t.fail(er)
-    t.end()
-    process.exit(1)
-  })
-
-  r.on('end', function () {
-    t.equal(children, 0, 'should have seen all children')
-    ended = true
-  })
-
-  var closed = false
-  r.on('close', function () {
-    t.ok(ended, 'saw end before close')
-    t.notOk(closed, 'close should only happen once')
-    closed = true
-    t.end()
-  })
-})
-
-tap.test('reader error test', function (t) {
-  // assumes non-root on a *nix system
-  var r = fstream.Reader({ path: '/etc/shadow' })
-
-  r.once('error', function (er) {
-    t.ok(true)
-    t.end()
-  })
-
-  r.on('end', function () {
-    t.fail('reader ended without error')
-    t.end()
-  })
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/symlink-write.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/symlink-write.js
deleted file mode 100644
index 19e81eea9fe80784152883ba1f1c7fd38d7877ea..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/examples/symlink-write.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var fstream = require('../fstream.js')
-var notOpen = false
-process.chdir(__dirname)
-
-fstream
-  .Writer({
-    path: 'path/to/symlink',
-    linkpath: './file',
-    isSymbolicLink: true,
-    mode: '0755' // octal strings supported
-  })
-  .on('close', function () {
-    notOpen = true
-    var fs = require('fs')
-    var s = fs.lstatSync('path/to/symlink')
-    var isSym = s.isSymbolicLink()
-    console.log((isSym ? '' : 'not ') + 'ok 1 should be symlink')
-    var t = fs.readlinkSync('path/to/symlink')
-    var isTarget = t === './file'
-    console.log((isTarget ? '' : 'not ') + 'ok 2 should link to ./file')
-  })
-  .end()
-
-process.on('exit', function () {
-  console.log((notOpen ? '' : 'not ') + 'ok 3 should be closed')
-  console.log('1..3')
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/fstream.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/fstream.js
deleted file mode 100644
index c0eb3bea788036a43c7cffd7ac92dd648d8a0372..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/fstream.js
+++ /dev/null
@@ -1,35 +0,0 @@
-exports.Abstract = require('./lib/abstract.js')
-exports.Reader = require('./lib/reader.js')
-exports.Writer = require('./lib/writer.js')
-
-exports.File = {
-  Reader: require('./lib/file-reader.js'),
-  Writer: require('./lib/file-writer.js')
-}
-
-exports.Dir = {
-  Reader: require('./lib/dir-reader.js'),
-  Writer: require('./lib/dir-writer.js')
-}
-
-exports.Link = {
-  Reader: require('./lib/link-reader.js'),
-  Writer: require('./lib/link-writer.js')
-}
-
-exports.Proxy = {
-  Reader: require('./lib/proxy-reader.js'),
-  Writer: require('./lib/proxy-writer.js')
-}
-
-exports.Reader.Dir = exports.DirReader = exports.Dir.Reader
-exports.Reader.File = exports.FileReader = exports.File.Reader
-exports.Reader.Link = exports.LinkReader = exports.Link.Reader
-exports.Reader.Proxy = exports.ProxyReader = exports.Proxy.Reader
-
-exports.Writer.Dir = exports.DirWriter = exports.Dir.Writer
-exports.Writer.File = exports.FileWriter = exports.File.Writer
-exports.Writer.Link = exports.LinkWriter = exports.Link.Writer
-exports.Writer.Proxy = exports.ProxyWriter = exports.Proxy.Writer
-
-exports.collect = require('./lib/collect.js')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/abstract.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/abstract.js
deleted file mode 100644
index 97c120e1d5277d878dab04bc5f18eb88de9f787f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/abstract.js
+++ /dev/null
@@ -1,85 +0,0 @@
-// the parent class for all fstreams.
-
-module.exports = Abstract
-
-var Stream = require('stream').Stream
-var inherits = require('inherits')
-
-function Abstract () {
-  Stream.call(this)
-}
-
-inherits(Abstract, Stream)
-
-Abstract.prototype.on = function (ev, fn) {
-  if (ev === 'ready' && this.ready) {
-    process.nextTick(fn.bind(this))
-  } else {
-    Stream.prototype.on.call(this, ev, fn)
-  }
-  return this
-}
-
-Abstract.prototype.abort = function () {
-  this._aborted = true
-  this.emit('abort')
-}
-
-Abstract.prototype.destroy = function () {}
-
-Abstract.prototype.warn = function (msg, code) {
-  var self = this
-  var er = decorate(msg, code, self)
-  if (!self.listeners('warn')) {
-    console.error('%s %s\n' +
-    'path = %s\n' +
-    'syscall = %s\n' +
-    'fstream_type = %s\n' +
-    'fstream_path = %s\n' +
-    'fstream_unc_path = %s\n' +
-    'fstream_class = %s\n' +
-    'fstream_stack =\n%s\n',
-      code || 'UNKNOWN',
-      er.stack,
-      er.path,
-      er.syscall,
-      er.fstream_type,
-      er.fstream_path,
-      er.fstream_unc_path,
-      er.fstream_class,
-      er.fstream_stack.join('\n'))
-  } else {
-    self.emit('warn', er)
-  }
-}
-
-Abstract.prototype.info = function (msg, code) {
-  this.emit('info', msg, code)
-}
-
-Abstract.prototype.error = function (msg, code, th) {
-  var er = decorate(msg, code, this)
-  if (th) throw er
-  else this.emit('error', er)
-}
-
-function decorate (er, code, self) {
-  if (!(er instanceof Error)) er = new Error(er)
-  er.code = er.code || code
-  er.path = er.path || self.path
-  er.fstream_type = er.fstream_type || self.type
-  er.fstream_path = er.fstream_path || self.path
-  if (self._path !== self.path) {
-    er.fstream_unc_path = er.fstream_unc_path || self._path
-  }
-  if (self.linkpath) {
-    er.fstream_linkpath = er.fstream_linkpath || self.linkpath
-  }
-  er.fstream_class = er.fstream_class || self.constructor.name
-  er.fstream_stack = er.fstream_stack ||
-    new Error().stack.split(/\n/).slice(3).map(function (s) {
-      return s.replace(/^ {4}at /, '')
-    })
-
-  return er
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/collect.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/collect.js
deleted file mode 100644
index e5d4f35833476eb85ca4b1d2f2ee81bfbb751f1f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/collect.js
+++ /dev/null
@@ -1,70 +0,0 @@
-module.exports = collect
-
-function collect (stream) {
-  if (stream._collected) return
-
-  if (stream._paused) return stream.on('resume', collect.bind(null, stream))
-
-  stream._collected = true
-  stream.pause()
-
-  stream.on('data', save)
-  stream.on('end', save)
-  var buf = []
-  function save (b) {
-    if (typeof b === 'string') b = new Buffer(b)
-    if (Buffer.isBuffer(b) && !b.length) return
-    buf.push(b)
-  }
-
-  stream.on('entry', saveEntry)
-  var entryBuffer = []
-  function saveEntry (e) {
-    collect(e)
-    entryBuffer.push(e)
-  }
-
-  stream.on('proxy', proxyPause)
-  function proxyPause (p) {
-    p.pause()
-  }
-
-  // replace the pipe method with a new version that will
-  // unlock the buffered stuff.  if you just call .pipe()
-  // without a destination, then it'll re-play the events.
-  stream.pipe = (function (orig) {
-    return function (dest) {
-      // console.error(' === open the pipes', dest && dest.path)
-
-      // let the entries flow through one at a time.
-      // Once they're all done, then we can resume completely.
-      var e = 0
-      ;(function unblockEntry () {
-        var entry = entryBuffer[e++]
-        // console.error(" ==== unblock entry", entry && entry.path)
-        if (!entry) return resume()
-        entry.on('end', unblockEntry)
-        if (dest) dest.add(entry)
-        else stream.emit('entry', entry)
-      })()
-
-      function resume () {
-        stream.removeListener('entry', saveEntry)
-        stream.removeListener('data', save)
-        stream.removeListener('end', save)
-
-        stream.pipe = orig
-        if (dest) stream.pipe(dest)
-
-        buf.forEach(function (b) {
-          if (b) stream.emit('data', b)
-          else stream.emit('end')
-        })
-
-        stream.resume()
-      }
-
-      return dest
-    }
-  })(stream.pipe)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-reader.js
deleted file mode 100644
index 820cdc85a8e9c4ae4b6aa64250df9dbf829c0f54..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-reader.js
+++ /dev/null
@@ -1,252 +0,0 @@
-// A thing that emits "entry" events with Reader objects
-// Pausing it causes it to stop emitting entry events, and also
-// pauses the current entry if there is one.
-
-module.exports = DirReader
-
-var fs = require('graceful-fs')
-var inherits = require('inherits')
-var path = require('path')
-var Reader = require('./reader.js')
-var assert = require('assert').ok
-
-inherits(DirReader, Reader)
-
-function DirReader (props) {
-  var self = this
-  if (!(self instanceof DirReader)) {
-    throw new Error('DirReader must be called as constructor.')
-  }
-
-  // should already be established as a Directory type
-  if (props.type !== 'Directory' || !props.Directory) {
-    throw new Error('Non-directory type ' + props.type)
-  }
-
-  self.entries = null
-  self._index = -1
-  self._paused = false
-  self._length = -1
-
-  if (props.sort) {
-    this.sort = props.sort
-  }
-
-  Reader.call(this, props)
-}
-
-DirReader.prototype._getEntries = function () {
-  var self = this
-
-  // race condition.  might pause() before calling _getEntries,
-  // and then resume, and try to get them a second time.
-  if (self._gotEntries) return
-  self._gotEntries = true
-
-  fs.readdir(self._path, function (er, entries) {
-    if (er) return self.error(er)
-
-    self.entries = entries
-
-    self.emit('entries', entries)
-    if (self._paused) self.once('resume', processEntries)
-    else processEntries()
-
-    function processEntries () {
-      self._length = self.entries.length
-      if (typeof self.sort === 'function') {
-        self.entries = self.entries.sort(self.sort.bind(self))
-      }
-      self._read()
-    }
-  })
-}
-
-// start walking the dir, and emit an "entry" event for each one.
-DirReader.prototype._read = function () {
-  var self = this
-
-  if (!self.entries) return self._getEntries()
-
-  if (self._paused || self._currentEntry || self._aborted) {
-    // console.error('DR paused=%j, current=%j, aborted=%j', self._paused, !!self._currentEntry, self._aborted)
-    return
-  }
-
-  self._index++
-  if (self._index >= self.entries.length) {
-    if (!self._ended) {
-      self._ended = true
-      self.emit('end')
-      self.emit('close')
-    }
-    return
-  }
-
-  // ok, handle this one, then.
-
-  // save creating a proxy, by stat'ing the thing now.
-  var p = path.resolve(self._path, self.entries[self._index])
-  assert(p !== self._path)
-  assert(self.entries[self._index])
-
-  // set this to prevent trying to _read() again in the stat time.
-  self._currentEntry = p
-  fs[ self.props.follow ? 'stat' : 'lstat' ](p, function (er, stat) {
-    if (er) return self.error(er)
-
-    var who = self._proxy || self
-
-    stat.path = p
-    stat.basename = path.basename(p)
-    stat.dirname = path.dirname(p)
-    var childProps = self.getChildProps.call(who, stat)
-    childProps.path = p
-    childProps.basename = path.basename(p)
-    childProps.dirname = path.dirname(p)
-
-    var entry = Reader(childProps, stat)
-
-    // console.error("DR Entry", p, stat.size)
-
-    self._currentEntry = entry
-
-    // "entry" events are for direct entries in a specific dir.
-    // "child" events are for any and all children at all levels.
-    // This nomenclature is not completely final.
-
-    entry.on('pause', function (who) {
-      if (!self._paused && !entry._disowned) {
-        self.pause(who)
-      }
-    })
-
-    entry.on('resume', function (who) {
-      if (self._paused && !entry._disowned) {
-        self.resume(who)
-      }
-    })
-
-    entry.on('stat', function (props) {
-      self.emit('_entryStat', entry, props)
-      if (entry._aborted) return
-      if (entry._paused) {
-        entry.once('resume', function () {
-          self.emit('entryStat', entry, props)
-        })
-      } else self.emit('entryStat', entry, props)
-    })
-
-    entry.on('ready', function EMITCHILD () {
-      // console.error("DR emit child", entry._path)
-      if (self._paused) {
-        // console.error("  DR emit child - try again later")
-        // pause the child, and emit the "entry" event once we drain.
-        // console.error("DR pausing child entry")
-        entry.pause(self)
-        return self.once('resume', EMITCHILD)
-      }
-
-      // skip over sockets.  they can't be piped around properly,
-      // so there's really no sense even acknowledging them.
-      // if someone really wants to see them, they can listen to
-      // the "socket" events.
-      if (entry.type === 'Socket') {
-        self.emit('socket', entry)
-      } else {
-        self.emitEntry(entry)
-      }
-    })
-
-    var ended = false
-    entry.on('close', onend)
-    entry.on('disown', onend)
-    function onend () {
-      if (ended) return
-      ended = true
-      self.emit('childEnd', entry)
-      self.emit('entryEnd', entry)
-      self._currentEntry = null
-      if (!self._paused) {
-        self._read()
-      }
-    }
-
-    // XXX Remove this.  Works in node as of 0.6.2 or so.
-    // Long filenames should not break stuff.
-    entry.on('error', function (er) {
-      if (entry._swallowErrors) {
-        self.warn(er)
-        entry.emit('end')
-        entry.emit('close')
-      } else {
-        self.emit('error', er)
-      }
-    })
-
-    // proxy up some events.
-    ;[
-      'child',
-      'childEnd',
-      'warn'
-    ].forEach(function (ev) {
-      entry.on(ev, self.emit.bind(self, ev))
-    })
-  })
-}
-
-DirReader.prototype.disown = function (entry) {
-  entry.emit('beforeDisown')
-  entry._disowned = true
-  entry.parent = entry.root = null
-  if (entry === this._currentEntry) {
-    this._currentEntry = null
-  }
-  entry.emit('disown')
-}
-
-DirReader.prototype.getChildProps = function () {
-  return {
-    depth: this.depth + 1,
-    root: this.root || this,
-    parent: this,
-    follow: this.follow,
-    filter: this.filter,
-    sort: this.props.sort,
-    hardlinks: this.props.hardlinks
-  }
-}
-
-DirReader.prototype.pause = function (who) {
-  var self = this
-  if (self._paused) return
-  who = who || self
-  self._paused = true
-  if (self._currentEntry && self._currentEntry.pause) {
-    self._currentEntry.pause(who)
-  }
-  self.emit('pause', who)
-}
-
-DirReader.prototype.resume = function (who) {
-  var self = this
-  if (!self._paused) return
-  who = who || self
-
-  self._paused = false
-  // console.error('DR Emit Resume', self._path)
-  self.emit('resume', who)
-  if (self._paused) {
-    // console.error('DR Re-paused', self._path)
-    return
-  }
-
-  if (self._currentEntry) {
-    if (self._currentEntry.resume) self._currentEntry.resume(who)
-  } else self._read()
-}
-
-DirReader.prototype.emitEntry = function (entry) {
-  this.emit('entry', entry)
-  this.emit('child', entry)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-writer.js
deleted file mode 100644
index ec50dca900dcf41e3a77aca22ac2948951e5dda4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/dir-writer.js
+++ /dev/null
@@ -1,174 +0,0 @@
-// It is expected that, when .add() returns false, the consumer
-// of the DirWriter will pause until a "drain" event occurs. Note
-// that this is *almost always going to be the case*, unless the
-// thing being written is some sort of unsupported type, and thus
-// skipped over.
-
-module.exports = DirWriter
-
-var Writer = require('./writer.js')
-var inherits = require('inherits')
-var mkdir = require('mkdirp')
-var path = require('path')
-var collect = require('./collect.js')
-
-inherits(DirWriter, Writer)
-
-function DirWriter (props) {
-  var self = this
-  if (!(self instanceof DirWriter)) {
-    self.error('DirWriter must be called as constructor.', null, true)
-  }
-
-  // should already be established as a Directory type
-  if (props.type !== 'Directory' || !props.Directory) {
-    self.error('Non-directory type ' + props.type + ' ' +
-      JSON.stringify(props), null, true)
-  }
-
-  Writer.call(this, props)
-}
-
-DirWriter.prototype._create = function () {
-  var self = this
-  mkdir(self._path, Writer.dirmode, function (er) {
-    if (er) return self.error(er)
-    // ready to start getting entries!
-    self.ready = true
-    self.emit('ready')
-    self._process()
-  })
-}
-
-// a DirWriter has an add(entry) method, but its .write() doesn't
-// do anything.  Why a no-op rather than a throw?  Because this
-// leaves open the door for writing directory metadata for
-// gnu/solaris style dumpdirs.
-DirWriter.prototype.write = function () {
-  return true
-}
-
-DirWriter.prototype.end = function () {
-  this._ended = true
-  this._process()
-}
-
-DirWriter.prototype.add = function (entry) {
-  var self = this
-
-  // console.error('\tadd', entry._path, '->', self._path)
-  collect(entry)
-  if (!self.ready || self._currentEntry) {
-    self._buffer.push(entry)
-    return false
-  }
-
-  // create a new writer, and pipe the incoming entry into it.
-  if (self._ended) {
-    return self.error('add after end')
-  }
-
-  self._buffer.push(entry)
-  self._process()
-
-  return this._buffer.length === 0
-}
-
-DirWriter.prototype._process = function () {
-  var self = this
-
-  // console.error('DW Process p=%j', self._processing, self.basename)
-
-  if (self._processing) return
-
-  var entry = self._buffer.shift()
-  if (!entry) {
-    // console.error("DW Drain")
-    self.emit('drain')
-    if (self._ended) self._finish()
-    return
-  }
-
-  self._processing = true
-  // console.error("DW Entry", entry._path)
-
-  self.emit('entry', entry)
-
-  // ok, add this entry
-  //
-  // don't allow recursive copying
-  var p = entry
-  var pp
-  do {
-    pp = p._path || p.path
-    if (pp === self.root._path || pp === self._path ||
-      (pp && pp.indexOf(self._path) === 0)) {
-      // console.error('DW Exit (recursive)', entry.basename, self._path)
-      self._processing = false
-      if (entry._collected) entry.pipe()
-      return self._process()
-    }
-    p = p.parent
-  } while (p)
-
-  // console.error("DW not recursive")
-
-  // chop off the entry's root dir, replace with ours
-  var props = {
-    parent: self,
-    root: self.root || self,
-    type: entry.type,
-    depth: self.depth + 1
-  }
-
-  pp = entry._path || entry.path || entry.props.path
-  if (entry.parent) {
-    pp = pp.substr(entry.parent._path.length + 1)
-  }
-  // get rid of any ../../ shenanigans
-  props.path = path.join(self.path, path.join('/', pp))
-
-  // if i have a filter, the child should inherit it.
-  props.filter = self.filter
-
-  // all the rest of the stuff, copy over from the source.
-  Object.keys(entry.props).forEach(function (k) {
-    if (!props.hasOwnProperty(k)) {
-      props[k] = entry.props[k]
-    }
-  })
-
-  // not sure at this point what kind of writer this is.
-  var child = self._currentChild = new Writer(props)
-  child.on('ready', function () {
-    // console.error("DW Child Ready", child.type, child._path)
-    // console.error("  resuming", entry._path)
-    entry.pipe(child)
-    entry.resume()
-  })
-
-  // XXX Make this work in node.
-  // Long filenames should not break stuff.
-  child.on('error', function (er) {
-    if (child._swallowErrors) {
-      self.warn(er)
-      child.emit('end')
-      child.emit('close')
-    } else {
-      self.emit('error', er)
-    }
-  })
-
-  // we fire _end internally *after* end, so that we don't move on
-  // until any "end" listeners have had their chance to do stuff.
-  child.on('close', onend)
-  var ended = false
-  function onend () {
-    if (ended) return
-    ended = true
-    // console.error("* DW Child end", child.basename)
-    self._currentChild = null
-    self._processing = false
-    self._process()
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-reader.js
deleted file mode 100644
index baa01f4b3db7ef5cb2dea6269210852310b3fb9d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-reader.js
+++ /dev/null
@@ -1,150 +0,0 @@
-// Basically just a wrapper around an fs.ReadStream
-
-module.exports = FileReader
-
-var fs = require('graceful-fs')
-var inherits = require('inherits')
-var Reader = require('./reader.js')
-var EOF = {EOF: true}
-var CLOSE = {CLOSE: true}
-
-inherits(FileReader, Reader)
-
-function FileReader (props) {
-  // console.error("    FR create", props.path, props.size, new Error().stack)
-  var self = this
-  if (!(self instanceof FileReader)) {
-    throw new Error('FileReader must be called as constructor.')
-  }
-
-  // should already be established as a File type
-  // XXX Todo: preserve hardlinks by tracking dev+inode+nlink,
-  // with a HardLinkReader class.
-  if (!((props.type === 'Link' && props.Link) ||
-    (props.type === 'File' && props.File))) {
-    throw new Error('Non-file type ' + props.type)
-  }
-
-  self._buffer = []
-  self._bytesEmitted = 0
-  Reader.call(self, props)
-}
-
-FileReader.prototype._getStream = function () {
-  var self = this
-  var stream = self._stream = fs.createReadStream(self._path, self.props)
-
-  if (self.props.blksize) {
-    stream.bufferSize = self.props.blksize
-  }
-
-  stream.on('open', self.emit.bind(self, 'open'))
-
-  stream.on('data', function (c) {
-    // console.error('\t\t%d %s', c.length, self.basename)
-    self._bytesEmitted += c.length
-    // no point saving empty chunks
-    if (!c.length) {
-      return
-    } else if (self._paused || self._buffer.length) {
-      self._buffer.push(c)
-      self._read()
-    } else self.emit('data', c)
-  })
-
-  stream.on('end', function () {
-    if (self._paused || self._buffer.length) {
-      // console.error('FR Buffering End', self._path)
-      self._buffer.push(EOF)
-      self._read()
-    } else {
-      self.emit('end')
-    }
-
-    if (self._bytesEmitted !== self.props.size) {
-      self.error("Didn't get expected byte count\n" +
-        'expect: ' + self.props.size + '\n' +
-        'actual: ' + self._bytesEmitted)
-    }
-  })
-
-  stream.on('close', function () {
-    if (self._paused || self._buffer.length) {
-      // console.error('FR Buffering Close', self._path)
-      self._buffer.push(CLOSE)
-      self._read()
-    } else {
-      // console.error('FR close 1', self._path)
-      self.emit('close')
-    }
-  })
-
-  stream.on('error', function (e) {
-    self.emit('error', e)
-  })
-
-  self._read()
-}
-
-FileReader.prototype._read = function () {
-  var self = this
-  // console.error('FR _read', self._path)
-  if (self._paused) {
-    // console.error('FR _read paused', self._path)
-    return
-  }
-
-  if (!self._stream) {
-    // console.error('FR _getStream calling', self._path)
-    return self._getStream()
-  }
-
-  // clear out the buffer, if there is one.
-  if (self._buffer.length) {
-    // console.error('FR _read has buffer', self._buffer.length, self._path)
-    var buf = self._buffer
-    for (var i = 0, l = buf.length; i < l; i++) {
-      var c = buf[i]
-      if (c === EOF) {
-        // console.error('FR Read emitting buffered end', self._path)
-        self.emit('end')
-      } else if (c === CLOSE) {
-        // console.error('FR Read emitting buffered close', self._path)
-        self.emit('close')
-      } else {
-        // console.error('FR Read emitting buffered data', self._path)
-        self.emit('data', c)
-      }
-
-      if (self._paused) {
-        // console.error('FR Read Re-pausing at '+i, self._path)
-        self._buffer = buf.slice(i)
-        return
-      }
-    }
-    self._buffer.length = 0
-  }
-// console.error("FR _read done")
-// that's about all there is to it.
-}
-
-FileReader.prototype.pause = function (who) {
-  var self = this
-  // console.error('FR Pause', self._path)
-  if (self._paused) return
-  who = who || self
-  self._paused = true
-  if (self._stream) self._stream.pause()
-  self.emit('pause', who)
-}
-
-FileReader.prototype.resume = function (who) {
-  var self = this
-  // console.error('FR Resume', self._path)
-  if (!self._paused) return
-  who = who || self
-  self.emit('resume', who)
-  self._paused = false
-  if (self._stream) self._stream.resume()
-  self._read()
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-writer.js
deleted file mode 100644
index 4c803d8d68d2f5169495e1d0f6e6823204d1f67e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/file-writer.js
+++ /dev/null
@@ -1,107 +0,0 @@
-module.exports = FileWriter
-
-var fs = require('graceful-fs')
-var Writer = require('./writer.js')
-var inherits = require('inherits')
-var EOF = {}
-
-inherits(FileWriter, Writer)
-
-function FileWriter (props) {
-  var self = this
-  if (!(self instanceof FileWriter)) {
-    throw new Error('FileWriter must be called as constructor.')
-  }
-
-  // should already be established as a File type
-  if (props.type !== 'File' || !props.File) {
-    throw new Error('Non-file type ' + props.type)
-  }
-
-  self._buffer = []
-  self._bytesWritten = 0
-
-  Writer.call(this, props)
-}
-
-FileWriter.prototype._create = function () {
-  var self = this
-  if (self._stream) return
-
-  var so = {}
-  if (self.props.flags) so.flags = self.props.flags
-  so.mode = Writer.filemode
-  if (self._old && self._old.blksize) so.bufferSize = self._old.blksize
-
-  self._stream = fs.createWriteStream(self._path, so)
-
-  self._stream.on('open', function () {
-    // console.error("FW open", self._buffer, self._path)
-    self.ready = true
-    self._buffer.forEach(function (c) {
-      if (c === EOF) self._stream.end()
-      else self._stream.write(c)
-    })
-    self.emit('ready')
-    // give this a kick just in case it needs it.
-    self.emit('drain')
-  })
-
-  self._stream.on('error', function (er) { self.emit('error', er) })
-
-  self._stream.on('drain', function () { self.emit('drain') })
-
-  self._stream.on('close', function () {
-    // console.error('\n\nFW Stream Close', self._path, self.size)
-    self._finish()
-  })
-}
-
-FileWriter.prototype.write = function (c) {
-  var self = this
-
-  self._bytesWritten += c.length
-
-  if (!self.ready) {
-    if (!Buffer.isBuffer(c) && typeof c !== 'string') {
-      throw new Error('invalid write data')
-    }
-    self._buffer.push(c)
-    return false
-  }
-
-  var ret = self._stream.write(c)
-  // console.error('\t-- fw wrote, _stream says', ret, self._stream._queue.length)
-
-  // allow 2 buffered writes, because otherwise there's just too
-  // much stop and go bs.
-  if (ret === false && self._stream._queue) {
-    return self._stream._queue.length <= 2
-  } else {
-    return ret
-  }
-}
-
-FileWriter.prototype.end = function (c) {
-  var self = this
-
-  if (c) self.write(c)
-
-  if (!self.ready) {
-    self._buffer.push(EOF)
-    return false
-  }
-
-  return self._stream.end()
-}
-
-FileWriter.prototype._finish = function () {
-  var self = this
-  if (typeof self.size === 'number' && self._bytesWritten !== self.size) {
-    self.error(
-      'Did not get expected byte count.\n' +
-      'expect: ' + self.size + '\n' +
-      'actual: ' + self._bytesWritten)
-  }
-  Writer.prototype._finish.call(self)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/get-type.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/get-type.js
deleted file mode 100644
index 19f6a657db84759363c3c20c3d10a8eebb533701..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/get-type.js
+++ /dev/null
@@ -1,33 +0,0 @@
-module.exports = getType
-
-function getType (st) {
-  var types = [
-    'Directory',
-    'File',
-    'SymbolicLink',
-    'Link', // special for hardlinks from tarballs
-    'BlockDevice',
-    'CharacterDevice',
-    'FIFO',
-    'Socket'
-  ]
-  var type
-
-  if (st.type && types.indexOf(st.type) !== -1) {
-    st[st.type] = true
-    return st.type
-  }
-
-  for (var i = 0, l = types.length; i < l; i++) {
-    type = types[i]
-    var is = st[type] || st['is' + type]
-    if (typeof is === 'function') is = is.call(st)
-    if (is) {
-      st[type] = true
-      st.type = type
-      return type
-    }
-  }
-
-  return null
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-reader.js
deleted file mode 100644
index fb4cc67a98dc55ba12f19d809ebd10b42a3a0cd0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-reader.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// Basically just a wrapper around an fs.readlink
-//
-// XXX: Enhance this to support the Link type, by keeping
-// a lookup table of {<dev+inode>:<path>}, so that hardlinks
-// can be preserved in tarballs.
-
-module.exports = LinkReader
-
-var fs = require('graceful-fs')
-var inherits = require('inherits')
-var Reader = require('./reader.js')
-
-inherits(LinkReader, Reader)
-
-function LinkReader (props) {
-  var self = this
-  if (!(self instanceof LinkReader)) {
-    throw new Error('LinkReader must be called as constructor.')
-  }
-
-  if (!((props.type === 'Link' && props.Link) ||
-    (props.type === 'SymbolicLink' && props.SymbolicLink))) {
-    throw new Error('Non-link type ' + props.type)
-  }
-
-  Reader.call(self, props)
-}
-
-// When piping a LinkReader into a LinkWriter, we have to
-// already have the linkpath property set, so that has to
-// happen *before* the "ready" event, which means we need to
-// override the _stat method.
-LinkReader.prototype._stat = function (currentStat) {
-  var self = this
-  fs.readlink(self._path, function (er, linkpath) {
-    if (er) return self.error(er)
-    self.linkpath = self.props.linkpath = linkpath
-    self.emit('linkpath', linkpath)
-    Reader.prototype._stat.call(self, currentStat)
-  })
-}
-
-LinkReader.prototype._read = function () {
-  var self = this
-  if (self._paused) return
-  // basically just a no-op, since we got all the info we need
-  // from the _stat method
-  if (!self._ended) {
-    self.emit('end')
-    self.emit('close')
-    self._ended = true
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-writer.js
deleted file mode 100644
index af54284008faa1f2b9f9ead97d1fc9ecc363da40..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/link-writer.js
+++ /dev/null
@@ -1,95 +0,0 @@
-module.exports = LinkWriter
-
-var fs = require('graceful-fs')
-var Writer = require('./writer.js')
-var inherits = require('inherits')
-var path = require('path')
-var rimraf = require('rimraf')
-
-inherits(LinkWriter, Writer)
-
-function LinkWriter (props) {
-  var self = this
-  if (!(self instanceof LinkWriter)) {
-    throw new Error('LinkWriter must be called as constructor.')
-  }
-
-  // should already be established as a Link type
-  if (!((props.type === 'Link' && props.Link) ||
-    (props.type === 'SymbolicLink' && props.SymbolicLink))) {
-    throw new Error('Non-link type ' + props.type)
-  }
-
-  if (props.linkpath === '') props.linkpath = '.'
-  if (!props.linkpath) {
-    self.error('Need linkpath property to create ' + props.type)
-  }
-
-  Writer.call(this, props)
-}
-
-LinkWriter.prototype._create = function () {
-  // console.error(" LW _create")
-  var self = this
-  var hard = self.type === 'Link' || process.platform === 'win32'
-  var link = hard ? 'link' : 'symlink'
-  var lp = hard ? path.resolve(self.dirname, self.linkpath) : self.linkpath
-
-  // can only change the link path by clobbering
-  // For hard links, let's just assume that's always the case, since
-  // there's no good way to read them if we don't already know.
-  if (hard) return clobber(self, lp, link)
-
-  fs.readlink(self._path, function (er, p) {
-    // only skip creation if it's exactly the same link
-    if (p && p === lp) return finish(self)
-    clobber(self, lp, link)
-  })
-}
-
-function clobber (self, lp, link) {
-  rimraf(self._path, function (er) {
-    if (er) return self.error(er)
-    create(self, lp, link)
-  })
-}
-
-function create (self, lp, link) {
-  fs[link](lp, self._path, function (er) {
-    // if this is a hard link, and we're in the process of writing out a
-    // directory, it's very possible that the thing we're linking to
-    // doesn't exist yet (especially if it was intended as a symlink),
-    // so swallow ENOENT errors here and just soldier in.
-    // Additionally, an EPERM or EACCES can happen on win32 if it's trying
-    // to make a link to a directory.  Again, just skip it.
-    // A better solution would be to have fs.symlink be supported on
-    // windows in some nice fashion.
-    if (er) {
-      if ((er.code === 'ENOENT' ||
-        er.code === 'EACCES' ||
-        er.code === 'EPERM') && process.platform === 'win32') {
-        self.ready = true
-        self.emit('ready')
-        self.emit('end')
-        self.emit('close')
-        self.end = self._finish = function () {}
-      } else return self.error(er)
-    }
-    finish(self)
-  })
-}
-
-function finish (self) {
-  self.ready = true
-  self.emit('ready')
-  if (self._ended && !self._finished) self._finish()
-}
-
-LinkWriter.prototype.end = function () {
-  // console.error("LW finish in end")
-  this._ended = true
-  if (this.ready) {
-    this._finished = true
-    this._finish()
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-reader.js
deleted file mode 100644
index 4f431c9d9e27d39fb7e3c213a8fd39065863ca34..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-reader.js
+++ /dev/null
@@ -1,95 +0,0 @@
-// A reader for when we don't yet know what kind of thing
-// the thing is.
-
-module.exports = ProxyReader
-
-var Reader = require('./reader.js')
-var getType = require('./get-type.js')
-var inherits = require('inherits')
-var fs = require('graceful-fs')
-
-inherits(ProxyReader, Reader)
-
-function ProxyReader (props) {
-  var self = this
-  if (!(self instanceof ProxyReader)) {
-    throw new Error('ProxyReader must be called as constructor.')
-  }
-
-  self.props = props
-  self._buffer = []
-  self.ready = false
-
-  Reader.call(self, props)
-}
-
-ProxyReader.prototype._stat = function () {
-  var self = this
-  var props = self.props
-  // stat the thing to see what the proxy should be.
-  var stat = props.follow ? 'stat' : 'lstat'
-
-  fs[stat](props.path, function (er, current) {
-    var type
-    if (er || !current) {
-      type = 'File'
-    } else {
-      type = getType(current)
-    }
-
-    props[type] = true
-    props.type = self.type = type
-
-    self._old = current
-    self._addProxy(Reader(props, current))
-  })
-}
-
-ProxyReader.prototype._addProxy = function (proxy) {
-  var self = this
-  if (self._proxyTarget) {
-    return self.error('proxy already set')
-  }
-
-  self._proxyTarget = proxy
-  proxy._proxy = self
-
-  ;[
-    'error',
-    'data',
-    'end',
-    'close',
-    'linkpath',
-    'entry',
-    'entryEnd',
-    'child',
-    'childEnd',
-    'warn',
-    'stat'
-  ].forEach(function (ev) {
-    // console.error('~~ proxy event', ev, self.path)
-    proxy.on(ev, self.emit.bind(self, ev))
-  })
-
-  self.emit('proxy', proxy)
-
-  proxy.on('ready', function () {
-    // console.error("~~ proxy is ready!", self.path)
-    self.ready = true
-    self.emit('ready')
-  })
-
-  var calls = self._buffer
-  self._buffer.length = 0
-  calls.forEach(function (c) {
-    proxy[c[0]].apply(proxy, c[1])
-  })
-}
-
-ProxyReader.prototype.pause = function () {
-  return this._proxyTarget ? this._proxyTarget.pause() : false
-}
-
-ProxyReader.prototype.resume = function () {
-  return this._proxyTarget ? this._proxyTarget.resume() : false
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-writer.js
deleted file mode 100644
index a6544621bfbe7510fcc4b0a5e28bdd8599af4044..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/proxy-writer.js
+++ /dev/null
@@ -1,111 +0,0 @@
-// A writer for when we don't know what kind of thing
-// the thing is.  That is, it's not explicitly set,
-// so we're going to make it whatever the thing already
-// is, or "File"
-//
-// Until then, collect all events.
-
-module.exports = ProxyWriter
-
-var Writer = require('./writer.js')
-var getType = require('./get-type.js')
-var inherits = require('inherits')
-var collect = require('./collect.js')
-var fs = require('fs')
-
-inherits(ProxyWriter, Writer)
-
-function ProxyWriter (props) {
-  var self = this
-  if (!(self instanceof ProxyWriter)) {
-    throw new Error('ProxyWriter must be called as constructor.')
-  }
-
-  self.props = props
-  self._needDrain = false
-
-  Writer.call(self, props)
-}
-
-ProxyWriter.prototype._stat = function () {
-  var self = this
-  var props = self.props
-  // stat the thing to see what the proxy should be.
-  var stat = props.follow ? 'stat' : 'lstat'
-
-  fs[stat](props.path, function (er, current) {
-    var type
-    if (er || !current) {
-      type = 'File'
-    } else {
-      type = getType(current)
-    }
-
-    props[type] = true
-    props.type = self.type = type
-
-    self._old = current
-    self._addProxy(Writer(props, current))
-  })
-}
-
-ProxyWriter.prototype._addProxy = function (proxy) {
-  // console.error("~~ set proxy", this.path)
-  var self = this
-  if (self._proxy) {
-    return self.error('proxy already set')
-  }
-
-  self._proxy = proxy
-  ;[
-    'ready',
-    'error',
-    'close',
-    'pipe',
-    'drain',
-    'warn'
-  ].forEach(function (ev) {
-    proxy.on(ev, self.emit.bind(self, ev))
-  })
-
-  self.emit('proxy', proxy)
-
-  var calls = self._buffer
-  calls.forEach(function (c) {
-    // console.error("~~ ~~ proxy buffered call", c[0], c[1])
-    proxy[c[0]].apply(proxy, c[1])
-  })
-  self._buffer.length = 0
-  if (self._needsDrain) self.emit('drain')
-}
-
-ProxyWriter.prototype.add = function (entry) {
-  // console.error("~~ proxy add")
-  collect(entry)
-
-  if (!this._proxy) {
-    this._buffer.push(['add', [entry]])
-    this._needDrain = true
-    return false
-  }
-  return this._proxy.add(entry)
-}
-
-ProxyWriter.prototype.write = function (c) {
-  // console.error('~~ proxy write')
-  if (!this._proxy) {
-    this._buffer.push(['write', [c]])
-    this._needDrain = true
-    return false
-  }
-  return this._proxy.write(c)
-}
-
-ProxyWriter.prototype.end = function (c) {
-  // console.error('~~ proxy end')
-  if (!this._proxy) {
-    this._buffer.push(['end', [c]])
-    return false
-  }
-  return this._proxy.end(c)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/reader.js
deleted file mode 100644
index 876021f92bc9a208714b872f72e2c62c4c5e6f9e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/reader.js
+++ /dev/null
@@ -1,255 +0,0 @@
-module.exports = Reader
-
-var fs = require('graceful-fs')
-var Stream = require('stream').Stream
-var inherits = require('inherits')
-var path = require('path')
-var getType = require('./get-type.js')
-var hardLinks = Reader.hardLinks = {}
-var Abstract = require('./abstract.js')
-
-// Must do this *before* loading the child classes
-inherits(Reader, Abstract)
-
-var LinkReader = require('./link-reader.js')
-
-function Reader (props, currentStat) {
-  var self = this
-  if (!(self instanceof Reader)) return new Reader(props, currentStat)
-
-  if (typeof props === 'string') {
-    props = { path: props }
-  }
-
-  if (!props.path) {
-    self.error('Must provide a path', null, true)
-  }
-
-  // polymorphism.
-  // call fstream.Reader(dir) to get a DirReader object, etc.
-  // Note that, unlike in the Writer case, ProxyReader is going
-  // to be the *normal* state of affairs, since we rarely know
-  // the type of a file prior to reading it.
-
-  var type
-  var ClassType
-
-  if (props.type && typeof props.type === 'function') {
-    type = props.type
-    ClassType = type
-  } else {
-    type = getType(props)
-    ClassType = Reader
-  }
-
-  if (currentStat && !type) {
-    type = getType(currentStat)
-    props[type] = true
-    props.type = type
-  }
-
-  switch (type) {
-    case 'Directory':
-      ClassType = require('./dir-reader.js')
-      break
-
-    case 'Link':
-    // XXX hard links are just files.
-    // However, it would be good to keep track of files' dev+inode
-    // and nlink values, and create a HardLinkReader that emits
-    // a linkpath value of the original copy, so that the tar
-    // writer can preserve them.
-    // ClassType = HardLinkReader
-    // break
-
-    case 'File':
-      ClassType = require('./file-reader.js')
-      break
-
-    case 'SymbolicLink':
-      ClassType = LinkReader
-      break
-
-    case 'Socket':
-      ClassType = require('./socket-reader.js')
-      break
-
-    case null:
-      ClassType = require('./proxy-reader.js')
-      break
-  }
-
-  if (!(self instanceof ClassType)) {
-    return new ClassType(props)
-  }
-
-  Abstract.call(self)
-
-  self.readable = true
-  self.writable = false
-
-  self.type = type
-  self.props = props
-  self.depth = props.depth = props.depth || 0
-  self.parent = props.parent || null
-  self.root = props.root || (props.parent && props.parent.root) || self
-
-  self._path = self.path = path.resolve(props.path)
-  if (process.platform === 'win32') {
-    self.path = self._path = self.path.replace(/\?/g, '_')
-    if (self._path.length >= 260) {
-      // how DOES one create files on the moon?
-      // if the path has spaces in it, then UNC will fail.
-      self._swallowErrors = true
-      // if (self._path.indexOf(" ") === -1) {
-      self._path = '\\\\?\\' + self.path.replace(/\//g, '\\')
-    // }
-    }
-  }
-  self.basename = props.basename = path.basename(self.path)
-  self.dirname = props.dirname = path.dirname(self.path)
-
-  // these have served their purpose, and are now just noisy clutter
-  props.parent = props.root = null
-
-  // console.error("\n\n\n%s setting size to", props.path, props.size)
-  self.size = props.size
-  self.filter = typeof props.filter === 'function' ? props.filter : null
-  if (props.sort === 'alpha') props.sort = alphasort
-
-  // start the ball rolling.
-  // this will stat the thing, and then call self._read()
-  // to start reading whatever it is.
-  // console.error("calling stat", props.path, currentStat)
-  self._stat(currentStat)
-}
-
-function alphasort (a, b) {
-  return a === b ? 0
-    : a.toLowerCase() > b.toLowerCase() ? 1
-      : a.toLowerCase() < b.toLowerCase() ? -1
-        : a > b ? 1
-          : -1
-}
-
-Reader.prototype._stat = function (currentStat) {
-  var self = this
-  var props = self.props
-  var stat = props.follow ? 'stat' : 'lstat'
-  // console.error("Reader._stat", self._path, currentStat)
-  if (currentStat) process.nextTick(statCb.bind(null, null, currentStat))
-  else fs[stat](self._path, statCb)
-
-  function statCb (er, props_) {
-    // console.error("Reader._stat, statCb", self._path, props_, props_.nlink)
-    if (er) return self.error(er)
-
-    Object.keys(props_).forEach(function (k) {
-      props[k] = props_[k]
-    })
-
-    // if it's not the expected size, then abort here.
-    if (undefined !== self.size && props.size !== self.size) {
-      return self.error('incorrect size')
-    }
-    self.size = props.size
-
-    var type = getType(props)
-    var handleHardlinks = props.hardlinks !== false
-
-    // special little thing for handling hardlinks.
-    if (handleHardlinks && type !== 'Directory' && props.nlink && props.nlink > 1) {
-      var k = props.dev + ':' + props.ino
-      // console.error("Reader has nlink", self._path, k)
-      if (hardLinks[k] === self._path || !hardLinks[k]) {
-        hardLinks[k] = self._path
-      } else {
-        // switch into hardlink mode.
-        type = self.type = self.props.type = 'Link'
-        self.Link = self.props.Link = true
-        self.linkpath = self.props.linkpath = hardLinks[k]
-        // console.error("Hardlink detected, switching mode", self._path, self.linkpath)
-        // Setting __proto__ would arguably be the "correct"
-        // approach here, but that just seems too wrong.
-        self._stat = self._read = LinkReader.prototype._read
-      }
-    }
-
-    if (self.type && self.type !== type) {
-      self.error('Unexpected type: ' + type)
-    }
-
-    // if the filter doesn't pass, then just skip over this one.
-    // still have to emit end so that dir-walking can move on.
-    if (self.filter) {
-      var who = self._proxy || self
-      // special handling for ProxyReaders
-      if (!self.filter.call(who, who, props)) {
-        if (!self._disowned) {
-          self.abort()
-          self.emit('end')
-          self.emit('close')
-        }
-        return
-      }
-    }
-
-    // last chance to abort or disown before the flow starts!
-    var events = ['_stat', 'stat', 'ready']
-    var e = 0
-    ;(function go () {
-      if (self._aborted) {
-        self.emit('end')
-        self.emit('close')
-        return
-      }
-
-      if (self._paused && self.type !== 'Directory') {
-        self.once('resume', go)
-        return
-      }
-
-      var ev = events[e++]
-      if (!ev) {
-        return self._read()
-      }
-      self.emit(ev, props)
-      go()
-    })()
-  }
-}
-
-Reader.prototype.pipe = function (dest) {
-  var self = this
-  if (typeof dest.add === 'function') {
-    // piping to a multi-compatible, and we've got directory entries.
-    self.on('entry', function (entry) {
-      var ret = dest.add(entry)
-      if (ret === false) {
-        self.pause()
-      }
-    })
-  }
-
-  // console.error("R Pipe apply Stream Pipe")
-  return Stream.prototype.pipe.apply(this, arguments)
-}
-
-Reader.prototype.pause = function (who) {
-  this._paused = true
-  who = who || this
-  this.emit('pause', who)
-  if (this._stream) this._stream.pause(who)
-}
-
-Reader.prototype.resume = function (who) {
-  this._paused = false
-  who = who || this
-  this.emit('resume', who)
-  if (this._stream) this._stream.resume(who)
-  this._read()
-}
-
-Reader.prototype._read = function () {
-  this.error('Cannot read unknown type: ' + this.type)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/socket-reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/socket-reader.js
deleted file mode 100644
index e0456ba890ede83e9ceeba637d97805a233c43bf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/socket-reader.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// Just get the stats, and then don't do anything.
-// You can't really "read" from a socket.  You "connect" to it.
-// Mostly, this is here so that reading a dir with a socket in it
-// doesn't blow up.
-
-module.exports = SocketReader
-
-var inherits = require('inherits')
-var Reader = require('./reader.js')
-
-inherits(SocketReader, Reader)
-
-function SocketReader (props) {
-  var self = this
-  if (!(self instanceof SocketReader)) {
-    throw new Error('SocketReader must be called as constructor.')
-  }
-
-  if (!(props.type === 'Socket' && props.Socket)) {
-    throw new Error('Non-socket type ' + props.type)
-  }
-
-  Reader.call(self, props)
-}
-
-SocketReader.prototype._read = function () {
-  var self = this
-  if (self._paused) return
-  // basically just a no-op, since we got all the info we have
-  // from the _stat method
-  if (!self._ended) {
-    self.emit('end')
-    self.emit('close')
-    self._ended = true
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/writer.js
deleted file mode 100644
index ca3396b5d14fd4e93f8c37881c9474ba22caadce..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/lib/writer.js
+++ /dev/null
@@ -1,390 +0,0 @@
-module.exports = Writer
-
-var fs = require('graceful-fs')
-var inherits = require('inherits')
-var rimraf = require('rimraf')
-var mkdir = require('mkdirp')
-var path = require('path')
-var umask = process.platform === 'win32' ? 0 : process.umask()
-var getType = require('./get-type.js')
-var Abstract = require('./abstract.js')
-
-// Must do this *before* loading the child classes
-inherits(Writer, Abstract)
-
-Writer.dirmode = parseInt('0777', 8) & (~umask)
-Writer.filemode = parseInt('0666', 8) & (~umask)
-
-var DirWriter = require('./dir-writer.js')
-var LinkWriter = require('./link-writer.js')
-var FileWriter = require('./file-writer.js')
-var ProxyWriter = require('./proxy-writer.js')
-
-// props is the desired state.  current is optionally the current stat,
-// provided here so that subclasses can avoid statting the target
-// more than necessary.
-function Writer (props, current) {
-  var self = this
-
-  if (typeof props === 'string') {
-    props = { path: props }
-  }
-
-  if (!props.path) self.error('Must provide a path', null, true)
-
-  // polymorphism.
-  // call fstream.Writer(dir) to get a DirWriter object, etc.
-  var type = getType(props)
-  var ClassType = Writer
-
-  switch (type) {
-    case 'Directory':
-      ClassType = DirWriter
-      break
-    case 'File':
-      ClassType = FileWriter
-      break
-    case 'Link':
-    case 'SymbolicLink':
-      ClassType = LinkWriter
-      break
-    case null:
-    default:
-      // Don't know yet what type to create, so we wrap in a proxy.
-      ClassType = ProxyWriter
-      break
-  }
-
-  if (!(self instanceof ClassType)) return new ClassType(props)
-
-  // now get down to business.
-
-  Abstract.call(self)
-
-  // props is what we want to set.
-  // set some convenience properties as well.
-  self.type = props.type
-  self.props = props
-  self.depth = props.depth || 0
-  self.clobber = props.clobber === false ? props.clobber : true
-  self.parent = props.parent || null
-  self.root = props.root || (props.parent && props.parent.root) || self
-
-  self._path = self.path = path.resolve(props.path)
-  if (process.platform === 'win32') {
-    self.path = self._path = self.path.replace(/\?/g, '_')
-    if (self._path.length >= 260) {
-      self._swallowErrors = true
-      self._path = '\\\\?\\' + self.path.replace(/\//g, '\\')
-    }
-  }
-  self.basename = path.basename(props.path)
-  self.dirname = path.dirname(props.path)
-  self.linkpath = props.linkpath || null
-
-  props.parent = props.root = null
-
-  // console.error("\n\n\n%s setting size to", props.path, props.size)
-  self.size = props.size
-
-  if (typeof props.mode === 'string') {
-    props.mode = parseInt(props.mode, 8)
-  }
-
-  self.readable = false
-  self.writable = true
-
-  // buffer until ready, or while handling another entry
-  self._buffer = []
-  self.ready = false
-
-  self.filter = typeof props.filter === 'function' ? props.filter : null
-
-  // start the ball rolling.
-  // this checks what's there already, and then calls
-  // self._create() to call the impl-specific creation stuff.
-  self._stat(current)
-}
-
-// Calling this means that it's something we can't create.
-// Just assert that it's already there, otherwise raise a warning.
-Writer.prototype._create = function () {
-  var self = this
-  fs[self.props.follow ? 'stat' : 'lstat'](self._path, function (er) {
-    if (er) {
-      return self.warn('Cannot create ' + self._path + '\n' +
-        'Unsupported type: ' + self.type, 'ENOTSUP')
-    }
-    self._finish()
-  })
-}
-
-Writer.prototype._stat = function (current) {
-  var self = this
-  var props = self.props
-  var stat = props.follow ? 'stat' : 'lstat'
-  var who = self._proxy || self
-
-  if (current) statCb(null, current)
-  else fs[stat](self._path, statCb)
-
-  function statCb (er, current) {
-    if (self.filter && !self.filter.call(who, who, current)) {
-      self._aborted = true
-      self.emit('end')
-      self.emit('close')
-      return
-    }
-
-    // if it's not there, great.  We'll just create it.
-    // if it is there, then we'll need to change whatever differs
-    if (er || !current) {
-      return create(self)
-    }
-
-    self._old = current
-    var currentType = getType(current)
-
-    // if it's a type change, then we need to clobber or error.
-    // if it's not a type change, then let the impl take care of it.
-    if (currentType !== self.type) {
-      return rimraf(self._path, function (er) {
-        if (er) return self.error(er)
-        self._old = null
-        create(self)
-      })
-    }
-
-    // otherwise, just handle in the app-specific way
-    // this creates a fs.WriteStream, or mkdir's, or whatever
-    create(self)
-  }
-}
-
-function create (self) {
-  // console.error("W create", self._path, Writer.dirmode)
-
-  // XXX Need to clobber non-dirs that are in the way,
-  // unless { clobber: false } in the props.
-  mkdir(path.dirname(self._path), Writer.dirmode, function (er, made) {
-    // console.error("W created", path.dirname(self._path), er)
-    if (er) return self.error(er)
-
-    // later on, we have to set the mode and owner for these
-    self._madeDir = made
-    return self._create()
-  })
-}
-
-function endChmod (self, want, current, path, cb) {
-  var wantMode = want.mode
-  var chmod = want.follow || self.type !== 'SymbolicLink'
-    ? 'chmod' : 'lchmod'
-
-  if (!fs[chmod]) return cb()
-  if (typeof wantMode !== 'number') return cb()
-
-  var curMode = current.mode & parseInt('0777', 8)
-  wantMode = wantMode & parseInt('0777', 8)
-  if (wantMode === curMode) return cb()
-
-  fs[chmod](path, wantMode, cb)
-}
-
-function endChown (self, want, current, path, cb) {
-  // Don't even try it unless root.  Too easy to EPERM.
-  if (process.platform === 'win32') return cb()
-  if (!process.getuid || process.getuid() !== 0) return cb()
-  if (typeof want.uid !== 'number' &&
-    typeof want.gid !== 'number') return cb()
-
-  if (current.uid === want.uid &&
-    current.gid === want.gid) return cb()
-
-  var chown = (self.props.follow || self.type !== 'SymbolicLink')
-    ? 'chown' : 'lchown'
-  if (!fs[chown]) return cb()
-
-  if (typeof want.uid !== 'number') want.uid = current.uid
-  if (typeof want.gid !== 'number') want.gid = current.gid
-
-  fs[chown](path, want.uid, want.gid, cb)
-}
-
-function endUtimes (self, want, current, path, cb) {
-  if (!fs.utimes || process.platform === 'win32') return cb()
-
-  var utimes = (want.follow || self.type !== 'SymbolicLink')
-    ? 'utimes' : 'lutimes'
-
-  if (utimes === 'lutimes' && !fs[utimes]) {
-    utimes = 'utimes'
-  }
-
-  if (!fs[utimes]) return cb()
-
-  var curA = current.atime
-  var curM = current.mtime
-  var meA = want.atime
-  var meM = want.mtime
-
-  if (meA === undefined) meA = curA
-  if (meM === undefined) meM = curM
-
-  if (!isDate(meA)) meA = new Date(meA)
-  if (!isDate(meM)) meA = new Date(meM)
-
-  if (meA.getTime() === curA.getTime() &&
-    meM.getTime() === curM.getTime()) return cb()
-
-  fs[utimes](path, meA, meM, cb)
-}
-
-// XXX This function is beastly.  Break it up!
-Writer.prototype._finish = function () {
-  var self = this
-
-  if (self._finishing) return
-  self._finishing = true
-
-  // console.error(" W Finish", self._path, self.size)
-
-  // set up all the things.
-  // At this point, we're already done writing whatever we've gotta write,
-  // adding files to the dir, etc.
-  var todo = 0
-  var errState = null
-  var done = false
-
-  if (self._old) {
-    // the times will almost *certainly* have changed.
-    // adds the utimes syscall, but remove another stat.
-    self._old.atime = new Date(0)
-    self._old.mtime = new Date(0)
-    // console.error(" W Finish Stale Stat", self._path, self.size)
-    setProps(self._old)
-  } else {
-    var stat = self.props.follow ? 'stat' : 'lstat'
-    // console.error(" W Finish Stating", self._path, self.size)
-    fs[stat](self._path, function (er, current) {
-      // console.error(" W Finish Stated", self._path, self.size, current)
-      if (er) {
-        // if we're in the process of writing out a
-        // directory, it's very possible that the thing we're linking to
-        // doesn't exist yet (especially if it was intended as a symlink),
-        // so swallow ENOENT errors here and just soldier on.
-        if (er.code === 'ENOENT' &&
-          (self.type === 'Link' || self.type === 'SymbolicLink') &&
-          process.platform === 'win32') {
-          self.ready = true
-          self.emit('ready')
-          self.emit('end')
-          self.emit('close')
-          self.end = self._finish = function () {}
-          return
-        } else return self.error(er)
-      }
-      setProps(self._old = current)
-    })
-  }
-
-  return
-
-  function setProps (current) {
-    todo += 3
-    endChmod(self, self.props, current, self._path, next('chmod'))
-    endChown(self, self.props, current, self._path, next('chown'))
-    endUtimes(self, self.props, current, self._path, next('utimes'))
-  }
-
-  function next (what) {
-    return function (er) {
-      // console.error("   W Finish", what, todo)
-      if (errState) return
-      if (er) {
-        er.fstream_finish_call = what
-        return self.error(errState = er)
-      }
-      if (--todo > 0) return
-      if (done) return
-      done = true
-
-      // we may still need to set the mode/etc. on some parent dirs
-      // that were created previously.  delay end/close until then.
-      if (!self._madeDir) return end()
-      else endMadeDir(self, self._path, end)
-
-      function end (er) {
-        if (er) {
-          er.fstream_finish_call = 'setupMadeDir'
-          return self.error(er)
-        }
-        // all the props have been set, so we're completely done.
-        self.emit('end')
-        self.emit('close')
-      }
-    }
-  }
-}
-
-function endMadeDir (self, p, cb) {
-  var made = self._madeDir
-  // everything *between* made and path.dirname(self._path)
-  // needs to be set up.  Note that this may just be one dir.
-  var d = path.dirname(p)
-
-  endMadeDir_(self, d, function (er) {
-    if (er) return cb(er)
-    if (d === made) {
-      return cb()
-    }
-    endMadeDir(self, d, cb)
-  })
-}
-
-function endMadeDir_ (self, p, cb) {
-  var dirProps = {}
-  Object.keys(self.props).forEach(function (k) {
-    dirProps[k] = self.props[k]
-
-    // only make non-readable dirs if explicitly requested.
-    if (k === 'mode' && self.type !== 'Directory') {
-      dirProps[k] = dirProps[k] | parseInt('0111', 8)
-    }
-  })
-
-  var todo = 3
-  var errState = null
-  fs.stat(p, function (er, current) {
-    if (er) return cb(errState = er)
-    endChmod(self, dirProps, current, p, next)
-    endChown(self, dirProps, current, p, next)
-    endUtimes(self, dirProps, current, p, next)
-  })
-
-  function next (er) {
-    if (errState) return
-    if (er) return cb(errState = er)
-    if (--todo === 0) return cb()
-  }
-}
-
-Writer.prototype.pipe = function () {
-  this.error("Can't pipe from writable stream")
-}
-
-Writer.prototype.add = function () {
-  this.error("Can't add to non-Directory type")
-}
-
-Writer.prototype.write = function () {
-  return true
-}
-
-function objectToString (d) {
-  return Object.prototype.toString.call(d)
-}
-
-function isDate (d) {
-  return typeof d === 'object' && objectToString(d) === '[object Date]'
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/LICENSE
deleted file mode 100644
index 9d2c8036969bedd4ea9041a1e154306d7424662c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/README.md
deleted file mode 100644
index d0dcd492549537997127861d902b96419c8d6c93..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/README.md
+++ /dev/null
@@ -1,133 +0,0 @@
-# graceful-fs
-
-graceful-fs functions as a drop-in replacement for the fs module,
-making various improvements.
-
-The improvements are meant to normalize behavior across different
-platforms and environments, and to make filesystem access more
-resilient to errors.
-
-## Improvements over [fs module](http://api.nodejs.org/fs.html)
-
-* Queues up `open` and `readdir` calls, and retries them once
-  something closes if there is an EMFILE error from too many file
-  descriptors.
-* fixes `lchmod` for Node versions prior to 0.6.2.
-* implements `fs.lutimes` if possible. Otherwise it becomes a noop.
-* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or
-  `lchown` if the user isn't root.
-* makes `lchmod` and `lchown` become noops, if not available.
-* retries reading a file if `read` results in EAGAIN error.
-
-On Windows, it retries renaming a file for up to one second if `EACCESS`
-or `EPERM` error occurs, likely because antivirus software has locked
-the directory.
-
-## USAGE
-
-```javascript
-// use just like fs
-var fs = require('graceful-fs')
-
-// now go and do stuff with it...
-fs.readFileSync('some-file-or-whatever')
-```
-
-## Global Patching
-
-If you want to patch the global fs module (or any other fs-like
-module) you can do this:
-
-```javascript
-// Make sure to read the caveat below.
-var realFs = require('fs')
-var gracefulFs = require('graceful-fs')
-gracefulFs.gracefulify(realFs)
-```
-
-This should only ever be done at the top-level application layer, in
-order to delay on EMFILE errors from any fs-using dependencies.  You
-should **not** do this in a library, because it can cause unexpected
-delays in other parts of the program.
-
-## Changes
-
-This module is fairly stable at this point, and used by a lot of
-things.  That being said, because it implements a subtle behavior
-change in a core part of the node API, even modest changes can be
-extremely breaking, and the versioning is thus biased towards
-bumping the major when in doubt.
-
-The main change between major versions has been switching between
-providing a fully-patched `fs` module vs monkey-patching the node core
-builtin, and the approach by which a non-monkey-patched `fs` was
-created.
-
-The goal is to trade `EMFILE` errors for slower fs operations.  So, if
-you try to open a zillion files, rather than crashing, `open`
-operations will be queued up and wait for something else to `close`.
-
-There are advantages to each approach.  Monkey-patching the fs means
-that no `EMFILE` errors can possibly occur anywhere in your
-application, because everything is using the same core `fs` module,
-which is patched.  However, it can also obviously cause undesirable
-side-effects, especially if the module is loaded multiple times.
-
-Implementing a separate-but-identical patched `fs` module is more
-surgical (and doesn't run the risk of patching multiple times), but
-also imposes the challenge of keeping in sync with the core module.
-
-The current approach loads the `fs` module, and then creates a
-lookalike object that has all the same methods, except a few that are
-patched.  It is safe to use in all versions of Node from 0.8 through
-7.0.
-
-### v4
-
-* Do not monkey-patch the fs module.  This module may now be used as a
-  drop-in dep, and users can opt into monkey-patching the fs builtin
-  if their app requires it.
-
-### v3
-
-* Monkey-patch fs, because the eval approach no longer works on recent
-  node.
-* fixed possible type-error throw if rename fails on windows
-* verify that we *never* get EMFILE errors
-* Ignore ENOSYS from chmod/chown
-* clarify that graceful-fs must be used as a drop-in
-
-### v2.1.0
-
-* Use eval rather than monkey-patching fs.
-* readdir: Always sort the results
-* win32: requeue a file if error has an OK status
-
-### v2.0
-
-* A return to monkey patching
-* wrap process.cwd
-
-### v1.1
-
-* wrap readFile
-* Wrap fs.writeFile.
-* readdir protection
-* Don't clobber the fs builtin
-* Handle fs.read EAGAIN errors by trying again
-* Expose the curOpen counter
-* No-op lchown/lchmod if not implemented
-* fs.rename patch only for win32
-* Patch fs.rename to handle AV software on Windows
-* Close #4 Chown should not fail on einval or eperm if non-root
-* Fix isaacs/fstream#1 Only wrap fs one time
-* Fix #3 Start at 1024 max files, then back off on EMFILE
-* lutimes that doens't blow up on Linux
-* A full on-rewrite using a queue instead of just swallowing the EMFILE error
-* Wrap Read/Write streams as well
-
-### 1.0
-
-* Update engines for node 0.6
-* Be lstat-graceful on Windows
-* first
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/fs.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/fs.js
deleted file mode 100644
index 8ad4a383965b7be33e32a8c7ee9a0b944f78ff22..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/fs.js
+++ /dev/null
@@ -1,21 +0,0 @@
-'use strict'
-
-var fs = require('fs')
-
-module.exports = clone(fs)
-
-function clone (obj) {
-  if (obj === null || typeof obj !== 'object')
-    return obj
-
-  if (obj instanceof Object)
-    var copy = { __proto__: obj.__proto__ }
-  else
-    var copy = Object.create(null)
-
-  Object.getOwnPropertyNames(obj).forEach(function (key) {
-    Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key))
-  })
-
-  return copy
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js
deleted file mode 100644
index 9bf803e686c70393adbcb7c4b3c97989a2e39311..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js
+++ /dev/null
@@ -1,253 +0,0 @@
-var fs = require('fs')
-var polyfills = require('./polyfills.js')
-var legacy = require('./legacy-streams.js')
-var queue = []
-
-var util = require('util')
-
-function noop () {}
-
-var debug = noop
-if (util.debuglog)
-  debug = util.debuglog('gfs4')
-else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || ''))
-  debug = function() {
-    var m = util.format.apply(util, arguments)
-    m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ')
-    console.error(m)
-  }
-
-if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) {
-  process.on('exit', function() {
-    debug(queue)
-    require('assert').equal(queue.length, 0)
-  })
-}
-
-module.exports = patch(require('./fs.js'))
-if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) {
-  module.exports = patch(fs)
-}
-
-// Always patch fs.close/closeSync, because we want to
-// retry() whenever a close happens *anywhere* in the program.
-// This is essential when multiple graceful-fs instances are
-// in play at the same time.
-module.exports.close =
-fs.close = (function (fs$close) { return function (fd, cb) {
-  return fs$close.call(fs, fd, function (err) {
-    if (!err)
-      retry()
-
-    if (typeof cb === 'function')
-      cb.apply(this, arguments)
-  })
-}})(fs.close)
-
-module.exports.closeSync =
-fs.closeSync = (function (fs$closeSync) { return function (fd) {
-  // Note that graceful-fs also retries when fs.closeSync() fails.
-  // Looks like a bug to me, although it's probably a harmless one.
-  var rval = fs$closeSync.apply(fs, arguments)
-  retry()
-  return rval
-}})(fs.closeSync)
-
-function patch (fs) {
-  // Everything that references the open() function needs to be in here
-  polyfills(fs)
-  fs.gracefulify = patch
-  fs.FileReadStream = ReadStream;  // Legacy name.
-  fs.FileWriteStream = WriteStream;  // Legacy name.
-  fs.createReadStream = createReadStream
-  fs.createWriteStream = createWriteStream
-  var fs$readFile = fs.readFile
-  fs.readFile = readFile
-  function readFile (path, options, cb) {
-    if (typeof options === 'function')
-      cb = options, options = null
-
-    return go$readFile(path, options, cb)
-
-    function go$readFile (path, options, cb) {
-      return fs$readFile(path, options, function (err) {
-        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
-          enqueue([go$readFile, [path, options, cb]])
-        else {
-          if (typeof cb === 'function')
-            cb.apply(this, arguments)
-          retry()
-        }
-      })
-    }
-  }
-
-  var fs$writeFile = fs.writeFile
-  fs.writeFile = writeFile
-  function writeFile (path, data, options, cb) {
-    if (typeof options === 'function')
-      cb = options, options = null
-
-    return go$writeFile(path, data, options, cb)
-
-    function go$writeFile (path, data, options, cb) {
-      return fs$writeFile(path, data, options, function (err) {
-        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
-          enqueue([go$writeFile, [path, data, options, cb]])
-        else {
-          if (typeof cb === 'function')
-            cb.apply(this, arguments)
-          retry()
-        }
-      })
-    }
-  }
-
-  var fs$appendFile = fs.appendFile
-  if (fs$appendFile)
-    fs.appendFile = appendFile
-  function appendFile (path, data, options, cb) {
-    if (typeof options === 'function')
-      cb = options, options = null
-
-    return go$appendFile(path, data, options, cb)
-
-    function go$appendFile (path, data, options, cb) {
-      return fs$appendFile(path, data, options, function (err) {
-        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
-          enqueue([go$appendFile, [path, data, options, cb]])
-        else {
-          if (typeof cb === 'function')
-            cb.apply(this, arguments)
-          retry()
-        }
-      })
-    }
-  }
-
-  var fs$readdir = fs.readdir
-  fs.readdir = readdir
-  function readdir (path, cb) {
-    return go$readdir(path, cb)
-
-    function go$readdir () {
-      return fs$readdir(path, function (err, files) {
-        if (files && files.sort)
-          files.sort();  // Backwards compatibility with graceful-fs.
-
-        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
-          enqueue([go$readdir, [path, cb]])
-        else {
-          if (typeof cb === 'function')
-            cb.apply(this, arguments)
-          retry()
-        }
-      })
-    }
-  }
-
-
-  if (process.version.substr(0, 4) === 'v0.8') {
-    var legStreams = legacy(fs)
-    ReadStream = legStreams.ReadStream
-    WriteStream = legStreams.WriteStream
-  }
-
-  var fs$ReadStream = fs.ReadStream
-  ReadStream.prototype = Object.create(fs$ReadStream.prototype)
-  ReadStream.prototype.open = ReadStream$open
-
-  var fs$WriteStream = fs.WriteStream
-  WriteStream.prototype = Object.create(fs$WriteStream.prototype)
-  WriteStream.prototype.open = WriteStream$open
-
-  fs.ReadStream = ReadStream
-  fs.WriteStream = WriteStream
-
-  function ReadStream (path, options) {
-    if (this instanceof ReadStream)
-      return fs$ReadStream.apply(this, arguments), this
-    else
-      return ReadStream.apply(Object.create(ReadStream.prototype), arguments)
-  }
-
-  function ReadStream$open () {
-    var that = this
-    open(that.path, that.flags, that.mode, function (err, fd) {
-      if (err) {
-        if (that.autoClose)
-          that.destroy()
-
-        that.emit('error', err)
-      } else {
-        that.fd = fd
-        that.emit('open', fd)
-        that.read()
-      }
-    })
-  }
-
-  function WriteStream (path, options) {
-    if (this instanceof WriteStream)
-      return fs$WriteStream.apply(this, arguments), this
-    else
-      return WriteStream.apply(Object.create(WriteStream.prototype), arguments)
-  }
-
-  function WriteStream$open () {
-    var that = this
-    open(that.path, that.flags, that.mode, function (err, fd) {
-      if (err) {
-        that.destroy()
-        that.emit('error', err)
-      } else {
-        that.fd = fd
-        that.emit('open', fd)
-      }
-    })
-  }
-
-  function createReadStream (path, options) {
-    return new ReadStream(path, options)
-  }
-
-  function createWriteStream (path, options) {
-    return new WriteStream(path, options)
-  }
-
-  var fs$open = fs.open
-  fs.open = open
-  function open (path, flags, mode, cb) {
-    if (typeof mode === 'function')
-      cb = mode, mode = null
-
-    return go$open(path, flags, mode, cb)
-
-    function go$open (path, flags, mode, cb) {
-      return fs$open(path, flags, mode, function (err, fd) {
-        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
-          enqueue([go$open, [path, flags, mode, cb]])
-        else {
-          if (typeof cb === 'function')
-            cb.apply(this, arguments)
-          retry()
-        }
-      })
-    }
-  }
-
-  return fs
-}
-
-function enqueue (elem) {
-  debug('ENQUEUE', elem[0].name, elem[1])
-  queue.push(elem)
-}
-
-function retry () {
-  var elem = queue.shift()
-  if (elem) {
-    debug('RETRY', elem[0].name, elem[1])
-    elem[0].apply(null, elem[1])
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/legacy-streams.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/legacy-streams.js
deleted file mode 100644
index d617b50fc0832dcce4ba05f7a7200938438ead90..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/legacy-streams.js
+++ /dev/null
@@ -1,118 +0,0 @@
-var Stream = require('stream').Stream
-
-module.exports = legacy
-
-function legacy (fs) {
-  return {
-    ReadStream: ReadStream,
-    WriteStream: WriteStream
-  }
-
-  function ReadStream (path, options) {
-    if (!(this instanceof ReadStream)) return new ReadStream(path, options);
-
-    Stream.call(this);
-
-    var self = this;
-
-    this.path = path;
-    this.fd = null;
-    this.readable = true;
-    this.paused = false;
-
-    this.flags = 'r';
-    this.mode = 438; /*=0666*/
-    this.bufferSize = 64 * 1024;
-
-    options = options || {};
-
-    // Mixin options into this
-    var keys = Object.keys(options);
-    for (var index = 0, length = keys.length; index < length; index++) {
-      var key = keys[index];
-      this[key] = options[key];
-    }
-
-    if (this.encoding) this.setEncoding(this.encoding);
-
-    if (this.start !== undefined) {
-      if ('number' !== typeof this.start) {
-        throw TypeError('start must be a Number');
-      }
-      if (this.end === undefined) {
-        this.end = Infinity;
-      } else if ('number' !== typeof this.end) {
-        throw TypeError('end must be a Number');
-      }
-
-      if (this.start > this.end) {
-        throw new Error('start must be <= end');
-      }
-
-      this.pos = this.start;
-    }
-
-    if (this.fd !== null) {
-      process.nextTick(function() {
-        self._read();
-      });
-      return;
-    }
-
-    fs.open(this.path, this.flags, this.mode, function (err, fd) {
-      if (err) {
-        self.emit('error', err);
-        self.readable = false;
-        return;
-      }
-
-      self.fd = fd;
-      self.emit('open', fd);
-      self._read();
-    })
-  }
-
-  function WriteStream (path, options) {
-    if (!(this instanceof WriteStream)) return new WriteStream(path, options);
-
-    Stream.call(this);
-
-    this.path = path;
-    this.fd = null;
-    this.writable = true;
-
-    this.flags = 'w';
-    this.encoding = 'binary';
-    this.mode = 438; /*=0666*/
-    this.bytesWritten = 0;
-
-    options = options || {};
-
-    // Mixin options into this
-    var keys = Object.keys(options);
-    for (var index = 0, length = keys.length; index < length; index++) {
-      var key = keys[index];
-      this[key] = options[key];
-    }
-
-    if (this.start !== undefined) {
-      if ('number' !== typeof this.start) {
-        throw TypeError('start must be a Number');
-      }
-      if (this.start < 0) {
-        throw new Error('start must be >= zero');
-      }
-
-      this.pos = this.start;
-    }
-
-    this.busy = false;
-    this._queue = [];
-
-    if (this.fd === null) {
-      this._open = fs.open;
-      this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);
-      this.flush();
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/package.json
deleted file mode 100644
index cf4fc9a27305d606802c0aab5144fdad9bd29004..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/package.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
-  "_from": "graceful-fs@>=4.1.2 <5.0.0",
-  "_id": "graceful-fs@4.1.4",
-  "_location": "/serialport/node-pre-gyp/tar-pack/fstream/graceful-fs",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/fstream"
-  ],
-  "_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz",
-  "_shasum": "ef089d2880f033b011823ce5c8fae798da775dbd",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/isaacs/node-graceful-fs/issues"
-  },
-  "dependencies": {},
-  "description": "A drop-in replacement for fs, making various improvements.",
-  "devDependencies": {
-    "mkdirp": "^0.5.0",
-    "rimraf": "^2.2.8",
-    "tap": "^5.4.2"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "engines": {
-    "node": ">=0.4.0"
-  },
-  "files": [
-    "fs.js",
-    "graceful-fs.js",
-    "legacy-streams.js",
-    "polyfills.js"
-  ],
-  "homepage": "https://github.com/isaacs/node-graceful-fs#readme",
-  "keywords": [
-    "EACCESS",
-    "EAGAIN",
-    "EINVAL",
-    "EMFILE",
-    "EPERM",
-    "error",
-    "errors",
-    "fs",
-    "handling",
-    "module",
-    "queue",
-    "reading",
-    "retries",
-    "retry"
-  ],
-  "license": "ISC",
-  "main": "graceful-fs.js",
-  "name": "graceful-fs",
-  "optionalDependencies": {},
-  "readme": "# graceful-fs\n\ngraceful-fs functions as a drop-in replacement for the fs module,\nmaking various improvements.\n\nThe improvements are meant to normalize behavior across different\nplatforms and environments, and to make filesystem access more\nresilient to errors.\n\n## Improvements over [fs module](http://api.nodejs.org/fs.html)\n\n* Queues up `open` and `readdir` calls, and retries them once\n  something closes if there is an EMFILE error from too many file\n  descriptors.\n* fixes `lchmod` for Node versions prior to 0.6.2.\n* implements `fs.lutimes` if possible. Otherwise it becomes a noop.\n* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or\n  `lchown` if the user isn't root.\n* makes `lchmod` and `lchown` become noops, if not available.\n* retries reading a file if `read` results in EAGAIN error.\n\nOn Windows, it retries renaming a file for up to one second if `EACCESS`\nor `EPERM` error occurs, likely because antivirus software has locked\nthe directory.\n\n## USAGE\n\n```javascript\n// use just like fs\nvar fs = require('graceful-fs')\n\n// now go and do stuff with it...\nfs.readFileSync('some-file-or-whatever')\n```\n\n## Global Patching\n\nIf you want to patch the global fs module (or any other fs-like\nmodule) you can do this:\n\n```javascript\n// Make sure to read the caveat below.\nvar realFs = require('fs')\nvar gracefulFs = require('graceful-fs')\ngracefulFs.gracefulify(realFs)\n```\n\nThis should only ever be done at the top-level application layer, in\norder to delay on EMFILE errors from any fs-using dependencies.  You\nshould **not** do this in a library, because it can cause unexpected\ndelays in other parts of the program.\n\n## Changes\n\nThis module is fairly stable at this point, and used by a lot of\nthings.  That being said, because it implements a subtle behavior\nchange in a core part of the node API, even modest changes can be\nextremely breaking, and the versioning is thus biased towards\nbumping the major when in doubt.\n\nThe main change between major versions has been switching between\nproviding a fully-patched `fs` module vs monkey-patching the node core\nbuiltin, and the approach by which a non-monkey-patched `fs` was\ncreated.\n\nThe goal is to trade `EMFILE` errors for slower fs operations.  So, if\nyou try to open a zillion files, rather than crashing, `open`\noperations will be queued up and wait for something else to `close`.\n\nThere are advantages to each approach.  Monkey-patching the fs means\nthat no `EMFILE` errors can possibly occur anywhere in your\napplication, because everything is using the same core `fs` module,\nwhich is patched.  However, it can also obviously cause undesirable\nside-effects, especially if the module is loaded multiple times.\n\nImplementing a separate-but-identical patched `fs` module is more\nsurgical (and doesn't run the risk of patching multiple times), but\nalso imposes the challenge of keeping in sync with the core module.\n\nThe current approach loads the `fs` module, and then creates a\nlookalike object that has all the same methods, except a few that are\npatched.  It is safe to use in all versions of Node from 0.8 through\n7.0.\n\n### v4\n\n* Do not monkey-patch the fs module.  This module may now be used as a\n  drop-in dep, and users can opt into monkey-patching the fs builtin\n  if their app requires it.\n\n### v3\n\n* Monkey-patch fs, because the eval approach no longer works on recent\n  node.\n* fixed possible type-error throw if rename fails on windows\n* verify that we *never* get EMFILE errors\n* Ignore ENOSYS from chmod/chown\n* clarify that graceful-fs must be used as a drop-in\n\n### v2.1.0\n\n* Use eval rather than monkey-patching fs.\n* readdir: Always sort the results\n* win32: requeue a file if error has an OK status\n\n### v2.0\n\n* A return to monkey patching\n* wrap process.cwd\n\n### v1.1\n\n* wrap readFile\n* Wrap fs.writeFile.\n* readdir protection\n* Don't clobber the fs builtin\n* Handle fs.read EAGAIN errors by trying again\n* Expose the curOpen counter\n* No-op lchown/lchmod if not implemented\n* fs.rename patch only for win32\n* Patch fs.rename to handle AV software on Windows\n* Close #4 Chown should not fail on einval or eperm if non-root\n* Fix isaacs/fstream#1 Only wrap fs one time\n* Fix #3 Start at 1024 max files, then back off on EMFILE\n* lutimes that doens't blow up on Linux\n* A full on-rewrite using a queue instead of just swallowing the EMFILE error\n* Wrap Read/Write streams as well\n\n### 1.0\n\n* Update engines for node 0.6\n* Be lstat-graceful on Windows\n* first\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/isaacs/node-graceful-fs.git"
-  },
-  "scripts": {
-    "test": "node test.js | tap -"
-  },
-  "version": "4.1.4"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/polyfills.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/polyfills.js
deleted file mode 100644
index 5e4f4804618d177c63a1e96db830599a8840a185..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/graceful-fs/polyfills.js
+++ /dev/null
@@ -1,252 +0,0 @@
-var fs = require('./fs.js')
-var constants = require('constants')
-
-var origCwd = process.cwd
-var cwd = null
-process.cwd = function() {
-  if (!cwd)
-    cwd = origCwd.call(process)
-  return cwd
-}
-try {
-  process.cwd()
-} catch (er) {}
-
-var chdir = process.chdir
-process.chdir = function(d) {
-  cwd = null
-  chdir.call(process, d)
-}
-
-module.exports = patch
-
-function patch (fs) {
-  // (re-)implement some things that are known busted or missing.
-
-  // lchmod, broken prior to 0.6.2
-  // back-port the fix here.
-  if (constants.hasOwnProperty('O_SYMLINK') &&
-      process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) {
-    patchLchmod(fs)
-  }
-
-  // lutimes implementation, or no-op
-  if (!fs.lutimes) {
-    patchLutimes(fs)
-  }
-
-  // https://github.com/isaacs/node-graceful-fs/issues/4
-  // Chown should not fail on einval or eperm if non-root.
-  // It should not fail on enosys ever, as this just indicates
-  // that a fs doesn't support the intended operation.
-
-  fs.chown = chownFix(fs.chown)
-  fs.fchown = chownFix(fs.fchown)
-  fs.lchown = chownFix(fs.lchown)
-
-  fs.chmod = chownFix(fs.chmod)
-  fs.fchmod = chownFix(fs.fchmod)
-  fs.lchmod = chownFix(fs.lchmod)
-
-  fs.chownSync = chownFixSync(fs.chownSync)
-  fs.fchownSync = chownFixSync(fs.fchownSync)
-  fs.lchownSync = chownFixSync(fs.lchownSync)
-
-  fs.chmodSync = chownFix(fs.chmodSync)
-  fs.fchmodSync = chownFix(fs.fchmodSync)
-  fs.lchmodSync = chownFix(fs.lchmodSync)
-
-  // if lchmod/lchown do not exist, then make them no-ops
-  if (!fs.lchmod) {
-    fs.lchmod = function (path, mode, cb) {
-      process.nextTick(cb)
-    }
-    fs.lchmodSync = function () {}
-  }
-  if (!fs.lchown) {
-    fs.lchown = function (path, uid, gid, cb) {
-      process.nextTick(cb)
-    }
-    fs.lchownSync = function () {}
-  }
-
-  // on Windows, A/V software can lock the directory, causing this
-  // to fail with an EACCES or EPERM if the directory contains newly
-  // created files.  Try again on failure, for up to 1 second.
-  if (process.platform === "win32") {
-    fs.rename = (function (fs$rename) { return function (from, to, cb) {
-      var start = Date.now()
-      fs$rename(from, to, function CB (er) {
-        if (er
-            && (er.code === "EACCES" || er.code === "EPERM")
-            && Date.now() - start < 1000) {
-          return fs$rename(from, to, CB)
-        }
-        if (cb) cb(er)
-      })
-    }})(fs.rename)
-  }
-
-  // if read() returns EAGAIN, then just try it again.
-  fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) {
-    var callback
-    if (callback_ && typeof callback_ === 'function') {
-      var eagCounter = 0
-      callback = function (er, _, __) {
-        if (er && er.code === 'EAGAIN' && eagCounter < 10) {
-          eagCounter ++
-          return fs$read.call(fs, fd, buffer, offset, length, position, callback)
-        }
-        callback_.apply(this, arguments)
-      }
-    }
-    return fs$read.call(fs, fd, buffer, offset, length, position, callback)
-  }})(fs.read)
-
-  fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
-    var eagCounter = 0
-    while (true) {
-      try {
-        return fs$readSync.call(fs, fd, buffer, offset, length, position)
-      } catch (er) {
-        if (er.code === 'EAGAIN' && eagCounter < 10) {
-          eagCounter ++
-          continue
-        }
-        throw er
-      }
-    }
-  }})(fs.readSync)
-}
-
-function patchLchmod (fs) {
-  fs.lchmod = function (path, mode, callback) {
-    callback = callback || noop
-    fs.open( path
-           , constants.O_WRONLY | constants.O_SYMLINK
-           , mode
-           , function (err, fd) {
-      if (err) {
-        callback(err)
-        return
-      }
-      // prefer to return the chmod error, if one occurs,
-      // but still try to close, and report closing errors if they occur.
-      fs.fchmod(fd, mode, function (err) {
-        fs.close(fd, function(err2) {
-          callback(err || err2)
-        })
-      })
-    })
-  }
-
-  fs.lchmodSync = function (path, mode) {
-    var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)
-
-    // prefer to return the chmod error, if one occurs,
-    // but still try to close, and report closing errors if they occur.
-    var threw = true
-    var ret
-    try {
-      ret = fs.fchmodSync(fd, mode)
-      threw = false
-    } finally {
-      if (threw) {
-        try {
-          fs.closeSync(fd)
-        } catch (er) {}
-      } else {
-        fs.closeSync(fd)
-      }
-    }
-    return ret
-  }
-}
-
-function patchLutimes (fs) {
-  if (constants.hasOwnProperty("O_SYMLINK")) {
-    fs.lutimes = function (path, at, mt, cb) {
-      fs.open(path, constants.O_SYMLINK, function (er, fd) {
-        cb = cb || noop
-        if (er) return cb(er)
-        fs.futimes(fd, at, mt, function (er) {
-          fs.close(fd, function (er2) {
-            return cb(er || er2)
-          })
-        })
-      })
-    }
-
-    fs.lutimesSync = function (path, at, mt) {
-      var fd = fs.openSync(path, constants.O_SYMLINK)
-      var ret
-      var threw = true
-      try {
-        ret = fs.futimesSync(fd, at, mt)
-        threw = false
-      } finally {
-        if (threw) {
-          try {
-            fs.closeSync(fd)
-          } catch (er) {}
-        } else {
-          fs.closeSync(fd)
-        }
-      }
-      return ret
-    }
-
-  } else {
-    fs.lutimes = function (_a, _b, _c, cb) { process.nextTick(cb) }
-    fs.lutimesSync = function () {}
-  }
-}
-
-function chownFix (orig) {
-  if (!orig) return orig
-  return function (target, uid, gid, cb) {
-    return orig.call(fs, target, uid, gid, function (er, res) {
-      if (chownErOk(er)) er = null
-      cb(er, res)
-    })
-  }
-}
-
-function chownFixSync (orig) {
-  if (!orig) return orig
-  return function (target, uid, gid) {
-    try {
-      return orig.call(fs, target, uid, gid)
-    } catch (er) {
-      if (!chownErOk(er)) throw er
-    }
-  }
-}
-
-// ENOSYS means that the fs doesn't support the op. Just ignore
-// that, because it doesn't matter.
-//
-// if there's no getuid, or if getuid() is something other
-// than 0, and the error is EINVAL or EPERM, then just ignore
-// it.
-//
-// This specific case is a silent failure in cp, install, tar,
-// and most other unix tools that manage permissions.
-//
-// When running as root, or if other types of errors are
-// encountered, then it's strict.
-function chownErOk (er) {
-  if (!er)
-    return true
-
-  if (er.code === "ENOSYS")
-    return true
-
-  var nonroot = !process.getuid || process.getuid() !== 0
-  if (nonroot) {
-    if (er.code === "EINVAL" || er.code === "EPERM")
-      return true
-  }
-
-  return false
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/LICENSE
deleted file mode 100644
index dea3013d6710ee273f49ac606a65d5211d480c88..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/LICENSE
+++ /dev/null
@@ -1,16 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/README.md
deleted file mode 100644
index b1c56658557b8162aa9f5ba8610ed03a5e558d9d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-Browser-friendly inheritance fully compatible with standard node.js
-[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
-
-This package exports standard `inherits` from node.js `util` module in
-node environment, but also provides alternative browser-friendly
-implementation through [browser
-field](https://gist.github.com/shtylman/4339901). Alternative
-implementation is a literal copy of standard one located in standalone
-module to avoid requiring of `util`. It also has a shim for old
-browsers with no `Object.create` support.
-
-While keeping you sure you are using standard `inherits`
-implementation in node.js environment, it allows bundlers such as
-[browserify](https://github.com/substack/node-browserify) to not
-include full `util` package to your client code if all you need is
-just `inherits` function. It worth, because browser shim for `util`
-package is large and `inherits` is often the single function you need
-from it.
-
-It's recommended to use this package instead of
-`require('util').inherits` for any code that has chances to be used
-not only in node.js but in browser too.
-
-## usage
-
-```js
-var inherits = require('inherits');
-// then use exactly as the standard one
-```
-
-## note on version ~1.0
-
-Version ~1.0 had completely different motivation and is not compatible
-neither with 2.0 nor with standard node.js `inherits`.
-
-If you are using version ~1.0 and planning to switch to ~2.0, be
-careful:
-
-* new version uses `super_` instead of `super` for referencing
-  superclass
-* new version overwrites current prototype while old one preserves any
-  existing fields on it
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits.js
deleted file mode 100644
index 29f5e24f57b5aacb9f199dea05a57fcbf4918bc1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('util').inherits
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits_browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits_browser.js
deleted file mode 100644
index c1e78a75e6b52b7434e7e8aa0d64d8abd593763b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/inherits_browser.js
+++ /dev/null
@@ -1,23 +0,0 @@
-if (typeof Object.create === 'function') {
-  // implementation from standard node.js 'util' module
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    ctor.prototype = Object.create(superCtor.prototype, {
-      constructor: {
-        value: ctor,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-  };
-} else {
-  // old school shim for old browsers
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    var TempCtor = function () {}
-    TempCtor.prototype = superCtor.prototype
-    ctor.prototype = new TempCtor()
-    ctor.prototype.constructor = ctor
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/package.json
deleted file mode 100644
index b30e035e3792654a75476af4961ee908d648f9d4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "_from": "inherits@>=2.0.0 <2.1.0",
-  "_id": "inherits@2.0.1",
-  "_location": "/serialport/node-pre-gyp/tar-pack/fstream/inherits",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/fstream"
-  ],
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-  "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1",
-  "_shrinkwrap": null,
-  "browser": "./inherits_browser.js",
-  "bugs": {
-    "url": "https://github.com/isaacs/inherits/issues"
-  },
-  "dependencies": {},
-  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
-  "devDependencies": {},
-  "homepage": "https://github.com/isaacs/inherits#readme",
-  "keywords": [
-    "browser",
-    "browserify",
-    "class",
-    "inheritance",
-    "inherits",
-    "klass",
-    "object-oriented",
-    "oop"
-  ],
-  "license": "ISC",
-  "main": "./inherits.js",
-  "name": "inherits",
-  "optionalDependencies": {},
-  "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n  superclass\n* new version overwrites current prototype while old one preserves any\n  existing fields on it\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/inherits.git"
-  },
-  "scripts": {
-    "test": "node test"
-  },
-  "version": "2.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/test.js
deleted file mode 100644
index fc53012d31c0cde4f4bca408e7470e35a06f88fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/node_modules/inherits/test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var inherits = require('./inherits.js')
-var assert = require('assert')
-
-function test(c) {
-  assert(c.constructor === Child)
-  assert(c.constructor.super_ === Parent)
-  assert(Object.getPrototypeOf(c) === Child.prototype)
-  assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype)
-  assert(c instanceof Child)
-  assert(c instanceof Parent)
-}
-
-function Child() {
-  Parent.call(this)
-  test(this)
-}
-
-function Parent() {}
-
-inherits(Child, Parent)
-
-var c = new Child
-test(c)
-
-console.log('ok')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/package.json
deleted file mode 100644
index 0357f02456ced6ca40103283e0d142025867f777..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/fstream/package.json
+++ /dev/null
@@ -1,83 +0,0 @@
-{
-  "_from": "fstream@>=1.0.10 <1.1.0",
-  "_id": "fstream@1.0.10",
-  "_location": "/serialport/node-pre-gyp/tar-pack/fstream",
-  "_nodeVersion": "4.4.5",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/fstream-1.0.10.tgz_1466189553883_0.3062701092567295"
-  },
-  "_npmUser": {
-    "email": "ogd@aoaioxxysz.net",
-    "name": "othiym23"
-  },
-  "_npmVersion": "3.10.0",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack",
-    "/serialport/node-pre-gyp/tar-pack/fstream-ignore"
-  ],
-  "_resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz",
-  "_shasum": "604e8a92fe26ffd9f6fae30399d4984e1ab22822",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/fstream/issues"
-  },
-  "dependencies": {
-    "graceful-fs": "^4.1.2",
-    "inherits": "~2.0.0",
-    "mkdirp": ">=0.5 0",
-    "rimraf": "2"
-  },
-  "description": "Advanced file system stream things",
-  "devDependencies": {
-    "standard": "^4.0.0",
-    "tap": "^1.2.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "604e8a92fe26ffd9f6fae30399d4984e1ab22822",
-    "tarball": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz"
-  },
-  "engines": {
-    "node": ">=0.6"
-  },
-  "gitHead": "24fabdec32e334dd3b130d77b38c010e3119b102",
-  "homepage": "https://github.com/npm/fstream#readme",
-  "license": "ISC",
-  "main": "fstream.js",
-  "maintainers": [
-    {
-      "name": "iarna",
-      "email": "me@re-becca.org"
-    },
-    {
-      "name": "isaacs",
-      "email": "isaacs@npmjs.com"
-    },
-    {
-      "name": "othiym23",
-      "email": "ogd@aoaioxxysz.net"
-    },
-    {
-      "name": "zkat",
-      "email": "kat@sykosomatic.org"
-    }
-  ],
-  "name": "fstream",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/fstream.git"
-  },
-  "scripts": {
-    "test": "standard && tap examples/*.js"
-  },
-  "version": "1.0.10"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/README.md
deleted file mode 100644
index a2981ea0705196c52a01d2c09cf026110f96de72..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/README.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# once
-
-Only call a function once.
-
-## usage
-
-```javascript
-var once = require('once')
-
-function load (file, cb) {
-  cb = once(cb)
-  loader.load('file')
-  loader.once('load', cb)
-  loader.once('error', cb)
-}
-```
-
-Or add to the Function.prototype in a responsible way:
-
-```javascript
-// only has to be done once
-require('once').proto()
-
-function load (file, cb) {
-  cb = cb.once()
-  loader.load('file')
-  loader.once('load', cb)
-  loader.once('error', cb)
-}
-```
-
-Ironically, the prototype feature makes this module twice as
-complicated as necessary.
-
-To check whether you function has been called, use `fn.called`. Once the
-function is called for the first time the return value of the original
-function is saved in `fn.value` and subsequent calls will continue to
-return this value.
-
-```javascript
-var once = require('once')
-
-function load (cb) {
-  cb = once(cb)
-  var stream = createStream()
-  stream.once('data', cb)
-  stream.once('end', function () {
-    if (!cb.called) cb(new Error('not found'))
-  })
-}
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/README.md
deleted file mode 100644
index 98eab2522b86e5fe32c92524c4ec778b98066cbf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# wrappy
-
-Callback wrapping utility
-
-## USAGE
-
-```javascript
-var wrappy = require("wrappy")
-
-// var wrapper = wrappy(wrapperFunction)
-
-// make sure a cb is called only once
-// See also: http://npm.im/once for this specific use case
-var once = wrappy(function (cb) {
-  var called = false
-  return function () {
-    if (called) return
-    called = true
-    return cb.apply(this, arguments)
-  }
-})
-
-function printBoo () {
-  console.log('boo')
-}
-// has some rando property
-printBoo.iAmBooPrinter = true
-
-var onlyPrintOnce = once(printBoo)
-
-onlyPrintOnce() // prints 'boo'
-onlyPrintOnce() // does nothing
-
-// random property is retained!
-assert.equal(onlyPrintOnce.iAmBooPrinter, true)
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/package.json
deleted file mode 100644
index de5707468d3f5e74bf7e11d40e9ffd912df3efb8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "_from": "wrappy@>=1.0.0 <2.0.0",
-  "_id": "wrappy@1.0.2",
-  "_location": "/serialport/node-pre-gyp/tar-pack/once/wrappy",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/once"
-  ],
-  "_resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-  "_shasum": "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/wrappy/issues"
-  },
-  "dependencies": {},
-  "description": "Callback wrapping utility",
-  "devDependencies": {
-    "tap": "^2.3.1"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "files": [
-    "wrappy.js"
-  ],
-  "homepage": "https://github.com/npm/wrappy",
-  "license": "ISC",
-  "main": "wrappy.js",
-  "name": "wrappy",
-  "optionalDependencies": {},
-  "readme": "# wrappy\n\nCallback wrapping utility\n\n## USAGE\n\n```javascript\nvar wrappy = require(\"wrappy\")\n\n// var wrapper = wrappy(wrapperFunction)\n\n// make sure a cb is called only once\n// See also: http://npm.im/once for this specific use case\nvar once = wrappy(function (cb) {\n  var called = false\n  return function () {\n    if (called) return\n    called = true\n    return cb.apply(this, arguments)\n  }\n})\n\nfunction printBoo () {\n  console.log('boo')\n}\n// has some rando property\nprintBoo.iAmBooPrinter = true\n\nvar onlyPrintOnce = once(printBoo)\n\nonlyPrintOnce() // prints 'boo'\nonlyPrintOnce() // does nothing\n\n// random property is retained!\nassert.equal(onlyPrintOnce.iAmBooPrinter, true)\n```\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/wrappy.git"
-  },
-  "scripts": {
-    "test": "tap --coverage test/*.js"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/wrappy.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/wrappy.js
deleted file mode 100644
index bb7e7d6fcf70fdff4c5a48b7fa2ae3c9ba36fe47..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/node_modules/wrappy/wrappy.js
+++ /dev/null
@@ -1,33 +0,0 @@
-// Returns a wrapper function that returns a wrapped callback
-// The wrapper function should do some stuff, and return a
-// presumably different callback function.
-// This makes sure that own properties are retained, so that
-// decorations and such are not lost along the way.
-module.exports = wrappy
-function wrappy (fn, cb) {
-  if (fn && cb) return wrappy(fn)(cb)
-
-  if (typeof fn !== 'function')
-    throw new TypeError('need wrapper function')
-
-  Object.keys(fn).forEach(function (k) {
-    wrapper[k] = fn[k]
-  })
-
-  return wrapper
-
-  function wrapper() {
-    var args = new Array(arguments.length)
-    for (var i = 0; i < args.length; i++) {
-      args[i] = arguments[i]
-    }
-    var ret = fn.apply(this, args)
-    var cb = args[args.length-1]
-    if (typeof ret === 'function' && ret !== cb) {
-      Object.keys(cb).forEach(function (k) {
-        ret[k] = cb[k]
-      })
-    }
-    return ret
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/once.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/once.js
deleted file mode 100644
index 2e1e721bfecec364ca8a6aab8a261067a2c74716..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/once.js
+++ /dev/null
@@ -1,21 +0,0 @@
-var wrappy = require('wrappy')
-module.exports = wrappy(once)
-
-once.proto = once(function () {
-  Object.defineProperty(Function.prototype, 'once', {
-    value: function () {
-      return once(this)
-    },
-    configurable: true
-  })
-})
-
-function once (fn) {
-  var f = function () {
-    if (f.called) return f.value
-    f.called = true
-    return f.value = fn.apply(this, arguments)
-  }
-  f.called = false
-  return f
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/package.json
deleted file mode 100644
index 9155e5ab67fe1ab3a2e7c74951b0500e552e3fdb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/once/package.json
+++ /dev/null
@@ -1,54 +0,0 @@
-{
-  "_from": "once@>=1.3.0 <2.0.0",
-  "_id": "once@1.3.3",
-  "_location": "/serialport/node-pre-gyp/tar-pack/once",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack"
-  ],
-  "_resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
-  "_shasum": "b2e261557ce4c314ec8304f3fa82663e4297ca20",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/once/issues"
-  },
-  "dependencies": {
-    "wrappy": "1"
-  },
-  "description": "Run a function exactly one time",
-  "devDependencies": {
-    "tap": "^1.2.0"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "files": [
-    "once.js"
-  ],
-  "homepage": "https://github.com/isaacs/once#readme",
-  "keywords": [
-    "function",
-    "once",
-    "one",
-    "single"
-  ],
-  "license": "ISC",
-  "main": "once.js",
-  "name": "once",
-  "optionalDependencies": {},
-  "readme": "# once\n\nOnly call a function once.\n\n## usage\n\n```javascript\nvar once = require('once')\n\nfunction load (file, cb) {\n  cb = once(cb)\n  loader.load('file')\n  loader.once('load', cb)\n  loader.once('error', cb)\n}\n```\n\nOr add to the Function.prototype in a responsible way:\n\n```javascript\n// only has to be done once\nrequire('once').proto()\n\nfunction load (file, cb) {\n  cb = cb.once()\n  loader.load('file')\n  loader.once('load', cb)\n  loader.once('error', cb)\n}\n```\n\nIronically, the prototype feature makes this module twice as\ncomplicated as necessary.\n\nTo check whether you function has been called, use `fn.called`. Once the\nfunction is called for the first time the return value of the original\nfunction is saved in `fn.value` and subsequent calls will continue to\nreturn this value.\n\n```javascript\nvar once = require('once')\n\nfunction load (cb) {\n  cb = once(cb)\n  var stream = createStream()\n  stream.once('data', cb)\n  stream.once('end', function () {\n    if (!cb.called) cb(new Error('not found'))\n  })\n}\n```\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/once.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "1.3.3"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/.npmignore
deleted file mode 100644
index 265ff739e071cd0a408e3a202d495492751de884..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/.npmignore
+++ /dev/null
@@ -1,8 +0,0 @@
-build/
-test/
-examples/
-fs.js
-zlib.js
-.zuul.yml
-.nyc_output
-coverage
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/.travis.yml
deleted file mode 100644
index ae0156a9bbb156ef5d51377dca1af30c7a935866..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/.travis.yml
+++ /dev/null
@@ -1,54 +0,0 @@
-sudo: false
-language: node_js
-before_install:
-  - npm install -g npm@2
-  - npm install -g npm
-notifications:
-  email: false
-matrix:
-  fast_finish: true
-  allow_failures:
-    - env: TASK=browser BROWSER_NAME=ipad BROWSER_VERSION="6.0..latest"
-    - env: TASK=browser BROWSER_NAME=iphone BROWSER_VERSION="6.0..latest"
-  include:
-  - node_js: '0.8'
-    env: TASK=test
-  - node_js: '0.10'
-    env: TASK=test
-  - node_js: '0.11'
-    env: TASK=test
-  - node_js: '0.12'
-    env: TASK=test
-  - node_js: 1
-    env: TASK=test
-  - node_js: 2
-    env: TASK=test
-  - node_js: 3
-    env: TASK=test
-  - node_js: 4
-    env: TASK=test
-  - node_js: 5
-    env: TASK=test
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=android BROWSER_VERSION="4.0..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=ie BROWSER_VERSION="9..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=opera BROWSER_VERSION="11..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=chrome BROWSER_VERSION="-3..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=firefox BROWSER_VERSION="-3..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=ipad BROWSER_VERSION="6.0..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=iphone BROWSER_VERSION="6.0..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=safari BROWSER_VERSION="5..latest"
-  - node_js: 5
-    env: TASK=browser BROWSER_NAME=microsoftedge BROWSER_VERSION=latest
-script: "npm run $TASK"
-env:
-  global:
-  - secure: rE2Vvo7vnjabYNULNyLFxOyt98BoJexDqsiOnfiD6kLYYsiQGfr/sbZkPMOFm9qfQG7pjqx+zZWZjGSswhTt+626C0t/njXqug7Yps4c3dFblzGfreQHp7wNX5TFsvrxd6dAowVasMp61sJcRnB2w8cUzoe3RAYUDHyiHktwqMc=
-  - secure: g9YINaKAdMatsJ28G9jCGbSaguXCyxSTy+pBO6Ch0Cf57ZLOTka3HqDj8p3nV28LUIHZ3ut5WO43CeYKwt4AUtLpBS3a0dndHdY6D83uY6b2qh5hXlrcbeQTq2cvw2y95F7hm4D1kwrgZ7ViqaKggRcEupAL69YbJnxeUDKWEdI=
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/LICENSE
deleted file mode 100644
index e3d4e695a4cff2bf9c1da6c69841ca22bc9f0224..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/LICENSE
+++ /dev/null
@@ -1,18 +0,0 @@
-Copyright Joyent, Inc. and other Node contributors. All rights reserved.
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/README.md
deleted file mode 100644
index 2233732a9bac14e6260f62cb06dfbc671e584335..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/README.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# readable-stream
-
-***Node-core v6.1.0 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream)
-
-
-[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)
-[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)
-
-
-[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream)
-
-```bash
-npm install --save readable-stream
-```
-
-***Node-core streams for userland***
-
-This package is a mirror of the Streams2 and Streams3 implementations in
-Node-core, including [documentation](doc/stream.md).
-
-If you want to guarantee a stable streams base, regardless of what version of
-Node you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *"stream"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).
-
-As of version 2.0.0 **readable-stream** uses semantic versioning.  
-
-# Streams WG Team Members
-
-* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) &lt;christopher.s.dickinson@gmail.com&gt;
-  - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B
-* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) &lt;calvin.metcalf@gmail.com&gt;
-  - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242
-* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) &lt;rod@vagg.org&gt;
-  - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D
-* **Sam Newman** ([@sonewman](https://github.com/sonewman)) &lt;newmansam@outlook.com&gt;
-* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) &lt;mathiasbuus@gmail.com&gt;
-* **Domenic Denicola** ([@domenic](https://github.com/domenic)) &lt;d@domenic.me&gt;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/doc/stream.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/doc/stream.md
deleted file mode 100644
index c907ca0e7b726a8dbd0398c34372f4edd797e50b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/doc/stream.md
+++ /dev/null
@@ -1,1772 +0,0 @@
-# Stream
-
-    Stability: 2 - Stable
-
-A stream is an abstract interface implemented by various objects in
-Node.js. For example a [request to an HTTP server][http-incoming-message] is a
-stream, as is [`process.stdout`][]. Streams are readable, writable, or both. All
-streams are instances of [`EventEmitter`][].
-
-You can load the Stream base classes by doing `require('stream')`.
-There are base classes provided for [Readable][] streams, [Writable][]
-streams, [Duplex][] streams, and [Transform][] streams.
-
-This document is split up into 3 sections:
-
-1. The first section explains the parts of the API that you need to be
-   aware of to use streams in your programs.
-2. The second section explains the parts of the API that you need to
-   use if you implement your own custom streams yourself. The API is designed to
-   make this easy for you to do.
-3. The third section goes into more depth about how streams work,
-   including some of the internal mechanisms and functions that you
-   should probably not modify unless you definitely know what you are
-   doing.
-
-
-## API for Stream Consumers
-
-<!--type=misc-->
-
-Streams can be either [Readable][], [Writable][], or both ([Duplex][]).
-
-All streams are EventEmitters, but they also have other custom methods
-and properties depending on whether they are Readable, Writable, or
-Duplex.
-
-If a stream is both Readable and Writable, then it implements all of
-the methods and events. So, a [Duplex][] or [Transform][] stream is
-fully described by this API, though their implementation may be
-somewhat different.
-
-It is not necessary to implement Stream interfaces in order to consume
-streams in your programs. If you **are** implementing streaming
-interfaces in your own program, please also refer to
-[API for Stream Implementors][].
-
-Almost all Node.js programs, no matter how simple, use Streams in some
-way. Here is an example of using Streams in an Node.js program:
-
-```js
-const http = require('http');
-
-var server = http.createServer( (req, res) => {
-  // req is an http.IncomingMessage, which is a Readable Stream
-  // res is an http.ServerResponse, which is a Writable Stream
-
-  var body = '';
-  // we want to get the data as utf8 strings
-  // If you don't set an encoding, then you'll get Buffer objects
-  req.setEncoding('utf8');
-
-  // Readable streams emit 'data' events once a listener is added
-  req.on('data', (chunk) => {
-    body += chunk;
-  });
-
-  // the end event tells you that you have entire body
-  req.on('end', () => {
-    try {
-      var data = JSON.parse(body);
-    } catch (er) {
-      // uh oh!  bad json!
-      res.statusCode = 400;
-      return res.end(`error: ${er.message}`);
-    }
-
-    // write back something interesting to the user:
-    res.write(typeof data);
-    res.end();
-  });
-});
-
-server.listen(1337);
-
-// $ curl localhost:1337 -d '{}'
-// object
-// $ curl localhost:1337 -d '"foo"'
-// string
-// $ curl localhost:1337 -d 'not json'
-// error: Unexpected token o
-```
-
-### Class: stream.Duplex
-
-Duplex streams are streams that implement both the [Readable][] and
-[Writable][] interfaces.
-
-Examples of Duplex streams include:
-
-* [TCP sockets][]
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-
-### Class: stream.Readable
-
-<!--type=class-->
-
-The Readable stream interface is the abstraction for a *source* of
-data that you are reading from. In other words, data comes *out* of a
-Readable stream.
-
-A Readable stream will not start emitting data until you indicate that
-you are ready to receive it.
-
-Readable streams have two "modes": a **flowing mode** and a **paused
-mode**. When in flowing mode, data is read from the underlying system
-and provided to your program as fast as possible. In paused mode, you
-must explicitly call [`stream.read()`][stream-read] to get chunks of data out.
-Streams start out in paused mode.
-
-**Note**: If no data event handlers are attached, and there are no
-[`stream.pipe()`][] destinations, and the stream is switched into flowing
-mode, then data will be lost.
-
-You can switch to flowing mode by doing any of the following:
-
-* Adding a [`'data'`][] event handler to listen for data.
-* Calling the [`stream.resume()`][stream-resume] method to explicitly open the
-  flow.
-* Calling the [`stream.pipe()`][] method to send the data to a [Writable][].
-
-You can switch back to paused mode by doing either of the following:
-
-* If there are no pipe destinations, by calling the
-  [`stream.pause()`][stream-pause] method.
-* If there are pipe destinations, by removing any [`'data'`][] event
-  handlers, and removing all pipe destinations by calling the
-  [`stream.unpipe()`][] method.
-
-Note that, for backwards compatibility reasons, removing [`'data'`][]
-event handlers will **not** automatically pause the stream. Also, if
-there are piped destinations, then calling [`stream.pause()`][stream-pause] will
-not guarantee that the stream will *remain* paused once those
-destinations drain and ask for more data.
-
-Examples of readable streams include:
-
-* [HTTP responses, on the client][http-incoming-message]
-* [HTTP requests, on the server][http-incoming-message]
-* [fs read streams][]
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-* [TCP sockets][]
-* [child process stdout and stderr][]
-* [`process.stdin`][]
-
-#### Event: 'close'
-
-Emitted when the stream and any of its underlying resources (a file
-descriptor, for example) have been closed. The event indicates that
-no more events will be emitted, and no further computation will occur.
-
-Not all streams will emit the `'close'` event as the `'close'` event is
-optional.
-
-#### Event: 'data'
-
-* `chunk` {Buffer|String} The chunk of data.
-
-Attaching a `'data'` event listener to a stream that has not been
-explicitly paused will switch the stream into flowing mode. Data will
-then be passed as soon as it is available.
-
-If you just want to get all the data out of the stream as fast as
-possible, this is the best way to do so.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('data', (chunk) => {
-  console.log('got %d bytes of data', chunk.length);
-});
-```
-
-#### Event: 'end'
-
-This event fires when there will be no more data to read.
-
-Note that the `'end'` event **will not fire** unless the data is
-completely consumed. This can be done by switching into flowing mode,
-or by calling [`stream.read()`][stream-read] repeatedly until you get to the
-end.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('data', (chunk) => {
-  console.log('got %d bytes of data', chunk.length);
-});
-readable.on('end', () => {
-  console.log('there will be no more data.');
-});
-```
-
-#### Event: 'error'
-
-* {Error}
-
-Emitted if there was an error receiving data.
-
-#### Event: 'readable'
-
-When a chunk of data can be read from the stream, it will emit a
-`'readable'` event.
-
-In some cases, listening for a `'readable'` event will cause some data
-to be read into the internal buffer from the underlying system, if it
-hadn't already.
-
-```javascript
-var readable = getReadableStreamSomehow();
-readable.on('readable', () => {
-  // there is some data to read now
-});
-```
-
-Once the internal buffer is drained, a `'readable'` event will fire
-again when more data is available.
-
-The `'readable'` event is not emitted in the "flowing" mode with the
-sole exception of the last one, on end-of-stream.
-
-The `'readable'` event indicates that the stream has new information:
-either new data is available or the end of the stream has been reached.
-In the former case, [`stream.read()`][stream-read] will return that data. In the
-latter case, [`stream.read()`][stream-read] will return null. For instance, in
-the following example, `foo.txt` is an empty file:
-
-```js
-const fs = require('fs');
-var rr = fs.createReadStream('foo.txt');
-rr.on('readable', () => {
-  console.log('readable:', rr.read());
-});
-rr.on('end', () => {
-  console.log('end');
-});
-```
-
-The output of running this script is:
-
-```
-$ node test.js
-readable: null
-end
-```
-
-#### readable.isPaused()
-
-* Return: {Boolean}
-
-This method returns whether or not the `readable` has been **explicitly**
-paused by client code (using [`stream.pause()`][stream-pause] without a
-corresponding [`stream.resume()`][stream-resume]).
-
-```js
-var readable = new stream.Readable
-
-readable.isPaused() // === false
-readable.pause()
-readable.isPaused() // === true
-readable.resume()
-readable.isPaused() // === false
-```
-
-#### readable.pause()
-
-* Return: `this`
-
-This method will cause a stream in flowing mode to stop emitting
-[`'data'`][] events, switching out of flowing mode. Any data that becomes
-available will remain in the internal buffer.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('data', (chunk) => {
-  console.log('got %d bytes of data', chunk.length);
-  readable.pause();
-  console.log('there will be no more data for 1 second');
-  setTimeout(() => {
-    console.log('now data will start flowing again');
-    readable.resume();
-  }, 1000);
-});
-```
-
-#### readable.pipe(destination[, options])
-
-* `destination` {stream.Writable} The destination for writing data
-* `options` {Object} Pipe options
-  * `end` {Boolean} End the writer when the reader ends. Default = `true`
-
-This method pulls all the data out of a readable stream, and writes it
-to the supplied destination, automatically managing the flow so that
-the destination is not overwhelmed by a fast readable stream.
-
-Multiple destinations can be piped to safely.
-
-```js
-var readable = getReadableStreamSomehow();
-var writable = fs.createWriteStream('file.txt');
-// All the data from readable goes into 'file.txt'
-readable.pipe(writable);
-```
-
-This function returns the destination stream, so you can set up pipe
-chains like so:
-
-```js
-var r = fs.createReadStream('file.txt');
-var z = zlib.createGzip();
-var w = fs.createWriteStream('file.txt.gz');
-r.pipe(z).pipe(w);
-```
-
-For example, emulating the Unix `cat` command:
-
-```js
-process.stdin.pipe(process.stdout);
-```
-
-By default [`stream.end()`][stream-end] is called on the destination when the
-source stream emits [`'end'`][], so that `destination` is no longer writable.
-Pass `{ end: false }` as `options` to keep the destination stream open.
-
-This keeps `writer` open so that "Goodbye" can be written at the
-end.
-
-```js
-reader.pipe(writer, { end: false });
-reader.on('end', () => {
-  writer.end('Goodbye\n');
-});
-```
-
-Note that [`process.stderr`][] and [`process.stdout`][] are never closed until
-the process exits, regardless of the specified options.
-
-#### readable.read([size])
-
-* `size` {Number} Optional argument to specify how much data to read.
-* Return {String|Buffer|Null}
-
-The `read()` method pulls some data out of the internal buffer and
-returns it. If there is no data available, then it will return
-`null`.
-
-If you pass in a `size` argument, then it will return that many
-bytes. If `size` bytes are not available, then it will return `null`,
-unless we've ended, in which case it will return the data remaining
-in the buffer.
-
-If you do not specify a `size` argument, then it will return all the
-data in the internal buffer.
-
-This method should only be called in paused mode. In flowing mode,
-this method is called automatically until the internal buffer is
-drained.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.on('readable', () => {
-  var chunk;
-  while (null !== (chunk = readable.read())) {
-    console.log('got %d bytes of data', chunk.length);
-  }
-});
-```
-
-If this method returns a data chunk, then it will also trigger the
-emission of a [`'data'`][] event.
-
-Note that calling [`stream.read([size])`][stream-read] after the [`'end'`][]
-event has been triggered will return `null`. No runtime error will be raised.
-
-#### readable.resume()
-
-* Return: `this`
-
-This method will cause the readable stream to resume emitting [`'data'`][]
-events.
-
-This method will switch the stream into flowing mode. If you do *not*
-want to consume the data from a stream, but you *do* want to get to
-its [`'end'`][] event, you can call [`stream.resume()`][stream-resume] to open
-the flow of data.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.resume();
-readable.on('end', () => {
-  console.log('got to the end, but did not read anything');
-});
-```
-
-#### readable.setEncoding(encoding)
-
-* `encoding` {String} The encoding to use.
-* Return: `this`
-
-Call this function to cause the stream to return strings of the specified
-encoding instead of Buffer objects. For example, if you do
-`readable.setEncoding('utf8')`, then the output data will be interpreted as
-UTF-8 data, and returned as strings. If you do `readable.setEncoding('hex')`,
-then the data will be encoded in hexadecimal string format.
-
-This properly handles multi-byte characters that would otherwise be
-potentially mangled if you simply pulled the Buffers directly and
-called [`buf.toString(encoding)`][] on them. If you want to read the data
-as strings, always use this method.
-
-Also you can disable any encoding at all with `readable.setEncoding(null)`.
-This approach is very useful if you deal with binary data or with large
-multi-byte strings spread out over multiple chunks.
-
-```js
-var readable = getReadableStreamSomehow();
-readable.setEncoding('utf8');
-readable.on('data', (chunk) => {
-  assert.equal(typeof chunk, 'string');
-  console.log('got %d characters of string data', chunk.length);
-});
-```
-
-#### readable.unpipe([destination])
-
-* `destination` {stream.Writable} Optional specific stream to unpipe
-
-This method will remove the hooks set up for a previous [`stream.pipe()`][]
-call.
-
-If the destination is not specified, then all pipes are removed.
-
-If the destination is specified, but no pipe is set up for it, then
-this is a no-op.
-
-```js
-var readable = getReadableStreamSomehow();
-var writable = fs.createWriteStream('file.txt');
-// All the data from readable goes into 'file.txt',
-// but only for the first second
-readable.pipe(writable);
-setTimeout(() => {
-  console.log('stop writing to file.txt');
-  readable.unpipe(writable);
-  console.log('manually close the file stream');
-  writable.end();
-}, 1000);
-```
-
-#### readable.unshift(chunk)
-
-* `chunk` {Buffer|String} Chunk of data to unshift onto the read queue
-
-This is useful in certain cases where a stream is being consumed by a
-parser, which needs to "un-consume" some data that it has
-optimistically pulled out of the source, so that the stream can be
-passed on to some other party.
-
-Note that `stream.unshift(chunk)` cannot be called after the [`'end'`][] event
-has been triggered; a runtime error will be raised.
-
-If you find that you must often call `stream.unshift(chunk)` in your
-programs, consider implementing a [Transform][] stream instead. (See [API
-for Stream Implementors][].)
-
-```js
-// Pull off a header delimited by \n\n
-// use unshift() if we get too much
-// Call the callback with (error, header, stream)
-const StringDecoder = require('string_decoder').StringDecoder;
-function parseHeader(stream, callback) {
-  stream.on('error', callback);
-  stream.on('readable', onReadable);
-  var decoder = new StringDecoder('utf8');
-  var header = '';
-  function onReadable() {
-    var chunk;
-    while (null !== (chunk = stream.read())) {
-      var str = decoder.write(chunk);
-      if (str.match(/\n\n/)) {
-        // found the header boundary
-        var split = str.split(/\n\n/);
-        header += split.shift();
-        var remaining = split.join('\n\n');
-        var buf = Buffer.from(remaining, 'utf8');
-        if (buf.length)
-          stream.unshift(buf);
-        stream.removeListener('error', callback);
-        stream.removeListener('readable', onReadable);
-        // now the body of the message can be read from the stream.
-        callback(null, header, stream);
-      } else {
-        // still reading the header.
-        header += str;
-      }
-    }
-  }
-}
-```
-
-Note that, unlike [`stream.push(chunk)`][stream-push], `stream.unshift(chunk)`
-will not end the reading process by resetting the internal reading state of the
-stream. This can cause unexpected results if `unshift()` is called during a
-read (i.e. from within a [`stream._read()`][stream-_read] implementation on a
-custom stream). Following the call to `unshift()` with an immediate
-[`stream.push('')`][stream-push] will reset the reading state appropriately,
-however it is best to simply avoid calling `unshift()` while in the process of
-performing a read.
-
-#### readable.wrap(stream)
-
-* `stream` {Stream} An "old style" readable stream
-
-Versions of Node.js prior to v0.10 had streams that did not implement the
-entire Streams API as it is today. (See [Compatibility][] for
-more information.)
-
-If you are using an older Node.js library that emits [`'data'`][] events and
-has a [`stream.pause()`][stream-pause] method that is advisory only, then you
-can use the `wrap()` method to create a [Readable][] stream that uses the old
-stream as its data source.
-
-You will very rarely ever need to call this function, but it exists
-as a convenience for interacting with old Node.js programs and libraries.
-
-For example:
-
-```js
-const OldReader = require('./old-api-module.js').OldReader;
-const Readable = require('stream').Readable;
-const oreader = new OldReader;
-const myReader = new Readable().wrap(oreader);
-
-myReader.on('readable', () => {
-  myReader.read(); // etc.
-});
-```
-
-### Class: stream.Transform
-
-Transform streams are [Duplex][] streams where the output is in some way
-computed from the input. They implement both the [Readable][] and
-[Writable][] interfaces.
-
-Examples of Transform streams include:
-
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-
-### Class: stream.Writable
-
-<!--type=class-->
-
-The Writable stream interface is an abstraction for a *destination*
-that you are writing data *to*.
-
-Examples of writable streams include:
-
-* [HTTP requests, on the client][]
-* [HTTP responses, on the server][]
-* [fs write streams][]
-* [zlib streams][zlib]
-* [crypto streams][crypto]
-* [TCP sockets][]
-* [child process stdin][]
-* [`process.stdout`][], [`process.stderr`][]
-
-#### Event: 'close'
-
-Emitted when the stream and any of its underlying resources (a file descriptor,
-for example) have been closed. The event indicates that no more events will be
-emitted, and no further computation will occur.
-
-Not all streams will emit the `'close'` event as the `'close'` event is
-optional.
-
-#### Event: 'drain'
-
-If a [`stream.write(chunk)`][stream-write] call returns `false`, then the
-`'drain'` event will indicate when it is appropriate to begin writing more data
-to the stream.
-
-```js
-// Write the data to the supplied writable stream one million times.
-// Be attentive to back-pressure.
-function writeOneMillionTimes(writer, data, encoding, callback) {
-  var i = 1000000;
-  write();
-  function write() {
-    var ok = true;
-    do {
-      i -= 1;
-      if (i === 0) {
-        // last time!
-        writer.write(data, encoding, callback);
-      } else {
-        // see if we should continue, or wait
-        // don't pass the callback, because we're not done yet.
-        ok = writer.write(data, encoding);
-      }
-    } while (i > 0 && ok);
-    if (i > 0) {
-      // had to stop early!
-      // write some more once it drains
-      writer.once('drain', write);
-    }
-  }
-}
-```
-
-#### Event: 'error'
-
-* {Error}
-
-Emitted if there was an error when writing or piping data.
-
-#### Event: 'finish'
-
-When the [`stream.end()`][stream-end] method has been called, and all data has
-been flushed to the underlying system, this event is emitted.
-
-```javascript
-var writer = getWritableStreamSomehow();
-for (var i = 0; i < 100; i ++) {
-  writer.write('hello, #${i}!\n');
-}
-writer.end('this is the end\n');
-writer.on('finish', () => {
-  console.error('all writes are now complete.');
-});
-```
-
-#### Event: 'pipe'
-
-* `src` {stream.Readable} source stream that is piping to this writable
-
-This is emitted whenever the [`stream.pipe()`][] method is called on a readable
-stream, adding this writable to its set of destinations.
-
-```js
-var writer = getWritableStreamSomehow();
-var reader = getReadableStreamSomehow();
-writer.on('pipe', (src) => {
-  console.error('something is piping into the writer');
-  assert.equal(src, reader);
-});
-reader.pipe(writer);
-```
-
-#### Event: 'unpipe'
-
-* `src` {[Readable][] Stream} The source stream that
-  [unpiped][`stream.unpipe()`] this writable
-
-This is emitted whenever the [`stream.unpipe()`][] method is called on a
-readable stream, removing this writable from its set of destinations.
-
-```js
-var writer = getWritableStreamSomehow();
-var reader = getReadableStreamSomehow();
-writer.on('unpipe', (src) => {
-  console.error('something has stopped piping into the writer');
-  assert.equal(src, reader);
-});
-reader.pipe(writer);
-reader.unpipe(writer);
-```
-
-#### writable.cork()
-
-Forces buffering of all writes.
-
-Buffered data will be flushed either at [`stream.uncork()`][] or at
-[`stream.end()`][stream-end] call.
-
-#### writable.end([chunk][, encoding][, callback])
-
-* `chunk` {String|Buffer} Optional data to write
-* `encoding` {String} The encoding, if `chunk` is a String
-* `callback` {Function} Optional callback for when the stream is finished
-
-Call this method when no more data will be written to the stream. If supplied,
-the callback is attached as a listener on the [`'finish'`][] event.
-
-Calling [`stream.write()`][stream-write] after calling
-[`stream.end()`][stream-end] will raise an error.
-
-```js
-// write 'hello, ' and then end with 'world!'
-var file = fs.createWriteStream('example.txt');
-file.write('hello, ');
-file.end('world!');
-// writing more now is not allowed!
-```
-
-#### writable.setDefaultEncoding(encoding)
-
-* `encoding` {String} The new default encoding
-* Return: `this`
-
-Sets the default encoding for a writable stream.
-
-#### writable.uncork()
-
-Flush all data, buffered since [`stream.cork()`][] call.
-
-#### writable.write(chunk[, encoding][, callback])
-
-* `chunk` {String|Buffer} The data to write
-* `encoding` {String} The encoding, if `chunk` is a String
-* `callback` {Function} Callback for when this chunk of data is flushed
-* Returns: {Boolean} `true` if the data was handled completely.
-
-This method writes some data to the underlying system, and calls the
-supplied callback once the data has been fully handled.  If an error
-occurs, the callback may or may not be called with the error as its
-first argument.  To detect write errors, listen for the `'error'` event.
-
-The return value indicates if you should continue writing right now.
-If the data had to be buffered internally, then it will return
-`false`. Otherwise, it will return `true`.
-
-This return value is strictly advisory. You MAY continue to write,
-even if it returns `false`. However, writes will be buffered in
-memory, so it is best not to do this excessively. Instead, wait for
-the [`'drain'`][] event before writing more data.
-
-
-## API for Stream Implementors
-
-<!--type=misc-->
-
-To implement any sort of stream, the pattern is the same:
-
-1. Extend the appropriate parent class in your own subclass. (The
-   [`util.inherits()`][] method is particularly helpful for this.)
-2. Call the appropriate parent class constructor in your constructor,
-   to be sure that the internal mechanisms are set up properly.
-3. Implement one or more specific methods, as detailed below.
-
-The class to extend and the method(s) to implement depend on the sort
-of stream class you are writing:
-
-<table>
-  <thead>
-    <tr>
-      <th>
-        <p>Use-case</p>
-      </th>
-      <th>
-        <p>Class</p>
-      </th>
-      <th>
-        <p>Method(s) to implement</p>
-      </th>
-    </tr>
-  </thead>
-  <tr>
-    <td>
-      <p>Reading only</p>
-    </td>
-    <td>
-      <p>[Readable](#stream_class_stream_readable_1)</p>
-    </td>
-    <td>
-      <p><code>[_read][stream-_read]</code></p>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <p>Writing only</p>
-    </td>
-    <td>
-      <p>[Writable](#stream_class_stream_writable_1)</p>
-    </td>
-    <td>
-      <p><code>[_write][stream-_write]</code>, <code>[_writev][stream-_writev]</code></p>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <p>Reading and writing</p>
-    </td>
-    <td>
-      <p>[Duplex](#stream_class_stream_duplex_1)</p>
-    </td>
-    <td>
-      <p><code>[_read][stream-_read]</code>, <code>[_write][stream-_write]</code>, <code>[_writev][stream-_writev]</code></p>
-    </td>
-  </tr>
-  <tr>
-    <td>
-      <p>Operate on written data, then read the result</p>
-    </td>
-    <td>
-      <p>[Transform](#stream_class_stream_transform_1)</p>
-    </td>
-    <td>
-      <p><code>[_transform][stream-_transform]</code>, <code>[_flush][stream-_flush]</code></p>
-    </td>
-  </tr>
-</table>
-
-In your implementation code, it is very important to never call the methods
-described in [API for Stream Consumers][]. Otherwise, you can potentially cause
-adverse side effects in programs that consume your streaming interfaces.
-
-### Class: stream.Duplex
-
-<!--type=class-->
-
-A "duplex" stream is one that is both Readable and Writable, such as a TCP
-socket connection.
-
-Note that `stream.Duplex` is an abstract class designed to be extended
-with an underlying implementation of the [`stream._read(size)`][stream-_read]
-and [`stream._write(chunk, encoding, callback)`][stream-_write] methods as you
-would with a Readable or Writable stream class.
-
-Since JavaScript doesn't have multiple prototypal inheritance, this class
-prototypally inherits from Readable, and then parasitically from Writable. It is
-thus up to the user to implement both the low-level
-[`stream._read(n)`][stream-_read] method as well as the low-level
-[`stream._write(chunk, encoding, callback)`][stream-_write] method on extension
-duplex classes.
-
-#### new stream.Duplex(options)
-
-* `options` {Object} Passed to both Writable and Readable
-  constructors. Also has the following fields:
-  * `allowHalfOpen` {Boolean} Default = `true`. If set to `false`, then
-    the stream will automatically end the readable side when the
-    writable side ends and vice versa.
-  * `readableObjectMode` {Boolean} Default = `false`. Sets `objectMode`
-    for readable side of the stream. Has no effect if `objectMode`
-    is `true`.
-  * `writableObjectMode` {Boolean} Default = `false`. Sets `objectMode`
-    for writable side of the stream. Has no effect if `objectMode`
-    is `true`.
-
-In classes that extend the Duplex class, make sure to call the
-constructor so that the buffering settings can be properly
-initialized.
-
-### Class: stream.PassThrough
-
-This is a trivial implementation of a [Transform][] stream that simply
-passes the input bytes across to the output. Its purpose is mainly
-for examples and testing, but there are occasionally use cases where
-it can come in handy as a building block for novel sorts of streams.
-
-### Class: stream.Readable
-
-<!--type=class-->
-
-`stream.Readable` is an abstract class designed to be extended with an
-underlying implementation of the [`stream._read(size)`][stream-_read] method.
-
-Please see [API for Stream Consumers][] for how to consume
-streams in your programs. What follows is an explanation of how to
-implement Readable streams in your programs.
-
-#### new stream.Readable([options])
-
-* `options` {Object}
-  * `highWaterMark` {Number} The maximum number of bytes to store in
-    the internal buffer before ceasing to read from the underlying
-    resource. Default = `16384` (16kb), or `16` for `objectMode` streams
-  * `encoding` {String} If specified, then buffers will be decoded to
-    strings using the specified encoding. Default = `null`
-  * `objectMode` {Boolean} Whether this stream should behave
-    as a stream of objects. Meaning that [`stream.read(n)`][stream-read] returns
-    a single value instead of a Buffer of size n. Default = `false`
-  * `read` {Function} Implementation for the [`stream._read()`][stream-_read]
-    method.
-
-In classes that extend the Readable class, make sure to call the
-Readable constructor so that the buffering settings can be properly
-initialized.
-
-#### readable.\_read(size)
-
-* `size` {Number} Number of bytes to read asynchronously
-
-Note: **Implement this method, but do NOT call it directly.**
-
-This method is prefixed with an underscore because it is internal to the
-class that defines it and should only be called by the internal Readable
-class methods. All Readable stream implementations must provide a \_read
-method to fetch data from the underlying resource.
-
-When `_read()` is called, if data is available from the resource, the `_read()`
-implementation should start pushing that data into the read queue by calling
-[`this.push(dataChunk)`][stream-push]. `_read()` should continue reading from
-the resource and pushing data until push returns `false`, at which point it
-should stop reading from the resource. Only when `_read()` is called again after
-it has stopped should it start reading more data from the resource and pushing
-that data onto the queue.
-
-Note: once the `_read()` method is called, it will not be called again until
-the [`stream.push()`][stream-push] method is called.
-
-The `size` argument is advisory. Implementations where a "read" is a
-single call that returns data can use this to know how much data to
-fetch. Implementations where that is not relevant, such as TCP or
-TLS, may ignore this argument, and simply provide data whenever it
-becomes available. There is no need, for example to "wait" until
-`size` bytes are available before calling [`stream.push(chunk)`][stream-push].
-
-#### readable.push(chunk[, encoding])
-
-
-* `chunk` {Buffer|Null|String} Chunk of data to push into the read queue
-* `encoding` {String} Encoding of String chunks.  Must be a valid
-  Buffer encoding, such as `'utf8'` or `'ascii'`
-* return {Boolean} Whether or not more pushes should be performed
-
-Note: **This method should be called by Readable implementors, NOT
-by consumers of Readable streams.**
-
-If a value other than null is passed, The `push()` method adds a chunk of data
-into the queue for subsequent stream processors to consume. If `null` is
-passed, it signals the end of the stream (EOF), after which no more data
-can be written.
-
-The data added with `push()` can be pulled out by calling the
-[`stream.read()`][stream-read] method when the [`'readable'`][] event fires.
-
-This API is designed to be as flexible as possible. For example,
-you may be wrapping a lower-level source which has some sort of
-pause/resume mechanism, and a data callback. In those cases, you
-could wrap the low-level source object by doing something like this:
-
-```js
-// source is an object with readStop() and readStart() methods,
-// and an `ondata` member that gets called when it has data, and
-// an `onend` member that gets called when the data is over.
-
-util.inherits(SourceWrapper, Readable);
-
-function SourceWrapper(options) {
-  Readable.call(this, options);
-
-  this._source = getLowlevelSourceObject();
-
-  // Every time there's data, we push it into the internal buffer.
-  this._source.ondata = (chunk) => {
-    // if push() returns false, then we need to stop reading from source
-    if (!this.push(chunk))
-      this._source.readStop();
-  };
-
-  // When the source ends, we push the EOF-signaling `null` chunk
-  this._source.onend = () => {
-    this.push(null);
-  };
-}
-
-// _read will be called when the stream wants to pull more data in
-// the advisory size argument is ignored in this case.
-SourceWrapper.prototype._read = function(size) {
-  this._source.readStart();
-};
-```
-
-#### Example: A Counting Stream
-
-<!--type=example-->
-
-This is a basic example of a Readable stream. It emits the numerals
-from 1 to 1,000,000 in ascending order, and then ends.
-
-```js
-const Readable = require('stream').Readable;
-const util = require('util');
-util.inherits(Counter, Readable);
-
-function Counter(opt) {
-  Readable.call(this, opt);
-  this._max = 1000000;
-  this._index = 1;
-}
-
-Counter.prototype._read = function() {
-  var i = this._index++;
-  if (i > this._max)
-    this.push(null);
-  else {
-    var str = '' + i;
-    var buf = Buffer.from(str, 'ascii');
-    this.push(buf);
-  }
-};
-```
-
-#### Example: SimpleProtocol v1 (Sub-optimal)
-
-This is similar to the `parseHeader` function described
-[here](#stream_readable_unshift_chunk), but implemented as a custom stream.
-Also, note that this implementation does not convert the incoming data to a
-string.
-
-However, this would be better implemented as a [Transform][] stream. See
-[SimpleProtocol v2][] for a better implementation.
-
-```js
-// A parser for a simple data protocol.
-// The "header" is a JSON object, followed by 2 \n characters, and
-// then a message body.
-//
-// NOTE: This can be done more simply as a Transform stream!
-// Using Readable directly for this is sub-optimal. See the
-// alternative example below under the Transform section.
-
-const Readable = require('stream').Readable;
-const util = require('util');
-
-util.inherits(SimpleProtocol, Readable);
-
-function SimpleProtocol(source, options) {
-  if (!(this instanceof SimpleProtocol))
-    return new SimpleProtocol(source, options);
-
-  Readable.call(this, options);
-  this._inBody = false;
-  this._sawFirstCr = false;
-
-  // source is a readable stream, such as a socket or file
-  this._source = source;
-
-  source.on('end', () => {
-    this.push(null);
-  });
-
-  // give it a kick whenever the source is readable
-  // read(0) will not consume any bytes
-  source.on('readable', () => {
-    this.read(0);
-  });
-
-  this._rawHeader = [];
-  this.header = null;
-}
-
-SimpleProtocol.prototype._read = function(n) {
-  if (!this._inBody) {
-    var chunk = this._source.read();
-
-    // if the source doesn't have data, we don't have data yet.
-    if (chunk === null)
-      return this.push('');
-
-    // check if the chunk has a \n\n
-    var split = -1;
-    for (var i = 0; i < chunk.length; i++) {
-      if (chunk[i] === 10) { // '\n'
-        if (this._sawFirstCr) {
-          split = i;
-          break;
-        } else {
-          this._sawFirstCr = true;
-        }
-      } else {
-        this._sawFirstCr = false;
-      }
-    }
-
-    if (split === -1) {
-      // still waiting for the \n\n
-      // stash the chunk, and try again.
-      this._rawHeader.push(chunk);
-      this.push('');
-    } else {
-      this._inBody = true;
-      var h = chunk.slice(0, split);
-      this._rawHeader.push(h);
-      var header = Buffer.concat(this._rawHeader).toString();
-      try {
-        this.header = JSON.parse(header);
-      } catch (er) {
-        this.emit('error', new Error('invalid simple protocol data'));
-        return;
-      }
-      // now, because we got some extra data, unshift the rest
-      // back into the read queue so that our consumer will see it.
-      var b = chunk.slice(split);
-      this.unshift(b);
-      // calling unshift by itself does not reset the reading state
-      // of the stream; since we're inside _read, doing an additional
-      // push('') will reset the state appropriately.
-      this.push('');
-
-      // and let them know that we are done parsing the header.
-      this.emit('header', this.header);
-    }
-  } else {
-    // from there on, just provide the data to our consumer.
-    // careful not to push(null), since that would indicate EOF.
-    var chunk = this._source.read();
-    if (chunk) this.push(chunk);
-  }
-};
-
-// Usage:
-// var parser = new SimpleProtocol(source);
-// Now parser is a readable stream that will emit 'header'
-// with the parsed header data.
-```
-
-### Class: stream.Transform
-
-A "transform" stream is a duplex stream where the output is causally
-connected in some way to the input, such as a [zlib][] stream or a
-[crypto][] stream.
-
-There is no requirement that the output be the same size as the input,
-the same number of chunks, or arrive at the same time. For example, a
-Hash stream will only ever have a single chunk of output which is
-provided when the input is ended. A zlib stream will produce output
-that is either much smaller or much larger than its input.
-
-Rather than implement the [`stream._read()`][stream-_read] and
-[`stream._write()`][stream-_write] methods, Transform classes must implement the
-[`stream._transform()`][stream-_transform] method, and may optionally
-also implement the [`stream._flush()`][stream-_flush] method. (See below.)
-
-#### new stream.Transform([options])
-
-* `options` {Object} Passed to both Writable and Readable
-  constructors. Also has the following fields:
-  * `transform` {Function} Implementation for the
-    [`stream._transform()`][stream-_transform] method.
-  * `flush` {Function} Implementation for the [`stream._flush()`][stream-_flush]
-    method.
-
-In classes that extend the Transform class, make sure to call the
-constructor so that the buffering settings can be properly
-initialized.
-
-#### Events: 'finish' and 'end'
-
-The [`'finish'`][] and [`'end'`][] events are from the parent Writable
-and Readable classes respectively. The `'finish'` event is fired after
-[`stream.end()`][stream-end] is called and all chunks have been processed by
-[`stream._transform()`][stream-_transform], `'end'` is fired after all data has
-been output which is after the callback in [`stream._flush()`][stream-_flush]
-has been called.
-
-#### transform.\_flush(callback)
-
-* `callback` {Function} Call this function (optionally with an error
-  argument) when you are done flushing any remaining data.
-
-Note: **This function MUST NOT be called directly.**  It MAY be implemented
-by child classes, and if so, will be called by the internal Transform
-class methods only.
-
-In some cases, your transform operation may need to emit a bit more
-data at the end of the stream. For example, a `Zlib` compression
-stream will store up some internal state so that it can optimally
-compress the output. At the end, however, it needs to do the best it
-can with what is left, so that the data will be complete.
-
-In those cases, you can implement a `_flush()` method, which will be
-called at the very end, after all the written data is consumed, but
-before emitting [`'end'`][] to signal the end of the readable side. Just
-like with [`stream._transform()`][stream-_transform], call
-`transform.push(chunk)` zero or more times, as appropriate, and call `callback`
-when the flush operation is complete.
-
-This method is prefixed with an underscore because it is internal to
-the class that defines it, and should not be called directly by user
-programs. However, you **are** expected to override this method in
-your own extension classes.
-
-#### transform.\_transform(chunk, encoding, callback)
-
-* `chunk` {Buffer|String} The chunk to be transformed. Will **always**
-  be a buffer unless the `decodeStrings` option was set to `false`.
-* `encoding` {String} If the chunk is a string, then this is the
-  encoding type. If chunk is a buffer, then this is the special
-  value - 'buffer', ignore it in this case.
-* `callback` {Function} Call this function (optionally with an error
-  argument and data) when you are done processing the supplied chunk.
-
-Note: **This function MUST NOT be called directly.**  It should be
-implemented by child classes, and called by the internal Transform
-class methods only.
-
-All Transform stream implementations must provide a `_transform()`
-method to accept input and produce output.
-
-`_transform()` should do whatever has to be done in this specific
-Transform class, to handle the bytes being written, and pass them off
-to the readable portion of the interface. Do asynchronous I/O,
-process things, and so on.
-
-Call `transform.push(outputChunk)` 0 or more times to generate output
-from this input chunk, depending on how much data you want to output
-as a result of this chunk.
-
-Call the callback function only when the current chunk is completely
-consumed. Note that there may or may not be output as a result of any
-particular input chunk. If you supply a second argument to the callback
-it will be passed to the push method. In other words the following are
-equivalent:
-
-```js
-transform.prototype._transform = function (data, encoding, callback) {
-  this.push(data);
-  callback();
-};
-
-transform.prototype._transform = function (data, encoding, callback) {
-  callback(null, data);
-};
-```
-
-This method is prefixed with an underscore because it is internal to
-the class that defines it, and should not be called directly by user
-programs. However, you **are** expected to override this method in
-your own extension classes.
-
-#### Example: `SimpleProtocol` parser v2
-
-The example [here](#stream_example_simpleprotocol_v1_sub_optimal) of a simple
-protocol parser can be implemented simply by using the higher level
-[Transform][] stream class, similar to the `parseHeader` and `SimpleProtocol
-v1` examples.
-
-In this example, rather than providing the input as an argument, it
-would be piped into the parser, which is a more idiomatic Node.js stream
-approach.
-
-```javascript
-const util = require('util');
-const Transform = require('stream').Transform;
-util.inherits(SimpleProtocol, Transform);
-
-function SimpleProtocol(options) {
-  if (!(this instanceof SimpleProtocol))
-    return new SimpleProtocol(options);
-
-  Transform.call(this, options);
-  this._inBody = false;
-  this._sawFirstCr = false;
-  this._rawHeader = [];
-  this.header = null;
-}
-
-SimpleProtocol.prototype._transform = function(chunk, encoding, done) {
-  if (!this._inBody) {
-    // check if the chunk has a \n\n
-    var split = -1;
-    for (var i = 0; i < chunk.length; i++) {
-      if (chunk[i] === 10) { // '\n'
-        if (this._sawFirstCr) {
-          split = i;
-          break;
-        } else {
-          this._sawFirstCr = true;
-        }
-      } else {
-        this._sawFirstCr = false;
-      }
-    }
-
-    if (split === -1) {
-      // still waiting for the \n\n
-      // stash the chunk, and try again.
-      this._rawHeader.push(chunk);
-    } else {
-      this._inBody = true;
-      var h = chunk.slice(0, split);
-      this._rawHeader.push(h);
-      var header = Buffer.concat(this._rawHeader).toString();
-      try {
-        this.header = JSON.parse(header);
-      } catch (er) {
-        this.emit('error', new Error('invalid simple protocol data'));
-        return;
-      }
-      // and let them know that we are done parsing the header.
-      this.emit('header', this.header);
-
-      // now, because we got some extra data, emit this first.
-      this.push(chunk.slice(split));
-    }
-  } else {
-    // from there on, just provide the data to our consumer as-is.
-    this.push(chunk);
-  }
-  done();
-};
-
-// Usage:
-// var parser = new SimpleProtocol();
-// source.pipe(parser)
-// Now parser is a readable stream that will emit 'header'
-// with the parsed header data.
-```
-
-### Class: stream.Writable
-
-<!--type=class-->
-
-`stream.Writable` is an abstract class designed to be extended with an
-underlying implementation of the
-[`stream._write(chunk, encoding, callback)`][stream-_write] method.
-
-Please see [API for Stream Consumers][] for how to consume
-writable streams in your programs. What follows is an explanation of
-how to implement Writable streams in your programs.
-
-#### new stream.Writable([options])
-
-* `options` {Object}
-  * `highWaterMark` {Number} Buffer level when
-    [`stream.write()`][stream-write] starts returning `false`. Default = `16384`
-    (16kb), or `16` for `objectMode` streams.
-  * `decodeStrings` {Boolean} Whether or not to decode strings into
-    Buffers before passing them to [`stream._write()`][stream-_write].
-    Default = `true`
-  * `objectMode` {Boolean} Whether or not the
-    [`stream.write(anyObj)`][stream-write] is a valid operation. If set you can
-    write arbitrary data instead of only `Buffer` / `String` data.
-    Default = `false`
-  * `write` {Function} Implementation for the
-    [`stream._write()`][stream-_write] method.
-  * `writev` {Function} Implementation for the
-    [`stream._writev()`][stream-_writev] method.
-
-In classes that extend the Writable class, make sure to call the
-constructor so that the buffering settings can be properly
-initialized.
-
-#### writable.\_write(chunk, encoding, callback)
-
-* `chunk` {Buffer|String} The chunk to be written. Will **always**
-  be a buffer unless the `decodeStrings` option was set to `false`.
-* `encoding` {String} If the chunk is a string, then this is the
-  encoding type. If chunk is a buffer, then this is the special
-  value - 'buffer', ignore it in this case.
-* `callback` {Function} Call this function (optionally with an error
-  argument) when you are done processing the supplied chunk.
-
-All Writable stream implementations must provide a
-[`stream._write()`][stream-_write] method to send data to the underlying
-resource.
-
-Note: **This function MUST NOT be called directly.**  It should be
-implemented by child classes, and called by the internal Writable
-class methods only.
-
-Call the callback using the standard `callback(error)` pattern to
-signal that the write completed successfully or with an error.
-
-If the `decodeStrings` flag is set in the constructor options, then
-`chunk` may be a string rather than a Buffer, and `encoding` will
-indicate the sort of string that it is. This is to support
-implementations that have an optimized handling for certain string
-data encodings. If you do not explicitly set the `decodeStrings`
-option to `false`, then you can safely ignore the `encoding` argument,
-and assume that `chunk` will always be a Buffer.
-
-This method is prefixed with an underscore because it is internal to
-the class that defines it, and should not be called directly by user
-programs. However, you **are** expected to override this method in
-your own extension classes.
-
-#### writable.\_writev(chunks, callback)
-
-* `chunks` {Array} The chunks to be written. Each chunk has following
-  format: `{ chunk: ..., encoding: ... }`.
-* `callback` {Function} Call this function (optionally with an error
-  argument) when you are done processing the supplied chunks.
-
-Note: **This function MUST NOT be called directly.**  It may be
-implemented by child classes, and called by the internal Writable
-class methods only.
-
-This function is completely optional to implement. In most cases it is
-unnecessary. If implemented, it will be called with all the chunks
-that are buffered in the write queue.
-
-
-## Simplified Constructor API
-
-<!--type=misc-->
-
-In simple cases there is now the added benefit of being able to construct a
-stream without inheritance.
-
-This can be done by passing the appropriate methods as constructor options:
-
-Examples:
-
-### Duplex
-
-```js
-var duplex = new stream.Duplex({
-  read: function(n) {
-    // sets this._read under the hood
-
-    // push data onto the read queue, passing null
-    // will signal the end of the stream (EOF)
-    this.push(chunk);
-  },
-  write: function(chunk, encoding, next) {
-    // sets this._write under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-
-// or
-
-var duplex = new stream.Duplex({
-  read: function(n) {
-    // sets this._read under the hood
-
-    // push data onto the read queue, passing null
-    // will signal the end of the stream (EOF)
-    this.push(chunk);
-  },
-  writev: function(chunks, next) {
-    // sets this._writev under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-```
-
-### Readable
-
-```js
-var readable = new stream.Readable({
-  read: function(n) {
-    // sets this._read under the hood
-
-    // push data onto the read queue, passing null
-    // will signal the end of the stream (EOF)
-    this.push(chunk);
-  }
-});
-```
-
-### Transform
-
-```js
-var transform = new stream.Transform({
-  transform: function(chunk, encoding, next) {
-    // sets this._transform under the hood
-
-    // generate output as many times as needed
-    // this.push(chunk);
-
-    // call when the current chunk is consumed
-    next();
-  },
-  flush: function(done) {
-    // sets this._flush under the hood
-
-    // generate output as many times as needed
-    // this.push(chunk);
-
-    done();
-  }
-});
-```
-
-### Writable
-
-```js
-var writable = new stream.Writable({
-  write: function(chunk, encoding, next) {
-    // sets this._write under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-
-// or
-
-var writable = new stream.Writable({
-  writev: function(chunks, next) {
-    // sets this._writev under the hood
-
-    // An optional error can be passed as the first argument
-    next()
-  }
-});
-```
-
-## Streams: Under the Hood
-
-<!--type=misc-->
-
-### Buffering
-
-<!--type=misc-->
-
-Both Writable and Readable streams will buffer data on an internal
-object which can be retrieved from `_writableState.getBuffer()` or
-`_readableState.buffer`, respectively.
-
-The amount of data that will potentially be buffered depends on the
-`highWaterMark` option which is passed into the constructor.
-
-Buffering in Readable streams happens when the implementation calls
-[`stream.push(chunk)`][stream-push]. If the consumer of the Stream does not
-call [`stream.read()`][stream-read], then the data will sit in the internal
-queue until it is consumed.
-
-Buffering in Writable streams happens when the user calls
-[`stream.write(chunk)`][stream-write] repeatedly, even when it returns `false`.
-
-The purpose of streams, especially with the [`stream.pipe()`][] method, is to
-limit the buffering of data to acceptable levels, so that sources and
-destinations of varying speed will not overwhelm the available memory.
-
-### Compatibility with Older Node.js Versions
-
-<!--type=misc-->
-
-In versions of Node.js prior to v0.10, the Readable stream interface was
-simpler, but also less powerful and less useful.
-
-* Rather than waiting for you to call the [`stream.read()`][stream-read] method,
-  [`'data'`][] events would start emitting immediately. If you needed to do
-  some I/O to decide how to handle data, then you had to store the chunks
-  in some kind of buffer so that they would not be lost.
-* The [`stream.pause()`][stream-pause] method was advisory, rather than
-  guaranteed. This meant that you still had to be prepared to receive
-  [`'data'`][] events even when the stream was in a paused state.
-
-In Node.js v0.10, the [Readable][] class was added.
-For backwards compatibility with older Node.js programs, Readable streams
-switch into "flowing mode" when a [`'data'`][] event handler is added, or
-when the [`stream.resume()`][stream-resume] method is called. The effect is
-that, even if you are not using the new [`stream.read()`][stream-read] method
-and [`'readable'`][] event, you no longer have to worry about losing
-[`'data'`][] chunks.
-
-Most programs will continue to function normally. However, this
-introduces an edge case in the following conditions:
-
-* No [`'data'`][] event handler is added.
-* The [`stream.resume()`][stream-resume] method is never called.
-* The stream is not piped to any writable destination.
-
-For example, consider the following code:
-
-```js
-// WARNING!  BROKEN!
-net.createServer((socket) => {
-
-  // we add an 'end' method, but never consume the data
-  socket.on('end', () => {
-    // It will never get here.
-    socket.end('I got your message (but didnt read it)\n');
-  });
-
-}).listen(1337);
-```
-
-In versions of Node.js prior to v0.10, the incoming message data would be
-simply discarded. However, in Node.js v0.10 and beyond,
-the socket will remain paused forever.
-
-The workaround in this situation is to call the
-[`stream.resume()`][stream-resume] method to start the flow of data:
-
-```js
-// Workaround
-net.createServer((socket) => {
-
-  socket.on('end', () => {
-    socket.end('I got your message (but didnt read it)\n');
-  });
-
-  // start the flow of data, discarding it.
-  socket.resume();
-
-}).listen(1337);
-```
-
-In addition to new Readable streams switching into flowing mode,
-pre-v0.10 style streams can be wrapped in a Readable class using the
-[`stream.wrap()`][] method.
-
-
-### Object Mode
-
-<!--type=misc-->
-
-Normally, Streams operate on Strings and Buffers exclusively.
-
-Streams that are in **object mode** can emit generic JavaScript values
-other than Buffers and Strings.
-
-A Readable stream in object mode will always return a single item from
-a call to [`stream.read(size)`][stream-read], regardless of what the size
-argument is.
-
-A Writable stream in object mode will always ignore the `encoding`
-argument to [`stream.write(data, encoding)`][stream-write].
-
-The special value `null` still retains its special value for object
-mode streams. That is, for object mode readable streams, `null` as a
-return value from [`stream.read()`][stream-read] indicates that there is no more
-data, and [`stream.push(null)`][stream-push] will signal the end of stream data
-(`EOF`).
-
-No streams in Node.js core are object mode streams. This pattern is only
-used by userland streaming libraries.
-
-You should set `objectMode` in your stream child class constructor on
-the options object. Setting `objectMode` mid-stream is not safe.
-
-For Duplex streams `objectMode` can be set exclusively for readable or
-writable side with `readableObjectMode` and `writableObjectMode`
-respectively. These options can be used to implement parsers and
-serializers with Transform streams.
-
-```js
-const util = require('util');
-const StringDecoder = require('string_decoder').StringDecoder;
-const Transform = require('stream').Transform;
-util.inherits(JSONParseStream, Transform);
-
-// Gets \n-delimited JSON string data, and emits the parsed objects
-function JSONParseStream() {
-  if (!(this instanceof JSONParseStream))
-    return new JSONParseStream();
-
-  Transform.call(this, { readableObjectMode : true });
-
-  this._buffer = '';
-  this._decoder = new StringDecoder('utf8');
-}
-
-JSONParseStream.prototype._transform = function(chunk, encoding, cb) {
-  this._buffer += this._decoder.write(chunk);
-  // split on newlines
-  var lines = this._buffer.split(/\r?\n/);
-  // keep the last partial line buffered
-  this._buffer = lines.pop();
-  for (var l = 0; l < lines.length; l++) {
-    var line = lines[l];
-    try {
-      var obj = JSON.parse(line);
-    } catch (er) {
-      this.emit('error', er);
-      return;
-    }
-    // push the parsed object out to the readable consumer
-    this.push(obj);
-  }
-  cb();
-};
-
-JSONParseStream.prototype._flush = function(cb) {
-  // Just handle any leftover
-  var rem = this._buffer.trim();
-  if (rem) {
-    try {
-      var obj = JSON.parse(rem);
-    } catch (er) {
-      this.emit('error', er);
-      return;
-    }
-    // push the parsed object out to the readable consumer
-    this.push(obj);
-  }
-  cb();
-};
-```
-
-### `stream.read(0)`
-
-There are some cases where you want to trigger a refresh of the
-underlying readable stream mechanisms, without actually consuming any
-data. In that case, you can call `stream.read(0)`, which will always
-return null.
-
-If the internal read buffer is below the `highWaterMark`, and the
-stream is not currently reading, then calling `stream.read(0)` will trigger
-a low-level [`stream._read()`][stream-_read] call.
-
-There is almost never a need to do this. However, you will see some
-cases in Node.js's internals where this is done, particularly in the
-Readable stream class internals.
-
-### `stream.push('')`
-
-Pushing a zero-byte string or Buffer (when not in [Object mode][]) has an
-interesting side effect. Because it *is* a call to
-[`stream.push()`][stream-push], it will end the `reading` process. However, it
-does *not* add any data to the readable buffer, so there's nothing for
-a user to consume.
-
-Very rarely, there are cases where you have no data to provide now,
-but the consumer of your stream (or, perhaps, another bit of your own
-code) will know when to check again, by calling [`stream.read(0)`][stream-read].
-In those cases, you *may* call `stream.push('')`.
-
-So far, the only use case for this functionality is in the
-[`tls.CryptoStream`][] class, which is deprecated in Node.js/io.js v1.0. If you
-find that you have to use `stream.push('')`, please consider another
-approach, because it almost certainly indicates that something is
-horribly wrong.
-
-[`'data'`]: #stream_event_data
-[`'drain'`]: #stream_event_drain
-[`'end'`]: #stream_event_end
-[`'finish'`]: #stream_event_finish
-[`'readable'`]: #stream_event_readable
-[`buf.toString(encoding)`]: https://nodejs.org/docs/v6.1.0/api/buffer.html#buffer_buf_tostring_encoding_start_end
-[`EventEmitter`]: https://nodejs.org/docs/v6.1.0/api/events.html#events_class_eventemitter
-[`process.stderr`]: https://nodejs.org/docs/v6.1.0/api/process.html#process_process_stderr
-[`process.stdin`]: https://nodejs.org/docs/v6.1.0/api/process.html#process_process_stdin
-[`process.stdout`]: https://nodejs.org/docs/v6.1.0/api/process.html#process_process_stdout
-[`stream.cork()`]: #stream_writable_cork
-[`stream.pipe()`]: #stream_readable_pipe_destination_options
-[`stream.uncork()`]: #stream_writable_uncork
-[`stream.unpipe()`]: #stream_readable_unpipe_destination
-[`stream.wrap()`]: #stream_readable_wrap_stream
-[`tls.CryptoStream`]: https://nodejs.org/docs/v6.1.0/api/tls.html#tls_class_cryptostream
-[`util.inherits()`]: https://nodejs.org/docs/v6.1.0/api/util.html#util_util_inherits_constructor_superconstructor
-[API for Stream Consumers]: #stream_api_for_stream_consumers
-[API for Stream Implementors]: #stream_api_for_stream_implementors
-[child process stdin]: https://nodejs.org/docs/v6.1.0/api/child_process.html#child_process_child_stdin
-[child process stdout and stderr]: https://nodejs.org/docs/v6.1.0/api/child_process.html#child_process_child_stdout
-[Compatibility]: #stream_compatibility_with_older_node_js_versions
-[crypto]: crypto.html
-[Duplex]: #stream_class_stream_duplex
-[fs read streams]: https://nodejs.org/docs/v6.1.0/api/fs.html#fs_class_fs_readstream
-[fs write streams]: https://nodejs.org/docs/v6.1.0/api/fs.html#fs_class_fs_writestream
-[HTTP requests, on the client]: https://nodejs.org/docs/v6.1.0/api/http.html#http_class_http_clientrequest
-[HTTP responses, on the server]: https://nodejs.org/docs/v6.1.0/api/http.html#http_class_http_serverresponse
-[http-incoming-message]: https://nodejs.org/docs/v6.1.0/api/http.html#http_class_http_incomingmessage
-[Object mode]: #stream_object_mode
-[Readable]: #stream_class_stream_readable
-[SimpleProtocol v2]: #stream_example_simpleprotocol_parser_v2
-[stream-_flush]: #stream_transform_flush_callback
-[stream-_read]: #stream_readable_read_size_1
-[stream-_transform]: #stream_transform_transform_chunk_encoding_callback
-[stream-_write]: #stream_writable_write_chunk_encoding_callback_1
-[stream-_writev]: #stream_writable_writev_chunks_callback
-[stream-end]: #stream_writable_end_chunk_encoding_callback
-[stream-pause]: #stream_readable_pause
-[stream-push]: #stream_readable_push_chunk_encoding
-[stream-read]: #stream_readable_read_size
-[stream-resume]: #stream_readable_resume
-[stream-write]: #stream_writable_write_chunk_encoding_callback
-[TCP sockets]: https://nodejs.org/docs/v6.1.0/api/net.html#net_class_net_socket
-[Transform]: #stream_class_stream_transform
-[Writable]: #stream_class_stream_writable
-[zlib]: zlib.html
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md
deleted file mode 100644
index 83275f192e4077d32942525aaf510fa449a7c417..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md
+++ /dev/null
@@ -1,60 +0,0 @@
-# streams WG Meeting 2015-01-30
-
-## Links
-
-* **Google Hangouts Video**: http://www.youtube.com/watch?v=I9nDOSGfwZg
-* **GitHub Issue**: https://github.com/iojs/readable-stream/issues/106
-* **Original Minutes Google Doc**: https://docs.google.com/document/d/17aTgLnjMXIrfjgNaTUnHQO7m3xgzHR2VXBTmi03Qii4/
-
-## Agenda
-
-Extracted from https://github.com/iojs/readable-stream/labels/wg-agenda prior to meeting.
-
-* adopt a charter [#105](https://github.com/iojs/readable-stream/issues/105)
-* release and versioning strategy [#101](https://github.com/iojs/readable-stream/issues/101)
-* simpler stream creation [#102](https://github.com/iojs/readable-stream/issues/102)
-* proposal: deprecate implicit flowing of streams [#99](https://github.com/iojs/readable-stream/issues/99)
-
-## Minutes
-
-### adopt a charter
-
-* group: +1's all around
-
-### What versioning scheme should be adopted?
-* group: +1’s 3.0.0
-* domenic+group: pulling in patches from other sources where appropriate
-* mikeal: version independently, suggesting versions for io.js
-* mikeal+domenic: work with TC to notify in advance of changes
-simpler stream creation
-
-### streamline creation of streams
-* sam: streamline creation of streams
-* domenic: nice simple solution posted
-  but, we lose the opportunity to change the model
-  may not be backwards incompatible (double check keys)
-
-  **action item:** domenic will check
-
-### remove implicit flowing of streams on(‘data’)
-* add isFlowing / isPaused
-* mikeal: worrying that we’re documenting polyfill methods – confuses users
-* domenic: more reflective API is probably good, with warning labels for users
-* new section for mad scientists (reflective stream access)
-* calvin: name the “third state”
-* mikeal: maybe borrow the name from whatwg?
-* domenic: we’re missing the “third state”
-* consensus: kind of difficult to name the third state
-* mikeal: figure out differences in states / compat
-* mathias: always flow on data – eliminates third state
-  * explore what it breaks
-
-**action items:**
-* ask isaac for ability to list packages by what public io.js APIs they use (esp. Stream)
-* ask rod/build for infrastructure
-* **chris**: explore the “flow on data” approach
-* add isPaused/isFlowing
-* add new docs section
-* move isPaused to that section
-
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/duplex.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/duplex.js
deleted file mode 100644
index ca807af87620dd789b4f72984b813618fc1a76ff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/duplex.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_duplex.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_duplex.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_duplex.js
deleted file mode 100644
index 736693b8400fed16544db29d1eecd42233dc71c9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_duplex.js
+++ /dev/null
@@ -1,75 +0,0 @@
-// a duplex stream is just a stream that is both readable and writable.
-// Since JS doesn't have multiple prototypal inheritance, this class
-// prototypally inherits from Readable, and then parasitically from
-// Writable.
-
-'use strict';
-
-/*<replacement>*/
-
-var objectKeys = Object.keys || function (obj) {
-  var keys = [];
-  for (var key in obj) {
-    keys.push(key);
-  }return keys;
-};
-/*</replacement>*/
-
-module.exports = Duplex;
-
-/*<replacement>*/
-var processNextTick = require('process-nextick-args');
-/*</replacement>*/
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-var Readable = require('./_stream_readable');
-var Writable = require('./_stream_writable');
-
-util.inherits(Duplex, Readable);
-
-var keys = objectKeys(Writable.prototype);
-for (var v = 0; v < keys.length; v++) {
-  var method = keys[v];
-  if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];
-}
-
-function Duplex(options) {
-  if (!(this instanceof Duplex)) return new Duplex(options);
-
-  Readable.call(this, options);
-  Writable.call(this, options);
-
-  if (options && options.readable === false) this.readable = false;
-
-  if (options && options.writable === false) this.writable = false;
-
-  this.allowHalfOpen = true;
-  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;
-
-  this.once('end', onend);
-}
-
-// the no-half-open enforcer
-function onend() {
-  // if we allow half-open state, or if the writable side ended,
-  // then we're ok.
-  if (this.allowHalfOpen || this._writableState.ended) return;
-
-  // no more data can be written.
-  // But allow more writes to happen in this tick.
-  processNextTick(onEndNT, this);
-}
-
-function onEndNT(self) {
-  self.end();
-}
-
-function forEach(xs, f) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    f(xs[i], i);
-  }
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_passthrough.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_passthrough.js
deleted file mode 100644
index d06f71f1868d77a4111e894550798c977a091182..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_passthrough.js
+++ /dev/null
@@ -1,26 +0,0 @@
-// a passthrough stream.
-// basically just the most minimal sort of Transform stream.
-// Every written chunk gets output as-is.
-
-'use strict';
-
-module.exports = PassThrough;
-
-var Transform = require('./_stream_transform');
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-util.inherits(PassThrough, Transform);
-
-function PassThrough(options) {
-  if (!(this instanceof PassThrough)) return new PassThrough(options);
-
-  Transform.call(this, options);
-}
-
-PassThrough.prototype._transform = function (chunk, encoding, cb) {
-  cb(null, chunk);
-};
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_readable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_readable.js
deleted file mode 100644
index 79914fa684cbb1f3e0847624b6f671a61846c35f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_readable.js
+++ /dev/null
@@ -1,893 +0,0 @@
-'use strict';
-
-module.exports = Readable;
-
-/*<replacement>*/
-var processNextTick = require('process-nextick-args');
-/*</replacement>*/
-
-/*<replacement>*/
-var isArray = require('isarray');
-/*</replacement>*/
-
-Readable.ReadableState = ReadableState;
-
-/*<replacement>*/
-var EE = require('events').EventEmitter;
-
-var EElistenerCount = function (emitter, type) {
-  return emitter.listeners(type).length;
-};
-/*</replacement>*/
-
-/*<replacement>*/
-var Stream;
-(function () {
-  try {
-    Stream = require('st' + 'ream');
-  } catch (_) {} finally {
-    if (!Stream) Stream = require('events').EventEmitter;
-  }
-})();
-/*</replacement>*/
-
-var Buffer = require('buffer').Buffer;
-/*<replacement>*/
-var bufferShim = require('buffer-shims');
-/*</replacement>*/
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-/*<replacement>*/
-var debugUtil = require('util');
-var debug = void 0;
-if (debugUtil && debugUtil.debuglog) {
-  debug = debugUtil.debuglog('stream');
-} else {
-  debug = function () {};
-}
-/*</replacement>*/
-
-var StringDecoder;
-
-util.inherits(Readable, Stream);
-
-var hasPrependListener = typeof EE.prototype.prependListener === 'function';
-
-function prependListener(emitter, event, fn) {
-  if (hasPrependListener) return emitter.prependListener(event, fn);
-
-  // This is a brutally ugly hack to make sure that our error handler
-  // is attached before any userland ones.  NEVER DO THIS. This is here
-  // only because this code needs to continue to work with older versions
-  // of Node.js that do not include the prependListener() method. The goal
-  // is to eventually remove this hack.
-  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];
-}
-
-var Duplex;
-function ReadableState(options, stream) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  options = options || {};
-
-  // object stream flag. Used to make read(n) ignore n and to
-  // make all the buffer merging and length checks go away
-  this.objectMode = !!options.objectMode;
-
-  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.readableObjectMode;
-
-  // the point at which it stops calling _read() to fill the buffer
-  // Note: 0 is a valid value, means "don't call _read preemptively ever"
-  var hwm = options.highWaterMark;
-  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
-  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
-
-  // cast to ints.
-  this.highWaterMark = ~ ~this.highWaterMark;
-
-  this.buffer = [];
-  this.length = 0;
-  this.pipes = null;
-  this.pipesCount = 0;
-  this.flowing = null;
-  this.ended = false;
-  this.endEmitted = false;
-  this.reading = false;
-
-  // a flag to be able to tell if the onwrite cb is called immediately,
-  // or on a later tick.  We set this to true at first, because any
-  // actions that shouldn't happen until "later" should generally also
-  // not happen before the first write call.
-  this.sync = true;
-
-  // whenever we return null, then we set a flag to say
-  // that we're awaiting a 'readable' event emission.
-  this.needReadable = false;
-  this.emittedReadable = false;
-  this.readableListening = false;
-  this.resumeScheduled = false;
-
-  // Crypto is kind of old and crusty.  Historically, its default string
-  // encoding is 'binary' so we have to make this configurable.
-  // Everything else in the universe uses 'utf8', though.
-  this.defaultEncoding = options.defaultEncoding || 'utf8';
-
-  // when piping, we only care about 'readable' events that happen
-  // after read()ing all the bytes and not getting any pushback.
-  this.ranOut = false;
-
-  // the number of writers that are awaiting a drain event in .pipe()s
-  this.awaitDrain = 0;
-
-  // if true, a maybeReadMore has been scheduled
-  this.readingMore = false;
-
-  this.decoder = null;
-  this.encoding = null;
-  if (options.encoding) {
-    if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
-    this.decoder = new StringDecoder(options.encoding);
-    this.encoding = options.encoding;
-  }
-}
-
-var Duplex;
-function Readable(options) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  if (!(this instanceof Readable)) return new Readable(options);
-
-  this._readableState = new ReadableState(options, this);
-
-  // legacy
-  this.readable = true;
-
-  if (options && typeof options.read === 'function') this._read = options.read;
-
-  Stream.call(this);
-}
-
-// Manually shove something into the read() buffer.
-// This returns true if the highWaterMark has not been hit yet,
-// similar to how Writable.write() returns true if you should
-// write() some more.
-Readable.prototype.push = function (chunk, encoding) {
-  var state = this._readableState;
-
-  if (!state.objectMode && typeof chunk === 'string') {
-    encoding = encoding || state.defaultEncoding;
-    if (encoding !== state.encoding) {
-      chunk = bufferShim.from(chunk, encoding);
-      encoding = '';
-    }
-  }
-
-  return readableAddChunk(this, state, chunk, encoding, false);
-};
-
-// Unshift should *always* be something directly out of read()
-Readable.prototype.unshift = function (chunk) {
-  var state = this._readableState;
-  return readableAddChunk(this, state, chunk, '', true);
-};
-
-Readable.prototype.isPaused = function () {
-  return this._readableState.flowing === false;
-};
-
-function readableAddChunk(stream, state, chunk, encoding, addToFront) {
-  var er = chunkInvalid(state, chunk);
-  if (er) {
-    stream.emit('error', er);
-  } else if (chunk === null) {
-    state.reading = false;
-    onEofChunk(stream, state);
-  } else if (state.objectMode || chunk && chunk.length > 0) {
-    if (state.ended && !addToFront) {
-      var e = new Error('stream.push() after EOF');
-      stream.emit('error', e);
-    } else if (state.endEmitted && addToFront) {
-      var _e = new Error('stream.unshift() after end event');
-      stream.emit('error', _e);
-    } else {
-      var skipAdd;
-      if (state.decoder && !addToFront && !encoding) {
-        chunk = state.decoder.write(chunk);
-        skipAdd = !state.objectMode && chunk.length === 0;
-      }
-
-      if (!addToFront) state.reading = false;
-
-      // Don't add to the buffer if we've decoded to an empty string chunk and
-      // we're not in object mode
-      if (!skipAdd) {
-        // if we want the data now, just emit it.
-        if (state.flowing && state.length === 0 && !state.sync) {
-          stream.emit('data', chunk);
-          stream.read(0);
-        } else {
-          // update the buffer info.
-          state.length += state.objectMode ? 1 : chunk.length;
-          if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);
-
-          if (state.needReadable) emitReadable(stream);
-        }
-      }
-
-      maybeReadMore(stream, state);
-    }
-  } else if (!addToFront) {
-    state.reading = false;
-  }
-
-  return needMoreData(state);
-}
-
-// if it's past the high water mark, we can push in some more.
-// Also, if we have no data yet, we can stand some
-// more bytes.  This is to work around cases where hwm=0,
-// such as the repl.  Also, if the push() triggered a
-// readable event, and the user called read(largeNumber) such that
-// needReadable was set, then we ought to push more, so that another
-// 'readable' event will be triggered.
-function needMoreData(state) {
-  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);
-}
-
-// backwards compatibility.
-Readable.prototype.setEncoding = function (enc) {
-  if (!StringDecoder) StringDecoder = require('string_decoder/').StringDecoder;
-  this._readableState.decoder = new StringDecoder(enc);
-  this._readableState.encoding = enc;
-  return this;
-};
-
-// Don't raise the hwm > 8MB
-var MAX_HWM = 0x800000;
-function computeNewHighWaterMark(n) {
-  if (n >= MAX_HWM) {
-    n = MAX_HWM;
-  } else {
-    // Get the next highest power of 2
-    n--;
-    n |= n >>> 1;
-    n |= n >>> 2;
-    n |= n >>> 4;
-    n |= n >>> 8;
-    n |= n >>> 16;
-    n++;
-  }
-  return n;
-}
-
-function howMuchToRead(n, state) {
-  if (state.length === 0 && state.ended) return 0;
-
-  if (state.objectMode) return n === 0 ? 0 : 1;
-
-  if (n === null || isNaN(n)) {
-    // only flow one buffer at a time
-    if (state.flowing && state.buffer.length) return state.buffer[0].length;else return state.length;
-  }
-
-  if (n <= 0) return 0;
-
-  // If we're asking for more than the target buffer level,
-  // then raise the water mark.  Bump up to the next highest
-  // power of 2, to prevent increasing it excessively in tiny
-  // amounts.
-  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);
-
-  // don't have that much.  return null, unless we've ended.
-  if (n > state.length) {
-    if (!state.ended) {
-      state.needReadable = true;
-      return 0;
-    } else {
-      return state.length;
-    }
-  }
-
-  return n;
-}
-
-// you can override either this method, or the async _read(n) below.
-Readable.prototype.read = function (n) {
-  debug('read', n);
-  var state = this._readableState;
-  var nOrig = n;
-
-  if (typeof n !== 'number' || n > 0) state.emittedReadable = false;
-
-  // if we're doing read(0) to trigger a readable event, but we
-  // already have a bunch of data in the buffer, then just trigger
-  // the 'readable' event and move on.
-  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {
-    debug('read: emitReadable', state.length, state.ended);
-    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);
-    return null;
-  }
-
-  n = howMuchToRead(n, state);
-
-  // if we've ended, and we're now clear, then finish it up.
-  if (n === 0 && state.ended) {
-    if (state.length === 0) endReadable(this);
-    return null;
-  }
-
-  // All the actual chunk generation logic needs to be
-  // *below* the call to _read.  The reason is that in certain
-  // synthetic stream cases, such as passthrough streams, _read
-  // may be a completely synchronous operation which may change
-  // the state of the read buffer, providing enough data when
-  // before there was *not* enough.
-  //
-  // So, the steps are:
-  // 1. Figure out what the state of things will be after we do
-  // a read from the buffer.
-  //
-  // 2. If that resulting state will trigger a _read, then call _read.
-  // Note that this may be asynchronous, or synchronous.  Yes, it is
-  // deeply ugly to write APIs this way, but that still doesn't mean
-  // that the Readable class should behave improperly, as streams are
-  // designed to be sync/async agnostic.
-  // Take note if the _read call is sync or async (ie, if the read call
-  // has returned yet), so that we know whether or not it's safe to emit
-  // 'readable' etc.
-  //
-  // 3. Actually pull the requested chunks out of the buffer and return.
-
-  // if we need a readable event, then we need to do some reading.
-  var doRead = state.needReadable;
-  debug('need readable', doRead);
-
-  // if we currently have less than the highWaterMark, then also read some
-  if (state.length === 0 || state.length - n < state.highWaterMark) {
-    doRead = true;
-    debug('length less than watermark', doRead);
-  }
-
-  // however, if we've ended, then there's no point, and if we're already
-  // reading, then it's unnecessary.
-  if (state.ended || state.reading) {
-    doRead = false;
-    debug('reading or ended', doRead);
-  }
-
-  if (doRead) {
-    debug('do read');
-    state.reading = true;
-    state.sync = true;
-    // if the length is currently zero, then we *need* a readable event.
-    if (state.length === 0) state.needReadable = true;
-    // call internal read method
-    this._read(state.highWaterMark);
-    state.sync = false;
-  }
-
-  // If _read pushed data synchronously, then `reading` will be false,
-  // and we need to re-evaluate how much data we can return to the user.
-  if (doRead && !state.reading) n = howMuchToRead(nOrig, state);
-
-  var ret;
-  if (n > 0) ret = fromList(n, state);else ret = null;
-
-  if (ret === null) {
-    state.needReadable = true;
-    n = 0;
-  }
-
-  state.length -= n;
-
-  // If we have nothing in the buffer, then we want to know
-  // as soon as we *do* get something into the buffer.
-  if (state.length === 0 && !state.ended) state.needReadable = true;
-
-  // If we tried to read() past the EOF, then emit end on the next tick.
-  if (nOrig !== n && state.ended && state.length === 0) endReadable(this);
-
-  if (ret !== null) this.emit('data', ret);
-
-  return ret;
-};
-
-function chunkInvalid(state, chunk) {
-  var er = null;
-  if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== null && chunk !== undefined && !state.objectMode) {
-    er = new TypeError('Invalid non-string/buffer chunk');
-  }
-  return er;
-}
-
-function onEofChunk(stream, state) {
-  if (state.ended) return;
-  if (state.decoder) {
-    var chunk = state.decoder.end();
-    if (chunk && chunk.length) {
-      state.buffer.push(chunk);
-      state.length += state.objectMode ? 1 : chunk.length;
-    }
-  }
-  state.ended = true;
-
-  // emit 'readable' now to make sure it gets picked up.
-  emitReadable(stream);
-}
-
-// Don't emit readable right away in sync mode, because this can trigger
-// another read() call => stack overflow.  This way, it might trigger
-// a nextTick recursion warning, but that's not so bad.
-function emitReadable(stream) {
-  var state = stream._readableState;
-  state.needReadable = false;
-  if (!state.emittedReadable) {
-    debug('emitReadable', state.flowing);
-    state.emittedReadable = true;
-    if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream);
-  }
-}
-
-function emitReadable_(stream) {
-  debug('emit readable');
-  stream.emit('readable');
-  flow(stream);
-}
-
-// at this point, the user has presumably seen the 'readable' event,
-// and called read() to consume some data.  that may have triggered
-// in turn another _read(n) call, in which case reading = true if
-// it's in progress.
-// However, if we're not ended, or reading, and the length < hwm,
-// then go ahead and try to read some more preemptively.
-function maybeReadMore(stream, state) {
-  if (!state.readingMore) {
-    state.readingMore = true;
-    processNextTick(maybeReadMore_, stream, state);
-  }
-}
-
-function maybeReadMore_(stream, state) {
-  var len = state.length;
-  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {
-    debug('maybeReadMore read 0');
-    stream.read(0);
-    if (len === state.length)
-      // didn't get any data, stop spinning.
-      break;else len = state.length;
-  }
-  state.readingMore = false;
-}
-
-// abstract method.  to be overridden in specific implementation classes.
-// call cb(er, data) where data is <= n in length.
-// for virtual (non-string, non-buffer) streams, "length" is somewhat
-// arbitrary, and perhaps not very meaningful.
-Readable.prototype._read = function (n) {
-  this.emit('error', new Error('not implemented'));
-};
-
-Readable.prototype.pipe = function (dest, pipeOpts) {
-  var src = this;
-  var state = this._readableState;
-
-  switch (state.pipesCount) {
-    case 0:
-      state.pipes = dest;
-      break;
-    case 1:
-      state.pipes = [state.pipes, dest];
-      break;
-    default:
-      state.pipes.push(dest);
-      break;
-  }
-  state.pipesCount += 1;
-  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);
-
-  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;
-
-  var endFn = doEnd ? onend : cleanup;
-  if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn);
-
-  dest.on('unpipe', onunpipe);
-  function onunpipe(readable) {
-    debug('onunpipe');
-    if (readable === src) {
-      cleanup();
-    }
-  }
-
-  function onend() {
-    debug('onend');
-    dest.end();
-  }
-
-  // when the dest drains, it reduces the awaitDrain counter
-  // on the source.  This would be more elegant with a .once()
-  // handler in flow(), but adding and removing repeatedly is
-  // too slow.
-  var ondrain = pipeOnDrain(src);
-  dest.on('drain', ondrain);
-
-  var cleanedUp = false;
-  function cleanup() {
-    debug('cleanup');
-    // cleanup event handlers once the pipe is broken
-    dest.removeListener('close', onclose);
-    dest.removeListener('finish', onfinish);
-    dest.removeListener('drain', ondrain);
-    dest.removeListener('error', onerror);
-    dest.removeListener('unpipe', onunpipe);
-    src.removeListener('end', onend);
-    src.removeListener('end', cleanup);
-    src.removeListener('data', ondata);
-
-    cleanedUp = true;
-
-    // if the reader is waiting for a drain event from this
-    // specific writer, then it would cause it to never start
-    // flowing again.
-    // So, if this is awaiting a drain, then we just call it now.
-    // If we don't know, then assume that we are waiting for one.
-    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();
-  }
-
-  src.on('data', ondata);
-  function ondata(chunk) {
-    debug('ondata');
-    var ret = dest.write(chunk);
-    if (false === ret) {
-      // If the user unpiped during `dest.write()`, it is possible
-      // to get stuck in a permanently paused state if that write
-      // also returned false.
-      // => Check whether `dest` is still a piping destination.
-      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {
-        debug('false write response, pause', src._readableState.awaitDrain);
-        src._readableState.awaitDrain++;
-      }
-      src.pause();
-    }
-  }
-
-  // if the dest has an error, then stop piping into it.
-  // however, don't suppress the throwing behavior for this.
-  function onerror(er) {
-    debug('onerror', er);
-    unpipe();
-    dest.removeListener('error', onerror);
-    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);
-  }
-
-  // Make sure our error handler is attached before userland ones.
-  prependListener(dest, 'error', onerror);
-
-  // Both close and finish should trigger unpipe, but only once.
-  function onclose() {
-    dest.removeListener('finish', onfinish);
-    unpipe();
-  }
-  dest.once('close', onclose);
-  function onfinish() {
-    debug('onfinish');
-    dest.removeListener('close', onclose);
-    unpipe();
-  }
-  dest.once('finish', onfinish);
-
-  function unpipe() {
-    debug('unpipe');
-    src.unpipe(dest);
-  }
-
-  // tell the dest that it's being piped to
-  dest.emit('pipe', src);
-
-  // start the flow if it hasn't been started already.
-  if (!state.flowing) {
-    debug('pipe resume');
-    src.resume();
-  }
-
-  return dest;
-};
-
-function pipeOnDrain(src) {
-  return function () {
-    var state = src._readableState;
-    debug('pipeOnDrain', state.awaitDrain);
-    if (state.awaitDrain) state.awaitDrain--;
-    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {
-      state.flowing = true;
-      flow(src);
-    }
-  };
-}
-
-Readable.prototype.unpipe = function (dest) {
-  var state = this._readableState;
-
-  // if we're not piping anywhere, then do nothing.
-  if (state.pipesCount === 0) return this;
-
-  // just one destination.  most common case.
-  if (state.pipesCount === 1) {
-    // passed in one, but it's not the right one.
-    if (dest && dest !== state.pipes) return this;
-
-    if (!dest) dest = state.pipes;
-
-    // got a match.
-    state.pipes = null;
-    state.pipesCount = 0;
-    state.flowing = false;
-    if (dest) dest.emit('unpipe', this);
-    return this;
-  }
-
-  // slow case. multiple pipe destinations.
-
-  if (!dest) {
-    // remove all.
-    var dests = state.pipes;
-    var len = state.pipesCount;
-    state.pipes = null;
-    state.pipesCount = 0;
-    state.flowing = false;
-
-    for (var _i = 0; _i < len; _i++) {
-      dests[_i].emit('unpipe', this);
-    }return this;
-  }
-
-  // try to find the right one.
-  var i = indexOf(state.pipes, dest);
-  if (i === -1) return this;
-
-  state.pipes.splice(i, 1);
-  state.pipesCount -= 1;
-  if (state.pipesCount === 1) state.pipes = state.pipes[0];
-
-  dest.emit('unpipe', this);
-
-  return this;
-};
-
-// set up data events if they are asked for
-// Ensure readable listeners eventually get something
-Readable.prototype.on = function (ev, fn) {
-  var res = Stream.prototype.on.call(this, ev, fn);
-
-  // If listening to data, and it has not explicitly been paused,
-  // then call resume to start the flow of data on the next tick.
-  if (ev === 'data' && false !== this._readableState.flowing) {
-    this.resume();
-  }
-
-  if (ev === 'readable' && !this._readableState.endEmitted) {
-    var state = this._readableState;
-    if (!state.readableListening) {
-      state.readableListening = true;
-      state.emittedReadable = false;
-      state.needReadable = true;
-      if (!state.reading) {
-        processNextTick(nReadingNextTick, this);
-      } else if (state.length) {
-        emitReadable(this, state);
-      }
-    }
-  }
-
-  return res;
-};
-Readable.prototype.addListener = Readable.prototype.on;
-
-function nReadingNextTick(self) {
-  debug('readable nexttick read 0');
-  self.read(0);
-}
-
-// pause() and resume() are remnants of the legacy readable stream API
-// If the user uses them, then switch into old mode.
-Readable.prototype.resume = function () {
-  var state = this._readableState;
-  if (!state.flowing) {
-    debug('resume');
-    state.flowing = true;
-    resume(this, state);
-  }
-  return this;
-};
-
-function resume(stream, state) {
-  if (!state.resumeScheduled) {
-    state.resumeScheduled = true;
-    processNextTick(resume_, stream, state);
-  }
-}
-
-function resume_(stream, state) {
-  if (!state.reading) {
-    debug('resume read 0');
-    stream.read(0);
-  }
-
-  state.resumeScheduled = false;
-  stream.emit('resume');
-  flow(stream);
-  if (state.flowing && !state.reading) stream.read(0);
-}
-
-Readable.prototype.pause = function () {
-  debug('call pause flowing=%j', this._readableState.flowing);
-  if (false !== this._readableState.flowing) {
-    debug('pause');
-    this._readableState.flowing = false;
-    this.emit('pause');
-  }
-  return this;
-};
-
-function flow(stream) {
-  var state = stream._readableState;
-  debug('flow', state.flowing);
-  if (state.flowing) {
-    do {
-      var chunk = stream.read();
-    } while (null !== chunk && state.flowing);
-  }
-}
-
-// wrap an old-style stream as the async data source.
-// This is *not* part of the readable stream interface.
-// It is an ugly unfortunate mess of history.
-Readable.prototype.wrap = function (stream) {
-  var state = this._readableState;
-  var paused = false;
-
-  var self = this;
-  stream.on('end', function () {
-    debug('wrapped end');
-    if (state.decoder && !state.ended) {
-      var chunk = state.decoder.end();
-      if (chunk && chunk.length) self.push(chunk);
-    }
-
-    self.push(null);
-  });
-
-  stream.on('data', function (chunk) {
-    debug('wrapped data');
-    if (state.decoder) chunk = state.decoder.write(chunk);
-
-    // don't skip over falsy values in objectMode
-    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;
-
-    var ret = self.push(chunk);
-    if (!ret) {
-      paused = true;
-      stream.pause();
-    }
-  });
-
-  // proxy all the other methods.
-  // important when wrapping filters and duplexes.
-  for (var i in stream) {
-    if (this[i] === undefined && typeof stream[i] === 'function') {
-      this[i] = function (method) {
-        return function () {
-          return stream[method].apply(stream, arguments);
-        };
-      }(i);
-    }
-  }
-
-  // proxy certain important events.
-  var events = ['error', 'close', 'destroy', 'pause', 'resume'];
-  forEach(events, function (ev) {
-    stream.on(ev, self.emit.bind(self, ev));
-  });
-
-  // when we try to consume some more bytes, simply unpause the
-  // underlying stream.
-  self._read = function (n) {
-    debug('wrapped _read', n);
-    if (paused) {
-      paused = false;
-      stream.resume();
-    }
-  };
-
-  return self;
-};
-
-// exposed for testing purposes only.
-Readable._fromList = fromList;
-
-// Pluck off n bytes from an array of buffers.
-// Length is the combined lengths of all the buffers in the list.
-function fromList(n, state) {
-  var list = state.buffer;
-  var length = state.length;
-  var stringMode = !!state.decoder;
-  var objectMode = !!state.objectMode;
-  var ret;
-
-  // nothing in the list, definitely empty.
-  if (list.length === 0) return null;
-
-  if (length === 0) ret = null;else if (objectMode) ret = list.shift();else if (!n || n >= length) {
-    // read it all, truncate the array.
-    if (stringMode) ret = list.join('');else if (list.length === 1) ret = list[0];else ret = Buffer.concat(list, length);
-    list.length = 0;
-  } else {
-    // read just some of it.
-    if (n < list[0].length) {
-      // just take a part of the first list item.
-      // slice is the same for buffers and strings.
-      var buf = list[0];
-      ret = buf.slice(0, n);
-      list[0] = buf.slice(n);
-    } else if (n === list[0].length) {
-      // first list is a perfect match
-      ret = list.shift();
-    } else {
-      // complex case.
-      // we have enough to cover it, but it spans past the first buffer.
-      if (stringMode) ret = '';else ret = bufferShim.allocUnsafe(n);
-
-      var c = 0;
-      for (var i = 0, l = list.length; i < l && c < n; i++) {
-        var _buf = list[0];
-        var cpy = Math.min(n - c, _buf.length);
-
-        if (stringMode) ret += _buf.slice(0, cpy);else _buf.copy(ret, c, 0, cpy);
-
-        if (cpy < _buf.length) list[0] = _buf.slice(cpy);else list.shift();
-
-        c += cpy;
-      }
-    }
-  }
-
-  return ret;
-}
-
-function endReadable(stream) {
-  var state = stream._readableState;
-
-  // If we get here before consuming all the bytes, then that is a
-  // bug in node.  Should never happen.
-  if (state.length > 0) throw new Error('"endReadable()" called on non-empty stream');
-
-  if (!state.endEmitted) {
-    state.ended = true;
-    processNextTick(endReadableNT, state, stream);
-  }
-}
-
-function endReadableNT(state, stream) {
-  // Check that we didn't get one last unshift.
-  if (!state.endEmitted && state.length === 0) {
-    state.endEmitted = true;
-    stream.readable = false;
-    stream.emit('end');
-  }
-}
-
-function forEach(xs, f) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    f(xs[i], i);
-  }
-}
-
-function indexOf(xs, x) {
-  for (var i = 0, l = xs.length; i < l; i++) {
-    if (xs[i] === x) return i;
-  }
-  return -1;
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_transform.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_transform.js
deleted file mode 100644
index dbc996ede62363a062917c897b13749b2501e871..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_transform.js
+++ /dev/null
@@ -1,180 +0,0 @@
-// a transform stream is a readable/writable stream where you do
-// something with the data.  Sometimes it's called a "filter",
-// but that's not a great name for it, since that implies a thing where
-// some bits pass through, and others are simply ignored.  (That would
-// be a valid example of a transform, of course.)
-//
-// While the output is causally related to the input, it's not a
-// necessarily symmetric or synchronous transformation.  For example,
-// a zlib stream might take multiple plain-text writes(), and then
-// emit a single compressed chunk some time in the future.
-//
-// Here's how this works:
-//
-// The Transform stream has all the aspects of the readable and writable
-// stream classes.  When you write(chunk), that calls _write(chunk,cb)
-// internally, and returns false if there's a lot of pending writes
-// buffered up.  When you call read(), that calls _read(n) until
-// there's enough pending readable data buffered up.
-//
-// In a transform stream, the written data is placed in a buffer.  When
-// _read(n) is called, it transforms the queued up data, calling the
-// buffered _write cb's as it consumes chunks.  If consuming a single
-// written chunk would result in multiple output chunks, then the first
-// outputted bit calls the readcb, and subsequent chunks just go into
-// the read buffer, and will cause it to emit 'readable' if necessary.
-//
-// This way, back-pressure is actually determined by the reading side,
-// since _read has to be called to start processing a new chunk.  However,
-// a pathological inflate type of transform can cause excessive buffering
-// here.  For example, imagine a stream where every byte of input is
-// interpreted as an integer from 0-255, and then results in that many
-// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in
-// 1kb of data being output.  In this case, you could write a very small
-// amount of input, and end up with a very large amount of output.  In
-// such a pathological inflating mechanism, there'd be no way to tell
-// the system to stop doing the transform.  A single 4MB write could
-// cause the system to run out of memory.
-//
-// However, even in such a pathological case, only a single written chunk
-// would be consumed, and then the rest would wait (un-transformed) until
-// the results of the previous transformed chunk were consumed.
-
-'use strict';
-
-module.exports = Transform;
-
-var Duplex = require('./_stream_duplex');
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-util.inherits(Transform, Duplex);
-
-function TransformState(stream) {
-  this.afterTransform = function (er, data) {
-    return afterTransform(stream, er, data);
-  };
-
-  this.needTransform = false;
-  this.transforming = false;
-  this.writecb = null;
-  this.writechunk = null;
-  this.writeencoding = null;
-}
-
-function afterTransform(stream, er, data) {
-  var ts = stream._transformState;
-  ts.transforming = false;
-
-  var cb = ts.writecb;
-
-  if (!cb) return stream.emit('error', new Error('no writecb in Transform class'));
-
-  ts.writechunk = null;
-  ts.writecb = null;
-
-  if (data !== null && data !== undefined) stream.push(data);
-
-  cb(er);
-
-  var rs = stream._readableState;
-  rs.reading = false;
-  if (rs.needReadable || rs.length < rs.highWaterMark) {
-    stream._read(rs.highWaterMark);
-  }
-}
-
-function Transform(options) {
-  if (!(this instanceof Transform)) return new Transform(options);
-
-  Duplex.call(this, options);
-
-  this._transformState = new TransformState(this);
-
-  // when the writable side finishes, then flush out anything remaining.
-  var stream = this;
-
-  // start out asking for a readable event once data is transformed.
-  this._readableState.needReadable = true;
-
-  // we have implemented the _read method, and done the other things
-  // that Readable wants before the first _read call, so unset the
-  // sync guard flag.
-  this._readableState.sync = false;
-
-  if (options) {
-    if (typeof options.transform === 'function') this._transform = options.transform;
-
-    if (typeof options.flush === 'function') this._flush = options.flush;
-  }
-
-  this.once('prefinish', function () {
-    if (typeof this._flush === 'function') this._flush(function (er) {
-      done(stream, er);
-    });else done(stream);
-  });
-}
-
-Transform.prototype.push = function (chunk, encoding) {
-  this._transformState.needTransform = false;
-  return Duplex.prototype.push.call(this, chunk, encoding);
-};
-
-// This is the part where you do stuff!
-// override this function in implementation classes.
-// 'chunk' is an input chunk.
-//
-// Call `push(newChunk)` to pass along transformed output
-// to the readable side.  You may call 'push' zero or more times.
-//
-// Call `cb(err)` when you are done with this chunk.  If you pass
-// an error, then that'll put the hurt on the whole operation.  If you
-// never call cb(), then you'll never get another chunk.
-Transform.prototype._transform = function (chunk, encoding, cb) {
-  throw new Error('Not implemented');
-};
-
-Transform.prototype._write = function (chunk, encoding, cb) {
-  var ts = this._transformState;
-  ts.writecb = cb;
-  ts.writechunk = chunk;
-  ts.writeencoding = encoding;
-  if (!ts.transforming) {
-    var rs = this._readableState;
-    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);
-  }
-};
-
-// Doesn't matter what the args are here.
-// _transform does all the work.
-// That we got here means that the readable side wants more data.
-Transform.prototype._read = function (n) {
-  var ts = this._transformState;
-
-  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {
-    ts.transforming = true;
-    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);
-  } else {
-    // mark that we need a transform, so that any data that comes in
-    // will get processed, now that we've asked for it.
-    ts.needTransform = true;
-  }
-};
-
-function done(stream, er) {
-  if (er) return stream.emit('error', er);
-
-  // if there's nothing in the write buffer, then that means
-  // that nothing more will ever be provided
-  var ws = stream._writableState;
-  var ts = stream._transformState;
-
-  if (ws.length) throw new Error('Calling transform done when ws.length != 0');
-
-  if (ts.transforming) throw new Error('Calling transform done when still transforming');
-
-  return stream.push(null);
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_writable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_writable.js
deleted file mode 100644
index ed5efcbd203208af0aa0cb1ef0cc9d4c45f8bbf4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/lib/_stream_writable.js
+++ /dev/null
@@ -1,526 +0,0 @@
-// A bit simpler than readable streams.
-// Implement an async ._write(chunk, encoding, cb), and it'll handle all
-// the drain event emission and buffering.
-
-'use strict';
-
-module.exports = Writable;
-
-/*<replacement>*/
-var processNextTick = require('process-nextick-args');
-/*</replacement>*/
-
-/*<replacement>*/
-var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick;
-/*</replacement>*/
-
-Writable.WritableState = WritableState;
-
-/*<replacement>*/
-var util = require('core-util-is');
-util.inherits = require('inherits');
-/*</replacement>*/
-
-/*<replacement>*/
-var internalUtil = {
-  deprecate: require('util-deprecate')
-};
-/*</replacement>*/
-
-/*<replacement>*/
-var Stream;
-(function () {
-  try {
-    Stream = require('st' + 'ream');
-  } catch (_) {} finally {
-    if (!Stream) Stream = require('events').EventEmitter;
-  }
-})();
-/*</replacement>*/
-
-var Buffer = require('buffer').Buffer;
-/*<replacement>*/
-var bufferShim = require('buffer-shims');
-/*</replacement>*/
-
-util.inherits(Writable, Stream);
-
-function nop() {}
-
-function WriteReq(chunk, encoding, cb) {
-  this.chunk = chunk;
-  this.encoding = encoding;
-  this.callback = cb;
-  this.next = null;
-}
-
-var Duplex;
-function WritableState(options, stream) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  options = options || {};
-
-  // object stream flag to indicate whether or not this stream
-  // contains buffers or objects.
-  this.objectMode = !!options.objectMode;
-
-  if (stream instanceof Duplex) this.objectMode = this.objectMode || !!options.writableObjectMode;
-
-  // the point at which write() starts returning false
-  // Note: 0 is a valid value, means that we always return false if
-  // the entire buffer is not flushed immediately on write()
-  var hwm = options.highWaterMark;
-  var defaultHwm = this.objectMode ? 16 : 16 * 1024;
-  this.highWaterMark = hwm || hwm === 0 ? hwm : defaultHwm;
-
-  // cast to ints.
-  this.highWaterMark = ~ ~this.highWaterMark;
-
-  this.needDrain = false;
-  // at the start of calling end()
-  this.ending = false;
-  // when end() has been called, and returned
-  this.ended = false;
-  // when 'finish' is emitted
-  this.finished = false;
-
-  // should we decode strings into buffers before passing to _write?
-  // this is here so that some node-core streams can optimize string
-  // handling at a lower level.
-  var noDecode = options.decodeStrings === false;
-  this.decodeStrings = !noDecode;
-
-  // Crypto is kind of old and crusty.  Historically, its default string
-  // encoding is 'binary' so we have to make this configurable.
-  // Everything else in the universe uses 'utf8', though.
-  this.defaultEncoding = options.defaultEncoding || 'utf8';
-
-  // not an actual buffer we keep track of, but a measurement
-  // of how much we're waiting to get pushed to some underlying
-  // socket or file.
-  this.length = 0;
-
-  // a flag to see when we're in the middle of a write.
-  this.writing = false;
-
-  // when true all writes will be buffered until .uncork() call
-  this.corked = 0;
-
-  // a flag to be able to tell if the onwrite cb is called immediately,
-  // or on a later tick.  We set this to true at first, because any
-  // actions that shouldn't happen until "later" should generally also
-  // not happen before the first write call.
-  this.sync = true;
-
-  // a flag to know if we're processing previously buffered items, which
-  // may call the _write() callback in the same tick, so that we don't
-  // end up in an overlapped onwrite situation.
-  this.bufferProcessing = false;
-
-  // the callback that's passed to _write(chunk,cb)
-  this.onwrite = function (er) {
-    onwrite(stream, er);
-  };
-
-  // the callback that the user supplies to write(chunk,encoding,cb)
-  this.writecb = null;
-
-  // the amount that is being written when _write is called.
-  this.writelen = 0;
-
-  this.bufferedRequest = null;
-  this.lastBufferedRequest = null;
-
-  // number of pending user-supplied write callbacks
-  // this must be 0 before 'finish' can be emitted
-  this.pendingcb = 0;
-
-  // emit prefinish if the only thing we're waiting for is _write cbs
-  // This is relevant for synchronous Transform streams
-  this.prefinished = false;
-
-  // True if the error was already emitted and should not be thrown again
-  this.errorEmitted = false;
-
-  // count buffered requests
-  this.bufferedRequestCount = 0;
-
-  // allocate the first CorkedRequest, there is always
-  // one allocated and free to use, and we maintain at most two
-  this.corkedRequestsFree = new CorkedRequest(this);
-}
-
-WritableState.prototype.getBuffer = function writableStateGetBuffer() {
-  var current = this.bufferedRequest;
-  var out = [];
-  while (current) {
-    out.push(current);
-    current = current.next;
-  }
-  return out;
-};
-
-(function () {
-  try {
-    Object.defineProperty(WritableState.prototype, 'buffer', {
-      get: internalUtil.deprecate(function () {
-        return this.getBuffer();
-      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.')
-    });
-  } catch (_) {}
-})();
-
-var Duplex;
-function Writable(options) {
-  Duplex = Duplex || require('./_stream_duplex');
-
-  // Writable ctor is applied to Duplexes, though they're not
-  // instanceof Writable, they're instanceof Readable.
-  if (!(this instanceof Writable) && !(this instanceof Duplex)) return new Writable(options);
-
-  this._writableState = new WritableState(options, this);
-
-  // legacy.
-  this.writable = true;
-
-  if (options) {
-    if (typeof options.write === 'function') this._write = options.write;
-
-    if (typeof options.writev === 'function') this._writev = options.writev;
-  }
-
-  Stream.call(this);
-}
-
-// Otherwise people can pipe Writable streams, which is just wrong.
-Writable.prototype.pipe = function () {
-  this.emit('error', new Error('Cannot pipe, not readable'));
-};
-
-function writeAfterEnd(stream, cb) {
-  var er = new Error('write after end');
-  // TODO: defer error events consistently everywhere, not just the cb
-  stream.emit('error', er);
-  processNextTick(cb, er);
-}
-
-// If we get something that is not a buffer, string, null, or undefined,
-// and we're not in objectMode, then that's an error.
-// Otherwise stream chunks are all considered to be of length=1, and the
-// watermarks determine how many objects to keep in the buffer, rather than
-// how many bytes or characters.
-function validChunk(stream, state, chunk, cb) {
-  var valid = true;
-  var er = false;
-  // Always throw error if a null is written
-  // if we are not in object mode then throw
-  // if it is not a buffer, string, or undefined.
-  if (chunk === null) {
-    er = new TypeError('May not write null values to stream');
-  } else if (!Buffer.isBuffer(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {
-    er = new TypeError('Invalid non-string/buffer chunk');
-  }
-  if (er) {
-    stream.emit('error', er);
-    processNextTick(cb, er);
-    valid = false;
-  }
-  return valid;
-}
-
-Writable.prototype.write = function (chunk, encoding, cb) {
-  var state = this._writableState;
-  var ret = false;
-
-  if (typeof encoding === 'function') {
-    cb = encoding;
-    encoding = null;
-  }
-
-  if (Buffer.isBuffer(chunk)) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;
-
-  if (typeof cb !== 'function') cb = nop;
-
-  if (state.ended) writeAfterEnd(this, cb);else if (validChunk(this, state, chunk, cb)) {
-    state.pendingcb++;
-    ret = writeOrBuffer(this, state, chunk, encoding, cb);
-  }
-
-  return ret;
-};
-
-Writable.prototype.cork = function () {
-  var state = this._writableState;
-
-  state.corked++;
-};
-
-Writable.prototype.uncork = function () {
-  var state = this._writableState;
-
-  if (state.corked) {
-    state.corked--;
-
-    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);
-  }
-};
-
-Writable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {
-  // node::ParseEncoding() requires lower case.
-  if (typeof encoding === 'string') encoding = encoding.toLowerCase();
-  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);
-  this._writableState.defaultEncoding = encoding;
-  return this;
-};
-
-function decodeChunk(state, chunk, encoding) {
-  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {
-    chunk = bufferShim.from(chunk, encoding);
-  }
-  return chunk;
-}
-
-// if we're already writing something, then just put this
-// in the queue, and wait our turn.  Otherwise, call _write
-// If we return false, then we need a drain event, so set that flag.
-function writeOrBuffer(stream, state, chunk, encoding, cb) {
-  chunk = decodeChunk(state, chunk, encoding);
-
-  if (Buffer.isBuffer(chunk)) encoding = 'buffer';
-  var len = state.objectMode ? 1 : chunk.length;
-
-  state.length += len;
-
-  var ret = state.length < state.highWaterMark;
-  // we must ensure that previous needDrain will not be reset to false.
-  if (!ret) state.needDrain = true;
-
-  if (state.writing || state.corked) {
-    var last = state.lastBufferedRequest;
-    state.lastBufferedRequest = new WriteReq(chunk, encoding, cb);
-    if (last) {
-      last.next = state.lastBufferedRequest;
-    } else {
-      state.bufferedRequest = state.lastBufferedRequest;
-    }
-    state.bufferedRequestCount += 1;
-  } else {
-    doWrite(stream, state, false, len, chunk, encoding, cb);
-  }
-
-  return ret;
-}
-
-function doWrite(stream, state, writev, len, chunk, encoding, cb) {
-  state.writelen = len;
-  state.writecb = cb;
-  state.writing = true;
-  state.sync = true;
-  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);
-  state.sync = false;
-}
-
-function onwriteError(stream, state, sync, er, cb) {
-  --state.pendingcb;
-  if (sync) processNextTick(cb, er);else cb(er);
-
-  stream._writableState.errorEmitted = true;
-  stream.emit('error', er);
-}
-
-function onwriteStateUpdate(state) {
-  state.writing = false;
-  state.writecb = null;
-  state.length -= state.writelen;
-  state.writelen = 0;
-}
-
-function onwrite(stream, er) {
-  var state = stream._writableState;
-  var sync = state.sync;
-  var cb = state.writecb;
-
-  onwriteStateUpdate(state);
-
-  if (er) onwriteError(stream, state, sync, er, cb);else {
-    // Check if we're actually ready to finish, but don't emit yet
-    var finished = needFinish(state);
-
-    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {
-      clearBuffer(stream, state);
-    }
-
-    if (sync) {
-      /*<replacement>*/
-      asyncWrite(afterWrite, stream, state, finished, cb);
-      /*</replacement>*/
-    } else {
-        afterWrite(stream, state, finished, cb);
-      }
-  }
-}
-
-function afterWrite(stream, state, finished, cb) {
-  if (!finished) onwriteDrain(stream, state);
-  state.pendingcb--;
-  cb();
-  finishMaybe(stream, state);
-}
-
-// Must force callback to be called on nextTick, so that we don't
-// emit 'drain' before the write() consumer gets the 'false' return
-// value, and has a chance to attach a 'drain' listener.
-function onwriteDrain(stream, state) {
-  if (state.length === 0 && state.needDrain) {
-    state.needDrain = false;
-    stream.emit('drain');
-  }
-}
-
-// if there's something in the buffer waiting, then process it
-function clearBuffer(stream, state) {
-  state.bufferProcessing = true;
-  var entry = state.bufferedRequest;
-
-  if (stream._writev && entry && entry.next) {
-    // Fast case, write everything using _writev()
-    var l = state.bufferedRequestCount;
-    var buffer = new Array(l);
-    var holder = state.corkedRequestsFree;
-    holder.entry = entry;
-
-    var count = 0;
-    while (entry) {
-      buffer[count] = entry;
-      entry = entry.next;
-      count += 1;
-    }
-
-    doWrite(stream, state, true, state.length, buffer, '', holder.finish);
-
-    // doWrite is almost always async, defer these to save a bit of time
-    // as the hot path ends with doWrite
-    state.pendingcb++;
-    state.lastBufferedRequest = null;
-    if (holder.next) {
-      state.corkedRequestsFree = holder.next;
-      holder.next = null;
-    } else {
-      state.corkedRequestsFree = new CorkedRequest(state);
-    }
-  } else {
-    // Slow case, write chunks one-by-one
-    while (entry) {
-      var chunk = entry.chunk;
-      var encoding = entry.encoding;
-      var cb = entry.callback;
-      var len = state.objectMode ? 1 : chunk.length;
-
-      doWrite(stream, state, false, len, chunk, encoding, cb);
-      entry = entry.next;
-      // if we didn't call the onwrite immediately, then
-      // it means that we need to wait until it does.
-      // also, that means that the chunk and cb are currently
-      // being processed, so move the buffer counter past them.
-      if (state.writing) {
-        break;
-      }
-    }
-
-    if (entry === null) state.lastBufferedRequest = null;
-  }
-
-  state.bufferedRequestCount = 0;
-  state.bufferedRequest = entry;
-  state.bufferProcessing = false;
-}
-
-Writable.prototype._write = function (chunk, encoding, cb) {
-  cb(new Error('not implemented'));
-};
-
-Writable.prototype._writev = null;
-
-Writable.prototype.end = function (chunk, encoding, cb) {
-  var state = this._writableState;
-
-  if (typeof chunk === 'function') {
-    cb = chunk;
-    chunk = null;
-    encoding = null;
-  } else if (typeof encoding === 'function') {
-    cb = encoding;
-    encoding = null;
-  }
-
-  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);
-
-  // .end() fully uncorks
-  if (state.corked) {
-    state.corked = 1;
-    this.uncork();
-  }
-
-  // ignore unnecessary end() calls.
-  if (!state.ending && !state.finished) endWritable(this, state, cb);
-};
-
-function needFinish(state) {
-  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;
-}
-
-function prefinish(stream, state) {
-  if (!state.prefinished) {
-    state.prefinished = true;
-    stream.emit('prefinish');
-  }
-}
-
-function finishMaybe(stream, state) {
-  var need = needFinish(state);
-  if (need) {
-    if (state.pendingcb === 0) {
-      prefinish(stream, state);
-      state.finished = true;
-      stream.emit('finish');
-    } else {
-      prefinish(stream, state);
-    }
-  }
-  return need;
-}
-
-function endWritable(stream, state, cb) {
-  state.ending = true;
-  finishMaybe(stream, state);
-  if (cb) {
-    if (state.finished) processNextTick(cb);else stream.once('finish', cb);
-  }
-  state.ended = true;
-  stream.writable = false;
-}
-
-// It seems a linked list but it is not
-// there will be only 2 of these for each stream
-function CorkedRequest(state) {
-  var _this = this;
-
-  this.next = null;
-  this.entry = null;
-
-  this.finish = function (err) {
-    var entry = _this.entry;
-    _this.entry = null;
-    while (entry) {
-      var cb = entry.callback;
-      state.pendingcb--;
-      cb(err);
-      entry = entry.next;
-    }
-    if (state.corkedRequestsFree) {
-      state.corkedRequestsFree.next = _this;
-    } else {
-      state.corkedRequestsFree = _this;
-    }
-  };
-}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/index.js
deleted file mode 100644
index 1cab4c05e1ac2aee65e3985f162efb880c2ae439..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/index.js
+++ /dev/null
@@ -1,108 +0,0 @@
-'use strict';
-
-var buffer = require('buffer');
-var Buffer = buffer.Buffer;
-var SlowBuffer = buffer.SlowBuffer;
-var MAX_LEN = buffer.kMaxLength || 2147483647;
-exports.alloc = function alloc(size, fill, encoding) {
-  if (typeof Buffer.alloc === 'function') {
-    return Buffer.alloc(size, fill, encoding);
-  }
-  if (typeof encoding === 'number') {
-    throw new TypeError('encoding must not be number');
-  }
-  if (typeof size !== 'number') {
-    throw new TypeError('size must be a number');
-  }
-  if (size > MAX_LEN) {
-    throw new RangeError('size is too large');
-  }
-  var enc = encoding;
-  var _fill = fill;
-  if (_fill === undefined) {
-    enc = undefined;
-    _fill = 0;
-  }
-  var buf = new Buffer(size);
-  if (typeof _fill === 'string') {
-    var fillBuf = new Buffer(_fill, enc);
-    var flen = fillBuf.length;
-    var i = -1;
-    while (++i < size) {
-      buf[i] = fillBuf[i % flen];
-    }
-  } else {
-    buf.fill(_fill);
-  }
-  return buf;
-}
-exports.allocUnsafe = function allocUnsafe(size) {
-  if (typeof Buffer.allocUnsafe === 'function') {
-    return Buffer.allocUnsafe(size);
-  }
-  if (typeof size !== 'number') {
-    throw new TypeError('size must be a number');
-  }
-  if (size > MAX_LEN) {
-    throw new RangeError('size is too large');
-  }
-  return new Buffer(size);
-}
-exports.from = function from(value, encodingOrOffset, length) {
-  if (typeof Buffer.from === 'function' && (!global.Uint8Array || Uint8Array.from !== Buffer.from)) {
-    return Buffer.from(value, encodingOrOffset, length);
-  }
-  if (typeof value === 'number') {
-    throw new TypeError('"value" argument must not be a number');
-  }
-  if (typeof value === 'string') {
-    return new Buffer(value, encodingOrOffset);
-  }
-  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
-    var offset = encodingOrOffset;
-    if (arguments.length === 1) {
-      return new Buffer(value);
-    }
-    if (typeof offset === 'undefined') {
-      offset = 0;
-    }
-    var len = length;
-    if (typeof len === 'undefined') {
-      len = value.byteLength - offset;
-    }
-    if (offset >= value.byteLength) {
-      throw new RangeError('\'offset\' is out of bounds');
-    }
-    if (len > value.byteLength - offset) {
-      throw new RangeError('\'length\' is out of bounds');
-    }
-    return new Buffer(value.slice(offset, offset + len));
-  }
-  if (Buffer.isBuffer(value)) {
-    var out = new Buffer(value.length);
-    value.copy(out, 0, 0, value.length);
-    return out;
-  }
-  if (value) {
-    if (Array.isArray(value) || (typeof ArrayBuffer !== 'undefined' && value.buffer instanceof ArrayBuffer) || 'length' in value) {
-      return new Buffer(value);
-    }
-    if (value.type === 'Buffer' && Array.isArray(value.data)) {
-      return new Buffer(value.data);
-    }
-  }
-
-  throw new TypeError('First argument must be a string, Buffer, ' + 'ArrayBuffer, Array, or array-like object.');
-}
-exports.allocUnsafeSlow = function allocUnsafeSlow(size) {
-  if (typeof Buffer.allocUnsafeSlow === 'function') {
-    return Buffer.allocUnsafeSlow(size);
-  }
-  if (typeof size !== 'number') {
-    throw new TypeError('size must be a number');
-  }
-  if (size >= MAX_LEN) {
-    throw new RangeError('size is too large');
-  }
-  return new SlowBuffer(size);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/license.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/license.md
deleted file mode 100644
index 01cfaefe2fcaff52c01ea4a5898de7c9fbdf73d0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/license.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (c) 2016 Calvin Metcalf
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.**
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/package.json
deleted file mode 100644
index ac0137e6c787357ca0420677abcbfa3a9fb7e057..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/package.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "_from": "buffer-shims@>=1.0.0 <2.0.0",
-  "_id": "buffer-shims@1.0.0",
-  "_location": "/serialport/node-pre-gyp/tar-pack/readable-stream/buffer-shims",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz",
-  "_shasum": "9978ce317388c649ad8793028c3477ef044a8b51",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/calvinmetcalf/buffer-shims/issues"
-  },
-  "dependencies": {},
-  "description": "some shims for node buffers",
-  "devDependencies": {
-    "tape": "^4.5.1"
-  },
-  "files": [
-    "index.js"
-  ],
-  "homepage": "https://github.com/calvinmetcalf/buffer-shims#readme",
-  "license": "MIT",
-  "main": "index.js",
-  "name": "buffer-shims",
-  "optionalDependencies": {},
-  "readme": "buffer-shims\n===\n\nfunctions to make sure the new buffer methods work in older browsers.\n\n```js\nvar bufferShim = require('buffer-shims');\nbufferShim.from('foo');\nbufferShim.alloc(9, 'cafeface', 'hex');\nbufferShim.allocUnsafe(15);\nbufferShim.allocUnsafeSlow(21);\n```\n\nshould just use the original  in newer nodes and on older nodes uses fallbacks.\n\nKnown Issues\n===\n- this does not patch the buffer object, only the constructor stuff\n- it's actually a polyfill\n\n![](https://i.imgur.com/zxII3jJ.gif)\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+ssh://git@github.com/calvinmetcalf/buffer-shims.git"
-  },
-  "scripts": {
-    "test": "tape test/*.js"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/readme.md
deleted file mode 100644
index 7ea6475e284e8eddd5c7ffff5757b3d05061c586..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/buffer-shims/readme.md
+++ /dev/null
@@ -1,21 +0,0 @@
-buffer-shims
-===
-
-functions to make sure the new buffer methods work in older browsers.
-
-```js
-var bufferShim = require('buffer-shims');
-bufferShim.from('foo');
-bufferShim.alloc(9, 'cafeface', 'hex');
-bufferShim.allocUnsafe(15);
-bufferShim.allocUnsafeSlow(21);
-```
-
-should just use the original  in newer nodes and on older nodes uses fallbacks.
-
-Known Issues
-===
-- this does not patch the buffer object, only the constructor stuff
-- it's actually a polyfill
-
-![](https://i.imgur.com/zxII3jJ.gif)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/LICENSE
deleted file mode 100644
index d8d7f9437dbf5ad54701a187f05988bcf0006fd8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/LICENSE
+++ /dev/null
@@ -1,19 +0,0 @@
-Copyright Node.js contributors. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to
-deal in the Software without restriction, including without limitation the
-rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-sell copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/README.md
deleted file mode 100644
index 5a76b4149c5eb5077c09578e349820bccbbd266e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# core-util-is
-
-The `util.is*` functions introduced in Node v0.12.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/float.patch b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/float.patch
deleted file mode 100644
index a06d5c05f75fd5617f8849b43a88e0e3d8d824e9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/float.patch
+++ /dev/null
@@ -1,604 +0,0 @@
-diff --git a/lib/util.js b/lib/util.js
-index a03e874..9074e8e 100644
---- a/lib/util.js
-+++ b/lib/util.js
-@@ -19,430 +19,6 @@
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- // USE OR OTHER DEALINGS IN THE SOFTWARE.
-
--var formatRegExp = /%[sdj%]/g;
--exports.format = function(f) {
--  if (!isString(f)) {
--    var objects = [];
--    for (var i = 0; i < arguments.length; i++) {
--      objects.push(inspect(arguments[i]));
--    }
--    return objects.join(' ');
--  }
--
--  var i = 1;
--  var args = arguments;
--  var len = args.length;
--  var str = String(f).replace(formatRegExp, function(x) {
--    if (x === '%%') return '%';
--    if (i >= len) return x;
--    switch (x) {
--      case '%s': return String(args[i++]);
--      case '%d': return Number(args[i++]);
--      case '%j':
--        try {
--          return JSON.stringify(args[i++]);
--        } catch (_) {
--          return '[Circular]';
--        }
--      default:
--        return x;
--    }
--  });
--  for (var x = args[i]; i < len; x = args[++i]) {
--    if (isNull(x) || !isObject(x)) {
--      str += ' ' + x;
--    } else {
--      str += ' ' + inspect(x);
--    }
--  }
--  return str;
--};
--
--
--// Mark that a method should not be used.
--// Returns a modified function which warns once by default.
--// If --no-deprecation is set, then it is a no-op.
--exports.deprecate = function(fn, msg) {
--  // Allow for deprecating things in the process of starting up.
--  if (isUndefined(global.process)) {
--    return function() {
--      return exports.deprecate(fn, msg).apply(this, arguments);
--    };
--  }
--
--  if (process.noDeprecation === true) {
--    return fn;
--  }
--
--  var warned = false;
--  function deprecated() {
--    if (!warned) {
--      if (process.throwDeprecation) {
--        throw new Error(msg);
--      } else if (process.traceDeprecation) {
--        console.trace(msg);
--      } else {
--        console.error(msg);
--      }
--      warned = true;
--    }
--    return fn.apply(this, arguments);
--  }
--
--  return deprecated;
--};
--
--
--var debugs = {};
--var debugEnviron;
--exports.debuglog = function(set) {
--  if (isUndefined(debugEnviron))
--    debugEnviron = process.env.NODE_DEBUG || '';
--  set = set.toUpperCase();
--  if (!debugs[set]) {
--    if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
--      var pid = process.pid;
--      debugs[set] = function() {
--        var msg = exports.format.apply(exports, arguments);
--        console.error('%s %d: %s', set, pid, msg);
--      };
--    } else {
--      debugs[set] = function() {};
--    }
--  }
--  return debugs[set];
--};
--
--
--/**
-- * Echos the value of a value. Trys to print the value out
-- * in the best way possible given the different types.
-- *
-- * @param {Object} obj The object to print out.
-- * @param {Object} opts Optional options object that alters the output.
-- */
--/* legacy: obj, showHidden, depth, colors*/
--function inspect(obj, opts) {
--  // default options
--  var ctx = {
--    seen: [],
--    stylize: stylizeNoColor
--  };
--  // legacy...
--  if (arguments.length >= 3) ctx.depth = arguments[2];
--  if (arguments.length >= 4) ctx.colors = arguments[3];
--  if (isBoolean(opts)) {
--    // legacy...
--    ctx.showHidden = opts;
--  } else if (opts) {
--    // got an "options" object
--    exports._extend(ctx, opts);
--  }
--  // set default options
--  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
--  if (isUndefined(ctx.depth)) ctx.depth = 2;
--  if (isUndefined(ctx.colors)) ctx.colors = false;
--  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
--  if (ctx.colors) ctx.stylize = stylizeWithColor;
--  return formatValue(ctx, obj, ctx.depth);
--}
--exports.inspect = inspect;
--
--
--// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
--inspect.colors = {
--  'bold' : [1, 22],
--  'italic' : [3, 23],
--  'underline' : [4, 24],
--  'inverse' : [7, 27],
--  'white' : [37, 39],
--  'grey' : [90, 39],
--  'black' : [30, 39],
--  'blue' : [34, 39],
--  'cyan' : [36, 39],
--  'green' : [32, 39],
--  'magenta' : [35, 39],
--  'red' : [31, 39],
--  'yellow' : [33, 39]
--};
--
--// Don't use 'blue' not visible on cmd.exe
--inspect.styles = {
--  'special': 'cyan',
--  'number': 'yellow',
--  'boolean': 'yellow',
--  'undefined': 'grey',
--  'null': 'bold',
--  'string': 'green',
--  'date': 'magenta',
--  // "name": intentionally not styling
--  'regexp': 'red'
--};
--
--
--function stylizeWithColor(str, styleType) {
--  var style = inspect.styles[styleType];
--
--  if (style) {
--    return '\u001b[' + inspect.colors[style][0] + 'm' + str +
--           '\u001b[' + inspect.colors[style][1] + 'm';
--  } else {
--    return str;
--  }
--}
--
--
--function stylizeNoColor(str, styleType) {
--  return str;
--}
--
--
--function arrayToHash(array) {
--  var hash = {};
--
--  array.forEach(function(val, idx) {
--    hash[val] = true;
--  });
--
--  return hash;
--}
--
--
--function formatValue(ctx, value, recurseTimes) {
--  // Provide a hook for user-specified inspect functions.
--  // Check that value is an object with an inspect function on it
--  if (ctx.customInspect &&
--      value &&
--      isFunction(value.inspect) &&
--      // Filter out the util module, it's inspect function is special
--      value.inspect !== exports.inspect &&
--      // Also filter out any prototype objects using the circular check.
--      !(value.constructor && value.constructor.prototype === value)) {
--    var ret = value.inspect(recurseTimes, ctx);
--    if (!isString(ret)) {
--      ret = formatValue(ctx, ret, recurseTimes);
--    }
--    return ret;
--  }
--
--  // Primitive types cannot have properties
--  var primitive = formatPrimitive(ctx, value);
--  if (primitive) {
--    return primitive;
--  }
--
--  // Look up the keys of the object.
--  var keys = Object.keys(value);
--  var visibleKeys = arrayToHash(keys);
--
--  if (ctx.showHidden) {
--    keys = Object.getOwnPropertyNames(value);
--  }
--
--  // Some type of object without properties can be shortcutted.
--  if (keys.length === 0) {
--    if (isFunction(value)) {
--      var name = value.name ? ': ' + value.name : '';
--      return ctx.stylize('[Function' + name + ']', 'special');
--    }
--    if (isRegExp(value)) {
--      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
--    }
--    if (isDate(value)) {
--      return ctx.stylize(Date.prototype.toString.call(value), 'date');
--    }
--    if (isError(value)) {
--      return formatError(value);
--    }
--  }
--
--  var base = '', array = false, braces = ['{', '}'];
--
--  // Make Array say that they are Array
--  if (isArray(value)) {
--    array = true;
--    braces = ['[', ']'];
--  }
--
--  // Make functions say that they are functions
--  if (isFunction(value)) {
--    var n = value.name ? ': ' + value.name : '';
--    base = ' [Function' + n + ']';
--  }
--
--  // Make RegExps say that they are RegExps
--  if (isRegExp(value)) {
--    base = ' ' + RegExp.prototype.toString.call(value);
--  }
--
--  // Make dates with properties first say the date
--  if (isDate(value)) {
--    base = ' ' + Date.prototype.toUTCString.call(value);
--  }
--
--  // Make error with message first say the error
--  if (isError(value)) {
--    base = ' ' + formatError(value);
--  }
--
--  if (keys.length === 0 && (!array || value.length == 0)) {
--    return braces[0] + base + braces[1];
--  }
--
--  if (recurseTimes < 0) {
--    if (isRegExp(value)) {
--      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
--    } else {
--      return ctx.stylize('[Object]', 'special');
--    }
--  }
--
--  ctx.seen.push(value);
--
--  var output;
--  if (array) {
--    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
--  } else {
--    output = keys.map(function(key) {
--      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
--    });
--  }
--
--  ctx.seen.pop();
--
--  return reduceToSingleString(output, base, braces);
--}
--
--
--function formatPrimitive(ctx, value) {
--  if (isUndefined(value))
--    return ctx.stylize('undefined', 'undefined');
--  if (isString(value)) {
--    var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
--                                             .replace(/'/g, "\\'")
--                                             .replace(/\\"/g, '"') + '\'';
--    return ctx.stylize(simple, 'string');
--  }
--  if (isNumber(value)) {
--    // Format -0 as '-0'. Strict equality won't distinguish 0 from -0,
--    // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 .
--    if (value === 0 && 1 / value < 0)
--      return ctx.stylize('-0', 'number');
--    return ctx.stylize('' + value, 'number');
--  }
--  if (isBoolean(value))
--    return ctx.stylize('' + value, 'boolean');
--  // For some reason typeof null is "object", so special case here.
--  if (isNull(value))
--    return ctx.stylize('null', 'null');
--}
--
--
--function formatError(value) {
--  return '[' + Error.prototype.toString.call(value) + ']';
--}
--
--
--function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
--  var output = [];
--  for (var i = 0, l = value.length; i < l; ++i) {
--    if (hasOwnProperty(value, String(i))) {
--      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
--          String(i), true));
--    } else {
--      output.push('');
--    }
--  }
--  keys.forEach(function(key) {
--    if (!key.match(/^\d+$/)) {
--      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
--          key, true));
--    }
--  });
--  return output;
--}
--
--
--function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
--  var name, str, desc;
--  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
--  if (desc.get) {
--    if (desc.set) {
--      str = ctx.stylize('[Getter/Setter]', 'special');
--    } else {
--      str = ctx.stylize('[Getter]', 'special');
--    }
--  } else {
--    if (desc.set) {
--      str = ctx.stylize('[Setter]', 'special');
--    }
--  }
--  if (!hasOwnProperty(visibleKeys, key)) {
--    name = '[' + key + ']';
--  }
--  if (!str) {
--    if (ctx.seen.indexOf(desc.value) < 0) {
--      if (isNull(recurseTimes)) {
--        str = formatValue(ctx, desc.value, null);
--      } else {
--        str = formatValue(ctx, desc.value, recurseTimes - 1);
--      }
--      if (str.indexOf('\n') > -1) {
--        if (array) {
--          str = str.split('\n').map(function(line) {
--            return '  ' + line;
--          }).join('\n').substr(2);
--        } else {
--          str = '\n' + str.split('\n').map(function(line) {
--            return '   ' + line;
--          }).join('\n');
--        }
--      }
--    } else {
--      str = ctx.stylize('[Circular]', 'special');
--    }
--  }
--  if (isUndefined(name)) {
--    if (array && key.match(/^\d+$/)) {
--      return str;
--    }
--    name = JSON.stringify('' + key);
--    if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
--      name = name.substr(1, name.length - 2);
--      name = ctx.stylize(name, 'name');
--    } else {
--      name = name.replace(/'/g, "\\'")
--                 .replace(/\\"/g, '"')
--                 .replace(/(^"|"$)/g, "'");
--      name = ctx.stylize(name, 'string');
--    }
--  }
--
--  return name + ': ' + str;
--}
--
--
--function reduceToSingleString(output, base, braces) {
--  var numLinesEst = 0;
--  var length = output.reduce(function(prev, cur) {
--    numLinesEst++;
--    if (cur.indexOf('\n') >= 0) numLinesEst++;
--    return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
--  }, 0);
--
--  if (length > 60) {
--    return braces[0] +
--           (base === '' ? '' : base + '\n ') +
--           ' ' +
--           output.join(',\n  ') +
--           ' ' +
--           braces[1];
--  }
--
--  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
--}
--
--
- // NOTE: These type checking functions intentionally don't use `instanceof`
- // because it is fragile and can be easily faked with `Object.create()`.
- function isArray(ar) {
-@@ -522,166 +98,10 @@ function isPrimitive(arg) {
- exports.isPrimitive = isPrimitive;
-
- function isBuffer(arg) {
--  return arg instanceof Buffer;
-+  return Buffer.isBuffer(arg);
- }
- exports.isBuffer = isBuffer;
-
- function objectToString(o) {
-   return Object.prototype.toString.call(o);
--}
--
--
--function pad(n) {
--  return n < 10 ? '0' + n.toString(10) : n.toString(10);
--}
--
--
--var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
--              'Oct', 'Nov', 'Dec'];
--
--// 26 Feb 16:19:34
--function timestamp() {
--  var d = new Date();
--  var time = [pad(d.getHours()),
--              pad(d.getMinutes()),
--              pad(d.getSeconds())].join(':');
--  return [d.getDate(), months[d.getMonth()], time].join(' ');
--}
--
--
--// log is just a thin wrapper to console.log that prepends a timestamp
--exports.log = function() {
--  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
--};
--
--
--/**
-- * Inherit the prototype methods from one constructor into another.
-- *
-- * The Function.prototype.inherits from lang.js rewritten as a standalone
-- * function (not on Function.prototype). NOTE: If this file is to be loaded
-- * during bootstrapping this function needs to be rewritten using some native
-- * functions as prototype setup using normal JavaScript does not work as
-- * expected during bootstrapping (see mirror.js in r114903).
-- *
-- * @param {function} ctor Constructor function which needs to inherit the
-- *     prototype.
-- * @param {function} superCtor Constructor function to inherit prototype from.
-- */
--exports.inherits = function(ctor, superCtor) {
--  ctor.super_ = superCtor;
--  ctor.prototype = Object.create(superCtor.prototype, {
--    constructor: {
--      value: ctor,
--      enumerable: false,
--      writable: true,
--      configurable: true
--    }
--  });
--};
--
--exports._extend = function(origin, add) {
--  // Don't do anything if add isn't an object
--  if (!add || !isObject(add)) return origin;
--
--  var keys = Object.keys(add);
--  var i = keys.length;
--  while (i--) {
--    origin[keys[i]] = add[keys[i]];
--  }
--  return origin;
--};
--
--function hasOwnProperty(obj, prop) {
--  return Object.prototype.hasOwnProperty.call(obj, prop);
--}
--
--
--// Deprecated old stuff.
--
--exports.p = exports.deprecate(function() {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    console.error(exports.inspect(arguments[i]));
--  }
--}, 'util.p: Use console.error() instead');
--
--
--exports.exec = exports.deprecate(function() {
--  return require('child_process').exec.apply(this, arguments);
--}, 'util.exec is now called `child_process.exec`.');
--
--
--exports.print = exports.deprecate(function() {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    process.stdout.write(String(arguments[i]));
--  }
--}, 'util.print: Use console.log instead');
--
--
--exports.puts = exports.deprecate(function() {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    process.stdout.write(arguments[i] + '\n');
--  }
--}, 'util.puts: Use console.log instead');
--
--
--exports.debug = exports.deprecate(function(x) {
--  process.stderr.write('DEBUG: ' + x + '\n');
--}, 'util.debug: Use console.error instead');
--
--
--exports.error = exports.deprecate(function(x) {
--  for (var i = 0, len = arguments.length; i < len; ++i) {
--    process.stderr.write(arguments[i] + '\n');
--  }
--}, 'util.error: Use console.error instead');
--
--
--exports.pump = exports.deprecate(function(readStream, writeStream, callback) {
--  var callbackCalled = false;
--
--  function call(a, b, c) {
--    if (callback && !callbackCalled) {
--      callback(a, b, c);
--      callbackCalled = true;
--    }
--  }
--
--  readStream.addListener('data', function(chunk) {
--    if (writeStream.write(chunk) === false) readStream.pause();
--  });
--
--  writeStream.addListener('drain', function() {
--    readStream.resume();
--  });
--
--  readStream.addListener('end', function() {
--    writeStream.end();
--  });
--
--  readStream.addListener('close', function() {
--    call();
--  });
--
--  readStream.addListener('error', function(err) {
--    writeStream.end();
--    call(err);
--  });
--
--  writeStream.addListener('error', function(err) {
--    readStream.destroy();
--    call(err);
--  });
--}, 'util.pump(): Use readableStream.pipe() instead');
--
--
--var uv;
--exports._errnoException = function(err, syscall) {
--  if (isUndefined(uv)) uv = process.binding('uv');
--  var errname = uv.errname(err);
--  var e = new Error(syscall + ' ' + errname);
--  e.code = errname;
--  e.errno = errname;
--  e.syscall = syscall;
--  return e;
--};
-+}
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/lib/util.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/lib/util.js
deleted file mode 100644
index ff4c851c075a2f0fd1654419178eceb22a836100..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/lib/util.js
+++ /dev/null
@@ -1,107 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// NOTE: These type checking functions intentionally don't use `instanceof`
-// because it is fragile and can be easily faked with `Object.create()`.
-
-function isArray(arg) {
-  if (Array.isArray) {
-    return Array.isArray(arg);
-  }
-  return objectToString(arg) === '[object Array]';
-}
-exports.isArray = isArray;
-
-function isBoolean(arg) {
-  return typeof arg === 'boolean';
-}
-exports.isBoolean = isBoolean;
-
-function isNull(arg) {
-  return arg === null;
-}
-exports.isNull = isNull;
-
-function isNullOrUndefined(arg) {
-  return arg == null;
-}
-exports.isNullOrUndefined = isNullOrUndefined;
-
-function isNumber(arg) {
-  return typeof arg === 'number';
-}
-exports.isNumber = isNumber;
-
-function isString(arg) {
-  return typeof arg === 'string';
-}
-exports.isString = isString;
-
-function isSymbol(arg) {
-  return typeof arg === 'symbol';
-}
-exports.isSymbol = isSymbol;
-
-function isUndefined(arg) {
-  return arg === void 0;
-}
-exports.isUndefined = isUndefined;
-
-function isRegExp(re) {
-  return objectToString(re) === '[object RegExp]';
-}
-exports.isRegExp = isRegExp;
-
-function isObject(arg) {
-  return typeof arg === 'object' && arg !== null;
-}
-exports.isObject = isObject;
-
-function isDate(d) {
-  return objectToString(d) === '[object Date]';
-}
-exports.isDate = isDate;
-
-function isError(e) {
-  return (objectToString(e) === '[object Error]' || e instanceof Error);
-}
-exports.isError = isError;
-
-function isFunction(arg) {
-  return typeof arg === 'function';
-}
-exports.isFunction = isFunction;
-
-function isPrimitive(arg) {
-  return arg === null ||
-         typeof arg === 'boolean' ||
-         typeof arg === 'number' ||
-         typeof arg === 'string' ||
-         typeof arg === 'symbol' ||  // ES6 symbol
-         typeof arg === 'undefined';
-}
-exports.isPrimitive = isPrimitive;
-
-exports.isBuffer = Buffer.isBuffer;
-
-function objectToString(o) {
-  return Object.prototype.toString.call(o);
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/package.json
deleted file mode 100644
index f25ced21eaf30ab3ea53b2d750d75f3d05b8c7f4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/package.json
+++ /dev/null
@@ -1,51 +0,0 @@
-{
-  "_from": "core-util-is@>=1.0.0 <1.1.0",
-  "_id": "core-util-is@1.0.2",
-  "_location": "/serialport/node-pre-gyp/tar-pack/readable-stream/core-util-is",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-  "_shasum": "b5fd54220aa2bc5ab57aab7140c940754503c1a7",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/core-util-is/issues"
-  },
-  "dependencies": {},
-  "description": "The `util.is*` functions introduced in Node v0.12.",
-  "devDependencies": {
-    "tap": "^2.3.0"
-  },
-  "homepage": "https://github.com/isaacs/core-util-is#readme",
-  "keywords": [
-    "isArray",
-    "isBuffer",
-    "isNumber",
-    "isRegExp",
-    "isString",
-    "isThat",
-    "isThis",
-    "polyfill",
-    "util"
-  ],
-  "license": "MIT",
-  "main": "lib/util.js",
-  "name": "core-util-is",
-  "optionalDependencies": {},
-  "readme": "# core-util-is\n\nThe `util.is*` functions introduced in Node v0.12.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/core-util-is.git"
-  },
-  "scripts": {
-    "test": "tap test.js"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/test.js
deleted file mode 100644
index 1a490c65ac8b5df16357c0e90de3825e150d1164..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/core-util-is/test.js
+++ /dev/null
@@ -1,68 +0,0 @@
-var assert = require('tap');
-
-var t = require('./lib/util');
-
-assert.equal(t.isArray([]), true);
-assert.equal(t.isArray({}), false);
-
-assert.equal(t.isBoolean(null), false);
-assert.equal(t.isBoolean(true), true);
-assert.equal(t.isBoolean(false), true);
-
-assert.equal(t.isNull(null), true);
-assert.equal(t.isNull(undefined), false);
-assert.equal(t.isNull(false), false);
-assert.equal(t.isNull(), false);
-
-assert.equal(t.isNullOrUndefined(null), true);
-assert.equal(t.isNullOrUndefined(undefined), true);
-assert.equal(t.isNullOrUndefined(false), false);
-assert.equal(t.isNullOrUndefined(), true);
-
-assert.equal(t.isNumber(null), false);
-assert.equal(t.isNumber('1'), false);
-assert.equal(t.isNumber(1), true);
-
-assert.equal(t.isString(null), false);
-assert.equal(t.isString('1'), true);
-assert.equal(t.isString(1), false);
-
-assert.equal(t.isSymbol(null), false);
-assert.equal(t.isSymbol('1'), false);
-assert.equal(t.isSymbol(1), false);
-assert.equal(t.isSymbol(Symbol()), true);
-
-assert.equal(t.isUndefined(null), false);
-assert.equal(t.isUndefined(undefined), true);
-assert.equal(t.isUndefined(false), false);
-assert.equal(t.isUndefined(), true);
-
-assert.equal(t.isRegExp(null), false);
-assert.equal(t.isRegExp('1'), false);
-assert.equal(t.isRegExp(new RegExp()), true);
-
-assert.equal(t.isObject({}), true);
-assert.equal(t.isObject([]), true);
-assert.equal(t.isObject(new RegExp()), true);
-assert.equal(t.isObject(new Date()), true);
-
-assert.equal(t.isDate(null), false);
-assert.equal(t.isDate('1'), false);
-assert.equal(t.isDate(new Date()), true);
-
-assert.equal(t.isError(null), false);
-assert.equal(t.isError({ err: true }), false);
-assert.equal(t.isError(new Error()), true);
-
-assert.equal(t.isFunction(null), false);
-assert.equal(t.isFunction({ }), false);
-assert.equal(t.isFunction(function() {}), true);
-
-assert.equal(t.isPrimitive(null), true);
-assert.equal(t.isPrimitive(''), true);
-assert.equal(t.isPrimitive(0), true);
-assert.equal(t.isPrimitive(new Date()), false);
-
-assert.equal(t.isBuffer(null), false);
-assert.equal(t.isBuffer({}), false);
-assert.equal(t.isBuffer(new Buffer(0)), true);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/LICENSE
deleted file mode 100644
index dea3013d6710ee273f49ac606a65d5211d480c88..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/LICENSE
+++ /dev/null
@@ -1,16 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/README.md
deleted file mode 100644
index b1c56658557b8162aa9f5ba8610ed03a5e558d9d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-Browser-friendly inheritance fully compatible with standard node.js
-[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
-
-This package exports standard `inherits` from node.js `util` module in
-node environment, but also provides alternative browser-friendly
-implementation through [browser
-field](https://gist.github.com/shtylman/4339901). Alternative
-implementation is a literal copy of standard one located in standalone
-module to avoid requiring of `util`. It also has a shim for old
-browsers with no `Object.create` support.
-
-While keeping you sure you are using standard `inherits`
-implementation in node.js environment, it allows bundlers such as
-[browserify](https://github.com/substack/node-browserify) to not
-include full `util` package to your client code if all you need is
-just `inherits` function. It worth, because browser shim for `util`
-package is large and `inherits` is often the single function you need
-from it.
-
-It's recommended to use this package instead of
-`require('util').inherits` for any code that has chances to be used
-not only in node.js but in browser too.
-
-## usage
-
-```js
-var inherits = require('inherits');
-// then use exactly as the standard one
-```
-
-## note on version ~1.0
-
-Version ~1.0 had completely different motivation and is not compatible
-neither with 2.0 nor with standard node.js `inherits`.
-
-If you are using version ~1.0 and planning to switch to ~2.0, be
-careful:
-
-* new version uses `super_` instead of `super` for referencing
-  superclass
-* new version overwrites current prototype while old one preserves any
-  existing fields on it
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits.js
deleted file mode 100644
index 29f5e24f57b5aacb9f199dea05a57fcbf4918bc1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('util').inherits
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits_browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits_browser.js
deleted file mode 100644
index c1e78a75e6b52b7434e7e8aa0d64d8abd593763b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/inherits_browser.js
+++ /dev/null
@@ -1,23 +0,0 @@
-if (typeof Object.create === 'function') {
-  // implementation from standard node.js 'util' module
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    ctor.prototype = Object.create(superCtor.prototype, {
-      constructor: {
-        value: ctor,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-  };
-} else {
-  // old school shim for old browsers
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    var TempCtor = function () {}
-    TempCtor.prototype = superCtor.prototype
-    ctor.prototype = new TempCtor()
-    ctor.prototype.constructor = ctor
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/package.json
deleted file mode 100644
index 43cb1df77581ea9011e426d75975528da9fb5ca3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/package.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
-  "_from": "inherits@>=2.0.1 <2.1.0",
-  "_id": "inherits@2.0.1",
-  "_location": "/serialport/node-pre-gyp/tar-pack/readable-stream/inherits",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-  "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1",
-  "_shrinkwrap": null,
-  "browser": "./inherits_browser.js",
-  "bugs": {
-    "url": "https://github.com/isaacs/inherits/issues"
-  },
-  "dependencies": {},
-  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
-  "devDependencies": {},
-  "homepage": "https://github.com/isaacs/inherits#readme",
-  "keywords": [
-    "browser",
-    "browserify",
-    "class",
-    "inheritance",
-    "inherits",
-    "klass",
-    "object-oriented",
-    "oop"
-  ],
-  "license": "ISC",
-  "main": "./inherits.js",
-  "name": "inherits",
-  "optionalDependencies": {},
-  "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n  superclass\n* new version overwrites current prototype while old one preserves any\n  existing fields on it\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/inherits.git"
-  },
-  "scripts": {
-    "test": "node test"
-  },
-  "version": "2.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/test.js
deleted file mode 100644
index fc53012d31c0cde4f4bca408e7470e35a06f88fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/inherits/test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var inherits = require('./inherits.js')
-var assert = require('assert')
-
-function test(c) {
-  assert(c.constructor === Child)
-  assert(c.constructor.super_ === Parent)
-  assert(Object.getPrototypeOf(c) === Child.prototype)
-  assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype)
-  assert(c instanceof Child)
-  assert(c instanceof Parent)
-}
-
-function Child() {
-  Parent.call(this)
-  test(this)
-}
-
-function Parent() {}
-
-inherits(Child, Parent)
-
-var c = new Child
-test(c)
-
-console.log('ok')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/.npmignore
deleted file mode 100644
index 3c3629e647f5ddf82548912e337bea9826b434af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-node_modules
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/.travis.yml
deleted file mode 100644
index cc4dba29d959a2da7b97f9edd3c7c91384b2ee5b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/Makefile b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/Makefile
deleted file mode 100644
index 787d56e1e982e48588bc199f36f0d50cb4724066..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/Makefile
+++ /dev/null
@@ -1,6 +0,0 @@
-
-test:
-	@node_modules/.bin/tape test.js
-
-.PHONY: test
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/README.md
deleted file mode 100644
index 16d2c59c6195f9a1ac9af37cb9d75f1a6b85ab01..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/README.md
+++ /dev/null
@@ -1,60 +0,0 @@
-
-# isarray
-
-`Array#isArray` for older browsers.
-
-[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray)
-[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray)
-
-[![browser support](https://ci.testling.com/juliangruber/isarray.png)
-](https://ci.testling.com/juliangruber/isarray)
-
-## Usage
-
-```js
-var isArray = require('isarray');
-
-console.log(isArray([])); // => true
-console.log(isArray({})); // => false
-```
-
-## Installation
-
-With [npm](http://npmjs.org) do
-
-```bash
-$ npm install isarray
-```
-
-Then bundle for the browser with
-[browserify](https://github.com/substack/browserify).
-
-With [component](http://component.io) do
-
-```bash
-$ component install juliangruber/isarray
-```
-
-## License
-
-(MIT)
-
-Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal in
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/component.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/component.json
deleted file mode 100644
index 9e31b6838890159e397063bdd2ea7de80b4e4a42..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/component.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "name" : "isarray",
-  "description" : "Array#isArray for older browsers",
-  "version" : "0.0.1",
-  "repository" : "juliangruber/isarray",
-  "homepage": "https://github.com/juliangruber/isarray",
-  "main" : "index.js",
-  "scripts" : [
-    "index.js"
-  ],
-  "dependencies" : {},
-  "keywords": ["browser","isarray","array"],
-  "author": {
-    "name": "Julian Gruber",
-    "email": "mail@juliangruber.com",
-    "url": "http://juliangruber.com"
-  },
-  "license": "MIT"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/index.js
deleted file mode 100644
index a57f63495943a07b3b08d17e0f9ef6793548c801..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-var toString = {}.toString;
-
-module.exports = Array.isArray || function (arr) {
-  return toString.call(arr) == '[object Array]';
-};
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/package.json
deleted file mode 100644
index 51b2e5730355c45cfc2dd53db9266f11ac4adb84..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/package.json
+++ /dev/null
@@ -1,61 +0,0 @@
-{
-  "_from": "isarray@>=1.0.0 <1.1.0",
-  "_id": "isarray@1.0.0",
-  "_location": "/serialport/node-pre-gyp/tar-pack/readable-stream/isarray",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-  "_shasum": "bb935d48582cba168c06834957a54a3e07124f11",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "mail@juliangruber.com",
-    "name": "Julian Gruber",
-    "url": "http://juliangruber.com"
-  },
-  "bugs": {
-    "url": "https://github.com/juliangruber/isarray/issues"
-  },
-  "dependencies": {},
-  "description": "Array#isArray for older browsers",
-  "devDependencies": {
-    "tape": "~2.13.4"
-  },
-  "homepage": "https://github.com/juliangruber/isarray",
-  "keywords": [
-    "array",
-    "browser",
-    "isarray"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "isarray",
-  "optionalDependencies": {},
-  "readme": "\n# isarray\n\n`Array#isArray` for older browsers.\n\n[![build status](https://secure.travis-ci.org/juliangruber/isarray.svg)](http://travis-ci.org/juliangruber/isarray)\n[![downloads](https://img.shields.io/npm/dm/isarray.svg)](https://www.npmjs.org/package/isarray)\n\n[![browser support](https://ci.testling.com/juliangruber/isarray.png)\n](https://ci.testling.com/juliangruber/isarray)\n\n## Usage\n\n```js\nvar isArray = require('isarray');\n\nconsole.log(isArray([])); // => true\nconsole.log(isArray({})); // => false\n```\n\n## Installation\n\nWith [npm](http://npmjs.org) do\n\n```bash\n$ npm install isarray\n```\n\nThen bundle for the browser with\n[browserify](https://github.com/substack/browserify).\n\nWith [component](http://component.io) do\n\n```bash\n$ component install juliangruber/isarray\n```\n\n## License\n\n(MIT)\n\nCopyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/juliangruber/isarray.git"
-  },
-  "scripts": {
-    "test": "tape test.js"
-  },
-  "testling": {
-    "browsers": [
-      "android-browser/4.2..latest",
-      "chrome/22..latest",
-      "chrome/canary",
-      "firefox/17..latest",
-      "firefox/nightly",
-      "ie/8..latest",
-      "ipad/6.0..latest",
-      "iphone/6.0..latest",
-      "opera/12..latest",
-      "opera/next",
-      "safari/5.1..latest"
-    ],
-    "files": "test.js"
-  },
-  "version": "1.0.0"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/test.js
deleted file mode 100644
index e0c3444d85d5c799bd70b2ee9df62ef56d9763ea..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/isarray/test.js
+++ /dev/null
@@ -1,20 +0,0 @@
-var isArray = require('./');
-var test = require('tape');
-
-test('is array', function(t){
-  t.ok(isArray([]));
-  t.notOk(isArray({}));
-  t.notOk(isArray(null));
-  t.notOk(isArray(false));
-
-  var obj = {};
-  obj[0] = true;
-  t.notOk(isArray(obj));
-
-  var arr = [];
-  arr.foo = 'bar';
-  t.ok(isArray(arr));
-
-  t.end();
-});
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/.travis.yml
deleted file mode 100644
index 36201b10017a5e0533961815850e393d54ceecb8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/.travis.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-language: node_js
-node_js:
-  - "0.8"
-  - "0.10"
-  - "0.11"
-  - "0.12"
-  - "1.7.1"
-  - 1
-  - 2
-  - 3
-  - 4
-  - 5
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/index.js
deleted file mode 100644
index a4f40f845faa65905ec20c08c254fcac474e2c8f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/index.js
+++ /dev/null
@@ -1,43 +0,0 @@
-'use strict';
-
-if (!process.version ||
-    process.version.indexOf('v0.') === 0 ||
-    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {
-  module.exports = nextTick;
-} else {
-  module.exports = process.nextTick;
-}
-
-function nextTick(fn, arg1, arg2, arg3) {
-  if (typeof fn !== 'function') {
-    throw new TypeError('"callback" argument must be a function');
-  }
-  var len = arguments.length;
-  var args, i;
-  switch (len) {
-  case 0:
-  case 1:
-    return process.nextTick(fn);
-  case 2:
-    return process.nextTick(function afterTickOne() {
-      fn.call(null, arg1);
-    });
-  case 3:
-    return process.nextTick(function afterTickTwo() {
-      fn.call(null, arg1, arg2);
-    });
-  case 4:
-    return process.nextTick(function afterTickThree() {
-      fn.call(null, arg1, arg2, arg3);
-    });
-  default:
-    args = new Array(len - 1);
-    i = 0;
-    while (i < args.length) {
-      args[i++] = arguments[i];
-    }
-    return process.nextTick(function afterTick() {
-      fn.apply(null, args);
-    });
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/license.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/license.md
deleted file mode 100644
index c67e3532b542455fad8c4004ef297534d7f480b2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/license.md
+++ /dev/null
@@ -1,19 +0,0 @@
-# Copyright (c) 2015 Calvin Metcalf
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.**
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/package.json
deleted file mode 100644
index 49a75c7dd10522af26ad5fa2d2dcdc556ca0c785..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "_from": "process-nextick-args@>=1.0.6 <1.1.0",
-  "_id": "process-nextick-args@1.0.7",
-  "_location": "/serialport/node-pre-gyp/tar-pack/readable-stream/process-nextick-args",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
-  "_shasum": "150e20b756590ad3f91093f25a4f2ad8bff30ba3",
-  "_shrinkwrap": null,
-  "author": "",
-  "bugs": {
-    "url": "https://github.com/calvinmetcalf/process-nextick-args/issues"
-  },
-  "dependencies": {},
-  "description": "process.nextTick but always with args",
-  "devDependencies": {
-    "tap": "~0.2.6"
-  },
-  "homepage": "https://github.com/calvinmetcalf/process-nextick-args",
-  "license": "MIT",
-  "main": "index.js",
-  "name": "process-nextick-args",
-  "optionalDependencies": {},
-  "readme": "process-nextick-args\n=====\n\n[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args)\n\n```bash\nnpm install --save process-nextick-args\n```\n\nAlways be able to pass arguments to process.nextTick, no matter the platform\n\n```js\nvar nextTick = require('process-nextick-args');\n\nnextTick(function (a, b, c) {\n  console.log(a, b, c);\n}, 'step', 3,  'profit');\n```\n",
-  "readmeFilename": "readme.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/calvinmetcalf/process-nextick-args.git"
-  },
-  "scripts": {
-    "test": "node test.js"
-  },
-  "version": "1.0.7"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/readme.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/readme.md
deleted file mode 100644
index 78e7cfaeb7acdef0248b6820e5ec48302eebf1a0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/readme.md
+++ /dev/null
@@ -1,18 +0,0 @@
-process-nextick-args
-=====
-
-[![Build Status](https://travis-ci.org/calvinmetcalf/process-nextick-args.svg?branch=master)](https://travis-ci.org/calvinmetcalf/process-nextick-args)
-
-```bash
-npm install --save process-nextick-args
-```
-
-Always be able to pass arguments to process.nextTick, no matter the platform
-
-```js
-var nextTick = require('process-nextick-args');
-
-nextTick(function (a, b, c) {
-  console.log(a, b, c);
-}, 'step', 3,  'profit');
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/test.js
deleted file mode 100644
index ef15721584ac9973198e407f6ce3beadf95d5fff..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/process-nextick-args/test.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var test = require("tap").test;
-var nextTick = require('./');
-
-test('should work', function (t) {
-  t.plan(5);
-  nextTick(function (a) {
-    t.ok(a);
-    nextTick(function (thing) {
-      t.equals(thing, 7);
-    }, 7);
-  }, true);
-  nextTick(function (a, b, c) {
-    t.equals(a, 'step');
-    t.equals(b, 3);
-    t.equals(c, 'profit');
-  }, 'step', 3,  'profit');
-});
-
-test('correct number of arguments', function (t) {
-  t.plan(1);
-  nextTick(function () {
-    t.equals(2, arguments.length, 'correct number');
-  }, 1, 2);
-});
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/.npmignore
deleted file mode 100644
index 206320cc1d21b9cc9e3e0e8a303896045453c524..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/.npmignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build
-test
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/LICENSE
deleted file mode 100644
index 6de584a48f5c897d27bfe9922f976297c07cae02..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright Joyent, Inc. and other Node contributors.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to permit
-persons to whom the Software is furnished to do so, subject to the
-following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/README.md
deleted file mode 100644
index 4d2aa001501107cd2792f385ad62237dc3757521..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-**string_decoder.js** (`require('string_decoder')`) from Node.js core
-
-Copyright Joyent, Inc. and other Node contributors. See LICENCE file for details.
-
-Version numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. **Prefer the stable version over the unstable.**
-
-The *build/* directory contains a build script that will scrape the source from the [joyent/node](https://github.com/joyent/node) repo given a specific Node version.
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/index.js
deleted file mode 100644
index b00e54fb7909827a02b6fa96ef55bd4dd85a3fe7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/index.js
+++ /dev/null
@@ -1,221 +0,0 @@
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-var Buffer = require('buffer').Buffer;
-
-var isBufferEncoding = Buffer.isEncoding
-  || function(encoding) {
-       switch (encoding && encoding.toLowerCase()) {
-         case 'hex': case 'utf8': case 'utf-8': case 'ascii': case 'binary': case 'base64': case 'ucs2': case 'ucs-2': case 'utf16le': case 'utf-16le': case 'raw': return true;
-         default: return false;
-       }
-     }
-
-
-function assertEncoding(encoding) {
-  if (encoding && !isBufferEncoding(encoding)) {
-    throw new Error('Unknown encoding: ' + encoding);
-  }
-}
-
-// StringDecoder provides an interface for efficiently splitting a series of
-// buffers into a series of JS strings without breaking apart multi-byte
-// characters. CESU-8 is handled as part of the UTF-8 encoding.
-//
-// @TODO Handling all encodings inside a single object makes it very difficult
-// to reason about this code, so it should be split up in the future.
-// @TODO There should be a utf8-strict encoding that rejects invalid UTF-8 code
-// points as used by CESU-8.
-var StringDecoder = exports.StringDecoder = function(encoding) {
-  this.encoding = (encoding || 'utf8').toLowerCase().replace(/[-_]/, '');
-  assertEncoding(encoding);
-  switch (this.encoding) {
-    case 'utf8':
-      // CESU-8 represents each of Surrogate Pair by 3-bytes
-      this.surrogateSize = 3;
-      break;
-    case 'ucs2':
-    case 'utf16le':
-      // UTF-16 represents each of Surrogate Pair by 2-bytes
-      this.surrogateSize = 2;
-      this.detectIncompleteChar = utf16DetectIncompleteChar;
-      break;
-    case 'base64':
-      // Base-64 stores 3 bytes in 4 chars, and pads the remainder.
-      this.surrogateSize = 3;
-      this.detectIncompleteChar = base64DetectIncompleteChar;
-      break;
-    default:
-      this.write = passThroughWrite;
-      return;
-  }
-
-  // Enough space to store all bytes of a single character. UTF-8 needs 4
-  // bytes, but CESU-8 may require up to 6 (3 bytes per surrogate).
-  this.charBuffer = new Buffer(6);
-  // Number of bytes received for the current incomplete multi-byte character.
-  this.charReceived = 0;
-  // Number of bytes expected for the current incomplete multi-byte character.
-  this.charLength = 0;
-};
-
-
-// write decodes the given buffer and returns it as JS string that is
-// guaranteed to not contain any partial multi-byte characters. Any partial
-// character found at the end of the buffer is buffered up, and will be
-// returned when calling write again with the remaining bytes.
-//
-// Note: Converting a Buffer containing an orphan surrogate to a String
-// currently works, but converting a String to a Buffer (via `new Buffer`, or
-// Buffer#write) will replace incomplete surrogates with the unicode
-// replacement character. See https://codereview.chromium.org/121173009/ .
-StringDecoder.prototype.write = function(buffer) {
-  var charStr = '';
-  // if our last write ended with an incomplete multibyte character
-  while (this.charLength) {
-    // determine how many remaining bytes this buffer has to offer for this char
-    var available = (buffer.length >= this.charLength - this.charReceived) ?
-        this.charLength - this.charReceived :
-        buffer.length;
-
-    // add the new bytes to the char buffer
-    buffer.copy(this.charBuffer, this.charReceived, 0, available);
-    this.charReceived += available;
-
-    if (this.charReceived < this.charLength) {
-      // still not enough chars in this buffer? wait for more ...
-      return '';
-    }
-
-    // remove bytes belonging to the current character from the buffer
-    buffer = buffer.slice(available, buffer.length);
-
-    // get the character that was split
-    charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding);
-
-    // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
-    var charCode = charStr.charCodeAt(charStr.length - 1);
-    if (charCode >= 0xD800 && charCode <= 0xDBFF) {
-      this.charLength += this.surrogateSize;
-      charStr = '';
-      continue;
-    }
-    this.charReceived = this.charLength = 0;
-
-    // if there are no more bytes in this buffer, just emit our char
-    if (buffer.length === 0) {
-      return charStr;
-    }
-    break;
-  }
-
-  // determine and set charLength / charReceived
-  this.detectIncompleteChar(buffer);
-
-  var end = buffer.length;
-  if (this.charLength) {
-    // buffer the incomplete character bytes we got
-    buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end);
-    end -= this.charReceived;
-  }
-
-  charStr += buffer.toString(this.encoding, 0, end);
-
-  var end = charStr.length - 1;
-  var charCode = charStr.charCodeAt(end);
-  // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character
-  if (charCode >= 0xD800 && charCode <= 0xDBFF) {
-    var size = this.surrogateSize;
-    this.charLength += size;
-    this.charReceived += size;
-    this.charBuffer.copy(this.charBuffer, size, 0, size);
-    buffer.copy(this.charBuffer, 0, 0, size);
-    return charStr.substring(0, end);
-  }
-
-  // or just emit the charStr
-  return charStr;
-};
-
-// detectIncompleteChar determines if there is an incomplete UTF-8 character at
-// the end of the given buffer. If so, it sets this.charLength to the byte
-// length that character, and sets this.charReceived to the number of bytes
-// that are available for this character.
-StringDecoder.prototype.detectIncompleteChar = function(buffer) {
-  // determine how many bytes we have to check at the end of this buffer
-  var i = (buffer.length >= 3) ? 3 : buffer.length;
-
-  // Figure out if one of the last i bytes of our buffer announces an
-  // incomplete char.
-  for (; i > 0; i--) {
-    var c = buffer[buffer.length - i];
-
-    // See http://en.wikipedia.org/wiki/UTF-8#Description
-
-    // 110XXXXX
-    if (i == 1 && c >> 5 == 0x06) {
-      this.charLength = 2;
-      break;
-    }
-
-    // 1110XXXX
-    if (i <= 2 && c >> 4 == 0x0E) {
-      this.charLength = 3;
-      break;
-    }
-
-    // 11110XXX
-    if (i <= 3 && c >> 3 == 0x1E) {
-      this.charLength = 4;
-      break;
-    }
-  }
-  this.charReceived = i;
-};
-
-StringDecoder.prototype.end = function(buffer) {
-  var res = '';
-  if (buffer && buffer.length)
-    res = this.write(buffer);
-
-  if (this.charReceived) {
-    var cr = this.charReceived;
-    var buf = this.charBuffer;
-    var enc = this.encoding;
-    res += buf.slice(0, cr).toString(enc);
-  }
-
-  return res;
-};
-
-function passThroughWrite(buffer) {
-  return buffer.toString(this.encoding);
-}
-
-function utf16DetectIncompleteChar(buffer) {
-  this.charReceived = buffer.length % 2;
-  this.charLength = this.charReceived ? 2 : 0;
-}
-
-function base64DetectIncompleteChar(buffer) {
-  this.charReceived = buffer.length % 3;
-  this.charLength = this.charReceived ? 3 : 0;
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/package.json
deleted file mode 100644
index 1cd29aba815192ec57f91a8eeba1e6b0a2204953..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/string_decoder/package.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
-  "_from": "string_decoder@>=0.10.0 <0.11.0",
-  "_id": "string_decoder@0.10.31",
-  "_location": "/serialport/node-pre-gyp/tar-pack/readable-stream/string_decoder",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-  "_shasum": "62e203bc41766c6c28c9fc84301dab1c5310fa94",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/rvagg/string_decoder/issues"
-  },
-  "dependencies": {},
-  "description": "The string_decoder module from Node core",
-  "devDependencies": {
-    "tap": "~0.4.8"
-  },
-  "homepage": "https://github.com/rvagg/string_decoder",
-  "keywords": [
-    "browser",
-    "browserify",
-    "decoder",
-    "string"
-  ],
-  "license": "MIT",
-  "main": "index.js",
-  "name": "string_decoder",
-  "optionalDependencies": {},
-  "readme": "**string_decoder.js** (`require('string_decoder')`) from Node.js core\n\nCopyright Joyent, Inc. and other Node contributors. See LICENCE file for details.\n\nVersion numbers match the versions found in Node core, e.g. 0.10.24 matches Node 0.10.24, likewise 0.11.10 matches Node 0.11.10. **Prefer the stable version over the unstable.**\n\nThe *build/* directory contains a build script that will scrape the source from the [joyent/node](https://github.com/joyent/node) repo given a specific Node version.",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/rvagg/string_decoder.git"
-  },
-  "scripts": {
-    "test": "tap test/simple/*.js"
-  },
-  "version": "0.10.31"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/History.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/History.md
deleted file mode 100644
index acc8675372e980824723cfcfec09c0ba43a3195a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/History.md
+++ /dev/null
@@ -1,16 +0,0 @@
-
-1.0.2 / 2015-10-07
-==================
-
-  * use try/catch when checking `localStorage` (#3, @kumavis)
-
-1.0.1 / 2014-11-25
-==================
-
-  * browser: use `console.warn()` for deprecation calls
-  * browser: more jsdocs
-
-1.0.0 / 2014-04-30
-==================
-
-  * initial commit
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/LICENSE
deleted file mode 100644
index 6a60e8c225c9baca25907f87c74b428e5d85de0c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/LICENSE
+++ /dev/null
@@ -1,24 +0,0 @@
-(The MIT License)
-
-Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/README.md
deleted file mode 100644
index 75622fa7c250a6605f4778d9dffe97bf60291d17..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-util-deprecate
-==============
-### The Node.js `util.deprecate()` function with browser support
-
-In Node.js, this module simply re-exports the `util.deprecate()` function.
-
-In the web browser (i.e. via browserify), a browser-specific implementation
-of the `util.deprecate()` function is used.
-
-
-## API
-
-A `deprecate()` function is the only thing exposed by this module.
-
-``` javascript
-// setup:
-exports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead');
-
-
-// users see:
-foo();
-// foo() is deprecated, use bar() instead
-foo();
-foo();
-```
-
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>
-
-Permission is hereby granted, free of charge, to any person
-obtaining a copy of this software and associated documentation
-files (the "Software"), to deal in the Software without
-restriction, including without limitation the rights to use,
-copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following
-conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/browser.js
deleted file mode 100644
index 549ae2f065ea5add2c4b3667e412a9d0e7d2b1af..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/browser.js
+++ /dev/null
@@ -1,67 +0,0 @@
-
-/**
- * Module exports.
- */
-
-module.exports = deprecate;
-
-/**
- * Mark that a method should not be used.
- * Returns a modified function which warns once by default.
- *
- * If `localStorage.noDeprecation = true` is set, then it is a no-op.
- *
- * If `localStorage.throwDeprecation = true` is set, then deprecated functions
- * will throw an Error when invoked.
- *
- * If `localStorage.traceDeprecation = true` is set, then deprecated functions
- * will invoke `console.trace()` instead of `console.error()`.
- *
- * @param {Function} fn - the function to deprecate
- * @param {String} msg - the string to print to the console when `fn` is invoked
- * @returns {Function} a new "deprecated" version of `fn`
- * @api public
- */
-
-function deprecate (fn, msg) {
-  if (config('noDeprecation')) {
-    return fn;
-  }
-
-  var warned = false;
-  function deprecated() {
-    if (!warned) {
-      if (config('throwDeprecation')) {
-        throw new Error(msg);
-      } else if (config('traceDeprecation')) {
-        console.trace(msg);
-      } else {
-        console.warn(msg);
-      }
-      warned = true;
-    }
-    return fn.apply(this, arguments);
-  }
-
-  return deprecated;
-}
-
-/**
- * Checks `localStorage` for boolean values for the given `name`.
- *
- * @param {String} name
- * @returns {Boolean}
- * @api private
- */
-
-function config (name) {
-  // accessing global.localStorage can trigger a DOMException in sandboxed iframes
-  try {
-    if (!global.localStorage) return false;
-  } catch (_) {
-    return false;
-  }
-  var val = global.localStorage[name];
-  if (null == val) return false;
-  return String(val).toLowerCase() === 'true';
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/node.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/node.js
deleted file mode 100644
index 5e6fcff5ddd3fbf8bdda6310c224114d30b7509e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/node.js
+++ /dev/null
@@ -1,6 +0,0 @@
-
-/**
- * For Node.js, simply re-export the core `util.deprecate` function.
- */
-
-module.exports = require('util').deprecate;
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/package.json
deleted file mode 100644
index 82a3aa6a6676d4a24fa912eaf5d04afc4f2f414a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/node_modules/util-deprecate/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "_from": "util-deprecate@>=1.0.1 <1.1.0",
-  "_id": "util-deprecate@1.0.2",
-  "_location": "/serialport/node-pre-gyp/tar-pack/readable-stream/util-deprecate",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack/readable-stream"
-  ],
-  "_resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-  "_shasum": "450d4dc9fa70de732762fbd2d4a28981419a0ccf",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "nathan@tootallnate.net",
-    "name": "Nathan Rajlich",
-    "url": "http://n8.io/"
-  },
-  "browser": "browser.js",
-  "bugs": {
-    "url": "https://github.com/TooTallNate/util-deprecate/issues"
-  },
-  "dependencies": {},
-  "description": "The Node.js `util.deprecate()` function with browser support",
-  "devDependencies": {},
-  "homepage": "https://github.com/TooTallNate/util-deprecate",
-  "keywords": [
-    "browser",
-    "browserify",
-    "deprecate",
-    "node",
-    "util"
-  ],
-  "license": "MIT",
-  "main": "node.js",
-  "name": "util-deprecate",
-  "optionalDependencies": {},
-  "readme": "util-deprecate\n==============\n### The Node.js `util.deprecate()` function with browser support\n\nIn Node.js, this module simply re-exports the `util.deprecate()` function.\n\nIn the web browser (i.e. via browserify), a browser-specific implementation\nof the `util.deprecate()` function is used.\n\n\n## API\n\nA `deprecate()` function is the only thing exposed by this module.\n\n``` javascript\n// setup:\nexports.foo = deprecate(foo, 'foo() is deprecated, use bar() instead');\n\n\n// users see:\nfoo();\n// foo() is deprecated, use bar() instead\nfoo();\nfoo();\n```\n\n\n## License\n\n(The MIT License)\n\nCopyright (c) 2014 Nathan Rajlich <nathan@tootallnate.net>\n\nPermission is hereby granted, free of charge, to any person\nobtaining a copy of this software and associated documentation\nfiles (the \"Software\"), to deal in the Software without\nrestriction, including without limitation the rights to use,\ncopy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the\nSoftware is furnished to do so, subject to the following\nconditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\nOF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\nHOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\nOTHER DEALINGS IN THE SOFTWARE.\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/TooTallNate/util-deprecate.git"
-  },
-  "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
-  },
-  "version": "1.0.2"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/package.json
deleted file mode 100644
index b3f427118900ee7244a26b15b1c24b813f83206f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/package.json
+++ /dev/null
@@ -1,66 +0,0 @@
-{
-  "_from": "readable-stream@>=2.1.4 <2.2.0",
-  "_id": "readable-stream@2.1.4",
-  "_location": "/serialport/node-pre-gyp/tar-pack/readable-stream",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack"
-  ],
-  "_resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.4.tgz",
-  "_shasum": "70b9791c6fcb8480db44bd155a0f6bb58f172468",
-  "_shrinkwrap": null,
-  "browser": {
-    "util": false
-  },
-  "bugs": {
-    "url": "https://github.com/nodejs/readable-stream/issues"
-  },
-  "dependencies": {
-    "buffer-shims": "^1.0.0",
-    "core-util-is": "~1.0.0",
-    "inherits": "~2.0.1",
-    "isarray": "~1.0.0",
-    "process-nextick-args": "~1.0.6",
-    "string_decoder": "~0.10.x",
-    "util-deprecate": "~1.0.1"
-  },
-  "description": "Streams3, a user-land copy of the stream library from Node.js",
-  "devDependencies": {
-    "assert": "~1.4.0",
-    "nyc": "^6.4.0",
-    "tap": "~0.7.1",
-    "tape": "~4.5.1",
-    "zuul": "~3.9.0",
-    "zuul-ngrok": "^4.0.0"
-  },
-  "homepage": "https://github.com/nodejs/readable-stream#readme",
-  "keywords": [
-    "pipe",
-    "readable",
-    "stream"
-  ],
-  "license": "MIT",
-  "main": "readable.js",
-  "name": "readable-stream",
-  "nyc": {
-    "include": [
-      "lib/**.js"
-    ]
-  },
-  "optionalDependencies": {},
-  "readme": "# readable-stream\n\n***Node-core v6.1.0 streams for userland*** [![Build Status](https://travis-ci.org/nodejs/readable-stream.svg?branch=master)](https://travis-ci.org/nodejs/readable-stream)\n\n\n[![NPM](https://nodei.co/npm/readable-stream.png?downloads=true&downloadRank=true)](https://nodei.co/npm/readable-stream/)\n[![NPM](https://nodei.co/npm-dl/readable-stream.png?&months=6&height=3)](https://nodei.co/npm/readable-stream/)\n\n\n[![Sauce Test Status](https://saucelabs.com/browser-matrix/readable-stream.svg)](https://saucelabs.com/u/readable-stream)\n\n```bash\nnpm install --save readable-stream\n```\n\n***Node-core streams for userland***\n\nThis package is a mirror of the Streams2 and Streams3 implementations in\nNode-core, including [documentation](doc/stream.md).\n\nIf you want to guarantee a stable streams base, regardless of what version of\nNode you, or the users of your libraries are using, use **readable-stream** *only* and avoid the *\"stream\"* module in Node-core, for background see [this blogpost](http://r.va.gg/2014/06/why-i-dont-use-nodes-core-stream-module.html).\n\nAs of version 2.0.0 **readable-stream** uses semantic versioning.  \n\n# Streams WG Team Members\n\n* **Chris Dickinson** ([@chrisdickinson](https://github.com/chrisdickinson)) &lt;christopher.s.dickinson@gmail.com&gt;\n  - Release GPG key: 9554F04D7259F04124DE6B476D5A82AC7E37093B\n* **Calvin Metcalf** ([@calvinmetcalf](https://github.com/calvinmetcalf)) &lt;calvin.metcalf@gmail.com&gt;\n  - Release GPG key: F3EF5F62A87FC27A22E643F714CE4FF5015AA242\n* **Rod Vagg** ([@rvagg](https://github.com/rvagg)) &lt;rod@vagg.org&gt;\n  - Release GPG key: DD8F2338BAE7501E3DD5AC78C273792F7D83545D\n* **Sam Newman** ([@sonewman](https://github.com/sonewman)) &lt;newmansam@outlook.com&gt;\n* **Mathias Buus** ([@mafintosh](https://github.com/mafintosh)) &lt;mathiasbuus@gmail.com&gt;\n* **Domenic Denicola** ([@domenic](https://github.com/domenic)) &lt;d@domenic.me&gt;\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/nodejs/readable-stream.git"
-  },
-  "scripts": {
-    "browser": "npm run write-zuul && zuul -- test/browser.js",
-    "cover": "nyc npm test",
-    "local": "zuul --local -- test/browser.js",
-    "report": "nyc report --reporter=lcov",
-    "test": "tap test/parallel/*.js test/ours/*.js",
-    "write-zuul": "printf \"ui: tape\ntunnel: ngrok\nbrowsers:\n  - name: $BROWSER_NAME\n    version: $BROWSER_VERSION\n\">.zuul.yml"
-  },
-  "version": "2.1.4"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/passthrough.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/passthrough.js
deleted file mode 100644
index 27e8d8a55165f9d1d7d1d1905d8d70e9c5a24f6e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/passthrough.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_passthrough.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/readable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/readable.js
deleted file mode 100644
index be2688a071dd1856afdfe1e9e5c205eabcd83008..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/readable.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var Stream = (function (){
-  try {
-    return require('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify
-  } catch(_){}
-}());
-exports = module.exports = require('./lib/_stream_readable.js');
-exports.Stream = Stream || exports;
-exports.Readable = exports;
-exports.Writable = require('./lib/_stream_writable.js');
-exports.Duplex = require('./lib/_stream_duplex.js');
-exports.Transform = require('./lib/_stream_transform.js');
-exports.PassThrough = require('./lib/_stream_passthrough.js');
-
-if (!process.browser && process.env.READABLE_STREAM === 'disable' && Stream) {
-  module.exports = Stream;
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/transform.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/transform.js
deleted file mode 100644
index 5d482f0780e9934896cd693414fee2b9b425778f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/transform.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_transform.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/writable.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/writable.js
deleted file mode 100644
index e1e9efdf3c12e938a4fd0659f2af60dbe65bf240..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/readable-stream/writable.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require("./lib/_stream_writable.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/LICENSE
deleted file mode 100644
index 05eeeb88c2ef4cc9bacbcc46d6cfcb6962f8b385..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/README.md
deleted file mode 100644
index 81166753aba5568bbb3ff5659a94d7f14da1d202..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-Use this module to convert a username/groupname to a uid/gid number.
-
-Usage:
-
-```
-npm install uid-number
-```
-
-Then, in your node program:
-
-```javascript
-var uidNumber = require("uid-number")
-uidNumber("isaacs", function (er, uid, gid) {
-  // gid is null because we didn't ask for a group name
-  // uid === 24561 because that's my number.
-})
-```
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/get-uid-gid.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/get-uid-gid.js
deleted file mode 100755
index 0b391748a93273eac631d2f63257027f161d76e3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/get-uid-gid.js
+++ /dev/null
@@ -1,24 +0,0 @@
-if (module !== require.main) {
-  throw new Error("This file should not be loaded with require()")
-}
-
-if (!process.getuid || !process.getgid) {
-  throw new Error("this file should not be called without uid/gid support")
-}
-
-var argv = process.argv.slice(2)
-  , user = argv[0] || process.getuid()
-  , group = argv[1] || process.getgid()
-
-if (!isNaN(user)) user = +user
-if (!isNaN(group)) group = +group
-
-console.error([user, group])
-
-try {
-  process.setgid(group)
-  process.setuid(user)
-  console.log(JSON.stringify({uid:+process.getuid(), gid:+process.getgid()}))
-} catch (ex) {
-  console.log(JSON.stringify({error:ex.message,errno:ex.errno}))
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/package.json
deleted file mode 100644
index a9ccaba1a30eeff3d2152639a67216d8b55c6978..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/package.json
+++ /dev/null
@@ -1,56 +0,0 @@
-{
-  "_from": "uid-number@>=0.0.6 <0.1.0",
-  "_id": "uid-number@0.0.6",
-  "_location": "/serialport/node-pre-gyp/tar-pack/uid-number",
-  "_nodeVersion": "0.10.31",
-  "_npmUser": {
-    "email": "i@izs.me",
-    "name": "isaacs"
-  },
-  "_npmVersion": "2.1.3",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar-pack"
-  ],
-  "_resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz",
-  "_shasum": "0ea10e8035e8eb5b8e4449f06da1c730663baa81",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/uid-number/issues"
-  },
-  "dependencies": {},
-  "description": "Convert a username/group name to a uid/gid number",
-  "devDependencies": {},
-  "directories": {},
-  "dist": {
-    "shasum": "0ea10e8035e8eb5b8e4449f06da1c730663baa81",
-    "tarball": "http://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz"
-  },
-  "engines": {
-    "node": "*"
-  },
-  "gitHead": "aab48f5d6bda85794946b26d945d2ee452e0e9ab",
-  "homepage": "https://github.com/isaacs/uid-number",
-  "license": "ISC",
-  "main": "uid-number.js",
-  "maintainers": [
-    {
-      "name": "isaacs",
-      "email": "i@izs.me"
-    }
-  ],
-  "name": "uid-number",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/uid-number.git"
-  },
-  "scripts": {},
-  "version": "0.0.6"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/uid-number.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/uid-number.js
deleted file mode 100644
index bd62184fda7a94a52c2627278386b0b091531640..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/node_modules/uid-number/uid-number.js
+++ /dev/null
@@ -1,59 +0,0 @@
-module.exports = uidNumber
-
-// This module calls into get-uid-gid.js, which sets the
-// uid and gid to the supplied argument, in order to find out their
-// numeric value.  This can't be done in the main node process,
-// because otherwise node would be running as that user from this
-// point on.
-
-var child_process = require("child_process")
-  , path = require("path")
-  , uidSupport = process.getuid && process.setuid
-  , uidCache = {}
-  , gidCache = {}
-
-function uidNumber (uid, gid, cb) {
-  if (!uidSupport) return cb()
-  if (typeof cb !== "function") cb = gid, gid = null
-  if (typeof cb !== "function") cb = uid, uid = null
-  if (gid == null) gid = process.getgid()
-  if (uid == null) uid = process.getuid()
-  if (!isNaN(gid)) gid = gidCache[gid] = +gid
-  if (!isNaN(uid)) uid = uidCache[uid] = +uid
-
-  if (uidCache.hasOwnProperty(uid)) uid = uidCache[uid]
-  if (gidCache.hasOwnProperty(gid)) gid = gidCache[gid]
-
-  if (typeof gid === "number" && typeof uid === "number") {
-    return process.nextTick(cb.bind(null, null, uid, gid))
-  }
-
-  var getter = require.resolve("./get-uid-gid.js")
-
-  child_process.execFile( process.execPath
-                        , [getter, uid, gid]
-                        , function (code, out, stderr) {
-    if (code) {
-      var er = new Error("could not get uid/gid\n" + stderr)
-      er.code = code
-      return cb(er)
-    }
-
-    try {
-      out = JSON.parse(out+"")
-    } catch (ex) {
-      return cb(ex)
-    }
-
-    if (out.error) {
-      var er = new Error(out.error)
-      er.errno = out.errno
-      return cb(er)
-    }
-
-    if (isNaN(out.uid) || isNaN(out.gid)) return cb(new Error(
-      "Could not get uid/gid: "+JSON.stringify(out)))
-
-    cb(null, uidCache[uid] = +out.uid, gidCache[gid] = +out.gid)
-  })
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/package.json
deleted file mode 100644
index 73c14199813efd4bc66ee6b87a7dbf7bad2c6b7f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/package.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
-  "_from": "tar-pack@>=3.1.0 <3.2.0",
-  "_id": "tar-pack@3.1.4",
-  "_location": "/serialport/node-pre-gyp/tar-pack",
-  "_nodeVersion": "6.2.2",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/tar-pack-3.1.4.tgz_1467088357244_0.18669610540382564"
-  },
-  "_npmUser": {
-    "email": "snnskwtnb@gmail.com",
-    "name": "shinnn"
-  },
-  "_npmVersion": "3.10.2",
-  "_phantomChildren": {
-    "mkdirp": "0.5.1",
-    "rimraf": "2.5.3"
-  },
-  "_requiredBy": [
-    "/serialport/node-pre-gyp"
-  ],
-  "_resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.4.tgz",
-  "_shasum": "bc8cf9a22f5832739f12f3910dac1eb97b49708c",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/ForbesLindesay/tar-pack/issues"
-  },
-  "dependencies": {
-    "debug": "~2.2.0",
-    "fstream": "~1.0.10",
-    "fstream-ignore": "~1.0.5",
-    "once": "~1.3.3",
-    "readable-stream": "~2.1.4",
-    "rimraf": "~2.5.1",
-    "tar": "~2.2.1",
-    "uid-number": "~0.0.6"
-  },
-  "description": "Package and un-package modules of some sort (in tar/gz bundles).",
-  "devDependencies": {
-    "mkdirp": "*",
-    "mocha": "*",
-    "rfile": "*"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "bc8cf9a22f5832739f12f3910dac1eb97b49708c",
-    "tarball": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.4.tgz"
-  },
-  "gitHead": "ee23170716772ae458574ea090500035202c7c64",
-  "homepage": "https://github.com/ForbesLindesay/tar-pack#readme",
-  "license": "BSD-2-Clause",
-  "maintainers": [
-    {
-      "name": "es128",
-      "email": "elan.shanker+npm@gmail.com"
-    },
-    {
-      "name": "forbeslindesay",
-      "email": "forbes@lindesay.co.uk"
-    },
-    {
-      "name": "shinnn",
-      "email": "snnskwtnb@gmail.com"
-    }
-  ],
-  "name": "tar-pack",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/ForbesLindesay/tar-pack.git"
-  },
-  "scripts": {
-    "test": "mocha -R list"
-  },
-  "version": "3.1.4"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed-file.txt b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed-file.txt
deleted file mode 100644
index ba0e162e1c47469e3fe4b393a8bf8c569f302116..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed-file.txt
+++ /dev/null
@@ -1 +0,0 @@
-bar
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed.tar b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed.tar
deleted file mode 100644
index 35fd1745182fd4c3c4572a7d11e0d9f2f41658b3..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed.tar and /dev/null differ
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed.tar.gz b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed.tar.gz
deleted file mode 100644
index 89516b1089bb85a2738103a9ff12d18f509c0ef9..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/packed.tar.gz and /dev/null differ
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/bar.txt b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/bar.txt
deleted file mode 100644
index 3f9538666251333f5fa519e01eb267d371ca9c78..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/bar.txt
+++ /dev/null
@@ -1 +0,0 @@
-baz
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/foo.txt b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/foo.txt
deleted file mode 100644
index ba0e162e1c47469e3fe4b393a8bf8c569f302116..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/fixtures/to-pack/foo.txt
+++ /dev/null
@@ -1 +0,0 @@
-bar
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/index.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/index.js
deleted file mode 100644
index 314c020af7ba94081dd3524a447036142dba7447..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar-pack/test/index.js
+++ /dev/null
@@ -1,67 +0,0 @@
-var tar = require('../')
-var path = require('path')
-var rfile = require('rfile')
-var rimraf = require('rimraf').sync
-var mkdir = require('mkdirp').sync
-
-var read = require('fs').createReadStream
-var write = require('fs').createWriteStream
-var assert = require('assert')
-
-beforeEach(function () {
-  rimraf(__dirname + '/output')
-})
-afterEach(function () {
-  rimraf(__dirname + '/output')
-})
-describe('tarball.pipe(unpack(directory, callback))', function () {
-  it('unpacks the tarball into the directory', function (done) {
-    read(__dirname + '/fixtures/packed.tar').pipe(tar.unpack(__dirname + '/output/unpacked', function (err) {
-      if (err) return done(err)
-      assert.equal(rfile('./output/unpacked/bar.txt'), rfile('./fixtures/to-pack/bar.txt'))
-      assert.equal(rfile('./output/unpacked/foo.txt'), rfile('./fixtures/to-pack/foo.txt'))
-      done()
-    }))
-  })
-})
-describe('gziptarball.pipe(unpack(directory, callback))', function () {
-  it('unpacks the tarball into the directory', function (done) {
-    read(__dirname + '/fixtures/packed.tar.gz').pipe(tar.unpack(__dirname + '/output/unpacked', function (err) {
-      if (err) return done(err)
-      assert.equal(rfile('./output/unpacked/bar.txt'), rfile('./fixtures/to-pack/bar.txt'))
-      assert.equal(rfile('./output/unpacked/foo.txt'), rfile('./fixtures/to-pack/foo.txt'))
-      done()
-    }))
-  })
-})
-describe('file.pipe(unpack(directory, callback))', function () {
-  it('copies the file into the directory', function (done) {
-    read(__dirname + '/fixtures/packed-file.txt').pipe(tar.unpack(__dirname + '/output/unpacked', function (err) {
-      if (err) return done(err)
-      assert.equal(rfile('./output/unpacked/index.js'), rfile('./fixtures/packed-file.txt'))
-      done()
-    }))
-  })
-})
-describe('pack(directory).pipe(tarball)', function () {
-  it('packs the directory into the output', function (done) {
-    var called = false
-    mkdir(__dirname + '/output/')
-    tar.pack(__dirname + '/fixtures/to-pack').pipe(write(__dirname + '/output/packed.tar.gz'))
-      .on('error', function (err) {
-        if (called) return
-        called = true
-        done(err)
-      })
-      .on('close', function () {
-        if (called) return
-        called = true
-        read(__dirname + '/output/packed.tar.gz').pipe(tar.unpack(__dirname + '/output/unpacked', function (err) {
-          if (err) return done(err)
-          assert.equal(rfile('./output/unpacked/bar.txt'), rfile('./fixtures/to-pack/bar.txt'))
-          assert.equal(rfile('./output/unpacked/foo.txt'), rfile('./fixtures/to-pack/foo.txt'))
-          done()
-        }))
-      })
-  })
-})
\ No newline at end of file
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/.npmignore
deleted file mode 100644
index c167ad5b1c12f8ad7c8324e553ed18605d12ecc8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-.*.swp
-node_modules
-examples/extract/
-test/tmp/
-test/fixtures/
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/.travis.yml
deleted file mode 100644
index fca8ef019405d5ae2184193e07fd4c06ee7d3e0e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-language: node_js
-node_js:
-  - 0.10
-  - 0.11
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/LICENSE
deleted file mode 100644
index 019b7e40ea05687685063d3f8dfafb19aa68bb6b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/LICENSE
+++ /dev/null
@@ -1,12 +0,0 @@
-The ISC License
-Copyright (c) Isaac Z. Schlueter and Contributors
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/README.md
deleted file mode 100644
index cfda2ac180611c9ba3c4939a83d6874215acd599..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/README.md
+++ /dev/null
@@ -1,50 +0,0 @@
-# node-tar
-
-Tar for Node.js.
-
-[![NPM](https://nodei.co/npm/tar.png)](https://nodei.co/npm/tar/)
-
-## API
-
-See `examples/` for usage examples.
-
-### var tar = require('tar')
-
-Returns an object with `.Pack`, `.Extract` and `.Parse` methods.
-
-### tar.Pack([properties])
-
-Returns a through stream. Use
-[fstream](https://npmjs.org/package/fstream) to write files into the
-pack stream and you will receive tar archive data from the pack
-stream.
-
-This only works with directories, it does not work with individual files.
-
-The optional `properties` object are used to set properties in the tar
-'Global Extended Header'. If the `fromBase` property is set to true,
-the tar will contain files relative to the path passed, and not with
-the path included.
-
-### tar.Extract([options])
-
-Returns a through stream. Write tar data to the stream and the files
-in the tarball will be extracted onto the filesystem.
-
-`options` can be:
-
-```js
-{
-  path: '/path/to/extract/tar/into',
-  strip: 0, // how many path segments to strip from the root when extracting
-}
-```
-
-`options` also get passed to the `fstream.Writer` instance that `tar`
-uses internally.
-
-### tar.Parse()
-
-Returns a writable stream. Write tar data to it and it will emit
-`entry` events for each entry parsed from the tarball. This is used by
-`tar.Extract`.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/examples/extracter.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/examples/extracter.js
deleted file mode 100644
index f6253a72c5cd3eb113d3ffb712695f7e9e66f12c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/examples/extracter.js
+++ /dev/null
@@ -1,19 +0,0 @@
-var tar = require("../tar.js")
-  , fs = require("fs")
-
-
-function onError(err) {
-  console.error('An error occurred:', err)
-}
-
-function onEnd() {
-  console.log('Extracted!')
-}
-
-var extractor = tar.Extract({path: __dirname + "/extract"})
-  .on('error', onError)
-  .on('end', onEnd);
-
-fs.createReadStream(__dirname + "/../test/fixtures/c.tar")
-  .on('error', onError)
-  .pipe(extractor);
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/examples/packer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/examples/packer.js
deleted file mode 100644
index 039969ce300d12c60d23d218b0fd306b417af9d2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/examples/packer.js
+++ /dev/null
@@ -1,24 +0,0 @@
-var tar = require("../tar.js")
-  , fstream = require("fstream")
-  , fs = require("fs")
-
-var dirDest = fs.createWriteStream('dir.tar')
-
-
-function onError(err) {
-  console.error('An error occurred:', err)
-}
-
-function onEnd() {
-  console.log('Packed!')
-}
-
-var packer = tar.Pack({ noProprietary: true })
-  .on('error', onError)
-  .on('end', onEnd);
-
-// This must be a "directory"
-fstream.Reader({ path: __dirname, type: "Directory" })
-  .on('error', onError)
-  .pipe(packer)
-  .pipe(dirDest)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/examples/reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/examples/reader.js
deleted file mode 100644
index 39f3f0888a2cfd24dd0130cacac1c0942f3bb0d9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/examples/reader.js
+++ /dev/null
@@ -1,36 +0,0 @@
-var tar = require("../tar.js")
-  , fs = require("fs")
-
-fs.createReadStream(__dirname + "/../test/fixtures/c.tar")
-  .pipe(tar.Parse())
-  .on("extendedHeader", function (e) {
-    console.error("extended pax header", e.props)
-    e.on("end", function () {
-      console.error("extended pax fields:", e.fields)
-    })
-  })
-  .on("ignoredEntry", function (e) {
-    console.error("ignoredEntry?!?", e.props)
-  })
-  .on("longLinkpath", function (e) {
-    console.error("longLinkpath entry", e.props)
-    e.on("end", function () {
-      console.error("value=%j", e.body.toString())
-    })
-  })
-  .on("longPath", function (e) {
-    console.error("longPath entry", e.props)
-    e.on("end", function () {
-      console.error("value=%j", e.body.toString())
-    })
-  })
-  .on("entry", function (e) {
-    console.error("entry", e.props)
-    e.on("data", function (c) {
-      console.error("  >>>" + c.toString().replace(/\n/g, "\\n"))
-    })
-    e.on("end", function () {
-      console.error("  <<<EOF")
-    })
-  })
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/buffer-entry.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/buffer-entry.js
deleted file mode 100644
index 6c1da2373a925e038f50311ea4a2b32b1b4032c5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/buffer-entry.js
+++ /dev/null
@@ -1,30 +0,0 @@
-// just like the Entry class, but it buffers the contents
-//
-// XXX It would be good to set a maximum BufferEntry filesize,
-// since it eats up memory.  In normal operation,
-// these are only for long filenames or link names, which are
-// rarely very big.
-
-module.exports = BufferEntry
-
-var inherits = require("inherits")
-  , Entry = require("./entry.js")
-
-function BufferEntry () {
-  Entry.apply(this, arguments)
-  this._buffer = new Buffer(this.props.size)
-  this._offset = 0
-  this.body = ""
-  this.on("end", function () {
-    this.body = this._buffer.toString().slice(0, -1)
-  })
-}
-
-inherits(BufferEntry, Entry)
-
-// collect the bytes as they come in.
-BufferEntry.prototype.write = function (c) {
-  c.copy(this._buffer, this._offset)
-  this._offset += c.length
-  Entry.prototype.write.call(this, c)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/entry-writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/entry-writer.js
deleted file mode 100644
index 8e09042d016314f99a8a3c38882eacdc42257715..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/entry-writer.js
+++ /dev/null
@@ -1,169 +0,0 @@
-module.exports = EntryWriter
-
-var tar = require("../tar.js")
-  , TarHeader = require("./header.js")
-  , Entry = require("./entry.js")
-  , inherits = require("inherits")
-  , BlockStream = require("block-stream")
-  , ExtendedHeaderWriter
-  , Stream = require("stream").Stream
-  , EOF = {}
-
-inherits(EntryWriter, Stream)
-
-function EntryWriter (props) {
-  var me = this
-
-  if (!(me instanceof EntryWriter)) {
-    return new EntryWriter(props)
-  }
-
-  Stream.apply(this)
-
-  me.writable = true
-  me.readable = true
-
-  me._stream = new BlockStream(512)
-
-  me._stream.on("data", function (c) {
-    me.emit("data", c)
-  })
-
-  me._stream.on("drain", function () {
-    me.emit("drain")
-  })
-
-  me._stream.on("end", function () {
-    me.emit("end")
-    me.emit("close")
-  })
-
-  me.props = props
-  if (props.type === "Directory") {
-    props.size = 0
-  }
-  props.ustar = "ustar\0"
-  props.ustarver = "00"
-  me.path = props.path
-
-  me._buffer = []
-  me._didHeader = false
-  me._meta = false
-
-  me.on("pipe", function () {
-    me._process()
-  })
-}
-
-EntryWriter.prototype.write = function (c) {
-  // console.error(".. ew write")
-  if (this._ended) return this.emit("error", new Error("write after end"))
-  this._buffer.push(c)
-  this._process()
-  this._needDrain = this._buffer.length > 0
-  return !this._needDrain
-}
-
-EntryWriter.prototype.end = function (c) {
-  // console.error(".. ew end")
-  if (c) this._buffer.push(c)
-  this._buffer.push(EOF)
-  this._ended = true
-  this._process()
-  this._needDrain = this._buffer.length > 0
-}
-
-EntryWriter.prototype.pause = function () {
-  // console.error(".. ew pause")
-  this._paused = true
-  this.emit("pause")
-}
-
-EntryWriter.prototype.resume = function () {
-  // console.error(".. ew resume")
-  this._paused = false
-  this.emit("resume")
-  this._process()
-}
-
-EntryWriter.prototype.add = function (entry) {
-  // console.error(".. ew add")
-  if (!this.parent) return this.emit("error", new Error("no parent"))
-
-  // make sure that the _header and such is emitted, and clear out
-  // the _currentEntry link on the parent.
-  if (!this._ended) this.end()
-
-  return this.parent.add(entry)
-}
-
-EntryWriter.prototype._header = function () {
-  // console.error(".. ew header")
-  if (this._didHeader) return
-  this._didHeader = true
-
-  var headerBlock = TarHeader.encode(this.props)
-
-  if (this.props.needExtended && !this._meta) {
-    var me = this
-
-    ExtendedHeaderWriter = ExtendedHeaderWriter ||
-      require("./extended-header-writer.js")
-
-    ExtendedHeaderWriter(this.props)
-      .on("data", function (c) {
-        me.emit("data", c)
-      })
-      .on("error", function (er) {
-        me.emit("error", er)
-      })
-      .end()
-  }
-
-  // console.error(".. .. ew headerBlock emitting")
-  this.emit("data", headerBlock)
-  this.emit("header")
-}
-
-EntryWriter.prototype._process = function () {
-  // console.error(".. .. ew process")
-  if (!this._didHeader && !this._meta) {
-    this._header()
-  }
-
-  if (this._paused || this._processing) {
-    // console.error(".. .. .. paused=%j, processing=%j", this._paused, this._processing)
-    return
-  }
-
-  this._processing = true
-
-  var buf = this._buffer
-  for (var i = 0; i < buf.length; i ++) {
-    // console.error(".. .. .. i=%d", i)
-
-    var c = buf[i]
-
-    if (c === EOF) this._stream.end()
-    else this._stream.write(c)
-
-    if (this._paused) {
-      // console.error(".. .. .. paused mid-emission")
-      this._processing = false
-      if (i < buf.length) {
-        this._needDrain = true
-        this._buffer = buf.slice(i + 1)
-      }
-      return
-    }
-  }
-
-  // console.error(".. .. .. emitted")
-  this._buffer.length = 0
-  this._processing = false
-
-  // console.error(".. .. .. emitting drain")
-  this.emit("drain")
-}
-
-EntryWriter.prototype.destroy = function () {}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/entry.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/entry.js
deleted file mode 100644
index 591202bd3b9af4f6c50baf9a2d52c8062abfb15d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/entry.js
+++ /dev/null
@@ -1,220 +0,0 @@
-// A passthrough read/write stream that sets its properties
-// based on a header, extendedHeader, and globalHeader
-//
-// Can be either a file system object of some sort, or
-// a pax/ustar metadata entry.
-
-module.exports = Entry
-
-var TarHeader = require("./header.js")
-  , tar = require("../tar")
-  , assert = require("assert").ok
-  , Stream = require("stream").Stream
-  , inherits = require("inherits")
-  , fstream = require("fstream").Abstract
-
-function Entry (header, extended, global) {
-  Stream.call(this)
-  this.readable = true
-  this.writable = true
-
-  this._needDrain = false
-  this._paused = false
-  this._reading = false
-  this._ending = false
-  this._ended = false
-  this._remaining = 0
-  this._abort = false
-  this._queue = []
-  this._index = 0
-  this._queueLen = 0
-
-  this._read = this._read.bind(this)
-
-  this.props = {}
-  this._header = header
-  this._extended = extended || {}
-
-  // globals can change throughout the course of
-  // a file parse operation.  Freeze it at its current state.
-  this._global = {}
-  var me = this
-  Object.keys(global || {}).forEach(function (g) {
-    me._global[g] = global[g]
-  })
-
-  this._setProps()
-}
-
-inherits(Entry, Stream)
-
-Entry.prototype.write = function (c) {
-  if (this._ending) this.error("write() after end()", null, true)
-  if (this._remaining === 0) {
-    this.error("invalid bytes past eof")
-  }
-
-  // often we'll get a bunch of \0 at the end of the last write,
-  // since chunks will always be 512 bytes when reading a tarball.
-  if (c.length > this._remaining) {
-    c = c.slice(0, this._remaining)
-  }
-  this._remaining -= c.length
-
-  // put it on the stack.
-  var ql = this._queueLen
-  this._queue.push(c)
-  this._queueLen ++
-
-  this._read()
-
-  // either paused, or buffered
-  if (this._paused || ql > 0) {
-    this._needDrain = true
-    return false
-  }
-
-  return true
-}
-
-Entry.prototype.end = function (c) {
-  if (c) this.write(c)
-  this._ending = true
-  this._read()
-}
-
-Entry.prototype.pause = function () {
-  this._paused = true
-  this.emit("pause")
-}
-
-Entry.prototype.resume = function () {
-  // console.error("    Tar Entry resume", this.path)
-  this.emit("resume")
-  this._paused = false
-  this._read()
-  return this._queueLen - this._index > 1
-}
-
-  // This is bound to the instance
-Entry.prototype._read = function () {
-  // console.error("    Tar Entry _read", this.path)
-
-  if (this._paused || this._reading || this._ended) return
-
-  // set this flag so that event handlers don't inadvertently
-  // get multiple _read() calls running.
-  this._reading = true
-
-  // have any data to emit?
-  while (this._index < this._queueLen && !this._paused) {
-    var chunk = this._queue[this._index ++]
-    this.emit("data", chunk)
-  }
-
-  // check if we're drained
-  if (this._index >= this._queueLen) {
-    this._queue.length = this._queueLen = this._index = 0
-    if (this._needDrain) {
-      this._needDrain = false
-      this.emit("drain")
-    }
-    if (this._ending) {
-      this._ended = true
-      this.emit("end")
-    }
-  }
-
-  // if the queue gets too big, then pluck off whatever we can.
-  // this should be fairly rare.
-  var mql = this._maxQueueLen
-  if (this._queueLen > mql && this._index > 0) {
-    mql = Math.min(this._index, mql)
-    this._index -= mql
-    this._queueLen -= mql
-    this._queue = this._queue.slice(mql)
-  }
-
-  this._reading = false
-}
-
-Entry.prototype._setProps = function () {
-  // props = extended->global->header->{}
-  var header = this._header
-    , extended = this._extended
-    , global = this._global
-    , props = this.props
-
-  // first get the values from the normal header.
-  var fields = tar.fields
-  for (var f = 0; fields[f] !== null; f ++) {
-    var field = fields[f]
-      , val = header[field]
-    if (typeof val !== "undefined") props[field] = val
-  }
-
-  // next, the global header for this file.
-  // numeric values, etc, will have already been parsed.
-  ;[global, extended].forEach(function (p) {
-    Object.keys(p).forEach(function (f) {
-      if (typeof p[f] !== "undefined") props[f] = p[f]
-    })
-  })
-
-  // no nulls allowed in path or linkpath
-  ;["path", "linkpath"].forEach(function (p) {
-    if (props.hasOwnProperty(p)) {
-      props[p] = props[p].split("\0")[0]
-    }
-  })
-
-
-  // set date fields to be a proper date
-  ;["mtime", "ctime", "atime"].forEach(function (p) {
-    if (props.hasOwnProperty(p)) {
-      props[p] = new Date(props[p] * 1000)
-    }
-  })
-
-  // set the type so that we know what kind of file to create
-  var type
-  switch (tar.types[props.type]) {
-    case "OldFile":
-    case "ContiguousFile":
-      type = "File"
-      break
-
-    case "GNUDumpDir":
-      type = "Directory"
-      break
-
-    case undefined:
-      type = "Unknown"
-      break
-
-    case "Link":
-    case "SymbolicLink":
-    case "CharacterDevice":
-    case "BlockDevice":
-    case "Directory":
-    case "FIFO":
-    default:
-      type = tar.types[props.type]
-  }
-
-  this.type = type
-  this.path = props.path
-  this.size = props.size
-
-  // size is special, since it signals when the file needs to end.
-  this._remaining = props.size
-}
-
-// the parser may not call write if _abort is true. 
-// useful for skipping data from some files quickly.
-Entry.prototype.abort = function(){
-  this._abort = true
-}
-
-Entry.prototype.warn = fstream.warn
-Entry.prototype.error = fstream.error
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header-writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header-writer.js
deleted file mode 100644
index 1728c4583ae060760d1d8d077afb636b09b7d32e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header-writer.js
+++ /dev/null
@@ -1,191 +0,0 @@
-
-module.exports = ExtendedHeaderWriter
-
-var inherits = require("inherits")
-  , EntryWriter = require("./entry-writer.js")
-
-inherits(ExtendedHeaderWriter, EntryWriter)
-
-var tar = require("../tar.js")
-  , path = require("path")
-  , TarHeader = require("./header.js")
-
-// props is the props of the thing we need to write an
-// extended header for.
-// Don't be shy with it.  Just encode everything.
-function ExtendedHeaderWriter (props) {
-  // console.error(">> ehw ctor")
-  var me = this
-
-  if (!(me instanceof ExtendedHeaderWriter)) {
-    return new ExtendedHeaderWriter(props)
-  }
-
-  me.fields = props
-
-  var p =
-    { path : ("PaxHeader" + path.join("/", props.path || ""))
-             .replace(/\\/g, "/").substr(0, 100)
-    , mode : props.mode || 0666
-    , uid : props.uid || 0
-    , gid : props.gid || 0
-    , size : 0 // will be set later
-    , mtime : props.mtime || Date.now() / 1000
-    , type : "x"
-    , linkpath : ""
-    , ustar : "ustar\0"
-    , ustarver : "00"
-    , uname : props.uname || ""
-    , gname : props.gname || ""
-    , devmaj : props.devmaj || 0
-    , devmin : props.devmin || 0
-    }
-
-
-  EntryWriter.call(me, p)
-  // console.error(">> ehw props", me.props)
-  me.props = p
-
-  me._meta = true
-}
-
-ExtendedHeaderWriter.prototype.end = function () {
-  // console.error(">> ehw end")
-  var me = this
-
-  if (me._ended) return
-  me._ended = true
-
-  me._encodeFields()
-
-  if (me.props.size === 0) {
-    // nothing to write!
-    me._ready = true
-    me._stream.end()
-    return
-  }
-
-  me._stream.write(TarHeader.encode(me.props))
-  me.body.forEach(function (l) {
-    me._stream.write(l)
-  })
-  me._ready = true
-
-  // console.error(">> ehw _process calling end()", me.props)
-  this._stream.end()
-}
-
-ExtendedHeaderWriter.prototype._encodeFields = function () {
-  // console.error(">> ehw _encodeFields")
-  this.body = []
-  if (this.fields.prefix) {
-    this.fields.path = this.fields.prefix + "/" + this.fields.path
-    this.fields.prefix = ""
-  }
-  encodeFields(this.fields, "", this.body, this.fields.noProprietary)
-  var me = this
-  this.body.forEach(function (l) {
-    me.props.size += l.length
-  })
-}
-
-function encodeFields (fields, prefix, body, nop) {
-  // console.error(">> >> ehw encodeFields")
-  // "%d %s=%s\n", <length>, <keyword>, <value>
-  // The length is a decimal number, and includes itself and the \n
-  // Numeric values are decimal strings.
-
-  Object.keys(fields).forEach(function (k) {
-    var val = fields[k]
-      , numeric = tar.numeric[k]
-
-    if (prefix) k = prefix + "." + k
-
-    // already including NODETAR.type, don't need File=true also
-    if (k === fields.type && val === true) return
-
-    switch (k) {
-      // don't include anything that's always handled just fine
-      // in the normal header, or only meaningful in the context
-      // of nodetar
-      case "mode":
-      case "cksum":
-      case "ustar":
-      case "ustarver":
-      case "prefix":
-      case "basename":
-      case "dirname":
-      case "needExtended":
-      case "block":
-      case "filter":
-        return
-
-      case "rdev":
-        if (val === 0) return
-        break
-
-      case "nlink":
-      case "dev": // Truly a hero among men, Creator of Star!
-      case "ino": // Speak his name with reverent awe!  It is:
-        k = "SCHILY." + k
-        break
-
-      default: break
-    }
-
-    if (val && typeof val === "object" &&
-        !Buffer.isBuffer(val)) encodeFields(val, k, body, nop)
-    else if (val === null || val === undefined) return
-    else body.push.apply(body, encodeField(k, val, nop))
-  })
-
-  return body
-}
-
-function encodeField (k, v, nop) {
-  // lowercase keys must be valid, otherwise prefix with
-  // "NODETAR."
-  if (k.charAt(0) === k.charAt(0).toLowerCase()) {
-    var m = k.split(".")[0]
-    if (!tar.knownExtended[m]) k = "NODETAR." + k
-  }
-
-  // no proprietary
-  if (nop && k.charAt(0) !== k.charAt(0).toLowerCase()) {
-    return []
-  }
-
-  if (typeof val === "number") val = val.toString(10)
-
-  var s = new Buffer(" " + k + "=" + v + "\n")
-    , digits = Math.floor(Math.log(s.length) / Math.log(10)) + 1
-
-  // console.error("1 s=%j digits=%j s.length=%d", s.toString(), digits, s.length)
-
-  // if adding that many digits will make it go over that length,
-  // then add one to it. For example, if the string is:
-  // " foo=bar\n"
-  // then that's 9 characters.  With the "9", that bumps the length
-  // up to 10.  However, this is invalid:
-  // "10 foo=bar\n"
-  // but, since that's actually 11 characters, since 10 adds another
-  // character to the length, and the length includes the number
-  // itself.  In that case, just bump it up again.
-  if (s.length + digits >= Math.pow(10, digits)) digits += 1
-  // console.error("2 s=%j digits=%j s.length=%d", s.toString(), digits, s.length)
-
-  var len = digits + s.length
-  // console.error("3 s=%j digits=%j s.length=%d len=%d", s.toString(), digits, s.length, len)
-  var lenBuf = new Buffer("" + len)
-  if (lenBuf.length + s.length !== len) {
-    throw new Error("Bad length calculation\n"+
-                    "len="+len+"\n"+
-                    "lenBuf="+JSON.stringify(lenBuf.toString())+"\n"+
-                    "lenBuf.length="+lenBuf.length+"\n"+
-                    "digits="+digits+"\n"+
-                    "s="+JSON.stringify(s.toString())+"\n"+
-                    "s.length="+s.length)
-  }
-
-  return [lenBuf, s]
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header.js
deleted file mode 100644
index 74f432ceee5b247693298350fd4d915ae92431d0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/extended-header.js
+++ /dev/null
@@ -1,140 +0,0 @@
-// An Entry consisting of:
-//
-// "%d %s=%s\n", <length>, <keyword>, <value>
-//
-// The length is a decimal number, and includes itself and the \n
-// \0 does not terminate anything.  Only the length terminates the string.
-// Numeric values are decimal strings.
-
-module.exports = ExtendedHeader
-
-var Entry = require("./entry.js")
-  , inherits = require("inherits")
-  , tar = require("../tar.js")
-  , numeric = tar.numeric
-  , keyTrans = { "SCHILY.dev": "dev"
-               , "SCHILY.ino": "ino"
-               , "SCHILY.nlink": "nlink" }
-
-function ExtendedHeader () {
-  Entry.apply(this, arguments)
-  this.on("data", this._parse)
-  this.fields = {}
-  this._position = 0
-  this._fieldPos = 0
-  this._state = SIZE
-  this._sizeBuf = []
-  this._keyBuf = []
-  this._valBuf = []
-  this._size = -1
-  this._key = ""
-}
-
-inherits(ExtendedHeader, Entry)
-ExtendedHeader.prototype._parse = parse
-
-var s = 0
-  , states = ExtendedHeader.states = {}
-  , SIZE = states.SIZE = s++
-  , KEY  = states.KEY  = s++
-  , VAL  = states.VAL  = s++
-  , ERR  = states.ERR  = s++
-
-Object.keys(states).forEach(function (s) {
-  states[states[s]] = states[s]
-})
-
-states[s] = null
-
-// char code values for comparison
-var _0 = "0".charCodeAt(0)
-  , _9 = "9".charCodeAt(0)
-  , point = ".".charCodeAt(0)
-  , a = "a".charCodeAt(0)
-  , Z = "Z".charCodeAt(0)
-  , a = "a".charCodeAt(0)
-  , z = "z".charCodeAt(0)
-  , space = " ".charCodeAt(0)
-  , eq = "=".charCodeAt(0)
-  , cr = "\n".charCodeAt(0)
-
-function parse (c) {
-  if (this._state === ERR) return
-
-  for ( var i = 0, l = c.length
-      ; i < l
-      ; this._position++, this._fieldPos++, i++) {
-    // console.error("top of loop, size="+this._size)
-
-    var b = c[i]
-
-    if (this._size >= 0 && this._fieldPos > this._size) {
-      error(this, "field exceeds length="+this._size)
-      return
-    }
-
-    switch (this._state) {
-      case ERR: return
-
-      case SIZE:
-        // console.error("parsing size, b=%d, rest=%j", b, c.slice(i).toString())
-        if (b === space) {
-          this._state = KEY
-          // this._fieldPos = this._sizeBuf.length
-          this._size = parseInt(new Buffer(this._sizeBuf).toString(), 10)
-          this._sizeBuf.length = 0
-          continue
-        }
-        if (b < _0 || b > _9) {
-          error(this, "expected [" + _0 + ".." + _9 + "], got " + b)
-          return
-        }
-        this._sizeBuf.push(b)
-        continue
-
-      case KEY:
-        // can be any char except =, not > size.
-        if (b === eq) {
-          this._state = VAL
-          this._key = new Buffer(this._keyBuf).toString()
-          if (keyTrans[this._key]) this._key = keyTrans[this._key]
-          this._keyBuf.length = 0
-          continue
-        }
-        this._keyBuf.push(b)
-        continue
-
-      case VAL:
-        // field must end with cr
-        if (this._fieldPos === this._size - 1) {
-          // console.error("finished with "+this._key)
-          if (b !== cr) {
-            error(this, "expected \\n at end of field")
-            return
-          }
-          var val = new Buffer(this._valBuf).toString()
-          if (numeric[this._key]) {
-            val = parseFloat(val)
-          }
-          this.fields[this._key] = val
-
-          this._valBuf.length = 0
-          this._state = SIZE
-          this._size = -1
-          this._fieldPos = -1
-          continue
-        }
-        this._valBuf.push(b)
-        continue
-    }
-  }
-}
-
-function error (me, msg) {
-  msg = "invalid header: " + msg
-      + "\nposition=" + me._position
-      + "\nfield position=" + me._fieldPos
-
-  me.error(msg)
-  me.state = ERR
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/extract.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/extract.js
deleted file mode 100644
index fe1bb976eb0ce291a8ea02325a080778c6b5396d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/extract.js
+++ /dev/null
@@ -1,94 +0,0 @@
-// give it a tarball and a path, and it'll dump the contents
-
-module.exports = Extract
-
-var tar = require("../tar.js")
-  , fstream = require("fstream")
-  , inherits = require("inherits")
-  , path = require("path")
-
-function Extract (opts) {
-  if (!(this instanceof Extract)) return new Extract(opts)
-  tar.Parse.apply(this)
-
-  if (typeof opts !== "object") {
-    opts = { path: opts }
-  }
-
-  // better to drop in cwd? seems more standard.
-  opts.path = opts.path || path.resolve("node-tar-extract")
-  opts.type = "Directory"
-  opts.Directory = true
-
-  // similar to --strip or --strip-components
-  opts.strip = +opts.strip
-  if (!opts.strip || opts.strip <= 0) opts.strip = 0
-
-  this._fst = fstream.Writer(opts)
-
-  this.pause()
-  var me = this
-
-  // Hardlinks in tarballs are relative to the root
-  // of the tarball.  So, they need to be resolved against
-  // the target directory in order to be created properly.
-  me.on("entry", function (entry) {
-    // if there's a "strip" argument, then strip off that many
-    // path components.
-    if (opts.strip) {
-      var p = entry.path.split("/").slice(opts.strip).join("/")
-      entry.path = entry.props.path = p
-      if (entry.linkpath) {
-        var lp = entry.linkpath.split("/").slice(opts.strip).join("/")
-        entry.linkpath = entry.props.linkpath = lp
-      }
-    }
-    if (entry.type === "Link") {
-      entry.linkpath = entry.props.linkpath =
-        path.join(opts.path, path.join("/", entry.props.linkpath))
-    }
-
-    if (entry.type === "SymbolicLink") {
-      var dn = path.dirname(entry.path) || ""
-      var linkpath = entry.props.linkpath
-      var target = path.resolve(opts.path, dn, linkpath)
-      if (target.indexOf(opts.path) !== 0) {
-        linkpath = path.join(opts.path, path.join("/", linkpath))
-      }
-      entry.linkpath = entry.props.linkpath = linkpath
-    }
-  })
-
-  this._fst.on("ready", function () {
-    me.pipe(me._fst, { end: false })
-    me.resume()
-  })
-
-  this._fst.on('error', function(err) {
-    me.emit('error', err)
-  })
-
-  this._fst.on('drain', function() {
-    me.emit('drain')
-  })
-
-  // this._fst.on("end", function () {
-  //   console.error("\nEEEE Extract End", me._fst.path)
-  // })
-
-  this._fst.on("close", function () {
-    // console.error("\nEEEE Extract End", me._fst.path)
-    me.emit("finish")
-    me.emit("end")
-    me.emit("close")
-  })
-}
-
-inherits(Extract, tar.Parse)
-
-Extract.prototype._streamEnd = function () {
-  var me = this
-  if (!me._ended || me._entry) me.error("unexpected eof")
-  me._fst.end()
-  // my .end() is coming later.
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/global-header-writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/global-header-writer.js
deleted file mode 100644
index 0bfc7b80aa7c67c056f53a120ec522b8f1760d7e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/global-header-writer.js
+++ /dev/null
@@ -1,14 +0,0 @@
-module.exports = GlobalHeaderWriter
-
-var ExtendedHeaderWriter = require("./extended-header-writer.js")
-  , inherits = require("inherits")
-
-inherits(GlobalHeaderWriter, ExtendedHeaderWriter)
-
-function GlobalHeaderWriter (props) {
-  if (!(this instanceof GlobalHeaderWriter)) {
-    return new GlobalHeaderWriter(props)
-  }
-  ExtendedHeaderWriter.call(this, props)
-  this.props.type = "g"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/header.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/header.js
deleted file mode 100644
index 05b237c0c7b32ae4aec1aeb0ace3ce30d5c6a2fd..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/header.js
+++ /dev/null
@@ -1,385 +0,0 @@
-// parse a 512-byte header block to a data object, or vice-versa
-// If the data won't fit nicely in a simple header, then generate
-// the appropriate extended header file, and return that.
-
-module.exports = TarHeader
-
-var tar = require("../tar.js")
-  , fields = tar.fields
-  , fieldOffs = tar.fieldOffs
-  , fieldEnds = tar.fieldEnds
-  , fieldSize = tar.fieldSize
-  , numeric = tar.numeric
-  , assert = require("assert").ok
-  , space = " ".charCodeAt(0)
-  , slash = "/".charCodeAt(0)
-  , bslash = process.platform === "win32" ? "\\".charCodeAt(0) : null
-
-function TarHeader (block) {
-  if (!(this instanceof TarHeader)) return new TarHeader(block)
-  if (block) this.decode(block)
-}
-
-TarHeader.prototype =
-  { decode : decode
-  , encode: encode
-  , calcSum: calcSum
-  , checkSum: checkSum
-  }
-
-TarHeader.parseNumeric = parseNumeric
-TarHeader.encode = encode
-TarHeader.decode = decode
-
-// note that this will only do the normal ustar header, not any kind
-// of extended posix header file.  If something doesn't fit comfortably,
-// then it will set obj.needExtended = true, and set the block to
-// the closest approximation.
-function encode (obj) {
-  if (!obj && !(this instanceof TarHeader)) throw new Error(
-    "encode must be called on a TarHeader, or supplied an object")
-
-  obj = obj || this
-  var block = obj.block = new Buffer(512)
-
-  // if the object has a "prefix", then that's actually an extension of
-  // the path field.
-  if (obj.prefix) {
-    // console.error("%% header encoding, got a prefix", obj.prefix)
-    obj.path = obj.prefix + "/" + obj.path
-    // console.error("%% header encoding, prefixed path", obj.path)
-    obj.prefix = ""
-  }
-
-  obj.needExtended = false
-
-  if (obj.mode) {
-    if (typeof obj.mode === "string") obj.mode = parseInt(obj.mode, 8)
-    obj.mode = obj.mode & 0777
-  }
-
-  for (var f = 0; fields[f] !== null; f ++) {
-    var field = fields[f]
-      , off = fieldOffs[f]
-      , end = fieldEnds[f]
-      , ret
-
-    switch (field) {
-      case "cksum":
-        // special, done below, after all the others
-        break
-
-      case "prefix":
-        // special, this is an extension of the "path" field.
-        // console.error("%% header encoding, skip prefix later")
-        break
-
-      case "type":
-        // convert from long name to a single char.
-        var type = obj.type || "0"
-        if (type.length > 1) {
-          type = tar.types[obj.type]
-          if (!type) type = "0"
-        }
-        writeText(block, off, end, type)
-        break
-
-      case "path":
-        // uses the "prefix" field if > 100 bytes, but <= 255
-        var pathLen = Buffer.byteLength(obj.path)
-          , pathFSize = fieldSize[fields.path]
-          , prefFSize = fieldSize[fields.prefix]
-
-        // paths between 100 and 255 should use the prefix field.
-        // longer than 255
-        if (pathLen > pathFSize &&
-            pathLen <= pathFSize + prefFSize) {
-          // need to find a slash somewhere in the middle so that
-          // path and prefix both fit in their respective fields
-          var searchStart = pathLen - 1 - pathFSize
-            , searchEnd = prefFSize
-            , found = false
-            , pathBuf = new Buffer(obj.path)
-
-          for ( var s = searchStart
-              ; (s <= searchEnd)
-              ; s ++ ) {
-            if (pathBuf[s] === slash || pathBuf[s] === bslash) {
-              found = s
-              break
-            }
-          }
-
-          if (found !== false) {
-            prefix = pathBuf.slice(0, found).toString("utf8")
-            path = pathBuf.slice(found + 1).toString("utf8")
-
-            ret = writeText(block, off, end, path)
-            off = fieldOffs[fields.prefix]
-            end = fieldEnds[fields.prefix]
-            // console.error("%% header writing prefix", off, end, prefix)
-            ret = writeText(block, off, end, prefix) || ret
-            break
-          }
-        }
-
-        // paths less than 100 chars don't need a prefix
-        // and paths longer than 255 need an extended header and will fail
-        // on old implementations no matter what we do here.
-        // Null out the prefix, and fallthrough to default.
-        // console.error("%% header writing no prefix")
-        var poff = fieldOffs[fields.prefix]
-          , pend = fieldEnds[fields.prefix]
-        writeText(block, poff, pend, "")
-        // fallthrough
-
-      // all other fields are numeric or text
-      default:
-        ret = numeric[field]
-            ? writeNumeric(block, off, end, obj[field])
-            : writeText(block, off, end, obj[field] || "")
-        break
-    }
-    obj.needExtended = obj.needExtended || ret
-  }
-
-  var off = fieldOffs[fields.cksum]
-    , end = fieldEnds[fields.cksum]
-
-  writeNumeric(block, off, end, calcSum.call(this, block))
-
-  return block
-}
-
-// if it's a negative number, or greater than will fit,
-// then use write256.
-var MAXNUM = { 12: 077777777777
-             , 11: 07777777777
-             , 8 : 07777777
-             , 7 : 0777777 }
-function writeNumeric (block, off, end, num) {
-  var writeLen = end - off
-    , maxNum = MAXNUM[writeLen] || 0
-
-  num = num || 0
-  // console.error("  numeric", num)
-
-  if (num instanceof Date ||
-      Object.prototype.toString.call(num) === "[object Date]") {
-    num = num.getTime() / 1000
-  }
-
-  if (num > maxNum || num < 0) {
-    write256(block, off, end, num)
-    // need an extended header if negative or too big.
-    return true
-  }
-
-  // god, tar is so annoying
-  // if the string is small enough, you should put a space
-  // between the octal string and the \0, but if it doesn't
-  // fit, then don't.
-  var numStr = Math.floor(num).toString(8)
-  if (num < MAXNUM[writeLen - 1]) numStr += " "
-
-  // pad with "0" chars
-  if (numStr.length < writeLen) {
-    numStr = (new Array(writeLen - numStr.length).join("0")) + numStr
-  }
-
-  if (numStr.length !== writeLen - 1) {
-    throw new Error("invalid length: " + JSON.stringify(numStr) + "\n" +
-                    "expected: "+writeLen)
-  }
-  block.write(numStr, off, writeLen, "utf8")
-  block[end - 1] = 0
-}
-
-function write256 (block, off, end, num) {
-  var buf = block.slice(off, end)
-  var positive = num >= 0
-  buf[0] = positive ? 0x80 : 0xFF
-
-  // get the number as a base-256 tuple
-  if (!positive) num *= -1
-  var tuple = []
-  do {
-    var n = num % 256
-    tuple.push(n)
-    num = (num - n) / 256
-  } while (num)
-
-  var bytes = tuple.length
-
-  var fill = buf.length - bytes
-  for (var i = 1; i < fill; i ++) {
-    buf[i] = positive ? 0 : 0xFF
-  }
-
-  // tuple is a base256 number, with [0] as the *least* significant byte
-  // if it's negative, then we need to flip all the bits once we hit the
-  // first non-zero bit.  The 2's-complement is (0x100 - n), and the 1's-
-  // complement is (0xFF - n).
-  var zero = true
-  for (i = bytes; i > 0; i --) {
-    var byte = tuple[bytes - i]
-    if (positive) buf[fill + i] = byte
-    else if (zero && byte === 0) buf[fill + i] = 0
-    else if (zero) {
-      zero = false
-      buf[fill + i] = 0x100 - byte
-    } else buf[fill + i] = 0xFF - byte
-  }
-}
-
-function writeText (block, off, end, str) {
-  // strings are written as utf8, then padded with \0
-  var strLen = Buffer.byteLength(str)
-    , writeLen = Math.min(strLen, end - off)
-    // non-ascii fields need extended headers
-    // long fields get truncated
-    , needExtended = strLen !== str.length || strLen > writeLen
-
-  // write the string, and null-pad
-  if (writeLen > 0) block.write(str, off, writeLen, "utf8")
-  for (var i = off + writeLen; i < end; i ++) block[i] = 0
-
-  return needExtended
-}
-
-function calcSum (block) {
-  block = block || this.block
-  assert(Buffer.isBuffer(block) && block.length === 512)
-
-  if (!block) throw new Error("Need block to checksum")
-
-  // now figure out what it would be if the cksum was "        "
-  var sum = 0
-    , start = fieldOffs[fields.cksum]
-    , end = fieldEnds[fields.cksum]
-
-  for (var i = 0; i < fieldOffs[fields.cksum]; i ++) {
-    sum += block[i]
-  }
-
-  for (var i = start; i < end; i ++) {
-    sum += space
-  }
-
-  for (var i = end; i < 512; i ++) {
-    sum += block[i]
-  }
-
-  return sum
-}
-
-
-function checkSum (block) {
-  var sum = calcSum.call(this, block)
-  block = block || this.block
-
-  var cksum = block.slice(fieldOffs[fields.cksum], fieldEnds[fields.cksum])
-  cksum = parseNumeric(cksum)
-
-  return cksum === sum
-}
-
-function decode (block) {
-  block = block || this.block
-  assert(Buffer.isBuffer(block) && block.length === 512)
-
-  this.block = block
-  this.cksumValid = this.checkSum()
-
-  var prefix = null
-
-  // slice off each field.
-  for (var f = 0; fields[f] !== null; f ++) {
-    var field = fields[f]
-      , val = block.slice(fieldOffs[f], fieldEnds[f])
-
-    switch (field) {
-      case "ustar":
-        // if not ustar, then everything after that is just padding.
-        if (val.toString() !== "ustar\0") {
-          this.ustar = false
-          return
-        } else {
-          // console.error("ustar:", val, val.toString())
-          this.ustar = val.toString()
-        }
-        break
-
-      // prefix is special, since it might signal the xstar header
-      case "prefix":
-        var atime = parseNumeric(val.slice(131, 131 + 12))
-          , ctime = parseNumeric(val.slice(131 + 12, 131 + 12 + 12))
-        if ((val[130] === 0 || val[130] === space) &&
-            typeof atime === "number" &&
-            typeof ctime === "number" &&
-            val[131 + 12] === space &&
-            val[131 + 12 + 12] === space) {
-          this.atime = atime
-          this.ctime = ctime
-          val = val.slice(0, 130)
-        }
-        prefix = val.toString("utf8").replace(/\0+$/, "")
-        // console.error("%% header reading prefix", prefix)
-        break
-
-      // all other fields are null-padding text
-      // or a number.
-      default:
-        if (numeric[field]) {
-          this[field] = parseNumeric(val)
-        } else {
-          this[field] = val.toString("utf8").replace(/\0+$/, "")
-        }
-        break
-    }
-  }
-
-  // if we got a prefix, then prepend it to the path.
-  if (prefix) {
-    this.path = prefix + "/" + this.path
-    // console.error("%% header got a prefix", this.path)
-  }
-}
-
-function parse256 (buf) {
-  // first byte MUST be either 80 or FF
-  // 80 for positive, FF for 2's comp
-  var positive
-  if (buf[0] === 0x80) positive = true
-  else if (buf[0] === 0xFF) positive = false
-  else return null
-
-  // build up a base-256 tuple from the least sig to the highest
-  var zero = false
-    , tuple = []
-  for (var i = buf.length - 1; i > 0; i --) {
-    var byte = buf[i]
-    if (positive) tuple.push(byte)
-    else if (zero && byte === 0) tuple.push(0)
-    else if (zero) {
-      zero = false
-      tuple.push(0x100 - byte)
-    } else tuple.push(0xFF - byte)
-  }
-
-  for (var sum = 0, i = 0, l = tuple.length; i < l; i ++) {
-    sum += tuple[i] * Math.pow(256, i)
-  }
-
-  return positive ? sum : -1 * sum
-}
-
-function parseNumeric (f) {
-  if (f[0] & 0x80) return parse256(f)
-
-  var str = f.toString("utf8").split("\0")[0].trim()
-    , res = parseInt(str, 8)
-
-  return isNaN(res) ? null : res
-}
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/pack.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/pack.js
deleted file mode 100644
index 5a3bb95a121bdb0a26a6231929879a4663f476e0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/pack.js
+++ /dev/null
@@ -1,236 +0,0 @@
-// pipe in an fstream, and it'll make a tarball.
-// key-value pair argument is global extended header props.
-
-module.exports = Pack
-
-var EntryWriter = require("./entry-writer.js")
-  , Stream = require("stream").Stream
-  , path = require("path")
-  , inherits = require("inherits")
-  , GlobalHeaderWriter = require("./global-header-writer.js")
-  , collect = require("fstream").collect
-  , eof = new Buffer(512)
-
-for (var i = 0; i < 512; i ++) eof[i] = 0
-
-inherits(Pack, Stream)
-
-function Pack (props) {
-  // console.error("-- p ctor")
-  var me = this
-  if (!(me instanceof Pack)) return new Pack(props)
-
-  if (props) me._noProprietary = props.noProprietary
-  else me._noProprietary = false
-
-  me._global = props
-
-  me.readable = true
-  me.writable = true
-  me._buffer = []
-  // console.error("-- -- set current to null in ctor")
-  me._currentEntry = null
-  me._processing = false
-
-  me._pipeRoot = null
-  me.on("pipe", function (src) {
-    if (src.root === me._pipeRoot) return
-    me._pipeRoot = src
-    src.on("end", function () {
-      me._pipeRoot = null
-    })
-    me.add(src)
-  })
-}
-
-Pack.prototype.addGlobal = function (props) {
-  // console.error("-- p addGlobal")
-  if (this._didGlobal) return
-  this._didGlobal = true
-
-  var me = this
-  GlobalHeaderWriter(props)
-    .on("data", function (c) {
-      me.emit("data", c)
-    })
-    .end()
-}
-
-Pack.prototype.add = function (stream) {
-  if (this._global && !this._didGlobal) this.addGlobal(this._global)
-
-  if (this._ended) return this.emit("error", new Error("add after end"))
-
-  collect(stream)
-  this._buffer.push(stream)
-  this._process()
-  this._needDrain = this._buffer.length > 0
-  return !this._needDrain
-}
-
-Pack.prototype.pause = function () {
-  this._paused = true
-  if (this._currentEntry) this._currentEntry.pause()
-  this.emit("pause")
-}
-
-Pack.prototype.resume = function () {
-  this._paused = false
-  if (this._currentEntry) this._currentEntry.resume()
-  this.emit("resume")
-  this._process()
-}
-
-Pack.prototype.end = function () {
-  this._ended = true
-  this._buffer.push(eof)
-  this._process()
-}
-
-Pack.prototype._process = function () {
-  var me = this
-  if (me._paused || me._processing) {
-    return
-  }
-
-  var entry = me._buffer.shift()
-
-  if (!entry) {
-    if (me._needDrain) {
-      me.emit("drain")
-    }
-    return
-  }
-
-  if (entry.ready === false) {
-    // console.error("-- entry is not ready", entry)
-    me._buffer.unshift(entry)
-    entry.on("ready", function () {
-      // console.error("-- -- ready!", entry)
-      me._process()
-    })
-    return
-  }
-
-  me._processing = true
-
-  if (entry === eof) {
-    // need 2 ending null blocks.
-    me.emit("data", eof)
-    me.emit("data", eof)
-    me.emit("end")
-    me.emit("close")
-    return
-  }
-
-  // Change the path to be relative to the root dir that was
-  // added to the tarball.
-  //
-  // XXX This should be more like how -C works, so you can
-  // explicitly set a root dir, and also explicitly set a pathname
-  // in the tarball to use.  That way we can skip a lot of extra
-  // work when resolving symlinks for bundled dependencies in npm.
-
-  var root = path.dirname((entry.root || entry).path);
-  if (me._global && me._global.fromBase && entry.root && entry.root.path) {
-    // user set 'fromBase: true' indicating tar root should be directory itself
-    root = entry.root.path;
-  }
-
-  var wprops = {}
-
-  Object.keys(entry.props || {}).forEach(function (k) {
-    wprops[k] = entry.props[k]
-  })
-
-  if (me._noProprietary) wprops.noProprietary = true
-
-  wprops.path = path.relative(root, entry.path || '')
-
-  // actually not a matter of opinion or taste.
-  if (process.platform === "win32") {
-    wprops.path = wprops.path.replace(/\\/g, "/")
-  }
-
-  if (!wprops.type)
-    wprops.type = 'Directory'
-
-  switch (wprops.type) {
-    // sockets not supported
-    case "Socket":
-      return
-
-    case "Directory":
-      wprops.path += "/"
-      wprops.size = 0
-      break
-
-    case "Link":
-      var lp = path.resolve(path.dirname(entry.path), entry.linkpath)
-      wprops.linkpath = path.relative(root, lp) || "."
-      wprops.size = 0
-      break
-
-    case "SymbolicLink":
-      var lp = path.resolve(path.dirname(entry.path), entry.linkpath)
-      wprops.linkpath = path.relative(path.dirname(entry.path), lp) || "."
-      wprops.size = 0
-      break
-  }
-
-  // console.error("-- new writer", wprops)
-  // if (!wprops.type) {
-  //   // console.error("-- no type?", entry.constructor.name, entry)
-  // }
-
-  // console.error("-- -- set current to new writer", wprops.path)
-  var writer = me._currentEntry = EntryWriter(wprops)
-
-  writer.parent = me
-
-  // writer.on("end", function () {
-  //   // console.error("-- -- writer end", writer.path)
-  // })
-
-  writer.on("data", function (c) {
-    me.emit("data", c)
-  })
-
-  writer.on("header", function () {
-    Buffer.prototype.toJSON = function () {
-      return this.toString().split(/\0/).join(".")
-    }
-    // console.error("-- -- writer header %j", writer.props)
-    if (writer.props.size === 0) nextEntry()
-  })
-  writer.on("close", nextEntry)
-
-  var ended = false
-  function nextEntry () {
-    if (ended) return
-    ended = true
-
-    // console.error("-- -- writer close", writer.path)
-    // console.error("-- -- set current to null", wprops.path)
-    me._currentEntry = null
-    me._processing = false
-    me._process()
-  }
-
-  writer.on("error", function (er) {
-    // console.error("-- -- writer error", writer.path)
-    me.emit("error", er)
-  })
-
-  // if it's the root, then there's no need to add its entries,
-  // or data, since they'll be added directly.
-  if (entry === me._pipeRoot) {
-    // console.error("-- is the root, don't auto-add")
-    writer.add = null
-  }
-
-  entry.pipe(writer)
-}
-
-Pack.prototype.destroy = function () {}
-Pack.prototype.write = function () {}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/parse.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/parse.js
deleted file mode 100644
index 600ad782f0f61dcb60800eea3a0d9953f0ef2de5..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/lib/parse.js
+++ /dev/null
@@ -1,275 +0,0 @@
-
-// A writable stream.
-// It emits "entry" events, which provide a readable stream that has
-// header info attached.
-
-module.exports = Parse.create = Parse
-
-var stream = require("stream")
-  , Stream = stream.Stream
-  , BlockStream = require("block-stream")
-  , tar = require("../tar.js")
-  , TarHeader = require("./header.js")
-  , Entry = require("./entry.js")
-  , BufferEntry = require("./buffer-entry.js")
-  , ExtendedHeader = require("./extended-header.js")
-  , assert = require("assert").ok
-  , inherits = require("inherits")
-  , fstream = require("fstream")
-
-// reading a tar is a lot like reading a directory
-// However, we're actually not going to run the ctor,
-// since it does a stat and various other stuff.
-// This inheritance gives us the pause/resume/pipe
-// behavior that is desired.
-inherits(Parse, fstream.Reader)
-
-function Parse () {
-  var me = this
-  if (!(me instanceof Parse)) return new Parse()
-
-  // doesn't apply fstream.Reader ctor?
-  // no, becasue we don't want to stat/etc, we just
-  // want to get the entry/add logic from .pipe()
-  Stream.apply(me)
-
-  me.writable = true
-  me.readable = true
-  me._stream = new BlockStream(512)
-  me.position = 0
-  me._ended = false
-
-  me._stream.on("error", function (e) {
-    me.emit("error", e)
-  })
-
-  me._stream.on("data", function (c) {
-    me._process(c)
-  })
-
-  me._stream.on("end", function () {
-    me._streamEnd()
-  })
-
-  me._stream.on("drain", function () {
-    me.emit("drain")
-  })
-}
-
-// overridden in Extract class, since it needs to
-// wait for its DirWriter part to finish before
-// emitting "end"
-Parse.prototype._streamEnd = function () {
-  var me = this
-  if (!me._ended || me._entry) me.error("unexpected eof")
-  me.emit("end")
-}
-
-// a tar reader is actually a filter, not just a readable stream.
-// So, you should pipe a tarball stream into it, and it needs these
-// write/end methods to do that.
-Parse.prototype.write = function (c) {
-  if (this._ended) {
-    // gnutar puts a LOT of nulls at the end.
-    // you can keep writing these things forever.
-    // Just ignore them.
-    for (var i = 0, l = c.length; i > l; i ++) {
-      if (c[i] !== 0) return this.error("write() after end()")
-    }
-    return
-  }
-  return this._stream.write(c)
-}
-
-Parse.prototype.end = function (c) {
-  this._ended = true
-  return this._stream.end(c)
-}
-
-// don't need to do anything, since we're just
-// proxying the data up from the _stream.
-// Just need to override the parent's "Not Implemented"
-// error-thrower.
-Parse.prototype._read = function () {}
-
-Parse.prototype._process = function (c) {
-  assert(c && c.length === 512, "block size should be 512")
-
-  // one of three cases.
-  // 1. A new header
-  // 2. A part of a file/extended header
-  // 3. One of two or more EOF null blocks
-
-  if (this._entry) {
-    var entry = this._entry
-    if(!entry._abort) entry.write(c)
-    else {
-      entry._remaining -= c.length
-      if(entry._remaining < 0) entry._remaining = 0
-    }
-    if (entry._remaining === 0) {
-      entry.end()
-      this._entry = null
-    }
-  } else {
-    // either zeroes or a header
-    var zero = true
-    for (var i = 0; i < 512 && zero; i ++) {
-      zero = c[i] === 0
-    }
-
-    // eof is *at least* 2 blocks of nulls, and then the end of the
-    // file.  you can put blocks of nulls between entries anywhere,
-    // so appending one tarball to another is technically valid.
-    // ending without the eof null blocks is not allowed, however.
-    if (zero) {
-      if (this._eofStarted)
-        this._ended = true
-      this._eofStarted = true
-    } else {
-      this._eofStarted = false
-      this._startEntry(c)
-    }
-  }
-
-  this.position += 512
-}
-
-// take a header chunk, start the right kind of entry.
-Parse.prototype._startEntry = function (c) {
-  var header = new TarHeader(c)
-    , self = this
-    , entry
-    , ev
-    , EntryType
-    , onend
-    , meta = false
-
-  if (null === header.size || !header.cksumValid) {
-    var e = new Error("invalid tar file")
-    e.header = header
-    e.tar_file_offset = this.position
-    e.tar_block = this.position / 512
-    return this.emit("error", e)
-  }
-
-  switch (tar.types[header.type]) {
-    case "File":
-    case "OldFile":
-    case "Link":
-    case "SymbolicLink":
-    case "CharacterDevice":
-    case "BlockDevice":
-    case "Directory":
-    case "FIFO":
-    case "ContiguousFile":
-    case "GNUDumpDir":
-      // start a file.
-      // pass in any extended headers
-      // These ones consumers are typically most interested in.
-      EntryType = Entry
-      ev = "entry"
-      break
-
-    case "GlobalExtendedHeader":
-      // extended headers that apply to the rest of the tarball
-      EntryType = ExtendedHeader
-      onend = function () {
-        self._global = self._global || {}
-        Object.keys(entry.fields).forEach(function (k) {
-          self._global[k] = entry.fields[k]
-        })
-      }
-      ev = "globalExtendedHeader"
-      meta = true
-      break
-
-    case "ExtendedHeader":
-    case "OldExtendedHeader":
-      // extended headers that apply to the next entry
-      EntryType = ExtendedHeader
-      onend = function () {
-        self._extended = entry.fields
-      }
-      ev = "extendedHeader"
-      meta = true
-      break
-
-    case "NextFileHasLongLinkpath":
-      // set linkpath=<contents> in extended header
-      EntryType = BufferEntry
-      onend = function () {
-        self._extended = self._extended || {}
-        self._extended.linkpath = entry.body
-      }
-      ev = "longLinkpath"
-      meta = true
-      break
-
-    case "NextFileHasLongPath":
-    case "OldGnuLongPath":
-      // set path=<contents> in file-extended header
-      EntryType = BufferEntry
-      onend = function () {
-        self._extended = self._extended || {}
-        self._extended.path = entry.body
-      }
-      ev = "longPath"
-      meta = true
-      break
-
-    default:
-      // all the rest we skip, but still set the _entry
-      // member, so that we can skip over their data appropriately.
-      // emit an event to say that this is an ignored entry type?
-      EntryType = Entry
-      ev = "ignoredEntry"
-      break
-  }
-
-  var global, extended
-  if (meta) {
-    global = extended = null
-  } else {
-    var global = this._global
-    var extended = this._extended
-
-    // extendedHeader only applies to one entry, so once we start
-    // an entry, it's over.
-    this._extended = null
-  }
-  entry = new EntryType(header, extended, global)
-  entry.meta = meta
-
-  // only proxy data events of normal files.
-  if (!meta) {
-    entry.on("data", function (c) {
-      me.emit("data", c)
-    })
-  }
-
-  if (onend) entry.on("end", onend)
-
-  this._entry = entry
-  var me = this
-
-  entry.on("pause", function () {
-    me.pause()
-  })
-
-  entry.on("resume", function () {
-    me.resume()
-  })
-
-  if (this.listeners("*").length) {
-    this.emit("*", ev, entry)
-  }
-
-  this.emit(ev, entry)
-
-  // Zero-byte entry.  End immediately.
-  if (entry.props.size === 0) {
-    entry.end()
-    this._entry = null
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/LICENCE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/LICENCE
deleted file mode 100644
index 74489e2e2658e71251f277c8c67fa5160a3ff2f2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/LICENCE
+++ /dev/null
@@ -1,25 +0,0 @@
-Copyright (c) Isaac Z. Schlueter
-All rights reserved.
-
-The BSD License
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-1. Redistributions of source code must retain the above copyright
-   notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
-   notice, this list of conditions and the following disclaimer in the
-   documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
-``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
-TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
-BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/README.md
deleted file mode 100644
index c16e9c468891db4afc1c9f04fcdac10b0cf6d179..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# block-stream
-
-A stream of blocks.
-
-Write data into it, and it'll output data in buffer blocks the size you
-specify, padding with zeroes if necessary.
-
-```javascript
-var block = new BlockStream(512)
-fs.createReadStream("some-file").pipe(block)
-block.pipe(fs.createWriteStream("block-file"))
-```
-
-When `.end()` or `.flush()` is called, it'll pad the block with zeroes.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/block-stream.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/block-stream.js
deleted file mode 100644
index 008de035c2edca32dbb619daf441893e0e548845..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/block-stream.js
+++ /dev/null
@@ -1,209 +0,0 @@
-// write data to it, and it'll emit data in 512 byte blocks.
-// if you .end() or .flush(), it'll emit whatever it's got,
-// padded with nulls to 512 bytes.
-
-module.exports = BlockStream
-
-var Stream = require("stream").Stream
-  , inherits = require("inherits")
-  , assert = require("assert").ok
-  , debug = process.env.DEBUG ? console.error : function () {}
-
-function BlockStream (size, opt) {
-  this.writable = this.readable = true
-  this._opt = opt || {}
-  this._chunkSize = size || 512
-  this._offset = 0
-  this._buffer = []
-  this._bufferLength = 0
-  if (this._opt.nopad) this._zeroes = false
-  else {
-    this._zeroes = new Buffer(this._chunkSize)
-    for (var i = 0; i < this._chunkSize; i ++) {
-      this._zeroes[i] = 0
-    }
-  }
-}
-
-inherits(BlockStream, Stream)
-
-BlockStream.prototype.write = function (c) {
-  // debug("   BS write", c)
-  if (this._ended) throw new Error("BlockStream: write after end")
-  if (c && !Buffer.isBuffer(c)) c = new Buffer(c + "")
-  if (c.length) {
-    this._buffer.push(c)
-    this._bufferLength += c.length
-  }
-  // debug("pushed onto buffer", this._bufferLength)
-  if (this._bufferLength >= this._chunkSize) {
-    if (this._paused) {
-      // debug("   BS paused, return false, need drain")
-      this._needDrain = true
-      return false
-    }
-    this._emitChunk()
-  }
-  return true
-}
-
-BlockStream.prototype.pause = function () {
-  // debug("   BS pausing")
-  this._paused = true
-}
-
-BlockStream.prototype.resume = function () {
-  // debug("   BS resume")
-  this._paused = false
-  return this._emitChunk()
-}
-
-BlockStream.prototype.end = function (chunk) {
-  // debug("end", chunk)
-  if (typeof chunk === "function") cb = chunk, chunk = null
-  if (chunk) this.write(chunk)
-  this._ended = true
-  this.flush()
-}
-
-BlockStream.prototype.flush = function () {
-  this._emitChunk(true)
-}
-
-BlockStream.prototype._emitChunk = function (flush) {
-  // debug("emitChunk flush=%j emitting=%j paused=%j", flush, this._emitting, this._paused)
-
-  // emit a <chunkSize> chunk
-  if (flush && this._zeroes) {
-    // debug("    BS push zeroes", this._bufferLength)
-    // push a chunk of zeroes
-    var padBytes = (this._bufferLength % this._chunkSize)
-    if (padBytes !== 0) padBytes = this._chunkSize - padBytes
-    if (padBytes > 0) {
-      // debug("padBytes", padBytes, this._zeroes.slice(0, padBytes))
-      this._buffer.push(this._zeroes.slice(0, padBytes))
-      this._bufferLength += padBytes
-      // debug(this._buffer[this._buffer.length - 1].length, this._bufferLength)
-    }
-  }
-
-  if (this._emitting || this._paused) return
-  this._emitting = true
-
-  // debug("    BS entering loops")
-  var bufferIndex = 0
-  while (this._bufferLength >= this._chunkSize &&
-         (flush || !this._paused)) {
-    // debug("     BS data emission loop", this._bufferLength)
-
-    var out
-      , outOffset = 0
-      , outHas = this._chunkSize
-
-    while (outHas > 0 && (flush || !this._paused) ) {
-      // debug("    BS data inner emit loop", this._bufferLength)
-      var cur = this._buffer[bufferIndex]
-        , curHas = cur.length - this._offset
-      // debug("cur=", cur)
-      // debug("curHas=%j", curHas)
-      // If it's not big enough to fill the whole thing, then we'll need
-      // to copy multiple buffers into one.  However, if it is big enough,
-      // then just slice out the part we want, to save unnecessary copying.
-      // Also, need to copy if we've already done some copying, since buffers
-      // can't be joined like cons strings.
-      if (out || curHas < outHas) {
-        out = out || new Buffer(this._chunkSize)
-        cur.copy(out, outOffset,
-                 this._offset, this._offset + Math.min(curHas, outHas))
-      } else if (cur.length === outHas && this._offset === 0) {
-        // shortcut -- cur is exactly long enough, and no offset.
-        out = cur
-      } else {
-        // slice out the piece of cur that we need.
-        out = cur.slice(this._offset, this._offset + outHas)
-      }
-
-      if (curHas > outHas) {
-        // means that the current buffer couldn't be completely output
-        // update this._offset to reflect how much WAS written
-        this._offset += outHas
-        outHas = 0
-      } else {
-        // output the entire current chunk.
-        // toss it away
-        outHas -= curHas
-        outOffset += curHas
-        bufferIndex ++
-        this._offset = 0
-      }
-    }
-
-    this._bufferLength -= this._chunkSize
-    assert(out.length === this._chunkSize)
-    // debug("emitting data", out)
-    // debug("   BS emitting, paused=%j", this._paused, this._bufferLength)
-    this.emit("data", out)
-    out = null
-  }
-  // debug("    BS out of loops", this._bufferLength)
-
-  // whatever is left, it's not enough to fill up a block, or we're paused
-  this._buffer = this._buffer.slice(bufferIndex)
-  if (this._paused) {
-    // debug("    BS paused, leaving", this._bufferLength)
-    this._needsDrain = true
-    this._emitting = false
-    return
-  }
-
-  // if flushing, and not using null-padding, then need to emit the last
-  // chunk(s) sitting in the queue.  We know that it's not enough to
-  // fill up a whole block, because otherwise it would have been emitted
-  // above, but there may be some offset.
-  var l = this._buffer.length
-  if (flush && !this._zeroes && l) {
-    if (l === 1) {
-      if (this._offset) {
-        this.emit("data", this._buffer[0].slice(this._offset))
-      } else {
-        this.emit("data", this._buffer[0])
-      }
-    } else {
-      var outHas = this._bufferLength
-        , out = new Buffer(outHas)
-        , outOffset = 0
-      for (var i = 0; i < l; i ++) {
-        var cur = this._buffer[i]
-          , curHas = cur.length - this._offset
-        cur.copy(out, outOffset, this._offset)
-        this._offset = 0
-        outOffset += curHas
-        this._bufferLength -= curHas
-      }
-      this.emit("data", out)
-    }
-    // truncate
-    this._buffer.length = 0
-    this._bufferLength = 0
-    this._offset = 0
-  }
-
-  // now either drained or ended
-  // debug("either draining, or ended", this._bufferLength, this._ended)
-  // means that we've flushed out all that we can so far.
-  if (this._needDrain) {
-    // debug("emitting drain", this._bufferLength)
-    this._needDrain = false
-    this.emit("drain")
-  }
-
-  if ((this._bufferLength === 0) && this._ended && !this._endEmitted) {
-    // debug("emitting end", this._bufferLength)
-    this._endEmitted = true
-    this.emit("end")
-  }
-
-  this._emitting = false
-
-  // debug("    BS no longer emitting", flush, this._paused, this._emitting, this._bufferLength, this._chunkSize)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/package.json
deleted file mode 100644
index 7fd10c0e3cd6243d495ae05bf116510c0b68d142..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/block-stream/package.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "_from": "block-stream@*",
-  "_id": "block-stream@0.0.9",
-  "_location": "/serialport/node-pre-gyp/tar/block-stream",
-  "_nodeVersion": "5.6.0",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/block-stream-0.0.9.tgz_1462149852620_0.6890447810292244"
-  },
-  "_npmUser": {
-    "email": "i@izs.me",
-    "name": "isaacs"
-  },
-  "_npmVersion": "3.8.5",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar"
-  ],
-  "_resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
-  "_shasum": "13ebfe778a03205cfe03751481ebb4b3300c126a",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/block-stream/issues"
-  },
-  "dependencies": {
-    "inherits": "~2.0.0"
-  },
-  "description": "a stream of blocks",
-  "devDependencies": {
-    "tap": "^5.7.1"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "13ebfe778a03205cfe03751481ebb4b3300c126a",
-    "tarball": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz"
-  },
-  "engines": {
-    "node": "0.4 || >=0.5.8"
-  },
-  "files": [
-    "block-stream.js"
-  ],
-  "gitHead": "321cf242ef6d130bb2e59c0565a61ded5dd2673f",
-  "homepage": "https://github.com/isaacs/block-stream#readme",
-  "license": "ISC",
-  "main": "block-stream.js",
-  "maintainers": [
-    {
-      "name": "isaacs",
-      "email": "i@izs.me"
-    }
-  ],
-  "name": "block-stream",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/block-stream.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js --cov"
-  },
-  "version": "0.0.9"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.npmignore b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.npmignore
deleted file mode 100644
index 494272a81afb6f29e423cce250d2b3dfe9b5f3f3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.npmignore
+++ /dev/null
@@ -1,5 +0,0 @@
-.*.swp
-node_modules/
-examples/deep-copy/
-examples/path/
-examples/filter-copy/
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.travis.yml b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.travis.yml
deleted file mode 100644
index 9f5972ab5aa1cd8e656ada1abd8e43a244d736fe..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/.travis.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-language: node_js
-node_js:
-  - "6"
-  - "4"
-  - "0.10"
-  - "0.12"
-before_install:
-  - "npm config set spin false"
-  - "npm install -g npm/npm"
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/LICENSE
deleted file mode 100644
index 19129e315fe593965a2fdd50ec0d1253bcbd2ece..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/README.md
deleted file mode 100644
index 9d8cb77e5c30bad07fb1a50eefa428fa2a48c98a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/README.md
+++ /dev/null
@@ -1,76 +0,0 @@
-Like FS streams, but with stat on them, and supporting directories and
-symbolic links, as well as normal files.  Also, you can use this to set
-the stats on a file, even if you don't change its contents, or to create
-a symlink, etc.
-
-So, for example, you can "write" a directory, and it'll call `mkdir`.  You
-can specify a uid and gid, and it'll call `chown`.  You can specify a
-`mtime` and `atime`, and it'll call `utimes`.  You can call it a symlink
-and provide a `linkpath` and it'll call `symlink`.
-
-Note that it won't automatically resolve symbolic links.  So, if you
-call `fstream.Reader('/some/symlink')` then you'll get an object
-that stats and then ends immediately (since it has no data).  To follow
-symbolic links, do this: `fstream.Reader({path:'/some/symlink', follow:
-true })`.
-
-There are various checks to make sure that the bytes emitted are the
-same as the intended size, if the size is set.
-
-## Examples
-
-```javascript
-fstream
-  .Writer({ path: "path/to/file"
-          , mode: 0755
-          , size: 6
-          })
-  .write("hello\n")
-  .end()
-```
-
-This will create the directories if they're missing, and then write
-`hello\n` into the file, chmod it to 0755, and assert that 6 bytes have
-been written when it's done.
-
-```javascript
-fstream
-  .Writer({ path: "path/to/file"
-          , mode: 0755
-          , size: 6
-          , flags: "a"
-          })
-  .write("hello\n")
-  .end()
-```
-
-You can pass flags in, if you want to append to a file.
-
-```javascript
-fstream
-  .Writer({ path: "path/to/symlink"
-          , linkpath: "./file"
-          , SymbolicLink: true
-          , mode: "0755" // octal strings supported
-          })
-  .end()
-```
-
-If isSymbolicLink is a function, it'll be called, and if it returns
-true, then it'll treat it as a symlink.  If it's not a function, then
-any truish value will make a symlink, or you can set `type:
-'SymbolicLink'`, which does the same thing.
-
-Note that the linkpath is relative to the symbolic link location, not
-the parent dir or cwd.
-
-```javascript
-fstream
-  .Reader("path/to/dir")
-  .pipe(fstream.Writer("path/to/other/dir"))
-```
-
-This will do like `cp -Rp path/to/dir path/to/other/dir`.  If the other
-dir exists and isn't a directory, then it'll emit an error.  It'll also
-set the uid, gid, mode, etc. to be identical.  In this way, it's more
-like `rsync -a` than simply a copy.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/filter-pipe.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/filter-pipe.js
deleted file mode 100644
index 83dadef8a6f39bf24e73bd608d0e3f342fc03e9a..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/filter-pipe.js
+++ /dev/null
@@ -1,134 +0,0 @@
-var fstream = require('../fstream.js')
-var path = require('path')
-
-var r = fstream.Reader({
-  path: path.dirname(__dirname),
-  filter: function () {
-    return !this.basename.match(/^\./) &&
-      !this.basename.match(/^node_modules$/) &&
-      !this.basename.match(/^deep-copy$/) &&
-      !this.basename.match(/^filter-copy$/)
-  }
-})
-
-// this writer will only write directories
-var w = fstream.Writer({
-  path: path.resolve(__dirname, 'filter-copy'),
-  type: 'Directory',
-  filter: function () {
-    return this.type === 'Directory'
-  }
-})
-
-var indent = ''
-
-r.on('entry', appears)
-r.on('ready', function () {
-  console.error('ready to begin!', r.path)
-})
-
-function appears (entry) {
-  console.error(indent + 'a %s appears!', entry.type, entry.basename, typeof entry.basename)
-  if (foggy) {
-    console.error('FOGGY!')
-    var p = entry
-    do {
-      console.error(p.depth, p.path, p._paused)
-      p = p.parent
-    } while (p)
-
-    throw new Error('\u001b[mshould not have entries while foggy')
-  }
-  indent += '\t'
-  entry.on('data', missile(entry))
-  entry.on('end', runaway(entry))
-  entry.on('entry', appears)
-}
-
-var foggy
-function missile (entry) {
-  function liftFog (who) {
-    if (!foggy) return
-    if (who) {
-      console.error('%s breaks the spell!', who && who.path)
-    } else {
-      console.error('the spell expires!')
-    }
-    console.error('\u001b[mthe fog lifts!\n')
-    clearTimeout(foggy)
-    foggy = null
-    if (entry._paused) entry.resume()
-  }
-
-  if (entry.type === 'Directory') {
-    var ended = false
-    entry.once('end', function () { ended = true })
-    return function (c) {
-      // throw in some pathological pause()/resume() behavior
-      // just for extra fun.
-      process.nextTick(function () {
-        if (!foggy && !ended) { // && Math.random() < 0.3) {
-          console.error(indent + '%s casts a spell', entry.basename)
-          console.error('\na slowing fog comes over the battlefield...\n\u001b[32m')
-          entry.pause()
-          entry.once('resume', liftFog)
-          foggy = setTimeout(liftFog, 1000)
-        }
-      })
-    }
-  }
-
-  return function (c) {
-    var e = Math.random() < 0.5
-    console.error(indent + '%s %s for %d damage!',
-      entry.basename,
-      e ? 'is struck' : 'fires a chunk',
-      c.length)
-  }
-}
-
-function runaway (entry) {
-  return function () {
-    var e = Math.random() < 0.5
-    console.error(indent + '%s %s',
-      entry.basename,
-      e ? 'turns to flee' : 'is vanquished!')
-    indent = indent.slice(0, -1)
-  }
-}
-
-w.on('entry', attacks)
-// w.on('ready', function () { attacks(w) })
-function attacks (entry) {
-  console.error(indent + '%s %s!', entry.basename,
-    entry.type === 'Directory' ? 'calls for backup' : 'attacks')
-  entry.on('entry', attacks)
-}
-
-var ended = false
-var i = 1
-r.on('end', function () {
-  if (foggy) clearTimeout(foggy)
-  console.error("\u001b[mIT'S OVER!!")
-  console.error('A WINNAR IS YOU!')
-
-  console.log('ok ' + (i++) + ' A WINNAR IS YOU')
-  ended = true
-  // now go through and verify that everything in there is a dir.
-  var p = path.resolve(__dirname, 'filter-copy')
-  var checker = fstream.Reader({ path: p })
-  checker.checker = true
-  checker.on('child', function (e) {
-    var ok = e.type === 'Directory'
-    console.log((ok ? '' : 'not ') + 'ok ' + (i++) +
-      ' should be a dir: ' +
-      e.path.substr(checker.path.length + 1))
-  })
-})
-
-process.on('exit', function () {
-  console.log((ended ? '' : 'not ') + 'ok ' + (i) + ' ended')
-  console.log('1..' + i)
-})
-
-r.pipe(w)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/pipe.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/pipe.js
deleted file mode 100644
index 3de42ef32bfd7b74a359742319ec48ad718833b0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/pipe.js
+++ /dev/null
@@ -1,118 +0,0 @@
-var fstream = require('../fstream.js')
-var path = require('path')
-
-var r = fstream.Reader({
-  path: path.dirname(__dirname),
-  filter: function () {
-    return !this.basename.match(/^\./) &&
-      !this.basename.match(/^node_modules$/) &&
-      !this.basename.match(/^deep-copy$/)
-  }
-})
-
-var w = fstream.Writer({
-  path: path.resolve(__dirname, 'deep-copy'),
-  type: 'Directory'
-})
-
-var indent = ''
-
-r.on('entry', appears)
-r.on('ready', function () {
-  console.error('ready to begin!', r.path)
-})
-
-function appears (entry) {
-  console.error(indent + 'a %s appears!', entry.type, entry.basename, typeof entry.basename, entry)
-  if (foggy) {
-    console.error('FOGGY!')
-    var p = entry
-    do {
-      console.error(p.depth, p.path, p._paused)
-      p = p.parent
-    } while (p)
-
-    throw new Error('\u001b[mshould not have entries while foggy')
-  }
-  indent += '\t'
-  entry.on('data', missile(entry))
-  entry.on('end', runaway(entry))
-  entry.on('entry', appears)
-}
-
-var foggy
-function missile (entry) {
-  function liftFog (who) {
-    if (!foggy) return
-    if (who) {
-      console.error('%s breaks the spell!', who && who.path)
-    } else {
-      console.error('the spell expires!')
-    }
-    console.error('\u001b[mthe fog lifts!\n')
-    clearTimeout(foggy)
-    foggy = null
-    if (entry._paused) entry.resume()
-  }
-
-  if (entry.type === 'Directory') {
-    var ended = false
-    entry.once('end', function () { ended = true })
-    return function (c) {
-      // throw in some pathological pause()/resume() behavior
-      // just for extra fun.
-      process.nextTick(function () {
-        if (!foggy && !ended) { // && Math.random() < 0.3) {
-          console.error(indent + '%s casts a spell', entry.basename)
-          console.error('\na slowing fog comes over the battlefield...\n\u001b[32m')
-          entry.pause()
-          entry.once('resume', liftFog)
-          foggy = setTimeout(liftFog, 10)
-        }
-      })
-    }
-  }
-
-  return function (c) {
-    var e = Math.random() < 0.5
-    console.error(indent + '%s %s for %d damage!',
-      entry.basename,
-      e ? 'is struck' : 'fires a chunk',
-      c.length)
-  }
-}
-
-function runaway (entry) {
-  return function () {
-    var e = Math.random() < 0.5
-    console.error(indent + '%s %s',
-      entry.basename,
-      e ? 'turns to flee' : 'is vanquished!')
-    indent = indent.slice(0, -1)
-  }
-}
-
-w.on('entry', attacks)
-// w.on('ready', function () { attacks(w) })
-function attacks (entry) {
-  console.error(indent + '%s %s!', entry.basename,
-    entry.type === 'Directory' ? 'calls for backup' : 'attacks')
-  entry.on('entry', attacks)
-}
-
-var ended = false
-r.on('end', function () {
-  if (foggy) clearTimeout(foggy)
-  console.error("\u001b[mIT'S OVER!!")
-  console.error('A WINNAR IS YOU!')
-
-  console.log('ok 1 A WINNAR IS YOU')
-  ended = true
-})
-
-process.on('exit', function () {
-  console.log((ended ? '' : 'not ') + 'ok 2 ended')
-  console.log('1..2')
-})
-
-r.pipe(w)
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/reader.js
deleted file mode 100644
index 19affbe7e6e23db44ec155dee14564174d927376..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/reader.js
+++ /dev/null
@@ -1,68 +0,0 @@
-var fstream = require('../fstream.js')
-var tap = require('tap')
-var fs = require('fs')
-var path = require('path')
-var dir = path.dirname(__dirname)
-
-tap.test('reader test', function (t) {
-  var children = -1
-  var gotReady = false
-  var ended = false
-
-  var r = fstream.Reader({
-    path: dir,
-    filter: function () {
-      // return this.parent === r
-      return this.parent === r || this === r
-    }
-  })
-
-  r.on('ready', function () {
-    gotReady = true
-    children = fs.readdirSync(dir).length
-    console.error('Setting expected children to ' + children)
-    t.equal(r.type, 'Directory', 'should be a directory')
-  })
-
-  r.on('entry', function (entry) {
-    children--
-    if (!gotReady) {
-      t.fail('children before ready!')
-    }
-    t.equal(entry.dirname, r.path, 'basename is parent dir')
-  })
-
-  r.on('error', function (er) {
-    t.fail(er)
-    t.end()
-    process.exit(1)
-  })
-
-  r.on('end', function () {
-    t.equal(children, 0, 'should have seen all children')
-    ended = true
-  })
-
-  var closed = false
-  r.on('close', function () {
-    t.ok(ended, 'saw end before close')
-    t.notOk(closed, 'close should only happen once')
-    closed = true
-    t.end()
-  })
-})
-
-tap.test('reader error test', function (t) {
-  // assumes non-root on a *nix system
-  var r = fstream.Reader({ path: '/etc/shadow' })
-
-  r.once('error', function (er) {
-    t.ok(true)
-    t.end()
-  })
-
-  r.on('end', function () {
-    t.fail('reader ended without error')
-    t.end()
-  })
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/symlink-write.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/symlink-write.js
deleted file mode 100644
index 19e81eea9fe80784152883ba1f1c7fd38d7877ea..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/examples/symlink-write.js
+++ /dev/null
@@ -1,27 +0,0 @@
-var fstream = require('../fstream.js')
-var notOpen = false
-process.chdir(__dirname)
-
-fstream
-  .Writer({
-    path: 'path/to/symlink',
-    linkpath: './file',
-    isSymbolicLink: true,
-    mode: '0755' // octal strings supported
-  })
-  .on('close', function () {
-    notOpen = true
-    var fs = require('fs')
-    var s = fs.lstatSync('path/to/symlink')
-    var isSym = s.isSymbolicLink()
-    console.log((isSym ? '' : 'not ') + 'ok 1 should be symlink')
-    var t = fs.readlinkSync('path/to/symlink')
-    var isTarget = t === './file'
-    console.log((isTarget ? '' : 'not ') + 'ok 2 should link to ./file')
-  })
-  .end()
-
-process.on('exit', function () {
-  console.log((notOpen ? '' : 'not ') + 'ok 3 should be closed')
-  console.log('1..3')
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/fstream.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/fstream.js
deleted file mode 100644
index c0eb3bea788036a43c7cffd7ac92dd648d8a0372..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/fstream.js
+++ /dev/null
@@ -1,35 +0,0 @@
-exports.Abstract = require('./lib/abstract.js')
-exports.Reader = require('./lib/reader.js')
-exports.Writer = require('./lib/writer.js')
-
-exports.File = {
-  Reader: require('./lib/file-reader.js'),
-  Writer: require('./lib/file-writer.js')
-}
-
-exports.Dir = {
-  Reader: require('./lib/dir-reader.js'),
-  Writer: require('./lib/dir-writer.js')
-}
-
-exports.Link = {
-  Reader: require('./lib/link-reader.js'),
-  Writer: require('./lib/link-writer.js')
-}
-
-exports.Proxy = {
-  Reader: require('./lib/proxy-reader.js'),
-  Writer: require('./lib/proxy-writer.js')
-}
-
-exports.Reader.Dir = exports.DirReader = exports.Dir.Reader
-exports.Reader.File = exports.FileReader = exports.File.Reader
-exports.Reader.Link = exports.LinkReader = exports.Link.Reader
-exports.Reader.Proxy = exports.ProxyReader = exports.Proxy.Reader
-
-exports.Writer.Dir = exports.DirWriter = exports.Dir.Writer
-exports.Writer.File = exports.FileWriter = exports.File.Writer
-exports.Writer.Link = exports.LinkWriter = exports.Link.Writer
-exports.Writer.Proxy = exports.ProxyWriter = exports.Proxy.Writer
-
-exports.collect = require('./lib/collect.js')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/abstract.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/abstract.js
deleted file mode 100644
index 97c120e1d5277d878dab04bc5f18eb88de9f787f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/abstract.js
+++ /dev/null
@@ -1,85 +0,0 @@
-// the parent class for all fstreams.
-
-module.exports = Abstract
-
-var Stream = require('stream').Stream
-var inherits = require('inherits')
-
-function Abstract () {
-  Stream.call(this)
-}
-
-inherits(Abstract, Stream)
-
-Abstract.prototype.on = function (ev, fn) {
-  if (ev === 'ready' && this.ready) {
-    process.nextTick(fn.bind(this))
-  } else {
-    Stream.prototype.on.call(this, ev, fn)
-  }
-  return this
-}
-
-Abstract.prototype.abort = function () {
-  this._aborted = true
-  this.emit('abort')
-}
-
-Abstract.prototype.destroy = function () {}
-
-Abstract.prototype.warn = function (msg, code) {
-  var self = this
-  var er = decorate(msg, code, self)
-  if (!self.listeners('warn')) {
-    console.error('%s %s\n' +
-    'path = %s\n' +
-    'syscall = %s\n' +
-    'fstream_type = %s\n' +
-    'fstream_path = %s\n' +
-    'fstream_unc_path = %s\n' +
-    'fstream_class = %s\n' +
-    'fstream_stack =\n%s\n',
-      code || 'UNKNOWN',
-      er.stack,
-      er.path,
-      er.syscall,
-      er.fstream_type,
-      er.fstream_path,
-      er.fstream_unc_path,
-      er.fstream_class,
-      er.fstream_stack.join('\n'))
-  } else {
-    self.emit('warn', er)
-  }
-}
-
-Abstract.prototype.info = function (msg, code) {
-  this.emit('info', msg, code)
-}
-
-Abstract.prototype.error = function (msg, code, th) {
-  var er = decorate(msg, code, this)
-  if (th) throw er
-  else this.emit('error', er)
-}
-
-function decorate (er, code, self) {
-  if (!(er instanceof Error)) er = new Error(er)
-  er.code = er.code || code
-  er.path = er.path || self.path
-  er.fstream_type = er.fstream_type || self.type
-  er.fstream_path = er.fstream_path || self.path
-  if (self._path !== self.path) {
-    er.fstream_unc_path = er.fstream_unc_path || self._path
-  }
-  if (self.linkpath) {
-    er.fstream_linkpath = er.fstream_linkpath || self.linkpath
-  }
-  er.fstream_class = er.fstream_class || self.constructor.name
-  er.fstream_stack = er.fstream_stack ||
-    new Error().stack.split(/\n/).slice(3).map(function (s) {
-      return s.replace(/^ {4}at /, '')
-    })
-
-  return er
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/collect.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/collect.js
deleted file mode 100644
index e5d4f35833476eb85ca4b1d2f2ee81bfbb751f1f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/collect.js
+++ /dev/null
@@ -1,70 +0,0 @@
-module.exports = collect
-
-function collect (stream) {
-  if (stream._collected) return
-
-  if (stream._paused) return stream.on('resume', collect.bind(null, stream))
-
-  stream._collected = true
-  stream.pause()
-
-  stream.on('data', save)
-  stream.on('end', save)
-  var buf = []
-  function save (b) {
-    if (typeof b === 'string') b = new Buffer(b)
-    if (Buffer.isBuffer(b) && !b.length) return
-    buf.push(b)
-  }
-
-  stream.on('entry', saveEntry)
-  var entryBuffer = []
-  function saveEntry (e) {
-    collect(e)
-    entryBuffer.push(e)
-  }
-
-  stream.on('proxy', proxyPause)
-  function proxyPause (p) {
-    p.pause()
-  }
-
-  // replace the pipe method with a new version that will
-  // unlock the buffered stuff.  if you just call .pipe()
-  // without a destination, then it'll re-play the events.
-  stream.pipe = (function (orig) {
-    return function (dest) {
-      // console.error(' === open the pipes', dest && dest.path)
-
-      // let the entries flow through one at a time.
-      // Once they're all done, then we can resume completely.
-      var e = 0
-      ;(function unblockEntry () {
-        var entry = entryBuffer[e++]
-        // console.error(" ==== unblock entry", entry && entry.path)
-        if (!entry) return resume()
-        entry.on('end', unblockEntry)
-        if (dest) dest.add(entry)
-        else stream.emit('entry', entry)
-      })()
-
-      function resume () {
-        stream.removeListener('entry', saveEntry)
-        stream.removeListener('data', save)
-        stream.removeListener('end', save)
-
-        stream.pipe = orig
-        if (dest) stream.pipe(dest)
-
-        buf.forEach(function (b) {
-          if (b) stream.emit('data', b)
-          else stream.emit('end')
-        })
-
-        stream.resume()
-      }
-
-      return dest
-    }
-  })(stream.pipe)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-reader.js
deleted file mode 100644
index 820cdc85a8e9c4ae4b6aa64250df9dbf829c0f54..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-reader.js
+++ /dev/null
@@ -1,252 +0,0 @@
-// A thing that emits "entry" events with Reader objects
-// Pausing it causes it to stop emitting entry events, and also
-// pauses the current entry if there is one.
-
-module.exports = DirReader
-
-var fs = require('graceful-fs')
-var inherits = require('inherits')
-var path = require('path')
-var Reader = require('./reader.js')
-var assert = require('assert').ok
-
-inherits(DirReader, Reader)
-
-function DirReader (props) {
-  var self = this
-  if (!(self instanceof DirReader)) {
-    throw new Error('DirReader must be called as constructor.')
-  }
-
-  // should already be established as a Directory type
-  if (props.type !== 'Directory' || !props.Directory) {
-    throw new Error('Non-directory type ' + props.type)
-  }
-
-  self.entries = null
-  self._index = -1
-  self._paused = false
-  self._length = -1
-
-  if (props.sort) {
-    this.sort = props.sort
-  }
-
-  Reader.call(this, props)
-}
-
-DirReader.prototype._getEntries = function () {
-  var self = this
-
-  // race condition.  might pause() before calling _getEntries,
-  // and then resume, and try to get them a second time.
-  if (self._gotEntries) return
-  self._gotEntries = true
-
-  fs.readdir(self._path, function (er, entries) {
-    if (er) return self.error(er)
-
-    self.entries = entries
-
-    self.emit('entries', entries)
-    if (self._paused) self.once('resume', processEntries)
-    else processEntries()
-
-    function processEntries () {
-      self._length = self.entries.length
-      if (typeof self.sort === 'function') {
-        self.entries = self.entries.sort(self.sort.bind(self))
-      }
-      self._read()
-    }
-  })
-}
-
-// start walking the dir, and emit an "entry" event for each one.
-DirReader.prototype._read = function () {
-  var self = this
-
-  if (!self.entries) return self._getEntries()
-
-  if (self._paused || self._currentEntry || self._aborted) {
-    // console.error('DR paused=%j, current=%j, aborted=%j', self._paused, !!self._currentEntry, self._aborted)
-    return
-  }
-
-  self._index++
-  if (self._index >= self.entries.length) {
-    if (!self._ended) {
-      self._ended = true
-      self.emit('end')
-      self.emit('close')
-    }
-    return
-  }
-
-  // ok, handle this one, then.
-
-  // save creating a proxy, by stat'ing the thing now.
-  var p = path.resolve(self._path, self.entries[self._index])
-  assert(p !== self._path)
-  assert(self.entries[self._index])
-
-  // set this to prevent trying to _read() again in the stat time.
-  self._currentEntry = p
-  fs[ self.props.follow ? 'stat' : 'lstat' ](p, function (er, stat) {
-    if (er) return self.error(er)
-
-    var who = self._proxy || self
-
-    stat.path = p
-    stat.basename = path.basename(p)
-    stat.dirname = path.dirname(p)
-    var childProps = self.getChildProps.call(who, stat)
-    childProps.path = p
-    childProps.basename = path.basename(p)
-    childProps.dirname = path.dirname(p)
-
-    var entry = Reader(childProps, stat)
-
-    // console.error("DR Entry", p, stat.size)
-
-    self._currentEntry = entry
-
-    // "entry" events are for direct entries in a specific dir.
-    // "child" events are for any and all children at all levels.
-    // This nomenclature is not completely final.
-
-    entry.on('pause', function (who) {
-      if (!self._paused && !entry._disowned) {
-        self.pause(who)
-      }
-    })
-
-    entry.on('resume', function (who) {
-      if (self._paused && !entry._disowned) {
-        self.resume(who)
-      }
-    })
-
-    entry.on('stat', function (props) {
-      self.emit('_entryStat', entry, props)
-      if (entry._aborted) return
-      if (entry._paused) {
-        entry.once('resume', function () {
-          self.emit('entryStat', entry, props)
-        })
-      } else self.emit('entryStat', entry, props)
-    })
-
-    entry.on('ready', function EMITCHILD () {
-      // console.error("DR emit child", entry._path)
-      if (self._paused) {
-        // console.error("  DR emit child - try again later")
-        // pause the child, and emit the "entry" event once we drain.
-        // console.error("DR pausing child entry")
-        entry.pause(self)
-        return self.once('resume', EMITCHILD)
-      }
-
-      // skip over sockets.  they can't be piped around properly,
-      // so there's really no sense even acknowledging them.
-      // if someone really wants to see them, they can listen to
-      // the "socket" events.
-      if (entry.type === 'Socket') {
-        self.emit('socket', entry)
-      } else {
-        self.emitEntry(entry)
-      }
-    })
-
-    var ended = false
-    entry.on('close', onend)
-    entry.on('disown', onend)
-    function onend () {
-      if (ended) return
-      ended = true
-      self.emit('childEnd', entry)
-      self.emit('entryEnd', entry)
-      self._currentEntry = null
-      if (!self._paused) {
-        self._read()
-      }
-    }
-
-    // XXX Remove this.  Works in node as of 0.6.2 or so.
-    // Long filenames should not break stuff.
-    entry.on('error', function (er) {
-      if (entry._swallowErrors) {
-        self.warn(er)
-        entry.emit('end')
-        entry.emit('close')
-      } else {
-        self.emit('error', er)
-      }
-    })
-
-    // proxy up some events.
-    ;[
-      'child',
-      'childEnd',
-      'warn'
-    ].forEach(function (ev) {
-      entry.on(ev, self.emit.bind(self, ev))
-    })
-  })
-}
-
-DirReader.prototype.disown = function (entry) {
-  entry.emit('beforeDisown')
-  entry._disowned = true
-  entry.parent = entry.root = null
-  if (entry === this._currentEntry) {
-    this._currentEntry = null
-  }
-  entry.emit('disown')
-}
-
-DirReader.prototype.getChildProps = function () {
-  return {
-    depth: this.depth + 1,
-    root: this.root || this,
-    parent: this,
-    follow: this.follow,
-    filter: this.filter,
-    sort: this.props.sort,
-    hardlinks: this.props.hardlinks
-  }
-}
-
-DirReader.prototype.pause = function (who) {
-  var self = this
-  if (self._paused) return
-  who = who || self
-  self._paused = true
-  if (self._currentEntry && self._currentEntry.pause) {
-    self._currentEntry.pause(who)
-  }
-  self.emit('pause', who)
-}
-
-DirReader.prototype.resume = function (who) {
-  var self = this
-  if (!self._paused) return
-  who = who || self
-
-  self._paused = false
-  // console.error('DR Emit Resume', self._path)
-  self.emit('resume', who)
-  if (self._paused) {
-    // console.error('DR Re-paused', self._path)
-    return
-  }
-
-  if (self._currentEntry) {
-    if (self._currentEntry.resume) self._currentEntry.resume(who)
-  } else self._read()
-}
-
-DirReader.prototype.emitEntry = function (entry) {
-  this.emit('entry', entry)
-  this.emit('child', entry)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-writer.js
deleted file mode 100644
index ec50dca900dcf41e3a77aca22ac2948951e5dda4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/dir-writer.js
+++ /dev/null
@@ -1,174 +0,0 @@
-// It is expected that, when .add() returns false, the consumer
-// of the DirWriter will pause until a "drain" event occurs. Note
-// that this is *almost always going to be the case*, unless the
-// thing being written is some sort of unsupported type, and thus
-// skipped over.
-
-module.exports = DirWriter
-
-var Writer = require('./writer.js')
-var inherits = require('inherits')
-var mkdir = require('mkdirp')
-var path = require('path')
-var collect = require('./collect.js')
-
-inherits(DirWriter, Writer)
-
-function DirWriter (props) {
-  var self = this
-  if (!(self instanceof DirWriter)) {
-    self.error('DirWriter must be called as constructor.', null, true)
-  }
-
-  // should already be established as a Directory type
-  if (props.type !== 'Directory' || !props.Directory) {
-    self.error('Non-directory type ' + props.type + ' ' +
-      JSON.stringify(props), null, true)
-  }
-
-  Writer.call(this, props)
-}
-
-DirWriter.prototype._create = function () {
-  var self = this
-  mkdir(self._path, Writer.dirmode, function (er) {
-    if (er) return self.error(er)
-    // ready to start getting entries!
-    self.ready = true
-    self.emit('ready')
-    self._process()
-  })
-}
-
-// a DirWriter has an add(entry) method, but its .write() doesn't
-// do anything.  Why a no-op rather than a throw?  Because this
-// leaves open the door for writing directory metadata for
-// gnu/solaris style dumpdirs.
-DirWriter.prototype.write = function () {
-  return true
-}
-
-DirWriter.prototype.end = function () {
-  this._ended = true
-  this._process()
-}
-
-DirWriter.prototype.add = function (entry) {
-  var self = this
-
-  // console.error('\tadd', entry._path, '->', self._path)
-  collect(entry)
-  if (!self.ready || self._currentEntry) {
-    self._buffer.push(entry)
-    return false
-  }
-
-  // create a new writer, and pipe the incoming entry into it.
-  if (self._ended) {
-    return self.error('add after end')
-  }
-
-  self._buffer.push(entry)
-  self._process()
-
-  return this._buffer.length === 0
-}
-
-DirWriter.prototype._process = function () {
-  var self = this
-
-  // console.error('DW Process p=%j', self._processing, self.basename)
-
-  if (self._processing) return
-
-  var entry = self._buffer.shift()
-  if (!entry) {
-    // console.error("DW Drain")
-    self.emit('drain')
-    if (self._ended) self._finish()
-    return
-  }
-
-  self._processing = true
-  // console.error("DW Entry", entry._path)
-
-  self.emit('entry', entry)
-
-  // ok, add this entry
-  //
-  // don't allow recursive copying
-  var p = entry
-  var pp
-  do {
-    pp = p._path || p.path
-    if (pp === self.root._path || pp === self._path ||
-      (pp && pp.indexOf(self._path) === 0)) {
-      // console.error('DW Exit (recursive)', entry.basename, self._path)
-      self._processing = false
-      if (entry._collected) entry.pipe()
-      return self._process()
-    }
-    p = p.parent
-  } while (p)
-
-  // console.error("DW not recursive")
-
-  // chop off the entry's root dir, replace with ours
-  var props = {
-    parent: self,
-    root: self.root || self,
-    type: entry.type,
-    depth: self.depth + 1
-  }
-
-  pp = entry._path || entry.path || entry.props.path
-  if (entry.parent) {
-    pp = pp.substr(entry.parent._path.length + 1)
-  }
-  // get rid of any ../../ shenanigans
-  props.path = path.join(self.path, path.join('/', pp))
-
-  // if i have a filter, the child should inherit it.
-  props.filter = self.filter
-
-  // all the rest of the stuff, copy over from the source.
-  Object.keys(entry.props).forEach(function (k) {
-    if (!props.hasOwnProperty(k)) {
-      props[k] = entry.props[k]
-    }
-  })
-
-  // not sure at this point what kind of writer this is.
-  var child = self._currentChild = new Writer(props)
-  child.on('ready', function () {
-    // console.error("DW Child Ready", child.type, child._path)
-    // console.error("  resuming", entry._path)
-    entry.pipe(child)
-    entry.resume()
-  })
-
-  // XXX Make this work in node.
-  // Long filenames should not break stuff.
-  child.on('error', function (er) {
-    if (child._swallowErrors) {
-      self.warn(er)
-      child.emit('end')
-      child.emit('close')
-    } else {
-      self.emit('error', er)
-    }
-  })
-
-  // we fire _end internally *after* end, so that we don't move on
-  // until any "end" listeners have had their chance to do stuff.
-  child.on('close', onend)
-  var ended = false
-  function onend () {
-    if (ended) return
-    ended = true
-    // console.error("* DW Child end", child.basename)
-    self._currentChild = null
-    self._processing = false
-    self._process()
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-reader.js
deleted file mode 100644
index baa01f4b3db7ef5cb2dea6269210852310b3fb9d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-reader.js
+++ /dev/null
@@ -1,150 +0,0 @@
-// Basically just a wrapper around an fs.ReadStream
-
-module.exports = FileReader
-
-var fs = require('graceful-fs')
-var inherits = require('inherits')
-var Reader = require('./reader.js')
-var EOF = {EOF: true}
-var CLOSE = {CLOSE: true}
-
-inherits(FileReader, Reader)
-
-function FileReader (props) {
-  // console.error("    FR create", props.path, props.size, new Error().stack)
-  var self = this
-  if (!(self instanceof FileReader)) {
-    throw new Error('FileReader must be called as constructor.')
-  }
-
-  // should already be established as a File type
-  // XXX Todo: preserve hardlinks by tracking dev+inode+nlink,
-  // with a HardLinkReader class.
-  if (!((props.type === 'Link' && props.Link) ||
-    (props.type === 'File' && props.File))) {
-    throw new Error('Non-file type ' + props.type)
-  }
-
-  self._buffer = []
-  self._bytesEmitted = 0
-  Reader.call(self, props)
-}
-
-FileReader.prototype._getStream = function () {
-  var self = this
-  var stream = self._stream = fs.createReadStream(self._path, self.props)
-
-  if (self.props.blksize) {
-    stream.bufferSize = self.props.blksize
-  }
-
-  stream.on('open', self.emit.bind(self, 'open'))
-
-  stream.on('data', function (c) {
-    // console.error('\t\t%d %s', c.length, self.basename)
-    self._bytesEmitted += c.length
-    // no point saving empty chunks
-    if (!c.length) {
-      return
-    } else if (self._paused || self._buffer.length) {
-      self._buffer.push(c)
-      self._read()
-    } else self.emit('data', c)
-  })
-
-  stream.on('end', function () {
-    if (self._paused || self._buffer.length) {
-      // console.error('FR Buffering End', self._path)
-      self._buffer.push(EOF)
-      self._read()
-    } else {
-      self.emit('end')
-    }
-
-    if (self._bytesEmitted !== self.props.size) {
-      self.error("Didn't get expected byte count\n" +
-        'expect: ' + self.props.size + '\n' +
-        'actual: ' + self._bytesEmitted)
-    }
-  })
-
-  stream.on('close', function () {
-    if (self._paused || self._buffer.length) {
-      // console.error('FR Buffering Close', self._path)
-      self._buffer.push(CLOSE)
-      self._read()
-    } else {
-      // console.error('FR close 1', self._path)
-      self.emit('close')
-    }
-  })
-
-  stream.on('error', function (e) {
-    self.emit('error', e)
-  })
-
-  self._read()
-}
-
-FileReader.prototype._read = function () {
-  var self = this
-  // console.error('FR _read', self._path)
-  if (self._paused) {
-    // console.error('FR _read paused', self._path)
-    return
-  }
-
-  if (!self._stream) {
-    // console.error('FR _getStream calling', self._path)
-    return self._getStream()
-  }
-
-  // clear out the buffer, if there is one.
-  if (self._buffer.length) {
-    // console.error('FR _read has buffer', self._buffer.length, self._path)
-    var buf = self._buffer
-    for (var i = 0, l = buf.length; i < l; i++) {
-      var c = buf[i]
-      if (c === EOF) {
-        // console.error('FR Read emitting buffered end', self._path)
-        self.emit('end')
-      } else if (c === CLOSE) {
-        // console.error('FR Read emitting buffered close', self._path)
-        self.emit('close')
-      } else {
-        // console.error('FR Read emitting buffered data', self._path)
-        self.emit('data', c)
-      }
-
-      if (self._paused) {
-        // console.error('FR Read Re-pausing at '+i, self._path)
-        self._buffer = buf.slice(i)
-        return
-      }
-    }
-    self._buffer.length = 0
-  }
-// console.error("FR _read done")
-// that's about all there is to it.
-}
-
-FileReader.prototype.pause = function (who) {
-  var self = this
-  // console.error('FR Pause', self._path)
-  if (self._paused) return
-  who = who || self
-  self._paused = true
-  if (self._stream) self._stream.pause()
-  self.emit('pause', who)
-}
-
-FileReader.prototype.resume = function (who) {
-  var self = this
-  // console.error('FR Resume', self._path)
-  if (!self._paused) return
-  who = who || self
-  self.emit('resume', who)
-  self._paused = false
-  if (self._stream) self._stream.resume()
-  self._read()
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-writer.js
deleted file mode 100644
index 4c803d8d68d2f5169495e1d0f6e6823204d1f67e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/file-writer.js
+++ /dev/null
@@ -1,107 +0,0 @@
-module.exports = FileWriter
-
-var fs = require('graceful-fs')
-var Writer = require('./writer.js')
-var inherits = require('inherits')
-var EOF = {}
-
-inherits(FileWriter, Writer)
-
-function FileWriter (props) {
-  var self = this
-  if (!(self instanceof FileWriter)) {
-    throw new Error('FileWriter must be called as constructor.')
-  }
-
-  // should already be established as a File type
-  if (props.type !== 'File' || !props.File) {
-    throw new Error('Non-file type ' + props.type)
-  }
-
-  self._buffer = []
-  self._bytesWritten = 0
-
-  Writer.call(this, props)
-}
-
-FileWriter.prototype._create = function () {
-  var self = this
-  if (self._stream) return
-
-  var so = {}
-  if (self.props.flags) so.flags = self.props.flags
-  so.mode = Writer.filemode
-  if (self._old && self._old.blksize) so.bufferSize = self._old.blksize
-
-  self._stream = fs.createWriteStream(self._path, so)
-
-  self._stream.on('open', function () {
-    // console.error("FW open", self._buffer, self._path)
-    self.ready = true
-    self._buffer.forEach(function (c) {
-      if (c === EOF) self._stream.end()
-      else self._stream.write(c)
-    })
-    self.emit('ready')
-    // give this a kick just in case it needs it.
-    self.emit('drain')
-  })
-
-  self._stream.on('error', function (er) { self.emit('error', er) })
-
-  self._stream.on('drain', function () { self.emit('drain') })
-
-  self._stream.on('close', function () {
-    // console.error('\n\nFW Stream Close', self._path, self.size)
-    self._finish()
-  })
-}
-
-FileWriter.prototype.write = function (c) {
-  var self = this
-
-  self._bytesWritten += c.length
-
-  if (!self.ready) {
-    if (!Buffer.isBuffer(c) && typeof c !== 'string') {
-      throw new Error('invalid write data')
-    }
-    self._buffer.push(c)
-    return false
-  }
-
-  var ret = self._stream.write(c)
-  // console.error('\t-- fw wrote, _stream says', ret, self._stream._queue.length)
-
-  // allow 2 buffered writes, because otherwise there's just too
-  // much stop and go bs.
-  if (ret === false && self._stream._queue) {
-    return self._stream._queue.length <= 2
-  } else {
-    return ret
-  }
-}
-
-FileWriter.prototype.end = function (c) {
-  var self = this
-
-  if (c) self.write(c)
-
-  if (!self.ready) {
-    self._buffer.push(EOF)
-    return false
-  }
-
-  return self._stream.end()
-}
-
-FileWriter.prototype._finish = function () {
-  var self = this
-  if (typeof self.size === 'number' && self._bytesWritten !== self.size) {
-    self.error(
-      'Did not get expected byte count.\n' +
-      'expect: ' + self.size + '\n' +
-      'actual: ' + self._bytesWritten)
-  }
-  Writer.prototype._finish.call(self)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/get-type.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/get-type.js
deleted file mode 100644
index 19f6a657db84759363c3c20c3d10a8eebb533701..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/get-type.js
+++ /dev/null
@@ -1,33 +0,0 @@
-module.exports = getType
-
-function getType (st) {
-  var types = [
-    'Directory',
-    'File',
-    'SymbolicLink',
-    'Link', // special for hardlinks from tarballs
-    'BlockDevice',
-    'CharacterDevice',
-    'FIFO',
-    'Socket'
-  ]
-  var type
-
-  if (st.type && types.indexOf(st.type) !== -1) {
-    st[st.type] = true
-    return st.type
-  }
-
-  for (var i = 0, l = types.length; i < l; i++) {
-    type = types[i]
-    var is = st[type] || st['is' + type]
-    if (typeof is === 'function') is = is.call(st)
-    if (is) {
-      st[type] = true
-      st.type = type
-      return type
-    }
-  }
-
-  return null
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-reader.js
deleted file mode 100644
index fb4cc67a98dc55ba12f19d809ebd10b42a3a0cd0..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-reader.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// Basically just a wrapper around an fs.readlink
-//
-// XXX: Enhance this to support the Link type, by keeping
-// a lookup table of {<dev+inode>:<path>}, so that hardlinks
-// can be preserved in tarballs.
-
-module.exports = LinkReader
-
-var fs = require('graceful-fs')
-var inherits = require('inherits')
-var Reader = require('./reader.js')
-
-inherits(LinkReader, Reader)
-
-function LinkReader (props) {
-  var self = this
-  if (!(self instanceof LinkReader)) {
-    throw new Error('LinkReader must be called as constructor.')
-  }
-
-  if (!((props.type === 'Link' && props.Link) ||
-    (props.type === 'SymbolicLink' && props.SymbolicLink))) {
-    throw new Error('Non-link type ' + props.type)
-  }
-
-  Reader.call(self, props)
-}
-
-// When piping a LinkReader into a LinkWriter, we have to
-// already have the linkpath property set, so that has to
-// happen *before* the "ready" event, which means we need to
-// override the _stat method.
-LinkReader.prototype._stat = function (currentStat) {
-  var self = this
-  fs.readlink(self._path, function (er, linkpath) {
-    if (er) return self.error(er)
-    self.linkpath = self.props.linkpath = linkpath
-    self.emit('linkpath', linkpath)
-    Reader.prototype._stat.call(self, currentStat)
-  })
-}
-
-LinkReader.prototype._read = function () {
-  var self = this
-  if (self._paused) return
-  // basically just a no-op, since we got all the info we need
-  // from the _stat method
-  if (!self._ended) {
-    self.emit('end')
-    self.emit('close')
-    self._ended = true
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-writer.js
deleted file mode 100644
index af54284008faa1f2b9f9ead97d1fc9ecc363da40..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/link-writer.js
+++ /dev/null
@@ -1,95 +0,0 @@
-module.exports = LinkWriter
-
-var fs = require('graceful-fs')
-var Writer = require('./writer.js')
-var inherits = require('inherits')
-var path = require('path')
-var rimraf = require('rimraf')
-
-inherits(LinkWriter, Writer)
-
-function LinkWriter (props) {
-  var self = this
-  if (!(self instanceof LinkWriter)) {
-    throw new Error('LinkWriter must be called as constructor.')
-  }
-
-  // should already be established as a Link type
-  if (!((props.type === 'Link' && props.Link) ||
-    (props.type === 'SymbolicLink' && props.SymbolicLink))) {
-    throw new Error('Non-link type ' + props.type)
-  }
-
-  if (props.linkpath === '') props.linkpath = '.'
-  if (!props.linkpath) {
-    self.error('Need linkpath property to create ' + props.type)
-  }
-
-  Writer.call(this, props)
-}
-
-LinkWriter.prototype._create = function () {
-  // console.error(" LW _create")
-  var self = this
-  var hard = self.type === 'Link' || process.platform === 'win32'
-  var link = hard ? 'link' : 'symlink'
-  var lp = hard ? path.resolve(self.dirname, self.linkpath) : self.linkpath
-
-  // can only change the link path by clobbering
-  // For hard links, let's just assume that's always the case, since
-  // there's no good way to read them if we don't already know.
-  if (hard) return clobber(self, lp, link)
-
-  fs.readlink(self._path, function (er, p) {
-    // only skip creation if it's exactly the same link
-    if (p && p === lp) return finish(self)
-    clobber(self, lp, link)
-  })
-}
-
-function clobber (self, lp, link) {
-  rimraf(self._path, function (er) {
-    if (er) return self.error(er)
-    create(self, lp, link)
-  })
-}
-
-function create (self, lp, link) {
-  fs[link](lp, self._path, function (er) {
-    // if this is a hard link, and we're in the process of writing out a
-    // directory, it's very possible that the thing we're linking to
-    // doesn't exist yet (especially if it was intended as a symlink),
-    // so swallow ENOENT errors here and just soldier in.
-    // Additionally, an EPERM or EACCES can happen on win32 if it's trying
-    // to make a link to a directory.  Again, just skip it.
-    // A better solution would be to have fs.symlink be supported on
-    // windows in some nice fashion.
-    if (er) {
-      if ((er.code === 'ENOENT' ||
-        er.code === 'EACCES' ||
-        er.code === 'EPERM') && process.platform === 'win32') {
-        self.ready = true
-        self.emit('ready')
-        self.emit('end')
-        self.emit('close')
-        self.end = self._finish = function () {}
-      } else return self.error(er)
-    }
-    finish(self)
-  })
-}
-
-function finish (self) {
-  self.ready = true
-  self.emit('ready')
-  if (self._ended && !self._finished) self._finish()
-}
-
-LinkWriter.prototype.end = function () {
-  // console.error("LW finish in end")
-  this._ended = true
-  if (this.ready) {
-    this._finished = true
-    this._finish()
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-reader.js
deleted file mode 100644
index 4f431c9d9e27d39fb7e3c213a8fd39065863ca34..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-reader.js
+++ /dev/null
@@ -1,95 +0,0 @@
-// A reader for when we don't yet know what kind of thing
-// the thing is.
-
-module.exports = ProxyReader
-
-var Reader = require('./reader.js')
-var getType = require('./get-type.js')
-var inherits = require('inherits')
-var fs = require('graceful-fs')
-
-inherits(ProxyReader, Reader)
-
-function ProxyReader (props) {
-  var self = this
-  if (!(self instanceof ProxyReader)) {
-    throw new Error('ProxyReader must be called as constructor.')
-  }
-
-  self.props = props
-  self._buffer = []
-  self.ready = false
-
-  Reader.call(self, props)
-}
-
-ProxyReader.prototype._stat = function () {
-  var self = this
-  var props = self.props
-  // stat the thing to see what the proxy should be.
-  var stat = props.follow ? 'stat' : 'lstat'
-
-  fs[stat](props.path, function (er, current) {
-    var type
-    if (er || !current) {
-      type = 'File'
-    } else {
-      type = getType(current)
-    }
-
-    props[type] = true
-    props.type = self.type = type
-
-    self._old = current
-    self._addProxy(Reader(props, current))
-  })
-}
-
-ProxyReader.prototype._addProxy = function (proxy) {
-  var self = this
-  if (self._proxyTarget) {
-    return self.error('proxy already set')
-  }
-
-  self._proxyTarget = proxy
-  proxy._proxy = self
-
-  ;[
-    'error',
-    'data',
-    'end',
-    'close',
-    'linkpath',
-    'entry',
-    'entryEnd',
-    'child',
-    'childEnd',
-    'warn',
-    'stat'
-  ].forEach(function (ev) {
-    // console.error('~~ proxy event', ev, self.path)
-    proxy.on(ev, self.emit.bind(self, ev))
-  })
-
-  self.emit('proxy', proxy)
-
-  proxy.on('ready', function () {
-    // console.error("~~ proxy is ready!", self.path)
-    self.ready = true
-    self.emit('ready')
-  })
-
-  var calls = self._buffer
-  self._buffer.length = 0
-  calls.forEach(function (c) {
-    proxy[c[0]].apply(proxy, c[1])
-  })
-}
-
-ProxyReader.prototype.pause = function () {
-  return this._proxyTarget ? this._proxyTarget.pause() : false
-}
-
-ProxyReader.prototype.resume = function () {
-  return this._proxyTarget ? this._proxyTarget.resume() : false
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-writer.js
deleted file mode 100644
index a6544621bfbe7510fcc4b0a5e28bdd8599af4044..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/proxy-writer.js
+++ /dev/null
@@ -1,111 +0,0 @@
-// A writer for when we don't know what kind of thing
-// the thing is.  That is, it's not explicitly set,
-// so we're going to make it whatever the thing already
-// is, or "File"
-//
-// Until then, collect all events.
-
-module.exports = ProxyWriter
-
-var Writer = require('./writer.js')
-var getType = require('./get-type.js')
-var inherits = require('inherits')
-var collect = require('./collect.js')
-var fs = require('fs')
-
-inherits(ProxyWriter, Writer)
-
-function ProxyWriter (props) {
-  var self = this
-  if (!(self instanceof ProxyWriter)) {
-    throw new Error('ProxyWriter must be called as constructor.')
-  }
-
-  self.props = props
-  self._needDrain = false
-
-  Writer.call(self, props)
-}
-
-ProxyWriter.prototype._stat = function () {
-  var self = this
-  var props = self.props
-  // stat the thing to see what the proxy should be.
-  var stat = props.follow ? 'stat' : 'lstat'
-
-  fs[stat](props.path, function (er, current) {
-    var type
-    if (er || !current) {
-      type = 'File'
-    } else {
-      type = getType(current)
-    }
-
-    props[type] = true
-    props.type = self.type = type
-
-    self._old = current
-    self._addProxy(Writer(props, current))
-  })
-}
-
-ProxyWriter.prototype._addProxy = function (proxy) {
-  // console.error("~~ set proxy", this.path)
-  var self = this
-  if (self._proxy) {
-    return self.error('proxy already set')
-  }
-
-  self._proxy = proxy
-  ;[
-    'ready',
-    'error',
-    'close',
-    'pipe',
-    'drain',
-    'warn'
-  ].forEach(function (ev) {
-    proxy.on(ev, self.emit.bind(self, ev))
-  })
-
-  self.emit('proxy', proxy)
-
-  var calls = self._buffer
-  calls.forEach(function (c) {
-    // console.error("~~ ~~ proxy buffered call", c[0], c[1])
-    proxy[c[0]].apply(proxy, c[1])
-  })
-  self._buffer.length = 0
-  if (self._needsDrain) self.emit('drain')
-}
-
-ProxyWriter.prototype.add = function (entry) {
-  // console.error("~~ proxy add")
-  collect(entry)
-
-  if (!this._proxy) {
-    this._buffer.push(['add', [entry]])
-    this._needDrain = true
-    return false
-  }
-  return this._proxy.add(entry)
-}
-
-ProxyWriter.prototype.write = function (c) {
-  // console.error('~~ proxy write')
-  if (!this._proxy) {
-    this._buffer.push(['write', [c]])
-    this._needDrain = true
-    return false
-  }
-  return this._proxy.write(c)
-}
-
-ProxyWriter.prototype.end = function (c) {
-  // console.error('~~ proxy end')
-  if (!this._proxy) {
-    this._buffer.push(['end', [c]])
-    return false
-  }
-  return this._proxy.end(c)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/reader.js
deleted file mode 100644
index 876021f92bc9a208714b872f72e2c62c4c5e6f9e..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/reader.js
+++ /dev/null
@@ -1,255 +0,0 @@
-module.exports = Reader
-
-var fs = require('graceful-fs')
-var Stream = require('stream').Stream
-var inherits = require('inherits')
-var path = require('path')
-var getType = require('./get-type.js')
-var hardLinks = Reader.hardLinks = {}
-var Abstract = require('./abstract.js')
-
-// Must do this *before* loading the child classes
-inherits(Reader, Abstract)
-
-var LinkReader = require('./link-reader.js')
-
-function Reader (props, currentStat) {
-  var self = this
-  if (!(self instanceof Reader)) return new Reader(props, currentStat)
-
-  if (typeof props === 'string') {
-    props = { path: props }
-  }
-
-  if (!props.path) {
-    self.error('Must provide a path', null, true)
-  }
-
-  // polymorphism.
-  // call fstream.Reader(dir) to get a DirReader object, etc.
-  // Note that, unlike in the Writer case, ProxyReader is going
-  // to be the *normal* state of affairs, since we rarely know
-  // the type of a file prior to reading it.
-
-  var type
-  var ClassType
-
-  if (props.type && typeof props.type === 'function') {
-    type = props.type
-    ClassType = type
-  } else {
-    type = getType(props)
-    ClassType = Reader
-  }
-
-  if (currentStat && !type) {
-    type = getType(currentStat)
-    props[type] = true
-    props.type = type
-  }
-
-  switch (type) {
-    case 'Directory':
-      ClassType = require('./dir-reader.js')
-      break
-
-    case 'Link':
-    // XXX hard links are just files.
-    // However, it would be good to keep track of files' dev+inode
-    // and nlink values, and create a HardLinkReader that emits
-    // a linkpath value of the original copy, so that the tar
-    // writer can preserve them.
-    // ClassType = HardLinkReader
-    // break
-
-    case 'File':
-      ClassType = require('./file-reader.js')
-      break
-
-    case 'SymbolicLink':
-      ClassType = LinkReader
-      break
-
-    case 'Socket':
-      ClassType = require('./socket-reader.js')
-      break
-
-    case null:
-      ClassType = require('./proxy-reader.js')
-      break
-  }
-
-  if (!(self instanceof ClassType)) {
-    return new ClassType(props)
-  }
-
-  Abstract.call(self)
-
-  self.readable = true
-  self.writable = false
-
-  self.type = type
-  self.props = props
-  self.depth = props.depth = props.depth || 0
-  self.parent = props.parent || null
-  self.root = props.root || (props.parent && props.parent.root) || self
-
-  self._path = self.path = path.resolve(props.path)
-  if (process.platform === 'win32') {
-    self.path = self._path = self.path.replace(/\?/g, '_')
-    if (self._path.length >= 260) {
-      // how DOES one create files on the moon?
-      // if the path has spaces in it, then UNC will fail.
-      self._swallowErrors = true
-      // if (self._path.indexOf(" ") === -1) {
-      self._path = '\\\\?\\' + self.path.replace(/\//g, '\\')
-    // }
-    }
-  }
-  self.basename = props.basename = path.basename(self.path)
-  self.dirname = props.dirname = path.dirname(self.path)
-
-  // these have served their purpose, and are now just noisy clutter
-  props.parent = props.root = null
-
-  // console.error("\n\n\n%s setting size to", props.path, props.size)
-  self.size = props.size
-  self.filter = typeof props.filter === 'function' ? props.filter : null
-  if (props.sort === 'alpha') props.sort = alphasort
-
-  // start the ball rolling.
-  // this will stat the thing, and then call self._read()
-  // to start reading whatever it is.
-  // console.error("calling stat", props.path, currentStat)
-  self._stat(currentStat)
-}
-
-function alphasort (a, b) {
-  return a === b ? 0
-    : a.toLowerCase() > b.toLowerCase() ? 1
-      : a.toLowerCase() < b.toLowerCase() ? -1
-        : a > b ? 1
-          : -1
-}
-
-Reader.prototype._stat = function (currentStat) {
-  var self = this
-  var props = self.props
-  var stat = props.follow ? 'stat' : 'lstat'
-  // console.error("Reader._stat", self._path, currentStat)
-  if (currentStat) process.nextTick(statCb.bind(null, null, currentStat))
-  else fs[stat](self._path, statCb)
-
-  function statCb (er, props_) {
-    // console.error("Reader._stat, statCb", self._path, props_, props_.nlink)
-    if (er) return self.error(er)
-
-    Object.keys(props_).forEach(function (k) {
-      props[k] = props_[k]
-    })
-
-    // if it's not the expected size, then abort here.
-    if (undefined !== self.size && props.size !== self.size) {
-      return self.error('incorrect size')
-    }
-    self.size = props.size
-
-    var type = getType(props)
-    var handleHardlinks = props.hardlinks !== false
-
-    // special little thing for handling hardlinks.
-    if (handleHardlinks && type !== 'Directory' && props.nlink && props.nlink > 1) {
-      var k = props.dev + ':' + props.ino
-      // console.error("Reader has nlink", self._path, k)
-      if (hardLinks[k] === self._path || !hardLinks[k]) {
-        hardLinks[k] = self._path
-      } else {
-        // switch into hardlink mode.
-        type = self.type = self.props.type = 'Link'
-        self.Link = self.props.Link = true
-        self.linkpath = self.props.linkpath = hardLinks[k]
-        // console.error("Hardlink detected, switching mode", self._path, self.linkpath)
-        // Setting __proto__ would arguably be the "correct"
-        // approach here, but that just seems too wrong.
-        self._stat = self._read = LinkReader.prototype._read
-      }
-    }
-
-    if (self.type && self.type !== type) {
-      self.error('Unexpected type: ' + type)
-    }
-
-    // if the filter doesn't pass, then just skip over this one.
-    // still have to emit end so that dir-walking can move on.
-    if (self.filter) {
-      var who = self._proxy || self
-      // special handling for ProxyReaders
-      if (!self.filter.call(who, who, props)) {
-        if (!self._disowned) {
-          self.abort()
-          self.emit('end')
-          self.emit('close')
-        }
-        return
-      }
-    }
-
-    // last chance to abort or disown before the flow starts!
-    var events = ['_stat', 'stat', 'ready']
-    var e = 0
-    ;(function go () {
-      if (self._aborted) {
-        self.emit('end')
-        self.emit('close')
-        return
-      }
-
-      if (self._paused && self.type !== 'Directory') {
-        self.once('resume', go)
-        return
-      }
-
-      var ev = events[e++]
-      if (!ev) {
-        return self._read()
-      }
-      self.emit(ev, props)
-      go()
-    })()
-  }
-}
-
-Reader.prototype.pipe = function (dest) {
-  var self = this
-  if (typeof dest.add === 'function') {
-    // piping to a multi-compatible, and we've got directory entries.
-    self.on('entry', function (entry) {
-      var ret = dest.add(entry)
-      if (ret === false) {
-        self.pause()
-      }
-    })
-  }
-
-  // console.error("R Pipe apply Stream Pipe")
-  return Stream.prototype.pipe.apply(this, arguments)
-}
-
-Reader.prototype.pause = function (who) {
-  this._paused = true
-  who = who || this
-  this.emit('pause', who)
-  if (this._stream) this._stream.pause(who)
-}
-
-Reader.prototype.resume = function (who) {
-  this._paused = false
-  who = who || this
-  this.emit('resume', who)
-  if (this._stream) this._stream.resume(who)
-  this._read()
-}
-
-Reader.prototype._read = function () {
-  this.error('Cannot read unknown type: ' + this.type)
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/socket-reader.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/socket-reader.js
deleted file mode 100644
index e0456ba890ede83e9ceeba637d97805a233c43bf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/socket-reader.js
+++ /dev/null
@@ -1,36 +0,0 @@
-// Just get the stats, and then don't do anything.
-// You can't really "read" from a socket.  You "connect" to it.
-// Mostly, this is here so that reading a dir with a socket in it
-// doesn't blow up.
-
-module.exports = SocketReader
-
-var inherits = require('inherits')
-var Reader = require('./reader.js')
-
-inherits(SocketReader, Reader)
-
-function SocketReader (props) {
-  var self = this
-  if (!(self instanceof SocketReader)) {
-    throw new Error('SocketReader must be called as constructor.')
-  }
-
-  if (!(props.type === 'Socket' && props.Socket)) {
-    throw new Error('Non-socket type ' + props.type)
-  }
-
-  Reader.call(self, props)
-}
-
-SocketReader.prototype._read = function () {
-  var self = this
-  if (self._paused) return
-  // basically just a no-op, since we got all the info we have
-  // from the _stat method
-  if (!self._ended) {
-    self.emit('end')
-    self.emit('close')
-    self._ended = true
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/writer.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/writer.js
deleted file mode 100644
index ca3396b5d14fd4e93f8c37881c9474ba22caadce..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/lib/writer.js
+++ /dev/null
@@ -1,390 +0,0 @@
-module.exports = Writer
-
-var fs = require('graceful-fs')
-var inherits = require('inherits')
-var rimraf = require('rimraf')
-var mkdir = require('mkdirp')
-var path = require('path')
-var umask = process.platform === 'win32' ? 0 : process.umask()
-var getType = require('./get-type.js')
-var Abstract = require('./abstract.js')
-
-// Must do this *before* loading the child classes
-inherits(Writer, Abstract)
-
-Writer.dirmode = parseInt('0777', 8) & (~umask)
-Writer.filemode = parseInt('0666', 8) & (~umask)
-
-var DirWriter = require('./dir-writer.js')
-var LinkWriter = require('./link-writer.js')
-var FileWriter = require('./file-writer.js')
-var ProxyWriter = require('./proxy-writer.js')
-
-// props is the desired state.  current is optionally the current stat,
-// provided here so that subclasses can avoid statting the target
-// more than necessary.
-function Writer (props, current) {
-  var self = this
-
-  if (typeof props === 'string') {
-    props = { path: props }
-  }
-
-  if (!props.path) self.error('Must provide a path', null, true)
-
-  // polymorphism.
-  // call fstream.Writer(dir) to get a DirWriter object, etc.
-  var type = getType(props)
-  var ClassType = Writer
-
-  switch (type) {
-    case 'Directory':
-      ClassType = DirWriter
-      break
-    case 'File':
-      ClassType = FileWriter
-      break
-    case 'Link':
-    case 'SymbolicLink':
-      ClassType = LinkWriter
-      break
-    case null:
-    default:
-      // Don't know yet what type to create, so we wrap in a proxy.
-      ClassType = ProxyWriter
-      break
-  }
-
-  if (!(self instanceof ClassType)) return new ClassType(props)
-
-  // now get down to business.
-
-  Abstract.call(self)
-
-  // props is what we want to set.
-  // set some convenience properties as well.
-  self.type = props.type
-  self.props = props
-  self.depth = props.depth || 0
-  self.clobber = props.clobber === false ? props.clobber : true
-  self.parent = props.parent || null
-  self.root = props.root || (props.parent && props.parent.root) || self
-
-  self._path = self.path = path.resolve(props.path)
-  if (process.platform === 'win32') {
-    self.path = self._path = self.path.replace(/\?/g, '_')
-    if (self._path.length >= 260) {
-      self._swallowErrors = true
-      self._path = '\\\\?\\' + self.path.replace(/\//g, '\\')
-    }
-  }
-  self.basename = path.basename(props.path)
-  self.dirname = path.dirname(props.path)
-  self.linkpath = props.linkpath || null
-
-  props.parent = props.root = null
-
-  // console.error("\n\n\n%s setting size to", props.path, props.size)
-  self.size = props.size
-
-  if (typeof props.mode === 'string') {
-    props.mode = parseInt(props.mode, 8)
-  }
-
-  self.readable = false
-  self.writable = true
-
-  // buffer until ready, or while handling another entry
-  self._buffer = []
-  self.ready = false
-
-  self.filter = typeof props.filter === 'function' ? props.filter : null
-
-  // start the ball rolling.
-  // this checks what's there already, and then calls
-  // self._create() to call the impl-specific creation stuff.
-  self._stat(current)
-}
-
-// Calling this means that it's something we can't create.
-// Just assert that it's already there, otherwise raise a warning.
-Writer.prototype._create = function () {
-  var self = this
-  fs[self.props.follow ? 'stat' : 'lstat'](self._path, function (er) {
-    if (er) {
-      return self.warn('Cannot create ' + self._path + '\n' +
-        'Unsupported type: ' + self.type, 'ENOTSUP')
-    }
-    self._finish()
-  })
-}
-
-Writer.prototype._stat = function (current) {
-  var self = this
-  var props = self.props
-  var stat = props.follow ? 'stat' : 'lstat'
-  var who = self._proxy || self
-
-  if (current) statCb(null, current)
-  else fs[stat](self._path, statCb)
-
-  function statCb (er, current) {
-    if (self.filter && !self.filter.call(who, who, current)) {
-      self._aborted = true
-      self.emit('end')
-      self.emit('close')
-      return
-    }
-
-    // if it's not there, great.  We'll just create it.
-    // if it is there, then we'll need to change whatever differs
-    if (er || !current) {
-      return create(self)
-    }
-
-    self._old = current
-    var currentType = getType(current)
-
-    // if it's a type change, then we need to clobber or error.
-    // if it's not a type change, then let the impl take care of it.
-    if (currentType !== self.type) {
-      return rimraf(self._path, function (er) {
-        if (er) return self.error(er)
-        self._old = null
-        create(self)
-      })
-    }
-
-    // otherwise, just handle in the app-specific way
-    // this creates a fs.WriteStream, or mkdir's, or whatever
-    create(self)
-  }
-}
-
-function create (self) {
-  // console.error("W create", self._path, Writer.dirmode)
-
-  // XXX Need to clobber non-dirs that are in the way,
-  // unless { clobber: false } in the props.
-  mkdir(path.dirname(self._path), Writer.dirmode, function (er, made) {
-    // console.error("W created", path.dirname(self._path), er)
-    if (er) return self.error(er)
-
-    // later on, we have to set the mode and owner for these
-    self._madeDir = made
-    return self._create()
-  })
-}
-
-function endChmod (self, want, current, path, cb) {
-  var wantMode = want.mode
-  var chmod = want.follow || self.type !== 'SymbolicLink'
-    ? 'chmod' : 'lchmod'
-
-  if (!fs[chmod]) return cb()
-  if (typeof wantMode !== 'number') return cb()
-
-  var curMode = current.mode & parseInt('0777', 8)
-  wantMode = wantMode & parseInt('0777', 8)
-  if (wantMode === curMode) return cb()
-
-  fs[chmod](path, wantMode, cb)
-}
-
-function endChown (self, want, current, path, cb) {
-  // Don't even try it unless root.  Too easy to EPERM.
-  if (process.platform === 'win32') return cb()
-  if (!process.getuid || process.getuid() !== 0) return cb()
-  if (typeof want.uid !== 'number' &&
-    typeof want.gid !== 'number') return cb()
-
-  if (current.uid === want.uid &&
-    current.gid === want.gid) return cb()
-
-  var chown = (self.props.follow || self.type !== 'SymbolicLink')
-    ? 'chown' : 'lchown'
-  if (!fs[chown]) return cb()
-
-  if (typeof want.uid !== 'number') want.uid = current.uid
-  if (typeof want.gid !== 'number') want.gid = current.gid
-
-  fs[chown](path, want.uid, want.gid, cb)
-}
-
-function endUtimes (self, want, current, path, cb) {
-  if (!fs.utimes || process.platform === 'win32') return cb()
-
-  var utimes = (want.follow || self.type !== 'SymbolicLink')
-    ? 'utimes' : 'lutimes'
-
-  if (utimes === 'lutimes' && !fs[utimes]) {
-    utimes = 'utimes'
-  }
-
-  if (!fs[utimes]) return cb()
-
-  var curA = current.atime
-  var curM = current.mtime
-  var meA = want.atime
-  var meM = want.mtime
-
-  if (meA === undefined) meA = curA
-  if (meM === undefined) meM = curM
-
-  if (!isDate(meA)) meA = new Date(meA)
-  if (!isDate(meM)) meA = new Date(meM)
-
-  if (meA.getTime() === curA.getTime() &&
-    meM.getTime() === curM.getTime()) return cb()
-
-  fs[utimes](path, meA, meM, cb)
-}
-
-// XXX This function is beastly.  Break it up!
-Writer.prototype._finish = function () {
-  var self = this
-
-  if (self._finishing) return
-  self._finishing = true
-
-  // console.error(" W Finish", self._path, self.size)
-
-  // set up all the things.
-  // At this point, we're already done writing whatever we've gotta write,
-  // adding files to the dir, etc.
-  var todo = 0
-  var errState = null
-  var done = false
-
-  if (self._old) {
-    // the times will almost *certainly* have changed.
-    // adds the utimes syscall, but remove another stat.
-    self._old.atime = new Date(0)
-    self._old.mtime = new Date(0)
-    // console.error(" W Finish Stale Stat", self._path, self.size)
-    setProps(self._old)
-  } else {
-    var stat = self.props.follow ? 'stat' : 'lstat'
-    // console.error(" W Finish Stating", self._path, self.size)
-    fs[stat](self._path, function (er, current) {
-      // console.error(" W Finish Stated", self._path, self.size, current)
-      if (er) {
-        // if we're in the process of writing out a
-        // directory, it's very possible that the thing we're linking to
-        // doesn't exist yet (especially if it was intended as a symlink),
-        // so swallow ENOENT errors here and just soldier on.
-        if (er.code === 'ENOENT' &&
-          (self.type === 'Link' || self.type === 'SymbolicLink') &&
-          process.platform === 'win32') {
-          self.ready = true
-          self.emit('ready')
-          self.emit('end')
-          self.emit('close')
-          self.end = self._finish = function () {}
-          return
-        } else return self.error(er)
-      }
-      setProps(self._old = current)
-    })
-  }
-
-  return
-
-  function setProps (current) {
-    todo += 3
-    endChmod(self, self.props, current, self._path, next('chmod'))
-    endChown(self, self.props, current, self._path, next('chown'))
-    endUtimes(self, self.props, current, self._path, next('utimes'))
-  }
-
-  function next (what) {
-    return function (er) {
-      // console.error("   W Finish", what, todo)
-      if (errState) return
-      if (er) {
-        er.fstream_finish_call = what
-        return self.error(errState = er)
-      }
-      if (--todo > 0) return
-      if (done) return
-      done = true
-
-      // we may still need to set the mode/etc. on some parent dirs
-      // that were created previously.  delay end/close until then.
-      if (!self._madeDir) return end()
-      else endMadeDir(self, self._path, end)
-
-      function end (er) {
-        if (er) {
-          er.fstream_finish_call = 'setupMadeDir'
-          return self.error(er)
-        }
-        // all the props have been set, so we're completely done.
-        self.emit('end')
-        self.emit('close')
-      }
-    }
-  }
-}
-
-function endMadeDir (self, p, cb) {
-  var made = self._madeDir
-  // everything *between* made and path.dirname(self._path)
-  // needs to be set up.  Note that this may just be one dir.
-  var d = path.dirname(p)
-
-  endMadeDir_(self, d, function (er) {
-    if (er) return cb(er)
-    if (d === made) {
-      return cb()
-    }
-    endMadeDir(self, d, cb)
-  })
-}
-
-function endMadeDir_ (self, p, cb) {
-  var dirProps = {}
-  Object.keys(self.props).forEach(function (k) {
-    dirProps[k] = self.props[k]
-
-    // only make non-readable dirs if explicitly requested.
-    if (k === 'mode' && self.type !== 'Directory') {
-      dirProps[k] = dirProps[k] | parseInt('0111', 8)
-    }
-  })
-
-  var todo = 3
-  var errState = null
-  fs.stat(p, function (er, current) {
-    if (er) return cb(errState = er)
-    endChmod(self, dirProps, current, p, next)
-    endChown(self, dirProps, current, p, next)
-    endUtimes(self, dirProps, current, p, next)
-  })
-
-  function next (er) {
-    if (errState) return
-    if (er) return cb(errState = er)
-    if (--todo === 0) return cb()
-  }
-}
-
-Writer.prototype.pipe = function () {
-  this.error("Can't pipe from writable stream")
-}
-
-Writer.prototype.add = function () {
-  this.error("Can't add to non-Directory type")
-}
-
-Writer.prototype.write = function () {
-  return true
-}
-
-function objectToString (d) {
-  return Object.prototype.toString.call(d)
-}
-
-function isDate (d) {
-  return typeof d === 'object' && objectToString(d) === '[object Date]'
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/LICENSE
deleted file mode 100644
index 9d2c8036969bedd4ea9041a1e154306d7424662c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/LICENSE
+++ /dev/null
@@ -1,15 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter, Ben Noordhuis, and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/README.md
deleted file mode 100644
index d0dcd492549537997127861d902b96419c8d6c93..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/README.md
+++ /dev/null
@@ -1,133 +0,0 @@
-# graceful-fs
-
-graceful-fs functions as a drop-in replacement for the fs module,
-making various improvements.
-
-The improvements are meant to normalize behavior across different
-platforms and environments, and to make filesystem access more
-resilient to errors.
-
-## Improvements over [fs module](http://api.nodejs.org/fs.html)
-
-* Queues up `open` and `readdir` calls, and retries them once
-  something closes if there is an EMFILE error from too many file
-  descriptors.
-* fixes `lchmod` for Node versions prior to 0.6.2.
-* implements `fs.lutimes` if possible. Otherwise it becomes a noop.
-* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or
-  `lchown` if the user isn't root.
-* makes `lchmod` and `lchown` become noops, if not available.
-* retries reading a file if `read` results in EAGAIN error.
-
-On Windows, it retries renaming a file for up to one second if `EACCESS`
-or `EPERM` error occurs, likely because antivirus software has locked
-the directory.
-
-## USAGE
-
-```javascript
-// use just like fs
-var fs = require('graceful-fs')
-
-// now go and do stuff with it...
-fs.readFileSync('some-file-or-whatever')
-```
-
-## Global Patching
-
-If you want to patch the global fs module (or any other fs-like
-module) you can do this:
-
-```javascript
-// Make sure to read the caveat below.
-var realFs = require('fs')
-var gracefulFs = require('graceful-fs')
-gracefulFs.gracefulify(realFs)
-```
-
-This should only ever be done at the top-level application layer, in
-order to delay on EMFILE errors from any fs-using dependencies.  You
-should **not** do this in a library, because it can cause unexpected
-delays in other parts of the program.
-
-## Changes
-
-This module is fairly stable at this point, and used by a lot of
-things.  That being said, because it implements a subtle behavior
-change in a core part of the node API, even modest changes can be
-extremely breaking, and the versioning is thus biased towards
-bumping the major when in doubt.
-
-The main change between major versions has been switching between
-providing a fully-patched `fs` module vs monkey-patching the node core
-builtin, and the approach by which a non-monkey-patched `fs` was
-created.
-
-The goal is to trade `EMFILE` errors for slower fs operations.  So, if
-you try to open a zillion files, rather than crashing, `open`
-operations will be queued up and wait for something else to `close`.
-
-There are advantages to each approach.  Monkey-patching the fs means
-that no `EMFILE` errors can possibly occur anywhere in your
-application, because everything is using the same core `fs` module,
-which is patched.  However, it can also obviously cause undesirable
-side-effects, especially if the module is loaded multiple times.
-
-Implementing a separate-but-identical patched `fs` module is more
-surgical (and doesn't run the risk of patching multiple times), but
-also imposes the challenge of keeping in sync with the core module.
-
-The current approach loads the `fs` module, and then creates a
-lookalike object that has all the same methods, except a few that are
-patched.  It is safe to use in all versions of Node from 0.8 through
-7.0.
-
-### v4
-
-* Do not monkey-patch the fs module.  This module may now be used as a
-  drop-in dep, and users can opt into monkey-patching the fs builtin
-  if their app requires it.
-
-### v3
-
-* Monkey-patch fs, because the eval approach no longer works on recent
-  node.
-* fixed possible type-error throw if rename fails on windows
-* verify that we *never* get EMFILE errors
-* Ignore ENOSYS from chmod/chown
-* clarify that graceful-fs must be used as a drop-in
-
-### v2.1.0
-
-* Use eval rather than monkey-patching fs.
-* readdir: Always sort the results
-* win32: requeue a file if error has an OK status
-
-### v2.0
-
-* A return to monkey patching
-* wrap process.cwd
-
-### v1.1
-
-* wrap readFile
-* Wrap fs.writeFile.
-* readdir protection
-* Don't clobber the fs builtin
-* Handle fs.read EAGAIN errors by trying again
-* Expose the curOpen counter
-* No-op lchown/lchmod if not implemented
-* fs.rename patch only for win32
-* Patch fs.rename to handle AV software on Windows
-* Close #4 Chown should not fail on einval or eperm if non-root
-* Fix isaacs/fstream#1 Only wrap fs one time
-* Fix #3 Start at 1024 max files, then back off on EMFILE
-* lutimes that doens't blow up on Linux
-* A full on-rewrite using a queue instead of just swallowing the EMFILE error
-* Wrap Read/Write streams as well
-
-### 1.0
-
-* Update engines for node 0.6
-* Be lstat-graceful on Windows
-* first
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/fs.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/fs.js
deleted file mode 100644
index 8ad4a383965b7be33e32a8c7ee9a0b944f78ff22..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/fs.js
+++ /dev/null
@@ -1,21 +0,0 @@
-'use strict'
-
-var fs = require('fs')
-
-module.exports = clone(fs)
-
-function clone (obj) {
-  if (obj === null || typeof obj !== 'object')
-    return obj
-
-  if (obj instanceof Object)
-    var copy = { __proto__: obj.__proto__ }
-  else
-    var copy = Object.create(null)
-
-  Object.getOwnPropertyNames(obj).forEach(function (key) {
-    Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key))
-  })
-
-  return copy
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js
deleted file mode 100644
index 9bf803e686c70393adbcb7c4b3c97989a2e39311..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/graceful-fs.js
+++ /dev/null
@@ -1,253 +0,0 @@
-var fs = require('fs')
-var polyfills = require('./polyfills.js')
-var legacy = require('./legacy-streams.js')
-var queue = []
-
-var util = require('util')
-
-function noop () {}
-
-var debug = noop
-if (util.debuglog)
-  debug = util.debuglog('gfs4')
-else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || ''))
-  debug = function() {
-    var m = util.format.apply(util, arguments)
-    m = 'GFS4: ' + m.split(/\n/).join('\nGFS4: ')
-    console.error(m)
-  }
-
-if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) {
-  process.on('exit', function() {
-    debug(queue)
-    require('assert').equal(queue.length, 0)
-  })
-}
-
-module.exports = patch(require('./fs.js'))
-if (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) {
-  module.exports = patch(fs)
-}
-
-// Always patch fs.close/closeSync, because we want to
-// retry() whenever a close happens *anywhere* in the program.
-// This is essential when multiple graceful-fs instances are
-// in play at the same time.
-module.exports.close =
-fs.close = (function (fs$close) { return function (fd, cb) {
-  return fs$close.call(fs, fd, function (err) {
-    if (!err)
-      retry()
-
-    if (typeof cb === 'function')
-      cb.apply(this, arguments)
-  })
-}})(fs.close)
-
-module.exports.closeSync =
-fs.closeSync = (function (fs$closeSync) { return function (fd) {
-  // Note that graceful-fs also retries when fs.closeSync() fails.
-  // Looks like a bug to me, although it's probably a harmless one.
-  var rval = fs$closeSync.apply(fs, arguments)
-  retry()
-  return rval
-}})(fs.closeSync)
-
-function patch (fs) {
-  // Everything that references the open() function needs to be in here
-  polyfills(fs)
-  fs.gracefulify = patch
-  fs.FileReadStream = ReadStream;  // Legacy name.
-  fs.FileWriteStream = WriteStream;  // Legacy name.
-  fs.createReadStream = createReadStream
-  fs.createWriteStream = createWriteStream
-  var fs$readFile = fs.readFile
-  fs.readFile = readFile
-  function readFile (path, options, cb) {
-    if (typeof options === 'function')
-      cb = options, options = null
-
-    return go$readFile(path, options, cb)
-
-    function go$readFile (path, options, cb) {
-      return fs$readFile(path, options, function (err) {
-        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
-          enqueue([go$readFile, [path, options, cb]])
-        else {
-          if (typeof cb === 'function')
-            cb.apply(this, arguments)
-          retry()
-        }
-      })
-    }
-  }
-
-  var fs$writeFile = fs.writeFile
-  fs.writeFile = writeFile
-  function writeFile (path, data, options, cb) {
-    if (typeof options === 'function')
-      cb = options, options = null
-
-    return go$writeFile(path, data, options, cb)
-
-    function go$writeFile (path, data, options, cb) {
-      return fs$writeFile(path, data, options, function (err) {
-        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
-          enqueue([go$writeFile, [path, data, options, cb]])
-        else {
-          if (typeof cb === 'function')
-            cb.apply(this, arguments)
-          retry()
-        }
-      })
-    }
-  }
-
-  var fs$appendFile = fs.appendFile
-  if (fs$appendFile)
-    fs.appendFile = appendFile
-  function appendFile (path, data, options, cb) {
-    if (typeof options === 'function')
-      cb = options, options = null
-
-    return go$appendFile(path, data, options, cb)
-
-    function go$appendFile (path, data, options, cb) {
-      return fs$appendFile(path, data, options, function (err) {
-        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
-          enqueue([go$appendFile, [path, data, options, cb]])
-        else {
-          if (typeof cb === 'function')
-            cb.apply(this, arguments)
-          retry()
-        }
-      })
-    }
-  }
-
-  var fs$readdir = fs.readdir
-  fs.readdir = readdir
-  function readdir (path, cb) {
-    return go$readdir(path, cb)
-
-    function go$readdir () {
-      return fs$readdir(path, function (err, files) {
-        if (files && files.sort)
-          files.sort();  // Backwards compatibility with graceful-fs.
-
-        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
-          enqueue([go$readdir, [path, cb]])
-        else {
-          if (typeof cb === 'function')
-            cb.apply(this, arguments)
-          retry()
-        }
-      })
-    }
-  }
-
-
-  if (process.version.substr(0, 4) === 'v0.8') {
-    var legStreams = legacy(fs)
-    ReadStream = legStreams.ReadStream
-    WriteStream = legStreams.WriteStream
-  }
-
-  var fs$ReadStream = fs.ReadStream
-  ReadStream.prototype = Object.create(fs$ReadStream.prototype)
-  ReadStream.prototype.open = ReadStream$open
-
-  var fs$WriteStream = fs.WriteStream
-  WriteStream.prototype = Object.create(fs$WriteStream.prototype)
-  WriteStream.prototype.open = WriteStream$open
-
-  fs.ReadStream = ReadStream
-  fs.WriteStream = WriteStream
-
-  function ReadStream (path, options) {
-    if (this instanceof ReadStream)
-      return fs$ReadStream.apply(this, arguments), this
-    else
-      return ReadStream.apply(Object.create(ReadStream.prototype), arguments)
-  }
-
-  function ReadStream$open () {
-    var that = this
-    open(that.path, that.flags, that.mode, function (err, fd) {
-      if (err) {
-        if (that.autoClose)
-          that.destroy()
-
-        that.emit('error', err)
-      } else {
-        that.fd = fd
-        that.emit('open', fd)
-        that.read()
-      }
-    })
-  }
-
-  function WriteStream (path, options) {
-    if (this instanceof WriteStream)
-      return fs$WriteStream.apply(this, arguments), this
-    else
-      return WriteStream.apply(Object.create(WriteStream.prototype), arguments)
-  }
-
-  function WriteStream$open () {
-    var that = this
-    open(that.path, that.flags, that.mode, function (err, fd) {
-      if (err) {
-        that.destroy()
-        that.emit('error', err)
-      } else {
-        that.fd = fd
-        that.emit('open', fd)
-      }
-    })
-  }
-
-  function createReadStream (path, options) {
-    return new ReadStream(path, options)
-  }
-
-  function createWriteStream (path, options) {
-    return new WriteStream(path, options)
-  }
-
-  var fs$open = fs.open
-  fs.open = open
-  function open (path, flags, mode, cb) {
-    if (typeof mode === 'function')
-      cb = mode, mode = null
-
-    return go$open(path, flags, mode, cb)
-
-    function go$open (path, flags, mode, cb) {
-      return fs$open(path, flags, mode, function (err, fd) {
-        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))
-          enqueue([go$open, [path, flags, mode, cb]])
-        else {
-          if (typeof cb === 'function')
-            cb.apply(this, arguments)
-          retry()
-        }
-      })
-    }
-  }
-
-  return fs
-}
-
-function enqueue (elem) {
-  debug('ENQUEUE', elem[0].name, elem[1])
-  queue.push(elem)
-}
-
-function retry () {
-  var elem = queue.shift()
-  if (elem) {
-    debug('RETRY', elem[0].name, elem[1])
-    elem[0].apply(null, elem[1])
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/legacy-streams.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/legacy-streams.js
deleted file mode 100644
index d617b50fc0832dcce4ba05f7a7200938438ead90..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/legacy-streams.js
+++ /dev/null
@@ -1,118 +0,0 @@
-var Stream = require('stream').Stream
-
-module.exports = legacy
-
-function legacy (fs) {
-  return {
-    ReadStream: ReadStream,
-    WriteStream: WriteStream
-  }
-
-  function ReadStream (path, options) {
-    if (!(this instanceof ReadStream)) return new ReadStream(path, options);
-
-    Stream.call(this);
-
-    var self = this;
-
-    this.path = path;
-    this.fd = null;
-    this.readable = true;
-    this.paused = false;
-
-    this.flags = 'r';
-    this.mode = 438; /*=0666*/
-    this.bufferSize = 64 * 1024;
-
-    options = options || {};
-
-    // Mixin options into this
-    var keys = Object.keys(options);
-    for (var index = 0, length = keys.length; index < length; index++) {
-      var key = keys[index];
-      this[key] = options[key];
-    }
-
-    if (this.encoding) this.setEncoding(this.encoding);
-
-    if (this.start !== undefined) {
-      if ('number' !== typeof this.start) {
-        throw TypeError('start must be a Number');
-      }
-      if (this.end === undefined) {
-        this.end = Infinity;
-      } else if ('number' !== typeof this.end) {
-        throw TypeError('end must be a Number');
-      }
-
-      if (this.start > this.end) {
-        throw new Error('start must be <= end');
-      }
-
-      this.pos = this.start;
-    }
-
-    if (this.fd !== null) {
-      process.nextTick(function() {
-        self._read();
-      });
-      return;
-    }
-
-    fs.open(this.path, this.flags, this.mode, function (err, fd) {
-      if (err) {
-        self.emit('error', err);
-        self.readable = false;
-        return;
-      }
-
-      self.fd = fd;
-      self.emit('open', fd);
-      self._read();
-    })
-  }
-
-  function WriteStream (path, options) {
-    if (!(this instanceof WriteStream)) return new WriteStream(path, options);
-
-    Stream.call(this);
-
-    this.path = path;
-    this.fd = null;
-    this.writable = true;
-
-    this.flags = 'w';
-    this.encoding = 'binary';
-    this.mode = 438; /*=0666*/
-    this.bytesWritten = 0;
-
-    options = options || {};
-
-    // Mixin options into this
-    var keys = Object.keys(options);
-    for (var index = 0, length = keys.length; index < length; index++) {
-      var key = keys[index];
-      this[key] = options[key];
-    }
-
-    if (this.start !== undefined) {
-      if ('number' !== typeof this.start) {
-        throw TypeError('start must be a Number');
-      }
-      if (this.start < 0) {
-        throw new Error('start must be >= zero');
-      }
-
-      this.pos = this.start;
-    }
-
-    this.busy = false;
-    this._queue = [];
-
-    if (this.fd === null) {
-      this._open = fs.open;
-      this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);
-      this.flush();
-    }
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/package.json
deleted file mode 100644
index 06b7591d5c2dbddcafee257adc5d6cf30dfa56f8..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/package.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
-  "_from": "graceful-fs@>=4.1.2 <5.0.0",
-  "_id": "graceful-fs@4.1.4",
-  "_location": "/serialport/node-pre-gyp/tar/fstream/graceful-fs",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar/fstream"
-  ],
-  "_resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.4.tgz",
-  "_shasum": "ef089d2880f033b011823ce5c8fae798da775dbd",
-  "_shrinkwrap": null,
-  "bugs": {
-    "url": "https://github.com/isaacs/node-graceful-fs/issues"
-  },
-  "dependencies": {},
-  "description": "A drop-in replacement for fs, making various improvements.",
-  "devDependencies": {
-    "mkdirp": "^0.5.0",
-    "rimraf": "^2.2.8",
-    "tap": "^5.4.2"
-  },
-  "directories": {
-    "test": "test"
-  },
-  "engines": {
-    "node": ">=0.4.0"
-  },
-  "files": [
-    "fs.js",
-    "graceful-fs.js",
-    "legacy-streams.js",
-    "polyfills.js"
-  ],
-  "homepage": "https://github.com/isaacs/node-graceful-fs#readme",
-  "keywords": [
-    "EACCESS",
-    "EAGAIN",
-    "EINVAL",
-    "EMFILE",
-    "EPERM",
-    "error",
-    "errors",
-    "fs",
-    "handling",
-    "module",
-    "queue",
-    "reading",
-    "retries",
-    "retry"
-  ],
-  "license": "ISC",
-  "main": "graceful-fs.js",
-  "name": "graceful-fs",
-  "optionalDependencies": {},
-  "readme": "# graceful-fs\n\ngraceful-fs functions as a drop-in replacement for the fs module,\nmaking various improvements.\n\nThe improvements are meant to normalize behavior across different\nplatforms and environments, and to make filesystem access more\nresilient to errors.\n\n## Improvements over [fs module](http://api.nodejs.org/fs.html)\n\n* Queues up `open` and `readdir` calls, and retries them once\n  something closes if there is an EMFILE error from too many file\n  descriptors.\n* fixes `lchmod` for Node versions prior to 0.6.2.\n* implements `fs.lutimes` if possible. Otherwise it becomes a noop.\n* ignores `EINVAL` and `EPERM` errors in `chown`, `fchown` or\n  `lchown` if the user isn't root.\n* makes `lchmod` and `lchown` become noops, if not available.\n* retries reading a file if `read` results in EAGAIN error.\n\nOn Windows, it retries renaming a file for up to one second if `EACCESS`\nor `EPERM` error occurs, likely because antivirus software has locked\nthe directory.\n\n## USAGE\n\n```javascript\n// use just like fs\nvar fs = require('graceful-fs')\n\n// now go and do stuff with it...\nfs.readFileSync('some-file-or-whatever')\n```\n\n## Global Patching\n\nIf you want to patch the global fs module (or any other fs-like\nmodule) you can do this:\n\n```javascript\n// Make sure to read the caveat below.\nvar realFs = require('fs')\nvar gracefulFs = require('graceful-fs')\ngracefulFs.gracefulify(realFs)\n```\n\nThis should only ever be done at the top-level application layer, in\norder to delay on EMFILE errors from any fs-using dependencies.  You\nshould **not** do this in a library, because it can cause unexpected\ndelays in other parts of the program.\n\n## Changes\n\nThis module is fairly stable at this point, and used by a lot of\nthings.  That being said, because it implements a subtle behavior\nchange in a core part of the node API, even modest changes can be\nextremely breaking, and the versioning is thus biased towards\nbumping the major when in doubt.\n\nThe main change between major versions has been switching between\nproviding a fully-patched `fs` module vs monkey-patching the node core\nbuiltin, and the approach by which a non-monkey-patched `fs` was\ncreated.\n\nThe goal is to trade `EMFILE` errors for slower fs operations.  So, if\nyou try to open a zillion files, rather than crashing, `open`\noperations will be queued up and wait for something else to `close`.\n\nThere are advantages to each approach.  Monkey-patching the fs means\nthat no `EMFILE` errors can possibly occur anywhere in your\napplication, because everything is using the same core `fs` module,\nwhich is patched.  However, it can also obviously cause undesirable\nside-effects, especially if the module is loaded multiple times.\n\nImplementing a separate-but-identical patched `fs` module is more\nsurgical (and doesn't run the risk of patching multiple times), but\nalso imposes the challenge of keeping in sync with the core module.\n\nThe current approach loads the `fs` module, and then creates a\nlookalike object that has all the same methods, except a few that are\npatched.  It is safe to use in all versions of Node from 0.8 through\n7.0.\n\n### v4\n\n* Do not monkey-patch the fs module.  This module may now be used as a\n  drop-in dep, and users can opt into monkey-patching the fs builtin\n  if their app requires it.\n\n### v3\n\n* Monkey-patch fs, because the eval approach no longer works on recent\n  node.\n* fixed possible type-error throw if rename fails on windows\n* verify that we *never* get EMFILE errors\n* Ignore ENOSYS from chmod/chown\n* clarify that graceful-fs must be used as a drop-in\n\n### v2.1.0\n\n* Use eval rather than monkey-patching fs.\n* readdir: Always sort the results\n* win32: requeue a file if error has an OK status\n\n### v2.0\n\n* A return to monkey patching\n* wrap process.cwd\n\n### v1.1\n\n* wrap readFile\n* Wrap fs.writeFile.\n* readdir protection\n* Don't clobber the fs builtin\n* Handle fs.read EAGAIN errors by trying again\n* Expose the curOpen counter\n* No-op lchown/lchmod if not implemented\n* fs.rename patch only for win32\n* Patch fs.rename to handle AV software on Windows\n* Close #4 Chown should not fail on einval or eperm if non-root\n* Fix isaacs/fstream#1 Only wrap fs one time\n* Fix #3 Start at 1024 max files, then back off on EMFILE\n* lutimes that doens't blow up on Linux\n* A full on-rewrite using a queue instead of just swallowing the EMFILE error\n* Wrap Read/Write streams as well\n\n### 1.0\n\n* Update engines for node 0.6\n* Be lstat-graceful on Windows\n* first\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/isaacs/node-graceful-fs.git"
-  },
-  "scripts": {
-    "test": "node test.js | tap -"
-  },
-  "version": "4.1.4"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/polyfills.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/polyfills.js
deleted file mode 100644
index 5e4f4804618d177c63a1e96db830599a8840a185..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/node_modules/graceful-fs/polyfills.js
+++ /dev/null
@@ -1,252 +0,0 @@
-var fs = require('./fs.js')
-var constants = require('constants')
-
-var origCwd = process.cwd
-var cwd = null
-process.cwd = function() {
-  if (!cwd)
-    cwd = origCwd.call(process)
-  return cwd
-}
-try {
-  process.cwd()
-} catch (er) {}
-
-var chdir = process.chdir
-process.chdir = function(d) {
-  cwd = null
-  chdir.call(process, d)
-}
-
-module.exports = patch
-
-function patch (fs) {
-  // (re-)implement some things that are known busted or missing.
-
-  // lchmod, broken prior to 0.6.2
-  // back-port the fix here.
-  if (constants.hasOwnProperty('O_SYMLINK') &&
-      process.version.match(/^v0\.6\.[0-2]|^v0\.5\./)) {
-    patchLchmod(fs)
-  }
-
-  // lutimes implementation, or no-op
-  if (!fs.lutimes) {
-    patchLutimes(fs)
-  }
-
-  // https://github.com/isaacs/node-graceful-fs/issues/4
-  // Chown should not fail on einval or eperm if non-root.
-  // It should not fail on enosys ever, as this just indicates
-  // that a fs doesn't support the intended operation.
-
-  fs.chown = chownFix(fs.chown)
-  fs.fchown = chownFix(fs.fchown)
-  fs.lchown = chownFix(fs.lchown)
-
-  fs.chmod = chownFix(fs.chmod)
-  fs.fchmod = chownFix(fs.fchmod)
-  fs.lchmod = chownFix(fs.lchmod)
-
-  fs.chownSync = chownFixSync(fs.chownSync)
-  fs.fchownSync = chownFixSync(fs.fchownSync)
-  fs.lchownSync = chownFixSync(fs.lchownSync)
-
-  fs.chmodSync = chownFix(fs.chmodSync)
-  fs.fchmodSync = chownFix(fs.fchmodSync)
-  fs.lchmodSync = chownFix(fs.lchmodSync)
-
-  // if lchmod/lchown do not exist, then make them no-ops
-  if (!fs.lchmod) {
-    fs.lchmod = function (path, mode, cb) {
-      process.nextTick(cb)
-    }
-    fs.lchmodSync = function () {}
-  }
-  if (!fs.lchown) {
-    fs.lchown = function (path, uid, gid, cb) {
-      process.nextTick(cb)
-    }
-    fs.lchownSync = function () {}
-  }
-
-  // on Windows, A/V software can lock the directory, causing this
-  // to fail with an EACCES or EPERM if the directory contains newly
-  // created files.  Try again on failure, for up to 1 second.
-  if (process.platform === "win32") {
-    fs.rename = (function (fs$rename) { return function (from, to, cb) {
-      var start = Date.now()
-      fs$rename(from, to, function CB (er) {
-        if (er
-            && (er.code === "EACCES" || er.code === "EPERM")
-            && Date.now() - start < 1000) {
-          return fs$rename(from, to, CB)
-        }
-        if (cb) cb(er)
-      })
-    }})(fs.rename)
-  }
-
-  // if read() returns EAGAIN, then just try it again.
-  fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) {
-    var callback
-    if (callback_ && typeof callback_ === 'function') {
-      var eagCounter = 0
-      callback = function (er, _, __) {
-        if (er && er.code === 'EAGAIN' && eagCounter < 10) {
-          eagCounter ++
-          return fs$read.call(fs, fd, buffer, offset, length, position, callback)
-        }
-        callback_.apply(this, arguments)
-      }
-    }
-    return fs$read.call(fs, fd, buffer, offset, length, position, callback)
-  }})(fs.read)
-
-  fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) {
-    var eagCounter = 0
-    while (true) {
-      try {
-        return fs$readSync.call(fs, fd, buffer, offset, length, position)
-      } catch (er) {
-        if (er.code === 'EAGAIN' && eagCounter < 10) {
-          eagCounter ++
-          continue
-        }
-        throw er
-      }
-    }
-  }})(fs.readSync)
-}
-
-function patchLchmod (fs) {
-  fs.lchmod = function (path, mode, callback) {
-    callback = callback || noop
-    fs.open( path
-           , constants.O_WRONLY | constants.O_SYMLINK
-           , mode
-           , function (err, fd) {
-      if (err) {
-        callback(err)
-        return
-      }
-      // prefer to return the chmod error, if one occurs,
-      // but still try to close, and report closing errors if they occur.
-      fs.fchmod(fd, mode, function (err) {
-        fs.close(fd, function(err2) {
-          callback(err || err2)
-        })
-      })
-    })
-  }
-
-  fs.lchmodSync = function (path, mode) {
-    var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)
-
-    // prefer to return the chmod error, if one occurs,
-    // but still try to close, and report closing errors if they occur.
-    var threw = true
-    var ret
-    try {
-      ret = fs.fchmodSync(fd, mode)
-      threw = false
-    } finally {
-      if (threw) {
-        try {
-          fs.closeSync(fd)
-        } catch (er) {}
-      } else {
-        fs.closeSync(fd)
-      }
-    }
-    return ret
-  }
-}
-
-function patchLutimes (fs) {
-  if (constants.hasOwnProperty("O_SYMLINK")) {
-    fs.lutimes = function (path, at, mt, cb) {
-      fs.open(path, constants.O_SYMLINK, function (er, fd) {
-        cb = cb || noop
-        if (er) return cb(er)
-        fs.futimes(fd, at, mt, function (er) {
-          fs.close(fd, function (er2) {
-            return cb(er || er2)
-          })
-        })
-      })
-    }
-
-    fs.lutimesSync = function (path, at, mt) {
-      var fd = fs.openSync(path, constants.O_SYMLINK)
-      var ret
-      var threw = true
-      try {
-        ret = fs.futimesSync(fd, at, mt)
-        threw = false
-      } finally {
-        if (threw) {
-          try {
-            fs.closeSync(fd)
-          } catch (er) {}
-        } else {
-          fs.closeSync(fd)
-        }
-      }
-      return ret
-    }
-
-  } else {
-    fs.lutimes = function (_a, _b, _c, cb) { process.nextTick(cb) }
-    fs.lutimesSync = function () {}
-  }
-}
-
-function chownFix (orig) {
-  if (!orig) return orig
-  return function (target, uid, gid, cb) {
-    return orig.call(fs, target, uid, gid, function (er, res) {
-      if (chownErOk(er)) er = null
-      cb(er, res)
-    })
-  }
-}
-
-function chownFixSync (orig) {
-  if (!orig) return orig
-  return function (target, uid, gid) {
-    try {
-      return orig.call(fs, target, uid, gid)
-    } catch (er) {
-      if (!chownErOk(er)) throw er
-    }
-  }
-}
-
-// ENOSYS means that the fs doesn't support the op. Just ignore
-// that, because it doesn't matter.
-//
-// if there's no getuid, or if getuid() is something other
-// than 0, and the error is EINVAL or EPERM, then just ignore
-// it.
-//
-// This specific case is a silent failure in cp, install, tar,
-// and most other unix tools that manage permissions.
-//
-// When running as root, or if other types of errors are
-// encountered, then it's strict.
-function chownErOk (er) {
-  if (!er)
-    return true
-
-  if (er.code === "ENOSYS")
-    return true
-
-  var nonroot = !process.getuid || process.getuid() !== 0
-  if (nonroot) {
-    if (er.code === "EINVAL" || er.code === "EPERM")
-      return true
-  }
-
-  return false
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/package.json
deleted file mode 100644
index ab27952fce9947998c3ee4a677b7348ca4374eb7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/fstream/package.json
+++ /dev/null
@@ -1,82 +0,0 @@
-{
-  "_from": "fstream@>=1.0.10 <1.1.0",
-  "_id": "fstream@1.0.10",
-  "_location": "/serialport/node-pre-gyp/tar/fstream",
-  "_nodeVersion": "4.4.5",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/fstream-1.0.10.tgz_1466189553883_0.3062701092567295"
-  },
-  "_npmUser": {
-    "email": "ogd@aoaioxxysz.net",
-    "name": "othiym23"
-  },
-  "_npmVersion": "3.10.0",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar"
-  ],
-  "_resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz",
-  "_shasum": "604e8a92fe26ffd9f6fae30399d4984e1ab22822",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/npm/fstream/issues"
-  },
-  "dependencies": {
-    "graceful-fs": "^4.1.2",
-    "inherits": "~2.0.0",
-    "mkdirp": ">=0.5 0",
-    "rimraf": "2"
-  },
-  "description": "Advanced file system stream things",
-  "devDependencies": {
-    "standard": "^4.0.0",
-    "tap": "^1.2.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "604e8a92fe26ffd9f6fae30399d4984e1ab22822",
-    "tarball": "https://registry.npmjs.org/fstream/-/fstream-1.0.10.tgz"
-  },
-  "engines": {
-    "node": ">=0.6"
-  },
-  "gitHead": "24fabdec32e334dd3b130d77b38c010e3119b102",
-  "homepage": "https://github.com/npm/fstream#readme",
-  "license": "ISC",
-  "main": "fstream.js",
-  "maintainers": [
-    {
-      "name": "iarna",
-      "email": "me@re-becca.org"
-    },
-    {
-      "name": "isaacs",
-      "email": "isaacs@npmjs.com"
-    },
-    {
-      "name": "othiym23",
-      "email": "ogd@aoaioxxysz.net"
-    },
-    {
-      "name": "zkat",
-      "email": "kat@sykosomatic.org"
-    }
-  ],
-  "name": "fstream",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/npm/fstream.git"
-  },
-  "scripts": {
-    "test": "standard && tap examples/*.js"
-  },
-  "version": "1.0.10"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/LICENSE b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/LICENSE
deleted file mode 100644
index dea3013d6710ee273f49ac606a65d5211d480c88..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/LICENSE
+++ /dev/null
@@ -1,16 +0,0 @@
-The ISC License
-
-Copyright (c) Isaac Z. Schlueter
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-PERFORMANCE OF THIS SOFTWARE.
-
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/README.md b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/README.md
deleted file mode 100644
index b1c56658557b8162aa9f5ba8610ed03a5e558d9d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/README.md
+++ /dev/null
@@ -1,42 +0,0 @@
-Browser-friendly inheritance fully compatible with standard node.js
-[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
-
-This package exports standard `inherits` from node.js `util` module in
-node environment, but also provides alternative browser-friendly
-implementation through [browser
-field](https://gist.github.com/shtylman/4339901). Alternative
-implementation is a literal copy of standard one located in standalone
-module to avoid requiring of `util`. It also has a shim for old
-browsers with no `Object.create` support.
-
-While keeping you sure you are using standard `inherits`
-implementation in node.js environment, it allows bundlers such as
-[browserify](https://github.com/substack/node-browserify) to not
-include full `util` package to your client code if all you need is
-just `inherits` function. It worth, because browser shim for `util`
-package is large and `inherits` is often the single function you need
-from it.
-
-It's recommended to use this package instead of
-`require('util').inherits` for any code that has chances to be used
-not only in node.js but in browser too.
-
-## usage
-
-```js
-var inherits = require('inherits');
-// then use exactly as the standard one
-```
-
-## note on version ~1.0
-
-Version ~1.0 had completely different motivation and is not compatible
-neither with 2.0 nor with standard node.js `inherits`.
-
-If you are using version ~1.0 and planning to switch to ~2.0, be
-careful:
-
-* new version uses `super_` instead of `super` for referencing
-  superclass
-* new version overwrites current prototype while old one preserves any
-  existing fields on it
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits.js
deleted file mode 100644
index 29f5e24f57b5aacb9f199dea05a57fcbf4918bc1..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('util').inherits
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits_browser.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits_browser.js
deleted file mode 100644
index c1e78a75e6b52b7434e7e8aa0d64d8abd593763b..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/inherits_browser.js
+++ /dev/null
@@ -1,23 +0,0 @@
-if (typeof Object.create === 'function') {
-  // implementation from standard node.js 'util' module
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    ctor.prototype = Object.create(superCtor.prototype, {
-      constructor: {
-        value: ctor,
-        enumerable: false,
-        writable: true,
-        configurable: true
-      }
-    });
-  };
-} else {
-  // old school shim for old browsers
-  module.exports = function inherits(ctor, superCtor) {
-    ctor.super_ = superCtor
-    var TempCtor = function () {}
-    TempCtor.prototype = superCtor.prototype
-    ctor.prototype = new TempCtor()
-    ctor.prototype.constructor = ctor
-  }
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/package.json
deleted file mode 100644
index 8c8065b4cf742cbd616ef906f8562df82c15b44d..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/package.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
-  "_from": "inherits@>=2.0.0 <3.0.0",
-  "_id": "inherits@2.0.1",
-  "_location": "/serialport/node-pre-gyp/tar/inherits",
-  "_phantomChildren": {},
-  "_requiredBy": [
-    "/serialport/node-pre-gyp/tar",
-    "/serialport/node-pre-gyp/tar/block-stream",
-    "/serialport/node-pre-gyp/tar/fstream"
-  ],
-  "_resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-  "_shasum": "b17d08d326b4423e568eff719f91b0b1cbdf69f1",
-  "_shrinkwrap": null,
-  "browser": "./inherits_browser.js",
-  "bugs": {
-    "url": "https://github.com/isaacs/inherits/issues"
-  },
-  "dependencies": {},
-  "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()",
-  "devDependencies": {},
-  "homepage": "https://github.com/isaacs/inherits#readme",
-  "keywords": [
-    "browser",
-    "browserify",
-    "class",
-    "inheritance",
-    "inherits",
-    "klass",
-    "object-oriented",
-    "oop"
-  ],
-  "license": "ISC",
-  "main": "./inherits.js",
-  "name": "inherits",
-  "optionalDependencies": {},
-  "readme": "Browser-friendly inheritance fully compatible with standard node.js\n[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).\n\nThis package exports standard `inherits` from node.js `util` module in\nnode environment, but also provides alternative browser-friendly\nimplementation through [browser\nfield](https://gist.github.com/shtylman/4339901). Alternative\nimplementation is a literal copy of standard one located in standalone\nmodule to avoid requiring of `util`. It also has a shim for old\nbrowsers with no `Object.create` support.\n\nWhile keeping you sure you are using standard `inherits`\nimplementation in node.js environment, it allows bundlers such as\n[browserify](https://github.com/substack/node-browserify) to not\ninclude full `util` package to your client code if all you need is\njust `inherits` function. It worth, because browser shim for `util`\npackage is large and `inherits` is often the single function you need\nfrom it.\n\nIt's recommended to use this package instead of\n`require('util').inherits` for any code that has chances to be used\nnot only in node.js but in browser too.\n\n## usage\n\n```js\nvar inherits = require('inherits');\n// then use exactly as the standard one\n```\n\n## note on version ~1.0\n\nVersion ~1.0 had completely different motivation and is not compatible\nneither with 2.0 nor with standard node.js `inherits`.\n\nIf you are using version ~1.0 and planning to switch to ~2.0, be\ncareful:\n\n* new version uses `super_` instead of `super` for referencing\n  superclass\n* new version overwrites current prototype while old one preserves any\n  existing fields on it\n",
-  "readmeFilename": "README.md",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/inherits.git"
-  },
-  "scripts": {
-    "test": "node test"
-  },
-  "version": "2.0.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/test.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/test.js
deleted file mode 100644
index fc53012d31c0cde4f4bca408e7470e35a06f88fc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/node_modules/inherits/test.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var inherits = require('./inherits.js')
-var assert = require('assert')
-
-function test(c) {
-  assert(c.constructor === Child)
-  assert(c.constructor.super_ === Parent)
-  assert(Object.getPrototypeOf(c) === Child.prototype)
-  assert(Object.getPrototypeOf(Object.getPrototypeOf(c)) === Parent.prototype)
-  assert(c instanceof Child)
-  assert(c instanceof Parent)
-}
-
-function Child() {
-  Parent.call(this)
-  test(this)
-}
-
-function Parent() {}
-
-inherits(Child, Parent)
-
-var c = new Child
-test(c)
-
-console.log('ok')
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/package.json
deleted file mode 100644
index 22fb17cdba0e1372f02e52e6e0c025ac4a6342b9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/package.json
+++ /dev/null
@@ -1,80 +0,0 @@
-{
-  "_from": "tar@>=2.2.0 <2.3.0",
-  "_id": "tar@2.2.1",
-  "_location": "/serialport/node-pre-gyp/tar",
-  "_nodeVersion": "2.2.2",
-  "_npmUser": {
-    "email": "kat@sykosomatic.org",
-    "name": "zkat"
-  },
-  "_npmVersion": "2.14.3",
-  "_phantomChildren": {
-    "mkdirp": "0.5.1",
-    "rimraf": "2.5.3"
-  },
-  "_requiredBy": [
-    "/serialport/node-pre-gyp",
-    "/serialport/node-pre-gyp/tar-pack"
-  ],
-  "_resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
-  "_shasum": "8e4d2a256c0e2185c6b18ad694aec968b83cb1d1",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "i@izs.me",
-    "name": "Isaac Z. Schlueter",
-    "url": "http://blog.izs.me/"
-  },
-  "bugs": {
-    "url": "https://github.com/isaacs/node-tar/issues"
-  },
-  "dependencies": {
-    "block-stream": "*",
-    "fstream": "^1.0.2",
-    "inherits": "2"
-  },
-  "description": "tar for node",
-  "devDependencies": {
-    "graceful-fs": "^4.1.2",
-    "mkdirp": "^0.5.0",
-    "rimraf": "1.x",
-    "tap": "0.x"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "8e4d2a256c0e2185c6b18ad694aec968b83cb1d1",
-    "tarball": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz"
-  },
-  "gitHead": "52237e39d2eb68d22a32d9a98f1d762189fe6a3d",
-  "homepage": "https://github.com/isaacs/node-tar#readme",
-  "license": "ISC",
-  "main": "tar.js",
-  "maintainers": [
-    {
-      "name": "isaacs",
-      "email": "isaacs@npmjs.com"
-    },
-    {
-      "name": "othiym23",
-      "email": "ogd@aoaioxxysz.net"
-    },
-    {
-      "name": "soldair",
-      "email": "soldair@gmail.com"
-    },
-    {
-      "name": "zkat",
-      "email": "kat@sykosomatic.org"
-    }
-  ],
-  "name": "tar",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/isaacs/node-tar.git"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "version": "2.2.1"
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/tar.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/tar.js
deleted file mode 100644
index a81298b9a0b126868fc31ea7968d49f665787b64..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/tar.js
+++ /dev/null
@@ -1,173 +0,0 @@
-// field paths that every tar file must have.
-// header is padded to 512 bytes.
-var f = 0
-  , fields = {}
-  , path = fields.path = f++
-  , mode = fields.mode = f++
-  , uid = fields.uid = f++
-  , gid = fields.gid = f++
-  , size = fields.size = f++
-  , mtime = fields.mtime = f++
-  , cksum = fields.cksum = f++
-  , type = fields.type = f++
-  , linkpath = fields.linkpath = f++
-  , headerSize = 512
-  , blockSize = 512
-  , fieldSize = []
-
-fieldSize[path] = 100
-fieldSize[mode] = 8
-fieldSize[uid] = 8
-fieldSize[gid] = 8
-fieldSize[size] = 12
-fieldSize[mtime] = 12
-fieldSize[cksum] = 8
-fieldSize[type] = 1
-fieldSize[linkpath] = 100
-
-// "ustar\0" may introduce another bunch of headers.
-// these are optional, and will be nulled out if not present.
-
-var ustar = fields.ustar = f++
-  , ustarver = fields.ustarver = f++
-  , uname = fields.uname = f++
-  , gname = fields.gname = f++
-  , devmaj = fields.devmaj = f++
-  , devmin = fields.devmin = f++
-  , prefix = fields.prefix = f++
-  , fill = fields.fill = f++
-
-// terminate fields.
-fields[f] = null
-
-fieldSize[ustar] = 6
-fieldSize[ustarver] = 2
-fieldSize[uname] = 32
-fieldSize[gname] = 32
-fieldSize[devmaj] = 8
-fieldSize[devmin] = 8
-fieldSize[prefix] = 155
-fieldSize[fill] = 12
-
-// nb: prefix field may in fact be 130 bytes of prefix,
-// a null char, 12 bytes for atime, 12 bytes for ctime.
-//
-// To recognize this format:
-// 1. prefix[130] === ' ' or '\0'
-// 2. atime and ctime are octal numeric values
-// 3. atime and ctime have ' ' in their last byte
-
-var fieldEnds = {}
-  , fieldOffs = {}
-  , fe = 0
-for (var i = 0; i < f; i ++) {
-  fieldOffs[i] = fe
-  fieldEnds[i] = (fe += fieldSize[i])
-}
-
-// build a translation table of field paths.
-Object.keys(fields).forEach(function (f) {
-  if (fields[f] !== null) fields[fields[f]] = f
-})
-
-// different values of the 'type' field
-// paths match the values of Stats.isX() functions, where appropriate
-var types =
-  { 0: "File"
-  , "\0": "OldFile" // like 0
-  , "": "OldFile"
-  , 1: "Link"
-  , 2: "SymbolicLink"
-  , 3: "CharacterDevice"
-  , 4: "BlockDevice"
-  , 5: "Directory"
-  , 6: "FIFO"
-  , 7: "ContiguousFile" // like 0
-  // posix headers
-  , g: "GlobalExtendedHeader" // k=v for the rest of the archive
-  , x: "ExtendedHeader" // k=v for the next file
-  // vendor-specific stuff
-  , A: "SolarisACL" // skip
-  , D: "GNUDumpDir" // like 5, but with data, which should be skipped
-  , I: "Inode" // metadata only, skip
-  , K: "NextFileHasLongLinkpath" // data = link path of next file
-  , L: "NextFileHasLongPath" // data = path of next file
-  , M: "ContinuationFile" // skip
-  , N: "OldGnuLongPath" // like L
-  , S: "SparseFile" // skip
-  , V: "TapeVolumeHeader" // skip
-  , X: "OldExtendedHeader" // like x
-  }
-
-Object.keys(types).forEach(function (t) {
-  types[types[t]] = types[types[t]] || t
-})
-
-// values for the mode field
-var modes =
-  { suid: 04000 // set uid on extraction
-  , sgid: 02000 // set gid on extraction
-  , svtx: 01000 // set restricted deletion flag on dirs on extraction
-  , uread:  0400
-  , uwrite: 0200
-  , uexec:  0100
-  , gread:  040
-  , gwrite: 020
-  , gexec:  010
-  , oread:  4
-  , owrite: 2
-  , oexec:  1
-  , all: 07777
-  }
-
-var numeric =
-  { mode: true
-  , uid: true
-  , gid: true
-  , size: true
-  , mtime: true
-  , devmaj: true
-  , devmin: true
-  , cksum: true
-  , atime: true
-  , ctime: true
-  , dev: true
-  , ino: true
-  , nlink: true
-  }
-
-Object.keys(modes).forEach(function (t) {
-  modes[modes[t]] = modes[modes[t]] || t
-})
-
-var knownExtended =
-  { atime: true
-  , charset: true
-  , comment: true
-  , ctime: true
-  , gid: true
-  , gname: true
-  , linkpath: true
-  , mtime: true
-  , path: true
-  , realtime: true
-  , security: true
-  , size: true
-  , uid: true
-  , uname: true }
-
-
-exports.fields = fields
-exports.fieldSize = fieldSize
-exports.fieldOffs = fieldOffs
-exports.fieldEnds = fieldEnds
-exports.types = types
-exports.modes = modes
-exports.numeric = numeric
-exports.headerSize = headerSize
-exports.blockSize = blockSize
-exports.knownExtended = knownExtended
-
-exports.Pack = require("./lib/pack.js")
-exports.Parse = require("./lib/parse.js")
-exports.Extract = require("./lib/extract.js")
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/00-setup-fixtures.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/00-setup-fixtures.js
deleted file mode 100644
index 1524ff7af05700913dbc91039d019ea204479dc7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/00-setup-fixtures.js
+++ /dev/null
@@ -1,53 +0,0 @@
-// the fixtures have some weird stuff that is painful
-// to include directly in the repo for various reasons.
-//
-// So, unpack the fixtures with the system tar first.
-//
-// This means, of course, that it'll only work if you
-// already have a tar implementation, and some of them
-// will not properly unpack the fixtures anyway.
-//
-// But, since usually those tests will fail on Windows
-// and other systems with less capable filesystems anyway,
-// at least this way we don't cause inconveniences by
-// merely cloning the repo or installing the package.
-
-var tap = require("tap")
-, child_process = require("child_process")
-, rimraf = require("rimraf")
-, test = tap.test
-, path = require("path")
-
-test("clean fixtures", function (t) {
-  rimraf(path.resolve(__dirname, "fixtures"), function (er) {
-    t.ifError(er, "rimraf ./fixtures/")
-    t.end()
-  })
-})
-
-test("clean tmp", function (t) {
-  rimraf(path.resolve(__dirname, "tmp"), function (er) {
-    t.ifError(er, "rimraf ./tmp/")
-    t.end()
-  })
-})
-
-test("extract fixtures", function (t) {
-  var c = child_process.spawn("tar"
-                             ,["xzvf", "fixtures.tgz"]
-                             ,{ cwd: __dirname })
-
-  c.stdout.on("data", errwrite)
-  c.stderr.on("data", errwrite)
-  function errwrite (chunk) {
-    process.stderr.write(chunk)
-  }
-
-  c.on("exit", function (code) {
-    t.equal(code, 0, "extract fixtures should exit with 0")
-    if (code) {
-      t.comment("Note, all tests from here on out will fail because of this.")
-    }
-    t.end()
-  })
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/cb-never-called-1.0.1.tgz b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/cb-never-called-1.0.1.tgz
deleted file mode 100644
index 9e7014d85abe48a54cb6b4e1ec032df9a2073034..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/cb-never-called-1.0.1.tgz and /dev/null differ
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/dir-normalization.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/dir-normalization.js
deleted file mode 100644
index 9719c42f3540018ca81c40aa4e80db9ebde1e041..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/dir-normalization.js
+++ /dev/null
@@ -1,177 +0,0 @@
-// Set the umask, so that it works the same everywhere.
-process.umask(parseInt('22', 8))
-
-var fs = require('fs')
-var path = require('path')
-
-var fstream = require('fstream')
-var test = require('tap').test
-
-var tar = require('../tar.js')
-var file = path.resolve(__dirname, 'dir-normalization.tar')
-var target = path.resolve(__dirname, 'tmp/dir-normalization-test')
-var ee = 0
-
-var expectEntries = [
-  { path: 'fixtures/',
-    mode: '755',
-    type: '5',
-    linkpath: ''
-  },
-  { path: 'fixtures/a/',
-    mode: '755',
-    type: '5',
-    linkpath: ''
-  },
-  { path: 'fixtures/the-chumbler',
-    mode: '755',
-    type: '2',
-    linkpath: path.resolve(target, 'a/b/c/d/the-chumbler'),
-  },
-  { path: 'fixtures/a/b/',
-    mode: '755',
-    type: '5',
-    linkpath: ''
-  },
-  { path: 'fixtures/a/x',
-    mode: '644',
-    type: '0',
-    linkpath: ''
-  },
-  { path: 'fixtures/a/b/c/',
-    mode: '755',
-    type: '5',
-    linkpath: ''
-  },
-  { path: 'fixtures/a/b/c/y',
-    mode: '755',
-    type: '2',
-    linkpath: '../../x',
-  }
-]
-
-var ef = 0
-var expectFiles = [
-  { path: '',
-    mode: '40755',
-    type: 'Directory',
-    depth: 0,
-    linkpath: undefined
-  },
-  { path: '/fixtures',
-    mode: '40755',
-    type: 'Directory',
-    depth: 1,
-    linkpath: undefined
-  },
-  { path: '/fixtures/a',
-    mode: '40755',
-    type: 'Directory',
-    depth: 2,
-    linkpath: undefined
-  },
-  { path: '/fixtures/a/b',
-    mode: '40755',
-    type: 'Directory',
-    depth: 3,
-    linkpath: undefined
-  },
-  { path: '/fixtures/a/b/c',
-    mode: '40755',
-    type: 'Directory',
-    depth: 4,
-    linkpath: undefined
-  },
-  { path: '/fixtures/a/b/c/y',
-    mode: '120755',
-    type: 'SymbolicLink',
-    depth: 5,
-    linkpath: '../../x'
-  },
-  { path: '/fixtures/a/x',
-    mode: '100644',
-    type: 'File',
-    depth: 3,
-    linkpath: undefined
-  },
-  { path: '/fixtures/the-chumbler',
-    mode: '120755',
-    type: 'SymbolicLink',
-    depth: 2,
-    linkpath: path.resolve(target, 'a/b/c/d/the-chumbler')
-  }
-]
-
-test('preclean', function (t) {
-  require('rimraf').sync(path.join(__dirname, '/tmp/dir-normalization-test'))
-  t.pass('cleaned!')
-  t.end()
-})
-
-test('extract test', function (t) {
-  var extract = tar.Extract(target)
-  var inp = fs.createReadStream(file)
-
-  inp.pipe(extract)
-
-  extract.on('end', function () {
-    t.equal(ee, expectEntries.length, 'should see ' + expectEntries.length + ' entries')
-
-    // should get no more entries after end
-    extract.removeAllListeners('entry')
-    extract.on('entry', function (e) {
-      t.fail('Should not get entries after end!')
-    })
-
-    next()
-  })
-
-  extract.on('entry', function (entry) {
-    var mode = entry.props.mode & (~parseInt('22', 8))
-    var found = {
-      path: entry.path,
-      mode: mode.toString(8),
-      type: entry.props.type,
-      linkpath: entry.props.linkpath,
-    }
-
-    var wanted = expectEntries[ee++]
-    t.equivalent(found, wanted, 'tar entry ' + ee + ' ' + (wanted && wanted.path))
-  })
-
-  function next () {
-    var r = fstream.Reader({
-      path: target,
-      type: 'Directory',
-      sort: 'alpha'
-    })
-
-    r.on('ready', function () {
-      foundEntry(r)
-    })
-
-    r.on('end', finish)
-
-    function foundEntry (entry) {
-      var p = entry.path.substr(target.length)
-      var mode = entry.props.mode & (~parseInt('22', 8))
-      var found = {
-        path: p,
-        mode: mode.toString(8),
-        type: entry.props.type,
-        depth: entry.props.depth,
-        linkpath: entry.props.linkpath
-      }
-
-      var wanted = expectFiles[ef++]
-      t.equivalent(found, wanted, 'unpacked file ' + ef + ' ' + (wanted && wanted.path))
-
-      entry.on('entry', foundEntry)
-    }
-
-    function finish () {
-      t.equal(ef, expectFiles.length, 'should have ' + ef + ' items')
-      t.end()
-    }
-  }
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/dir-normalization.tar b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/dir-normalization.tar
deleted file mode 100644
index 3c4845356cecb20939b415830a5fa9717fb91341..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/dir-normalization.tar and /dev/null differ
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/error-on-broken.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/error-on-broken.js
deleted file mode 100644
index e484920fd9625a6ab2d98c04febe767e796494f9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/error-on-broken.js
+++ /dev/null
@@ -1,33 +0,0 @@
-var fs = require('fs')
-var path = require('path')
-var zlib = require('zlib')
-
-var tap = require('tap')
-
-var tar = require('../tar.js')
-
-var file = path.join(__dirname, 'cb-never-called-1.0.1.tgz')
-var target = path.join(__dirname, 'tmp/extract-test')
-
-tap.test('preclean', function (t) {
-  require('rimraf').sync(__dirname + '/tmp/extract-test')
-  t.pass('cleaned!')
-  t.end()
-})
-
-tap.test('extract test', function (t) {
-  var extract = tar.Extract(target)
-  var inp = fs.createReadStream(file)
-
-  inp.pipe(zlib.createGunzip()).pipe(extract)
-
-  extract.on('error', function (er) {
-    t.equal(er.message, 'unexpected eof', 'error noticed')
-    t.end()
-  })
-
-  extract.on('end', function () {
-    t.fail('shouldn\'t reach this point due to errors')
-    t.end()
-  })
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/extract-move.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/extract-move.js
deleted file mode 100644
index 45400cd9bb818d1c9b1320618360598307ad1efb..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/extract-move.js
+++ /dev/null
@@ -1,132 +0,0 @@
-// Set the umask, so that it works the same everywhere.
-process.umask(parseInt('22', 8))
-
-var tap = require("tap")
-  , tar = require("../tar.js")
-  , fs = require("fs")
-  , gfs = require("graceful-fs")
-  , path = require("path")
-  , file = path.resolve(__dirname, "fixtures/dir.tar")
-  , target = path.resolve(__dirname, "tmp/extract-test")
-  , index = 0
-  , fstream = require("fstream")
-  , rimraf = require("rimraf")
-  , mkdirp = require("mkdirp")
-
-  , ee = 0
-  , expectEntries = [
-      {
-        "path" : "dir/",
-        "mode" : "750",
-        "type" : "5",
-        "depth" : undefined,
-        "size" : 0,
-        "linkpath" : "",
-        "nlink" : undefined,
-        "dev" : undefined,
-        "ino" : undefined
-      },
-      {
-        "path" : "dir/sub/",
-        "mode" : "750",
-        "type" : "5",
-        "depth" : undefined,
-        "size" : 0,
-        "linkpath" : "",
-        "nlink" : undefined,
-        "dev" : undefined,
-        "ino" : undefined
-      } ]
-
-function slow (fs, method, t1, t2) {
-  var orig = fs[method]
-  if (!orig) return null
-  fs[method] = function () {
-    var args = [].slice.call(arguments)
-    console.error("slow", method, args[0])
-    var cb = args.pop()
-
-    setTimeout(function () {
-      orig.apply(fs, args.concat(function(er, data) {
-        setTimeout(function() {
-          cb(er, data)
-        }, t2)
-      }))
-    }, t1)
-  }
-}
-
-// Make sure we get the graceful-fs that fstream is using.
-var gfs2
-try {
-  gfs2 = require("fstream/node_modules/graceful-fs")
-} catch (er) {}
-
-var slowMethods = ["chown", "chmod", "utimes", "lutimes"]
-slowMethods.forEach(function (method) {
-  var t1 = 500
-  var t2 = 0
-  slow(fs, method, t1, t2)
-  slow(gfs, method, t1, t2)
-  if (gfs2) {
-    slow(gfs2, method, t1, t2)
-  }
-})
-
-
-
-// The extract class basically just pipes the input
-// to a Reader, and then to a fstream.DirWriter
-
-// So, this is as much a test of fstream.Reader and fstream.Writer
-// as it is of tar.Extract, but it sort of makes sense.
-
-tap.test("preclean", function (t) {
-  rimraf.sync(target)
-  /mkdirp.sync(target)
-  t.pass("cleaned!")
-  t.end()
-})
-
-tap.test("extract test", function (t) {
-  var extract = tar.Extract(target)
-  var inp = fs.createReadStream(file)
-
-  // give it a weird buffer size to try to break in odd places
-  inp.bufferSize = 1234
-
-  inp.pipe(extract)
-
-  extract.on("end", function () {
-    rimraf.sync(target)
-
-    t.equal(ee, expectEntries.length, "should see "+ee+" entries")
-
-    // should get no more entries after end
-    extract.removeAllListeners("entry")
-    extract.on("entry", function (e) {
-      t.fail("Should not get entries after end!")
-    })
-
-    t.end()
-  })
-
-
-  extract.on("entry", function (entry) {
-    var found =
-      { path: entry.path
-      , mode: entry.props.mode.toString(8)
-      , type: entry.props.type
-      , depth: entry.props.depth
-      , size: entry.props.size
-      , linkpath: entry.props.linkpath
-      , nlink: entry.props.nlink
-      , dev: entry.props.dev
-      , ino: entry.props.ino
-      }
-
-    var wanted = expectEntries[ee ++]
-
-    t.equivalent(found, wanted, "tar entry " + ee + " " + wanted.path)
-  })
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/extract.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/extract.js
deleted file mode 100644
index eca4e7cc962db6caa4ec08936feab27b4eba7174..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/extract.js
+++ /dev/null
@@ -1,367 +0,0 @@
-// Set the umask, so that it works the same everywhere.
-process.umask(parseInt('22', 8))
-
-var tap = require("tap")
-  , tar = require("../tar.js")
-  , fs = require("fs")
-  , path = require("path")
-  , file = path.resolve(__dirname, "fixtures/c.tar")
-  , target = path.resolve(__dirname, "tmp/extract-test")
-  , index = 0
-  , fstream = require("fstream")
-
-  , ee = 0
-  , expectEntries =
-[ { path: 'c.txt',
-    mode: '644',
-    type: '0',
-    depth: undefined,
-    size: 513,
-    linkpath: '',
-    nlink: undefined,
-    dev: undefined,
-    ino: undefined },
-  { path: 'cc.txt',
-    mode: '644',
-    type: '0',
-    depth: undefined,
-    size: 513,
-    linkpath: '',
-    nlink: undefined,
-    dev: undefined,
-    ino: undefined },
-  { path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-    mode: '644',
-    type: '0',
-    depth: undefined,
-    size: 100,
-    linkpath: '',
-    nlink: undefined,
-    dev: undefined,
-    ino: undefined },
-  { path: 'Ω.txt',
-    mode: '644',
-    type: '0',
-    depth: undefined,
-    size: 2,
-    linkpath: '',
-    nlink: undefined,
-    dev: undefined,
-    ino: undefined },
-  { path: 'Ω.txt',
-    mode: '644',
-    type: '0',
-    depth: undefined,
-    size: 2,
-    linkpath: '',
-    nlink: 1,
-    dev: 234881026,
-    ino: 51693379 },
-  { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-    mode: '644',
-    type: '0',
-    depth: undefined,
-    size: 200,
-    linkpath: '',
-    nlink: 1,
-    dev: 234881026,
-    ino: 51681874 },
-  { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-    mode: '644',
-    type: '0',
-    depth: undefined,
-    size: 201,
-    linkpath: '',
-    nlink: undefined,
-    dev: undefined,
-    ino: undefined },
-  { path: '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL',
-    mode: '777',
-    type: '2',
-    depth: undefined,
-    size: 0,
-    linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-    nlink: undefined,
-    dev: undefined,
-    ino: undefined },
-  { path: '200-hard',
-    mode: '644',
-    type: '0',
-    depth: undefined,
-    size: 200,
-    linkpath: '',
-    nlink: 2,
-    dev: 234881026,
-    ino: 51681874 },
-  { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-    mode: '644',
-    type: '1',
-    depth: undefined,
-    size: 0,
-    linkpath: path.resolve(target, '200-hard'),
-    nlink: 2,
-    dev: 234881026,
-    ino: 51681874 } ]
-
-  , ef = 0
-  , expectFiles =
-[ { path: '',
-    mode: '40755',
-    type: 'Directory',
-    depth: 0,
-    linkpath: undefined },
-  { path: '/200-hard',
-    mode: '100644',
-    type: 'File',
-    depth: 1,
-    size: 200,
-    linkpath: undefined,
-    nlink: 2 },
-  { path: '/200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL',
-    mode: '120777',
-    type: 'SymbolicLink',
-    depth: 1,
-    size: 200,
-    linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-    nlink: 1 },
-  { path: '/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-    mode: '100644',
-    type: 'Link',
-    depth: 1,
-    size: 200,
-    linkpath: path.join(target, '200-hard'),
-    nlink: 2 },
-  { path: '/c.txt',
-    mode: '100644',
-    type: 'File',
-    depth: 1,
-    size: 513,
-    linkpath: undefined,
-    nlink: 1 },
-  { path: '/cc.txt',
-    mode: '100644',
-    type: 'File',
-    depth: 1,
-    size: 513,
-    linkpath: undefined,
-    nlink: 1 },
-  { path: '/r',
-    mode: '40755',
-    type: 'Directory',
-    depth: 1,
-    linkpath: undefined },
-  { path: '/r/e',
-    mode: '40755',
-    type: 'Directory',
-    depth: 2,
-    linkpath: undefined },
-  { path: '/r/e/a',
-    mode: '40755',
-    type: 'Directory',
-    depth: 3,
-    linkpath: undefined },
-  { path: '/r/e/a/l',
-    mode: '40755',
-    type: 'Directory',
-    depth: 4,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l',
-    mode: '40755',
-    type: 'Directory',
-    depth: 5,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y',
-    mode: '40755',
-    type: 'Directory',
-    depth: 6,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-',
-    mode: '40755',
-    type: 'Directory',
-    depth: 7,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d',
-    mode: '40755',
-    type: 'Directory',
-    depth: 8,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e',
-    mode: '40755',
-    type: 'Directory',
-    depth: 9,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e',
-    mode: '40755',
-    type: 'Directory',
-    depth: 10,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p',
-    mode: '40755',
-    type: 'Directory',
-    depth: 11,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-',
-    mode: '40755',
-    type: 'Directory',
-    depth: 12,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f',
-    mode: '40755',
-    type: 'Directory',
-    depth: 13,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o',
-    mode: '40755',
-    type: 'Directory',
-    depth: 14,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l',
-    mode: '40755',
-    type: 'Directory',
-    depth: 15,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d',
-    mode: '40755',
-    type: 'Directory',
-    depth: 16,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e',
-    mode: '40755',
-    type: 'Directory',
-    depth: 17,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r',
-    mode: '40755',
-    type: 'Directory',
-    depth: 18,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-',
-    mode: '40755',
-    type: 'Directory',
-    depth: 19,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p',
-    mode: '40755',
-    type: 'Directory',
-    depth: 20,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a',
-    mode: '40755',
-    type: 'Directory',
-    depth: 21,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t',
-    mode: '40755',
-    type: 'Directory',
-    depth: 22,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h',
-    mode: '40755',
-    type: 'Directory',
-    depth: 23,
-    linkpath: undefined },
-  { path: '/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-    mode: '100644',
-    type: 'File',
-    depth: 24,
-    size: 100,
-    linkpath: undefined,
-    nlink: 1 },
-  { path: '/Ω.txt',
-    mode: '100644',
-    type: 'File',
-    depth: 1,
-    size: 2,
-    linkpath: undefined,
-    nlink: 1 } ]
-
-
-
-// The extract class basically just pipes the input
-// to a Reader, and then to a fstream.DirWriter
-
-// So, this is as much a test of fstream.Reader and fstream.Writer
-// as it is of tar.Extract, but it sort of makes sense.
-
-tap.test("preclean", function (t) {
-  require("rimraf").sync(__dirname + "/tmp/extract-test")
-  t.pass("cleaned!")
-  t.end()
-})
-
-tap.test("extract test", function (t) {
-  var extract = tar.Extract(target)
-  var inp = fs.createReadStream(file)
-
-  // give it a weird buffer size to try to break in odd places
-  inp.bufferSize = 1234
-
-  inp.pipe(extract)
-
-  extract.on("end", function () {
-    t.equal(ee, expectEntries.length, "should see "+ee+" entries")
-
-    // should get no more entries after end
-    extract.removeAllListeners("entry")
-    extract.on("entry", function (e) {
-      t.fail("Should not get entries after end!")
-    })
-
-    next()
-  })
-
-  extract.on("entry", function (entry) {
-    var found =
-      { path: entry.path
-      , mode: entry.props.mode.toString(8)
-      , type: entry.props.type
-      , depth: entry.props.depth
-      , size: entry.props.size
-      , linkpath: entry.props.linkpath
-      , nlink: entry.props.nlink
-      , dev: entry.props.dev
-      , ino: entry.props.ino
-      }
-
-    var wanted = expectEntries[ee ++]
-
-    t.equivalent(found, wanted, "tar entry " + ee + " " + wanted.path)
-  })
-
-  function next () {
-    var r = fstream.Reader({ path: target
-                           , type: "Directory"
-                           // this is just to encourage consistency
-                           , sort: "alpha" })
-
-    r.on("ready", function () {
-      foundEntry(r)
-    })
-
-    r.on("end", finish)
-
-    function foundEntry (entry) {
-      var p = entry.path.substr(target.length)
-      var found =
-        { path: p
-        , mode: entry.props.mode.toString(8)
-        , type: entry.props.type
-        , depth: entry.props.depth
-        , size: entry.props.size
-        , linkpath: entry.props.linkpath
-        , nlink: entry.props.nlink
-        }
-
-      var wanted = expectFiles[ef ++]
-
-      t.has(found, wanted, "unpacked file " + ef + " " + wanted.path)
-
-      entry.on("entry", foundEntry)
-    }
-
-    function finish () {
-      t.equal(ef, expectFiles.length, "should have "+ef+" items")
-      t.end()
-    }
-  }
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/fixtures.tgz b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/fixtures.tgz
deleted file mode 100644
index f1676023afa2bba2aa18b5508c92f03e1d0816c6..0000000000000000000000000000000000000000
Binary files a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/fixtures.tgz and /dev/null differ
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/header.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/header.js
deleted file mode 100644
index 8ea6f79500de730d16ac379c60875f153a6537dc..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/header.js
+++ /dev/null
@@ -1,183 +0,0 @@
-var tap = require("tap")
-var TarHeader = require("../lib/header.js")
-var tar = require("../tar.js")
-var fs = require("fs")
-
-
-var headers =
-  { "a.txt file header":
-    [ "612e747874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303430312031313635313336303333332030313234353100203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
-    , { cksumValid: true
-      , path: 'a.txt'
-      , mode: 420
-      , uid: 24561
-      , gid: 20
-      , size: 257
-      , mtime: 1319493851
-      , cksum: 5417
-      , type: '0'
-      , linkpath: ''
-      , ustar: 'ustar\0'
-      , ustarver: '00'
-      , uname: 'isaacs'
-      , gname: 'staff'
-      , devmaj: 0
-      , devmin: 0
-      , fill: '' }
-    ]
-
-  , "omega pax": // the extended header from omega tar.
-    [ "5061784865616465722fcea92e74787400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303137302031313534333731303631312030313530353100207800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
-    , { cksumValid: true
-      , path: 'PaxHeader/Ω.txt'
-      , mode: 420
-      , uid: 24561
-      , gid: 20
-      , size: 120
-      , mtime: 1301254537
-      , cksum: 6697
-      , type: 'x'
-      , linkpath: ''
-      , ustar: 'ustar\0'
-      , ustarver: '00'
-      , uname: 'isaacs'
-      , gname: 'staff'
-      , devmaj: 0
-      , devmin: 0
-      , fill: '' } ]
-
-  , "omega file header":
-    [ "cea92e7478740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303030322031313534333731303631312030313330373200203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
-    , { cksumValid: true
-      , path: 'Ω.txt'
-      , mode: 420
-      , uid: 24561
-      , gid: 20
-      , size: 2
-      , mtime: 1301254537
-      , cksum: 5690
-      , type: '0'
-      , linkpath: ''
-      , ustar: 'ustar\0'
-      , ustarver: '00'
-      , uname: 'isaacs'
-      , gname: 'staff'
-      , devmaj: 0
-      , devmin: 0
-      , fill: '' } ]
-
-  , "foo.js file header":
-    [ "666f6f2e6a730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030303030342031313534333637303734312030313236313700203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
-    , { cksumValid: true
-      , path: 'foo.js'
-      , mode: 420
-      , uid: 24561
-      , gid: 20
-      , size: 4
-      , mtime: 1301246433
-      , cksum: 5519
-      , type: '0'
-      , linkpath: ''
-      , ustar: 'ustar\0'
-      , ustarver: '00'
-      , uname: 'isaacs'
-      , gname: 'staff'
-      , devmaj: 0
-      , devmin: 0
-      , fill: '' }
-    ]
-
-  , "b.txt file header":
-    [ "622e747874000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030303036343420003035373736312000303030303234200030303030303030313030302031313635313336303637372030313234363100203000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000757374617200303069736161637300000000000000000000000000000000000000000000000000007374616666000000000000000000000000000000000000000000000000000000303030303030200030303030303020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
-    , { cksumValid: true
-      , path: 'b.txt'
-      , mode: 420
-      , uid: 24561
-      , gid: 20
-      , size: 512
-      , mtime: 1319494079
-      , cksum: 5425
-      , type: '0'
-      , linkpath: ''
-      , ustar: 'ustar\0'
-      , ustarver: '00'
-      , uname: 'isaacs'
-      , gname: 'staff'
-      , devmaj: 0
-      , devmin: 0
-      , fill: '' }
-    ]
-
-  , "deep nested file":
-    [ "636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363633030303634342000303537373631200030303030323420003030303030303030313434203131363532313531353333203034333331340020300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000075737461720030306973616163730000000000000000000000000000000000000000000000000000737461666600000000000000000000000000000000000000000000000000000030303030303020003030303030302000722f652f612f6c2f6c2f792f2d2f642f652f652f702f2d2f662f6f2f6c2f642f652f722f2d2f702f612f742f680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
-    , { cksumValid: true,
-        path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'
-      , mode: 420
-      , uid: 24561
-      , gid: 20
-      , size: 100
-      , mtime: 1319687003
-      , cksum: 18124
-      , type: '0'
-      , linkpath: ''
-      , ustar: 'ustar\0'
-      , ustarver: '00'
-      , uname: 'isaacs'
-      , gname: 'staff'
-      , devmaj: 0
-      , devmin: 0
-      , fill: '' }
-    ]
-  }
-
-tap.test("parsing", function (t) {
-  Object.keys(headers).forEach(function (name) {
-    var h = headers[name]
-      , header = new Buffer(h[0], "hex")
-      , expect = h[1]
-      , parsed = new TarHeader(header)
-
-    // console.error(parsed)
-    t.has(parsed, expect, "parse " + name)
-  })
-  t.end()
-})
-
-tap.test("encoding", function (t) {
-  Object.keys(headers).forEach(function (name) {
-    var h = headers[name]
-      , expect = new Buffer(h[0], "hex")
-      , encoded = TarHeader.encode(h[1])
-
-    // might have slightly different bytes, since the standard
-    // isn't very strict, but should have the same semantics
-    // checkSum will be different, but cksumValid will be true
-
-    var th = new TarHeader(encoded)
-    delete h[1].block
-    delete h[1].needExtended
-    delete h[1].cksum
-    t.has(th, h[1], "fields "+name)
-  })
-  t.end()
-})
-
-// test these manually.  they're a bit rare to find in the wild
-tap.test("parseNumeric tests", function (t) {
-  var parseNumeric = TarHeader.parseNumeric
-    , numbers =
-      { "303737373737373700": 2097151
-      , "30373737373737373737373700": 8589934591
-      , "303030303036343400": 420
-      , "800000ffffffffffff": 281474976710655
-      , "ffffff000000000001": -281474976710654
-      , "ffffff000000000000": -281474976710655
-      , "800000000000200000": 2097152
-      , "8000000000001544c5": 1393861
-      , "ffffffffffff1544c5": -15383354 }
-  Object.keys(numbers).forEach(function (n) {
-    var b = new Buffer(n, "hex")
-    t.equal(parseNumeric(b), numbers[n], n + " === " + numbers[n])
-  })
-  t.end()
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/pack-no-proprietary.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/pack-no-proprietary.js
deleted file mode 100644
index d4b03a1fe936be0492da586b3476d4c7fc5b5a10..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/pack-no-proprietary.js
+++ /dev/null
@@ -1,886 +0,0 @@
-// This is exactly like test/pack.js, except that it's excluding
-// any proprietary headers.
-//
-// This loses some information about the filesystem, but creates
-// tarballs that are supported by more versions of tar, especially
-// old non-spec-compliant copies of gnutar.
-
-// the symlink file is excluded from git, because it makes
-// windows freak the hell out.
-var fs = require("fs")
-  , path = require("path")
-  , symlink = path.resolve(__dirname, "fixtures/symlink")
-try { fs.unlinkSync(symlink) } catch (e) {}
-fs.symlinkSync("./hardlink-1", symlink)
-process.on("exit", function () {
-  fs.unlinkSync(symlink)
-})
-
-var tap = require("tap")
-  , tar = require("../tar.js")
-  , pkg = require("../package.json")
-  , Pack = tar.Pack
-  , fstream = require("fstream")
-  , Reader = fstream.Reader
-  , Writer = fstream.Writer
-  , input = path.resolve(__dirname, "fixtures/")
-  , target = path.resolve(__dirname, "tmp/pack.tar")
-  , uid = process.getuid ? process.getuid() : 0
-  , gid = process.getgid ? process.getgid() : 0
-
-  , entries =
-
-    // the global header and root fixtures/ dir are going to get
-    // a different date each time, so omit that bit.
-    // Also, dev/ino values differ across machines, so that's not
-    // included.
-    [ [ 'entry',
-      { path: 'fixtures/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'extendedHeader',
-      { path: 'PaxHeader/fixtures/200cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        type: 'x',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' },
-      { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-        uid: uid,
-        gid: gid,
-        size: 200 } ]
-
-    , [ 'entry',
-      { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 200,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/a.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 257,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/b.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 512,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/c.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 513,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/cc.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 513,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/dir/',
-        mode: 488,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/dir/sub/',
-        mode: 488,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/foo.js',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 4,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/hardlink-1',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 200,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/hardlink-2',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '1',
-        linkpath: 'fixtures/hardlink-1',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/omega.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 2,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/packtest/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/packtest/omega.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 2,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/packtest/star.4.html',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 54081,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'extendedHeader',
-      { path: 'PaxHeader/fixtures/packtest/Ω.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        type: 'x',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' },
-      { path: 'fixtures/packtest/Ω.txt',
-        uid: uid,
-        gid: gid,
-        size: 2 } ]
-
-    , [ 'entry',
-      { path: 'fixtures/packtest/Ω.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 2,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 100,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/symlink',
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '2',
-        linkpath: 'hardlink-1',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'extendedHeader',
-      { path: 'PaxHeader/fixtures/Ω.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        type: 'x',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' },
-      { path: "fixtures/Ω.txt"
-      , uid: uid
-      , gid: gid
-      , size: 2 } ]
-
-    , [ 'entry',
-      { path: 'fixtures/Ω.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 2,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-    ]
-
-
-// first, make sure that the hardlinks are actually hardlinks, or this
-// won't work.  Git has a way of replacing them with a copy.
-var hard1 = path.resolve(__dirname, "fixtures/hardlink-1")
-  , hard2 = path.resolve(__dirname, "fixtures/hardlink-2")
-  , fs = require("fs")
-
-try { fs.unlinkSync(hard2) } catch (e) {}
-fs.linkSync(hard1, hard2)
-
-tap.test("with global header", { timeout: 10000 }, function (t) {
-  runTest(t, true)
-})
-
-tap.test("without global header", { timeout: 10000 }, function (t) {
-  runTest(t, false)
-})
-
-function alphasort (a, b) {
-  return a === b ? 0
-       : a.toLowerCase() > b.toLowerCase() ? 1
-       : a.toLowerCase() < b.toLowerCase() ? -1
-       : a > b ? 1
-       : -1
-}
-
-
-function runTest (t, doGH) {
-  var reader = Reader({ path: input
-                      , filter: function () {
-                          return !this.path.match(/\.(tar|hex)$/)
-                        }
-                      , sort: alphasort
-                      })
-
-  var props = doGH ? pkg : {}
-  props.noProprietary = true
-  var pack = Pack(props)
-  var writer = Writer(target)
-
-  // global header should be skipped regardless, since it has no content.
-  var entry = 0
-
-  t.ok(reader, "reader ok")
-  t.ok(pack, "pack ok")
-  t.ok(writer, "writer ok")
-
-  pack.pipe(writer)
-
-  var parse = tar.Parse()
-  t.ok(parse, "parser should be ok")
-
-  pack.on("data", function (c) {
-    // console.error("PACK DATA")
-    if (c.length !== 512) {
-      // this one is too noisy, only assert if it'll be relevant
-      t.equal(c.length, 512, "parser should emit data in 512byte blocks")
-    }
-    parse.write(c)
-  })
-
-  pack.on("end", function () {
-    // console.error("PACK END")
-    t.pass("parser ends")
-    parse.end()
-  })
-
-  pack.on("error", function (er) {
-    t.fail("pack error", er)
-  })
-
-  parse.on("error", function (er) {
-    t.fail("parse error", er)
-  })
-
-  writer.on("error", function (er) {
-    t.fail("writer error", er)
-  })
-
-  reader.on("error", function (er) {
-    t.fail("reader error", er)
-  })
-
-  parse.on("*", function (ev, e) {
-    var wanted = entries[entry++]
-    if (!wanted) {
-      t.fail("unexpected event: "+ev)
-      return
-    }
-    t.equal(ev, wanted[0], "event type should be "+wanted[0])
-
-    if (ev !== wanted[0] || e.path !== wanted[1].path) {
-      console.error("wanted", wanted)
-      console.error([ev, e.props])
-      e.on("end", function () {
-        console.error(e.fields)
-        throw "break"
-      })
-    }
-
-    t.has(e.props, wanted[1], "properties "+wanted[1].path)
-    if (wanted[2]) {
-      e.on("end", function () {
-        if (!e.fields) {
-          t.ok(e.fields, "should get fields")
-        } else {
-          t.has(e.fields, wanted[2], "should get expected fields")
-        }
-      })
-    }
-  })
-
-  reader.pipe(pack)
-
-  writer.on("close", function () {
-    t.equal(entry, entries.length, "should get all expected entries")
-    t.pass("it finished")
-    t.end()
-  })
-
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/pack.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/pack.js
deleted file mode 100644
index 0f16c07bb0162e9dfbfad0cec313bcf8ed2e2901..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/pack.js
+++ /dev/null
@@ -1,952 +0,0 @@
-
-// the symlink file is excluded from git, because it makes
-// windows freak the hell out.
-var fs = require("fs")
-  , path = require("path")
-  , symlink = path.resolve(__dirname, "fixtures/symlink")
-try { fs.unlinkSync(symlink) } catch (e) {}
-fs.symlinkSync("./hardlink-1", symlink)
-process.on("exit", function () {
-  fs.unlinkSync(symlink)
-})
-
-
-var tap = require("tap")
-  , tar = require("../tar.js")
-  , pkg = require("../package.json")
-  , Pack = tar.Pack
-  , fstream = require("fstream")
-  , Reader = fstream.Reader
-  , Writer = fstream.Writer
-  , input = path.resolve(__dirname, "fixtures/")
-  , target = path.resolve(__dirname, "tmp/pack.tar")
-  , uid = process.getuid ? process.getuid() : 0
-  , gid = process.getgid ? process.getgid() : 0
-
-  , entries =
-
-    // the global header and root fixtures/ dir are going to get
-    // a different date each time, so omit that bit.
-    // Also, dev/ino values differ across machines, so that's not
-    // included.
-    [ [ 'globalExtendedHeader',
-      { path: 'PaxHeader/',
-        mode: 438,
-        uid: 0,
-        gid: 0,
-        type: 'g',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' },
-      { "NODETAR.author": pkg.author,
-        "NODETAR.name": pkg.name,
-        "NODETAR.description": pkg.description,
-        "NODETAR.version": pkg.version,
-        "NODETAR.repository.type": pkg.repository.type,
-        "NODETAR.repository.url": pkg.repository.url,
-        "NODETAR.main": pkg.main,
-        "NODETAR.scripts.test": pkg.scripts.test } ]
-
-    , [ 'entry',
-      { path: 'fixtures/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'extendedHeader',
-      { path: 'PaxHeader/fixtures/200cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        type: 'x',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' },
-      { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-        'NODETAR.depth': '1',
-        'NODETAR.type': 'File',
-        nlink: 1,
-        uid: uid,
-        gid: gid,
-        size: 200,
-        'NODETAR.blksize': '4096',
-        'NODETAR.blocks': '8' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 200,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '',
-        'NODETAR.depth': '1',
-        'NODETAR.type': 'File',
-        nlink: 1,
-        'NODETAR.blksize': '4096',
-        'NODETAR.blocks': '8' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/a.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 257,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/b.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 512,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/c.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 513,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/cc.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 513,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/dir/',
-        mode: 488,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/dir/sub/',
-        mode: 488,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-
-    , [ 'entry',
-      { path: 'fixtures/foo.js',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 4,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/hardlink-1',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 200,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/hardlink-2',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '1',
-        linkpath: 'fixtures/hardlink-1',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/omega.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 2,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/packtest/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/packtest/omega.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 2,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/packtest/star.4.html',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 54081,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'extendedHeader',
-      { path: 'PaxHeader/fixtures/packtest/Ω.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        type: 'x',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' },
-      { path: 'fixtures/packtest/Ω.txt',
-        'NODETAR.depth': '2',
-        'NODETAR.type': 'File',
-        nlink: 1,
-        uid: uid,
-        gid: gid,
-        size: 2,
-        'NODETAR.blksize': '4096',
-        'NODETAR.blocks': '8' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/packtest/Ω.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 2,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '',
-        'NODETAR.depth': '2',
-        'NODETAR.type': 'File',
-        nlink: 1,
-        'NODETAR.blksize': '4096',
-        'NODETAR.blocks': '8' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/',
-        mode: 493,
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '5',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 100,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'entry',
-      { path: 'fixtures/symlink',
-        uid: uid,
-        gid: gid,
-        size: 0,
-        type: '2',
-        linkpath: 'hardlink-1',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' } ]
-
-    , [ 'extendedHeader',
-      { path: 'PaxHeader/fixtures/Ω.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        type: 'x',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '' },
-      { path: "fixtures/Ω.txt"
-      , "NODETAR.depth": "1"
-      , "NODETAR.type": "File"
-      , nlink: 1
-      , uid: uid
-      , gid: gid
-      , size: 2
-      , "NODETAR.blksize": "4096"
-      , "NODETAR.blocks": "8" } ]
-
-    , [ 'entry',
-      { path: 'fixtures/Ω.txt',
-        mode: 420,
-        uid: uid,
-        gid: gid,
-        size: 2,
-        type: '0',
-        linkpath: '',
-        ustar: 'ustar\u0000',
-        ustarver: '00',
-        uname: '',
-        gname: '',
-        devmaj: 0,
-        devmin: 0,
-        fill: '',
-        'NODETAR.depth': '1',
-        'NODETAR.type': 'File',
-        nlink: 1,
-        'NODETAR.blksize': '4096',
-        'NODETAR.blocks': '8' } ]
-    ]
-
-
-// first, make sure that the hardlinks are actually hardlinks, or this
-// won't work.  Git has a way of replacing them with a copy.
-var hard1 = path.resolve(__dirname, "fixtures/hardlink-1")
-  , hard2 = path.resolve(__dirname, "fixtures/hardlink-2")
-  , fs = require("fs")
-
-try { fs.unlinkSync(hard2) } catch (e) {}
-fs.linkSync(hard1, hard2)
-
-tap.test("with global header", { timeout: 10000 }, function (t) {
-  runTest(t, true)
-})
-
-tap.test("without global header", { timeout: 10000 }, function (t) {
-  runTest(t, false)
-})
-
-tap.test("with from base", { timeout: 10000 }, function (t) {
-  runTest(t, true, true)
-})
-
-function alphasort (a, b) {
-  return a === b ? 0
-       : a.toLowerCase() > b.toLowerCase() ? 1
-       : a.toLowerCase() < b.toLowerCase() ? -1
-       : a > b ? 1
-       : -1
-}
-
-
-function runTest (t, doGH, doFromBase) {
-  var reader = Reader({ path: input
-                      , filter: function () {
-                          return !this.path.match(/\.(tar|hex)$/)
-                        }
-                      , sort: alphasort
-                      })
-
-  var props = doGH ? pkg : {}
-  if(doFromBase) props.fromBase = true;
-
-  var pack = Pack(props)
-  var writer = Writer(target)
-
-  // skip the global header if we're not doing that.
-  var entry = doGH ? 0 : 1
-
-  t.ok(reader, "reader ok")
-  t.ok(pack, "pack ok")
-  t.ok(writer, "writer ok")
-
-  pack.pipe(writer)
-
-  var parse = tar.Parse()
-  t.ok(parse, "parser should be ok")
-
-  pack.on("data", function (c) {
-    // console.error("PACK DATA")
-    if (c.length !== 512) {
-      // this one is too noisy, only assert if it'll be relevant
-      t.equal(c.length, 512, "parser should emit data in 512byte blocks")
-    }
-    parse.write(c)
-  })
-
-  pack.on("end", function () {
-    // console.error("PACK END")
-    t.pass("parser ends")
-    parse.end()
-  })
-
-  pack.on("error", function (er) {
-    t.fail("pack error", er)
-  })
-
-  parse.on("error", function (er) {
-    t.fail("parse error", er)
-  })
-
-  writer.on("error", function (er) {
-    t.fail("writer error", er)
-  })
-
-  reader.on("error", function (er) {
-    t.fail("reader error", er)
-  })
-
-  parse.on("*", function (ev, e) {
-    var wanted = entries[entry++]
-    if (!wanted) {
-      t.fail("unexpected event: "+ev)
-      return
-    }
-    t.equal(ev, wanted[0], "event type should be "+wanted[0])
-
-    if(doFromBase) {
-      if(wanted[1].path.indexOf('fixtures/') && wanted[1].path.length == 100)
-        wanted[1].path = wanted[1].path.replace('fixtures/', '') + 'ccccccccc'
-
-      if(wanted[1]) wanted[1].path = wanted[1].path.replace('fixtures/', '').replace('//', '/')
-      if(wanted[1].path == '') wanted[1].path = '/'
-      if(wanted[2] && wanted[2].path) wanted[2].path = wanted[2].path.replace('fixtures', '').replace(/^\//, '')
-
-      wanted[1].linkpath = wanted[1].linkpath.replace('fixtures/', '')
-    }
-
-    if (ev !== wanted[0] || e.path !== wanted[1].path) {
-      console.error("wanted", wanted)
-      console.error([ev, e.props])
-      e.on("end", function () {
-        console.error(e.fields)
-        throw "break"
-      })
-    }
-
-
-    t.has(e.props, wanted[1], "properties "+wanted[1].path)
-    if (wanted[2]) {
-      e.on("end", function () {
-        if (!e.fields) {
-          t.ok(e.fields, "should get fields")
-        } else {
-          t.has(e.fields, wanted[2], "should get expected fields")
-        }
-      })
-    }
-  })
-
-  reader.pipe(pack)
-
-  writer.on("close", function () {
-    t.equal(entry, entries.length, "should get all expected entries")
-    t.pass("it finished")
-    t.end()
-  })
-
-}
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/parse-discard.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/parse-discard.js
deleted file mode 100644
index da01a65ccc7d7d2a1a05c5146a432eeb2f3e78be..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/parse-discard.js
+++ /dev/null
@@ -1,29 +0,0 @@
-var tap = require("tap")
-  , tar = require("../tar.js")
-  , fs = require("fs")
-  , path = require("path")
-  , file = path.resolve(__dirname, "fixtures/c.tar")
-
-tap.test("parser test", function (t) {
-  var parser = tar.Parse()
-  var total = 0
-  var dataTotal = 0
-
-  parser.on("end", function () {
-
-    t.equals(total-513,dataTotal,'should have discarded only c.txt')
-
-    t.end()
-  })
-
-  fs.createReadStream(file)
-    .pipe(parser)
-    .on('entry',function(entry){
-      if(entry.path === 'c.txt') entry.abort()
-      
-      total += entry.size;
-      entry.on('data',function(data){
-        dataTotal += data.length        
-      })
-    })
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/parse.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/parse.js
deleted file mode 100644
index f765a50129bff1e8f135efe0f2a51bcbc56bc229..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/parse.js
+++ /dev/null
@@ -1,359 +0,0 @@
-var tap = require("tap")
-  , tar = require("../tar.js")
-  , fs = require("fs")
-  , path = require("path")
-  , file = path.resolve(__dirname, "fixtures/c.tar")
-  , index = 0
-
-  , expect =
-[ [ 'entry',
-    { path: 'c.txt',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 513,
-      mtime: new Date('Wed, 26 Oct 2011 01:10:58 GMT'),
-      cksum: 5422,
-      type: '0',
-      linkpath: '',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '' },
-    undefined ],
-  [ 'entry',
-    { path: 'cc.txt',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 513,
-      mtime: new Date('Wed, 26 Oct 2011 01:11:02 GMT'),
-      cksum: 5525,
-      type: '0',
-      linkpath: '',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '' },
-    undefined ],
-  [ 'entry',
-    { path: 'r/e/a/l/l/y/-/d/e/e/p/-/f/o/l/d/e/r/-/p/a/t/h/cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 100,
-      mtime: new Date('Thu, 27 Oct 2011 03:43:23 GMT'),
-      cksum: 18124,
-      type: '0',
-      linkpath: '',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '' },
-    undefined ],
-  [ 'entry',
-    { path: 'Ω.txt',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 2,
-      mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'),
-      cksum: 5695,
-      type: '0',
-      linkpath: '',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '' },
-    undefined ],
-  [ 'extendedHeader',
-    { path: 'PaxHeader/Ω.txt',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 120,
-      mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'),
-      cksum: 6702,
-      type: 'x',
-      linkpath: '',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '' },
-    { path: 'Ω.txt',
-      ctime: 1319737909,
-      atime: 1319739061,
-      dev: 234881026,
-      ino: 51693379,
-      nlink: 1 } ],
-  [ 'entry',
-    { path: 'Ω.txt',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 2,
-      mtime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'),
-      cksum: 5695,
-      type: '0',
-      linkpath: '',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '',
-      ctime: new Date('Thu, 27 Oct 2011 17:51:49 GMT'),
-      atime: new Date('Thu, 27 Oct 2011 18:11:01 GMT'),
-      dev: 234881026,
-      ino: 51693379,
-      nlink: 1 },
-    undefined ],
-  [ 'extendedHeader',
-    { path: 'PaxHeader/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 353,
-      mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'),
-      cksum: 14488,
-      type: 'x',
-      linkpath: '',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '' },
-    { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-      ctime: 1319686868,
-      atime: 1319741254,
-      'LIBARCHIVE.creationtime': '1319686852',
-      dev: 234881026,
-      ino: 51681874,
-      nlink: 1 } ],
-  [ 'entry',
-    { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 200,
-      mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'),
-      cksum: 14570,
-      type: '0',
-      linkpath: '',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '',
-      ctime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'),
-      atime: new Date('Thu, 27 Oct 2011 18:47:34 GMT'),
-      'LIBARCHIVE.creationtime': '1319686852',
-      dev: 234881026,
-      ino: 51681874,
-      nlink: 1 },
-    undefined ],
-  [ 'longPath',
-    { path: '././@LongLink',
-      mode: 0,
-      uid: 0,
-      gid: 0,
-      size: 201,
-      mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'),
-      cksum: 4976,
-      type: 'L',
-      linkpath: '',
-      ustar: false },
-    '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' ],
-  [ 'entry',
-    { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-      mode: 420,
-      uid: 1000,
-      gid: 1000,
-      size: 201,
-      mtime: new Date('Thu, 27 Oct 2011 22:21:50 GMT'),
-      cksum: 14086,
-      type: '0',
-      linkpath: '',
-      ustar: false },
-    undefined ],
-  [ 'longLinkpath',
-    { path: '././@LongLink',
-      mode: 0,
-      uid: 0,
-      gid: 0,
-      size: 201,
-      mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'),
-      cksum: 4975,
-      type: 'K',
-      linkpath: '',
-      ustar: false },
-    '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc' ],
-  [ 'longPath',
-    { path: '././@LongLink',
-      mode: 0,
-      uid: 0,
-      gid: 0,
-      size: 201,
-      mtime: new Date('Thu, 01 Jan 1970 00:00:00 GMT'),
-      cksum: 4976,
-      type: 'L',
-      linkpath: '',
-      ustar: false },
-    '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL' ],
-  [ 'entry',
-    { path: '200LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL',
-      mode: 511,
-      uid: 1000,
-      gid: 1000,
-      size: 0,
-      mtime: new Date('Fri, 28 Oct 2011 23:05:17 GMT'),
-      cksum: 21603,
-      type: '2',
-      linkpath: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-      ustar: false },
-    undefined ],
-  [ 'extendedHeader',
-    { path: 'PaxHeader/200-hard',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 143,
-      mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'),
-      cksum: 6533,
-      type: 'x',
-      linkpath: '',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '' },
-    { ctime: 1320617144,
-      atime: 1320617232,
-      'LIBARCHIVE.creationtime': '1319686852',
-      dev: 234881026,
-      ino: 51681874,
-      nlink: 2 } ],
-  [ 'entry',
-    { path: '200-hard',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 200,
-      mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'),
-      cksum: 5526,
-      type: '0',
-      linkpath: '',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '',
-      ctime: new Date('Sun, 06 Nov 2011 22:05:44 GMT'),
-      atime: new Date('Sun, 06 Nov 2011 22:07:12 GMT'),
-      'LIBARCHIVE.creationtime': '1319686852',
-      dev: 234881026,
-      ino: 51681874,
-      nlink: 2 },
-    undefined ],
-  [ 'extendedHeader',
-    { path: 'PaxHeader/200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 353,
-      mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'),
-      cksum: 14488,
-      type: 'x',
-      linkpath: '',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '' },
-    { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-      ctime: 1320617144,
-      atime: 1320617406,
-      'LIBARCHIVE.creationtime': '1319686852',
-      dev: 234881026,
-      ino: 51681874,
-      nlink: 2 } ],
-  [ 'entry',
-    { path: '200ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc',
-      mode: 420,
-      uid: 24561,
-      gid: 20,
-      size: 0,
-      mtime: new Date('Thu, 27 Oct 2011 03:41:08 GMT'),
-      cksum: 15173,
-      type: '1',
-      linkpath: '200-hard',
-      ustar: 'ustar\0',
-      ustarver: '00',
-      uname: 'isaacs',
-      gname: 'staff',
-      devmaj: 0,
-      devmin: 0,
-      fill: '',
-      ctime: new Date('Sun, 06 Nov 2011 22:05:44 GMT'),
-      atime: new Date('Sun, 06 Nov 2011 22:10:06 GMT'),
-      'LIBARCHIVE.creationtime': '1319686852',
-      dev: 234881026,
-      ino: 51681874,
-      nlink: 2 },
-    undefined ] ]
-
-
-tap.test("parser test", function (t) {
-  var parser = tar.Parse()
-
-  parser.on("end", function () {
-    t.equal(index, expect.length, "saw all expected events")
-    t.end()
-  })
-
-  fs.createReadStream(file)
-    .pipe(parser)
-    .on("*", function (ev, entry) {
-      var wanted = expect[index]
-      if (!wanted) {
-        return t.fail("Unexpected event: " + ev)
-      }
-      var result = [ev, entry.props]
-      entry.on("end", function () {
-        result.push(entry.fields || entry.body)
-
-        t.equal(ev, wanted[0], index + " event type")
-        t.equivalent(entry.props, wanted[1], wanted[1].path + " entry properties")
-        if (wanted[2]) {
-          t.equivalent(result[2], wanted[2], "metadata values")
-        }
-        index ++
-      })
-    })
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/zz-cleanup.js b/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/zz-cleanup.js
deleted file mode 100644
index a00ff7faa03906c3a8a852a5b9867b098add560f..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/node_modules/tar/test/zz-cleanup.js
+++ /dev/null
@@ -1,20 +0,0 @@
-// clean up the fixtures
-
-var tap = require("tap")
-, rimraf = require("rimraf")
-, test = tap.test
-, path = require("path")
-
-test("clean fixtures", function (t) {
-  rimraf(path.resolve(__dirname, "fixtures"), function (er) {
-    t.ifError(er, "rimraf ./fixtures/")
-    t.end()
-  })
-})
-
-test("clean tmp", function (t) {
-  rimraf(path.resolve(__dirname, "tmp"), function (er) {
-    t.ifError(er, "rimraf ./tmp/")
-    t.end()
-  })
-})
diff --git a/js/node_modules/serialport/node_modules/node-pre-gyp/package.json b/js/node_modules/serialport/node_modules/node-pre-gyp/package.json
deleted file mode 100644
index 23c89aa530bcea0cf723207de58e1f5303fcbd50..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/node_modules/node-pre-gyp/package.json
+++ /dev/null
@@ -1,114 +0,0 @@
-{
-  "_from": "node-pre-gyp@>=0.6.26 <0.7.0",
-  "_id": "node-pre-gyp@0.6.29",
-  "_location": "/serialport/node-pre-gyp",
-  "_nodeVersion": "4.4.5",
-  "_npmOperationalInternal": {
-    "host": "packages-12-west.internal.npmjs.com",
-    "tmp": "tmp/node-pre-gyp-0.6.29.tgz_1467142616046_0.945712324930355"
-  },
-  "_npmUser": {
-    "email": "dane@mapbox.com",
-    "name": "springmeyer"
-  },
-  "_npmVersion": "2.15.5",
-  "_phantomChildren": {
-    "commander": "2.9.0",
-    "debug": "2.2.0"
-  },
-  "_requiredBy": [
-    "/serialport"
-  ],
-  "_resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.29.tgz",
-  "_shasum": "b0bd13635baf7d1be7ae233c16fbcf3309acd37c",
-  "_shrinkwrap": null,
-  "author": {
-    "email": "dane@mapbox.com",
-    "name": "Dane Springmeyer"
-  },
-  "bin": {
-    "node-pre-gyp": "./bin/node-pre-gyp"
-  },
-  "bugs": {
-    "url": "https://github.com/mapbox/node-pre-gyp/issues"
-  },
-  "dependencies": {
-    "mkdirp": "~0.5.0",
-    "nopt": "~3.0.1",
-    "npmlog": "~3.1.2",
-    "rc": "~1.1.0",
-    "request": "2.x",
-    "rimraf": "~2.5.0",
-    "semver": "~5.2.0",
-    "tar": "~2.2.0",
-    "tar-pack": "~3.1.0"
-  },
-  "description": "Node.js native addon binary install tool",
-  "devDependencies": {
-    "aws-sdk": "2.x",
-    "jshint": "2.x",
-    "mocha": "2.x",
-    "retire": "1.x"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "b0bd13635baf7d1be7ae233c16fbcf3309acd37c",
-    "tarball": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.29.tgz"
-  },
-  "gitHead": "3733536bf8947ee9dd18c8d46b0f964f0e41db8e",
-  "homepage": "https://github.com/mapbox/node-pre-gyp#readme",
-  "jshintConfig": {
-    "globalstrict": true,
-    "mocha": true,
-    "noarg": true,
-    "node": true,
-    "undef": true,
-    "unused": true
-  },
-  "keywords": [
-    "addon",
-    "binary",
-    "bindings",
-    "c",
-    "c++",
-    "module",
-    "native"
-  ],
-  "license": "BSD-3-Clause",
-  "main": "./lib/node-pre-gyp.js",
-  "maintainers": [
-    {
-      "name": "springmeyer",
-      "email": "dane@dbsgeo.com"
-    },
-    {
-      "name": "bergwerkgis",
-      "email": "wb@bergwerk-gis.at"
-    },
-    {
-      "name": "mikemorris",
-      "email": "michael.patrick.morris@gmail.com"
-    },
-    {
-      "name": "kkaefer",
-      "email": "kkaefer@gmail.com"
-    },
-    {
-      "name": "yhahn",
-      "email": "young@developmentseed.org"
-    }
-  ],
-  "name": "node-pre-gyp",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/mapbox/node-pre-gyp.git"
-  },
-  "scripts": {
-    "prepublish": "retire -n && npm ls && jshint test/build.test.js test/s3_setup.test.js test/versioning.test.js",
-    "test": "jshint lib lib/util scripts bin/node-pre-gyp && mocha -R spec --timeout 500000",
-    "update-crosswalk": "node scripts/abi_crosswalk.js"
-  },
-  "version": "0.6.29"
-}
diff --git a/js/node_modules/serialport/package.json b/js/node_modules/serialport/package.json
deleted file mode 100644
index 01a3e58a497a31ac128ff1e13bcb537bb44c817c..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/package.json
+++ /dev/null
@@ -1,145 +0,0 @@
-{
-  "_args": [
-    [
-      "serialport",
-      "/home/neilg/git/fab/projects/mods/projects/mods/js"
-    ]
-  ],
-  "_from": "serialport@latest",
-  "_id": "serialport@4.0.1",
-  "_inCache": true,
-  "_installable": true,
-  "_location": "/serialport",
-  "_nodeVersion": "0.12.7",
-  "_npmOperationalInternal": {
-    "host": "packages-16-east.internal.npmjs.com",
-    "tmp": "tmp/serialport-4.0.1.tgz_1468120169833_0.3944826261140406"
-  },
-  "_npmUser": {
-    "email": "wizard@roborooter.com",
-    "name": "reconbot"
-  },
-  "_npmVersion": "2.15.6",
-  "_phantomChildren": {
-    "commander": "2.9.0",
-    "debug": "2.2.0"
-  },
-  "_requested": {
-    "name": "serialport",
-    "raw": "serialport",
-    "rawSpec": "",
-    "scope": null,
-    "spec": "latest",
-    "type": "tag"
-  },
-  "_requiredBy": [
-    "#USER"
-  ],
-  "_resolved": "https://registry.npmjs.org/serialport/-/serialport-4.0.1.tgz",
-  "_shasum": "1638324114c67a36bd79157d92afdcb3e9d0d3be",
-  "_shrinkwrap": null,
-  "_spec": "serialport",
-  "_where": "/home/neilg/git/fab/projects/mods/projects/mods/js",
-  "author": {
-    "email": "voodootikigod@gmail.com",
-    "name": "Chris Williams",
-    "url": "http://www.voodootikigod.com"
-  },
-  "bin": {
-    "serialport-list": "./bin/serialport-list.js",
-    "serialport-term": "./bin/serialport-terminal.js"
-  },
-  "binary": {
-    "host": "https://github.com/EmergingTechnologyAdvisors/node-serialport/releases/download/4.0.1",
-    "module_name": "serialport",
-    "module_path": "build/{configuration}/"
-  },
-  "bugs": {
-    "url": "https://github.com/EmergingTechnologyAdvisors/node-serialport/issues"
-  },
-  "bundleDependencies": [
-    "node-pre-gyp"
-  ],
-  "dependencies": {
-    "bindings": "1.2.1",
-    "commander": "^2.9.0",
-    "debug": "^2.1.1",
-    "es6-promise": "^3.2.1",
-    "nan": "^2.3.5",
-    "node-pre-gyp": "^0.6.26",
-    "object.assign": "^4.0.3"
-  },
-  "description": "Node.js package to access serial ports. Welcome your robotic javascript overlords. Better yet, program them!",
-  "devDependencies": {
-    "chai": "^3.5.0",
-    "chai-subset": "^1.2.2",
-    "coveralls": "^2.11.9",
-    "eslint-config-standard": "^5.1.0",
-    "eslint-plugin-promise": "^1.1.0",
-    "eslint-plugin-standard": "^1.3.2",
-    "grunt": "^1.0.0",
-    "grunt-mocha-test": "^0.12.7",
-    "gruntify-eslint": "^2.0.0",
-    "mocha": "^2.4.5",
-    "node-pre-gyp-github": "^1.1.2",
-    "nyc": "^6.4.4",
-    "sandboxed-module": "^2.0.3",
-    "sinon": "^1.17.3",
-    "sinon-chai": "^2.8.0"
-  },
-  "directories": {},
-  "dist": {
-    "shasum": "1638324114c67a36bd79157d92afdcb3e9d0d3be",
-    "tarball": "https://registry.npmjs.org/serialport/-/serialport-4.0.1.tgz"
-  },
-  "engines": {
-    "node": ">= 0.10.0"
-  },
-  "gitHead": "bf7801c99b63d0aed11f2d43bba77d5e1a38e009",
-  "gypfile": true,
-  "homepage": "https://github.com/EmergingTechnologyAdvisors/node-serialport#readme",
-  "keywords": [
-    "hardware",
-    "iot",
-    "johnny-five",
-    "nodebots",
-    "serial port",
-    "serialport"
-  ],
-  "license": "MIT",
-  "main": "./lib/serialport",
-  "maintainers": [
-    {
-      "name": "jjrosent",
-      "email": "jakerosenthal@gmail.com"
-    },
-    {
-      "name": "reconbot",
-      "email": "wizard@roborooter.com"
-    },
-    {
-      "name": "voodootikigod",
-      "email": "voodootikigod@gmail.com"
-    }
-  ],
-  "name": "serialport",
-  "optionalDependencies": {},
-  "readme": "ERROR: No README data found!",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/EmergingTechnologyAdvisors/node-serialport.git"
-  },
-  "scripts": {
-    "coverage": "nyc report --reporter=text-lcov | coveralls",
-    "grunt": "grunt",
-    "gyp-rebuild": "node-gyp rebuild",
-    "install": "node-pre-gyp install --fallback-to-build",
-    "integration": "mocha test/arduinoTest/integration.js test/integration-lite.js",
-    "lint": "grunt --verbose lint",
-    "rebuild-all": "npm rebuild && node-gyp rebuild",
-    "stress": "mocha --no-timeouts test/arduinoTest/stress.js",
-    "test": "nyc grunt --verbose test",
-    "valgrind": "valgrind --leak-check=full --show-possibly-lost=no node --expose-gc --trace-gc node_modules/.bin/grunt test"
-  },
-  "version": "4.0.1"
-}
diff --git a/js/node_modules/serialport/src/serialport.cpp b/js/node_modules/serialport/src/serialport.cpp
deleted file mode 100644
index 33acf82191399c4c80498ef137791c9f0e11ac42..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/serialport.cpp
+++ /dev/null
@@ -1,683 +0,0 @@
-#include "./serialport.h"
-
-#ifdef WIN32
-#define strncasecmp strnicmp
-#else
-#include "./serialport_poller.h"
-#endif
-
-struct _WriteQueue {
-  const int _fd;  // the fd that is associated with this write queue
-  QueuedWrite _write_queue;
-  uv_mutex_t _write_queue_mutex;
-  _WriteQueue *_next;
-
-  _WriteQueue(const int fd) : _fd(fd), _write_queue(), _next(NULL) {
-    uv_mutex_init(&_write_queue_mutex);
-  }
-
-  void lock() { uv_mutex_lock(&_write_queue_mutex); }
-  void unlock() { uv_mutex_unlock(&_write_queue_mutex); }
-
-  QueuedWrite &get() { return _write_queue; }
-};
-
-static _WriteQueue *write_queues = NULL;
-
-static _WriteQueue *qForFD(const int fd) {
-  _WriteQueue *q = write_queues;
-  while (q != NULL) {
-    if (q->_fd == fd) {
-      return q;
-    }
-    q = q->_next;
-  }
-  return NULL;
-}
-
-static _WriteQueue *newQForFD(const int fd) {
-  _WriteQueue *q = qForFD(fd);
-
-  if (q == NULL) {
-    if (write_queues == NULL) {
-      write_queues = new _WriteQueue(fd);
-      return write_queues;
-    } else {
-      q = write_queues;
-      while (q->_next != NULL) {
-        q = q->_next;
-      }
-      q->_next = new _WriteQueue(fd);
-      return q->_next;
-    }
-  }
-
-  return q;
-}
-
-static void deleteQForFD(const int fd) {
-  if (write_queues == NULL)
-    return;
-
-  _WriteQueue *q = write_queues;
-  if (write_queues->_fd == fd) {
-    write_queues = write_queues->_next;
-    delete q;
-
-    return;
-  }
-
-  while (q->_next != NULL) {
-    if (q->_next->_fd == fd) {
-      _WriteQueue *out_q = q->_next;
-      q->_next = q->_next->_next;
-      delete out_q;
-
-      return;
-    }
-    q = q->_next;
-  }
-
-  // It wasn't found...
-}
-
-v8::Local<v8::Value> getValueFromObject(v8::Local<v8::Object> options, std::string key) {
-  v8::Local<v8::String> v8str = Nan::New<v8::String>(key).ToLocalChecked();
-  return Nan::Get(options, v8str).ToLocalChecked();
-}
-
-int getIntFromObject(v8::Local<v8::Object> options, std::string key) {
-  return getValueFromObject(options, key)->ToInt32()->Int32Value();
-}
-
-bool getBoolFromObject(v8::Local<v8::Object> options, std::string key) {
-  return getValueFromObject(options, key)->ToBoolean()->BooleanValue();
-}
-
-v8::Local<v8::String> getStringFromObj(v8::Local<v8::Object> options, std::string key) {
-  return getValueFromObject(options, key)->ToString();
-}
-
-double getDoubleFromObject(v8::Local<v8::Object> options, std::string key) {
-  return getValueFromObject(options, key)->ToNumber()->NumberValue();
-}
-
-NAN_METHOD(Open) {
-  // path
-  if (!info[0]->IsString()) {
-    Nan::ThrowTypeError("First argument must be a string");
-    return;
-  }
-  v8::String::Utf8Value path(info[0]->ToString());
-
-  // options
-  if (!info[1]->IsObject()) {
-    Nan::ThrowTypeError("Second argument must be an object");
-    return;
-  }
-  v8::Local<v8::Object> options = info[1]->ToObject();
-
-  // callback
-  if (!info[2]->IsFunction()) {
-    Nan::ThrowTypeError("Third argument must be a function");
-    return;
-  }
-  v8::Local<v8::Function> callback = info[2].As<v8::Function>();
-
-  OpenBaton* baton = new OpenBaton();
-  memset(baton, 0, sizeof(OpenBaton));
-  strcpy(baton->path, *path);
-  baton->baudRate = getIntFromObject(options, "baudRate");
-  baton->dataBits = getIntFromObject(options, "dataBits");
-  baton->bufferSize = getIntFromObject(options, "bufferSize");
-  baton->parity = ToParityEnum(getStringFromObj(options, "parity"));
-  baton->stopBits = ToStopBitEnum(getDoubleFromObject(options, "stopBits"));
-  baton->rtscts = getBoolFromObject(options, "rtscts");
-  baton->xon = getBoolFromObject(options, "xon");
-  baton->xoff = getBoolFromObject(options, "xoff");
-  baton->xany = getBoolFromObject(options, "xany");
-  baton->hupcl = getBoolFromObject(options, "hupcl");
-  baton->lock = getBoolFromObject(options, "lock");
-
-  v8::Local<v8::Object> platformOptions = getValueFromObject(options, "platformOptions")->ToObject();
-  baton->platformOptions = ParsePlatformOptions(platformOptions);
-
-  baton->callback = new Nan::Callback(callback);
-  baton->dataCallback = new Nan::Callback(getValueFromObject(options, "dataCallback").As<v8::Function>());
-  baton->disconnectedCallback = new Nan::Callback(getValueFromObject(options, "disconnectedCallback").As<v8::Function>());
-  baton->errorCallback = new Nan::Callback(getValueFromObject(options, "errorCallback").As<v8::Function>());
-
-  uv_work_t* req = new uv_work_t();
-  req->data = baton;
-
-  uv_queue_work(uv_default_loop(), req, EIO_Open, (uv_after_work_cb)EIO_AfterOpen);
-
-  return;
-}
-
-void EIO_AfterOpen(uv_work_t* req) {
-  Nan::HandleScope scope;
-
-  OpenBaton* data = static_cast<OpenBaton*>(req->data);
-
-  v8::Local<v8::Value> argv[2];
-  if (data->errorString[0]) {
-    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
-    argv[1] = Nan::Undefined();
-    // not needed because we're not calling AfterOpenSuccess
-    delete data->dataCallback;
-    delete data->errorCallback;
-    delete data->disconnectedCallback;
-  } else {
-    argv[0] = Nan::Null();
-    argv[1] = Nan::New<v8::Int32>(data->result);
-
-    int fd = argv[1]->ToInt32()->Int32Value();
-    newQForFD(fd);
-
-    AfterOpenSuccess(data->result, data->dataCallback, data->disconnectedCallback, data->errorCallback);
-  }
-
-  data->callback->Call(2, argv);
-
-  delete data->platformOptions;
-  delete data->callback;
-  delete data;
-  delete req;
-}
-
-NAN_METHOD(Update) {
-  // file descriptor
-  if (!info[0]->IsInt32()) {
-    Nan::ThrowTypeError("First argument must be an int");
-    return;
-  }
-  int fd = info[0]->ToInt32()->Int32Value();
-
-  // options
-  if (!info[1]->IsObject()) {
-    Nan::ThrowTypeError("Second argument must be an object");
-    return;
-  }
-  v8::Local<v8::Object> options = info[1]->ToObject();
-
-  if (!Nan::Has(options, Nan::New<v8::String>("baudRate").ToLocalChecked()).FromMaybe(false)) {
-    Nan::ThrowTypeError("baudRate must be set on options object");
-    return;
-  }
-
-  // callback
-  if (!info[2]->IsFunction()) {
-    Nan::ThrowTypeError("Third argument must be a function");
-    return;
-  }
-  v8::Local<v8::Function> callback = info[2].As<v8::Function>();
-
-  ConnectionOptionsBaton* baton = new ConnectionOptionsBaton();
-  memset(baton, 0, sizeof(ConnectionOptionsBaton));
-
-  baton->fd = fd;
-  baton->baudRate = Nan::Get(options, Nan::New<v8::String>("baudRate").ToLocalChecked()).ToLocalChecked()->ToInt32()->Int32Value();
-  baton->callback = new Nan::Callback(callback);
-
-  uv_work_t* req = new uv_work_t();
-  req->data = baton;
-
-  uv_queue_work(uv_default_loop(), req, EIO_Update, (uv_after_work_cb)EIO_AfterUpdate);
-
-  return;
-}
-
-void EIO_AfterUpdate(uv_work_t* req) {
-  Nan::HandleScope scope;
-
-  ConnectionOptionsBaton* data = static_cast<ConnectionOptionsBaton*>(req->data);
-
-  v8::Local<v8::Value> argv[1];
-  if (data->errorString[0]) {
-    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
-  } else {
-    argv[0] = Nan::Null();
-  }
-
-  data->callback->Call(1, argv);
-
-  delete data->callback;
-  delete data;
-  delete req;
-}
-
-NAN_METHOD(Write) {
-  // file descriptor
-  if (!info[0]->IsInt32()) {
-    Nan::ThrowTypeError("First argument must be an int");
-    return;
-  }
-  int fd = info[0]->ToInt32()->Int32Value();
-
-  // buffer
-  if (!info[1]->IsObject() || !node::Buffer::HasInstance(info[1])) {
-    Nan::ThrowTypeError("Second argument must be a buffer");
-    return;
-  }
-  v8::Local<v8::Object> buffer = info[1]->ToObject();
-  char* bufferData = node::Buffer::Data(buffer);
-  size_t bufferLength = node::Buffer::Length(buffer);
-
-  // callback
-  if (!info[2]->IsFunction()) {
-    Nan::ThrowTypeError("Third argument must be a function");
-    return;
-  }
-  v8::Local<v8::Function> callback = info[2].As<v8::Function>();
-
-  WriteBaton* baton = new WriteBaton();
-  memset(baton, 0, sizeof(WriteBaton));
-  baton->fd = fd;
-  baton->buffer.Reset(buffer);
-  baton->bufferData = bufferData;
-  baton->bufferLength = bufferLength;
-  baton->offset = 0;
-  baton->callback = new Nan::Callback(callback);
-
-  QueuedWrite* queuedWrite = new QueuedWrite();
-  memset(queuedWrite, 0, sizeof(QueuedWrite));
-  queuedWrite->baton = baton;
-  queuedWrite->req.data = queuedWrite;
-
-  _WriteQueue *q = qForFD(fd);
-  if (!q) {
-    Nan::ThrowTypeError("There's no write queue for that file descriptor (write)!");
-    return;
-  }
-
-  q->lock();
-  QueuedWrite &write_queue = q->get();
-  bool empty = write_queue.empty();
-
-  write_queue.insert_tail(queuedWrite);
-
-  if (empty) {
-    uv_queue_work(uv_default_loop(), &queuedWrite->req, EIO_Write, (uv_after_work_cb)EIO_AfterWrite);
-  }
-  q->unlock();
-
-  return;
-}
-
-void EIO_AfterWrite(uv_work_t* req) {
-  Nan::HandleScope scope;
-
-  QueuedWrite* queuedWrite = static_cast<QueuedWrite*>(req->data);
-  WriteBaton* data = static_cast<WriteBaton*>(queuedWrite->baton);
-
-  v8::Local<v8::Value> argv[1];
-  if (data->errorString[0]) {
-    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
-  } else {
-    argv[0] = Nan::Null();
-  }
-
-  if (data->offset < data->bufferLength && !data->errorString[0]) {
-    // We're not done with this baton, so throw it right back onto the queue.
-    // Don't re-push the write in the event loop if there was an error; because same error could occur again!
-    // TODO: Add a uv_poll here for unix...
-    // fprintf(stderr, "Write again...\n");
-    uv_queue_work(uv_default_loop(), req, EIO_Write, (uv_after_work_cb)EIO_AfterWrite);
-    return;
-  }
-
-  // throwing errors instead of returning them at this point is rude
-  int fd = data->fd;
-  _WriteQueue *q = qForFD(fd);
-  if (!q) {
-    Nan::ThrowTypeError("There's no write queue for that file descriptor (after write)!");
-    return;
-  }
-
-  q->lock();
-  QueuedWrite &write_queue = q->get();
-
-  // remove this one from the list
-  queuedWrite->remove();
-
-  data->callback->Call(1, argv);
-
-  // If there are any left, start a new thread to write the next one.
-  if (!write_queue.empty()) {
-    // Always pull the next work item from the head of the queue
-    QueuedWrite* nextQueuedWrite = write_queue.next;
-    uv_queue_work(uv_default_loop(), &nextQueuedWrite->req, EIO_Write, (uv_after_work_cb)EIO_AfterWrite);
-  }
-  q->unlock();
-
-  data->buffer.Reset();
-  delete data->callback;
-  delete data;
-  delete queuedWrite;
-}
-
-NAN_METHOD(Close) {
-  // file descriptor
-  if (!info[0]->IsInt32()) {
-    Nan::ThrowTypeError("First argument must be an int");
-    return;
-  }
-
-  // callback
-  if (!info[1]->IsFunction()) {
-    Nan::ThrowTypeError("Second argument must be a function");
-    return;
-  }
-  v8::Local<v8::Function> callback = info[1].As<v8::Function>();
-
-  CloseBaton* baton = new CloseBaton();
-  memset(baton, 0, sizeof(CloseBaton));
-  baton->fd = info[0]->ToInt32()->Int32Value();
-  baton->callback = new Nan::Callback(callback);
-
-  uv_work_t* req = new uv_work_t();
-  req->data = baton;
-  uv_queue_work(uv_default_loop(), req, EIO_Close, (uv_after_work_cb)EIO_AfterClose);
-
-  return;
-}
-
-void EIO_AfterClose(uv_work_t* req) {
-  Nan::HandleScope scope;
-  CloseBaton* data = static_cast<CloseBaton*>(req->data);
-
-  v8::Local<v8::Value> argv[1];
-  if (data->errorString[0]) {
-    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
-  } else {
-    argv[0] = Nan::Null();
-
-    // We don't have an error, so clean up the write queue for that fd
-    _WriteQueue *q = qForFD(data->fd);
-    if (q) {
-      q->lock();
-      QueuedWrite &write_queue = q->get();
-      while (!write_queue.empty()) {
-        QueuedWrite *del_q = write_queue.next;
-        del_q->baton->buffer.Reset();
-        del_q->remove();
-      }
-      q->unlock();
-      deleteQForFD(data->fd);
-    }
-  }
-  data->callback->Call(1, argv);
-
-  delete data->callback;
-  delete data;
-  delete req;
-}
-
-NAN_METHOD(List) {
-  // callback
-  if (!info[0]->IsFunction()) {
-    Nan::ThrowTypeError("First argument must be a function");
-    return;
-  }
-  v8::Local<v8::Function> callback = info[0].As<v8::Function>();
-
-  ListBaton* baton = new ListBaton();
-  strcpy(baton->errorString, "");
-  baton->callback = new Nan::Callback(callback);
-
-  uv_work_t* req = new uv_work_t();
-  req->data = baton;
-  uv_queue_work(uv_default_loop(), req, EIO_List, (uv_after_work_cb)EIO_AfterList);
-
-  return;
-}
-
-void setIfNotEmpty(v8::Local<v8::Object> item, std::string key, const char *value) {
-  v8::Local<v8::String> v8key = Nan::New<v8::String>(key).ToLocalChecked();
-  if (strlen(value) > 0) {
-    Nan::Set(item, v8key, Nan::New<v8::String>(value).ToLocalChecked());
-  } else {
-    Nan::Set(item, v8key, Nan::Undefined());
-  }
-
-}
-
-void EIO_AfterList(uv_work_t* req) {
-  Nan::HandleScope scope;
-
-  ListBaton* data = static_cast<ListBaton*>(req->data);
-
-  v8::Local<v8::Value> argv[2];
-  if (data->errorString[0]) {
-    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
-    argv[1] = Nan::Undefined();
-  } else {
-    v8::Local<v8::Array> results = Nan::New<v8::Array>();
-    int i = 0;
-    for (std::list<ListResultItem*>::iterator it = data->results.begin(); it != data->results.end(); ++it, i++) {
-      v8::Local<v8::Object> item = Nan::New<v8::Object>();
-
-      setIfNotEmpty(item, "comName", (*it)->comName.c_str());
-      setIfNotEmpty(item, "manufacturer", (*it)->manufacturer.c_str());
-      setIfNotEmpty(item, "serialNumber", (*it)->serialNumber.c_str());
-      setIfNotEmpty(item, "pnpId", (*it)->pnpId.c_str());
-      setIfNotEmpty(item, "locationId", (*it)->locationId.c_str());
-      setIfNotEmpty(item, "vendorId", (*it)->vendorId.c_str());
-      setIfNotEmpty(item, "productId", (*it)->productId.c_str());
-
-      Nan::Set(results, i, item);
-    }
-    argv[0] = Nan::Null();
-    argv[1] = results;
-  }
-  data->callback->Call(2, argv);
-
-  delete data->callback;
-  for (std::list<ListResultItem*>::iterator it = data->results.begin(); it != data->results.end(); ++it) {
-    delete *it;
-  }
-  delete data;
-  delete req;
-}
-
-NAN_METHOD(Flush) {
-  // file descriptor
-  if (!info[0]->IsInt32()) {
-    Nan::ThrowTypeError("First argument must be an int");
-    return;
-  }
-  int fd = info[0]->ToInt32()->Int32Value();
-
-  // callback
-  if (!info[1]->IsFunction()) {
-    Nan::ThrowTypeError("Second argument must be a function");
-    return;
-  }
-  v8::Local<v8::Function> callback = info[1].As<v8::Function>();
-
-  FlushBaton* baton = new FlushBaton();
-  memset(baton, 0, sizeof(FlushBaton));
-  baton->fd = fd;
-  baton->callback = new Nan::Callback(callback);
-
-  uv_work_t* req = new uv_work_t();
-  req->data = baton;
-  uv_queue_work(uv_default_loop(), req, EIO_Flush, (uv_after_work_cb)EIO_AfterFlush);
-
-  return;
-}
-
-void EIO_AfterFlush(uv_work_t* req) {
-  Nan::HandleScope scope;
-
-  FlushBaton* data = static_cast<FlushBaton*>(req->data);
-
-  v8::Local<v8::Value> argv[2];
-
-  if (data->errorString[0]) {
-    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
-    argv[1] = Nan::Undefined();
-  } else {
-    argv[0] = Nan::Undefined();
-    argv[1] = Nan::New<v8::Int32>(data->result);
-  }
-  data->callback->Call(2, argv);
-
-  delete data->callback;
-  delete data;
-  delete req;
-}
-
-NAN_METHOD(Set) {
-  // file descriptor
-  if (!info[0]->IsInt32()) {
-    Nan::ThrowTypeError("First argument must be an int");
-    return;
-  }
-  int fd = info[0]->ToInt32()->Int32Value();
-
-  // options
-  if (!info[1]->IsObject()) {
-    Nan::ThrowTypeError("Second argument must be an object");
-    return;
-  }
-  v8::Local<v8::Object> options = info[1]->ToObject();
-
-  // callback
-  if (!info[2]->IsFunction()) {
-    Nan::ThrowTypeError("Third argument must be a function");
-    return;
-  }
-  v8::Local<v8::Function> callback = info[2].As<v8::Function>();
-
-  SetBaton* baton = new SetBaton();
-  memset(baton, 0, sizeof(SetBaton));
-  baton->fd = fd;
-  baton->callback = new Nan::Callback(callback);
-  baton->brk = getBoolFromObject(options, "brk");
-  baton->rts = getBoolFromObject(options, "rts");
-  baton->cts = getBoolFromObject(options, "cts");
-  baton->dtr = getBoolFromObject(options, "dtr");
-  baton->dsr = getBoolFromObject(options, "dsr");
-
-  uv_work_t* req = new uv_work_t();
-  req->data = baton;
-  uv_queue_work(uv_default_loop(), req, EIO_Set, (uv_after_work_cb)EIO_AfterSet);
-
-  return;
-}
-
-void EIO_AfterSet(uv_work_t* req) {
-  Nan::HandleScope scope;
-
-  SetBaton* data = static_cast<SetBaton*>(req->data);
-
-  v8::Local<v8::Value> argv[1];
-
-  if (data->errorString[0]) {
-    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
-  } else {
-    argv[0] = Nan::Null();
-  }
-  data->callback->Call(1, argv);
-
-  delete data->callback;
-  delete data;
-  delete req;
-}
-
-NAN_METHOD(Drain) {
-  // file descriptor
-  if (!info[0]->IsInt32()) {
-    Nan::ThrowTypeError("First argument must be an int");
-    return;
-  }
-  int fd = info[0]->ToInt32()->Int32Value();
-
-  // callback
-  if (!info[1]->IsFunction()) {
-    Nan::ThrowTypeError("Second argument must be a function");
-    return;
-  }
-  v8::Local<v8::Function> callback = info[1].As<v8::Function>();
-
-  DrainBaton* baton = new DrainBaton();
-  memset(baton, 0, sizeof(DrainBaton));
-  baton->fd = fd;
-  baton->callback = new Nan::Callback(callback);
-
-  uv_work_t* req = new uv_work_t();
-  req->data = baton;
-  uv_queue_work(uv_default_loop(), req, EIO_Drain, (uv_after_work_cb)EIO_AfterDrain);
-
-  return;
-}
-
-void EIO_AfterDrain(uv_work_t* req) {
-  Nan::HandleScope scope;
-
-  DrainBaton* data = static_cast<DrainBaton*>(req->data);
-
-  v8::Local<v8::Value> argv[1];
-
-  if (data->errorString[0]) {
-    argv[0] = v8::Exception::Error(Nan::New<v8::String>(data->errorString).ToLocalChecked());
-  } else {
-    argv[0] = Nan::Null();
-  }
-  data->callback->Call(1, argv);
-
-  delete data->callback;
-  delete data;
-  delete req;
-}
-
-SerialPortParity NAN_INLINE(ToParityEnum(const v8::Local<v8::String>& v8str)) {
-  Nan::HandleScope scope;
-  Nan::Utf8String *str = new Nan::Utf8String(v8str);
-  size_t count = strlen(**str);
-  SerialPortParity parity = SERIALPORT_PARITY_NONE;
-  if (!strncasecmp(**str, "none", count)) {
-    parity = SERIALPORT_PARITY_NONE;
-  } else if (!strncasecmp(**str, "even", count)) {
-    parity = SERIALPORT_PARITY_EVEN;
-  } else if (!strncasecmp(**str, "mark", count)) {
-    parity = SERIALPORT_PARITY_MARK;
-  } else if (!strncasecmp(**str, "odd", count)) {
-    parity = SERIALPORT_PARITY_ODD;
-  } else if (!strncasecmp(**str, "space", count)) {
-    parity = SERIALPORT_PARITY_SPACE;
-  }
-  return parity;
-}
-
-SerialPortStopBits NAN_INLINE(ToStopBitEnum(double stopBits)) {
-  if (stopBits > 1.4 && stopBits < 1.6) {
-    return SERIALPORT_STOPBITS_ONE_FIVE;
-  }
-  if (stopBits == 2) {
-    return SERIALPORT_STOPBITS_TWO;
-  }
-  return SERIALPORT_STOPBITS_ONE;
-}
-
-extern "C" {
-  void init(v8::Handle<v8::Object> target) {
-    Nan::HandleScope scope;
-    Nan::SetMethod(target, "set", Set);
-    Nan::SetMethod(target, "open", Open);
-    Nan::SetMethod(target, "update", Update);
-    Nan::SetMethod(target, "write", Write);
-    Nan::SetMethod(target, "close", Close);
-    Nan::SetMethod(target, "list", List);
-    Nan::SetMethod(target, "flush", Flush);
-    Nan::SetMethod(target, "drain", Drain);
-
-#ifndef WIN32
-    SerialportPoller::Init(target);
-#endif
-  }
-}
-
-NODE_MODULE(serialport, init);
diff --git a/js/node_modules/serialport/src/serialport.h b/js/node_modules/serialport/src/serialport.h
deleted file mode 100644
index e9a0ed90066a8a61ffdfc6a791774a9978354bb7..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/serialport.h
+++ /dev/null
@@ -1,195 +0,0 @@
-#ifndef _serialport_h_
-#define _serialport_h_
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <nan.h>
-#include <list>
-#include <string>
-
-#define ERROR_STRING_SIZE 1024
-
-NAN_METHOD(List);
-void EIO_List(uv_work_t* req);
-void EIO_AfterList(uv_work_t* req);
-
-NAN_METHOD(Open);
-void EIO_Open(uv_work_t* req);
-void EIO_AfterOpen(uv_work_t* req);
-void AfterOpenSuccess(int fd, Nan::Callback* dataCallback, Nan::Callback* disconnectedCallback, Nan::Callback* errorCallback);
-
-NAN_METHOD(Update);
-void EIO_Update(uv_work_t* req);
-void EIO_AfterUpdate(uv_work_t* req);
-
-NAN_METHOD(Write);
-void EIO_Write(uv_work_t* req);
-void EIO_AfterWrite(uv_work_t* req);
-
-NAN_METHOD(Close);
-void EIO_Close(uv_work_t* req);
-void EIO_AfterClose(uv_work_t* req);
-
-NAN_METHOD(Flush);
-void EIO_Flush(uv_work_t* req);
-void EIO_AfterFlush(uv_work_t* req);
-
-NAN_METHOD(Set);
-void EIO_Set(uv_work_t* req);
-void EIO_AfterSet(uv_work_t* req);
-
-NAN_METHOD(Drain);
-void EIO_Drain(uv_work_t* req);
-void EIO_AfterDrain(uv_work_t* req);
-
-enum SerialPortParity {
-  SERIALPORT_PARITY_NONE = 1,
-  SERIALPORT_PARITY_MARK = 2,
-  SERIALPORT_PARITY_EVEN = 3,
-  SERIALPORT_PARITY_ODD = 4,
-  SERIALPORT_PARITY_SPACE = 5
-};
-
-enum SerialPortStopBits {
-  SERIALPORT_STOPBITS_ONE = 1,
-  SERIALPORT_STOPBITS_ONE_FIVE = 2,
-  SERIALPORT_STOPBITS_TWO = 3
-};
-
-SerialPortParity ToParityEnum(const v8::Local<v8::String>& str);
-SerialPortStopBits ToStopBitEnum(double stopBits);
-
-struct OpenBatonPlatformOptions { };
-OpenBatonPlatformOptions* ParsePlatformOptions(const v8::Local<v8::Object>& options);
-
-struct OpenBaton {
-  char errorString[ERROR_STRING_SIZE];
-  Nan::Callback* callback;
-  char path[1024];
-  int fd;
-  int result;
-  int baudRate;
-  int dataBits;
-  int bufferSize;
-  bool rtscts;
-  bool xon;
-  bool xoff;
-  bool xany;
-  bool dsrdtr;
-  bool hupcl;
-  bool lock;
-  Nan::Callback* dataCallback;
-  Nan::Callback* disconnectedCallback;
-  Nan::Callback* errorCallback;
-  SerialPortParity parity;
-  SerialPortStopBits stopBits;
-  OpenBatonPlatformOptions* platformOptions;
-};
-
-struct ConnectionOptionsBaton {
-  char errorString[ERROR_STRING_SIZE];
-  Nan::Callback* callback;
-  int fd;
-  int baudRate;
-};
-
-struct WriteBaton {
-  int fd;
-  char* bufferData;
-  size_t bufferLength;
-  size_t offset;
-  Nan::Persistent<v8::Object> buffer;
-  Nan::Callback* callback;
-  int result;
-  char errorString[ERROR_STRING_SIZE];
-};
-
-struct QueuedWrite {
-  uv_work_t req;
-  QueuedWrite *prev;
-  QueuedWrite *next;
-  WriteBaton* baton;
-
-  QueuedWrite() {
-    prev = this;
-    next = this;
-
-    baton = 0;
-  }
-
-  ~QueuedWrite() {
-    remove();
-  }
-
-  void remove() {
-    prev->next = next;
-    next->prev = prev;
-
-    next = this;
-    prev = this;
-  }
-
-  void insert_tail(QueuedWrite *qw) {
-    qw->next = this;
-    qw->prev = this->prev;
-    qw->prev->next = qw;
-    this->prev = qw;
-  }
-
-  bool empty() {
-    return next == this;
-  }
-};
-
-struct CloseBaton {
-  int fd;
-  Nan::Callback* callback;
-  char errorString[ERROR_STRING_SIZE];
-};
-
-struct ListResultItem {
-  std::string comName;
-  std::string manufacturer;
-  std::string serialNumber;
-  std::string pnpId;
-  std::string locationId;
-  std::string vendorId;
-  std::string productId;
-};
-
-struct ListBaton {
-  Nan::Callback* callback;
-  std::list<ListResultItem*> results;
-  char errorString[ERROR_STRING_SIZE];
-};
-
-struct FlushBaton {
-  int fd;
-  Nan::Callback* callback;
-  int result;
-  char errorString[ERROR_STRING_SIZE];
-};
-
-struct SetBaton {
-  int fd;
-  Nan::Callback* callback;
-  int result;
-  char errorString[ERROR_STRING_SIZE];
-  bool rts;
-  bool cts;
-  bool dtr;
-  bool dsr;
-  bool brk;
-};
-
-struct DrainBaton {
-  int fd;
-  Nan::Callback* callback;
-  int result;
-  char errorString[ERROR_STRING_SIZE];
-};
-
-int setup(int fd, OpenBaton *data);
-int setBaudRate(ConnectionOptionsBaton *data);
-#endif
diff --git a/js/node_modules/serialport/src/serialport_poller.cpp b/js/node_modules/serialport/src/serialport_poller.cpp
deleted file mode 100644
index b1d2a84a28680e7514dfe0f0f8f8cee5b0db2507..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/serialport_poller.cpp
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright (C) 2013 Robert Giseburt <giseburt@gmail.com>
-// serialport_poller.cpp Written as a part of https://github.com/voodootikigod/node-serialport
-// License to use this is the same as that of node-serialport.
-
-#include <nan.h>
-#include "./serialport_poller.h"
-
-using namespace v8;
-
-static Nan::Persistent<v8::FunctionTemplate> serialportpoller_constructor;
-
-SerialportPoller::SerialportPoller() :  Nan::ObjectWrap() {}
-SerialportPoller::~SerialportPoller() {
-  // printf("~SerialportPoller\n");
-  delete callback_;
-}
-
-void _serialportReadable(uv_poll_t *req, int status, int events) {
-  SerialportPoller* sp = (SerialportPoller*) req->data;
-  // We can stop polling until we have read all of the data...
-  sp->_stop();
-  sp->callCallback(status);
-}
-
-void SerialportPoller::callCallback(int status) {
-  Nan::HandleScope scope;
-  // uv_work_t* req = new uv_work_t;
-
-  // Call the callback to go read more data...
-
-  v8::Local<v8::Value> argv[1];
-  if (status != 0) {
-    // error handling changed in libuv, see:
-    // https://github.com/joyent/libuv/commit/3ee4d3f183331
-    #ifdef UV_ERRNO_H_
-    const char* err_string = uv_strerror(status);
-    #else
-    uv_err_t errno = uv_last_error(uv_default_loop());
-    const char* err_string = uv_strerror(errno);
-    #endif
-    snprintf(this->errorString, sizeof(this->errorString), "Error %s on polling", err_string);
-    argv[0] = v8::Exception::Error(Nan::New<v8::String>(this->errorString).ToLocalChecked());
-  } else {
-    argv[0] = Nan::Undefined();
-  }
-
-  callback_->Call(1, argv);
-}
-
-
-
-void SerialportPoller::Init(Handle<Object> target) {
-  Nan::HandleScope scope;
-
-  // Prepare constructor template
-  Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
-  tpl->SetClassName(Nan::New<String>("SerialportPoller").ToLocalChecked());
-  tpl->InstanceTemplate()->SetInternalFieldCount(1);
-
-
-  // Prototype
-
-  // SerialportPoller.close()
-  Nan::SetPrototypeMethod(tpl, "close", Close);
-
-  // SerialportPoller.start()
-  Nan::SetPrototypeMethod(tpl, "start", Start);
-
-  serialportpoller_constructor.Reset(tpl);
-
-  Nan::Set(target, Nan::New<String>("SerialportPoller").ToLocalChecked(), Nan::GetFunction(tpl).ToLocalChecked());
-}
-
-NAN_METHOD(SerialportPoller::New) {
-  if (!info[0]->IsInt32()) {
-    Nan::ThrowTypeError("First argument must be an fd");
-    return;
-  }
-
-  if (!info[1]->IsFunction()) {
-    Nan::ThrowTypeError("Third argument must be a function");
-    return;
-  }
-
-  SerialportPoller* obj = new SerialportPoller();
-  obj->fd_ = info[0]->ToInt32()->Int32Value();
-  obj->callback_ = new Nan::Callback(info[1].As<v8::Function>());
-  // obj->callCallback();
-
-  obj->Wrap(info.This());
-
-  obj->poll_handle_.data = obj;
-
-  uv_poll_init(uv_default_loop(), &obj->poll_handle_, obj->fd_);
-
-  uv_poll_start(&obj->poll_handle_, UV_READABLE, _serialportReadable);
-
-  info.GetReturnValue().Set(info.This());
-}
-
-void SerialportPoller::_start() {
-  uv_poll_start(&poll_handle_, UV_READABLE, _serialportReadable);
-}
-
-void SerialportPoller::_stop() {
-  uv_poll_stop(&poll_handle_);
-}
-
-
-NAN_METHOD(SerialportPoller::Start) {
-  SerialportPoller* obj = Nan::ObjectWrap::Unwrap<SerialportPoller>(info.This());
-  obj->_start();
-
-  return;
-}
-
-NAN_METHOD(SerialportPoller::Close) {
-  SerialportPoller* obj = Nan::ObjectWrap::Unwrap<SerialportPoller>(info.This());
-  obj->_stop();
-
-  // DO SOMETHING!
-
-  return;
-}
diff --git a/js/node_modules/serialport/src/serialport_poller.h b/js/node_modules/serialport/src/serialport_poller.h
deleted file mode 100644
index 4d20b07d62f1d58b0a7f24fbc64b19d27de73e97..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/serialport_poller.h
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (C) 2013 Robert Giseburt <giseburt@gmail.com>
-// serialport_poller.h Written as a part of https://github.com/voodootikigod/node-serialport
-// License to use this is the same as that of node-serialport.
-
-#ifndef SERIALPORT_POLLER_H
-#define SERIALPORT_POLLER_H
-
-#include <nan.h>
-#include "./serialport.h"
-
-class SerialportPoller : public Nan::ObjectWrap {
- public:
-  static void Init(v8::Handle<v8::Object> target);
-
-  void callCallback(int status);
-
-  void _start();
-  void _stop();
-
- private:
-  SerialportPoller();
-  ~SerialportPoller();
-
-  static NAN_METHOD(New);
-  static NAN_METHOD(Close);
-  static NAN_METHOD(Start);
-
-  uv_poll_t poll_handle_;
-  int fd_;
-  char errorString[ERROR_STRING_SIZE];
-
-  Nan::Callback* callback_;
-};
-
-#endif
diff --git a/js/node_modules/serialport/src/serialport_unix.cpp b/js/node_modules/serialport/src/serialport_unix.cpp
deleted file mode 100644
index 9b5a38f35c4f185bdeed31ead1c834603ac34d32..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/serialport_unix.cpp
+++ /dev/null
@@ -1,729 +0,0 @@
-#include "./serialport.h"
-#include "./serialport_poller.h"
-#include <sys/file.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <termios.h>
-
-#ifdef __APPLE__
-#include <AvailabilityMacros.h>
-#include <sys/param.h>
-#include <IOKit/IOKitLib.h>
-#include <IOKit/IOCFPlugIn.h>
-#include <IOKit/usb/IOUSBLib.h>
-#include <IOKit/serial/IOSerialKeys.h>
-
-uv_mutex_t list_mutex;
-Boolean lockInitialised = FALSE;
-#endif
-
-#if defined(MAC_OS_X_VERSION_10_4) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4)
-#include <sys/ioctl.h>
-#include <IOKit/serial/ioss.h>
-#endif
-
-#if defined(__OpenBSD__)
-#include <sys/ioctl.h>
-#endif
-
-#if defined(__linux__)
-#include <sys/ioctl.h>
-#include <linux/serial.h>
-#endif
-
-struct UnixPlatformOptions : OpenBatonPlatformOptions {
-  uint8_t vmin;
-  uint8_t vtime;
-};
-
-OpenBatonPlatformOptions* ParsePlatformOptions(const v8::Local<v8::Object>& options) {
-  Nan::HandleScope scope;
-
-  UnixPlatformOptions* result = new UnixPlatformOptions();
-  result->vmin = Nan::Get(options, Nan::New<v8::String>("vmin").ToLocalChecked()).ToLocalChecked()->ToInt32()->Int32Value();
-  result->vtime = Nan::Get(options, Nan::New<v8::String>("vtime").ToLocalChecked()).ToLocalChecked()->ToInt32()->Int32Value();
-
-  return result;
-}
-
-int ToBaudConstant(int baudRate);
-int ToDataBitsConstant(int dataBits);
-int ToStopBitsConstant(SerialPortStopBits stopBits);
-
-void AfterOpenSuccess(int fd, Nan::Callback* dataCallback, Nan::Callback* disconnectedCallback, Nan::Callback* errorCallback) {
-  delete dataCallback;
-  delete errorCallback;
-  delete disconnectedCallback;
-}
-
-int ToBaudConstant(int baudRate) {
-  switch (baudRate) {
-    case 0: return B0;
-    case 50: return B50;
-    case 75: return B75;
-    case 110: return B110;
-    case 134: return B134;
-    case 150: return B150;
-    case 200: return B200;
-    case 300: return B300;
-    case 600: return B600;
-    case 1200: return B1200;
-    case 1800: return B1800;
-    case 2400: return B2400;
-    case 4800: return B4800;
-    case 9600: return B9600;
-    case 19200: return B19200;
-    case 38400: return B38400;
-    case 57600: return B57600;
-    case 115200: return B115200;
-    case 230400: return B230400;
-#if defined(__linux__)
-    case 460800: return B460800;
-    case 500000: return B500000;
-    case 576000: return B576000;
-    case 921600: return B921600;
-    case 1000000: return B1000000;
-    case 1152000: return B1152000;
-    case 1500000: return B1500000;
-    case 2000000: return B2000000;
-    case 2500000: return B2500000;
-    case 3000000: return B3000000;
-    case 3500000: return B3500000;
-    case 4000000: return B4000000;
-#endif
-  }
-  return -1;
-}
-
-#ifdef __APPLE__
-typedef struct SerialDevice {
-    char port[MAXPATHLEN];
-    char locationId[MAXPATHLEN];
-    char vendorId[MAXPATHLEN];
-    char productId[MAXPATHLEN];
-    char manufacturer[MAXPATHLEN];
-    char serialNumber[MAXPATHLEN];
-} stSerialDevice;
-
-typedef struct DeviceListItem {
-    struct SerialDevice value;
-    struct DeviceListItem *next;
-    int* length;
-} stDeviceListItem;
-#endif
-
-int ToDataBitsConstant(int dataBits) {
-  switch (dataBits) {
-    case 8: default: return CS8;
-    case 7: return CS7;
-    case 6: return CS6;
-    case 5: return CS5;
-  }
-  return -1;
-}
-
-void EIO_Open(uv_work_t* req) {
-  OpenBaton* data = static_cast<OpenBaton*>(req->data);
-
-  int flags = (O_RDWR | O_NOCTTY | O_NONBLOCK | O_CLOEXEC | O_SYNC);
-  int fd = open(data->path, flags);
-
-  if (-1 == fd) {
-    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, cannot open %s", strerror(errno), data->path);
-    return;
-  }
-
-  if (-1 == setup(fd, data)) {
-    close(fd);
-    return;
-  }
-
-  data->result = fd;
-}
-
-int setBaudRate(ConnectionOptionsBaton *data) {
-  // lookup the standard baudrates from the table
-  int baudRate = ToBaudConstant(data->baudRate);
-  int fd = data->fd;
-
-  // get port options
-  struct termios options;
-  tcgetattr(fd, &options);
-
-  // If there is a custom baud rate on linux you can do the following trick with B38400
-  #if defined(__linux__) && defined(ASYNC_SPD_CUST)
-    if (baudRate == -1) {
-      struct serial_struct serinfo;
-      serinfo.reserved_char[0] = 0;
-      if (-1 != ioctl(fd, TIOCGSERIAL, &serinfo)) {
-        serinfo.flags &= ~ASYNC_SPD_MASK;
-        serinfo.flags |= ASYNC_SPD_CUST;
-        serinfo.custom_divisor = (serinfo.baud_base + (data->baudRate / 2)) / data->baudRate;
-        if (serinfo.custom_divisor < 1)
-          serinfo.custom_divisor = 1;
-
-        ioctl(fd, TIOCSSERIAL, &serinfo);
-        ioctl(fd, TIOCGSERIAL, &serinfo);
-      } else {
-        snprintf(data->errorString, sizeof(data->errorString), "Error: %s setting custom baud rate of %d", strerror(errno), data->baudRate);
-        return -1;
-      }
-
-      // Now we use "B38400" to trigger the special baud rate.
-      baudRate = B38400;
-    }
-  #endif
-
-  // On OS X, starting with Tiger, we can set a custom baud rate with ioctl
-  #if defined(MAC_OS_X_VERSION_10_4) && (MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_4)
-    if (-1 == baudRate) {
-      speed_t speed = data->baudRate;
-      if (-1 == ioctl(fd, IOSSIOSPEED, &speed)) {
-        snprintf(data->errorString, sizeof(data->errorString), "Error: %s calling ioctl(.., IOSSIOSPEED, %ld )", strerror(errno), speed );
-        return -1;
-      } else {
-        return 1;
-      }
-    }
-  #endif
-
-  // If we have a good baud rate set it and lets go
-  if (-1 != baudRate) {
-    cfsetospeed(&options, baudRate);
-    cfsetispeed(&options, baudRate);
-    tcflush(fd, TCIFLUSH);
-    tcsetattr(fd, TCSANOW, &options);
-    return 1;
-  }
-
-  snprintf(data->errorString, sizeof(data->errorString), "Error baud rate of %d is not supported on your platform", data->baudRate);
-  return -1;
-}
-
-void EIO_Update(uv_work_t* req) {
-  ConnectionOptionsBaton* data = static_cast<ConnectionOptionsBaton*>(req->data);
-  setBaudRate(data);
-}
-
-int setup(int fd, OpenBaton *data) {
-  UnixPlatformOptions* platformOptions = static_cast<UnixPlatformOptions*>(data->platformOptions);
-
-  int dataBits = ToDataBitsConstant(data->dataBits);
-  if (-1 == dataBits) {
-    snprintf(data->errorString, sizeof(data->errorString), "Invalid data bits setting %d", data->dataBits);
-    return -1;
-  }
-
-  // Snow Leopard doesn't have O_CLOEXEC
-  if (-1 == fcntl(fd, F_SETFD, FD_CLOEXEC)) {
-    snprintf(data->errorString, sizeof(data->errorString), "Error %s Cannot open %s", strerror(errno), data->path);
-    return -1;
-  }
-
-  // Copy the connection options into the ConnectionOptionsBaton to set the baud rate
-  ConnectionOptionsBaton* connectionOptions = new ConnectionOptionsBaton();
-  memset(connectionOptions, 0, sizeof(ConnectionOptionsBaton));
-  connectionOptions->fd = fd;
-  connectionOptions->baudRate = data->baudRate;
-
-  if (-1 == setBaudRate(connectionOptions)) {
-    strncpy(data->errorString, connectionOptions->errorString, sizeof(data->errorString));
-    delete(connectionOptions);
-    return -1;
-  }
-  delete(connectionOptions);
-
-  // Get port configuration for modification
-  struct termios options;
-  tcgetattr(fd, &options);
-
-  // IGNPAR: ignore bytes with parity errors
-  options.c_iflag = IGNPAR;
-
-  // ICRNL: map CR to NL (otherwise a CR input on the other computer will not terminate input)
-  // Future potential option
-  // options.c_iflag = ICRNL;
-  // otherwise make device raw (no other input processing)
-
-  // Specify data bits
-  options.c_cflag &= ~CSIZE;
-  options.c_cflag |= dataBits;
-
-  options.c_cflag &= ~(CRTSCTS);
-
-  if (data->rtscts) {
-    options.c_cflag |= CRTSCTS;
-    // evaluate specific flow control options
-  }
-
-  options.c_iflag &= ~(IXON | IXOFF | IXANY);
-
-  if (data->xon) {
-    options.c_iflag |= IXON;
-  }
-
-  if (data->xoff) {
-    options.c_iflag |= IXOFF;
-  }
-
-  if (data->xany) {
-    options.c_iflag |= IXANY;
-  }
-
-  switch (data->parity) {
-  case SERIALPORT_PARITY_NONE:
-    options.c_cflag &= ~PARENB;
-    // options.c_cflag &= ~CSTOPB;
-    // options.c_cflag &= ~CSIZE;
-    // options.c_cflag |= CS8;
-    break;
-  case SERIALPORT_PARITY_ODD:
-    options.c_cflag |= PARENB;
-    options.c_cflag |= PARODD;
-    // options.c_cflag &= ~CSTOPB;
-    // options.c_cflag &= ~CSIZE;
-    // options.c_cflag |= CS7;
-    break;
-  case SERIALPORT_PARITY_EVEN:
-    options.c_cflag |= PARENB;
-    options.c_cflag &= ~PARODD;
-    // options.c_cflag &= ~CSTOPB;
-    // options.c_cflag &= ~CSIZE;
-    // options.c_cflag |= CS7;
-    break;
-  default:
-    snprintf(data->errorString, sizeof(data->errorString), "Invalid parity setting %d", data->parity);
-    return -1;
-  }
-
-  switch (data->stopBits) {
-  case SERIALPORT_STOPBITS_ONE:
-    options.c_cflag &= ~CSTOPB;
-    break;
-  case SERIALPORT_STOPBITS_TWO:
-    options.c_cflag |= CSTOPB;
-    break;
-  default:
-    snprintf(data->errorString, sizeof(data->errorString), "Invalid stop bits setting %d", data->stopBits);
-    return -1;
-  }
-
-  options.c_cflag |= CLOCAL;  // ignore status lines
-  options.c_cflag |= CREAD;   // enable receiver
-  if (data->hupcl) {
-    options.c_cflag |= HUPCL;  // drop DTR (i.e. hangup) on close
-  }
-
-  // Raw output
-  options.c_oflag = 0;
-
-  // ICANON makes partial lines not readable. It should be optional.
-  // It works with ICRNL.
-  options.c_lflag = 0;  // ICANON;
-
-  options.c_cc[VMIN]= platformOptions->vmin;
-  options.c_cc[VTIME]= platformOptions->vtime;
-
-  // why?
-  tcflush(fd, TCIFLUSH);
-
-  // check for error?
-  tcsetattr(fd, TCSANOW, &options);
-
-  if (data->lock){
-    if (-1 == flock(fd, LOCK_EX | LOCK_NB)) {
-      snprintf(data->errorString, sizeof(data->errorString), "Error %s Cannot lock port", strerror(errno));
-      return -1;
-    }
-  }
-
-  return 1;
-}
-
-void EIO_Write(uv_work_t* req) {
-  QueuedWrite* queuedWrite = static_cast<QueuedWrite*>(req->data);
-  WriteBaton* data = static_cast<WriteBaton*>(queuedWrite->baton);
-  int bytesWritten = 0;
-
-  do {
-    errno = 0;  // probably don't need this
-    bytesWritten = write(data->fd, data->bufferData + data->offset, data->bufferLength - data->offset);
-    if (-1 != bytesWritten) {
-      // there wasn't an error, do the math on what we actually wrote and keep writing until finished
-      data->offset += bytesWritten;
-      continue;
-    }
-
-    // The write call was interrupted before anything was written, try again immediately.
-    if (errno == EINTR) {
-      // why try again right away instead of in another event loop?
-      continue;
-    }
-
-    // Try again in another event loop
-    if (errno == EAGAIN || errno == EWOULDBLOCK){
-      return;
-    }
-
-    // EBAD would mean we're "disconnected"
-
-    // a real error so lets bail
-    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, calling write", strerror(errno));
-    return;
-  } while (data->bufferLength > data->offset);
-}
-
-void EIO_Close(uv_work_t* req) {
-  CloseBaton* data = static_cast<CloseBaton*>(req->data);
-  if (-1 == close(data->fd)) {
-    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, unable to close fd %d", strerror(errno), data->fd);
-  }
-}
-
-#ifdef __APPLE__
-
-// Function prototypes
-static kern_return_t FindModems(io_iterator_t *matchingServices);
-static io_service_t GetUsbDevice(io_service_t service);
-static stDeviceListItem* GetSerialDevices();
-
-
-static kern_return_t FindModems(io_iterator_t *matchingServices) {
-    kern_return_t     kernResult;
-    CFMutableDictionaryRef  classesToMatch;
-    classesToMatch = IOServiceMatching(kIOSerialBSDServiceValue);
-    if (classesToMatch != NULL) {
-        CFDictionarySetValue(classesToMatch,
-                             CFSTR(kIOSerialBSDTypeKey),
-                             CFSTR(kIOSerialBSDAllTypes));
-    }
-
-    kernResult = IOServiceGetMatchingServices(kIOMasterPortDefault, classesToMatch, matchingServices);
-
-    return kernResult;
-}
-
-static io_service_t GetUsbDevice(io_service_t service) {
-  IOReturn status;
-  io_iterator_t   iterator = 0;
-  io_service_t    device = 0;
-
-  if (!service) {
-    return device;
-  }
-
-  status = IORegistryEntryCreateIterator(service,
-                                         kIOServicePlane,
-                                         (kIORegistryIterateParents | kIORegistryIterateRecursively),
-                                         &iterator);
-
-  if (status == kIOReturnSuccess) {
-    io_service_t currentService;
-    while ((currentService = IOIteratorNext(iterator)) && device == 0) {
-      io_name_t serviceName;
-      status = IORegistryEntryGetNameInPlane(currentService, kIOServicePlane, serviceName);
-      if (status == kIOReturnSuccess && IOObjectConformsTo(currentService, kIOUSBDeviceClassName)) {
-        device = currentService;
-      } else {
-        // Release the service object which is no longer needed
-        (void) IOObjectRelease(currentService);
-      }
-    }
-
-    // Release the iterator
-    (void) IOObjectRelease(iterator);
-  }
-
-  return device;
-}
-
-static void ExtractUsbInformation(stSerialDevice *serialDevice, IOUSBDeviceInterface  **deviceInterface) {
-  kern_return_t kernResult;
-  UInt32 locationID;
-  kernResult = (*deviceInterface)->GetLocationID(deviceInterface, &locationID);
-  if (KERN_SUCCESS == kernResult) {
-    snprintf(serialDevice->locationId, 11, "0x%08x", locationID);
-  }
-
-  UInt16 vendorID;
-  kernResult = (*deviceInterface)->GetDeviceVendor(deviceInterface, &vendorID);
-  if (KERN_SUCCESS == kernResult) {
-    snprintf(serialDevice->vendorId, 7, "0x%04x", vendorID);
-  }
-
-  UInt16 productID;
-  kernResult = (*deviceInterface)->GetDeviceProduct(deviceInterface, &productID);
-  if (KERN_SUCCESS == kernResult) {
-    snprintf(serialDevice->productId, 7, "0x%04x", productID);
-  }
-}
-
-static stDeviceListItem* GetSerialDevices() {
-  kern_return_t kernResult;
-  io_iterator_t serialPortIterator;
-  char bsdPath[MAXPATHLEN];
-
-  FindModems(&serialPortIterator);
-
-  io_service_t modemService;
-  kernResult = KERN_FAILURE;
-  Boolean modemFound = false;
-
-  // Initialize the returned path
-  *bsdPath = '\0';
-
-  stDeviceListItem* devices = NULL;
-  stDeviceListItem* lastDevice = NULL;
-  int length = 0;
-
-  while ((modemService = IOIteratorNext(serialPortIterator))) {
-    CFTypeRef bsdPathAsCFString;
-    bsdPathAsCFString = IORegistryEntrySearchCFProperty(
-      modemService,
-      kIOServicePlane,
-      CFSTR(kIOCalloutDeviceKey),
-      kCFAllocatorDefault,
-      kIORegistryIterateRecursively);
-
-    if (bsdPathAsCFString) {
-      Boolean result;
-
-      // Convert the path from a CFString to a C (NUL-terminated)
-      result = CFStringGetCString((CFStringRef) bsdPathAsCFString,
-                    bsdPath,
-                    sizeof(bsdPath),
-                    kCFStringEncodingUTF8);
-      CFRelease(bsdPathAsCFString);
-
-      if (result) {
-        stDeviceListItem *deviceListItem = (stDeviceListItem*) malloc(sizeof(stDeviceListItem));
-        stSerialDevice *serialDevice = &(deviceListItem->value);
-        strcpy(serialDevice->port, bsdPath);
-        memset(serialDevice->locationId, 0, sizeof(serialDevice->locationId));
-        memset(serialDevice->vendorId, 0, sizeof(serialDevice->vendorId));
-        memset(serialDevice->productId, 0, sizeof(serialDevice->productId));
-        serialDevice->manufacturer[0] = '\0';
-        serialDevice->serialNumber[0] = '\0';
-        deviceListItem->next = NULL;
-        deviceListItem->length = &length;
-
-        if (devices == NULL) {
-          devices = deviceListItem;
-        } else {
-          lastDevice->next = deviceListItem;
-        }
-
-        lastDevice = deviceListItem;
-        length++;
-
-        modemFound = true;
-        kernResult = KERN_SUCCESS;
-
-        uv_mutex_lock(&list_mutex);
-
-        io_service_t device = GetUsbDevice(modemService);
-
-        if (device) {
-          CFStringRef manufacturerAsCFString = (CFStringRef) IORegistryEntryCreateCFProperty(device,
-                      CFSTR(kUSBVendorString),
-                      kCFAllocatorDefault,
-                      0);
-
-          if (manufacturerAsCFString) {
-            Boolean result;
-            char    manufacturer[MAXPATHLEN];
-
-            // Convert from a CFString to a C (NUL-terminated)
-            result = CFStringGetCString(manufacturerAsCFString,
-                          manufacturer,
-                          sizeof(manufacturer),
-                          kCFStringEncodingUTF8);
-
-            if (result) {
-              strcpy(serialDevice->manufacturer, manufacturer);
-            }
-
-            CFRelease(manufacturerAsCFString);
-          }
-
-          CFStringRef serialNumberAsCFString = (CFStringRef) IORegistryEntrySearchCFProperty(device,
-                      kIOServicePlane,
-                      CFSTR(kUSBSerialNumberString),
-                      kCFAllocatorDefault,
-                      kIORegistryIterateRecursively);
-
-          if (serialNumberAsCFString) {
-            Boolean result;
-            char    serialNumber[MAXPATHLEN];
-
-            // Convert from a CFString to a C (NUL-terminated)
-            result = CFStringGetCString(serialNumberAsCFString,
-                          serialNumber,
-                          sizeof(serialNumber),
-                          kCFStringEncodingUTF8);
-
-            if (result) {
-              strcpy(serialDevice->serialNumber, serialNumber);
-            }
-
-            CFRelease(serialNumberAsCFString);
-          }
-
-          IOCFPlugInInterface **plugInInterface = NULL;
-          SInt32        score;
-          HRESULT       res;
-
-          IOUSBDeviceInterface  **deviceInterface = NULL;
-
-          kernResult = IOCreatePlugInInterfaceForService(device, kIOUSBDeviceUserClientTypeID, kIOCFPlugInInterfaceID,
-                               &plugInInterface, &score);
-
-          if ((kIOReturnSuccess != kernResult) || !plugInInterface) {
-            continue;
-          }
-
-          // Use the plugin interface to retrieve the device interface.
-          res = (*plugInInterface)->QueryInterface(plugInInterface, CFUUIDGetUUIDBytes(kIOUSBDeviceInterfaceID),
-                               (LPVOID*) &deviceInterface);
-
-          // Now done with the plugin interface.
-          (*plugInInterface)->Release(plugInInterface);
-
-          if (res || deviceInterface == NULL) {
-            continue;
-          }
-
-          // Extract the desired Information
-          ExtractUsbInformation(serialDevice, deviceInterface);
-
-          // Release the Interface
-          (*deviceInterface)->Release(deviceInterface);
-
-          // Release the device
-          (void) IOObjectRelease(device);
-        }
-
-        uv_mutex_unlock(&list_mutex);
-      }
-    }
-
-    // Release the io_service_t now that we are done with it.
-    (void) IOObjectRelease(modemService);
-  }
-
-  IOObjectRelease(serialPortIterator);  // Release the iterator.
-
-  return devices;
-}
-
-#endif
-
-void EIO_List(uv_work_t* req) {
-  ListBaton* data = static_cast<ListBaton*>(req->data);
-
-#ifndef __APPLE__
-  // This code exists in javascript for other unix platforms
-  snprintf(data->errorString, sizeof(data->errorString), "List is not Implemented");
-  return;
-# else
-  if (!lockInitialised) {
-    uv_mutex_init(&list_mutex);
-    lockInitialised = TRUE;
-  }
-
-  stDeviceListItem* devices = GetSerialDevices();
-  if (*(devices->length) > 0) {
-    stDeviceListItem* next = devices;
-
-    for (int i = 0, len = *(devices->length); i < len; i++) {
-      stSerialDevice device = (* next).value;
-
-      ListResultItem* resultItem = new ListResultItem();
-      resultItem->comName = device.port;
-
-      if (*device.locationId) {
-        resultItem->locationId = device.locationId;
-      }
-      if (*device.vendorId) {
-        resultItem->vendorId = device.vendorId;
-      }
-      if (*device.productId) {
-        resultItem->productId = device.productId;
-      }
-      if (*device.manufacturer) {
-        resultItem->manufacturer = device.manufacturer;
-      }
-      if (*device.serialNumber) {
-        resultItem->serialNumber = device.serialNumber;
-      }
-      data->results.push_back(resultItem);
-
-      stDeviceListItem* current = next;
-
-      if (next->next != NULL) {
-        next = next->next;
-      }
-
-      free(current);
-    }
-  }
-#endif
-}
-
-void EIO_Flush(uv_work_t* req) {
-  FlushBaton* data = static_cast<FlushBaton*>(req->data);
-
-  data->result = tcflush(data->fd, TCIFLUSH);
-}
-
-void EIO_Set(uv_work_t* req) {
-  SetBaton* data = static_cast<SetBaton*>(req->data);
-
-  int bits;
-  ioctl(data->fd, TIOCMGET, &bits);
-
-  bits &= ~(TIOCM_RTS | TIOCM_CTS | TIOCM_DTR | TIOCM_DSR);
-
-  if (data->rts) {
-    bits |= TIOCM_RTS;
-  }
-
-  if (data->cts) {
-    bits |= TIOCM_CTS;
-  }
-
-  if (data->dtr) {
-    bits |= TIOCM_DTR;
-  }
-
-  if (data->dsr) {
-    bits |= TIOCM_DSR;
-  }
-
-  int result = 0;
-  if (data->brk) {
-    result = ioctl(data->fd, TIOCSBRK, NULL);
-  } else {
-    result = ioctl(data->fd, TIOCCBRK, NULL);
-  }
-
-  if (-1 == result) {
-    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, cannot drain", strerror(errno));
-    return;
-  }
-
-  if (-1 == ioctl(data->fd, TIOCMSET, &bits)) {
-    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, cannot drain", strerror(errno));
-    return;
-  }
-}
-
-void EIO_Drain(uv_work_t* req) {
-  DrainBaton* data = static_cast<DrainBaton*>(req->data);
-
-  if (-1 == tcdrain(data->fd)) {
-    snprintf(data->errorString, sizeof(data->errorString), "Error: %s, cannot drain", strerror(errno));
-    return;
-  }
-}
diff --git a/js/node_modules/serialport/src/serialport_win.cpp b/js/node_modules/serialport/src/serialport_win.cpp
deleted file mode 100644
index 90a07b662f5a0afa22a64d0976732391681486ca..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/serialport_win.cpp
+++ /dev/null
@@ -1,557 +0,0 @@
-#include <nan.h>
-#include <list>
-#include <vector>
-#include "./serialport.h"
-#include "win/disphelper.h"
-#include "win/stdafx.h"
-#include "win/enumser.h"
-
-#ifdef WIN32
-
-#define MAX_BUFFER_SIZE 1000
-
-struct WindowsPlatformOptions : OpenBatonPlatformOptions {
-};
-
-OpenBatonPlatformOptions* ParsePlatformOptions(const v8::Local<v8::Object>& options) {
-  // currently none
-  return new WindowsPlatformOptions();
-}
-
-// Declare type of pointer to CancelIoEx function
-typedef BOOL (WINAPI *CancelIoExType)(HANDLE hFile, LPOVERLAPPED lpOverlapped);
-
-std::list<int> g_closingHandles;
-int bufferSize;
-void ErrorCodeToString(const char* prefix, int errorCode, char *errorStr) {
-  switch (errorCode) {
-  case ERROR_FILE_NOT_FOUND:
-    _snprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, "%s: File not found", prefix);
-    break;
-  case ERROR_INVALID_HANDLE:
-    _snprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, "%s: Invalid handle", prefix);
-    break;
-  case ERROR_ACCESS_DENIED:
-    _snprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, "%s: Access denied", prefix);
-    break;
-  case ERROR_OPERATION_ABORTED:
-    _snprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, "%s: operation aborted", prefix);
-    break;
-  default:
-    _snprintf_s(errorStr, ERROR_STRING_SIZE, _TRUNCATE, "%s: Unknown error code %d", prefix, errorCode);
-    break;
-  }
-}
-
-void EIO_Open(uv_work_t* req) {
-  OpenBaton* data = static_cast<OpenBaton*>(req->data);
-
-  char originalPath[1024];
-  strncpy_s(originalPath, sizeof(originalPath), data->path, _TRUNCATE);
-  // data->path is char[1024] but on Windows it has the form "COMx\0" or "COMxx\0"
-  // We want to prepend "\\\\.\\" to it before we call CreateFile
-  strncpy(data->path + 20, data->path, 10);
-  strncpy(data->path, "\\\\.\\", 4);
-  strncpy(data->path + 4, data->path + 20, 10);
-
-  int shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
-  if (data->lock) {
-    shareMode = 0;
-  }
-
-  HANDLE file = CreateFile(
-    data->path,
-    GENERIC_READ | GENERIC_WRITE,
-    shareMode,  // dwShareMode 0 Prevents other processes from opening if they request delete, read, or write access
-    NULL,
-    OPEN_EXISTING,
-    FILE_FLAG_OVERLAPPED,  // allows for reading and writing at the same time and sets the handle for asynchronous I/O
-    NULL
-  );
-
-  if (file == INVALID_HANDLE_VALUE) {
-    DWORD errorCode = GetLastError();
-    char temp[100];
-    _snprintf_s(temp, sizeof(temp), _TRUNCATE, "Opening %s", originalPath);
-    ErrorCodeToString(temp, errorCode, data->errorString);
-    return;
-  }
-
-  bufferSize = data->bufferSize;
-  if (bufferSize > MAX_BUFFER_SIZE) {
-    bufferSize = MAX_BUFFER_SIZE;
-  }
-
-  DCB dcb = { 0 };
-  SecureZeroMemory(&dcb, sizeof(DCB));
-  dcb.DCBlength = sizeof(DCB);
-
-  if (!GetCommState(file, &dcb)) {
-    ErrorCodeToString("GetCommState", GetLastError(), data->errorString);
-    return;
-  }
-
-  if (data->hupcl) {
-    dcb.fDtrControl = DTR_CONTROL_ENABLE;
-  } else {
-    dcb.fDtrControl = DTR_CONTROL_DISABLE;  // disable DTR to avoid reset
-  }
-
-  dcb.Parity = NOPARITY;
-  dcb.ByteSize = 8;
-  dcb.StopBits = ONESTOPBIT;
-  dcb.fInX = FALSE;
-  dcb.fOutX = FALSE;
-  dcb.fOutxDsrFlow = FALSE;
-  dcb.fOutxCtsFlow = FALSE;
-  dcb.fRtsControl = RTS_CONTROL_ENABLE;
-
-  dcb.fBinary = true;
-  dcb.BaudRate = data->baudRate;
-  dcb.ByteSize = data->dataBits;
-
-  switch (data->parity) {
-  case SERIALPORT_PARITY_NONE:
-    dcb.Parity = NOPARITY;
-    break;
-  case SERIALPORT_PARITY_MARK:
-    dcb.Parity = MARKPARITY;
-    break;
-  case SERIALPORT_PARITY_EVEN:
-    dcb.Parity = EVENPARITY;
-    break;
-  case SERIALPORT_PARITY_ODD:
-    dcb.Parity = ODDPARITY;
-    break;
-  case SERIALPORT_PARITY_SPACE:
-    dcb.Parity = SPACEPARITY;
-    break;
-  }
-
-  switch (data->stopBits) {
-  case SERIALPORT_STOPBITS_ONE:
-    dcb.StopBits = ONESTOPBIT;
-    break;
-  case SERIALPORT_STOPBITS_ONE_FIVE:
-    dcb.StopBits = ONE5STOPBITS;
-    break;
-  case SERIALPORT_STOPBITS_TWO:
-    dcb.StopBits = TWOSTOPBITS;
-    break;
-  }
-
-  if (!SetCommState(file, &dcb)) {
-    ErrorCodeToString("SetCommState", GetLastError(), data->errorString);
-    return;
-  }
-
-  // Set the com port read/write timeouts
-  DWORD serialBitsPerByte = 8/*std data bits*/ + 1/*start bit*/;
-  serialBitsPerByte += (data->parity == SERIALPORT_PARITY_NONE) ? 0 : 1;
-  serialBitsPerByte += (data->stopBits == SERIALPORT_STOPBITS_ONE) ? 1 : 2;
-  DWORD msPerByte = (data->baudRate > 0) ?
-                    ((1000 * serialBitsPerByte + data->baudRate - 1) / data->baudRate) :
-                    1;
-  if (msPerByte < 1) {
-    msPerByte = 1;
-  }
-  COMMTIMEOUTS commTimeouts = {0};
-  commTimeouts.ReadIntervalTimeout = msPerByte;  // Minimize chance of concatenating of separate serial port packets on read
-  commTimeouts.ReadTotalTimeoutMultiplier = 0;  // Do not allow big read timeout when big read buffer used
-  commTimeouts.ReadTotalTimeoutConstant = 1000;  // Total read timeout (period of read loop)
-  commTimeouts.WriteTotalTimeoutConstant = 1000;  // Const part of write timeout
-  commTimeouts.WriteTotalTimeoutMultiplier = msPerByte;  // Variable part of write timeout (per byte)
-  if (!SetCommTimeouts(file, &commTimeouts)) {
-    ErrorCodeToString("SetCommTimeouts", GetLastError(), data->errorString);
-    return;
-  }
-
-  // Remove garbage data in RX/TX queues
-  PurgeComm(file, PURGE_RXCLEAR);
-  PurgeComm(file, PURGE_TXCLEAR);
-
-  data->result = (int)file;
-}
-
-struct WatchPortBaton {
-  HANDLE fd;
-  DWORD bytesRead;
-  char buffer[MAX_BUFFER_SIZE];
-  char errorString[ERROR_STRING_SIZE];
-  DWORD errorCode;
-  bool disconnected;
-  Nan::Callback* dataCallback;
-  Nan::Callback* errorCallback;
-  Nan::Callback* disconnectedCallback;
-};
-
-void EIO_Update(uv_work_t* req) {
-  ConnectionOptionsBaton* data = static_cast<ConnectionOptionsBaton*>(req->data);
-
-  DCB dcb = { 0 };
-  SecureZeroMemory(&dcb, sizeof(DCB));
-  dcb.DCBlength = sizeof(DCB);
-
-  if (!GetCommState((HANDLE)data->fd, &dcb)) {
-    ErrorCodeToString("GetCommState", GetLastError(), data->errorString);
-    return;
-  }
-
-  dcb.BaudRate = data->baudRate;
-
-  if (!SetCommState((HANDLE)data->fd, &dcb)) {
-    ErrorCodeToString("SetCommState", GetLastError(), data->errorString);
-    return;
-  }
-}
-
-void EIO_Set(uv_work_t* req) {
-  SetBaton* data = static_cast<SetBaton*>(req->data);
-
-  if (data->rts) {
-    EscapeCommFunction((HANDLE)data->fd, SETRTS);
-  } else {
-    EscapeCommFunction((HANDLE)data->fd, CLRRTS);
-  }
-
-  if (data->dtr) {
-    EscapeCommFunction((HANDLE)data->fd, SETDTR);
-  } else {
-    EscapeCommFunction((HANDLE)data->fd, CLRDTR);
-  }
-
-  if (data->brk) {
-    EscapeCommFunction((HANDLE)data->fd, SETBREAK);
-  } else {
-    EscapeCommFunction((HANDLE)data->fd, CLRBREAK);
-  }
-
-  DWORD bits = 0;
-
-  GetCommMask((HANDLE)data->fd, &bits);
-
-  bits &= ~(EV_CTS | EV_DSR);
-
-  if (data->cts) {
-    bits |= EV_CTS;
-  }
-
-  if (data->dsr) {
-    bits |= EV_DSR;
-  }
-
-  if (!SetCommMask((HANDLE)data->fd, bits)) {
-    ErrorCodeToString("Setting options on COM port (SetCommMask)", GetLastError(), data->errorString);
-    return;
-  }
-}
-
-
-void EIO_WatchPort(uv_work_t* req) {
-  WatchPortBaton* data = static_cast<WatchPortBaton*>(req->data);
-  data->bytesRead = 0;
-  data->disconnected = false;
-
-  // Event used by GetOverlappedResult(..., TRUE) to wait for incoming data or timeout
-  // Event MUST be used if program has several simultaneous asynchronous operations
-  // on the same handle (i.e. ReadFile and WriteFile)
-  HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-
-  while (true) {
-    OVERLAPPED ov = {0};
-    ov.hEvent = hEvent;
-
-    // Start read operation - synchrounous or asynchronous
-    DWORD bytesReadSync = 0;
-    if (!ReadFile((HANDLE)data->fd, data->buffer, bufferSize, &bytesReadSync, &ov)) {
-      data->errorCode = GetLastError();
-      if (data->errorCode != ERROR_IO_PENDING) {
-        // Read operation error
-        if (data->errorCode == ERROR_OPERATION_ABORTED) {
-          data->disconnected = true;
-        } else {
-          ErrorCodeToString("Reading from COM port (ReadFile)", data->errorCode, data->errorString);
-          CloseHandle(hEvent);
-          return;
-        }
-        break;
-      }
-
-      // Read operation is asynchronous and is pending
-      // We MUST wait for operation completion before deallocation of OVERLAPPED struct
-      // or read data buffer
-
-      // Wait for async read operation completion or timeout
-      DWORD bytesReadAsync = 0;
-      if (!GetOverlappedResult((HANDLE)data->fd, &ov, &bytesReadAsync, TRUE)) {
-        // Read operation error
-        data->errorCode = GetLastError();
-        if (data->errorCode == ERROR_OPERATION_ABORTED) {
-          data->disconnected = true;
-        } else {
-          ErrorCodeToString("Reading from COM port (GetOverlappedResult)", data->errorCode, data->errorString);
-          CloseHandle(hEvent);
-          return;
-        }
-        break;
-      } else {
-        // Read operation completed asynchronously
-        data->bytesRead = bytesReadAsync;
-      }
-    } else {
-      // Read operation completed synchronously
-      data->bytesRead = bytesReadSync;
-    }
-
-    // Return data received if any
-    if (data->bytesRead > 0) {
-      break;
-    }
-  }
-
-  CloseHandle(hEvent);
-}
-
-bool IsClosingHandle(int fd) {
-  for (std::list<int>::iterator it = g_closingHandles.begin(); it != g_closingHandles.end(); ++it) {
-    if (fd == *it) {
-      g_closingHandles.remove(fd);
-      return true;
-    }
-  }
-  return false;
-}
-
-void DisposeWatchPortCallbacks(WatchPortBaton* data) {
-  delete data->dataCallback;
-  delete data->errorCallback;
-  delete data->disconnectedCallback;
-}
-
-// FinalizerCallback will prevent WatchPortBaton::buffer from getting
-// collected by gc while finalizing v8::ArrayBuffer. The buffer will
-// get cleaned up through this callback.
-static void FinalizerCallback(char* data, void* hint) {
-  uv_work_t* req = reinterpret_cast<uv_work_t*>(hint);
-  WatchPortBaton* wpb = static_cast<WatchPortBaton*>(req->data);
-  delete wpb;
-  delete req;
-}
-
-void EIO_AfterWatchPort(uv_work_t* req) {
-  Nan::HandleScope scope;
-
-  WatchPortBaton* data = static_cast<WatchPortBaton*>(req->data);
-  if (data->disconnected) {
-    data->disconnectedCallback->Call(0, NULL);
-    DisposeWatchPortCallbacks(data);
-    goto cleanup;
-  }
-
-  bool skipCleanup = false;
-  if (data->bytesRead > 0) {
-    v8::Local<v8::Value> argv[1];
-    argv[0] = Nan::NewBuffer(data->buffer, data->bytesRead, FinalizerCallback, req).ToLocalChecked();
-    skipCleanup = true;
-    data->dataCallback->Call(1, argv);
-  } else if (data->errorCode > 0) {
-    if (data->errorCode == ERROR_INVALID_HANDLE && IsClosingHandle((int)data->fd)) {
-      DisposeWatchPortCallbacks(data);
-      goto cleanup;
-    } else {
-      v8::Local<v8::Value> argv[1];
-      argv[0] = Nan::Error(data->errorString);
-      data->errorCallback->Call(1, argv);
-      Sleep(100);  // prevent the errors from occurring too fast
-    }
-  }
-  AfterOpenSuccess((int)data->fd, data->dataCallback, data->disconnectedCallback, data->errorCallback);
-
-cleanup:
-  if (!skipCleanup) {
-    delete data;
-    delete req;
-  }
-}
-
-void AfterOpenSuccess(int fd, Nan::Callback* dataCallback, Nan::Callback* disconnectedCallback, Nan::Callback* errorCallback) {
-  WatchPortBaton* baton = new WatchPortBaton();
-  memset(baton, 0, sizeof(WatchPortBaton));
-  baton->fd = (HANDLE)fd;
-  baton->dataCallback = dataCallback;
-  baton->errorCallback = errorCallback;
-  baton->disconnectedCallback = disconnectedCallback;
-
-  uv_work_t* req = new uv_work_t();
-  req->data = baton;
-
-  uv_queue_work(uv_default_loop(), req, EIO_WatchPort, (uv_after_work_cb)EIO_AfterWatchPort);
-}
-
-void EIO_Write(uv_work_t* req) {
-  QueuedWrite* queuedWrite = static_cast<QueuedWrite*>(req->data);
-  WriteBaton* data = static_cast<WriteBaton*>(queuedWrite->baton);
-  data->result = 0;
-
-  do {
-    OVERLAPPED ov = {0};
-    // Event used by GetOverlappedResult(..., TRUE) to wait for outgoing data or timeout
-    // Event MUST be used if program has several simultaneous asynchronous operations
-    // on the same handle (i.e. ReadFile and WriteFile)
-    ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
-
-    // Start write operation - synchronous or asynchronous
-    DWORD bytesWritten = 0;
-    if (!WriteFile((HANDLE)data->fd, data->bufferData, static_cast<DWORD>(data->bufferLength), &bytesWritten, &ov)) {
-      DWORD lastError = GetLastError();
-      if (lastError != ERROR_IO_PENDING) {
-        // Write operation error
-        ErrorCodeToString("Writing to COM port (WriteFile)", lastError, data->errorString);
-        CloseHandle(ov.hEvent);
-        return;
-      }
-      // Write operation is completing asynchronously
-      // We MUST wait for the operation completion before deallocation of OVERLAPPED struct
-      // or write data buffer
-
-      // block for async write operation completion
-      bytesWritten = 0;
-      if (!GetOverlappedResult((HANDLE)data->fd, &ov, &bytesWritten, TRUE)) {
-        // Write operation error
-        DWORD lastError = GetLastError();
-        ErrorCodeToString("Writing to COM port (GetOverlappedResult)", lastError, data->errorString);
-        CloseHandle(ov.hEvent);
-        return;
-      }
-    }
-    // Write operation completed synchronously
-    data->result = bytesWritten;
-    data->offset += data->result;
-    CloseHandle(ov.hEvent);
-  } while (data->bufferLength > data->offset);
-}
-
-void EIO_Close(uv_work_t* req) {
-  CloseBaton* data = static_cast<CloseBaton*>(req->data);
-
-  g_closingHandles.push_back(data->fd);
-
-  HMODULE hKernel32 = LoadLibrary("kernel32.dll");
-  // Look up function address
-  CancelIoExType pCancelIoEx = (CancelIoExType)GetProcAddress(hKernel32, "CancelIoEx");
-  // Do something with it
-  if (pCancelIoEx) {
-    // Function exists so call it
-    // Cancel all pending IO Requests for the current device
-    pCancelIoEx((HANDLE)data->fd, NULL);
-  }
-  if (!CloseHandle((HANDLE)data->fd)) {
-    ErrorCodeToString("closing connection", GetLastError(), data->errorString);
-    return;
-  }
-}
-
-/*
- * listComPorts.c -- list COM ports
- *
- * http://github.com/todbot/usbSearch/
- *
- * 2012, Tod E. Kurt, http://todbot.com/blog/
- *
- *
- * Uses DispHealper : http://disphelper.sourceforge.net/
- *
- * Notable VIDs & PIDs combos:
- * VID 0403 - FTDI
- *
- * VID 0403 / PID 6001 - Arduino Diecimila
- *
- */
-void EIO_List(uv_work_t* req) {
-  ListBaton* data = static_cast<ListBaton*>(req->data);
-
-  {
-    DISPATCH_OBJ(wmiSvc);
-    DISPATCH_OBJ(colDevices);
-
-    dhInitialize(TRUE);
-    dhToggleExceptions(FALSE);
-
-    dhGetObject(L"winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2", NULL, &wmiSvc);
-    dhGetValue(L"%o", &colDevices, wmiSvc, L".ExecQuery(%S)", L"Select * from Win32_PnPEntity");
-
-    int port_count = 0;
-    FOR_EACH(objDevice, colDevices, NULL) {
-      char* name = NULL;
-      char* pnpid = NULL;
-      char* manu = NULL;
-      char* match;
-
-      dhGetValue(L"%s", &name,  objDevice, L".Name");
-      dhGetValue(L"%s", &pnpid, objDevice, L".PnPDeviceID");
-
-      if (name != NULL && ((match = strstr(name, "(COM")) != NULL)) {  // look for "(COM23)"
-        // 'Manufacturuer' can be null, so only get it if we need it
-        dhGetValue(L"%s", &manu, objDevice,  L".Manufacturer");
-        port_count++;
-        char* comname = strtok(match, "()");
-        ListResultItem* resultItem = new ListResultItem();
-        resultItem->comName = comname;
-        resultItem->manufacturer = manu;
-        resultItem->pnpId = pnpid;
-        data->results.push_back(resultItem);
-        dhFreeString(manu);
-      }
-
-      dhFreeString(name);
-      dhFreeString(pnpid);
-    } NEXT(objDevice);
-
-    SAFE_RELEASE(colDevices);
-    SAFE_RELEASE(wmiSvc);
-
-    dhUninitialize(TRUE);
-  }
-
-  std::vector<UINT> ports;
-  if (CEnumerateSerial::UsingQueryDosDevice(ports)) {
-    for (size_t i = 0; i < ports.size(); i++) {
-      char comname[64] = { 0 };
-      _snprintf_s(comname, sizeof(comname), _TRUNCATE, "COM%u", ports[i]);
-      bool bFound = false;
-      for (std::list<ListResultItem*>::iterator ri = data->results.begin(); ri != data->results.end(); ++ri) {
-        if (stricmp((*ri)->comName.c_str(), comname) == 0) {
-          bFound = true;
-          break;
-        }
-      }
-      if (!bFound) {
-        ListResultItem* resultItem = new ListResultItem();
-        resultItem->comName = comname;
-        resultItem->manufacturer = "";
-        resultItem->pnpId = "";
-        data->results.push_back(resultItem);
-      }
-    }
-  }
-}
-
-void EIO_Flush(uv_work_t* req) {
-  FlushBaton* data = static_cast<FlushBaton*>(req->data);
-
-  if (!FlushFileBuffers((HANDLE)data->fd)) {
-    ErrorCodeToString("flushing connection (FlushFileBuffers)", GetLastError(), data->errorString);
-    return;
-  }
-}
-
-void EIO_Drain(uv_work_t* req) {
-  DrainBaton* data = static_cast<DrainBaton*>(req->data);
-
-  if (!FlushFileBuffers((HANDLE)data->fd)) {
-    ErrorCodeToString("draining connection (FlushFileBuffers)", GetLastError(), data->errorString);
-    return;
-  }
-}
-
-#endif
diff --git a/js/node_modules/serialport/src/win/AutoHModule.h b/js/node_modules/serialport/src/win/AutoHModule.h
deleted file mode 100644
index c0642a9f1b1eb800ff3171c0d3d0c29b312e10b2..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/win/AutoHModule.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
-Module : AutoHModule.h
-Purpose: Defines the interface for a class which supports auto closing of a HMODULE via FreeLibrary and 
-         setting of the last Win32 error via SetLastError
-Created: PJN / 10-01-2013
-
-Copyright (c) 2013 by PJ Naughter (Web: www.naughter.com, Email: pjna@naughter.com)
-
-All rights reserved.
-
-Copyright / Usage Details:
-
-You are allowed to include the source code in any product (commercial, shareware, freeware or otherwise) 
-when your product is released in binary form. You are allowed to modify the source code in any way you want 
-except you cannot modify the copyright details at the top of each module. If you want to distribute source 
-code with your application, then you are only allowed to distribute versions released by the author. This is 
-to maintain a single distribution point for the source code. 
-
-*/
-
-
-///////////////////////// Macros / Structs etc ////////////////////////////////
-
-#pragma once
-
-#ifndef __AUTOHMODULE_H__
-#define __AUTOHMODULE_H__
-
-
-///////////////////////// Classes /////////////////////////////////////////////
-
-class CAutoHModule
-{
-public:
-//Constructors / Destructors
-  CAutoHModule() : m_hModule(NULL), 
-                    m_dwError(ERROR_SUCCESS)
-  {
-  }
-
-  explicit CAutoHModule(HMODULE hModule) : m_hModule(hModule), 
-                                            m_dwError(GetLastError())
-  {
-  }
-
-  explicit CAutoHModule(HMODULE hModule, DWORD dwError) : m_hModule(hModule), 
-                                                          m_dwError(dwError)
-  {
-  }
-
-  ~CAutoHModule()
-  {
-    if (m_hModule != NULL)
-    {
-      FreeLibrary(m_hModule);
-      m_hModule = NULL;
-    }
-    SetLastError(m_dwError);
-  }
-
-  operator HMODULE() 
-  {
-    return m_hModule;
-  }
-
-//Member variables
-  HMODULE m_hModule;
-  DWORD m_dwError;
-};
-
-
-#endif //__AUTOHMODULE_H__
diff --git a/js/node_modules/serialport/src/win/AutoHandle.h b/js/node_modules/serialport/src/win/AutoHandle.h
deleted file mode 100644
index 1ffca47aed0bc2792ddbff88c8370e427e1007b9..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/win/AutoHandle.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
-Module : AutoHandle.h
-Purpose: Defines the interface for a class which supports auto closing of a handle via CloseHandle
-Created: PJN / 10-01-2013
-
-Copyright (c) 2013 by PJ Naughter (Web: www.naughter.com, Email: pjna@naughter.com)
-
-All rights reserved.
-
-Copyright / Usage Details:
-
-You are allowed to include the source code in any product (commercial, shareware, freeware or otherwise) 
-when your product is released in binary form. You are allowed to modify the source code in any way you want 
-except you cannot modify the copyright details at the top of each module. If you want to distribute source 
-code with your application, then you are only allowed to distribute versions released by the author. This is 
-to maintain a single distribution point for the source code. 
-
-*/
-
-
-///////////////////////// Macros / Structs etc ////////////////////////////////
-
-#pragma once
-
-#ifndef __AUTOHANDLE_H__
-#define __AUTOHANDLE_H__
-
-
-///////////////////////// Classes /////////////////////////////////////////////
-
-class CAutoHandle
-{
-public:
-//Constructors / Destructors
-  CAutoHandle() : m_hHandle(INVALID_HANDLE_VALUE)
-  {
-  }
-
-  explicit CAutoHandle(HANDLE hHandle) : m_hHandle(hHandle)
-  {
-  }
-
-  ~CAutoHandle()
-  {
-    if (m_hHandle != INVALID_HANDLE_VALUE)
-    {
-      CloseHandle(m_hHandle);
-      m_hHandle = INVALID_HANDLE_VALUE;
-    }
-  }
-
-//Methods
-  operator HANDLE() 
-  {
-    return m_hHandle;
-  }
-
-//Member variables
-  HANDLE m_hHandle;
-};
-
-#endif //__AUTOHANDLE_H__
diff --git a/js/node_modules/serialport/src/win/AutoHeapAlloc.h b/js/node_modules/serialport/src/win/AutoHeapAlloc.h
deleted file mode 100644
index 407e3a05160964877bf0ea1ab4954f8d6048d699..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/win/AutoHeapAlloc.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
-Module : AutoHeapAlloc.h
-Purpose: Defines the interface for a class which supports auto closing of a heap pointer allocated via HeapAlloc
-Created: PJN / 10-01-2013
-
-Copyright (c) 2013 by PJ Naughter (Web: www.naughter.com, Email: pjna@naughter.com)
-
-All rights reserved.
-
-Copyright / Usage Details:
-
-You are allowed to include the source code in any product (commercial, shareware, freeware or otherwise) 
-when your product is released in binary form. You are allowed to modify the source code in any way you want 
-except you cannot modify the copyright details at the top of each module. If you want to distribute source 
-code with your application, then you are only allowed to distribute versions released by the author. This is 
-to maintain a single distribution point for the source code. 
-
-*/
-
-
-///////////////////////// Macros / Structs etc ////////////////////////////////
-
-#pragma once
-
-#ifndef __AUTOHEAPALLOC_H__
-#define __AUTOHEAPALLOC_H__
-
-
-///////////////////////// Includes ////////////////////////////////////////////                      
-
-#include <assert.h>
-
-
-///////////////////////// Classes /////////////////////////////////////////////
-
-class CAutoHeapAlloc
-{
-public:
-//Constructors / Destructors
-  CAutoHeapAlloc(HANDLE hHeap = GetProcessHeap(), DWORD dwHeapFreeFlags = 0) : m_pData(NULL),
-                                                                               m_hHeap(hHeap),
-                                                                               m_dwHeapFreeFlags(dwHeapFreeFlags)
-  {
-  }
-
-  BOOL Allocate(SIZE_T dwBytes, DWORD dwFlags = 0)
-  {
-    //Validate our parameters
-    assert(m_pData == NULL);
-
-    m_pData = HeapAlloc(m_hHeap, dwFlags, dwBytes);
-    return (m_pData != NULL);
-  }
-
-  ~CAutoHeapAlloc()
-  {
-    if (m_pData != NULL)
-    {
-      HeapFree(m_hHeap, m_dwHeapFreeFlags, m_pData);
-      m_pData = NULL;
-    }
-  }
-
-//Methods
-
-//Member variables
-  LPVOID m_pData;
-  HANDLE m_hHeap;
-  DWORD  m_dwHeapFreeFlags;
-};
-
-#endif //__AUTOHEAPALLOC_H__
diff --git a/js/node_modules/serialport/src/win/disphelper.c b/js/node_modules/serialport/src/win/disphelper.c
deleted file mode 100644
index a3a10dd9fc929fd529d8d0563edd2da56a344812..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/win/disphelper.c
+++ /dev/null
@@ -1,1292 +0,0 @@
-/* This file is the compacted single file version of the DispHelper COM helper library.
- * DispHelper allows you to call COM objects with an extremely simple printf style syntax.
- * DispHelper can be used from C++ or even plain C. It works with most Windows compilers
- * including Dev-CPP, Visual C++ and LCC-WIN32. Including DispHelper in your project
- * couldn't be simpler as it is available in a compacted single file version (this file).
- *
- * Included with DispHelper are over 20 samples that demonstrate using COM objects
- * including ADO, CDO, Outlook, Eudora, Excel, Word, Internet Explorer, MSHTML,
- * PocketSoap, Word Perfect, MS Agent, SAPI, MSXML, WIA, dexplorer and WMI.
- *
- * DispHelper is free open source software provided under the BSD license.
- *
- * Find out more, browse the readable version of the source code
- * and download DispHelper at:
- * http://sourceforge.net/projects/disphelper/
- * http://disphelper.sourceforge.net/
- */
-
-
-/* To use DispHelper in your project, include this file(disphelper.c) and the
- * header (disphelper.h). For Visual C++, Borland C++ and LCC-Win32 import
- * libraries are included via pragma directives. For other compilers you may
- * need to add ole32, oleaut32 and uuid. To do this in Dev-CPP add
- * "-lole32 -loleaut32 -luuid" to the linker box under Project->Project Options->Parameters.
- */
-
-
-/* If you are using Dev-CPP and get errors when compiling this file:
- * Make sure this file is set to compile as C and not C++ under
- * Project->Project Options->Files.
- */
-
-
-#define DISPHELPER_INTERNAL_BUILD
-#include "disphelper.h"
-#include <math.h>
-#include <assert.h>
-
-/* ----- convert.h ----- */
-
-HRESULT ConvertFileTimeToVariantTime(FILETIME * pft, DATE * pDate);
-HRESULT ConvertVariantTimeToFileTime(DATE date, FILETIME * pft);
-
-HRESULT ConvertVariantTimeToSystemTime(DATE date, SYSTEMTIME * pSystemTime);
-HRESULT ConvertSystemTimeToVariantTime(SYSTEMTIME * pSystemTime, DATE * pDate);
-
-HRESULT ConvertTimeTToVariantTime(time_t timeT, DATE * pDate);
-HRESULT ConvertVariantTimeToTimeT(DATE date, time_t * pTimeT);
-
-HRESULT ConvertAnsiStrToBStr(LPCSTR szAnsiIn, BSTR * lpBstrOut);
-HRESULT ConvertBStrToAnsiStr(BSTR bstrIn, LPSTR * lpszOut);
-
-/* ----- dh_create.c ----- */
-
-HRESULT dhCreateObjectEx(LPCOLESTR szProgId, REFIID riid, DWORD dwClsContext,
-			    COSERVERINFO * pServerInfo, void ** ppv)
-{
-	CLSID clsid;
-	HRESULT hr;
-	IClassFactory * pCf = NULL;
-
-	DH_ENTER(L"CreateObjectEx");
-
-	if (!szProgId || !riid || !ppv) return DH_EXIT(E_INVALIDARG, szProgId);
-
-	if (L'{' == szProgId[0])
-		hr = CLSIDFromString((LPOLESTR) szProgId, &clsid);
-	else
-		hr = CLSIDFromProgID(szProgId, &clsid);
-
-	if (SUCCEEDED(hr)) hr = CoGetClassObject(&clsid, dwClsContext, pServerInfo, &IID_IClassFactory, (void **) &pCf);
-	if (SUCCEEDED(hr)) hr = pCf->lpVtbl->CreateInstance(pCf, NULL, riid, ppv);
-
-	if (pCf) pCf->lpVtbl->Release(pCf);
-
-	return DH_EXIT(hr, szProgId);
-}
-
-HRESULT dhGetObjectEx(LPCOLESTR szPathName, LPCOLESTR szProgId, REFIID riid,
-		         DWORD dwClsContext, LPVOID lpvReserved, void ** ppv)
-{
-	HRESULT hr;
-
-	DH_ENTER(L"GetObjectEx");
-
-	if ((!szProgId && !szPathName) || !riid || !ppv || lpvReserved) return DH_EXIT(E_INVALIDARG, szProgId);
-
-	if (szPathName)
-	{
-
-		if (!szProgId)
-		{
-			hr = CoGetObject(szPathName, NULL, riid, ppv);
-		}
-		else
-		{
-			IPersistFile * ppf = NULL;
-
-			hr = dhCreateObjectEx(szProgId, &IID_IPersistFile, dwClsContext, NULL, (void **) &ppf);
-
-			if (SUCCEEDED(hr)) hr = ppf->lpVtbl->Load(ppf, szPathName, 0);
-			if (SUCCEEDED(hr)) hr = ppf->lpVtbl->QueryInterface(ppf, riid, ppv);
-
-			if (ppf) ppf->lpVtbl->Release(ppf);
-		}
-	}
-	else
-	{
-
-		CLSID clsid;
-		IUnknown * pUnk = NULL;
-
-		if (L'{' == szProgId[0])
-			hr = CLSIDFromString((LPOLESTR) szProgId, &clsid);
-		else
-			hr = CLSIDFromProgID(szProgId, &clsid);
-
-		if (SUCCEEDED(hr)) hr = GetActiveObject(&clsid, NULL, &pUnk);
-		if (SUCCEEDED(hr)) hr = pUnk->lpVtbl->QueryInterface(pUnk, riid, ppv);
-
-		if (pUnk) pUnk->lpVtbl->Release(pUnk);
-	}
-
-	return DH_EXIT(hr, szProgId);
-}
-
-HRESULT dhCreateObject(LPCOLESTR szProgId, LPCWSTR szMachine, IDispatch ** ppDisp)
-{
-	COSERVERINFO si = { 0 };
-
-	DH_ENTER(L"CreateObject");
-
-	si.pwszName = (LPWSTR) szMachine;
-
-	return DH_EXIT(dhCreateObjectEx(szProgId, &IID_IDispatch,
-			  szMachine ? CLSCTX_REMOTE_SERVER : CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER,
-			  szMachine ? &si : NULL, (void **) ppDisp), szProgId);
-}
-
-HRESULT dhGetObject(LPCOLESTR szPathName, LPCOLESTR szProgId, IDispatch ** ppDisp)
-{
-	DH_ENTER(L"GetObject");
-
-	return DH_EXIT(dhGetObjectEx(szPathName, szProgId, &IID_IDispatch,
-			  CLSCTX_LOCAL_SERVER|CLSCTX_INPROC_SERVER, NULL, (void **) ppDisp), szProgId);
-}
-
-HRESULT dhCallMethod(IDispatch * pDisp, LPCOLESTR szMember, ... )
-{
-	HRESULT hr;
-	va_list marker;
-
-	DH_ENTER(L"CallMethod");
-
-	va_start(marker, szMember);
-
-	hr = dhCallMethodV(pDisp, szMember, &marker);
-
-	va_end(marker);
-
-	return DH_EXIT(hr, szMember);
-}
-
-HRESULT dhPutValue(IDispatch * pDisp, LPCOLESTR szMember, ...)
-{
-	HRESULT hr;
-	va_list marker;
-
-	DH_ENTER(L"PutValue");
-
-	va_start(marker, szMember);
-
-	hr = dhPutValueV(pDisp, szMember, &marker);
-
-	va_end(marker);
-
-	return DH_EXIT(hr, szMember);
-}
-
-HRESULT dhPutRef(IDispatch * pDisp, LPCOLESTR szMember, ...)
-{
-	HRESULT hr;
-	va_list marker;
-
-	DH_ENTER(L"PutRef");
-
-	va_start(marker, szMember);
-
-	hr = dhPutRefV(pDisp, szMember, &marker);
-
-	va_end(marker);
-
-	return DH_EXIT(hr, szMember);
-}
-
-HRESULT dhGetValue(LPCWSTR szIdentifier, void * pResult, IDispatch * pDisp, LPCOLESTR szMember, ...)
-{
-	HRESULT hr;
-	va_list marker;
-
-	DH_ENTER(L"GetValue");
-
-	va_start(marker, szMember);
-
-	hr = dhGetValueV(szIdentifier, pResult, pDisp, szMember, &marker);
-
-	va_end(marker);
-
-	return DH_EXIT(hr, szMember);
-}
-
-HRESULT dhInvoke(int invokeType, VARTYPE returnType, VARIANT * pvResult, IDispatch * pDisp, LPCOLESTR szMember, ...)
-{
-	HRESULT hr;
-	va_list marker;
-
-	DH_ENTER(L"Invoke");
-
-	va_start(marker, szMember);
-
-	hr = dhInvokeV(invokeType, returnType, pvResult, pDisp, szMember, &marker);
-
-	va_end(marker);
-
-	return DH_EXIT(hr, szMember);
-}
-
-/* ----- dh_core.c ----- */
-
-BOOL dh_g_bIsUnicodeMode;
-
-HRESULT dhInvokeArray(int invokeType, VARIANT * pvResult, UINT cArgs,
-                         IDispatch * pDisp, LPCOLESTR szMember, VARIANT * pArgs)
-{
-	DISPPARAMS dp       = { 0 };
-	EXCEPINFO excep     = { 0 };
-	DISPID dispidNamed  = DISPID_PROPERTYPUT;
-	DISPID dispID;
-	UINT uiArgErr;
-	HRESULT hr;
-
-	DH_ENTER(L"InvokeArray");
-
-	if(!pDisp || !szMember || (cArgs != 0 && !pArgs)) return DH_EXIT(E_INVALIDARG, szMember);
-
-	hr = pDisp->lpVtbl->GetIDsOfNames(pDisp, &IID_NULL, (LPOLESTR *) &szMember, 1, LOCALE_USER_DEFAULT, &dispID);
-
-	if(FAILED(hr)) return DH_EXITEX(hr, TRUE, szMember, szMember, NULL, 0);
-
-	if (pvResult != NULL) VariantInit(pvResult);
-
-	dp.cArgs  = cArgs;
-	dp.rgvarg = pArgs;
-
-	if(invokeType & (DISPATCH_PROPERTYPUT | DISPATCH_PROPERTYPUTREF))
-	{
-		dp.cNamedArgs = 1;
-		dp.rgdispidNamedArgs = &dispidNamed;
-	}
-
-	hr = pDisp->lpVtbl->Invoke(pDisp, dispID, &IID_NULL, LOCALE_USER_DEFAULT, (WORD) invokeType, &dp, pvResult, &excep, &uiArgErr);
-
-	return DH_EXITEX(hr, TRUE, szMember, szMember, &excep, uiArgErr);
-}
-
-HRESULT dhCallMethodV(IDispatch * pDisp, LPCOLESTR szMember, va_list * marker)
-{
-	DH_ENTER(L"CallMethodV");
-
-	return DH_EXIT(dhInvokeV(DISPATCH_METHOD, VT_EMPTY, NULL, pDisp, szMember, marker), szMember);
-}
-
-HRESULT dhPutValueV(IDispatch * pDisp, LPCOLESTR szMember, va_list * marker)
-{
-	DH_ENTER(L"PutValueV");
-
-	return DH_EXIT(dhInvokeV(DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, pDisp, szMember, marker), szMember);
-}
-
-HRESULT dhPutRefV(IDispatch * pDisp, LPCOLESTR szMember, va_list * marker)
-{
-	DH_ENTER(L"PutRefV");
-
-	return DH_EXIT(dhInvokeV(DISPATCH_PROPERTYPUTREF, VT_EMPTY, NULL, pDisp, szMember, marker), szMember);
-}
-
-HRESULT dhGetValueV(LPCWSTR szIdentifier, void * pResult, IDispatch * pDisp, LPCOLESTR szMember, va_list * marker)
-{
-	VARIANT vtResult;
-	VARTYPE returnType;
-	HRESULT hr;
-
-	DH_ENTER(L"GetValueV");
-
-	if (!pResult || !szIdentifier) return DH_EXIT(E_INVALIDARG, szMember);
-
-	if (*szIdentifier == L'%') szIdentifier++;
-
-	switch(*szIdentifier)
-	{
-		case L'd': returnType = VT_I4;       break;
-		case L'u': returnType = VT_UI4;      break;
-		case L'e': returnType = VT_R8;       break;
-		case L'b': returnType = VT_BOOL;     break;
-		case L'v': returnType = VT_EMPTY;    break;
-		case L'B': returnType = VT_BSTR;     break;
-		case L'S': returnType = VT_BSTR;     break;
-		case L's': returnType = VT_BSTR;     break;
-		case L'T': returnType = VT_BSTR;     break;
-		case L'o': returnType = VT_DISPATCH; break;
-		case L'O': returnType = VT_UNKNOWN;  break;
-		case L't': returnType = VT_DATE;     break;
-		case L'W': returnType = VT_DATE;     break;
-		case L'f': returnType = VT_DATE;     break;
-		case L'D': returnType = VT_DATE;     break;
-#ifndef _WIN64
-		case L'p': returnType = VT_I4;       break;
-#else
-		case L'p': returnType = VT_I8;       break;
-#endif
-		default:
-			DEBUG_NOTIFY_INVALID_IDENTIFIER(*szIdentifier);
-			return DH_EXIT(E_INVALIDARG, szMember);
-	}
-
-	hr = dhInvokeV(DISPATCH_PROPERTYGET|DISPATCH_METHOD, returnType, &vtResult, pDisp, szMember, marker);
-	if (FAILED(hr)) return DH_EXIT(hr, szMember);
-
-	switch(*szIdentifier)
-	{
-		case L'd':
-			*((LONG *) pResult) = V_I4(&vtResult);
-			break;
-
-		case L'u':
-			*((ULONG *) pResult) = V_UI4(&vtResult);
-			break;
-
-		case L'e':
-			*((DOUBLE *) pResult) = V_R8(&vtResult);
-			break;
-
-		case L'b':
-			*((BOOL *) pResult) = V_BOOL(&vtResult);
-			break;
-
-		case L'v':
-			*((VARIANT *) pResult) = vtResult;
-			break;
-
-		case L'B':
-			*((BSTR *) pResult) = V_BSTR(&vtResult);
-			break;
-
-		case L'S':
-			*((LPWSTR *) pResult) = V_BSTR(&vtResult);
-			break;
-
-		case L's':
-			hr = ConvertBStrToAnsiStr(V_BSTR(&vtResult), (LPSTR *) pResult);
-			SysFreeString(V_BSTR(&vtResult));
-			break;
-
-		case L'T':
-			if (dh_g_bIsUnicodeMode)
-			{
-				*((LPWSTR *) pResult) = V_BSTR(&vtResult);
-			}
-			else
-			{
-				hr = ConvertBStrToAnsiStr(V_BSTR(&vtResult), (LPSTR *) pResult);
-				SysFreeString(V_BSTR(&vtResult));
-			}
-			break;
-
-		case L'o':
-			*((IDispatch **) pResult) = V_DISPATCH(&vtResult);
-			if (V_DISPATCH(&vtResult) == NULL) hr = E_NOINTERFACE;
-			break;
-
-		case L'O':
-			*((IUnknown **) pResult) = V_UNKNOWN(&vtResult);
-			if (V_UNKNOWN(&vtResult) == NULL) hr = E_NOINTERFACE;
-			break;
-
-		case L't':
-			hr = ConvertVariantTimeToTimeT(V_DATE(&vtResult), (time_t *) pResult);
-			break;
-
-		case L'W':
-			hr = ConvertVariantTimeToSystemTime(V_DATE(&vtResult), (SYSTEMTIME *) pResult);
-			break;
-
-		case L'f':
-			hr = ConvertVariantTimeToFileTime(V_DATE(&vtResult), (FILETIME *) pResult);
-			break;
-
-		case L'D':
-			*((DATE *) pResult) = V_DATE(&vtResult);
-			break;
-
-		case L'p':
-#ifndef _WIN64
-			*((LPVOID *) pResult) = (LPVOID) V_I4(&vtResult);
-#else
-			*((LPVOID *) pResult) = (LPVOID) V_I8(&vtResult);
-#endif
-			break;
-	}
-
-	return DH_EXIT(hr, szMember);
-}
-
-/* ----- dh_invoke.c ----- */
-
-static HRESULT TraverseSubObjects(IDispatch ** ppDisp, LPWSTR * lpszMember, va_list * marker);
-static HRESULT CreateArgumentArray(LPWSTR szTemp, VARIANT * pArgs, BOOL * pbFreeList, UINT * pcArgs, va_list * marker);
-static HRESULT InternalInvokeV(int invokeType, VARTYPE returnType, VARIANT * pvResult, IDispatch * pDisp, LPOLESTR szMember, va_list * marker);
-static HRESULT ExtractArgument(VARIANT * pvArg, WCHAR chIdentifier, BOOL * pbFreeArg, va_list * marker);
-
-HRESULT dhInvokeV(int invokeType, VARTYPE returnType, VARIANT * pvResult,
-                     IDispatch * pDisp, LPCOLESTR szMember, va_list * marker)
-{
-	WCHAR szCopy[DH_MAX_MEMBER];
-	LPWSTR szTemp                  = szCopy;
-	SIZE_T cchDest                 = ARRAYSIZE(szCopy);
-	HRESULT hr;
-
-	DH_ENTER(L"InvokeV");
-
-	if (!pDisp || !szMember || !marker) return DH_EXIT(E_INVALIDARG, szMember);
-
-	do
-	{
-		if (cchDest-- == 0) return DH_EXIT(E_INVALIDARG, szMember);
-	}
-	while( (*szTemp++ = *szMember++) );
-
-	szTemp = szCopy;
-
-	hr = TraverseSubObjects(&pDisp, &szTemp, marker);
-
-	if (SUCCEEDED(hr))
-	{
-		hr = InternalInvokeV(invokeType, returnType, pvResult, pDisp, szTemp, marker);
-
-		pDisp->lpVtbl->Release(pDisp);
-	}
-
-	return DH_EXIT(hr, szMember);
-}
-
-static HRESULT TraverseSubObjects(IDispatch ** ppDisp, LPWSTR * lpszMember, va_list * marker)
-{
-	LPWSTR szSeperator, szTemp;
-	VARIANT vtObject;
-	HRESULT hr;
-
-	DH_ENTER(L"TraverseSubObjects");
-
-	if (**lpszMember == L'.') (*lpszMember)++;
-
-	(*ppDisp)->lpVtbl->AddRef(*ppDisp);
-
-	szSeperator = wcschr(*lpszMember, L'.');
-
-	if (szSeperator == NULL) return DH_EXIT(NOERROR, *lpszMember);
-
-	szTemp = *lpszMember;
-
-	do
-	{
-		*szSeperator = L'\0';
-
-		hr = InternalInvokeV(DISPATCH_METHOD|DISPATCH_PROPERTYGET, VT_DISPATCH,
-		                     &vtObject, *ppDisp, szTemp, marker);
-
-		if (!vtObject.pdispVal && SUCCEEDED(hr)) hr = E_NOINTERFACE;
-
-		(*ppDisp)->lpVtbl->Release(*ppDisp);
-
-		if (FAILED(hr)) break;
-
-		*ppDisp = vtObject.pdispVal;
-
-		szTemp = szSeperator + 1;
-
-	}
-	while ( (wcschr(szTemp, L'.') ) != NULL);
-
-	*lpszMember = szTemp;
-
-	return DH_EXIT(hr, *lpszMember);
-}
-
-static HRESULT InternalInvokeV(int invokeType, VARTYPE returnType, VARIANT * pvResult,
-                               IDispatch * pDisp, LPOLESTR szMember, va_list * marker)
-{
-	VARIANT vtArgs[DH_MAX_ARGS];
-	BOOL bFreeList[DH_MAX_ARGS];
-	HRESULT hr;
-	UINT cArgs, iArg;
-
-	DH_ENTER(L"InternalInvokeV");
-
-	hr = CreateArgumentArray(szMember, vtArgs, bFreeList, &cArgs, marker);
-
-	if (SUCCEEDED(hr))
-	{
-		hr = dhInvokeArray(invokeType, pvResult, cArgs, pDisp, szMember, &vtArgs[DH_MAX_ARGS - cArgs]);
-
-		for (iArg = DH_MAX_ARGS - cArgs;iArg < DH_MAX_ARGS;iArg++)
-		{
-			if (bFreeList[iArg]) VariantClear(&vtArgs[iArg]);
-		}
-
-		if (SUCCEEDED(hr) && pvResult != NULL &&
-	            pvResult->vt != returnType && returnType != VT_EMPTY)
-		{
-			hr = VariantChangeType(pvResult, pvResult, 16 , returnType);
-			if (FAILED(hr)) VariantClear(pvResult);
-		}
-	}
-
-	return DH_EXIT(hr, szMember);
-}
-
-static HRESULT CreateArgumentArray(LPWSTR szMember, VARIANT * pArgs, BOOL * pbFreeList,
-				   UINT * pcArgs, va_list * marker)
-{
-	HRESULT hr        = NOERROR;
-	INT iArg          = DH_MAX_ARGS;
-	BOOL bInArguments = FALSE;
-
-	DH_ENTER(L"CreateArgumentArray");
-
-	while (*szMember)
-	{
-		if (!bInArguments &&
-                   (*szMember == L'(' || *szMember == L' ' || *szMember == L'=') )
-		{
-			bInArguments = TRUE;
-
-			*szMember = L'\0';
-		}
-		else if  (*szMember == L'%')
-		{
-			if (!bInArguments)
-			{
-				bInArguments = TRUE;
-				*szMember = L'\0';
-			}
-
-			iArg--;
-
-			if (iArg == -1) { hr = E_INVALIDARG; break; }
-
-			szMember++;
-
-			hr = ExtractArgument(&pArgs[iArg], *szMember, &pbFreeList[iArg], marker);
-
-			if (FAILED(hr)) break;
-		}
-
-		szMember++;
-	}
-
-	*pcArgs = DH_MAX_ARGS - iArg;
-
-	if (FAILED(hr))
-	{
-		for (++iArg;iArg < DH_MAX_ARGS; iArg++)
-		{
-			if (pbFreeList[iArg]) VariantClear(&pArgs[iArg]);
-		}
-	}
-
-	return DH_EXIT(hr, szMember);
-}
-
-static HRESULT ExtractArgument(VARIANT * pvArg, WCHAR chIdentifier, BOOL * pbFreeArg, va_list * marker)
-{
-	HRESULT hr = NOERROR;
-
-	*pbFreeArg = FALSE;
-
-	if (chIdentifier == L'T') chIdentifier = (dh_g_bIsUnicodeMode ? L'S' : L's');
-
-	switch (chIdentifier)
-	{
-		case L'd':
-			V_VT(pvArg)  = VT_I4;
-			V_I4(pvArg)  = va_arg(*marker, LONG);
-			break;
-
-		case L'u':
-			V_VT(pvArg)  = VT_UI4;
-			V_UI4(pvArg) = va_arg(*marker, ULONG);
-			break;
-
-		case L'e':
-			V_VT(pvArg)  = VT_R8;
-			V_R8(pvArg)  = va_arg(*marker, DOUBLE);
-			break;
-
-		case L'b':
-			V_VT(pvArg)   = VT_BOOL;
-			V_BOOL(pvArg) = ( va_arg(*marker, BOOL) ? VARIANT_TRUE : VARIANT_FALSE );
-			break;
-
-		case L'v':
-			*pvArg  = *va_arg(*marker, VARIANT *);
-			break;
-
-		case L'm':
-			V_VT(pvArg)    = VT_ERROR;
-			V_ERROR(pvArg) = DISP_E_PARAMNOTFOUND;
-			break;
-
-		case L'B':
-			V_VT(pvArg)   = VT_BSTR;
-			V_BSTR(pvArg) = va_arg(*marker, BSTR);
-			break;
-
-		case L'S':
-		{
-			LPOLESTR szTemp = va_arg(*marker, LPOLESTR);
-
-			V_VT(pvArg)   = VT_BSTR;
-			V_BSTR(pvArg) = SysAllocString(szTemp);
-
-			if (V_BSTR(pvArg) == NULL && szTemp != NULL) hr = E_OUTOFMEMORY;
-
-			*pbFreeArg = TRUE;
-			break;
-		}
-
-		case L's':
-			V_VT(pvArg) = VT_BSTR;
-			hr = ConvertAnsiStrToBStr(va_arg(*marker, LPSTR), &V_BSTR(pvArg));
-			*pbFreeArg = TRUE;
-			break;
-
-		case L'o':
-			V_VT(pvArg)       = VT_DISPATCH;
-			V_DISPATCH(pvArg) = va_arg(*marker, IDispatch *);
-			break;
-
-		case L'O':
-			V_VT(pvArg)      = VT_UNKNOWN;
-			V_UNKNOWN(pvArg) = va_arg(*marker, IUnknown *);
-			break;
-
-		case L'D':
-			V_VT(pvArg)   = VT_DATE;
-			V_DATE(pvArg) = va_arg(*marker, DATE);
-			break;
-
-		case L't':
-			V_VT(pvArg) = VT_DATE;
-			hr = ConvertTimeTToVariantTime(va_arg(*marker, time_t), &V_DATE(pvArg));
-			break;
-
-		case L'W':
-			V_VT(pvArg) = VT_DATE;
-			hr = ConvertSystemTimeToVariantTime(va_arg(*marker, SYSTEMTIME *), &V_DATE(pvArg));
-			break;
-
-		case L'f':
-			V_VT(pvArg) = VT_DATE;
-			hr = ConvertFileTimeToVariantTime(va_arg(*marker, FILETIME *), &V_DATE(pvArg));
-			break;
-
-		case L'p':
-#ifndef _WIN64
-			V_VT(pvArg) = VT_I4;
-			V_I4(pvArg) = (LONG) va_arg(*marker, LPVOID);
-#else
-			V_VT(pvArg) = VT_I8;
-			V_I8(pvArg) = (LONGLONG) va_arg(*marker, LPVOID);
-#endif
-			break;
-
-		default:
-			hr = E_INVALIDARG;
-			DEBUG_NOTIFY_INVALID_IDENTIFIER(chIdentifier);
-			break;
-	}
-
-	return hr;
-}
-
-/* ----- dh_enum.c ----- */
-
-HRESULT dhEnumBeginV(IEnumVARIANT ** ppEnum, IDispatch * pDisp, LPCOLESTR szMember, va_list * marker)
-{
-	DISPPARAMS dp    = { 0 };
-	EXCEPINFO excep  = { 0 };
-	VARIANT vtResult;
-	IDispatch * pDispObj;
-	HRESULT hr;
-
-	DH_ENTER(L"EnumBeginV");
-
-	if (!ppEnum || !pDisp) return DH_EXIT(E_INVALIDARG, szMember);
-
-	if (szMember != NULL)
-	{
-		hr = dhGetValueV(L"%o", &pDispObj, pDisp, szMember, marker);
-		if (FAILED(hr)) return DH_EXIT(hr, szMember);
-	}
-	else
-	{
-		pDispObj = pDisp;
-	}
-
-	hr = pDispObj->lpVtbl->Invoke(pDispObj, DISPID_NEWENUM, &IID_NULL, LOCALE_USER_DEFAULT,
-				 DISPATCH_METHOD | DISPATCH_PROPERTYGET, &dp, &vtResult, &excep, NULL);
-
-	if (szMember != NULL) pDispObj->lpVtbl->Release(pDispObj);
-
-	if (FAILED(hr)) return DH_EXITEX(hr, TRUE, L"_NewEnum", szMember, &excep, 0);
-
-	if (vtResult.vt == VT_DISPATCH)
-		hr = vtResult.pdispVal->lpVtbl->QueryInterface(vtResult.pdispVal, &IID_IEnumVARIANT, (void **) ppEnum);
-	else if (vtResult.vt == VT_UNKNOWN)
-		hr = vtResult.punkVal->lpVtbl->QueryInterface(vtResult.punkVal, &IID_IEnumVARIANT, (void **) ppEnum);
-	else
-		hr = E_NOINTERFACE;
-
-	VariantClear(&vtResult);
-
-	return DH_EXIT(hr, szMember);
-}
-
-HRESULT dhEnumNextVariant(IEnumVARIANT * pEnum, VARIANT * pvResult)
-{
-	DH_ENTER(L"EnumNextVariant");
-
-	if (!pEnum || !pvResult) return DH_EXIT(E_INVALIDARG, L"Enumerator");
-
-	return DH_EXIT(pEnum->lpVtbl->Next(pEnum, 1, pvResult, NULL), L"Enumerator");
-}
-
-HRESULT dhEnumNextObject(IEnumVARIANT * pEnum, IDispatch ** ppDisp)
-{
-	VARIANT vtResult;
-	HRESULT hr;
-
-	DH_ENTER(L"EnumNextObject");
-
-	if (!pEnum || !ppDisp) return DH_EXIT(E_INVALIDARG, L"Enumerator");
-
-	hr = pEnum->lpVtbl->Next(pEnum, 1, &vtResult, NULL);
-
-	if (hr == S_OK)
-	{
-		if (vtResult.vt == VT_DISPATCH)
-		{
-			*ppDisp = vtResult.pdispVal;
-		}
-		else
-		{
-			hr = VariantChangeType(&vtResult, &vtResult, 0, VT_DISPATCH);
-			if (SUCCEEDED(hr)) *ppDisp = vtResult.pdispVal;
-			else VariantClear(&vtResult);
-		}
-	}
-
-	return DH_EXIT(hr, L"Enumerator");
-}
-
-HRESULT dhEnumBegin(IEnumVARIANT ** ppEnum, IDispatch * pDisp, LPCOLESTR szMember, ...)
-{
-	HRESULT hr;
-	va_list marker;
-
-	DH_ENTER(L"EnumBegin");
-
-	va_start(marker, szMember);
-
-	hr = dhEnumBeginV(ppEnum, pDisp, szMember, &marker);
-
-	va_end(marker);
-
-	return DH_EXIT(hr, szMember);
-}
-
-/* ----- convert.c ----- */
-
-static const LONGLONG FILE_TIME_ONE_DAY           = 864000000000;
-
-static const LONGLONG FILE_TIME_VARIANT_DAY0      = 94353120000000000;
-
-static const ULONGLONG FILE_TIME_VARIANT_OVERFLOW  = 2650467744000000000;
-
-static const DATE      VARIANT_FILE_TIME_DAY0      = -109205;
-
-static const DATE      VARIANT_TIMET_DAY0          = 25569;
-
-static const LONG      TIMET_ONE_DAY               = 86400;
-
-#ifndef _WIN64
-static const DATE      VARIANT_TIMET_MAX           = 50424.13480;
-#else
-static const time_t    TIMET_VARIANT_OVERFLOW      = 253402300800;
-#endif
-
-HRESULT ConvertFileTimeToVariantTime(FILETIME * pft, DATE * pDate)
-{
-	ULONGLONG ftScalar;
-
-	if (!pft || !pDate) return E_INVALIDARG;
-
-	ftScalar = *((ULONGLONG *) pft) + 500;
-
-	if (ftScalar >= FILE_TIME_VARIANT_OVERFLOW) return E_INVALIDARG;
-	*pDate = (LONGLONG) (ftScalar - FILE_TIME_VARIANT_DAY0) / (double) FILE_TIME_ONE_DAY;
-	if (*pDate < 0) *pDate = floor(*pDate) + (floor(*pDate) - *pDate);
-
-	return NOERROR;
-}
-
-HRESULT ConvertVariantTimeToFileTime(DATE date, FILETIME * pft)
-{
-	ULONGLONG ftScalar;
-
-	if (!pft) return E_INVALIDARG;
-
-	if (date < 0) date = ceil(date) + (ceil(date) - date);
-
-	if (date < VARIANT_FILE_TIME_DAY0) return E_INVALIDARG;
-	ftScalar = (ULONGLONG) ((date * FILE_TIME_ONE_DAY) + FILE_TIME_VARIANT_DAY0);
-
-	*pft = *((FILETIME *) &ftScalar);
-
-	return NOERROR;
-}
-
-HRESULT ConvertVariantTimeToSystemTime(DATE date, SYSTEMTIME * pSystemTime)
-{
-	HRESULT hr;
-	FILETIME fileTime;
-
-	if (!pSystemTime) return E_INVALIDARG;
-	if (FAILED(hr = ConvertVariantTimeToFileTime(date, &fileTime))) return hr;
-	return (FileTimeToSystemTime(&fileTime, pSystemTime) ? NOERROR : HRESULT_FROM_WIN32( GetLastError() ));
-}
-
-HRESULT ConvertSystemTimeToVariantTime(SYSTEMTIME * pSystemTime, DATE * pDate)
-{
-	FILETIME fileTime;
-
-	if (!pSystemTime || !pDate) return E_INVALIDARG;
-	if (!SystemTimeToFileTime(pSystemTime, &fileTime)) return HRESULT_FROM_WIN32( GetLastError() );
-	return ConvertFileTimeToVariantTime(&fileTime, pDate);
-}
-
-HRESULT ConvertVariantTimeToTimeT(DATE date, time_t * pTimeT)
-{
-	struct tm * ptm;
-
-	if (!pTimeT) return E_INVALIDARG;
-
-#ifndef _WIN64
-	if (date < VARIANT_TIMET_DAY0 || date > VARIANT_TIMET_MAX) return E_INVALIDARG;
-#else
-	if (date < VARIANT_TIMET_DAY0) return E_INVALIDARG;
-#endif
-
-	*pTimeT = (time_t) (((date - VARIANT_TIMET_DAY0) * TIMET_ONE_DAY) + 0.5);
-
-	if ( (ptm = gmtime(pTimeT)) == NULL || !(ptm->tm_isdst = -1) ||
-	     (*pTimeT = mktime(ptm)) == (time_t) -1 ) return E_FAIL;
-
-	return NOERROR;
-}
-
-HRESULT ConvertTimeTToVariantTime(time_t timeT, DATE * pDate)
-{
-	struct tm localtm, utctm, * ptm;
-	time_t timeTLocal, timeTUtc;
-
-	if (!pDate) return E_INVALIDARG;
-
-	if ( (ptm = localtime(&timeT)) == NULL) return E_FAIL;
-	localtm = *ptm;
-
-	if ( (ptm = gmtime(&timeT)) == NULL) return E_FAIL;
-	utctm = *ptm;
-
-	localtm.tm_isdst = 0;
-	utctm.tm_isdst   = 0;
-
-	if ( (timeTLocal = mktime(&localtm)) == (time_t) -1 ||
-	     (timeTUtc   = mktime(&utctm))   == (time_t) -1) return E_FAIL;
-
-	timeT += timeTLocal - timeTUtc;
-
-#ifdef _WIN64
-	if (timeT >= TIMET_VARIANT_OVERFLOW) return E_INVALIDARG;
-#endif
-	*pDate = (DATE)  (timeT / (double) TIMET_ONE_DAY) + VARIANT_TIMET_DAY0;
-
-	return NOERROR;
-}
-
-HRESULT ConvertAnsiStrToBStr(LPCSTR szAnsiIn, BSTR * lpBstrOut)
-{
-	DWORD dwSize;
-
-	if (lpBstrOut == NULL) return E_INVALIDARG;
-	if (szAnsiIn == NULL) { *lpBstrOut = NULL; return NOERROR; }
-
-	dwSize = MultiByteToWideChar(CP_ACP, 0, szAnsiIn, -1, NULL, 0);
-	if (dwSize == 0) return HRESULT_FROM_WIN32( GetLastError() );
-
-	*lpBstrOut = SysAllocStringLen(NULL, dwSize - 1);
-	if (*lpBstrOut == NULL) return E_OUTOFMEMORY;
-
-	if ( !MultiByteToWideChar(CP_ACP, 0, szAnsiIn, -1, *lpBstrOut, dwSize) )
-	{
-		SysFreeString(*lpBstrOut);
-		return HRESULT_FROM_WIN32( GetLastError() );
-	}
-
-	return NOERROR;
-}
-
-HRESULT ConvertBStrToAnsiStr(BSTR bstrIn, LPSTR * lpszOut)
-{
-	DWORD dwSize;
-
-	if (lpszOut == NULL) return E_INVALIDARG;
-	if (bstrIn == NULL) { *lpszOut = NULL; return NOERROR; }
-
-	dwSize = WideCharToMultiByte(CP_ACP, 0, bstrIn, -1, NULL, 0, NULL, NULL);
-	if (dwSize == 0) return HRESULT_FROM_WIN32( GetLastError() );
-
-	*lpszOut = (LPSTR) SysAllocStringByteLen(NULL, dwSize - 1);
-	if (*lpszOut == NULL) return E_OUTOFMEMORY;
-
-	if ( !WideCharToMultiByte(CP_ACP, 0, bstrIn, -1, *lpszOut, dwSize, NULL, NULL) )
-	{
-		SysFreeString((BSTR) *lpszOut);
-		return HRESULT_FROM_WIN32( GetLastError() );
-	}
-
-	return NOERROR;
-}
-
-/* ----- dh_exceptions.c ----- */
-
-#ifndef DISPHELPER_NO_EXCEPTIONS
-
-static DH_EXCEPTION_OPTIONS g_ExceptionOptions;
-
-static LONG  f_lngTlsInitBegin = -1, f_lngTlsInitEnd = -1;
-static DWORD f_TlsIdxStackCount, f_TlsIdxException;
-
-#define SetStackCount(nStackCount)   TlsSetValue(f_TlsIdxStackCount, (LPVOID) (nStackCount))
-#define SetExceptionPtr(pException)  TlsSetValue(f_TlsIdxException, pException);
-#define GetStackCount()       (UINT) TlsGetValue(f_TlsIdxStackCount)
-#define GetExceptionPtr()            TlsGetValue(f_TlsIdxException)
-#define CheckTlsInitialized()        if (f_lngTlsInitEnd != 0) InitializeTlsIndexes();
-
-static void hlprStringCchCopyW(LPWSTR pszDest, SIZE_T cchDest, LPCWSTR pszSrc)
-{
-	assert(cchDest > 0);
-
-	do
-	{
-		if (--cchDest == 0) break;
-	}
-	while ((*pszDest++ = *pszSrc++));
-
-	*pszDest = L'\0';
-}
-
-static void InitializeTlsIndexes(void)
-{
-	if (0 == InterlockedIncrement(&f_lngTlsInitBegin))
-	{
-		f_TlsIdxStackCount = TlsAlloc();
-		f_TlsIdxException  = TlsAlloc();
-		f_lngTlsInitEnd    = 0;
-	}
-	else
-	{
-		while (f_lngTlsInitEnd != 0) Sleep(5);
-	}
-}
-
-void dhEnter(void)
-{
-	CheckTlsInitialized();
-	SetStackCount(GetStackCount() + 1);
-}
-
-HRESULT dhExitEx(HRESULT hr, BOOL bDispatchError, LPCWSTR szMember, LPCWSTR szCompleteMember,
-                 EXCEPINFO * pExcepInfo, UINT iArgError, LPCWSTR szFunctionName)
-{
-	UINT nStackCount = GetStackCount();
-
-	SetStackCount(nStackCount - 1);
-
-	if (FAILED(hr) && !g_ExceptionOptions.bDisableRecordExceptions)
-	{
-		PDH_EXCEPTION pException = GetExceptionPtr();
-
-		if (!pException)
-		{
-			pException = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(DH_EXCEPTION));
-			if (!pException) return hr;
-			SetExceptionPtr(pException);
-		}
-		else if (pException->bOld)
-		{
-			SysFreeString(pException->szDescription);
-			SysFreeString(pException->szSource);
-			SysFreeString(pException->szHelpFile);
-			ZeroMemory(pException, sizeof(DH_EXCEPTION));
-		}
-
-		if (pException->hr == 0)
-		{
-			pException->hr              = hr;
-			pException->iArgError       = iArgError;
-			pException->szErrorFunction = szFunctionName;
-			pException->bDispatchError  = bDispatchError;
-
-			if (szMember) hlprStringCchCopyW(pException->szMember, ARRAYSIZE(pException->szMember), szMember);
-
-			if (pExcepInfo && hr == DISP_E_EXCEPTION)
-			{
-				if (pExcepInfo->pfnDeferredFillIn &&
-				    !IsBadCodePtr((FARPROC) pExcepInfo->pfnDeferredFillIn)) pExcepInfo->pfnDeferredFillIn(pExcepInfo);
-
-				pException->szDescription = pExcepInfo->bstrDescription;
-				pException->szSource      = pExcepInfo->bstrSource;
-				pException->szHelpFile    = pExcepInfo->bstrHelpFile;
-				pException->dwHelpContext = pExcepInfo->dwHelpContext;
-				pException->swCode        = (pExcepInfo->wCode ? pExcepInfo->wCode : pExcepInfo->scode);
-			}
-		}
-
-		if (nStackCount == 1)
-		{
-			pException->bOld              = TRUE;
-			pException->szInitialFunction = szFunctionName;
-
-			if (szCompleteMember) hlprStringCchCopyW(pException->szCompleteMember, ARRAYSIZE(pException->szCompleteMember), szCompleteMember);
-
-			if (g_ExceptionOptions.bShowExceptions)
-				dhShowException(pException);
-
-			if (g_ExceptionOptions.pfnExceptionCallback)
-				g_ExceptionOptions.pfnExceptionCallback(pException);
-		}
-	}
-	else if (hr == DISP_E_EXCEPTION && pExcepInfo)
-	{
-		SysFreeString(pExcepInfo->bstrDescription);
-		SysFreeString(pExcepInfo->bstrSource);
-		SysFreeString(pExcepInfo->bstrHelpFile);
-	}
-
-	return hr;
-}
-
-HRESULT dhShowException(PDH_EXCEPTION pException)
-{
-	WCHAR szMessage[512];
-
-	dhFormatExceptionW(pException, szMessage, ARRAYSIZE(szMessage), FALSE);
-
-	MessageBoxW(g_ExceptionOptions.hwnd, szMessage, g_ExceptionOptions.szAppName,
-	            MB_ICONSTOP | MB_SETFOREGROUND);
-
-	return NOERROR;
-}
-
-HRESULT dhFormatExceptionW(PDH_EXCEPTION pException, LPWSTR szBuffer, UINT cchBufferSize, BOOL bFixedFont)
-{
-	HRESULT hr;
-	UINT cch = 0;
-#	define DESCRIPTION_LENGTH 255
-
-	if (!szBuffer && cchBufferSize) return E_INVALIDARG;
-
-	if (!pException)
-	{
-		dhGetLastException(&pException);
-		if (!pException)
-		{
-			if (cchBufferSize != 0)
-			{
-				_snwprintf(szBuffer, cchBufferSize, L"No error information available.");
-				szBuffer[cchBufferSize - 1] = L'\0';
-			}
-
-			return NOERROR;
-		}
-	}
-
-	hr = (pException->hr == DISP_E_EXCEPTION && pException->swCode ?
-			pException->swCode : pException->hr);
-
-	if (!pException->szSource)
-	{
-		if (pException->bDispatchError)
-			pException->szSource = SysAllocString(L"IDispatch Interface");
-		else
-			pException->szSource = SysAllocString(L"Application");
-	}
-
-	if (!pException->szDescription)
-	{
-		pException->szDescription = SysAllocStringLen(NULL, DESCRIPTION_LENGTH);
-
-		if (pException->szDescription)
-		{
-			switch (hr)
-			{
-				case E_NOINTERFACE:
-					_snwprintf(pException->szDescription, DESCRIPTION_LENGTH, L"Object required");
-					break;
-
-				case DISP_E_UNKNOWNNAME:
-				case DISP_E_MEMBERNOTFOUND:
-					_snwprintf(pException->szDescription, DESCRIPTION_LENGTH, L"Object doesn't support this property or method: '%s'", pException->szMember);
-					break;
-
-				case DISP_E_TYPEMISMATCH:
-					if (pException->szMember[0])
-					{
-						_snwprintf(pException->szDescription, DESCRIPTION_LENGTH, L"Type mismatch: '%s'. Argument Index: %d", pException->szMember, pException->iArgError);
-						break;
-					}
-
-				default:
-				{
-#ifndef UNICODE
-					CHAR szDescription[DESCRIPTION_LENGTH];
-#else
-					LPWSTR szDescription = pException->szDescription;
-#endif
-					cch = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
-					             NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
-					             szDescription, DESCRIPTION_LENGTH, NULL);
-
-					if (!cch) wcscpy(pException->szDescription, L"Unknown runtime error");
-#ifndef UNICODE
-					else MultiByteToWideChar(CP_ACP, 0, szDescription, -1, pException->szDescription, DESCRIPTION_LENGTH);
-#endif
-				}
-			}
-		}
-	}
-
-	if (pException->szDescription)
-	{
-
-		if (!cch) cch = wcslen(pException->szDescription);
-
-		if (cch >= 2 && pException->szDescription[cch - 2] == L'\r')
-			pException->szDescription[cch - 2] = L'\0';
-		else if (cch >= 1 && pException->szDescription[cch - 1] == L'\n')
-			pException->szDescription[cch - 1] = L'\0';
-	}
-
-	if (cchBufferSize)
-	{
-		if (!bFixedFont)
-		{
-			_snwprintf(szBuffer, cchBufferSize, L"Member:\t  %s\r\nFunction:\t  %s\t\t\r\nError In:\t  %s\r\nError:\t  %s\r\nCode:\t  %x\r\nSource:\t  %s",
-				pException->szCompleteMember,
-				pException->szInitialFunction, pException->szErrorFunction,
-				pException->szDescription, hr,
-				pException->szSource);
-		}
-		else
-		{
-			_snwprintf(szBuffer, cchBufferSize, L"Member:   %s\r\nFunction: %s\r\nError In: %s\r\nError:    %s\r\nCode:     %x\r\nSource:   %s",
-				pException->szCompleteMember,
-				pException->szInitialFunction, pException->szErrorFunction,
-				pException->szDescription, hr,
-				pException->szSource);
-		}
-
-		szBuffer[cchBufferSize - 1] = L'\0';
-	}
-
-	return NOERROR;
-}
-
-HRESULT dhFormatExceptionA(PDH_EXCEPTION pException, LPSTR szBuffer, UINT cchBufferSize, BOOL bFixedFont)
-{
-	WCHAR szBufferW[1024];
-
-	dhFormatExceptionW(pException, szBufferW, ARRAYSIZE(szBufferW), bFixedFont);
-
-	if (0 == WideCharToMultiByte(CP_ACP, 0, szBufferW, -1, szBuffer, cchBufferSize, NULL, NULL))
-		return HRESULT_FROM_WIN32( GetLastError() );
-
-	return NOERROR;
-}
-
-HRESULT dhGetLastException(PDH_EXCEPTION * ppException)
-{
-	if (!ppException) return E_INVALIDARG;
-
-	CheckTlsInitialized();
-	*ppException = GetExceptionPtr();
-
-	return NOERROR;
-}
-
-HRESULT dhToggleExceptions(BOOL bShow)
-{
-	g_ExceptionOptions.bShowExceptions = bShow;
-	if (bShow) g_ExceptionOptions.bDisableRecordExceptions = FALSE;
-
-	return NOERROR;
-}
-
-HRESULT dhSetExceptionOptions(PDH_EXCEPTION_OPTIONS pExceptionOptions)
-{
-	if (!pExceptionOptions) return E_INVALIDARG;
-
-	g_ExceptionOptions.hwnd                     = pExceptionOptions->hwnd;
-	g_ExceptionOptions.szAppName                = pExceptionOptions->szAppName;
-	g_ExceptionOptions.bShowExceptions          = pExceptionOptions->bShowExceptions;
-	g_ExceptionOptions.bDisableRecordExceptions = pExceptionOptions->bDisableRecordExceptions;
-	g_ExceptionOptions.pfnExceptionCallback     = pExceptionOptions->pfnExceptionCallback;
-
-	return NOERROR;
-}
-
-HRESULT dhGetExceptionOptions(PDH_EXCEPTION_OPTIONS pExceptionOptions)
-{
-	if (!pExceptionOptions) return E_INVALIDARG;
-
-	pExceptionOptions->hwnd                     = g_ExceptionOptions.hwnd;
-	pExceptionOptions->szAppName                = g_ExceptionOptions.szAppName;
-	pExceptionOptions->bShowExceptions          = g_ExceptionOptions.bShowExceptions;
-	pExceptionOptions->bDisableRecordExceptions = g_ExceptionOptions.bDisableRecordExceptions;
-	pExceptionOptions->pfnExceptionCallback     = g_ExceptionOptions.pfnExceptionCallback;
-
-	return NOERROR;
-}
-
-void dhCleanupThreadException(void)
-{
-	PDH_EXCEPTION pException;
-
-	CheckTlsInitialized();
-	pException = GetExceptionPtr();
-
-	if (pException)
-	{
-		SysFreeString(pException->szDescription);
-		SysFreeString(pException->szSource);
-		SysFreeString(pException->szHelpFile);
-
-		HeapFree(GetProcessHeap(), 0, pException);
-
-		SetExceptionPtr(NULL);
-	}
-}
-
-#endif
-
-/* ----- dh_init.c ----- */
-
-HRESULT dhInitializeImp(BOOL bInitializeCOM, BOOL bUnicode)
-{
-	dh_g_bIsUnicodeMode = bUnicode;
-
-	if (bInitializeCOM) return CoInitialize(NULL);
-
-	return NOERROR;
-}
-
-void dhUninitialize(BOOL bUninitializeCOM)
-{
-#ifndef DISPHELPER_NO_EXCEPTIONS
-	dhCleanupThreadException();
-#endif
-	if (bUninitializeCOM) CoUninitialize();
-}
-
diff --git a/js/node_modules/serialport/src/win/disphelper.h b/js/node_modules/serialport/src/win/disphelper.h
deleted file mode 100644
index 1da4f97bbe9fe29053dd14e51340ea209e45b9f4..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/win/disphelper.h
+++ /dev/null
@@ -1,731 +0,0 @@
-/* This file is part of the source code for the DispHelper COM helper library.
- * DispHelper allows you to call COM objects with an extremely simple printf style syntax.
- * DispHelper can be used from C++ or even plain C. It works with most Windows compilers
- * including Dev-CPP, Visual C++ and LCC-WIN32. Including DispHelper in your project
- * couldn't be simpler as it is available in a compacted single file version.
- *
- * Included with DispHelper are over 20 samples that demonstrate using COM objects
- * including ADO, CDO, Outlook, Eudora, Excel, Word, Internet Explorer, MSHTML,
- * PocketSoap, Word Perfect, MS Agent, SAPI, MSXML, WIA, dexplorer and WMI.
- *
- * DispHelper is free open source software provided under the BSD license.
- *
- * Find out more and download DispHelper at:
- * http://sourceforge.net/projects/disphelper/
- * http://disphelper.sourceforge.net/
- */
-
-
-#ifndef DISPHELPER_H_INCLUDED
-#define DISPHELPER_H_INCLUDED
-
-#include <objbase.h>
-#include <time.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-HRESULT dhCreateObject(LPCOLESTR szProgId, LPCWSTR szMachine, IDispatch ** ppDisp);
-HRESULT dhGetObject(LPCOLESTR szFile, LPCOLESTR szProgId, IDispatch ** ppDisp);
-
-HRESULT dhCreateObjectEx(LPCOLESTR szProgId, REFIID riid, DWORD dwClsContext, COSERVERINFO * pServerInfo, void ** ppv);
-HRESULT dhGetObjectEx(LPCOLESTR szFile, LPCOLESTR szProgId, REFIID riid, DWORD dwClsContext, LPVOID lpvReserved, void ** ppv);
-
-HRESULT dhCallMethod(IDispatch * pDisp, LPCOLESTR szMember, ...);
-HRESULT dhPutValue(IDispatch * pDisp, LPCOLESTR szMember, ...);
-HRESULT dhPutRef(IDispatch * pDisp, LPCOLESTR szMember, ...);
-HRESULT dhGetValue(LPCWSTR szIdentifier, void * pResult, IDispatch * pDisp, LPCOLESTR szMember, ...);
-
-HRESULT dhInvoke(int invokeType, VARTYPE returnType, VARIANT * pvResult, IDispatch * pDisp, LPCOLESTR szMember, ...);
-HRESULT dhInvokeArray(int invokeType, VARIANT * pvResult, UINT cArgs, IDispatch * pDisp, LPCOLESTR szMember, VARIANT * pArgs);
-
-HRESULT dhCallMethodV(IDispatch * pDisp, LPCOLESTR szMember, va_list * marker);
-HRESULT dhPutValueV(IDispatch * pDisp, LPCOLESTR szMember, va_list * marker);
-HRESULT dhPutRefV(IDispatch * pDisp, LPCOLESTR szMember, va_list * marker);
-HRESULT dhGetValueV(LPCWSTR szIdentifier, void * pResult, IDispatch * pDisp, LPCOLESTR szMember, va_list * marker);
-HRESULT dhInvokeV(int invokeType, VARTYPE returnType, VARIANT * pvResult, IDispatch * pDisp, LPCOLESTR szMember, va_list * marker);
-
-HRESULT dhAutoWrap(int invokeType, VARIANT * pvResult, IDispatch * pDisp, LPCOLESTR szMember, UINT cArgs, ...);
-HRESULT dhParseProperties(IDispatch * pDisp, LPCWSTR szProperties, UINT * lpcPropsSet);
-
-HRESULT dhEnumBegin(IEnumVARIANT ** ppEnum, IDispatch * pDisp, LPCOLESTR szMember, ...);
-HRESULT dhEnumBeginV(IEnumVARIANT ** ppEnum, IDispatch * pDisp, LPCOLESTR szMember, va_list * marker);
-HRESULT dhEnumNextObject(IEnumVARIANT * pEnum, IDispatch ** ppDisp);
-HRESULT dhEnumNextVariant(IEnumVARIANT * pEnum, VARIANT * pvResult);
-
-HRESULT dhInitializeImp(BOOL bInitializeCOM, BOOL bUnicode);
-void dhUninitialize(BOOL bUninitializeCOM);
-
-#define dhInitializeA(bInitializeCOM) dhInitializeImp(bInitializeCOM, FALSE)
-#define dhInitializeW(bInitializeCOM) dhInitializeImp(bInitializeCOM, TRUE)
-
-#ifdef UNICODE
-#define dhInitialize dhInitializeW
-#else
-#define dhInitialize dhInitializeA
-#endif
-
-#define AutoWrap dhAutoWrap
-#define DISPATCH_OBJ(objName) IDispatch * objName = NULL
-#define dhFreeString(string) SysFreeString((BSTR) string)
-
-#ifndef SAFE_RELEASE
-#ifdef __cplusplus
-#define SAFE_RELEASE(pObj) { if (pObj) { (pObj)->Release(); (pObj) = NULL; } }
-#else
-#define SAFE_RELEASE(pObj) { if (pObj) { (pObj)->lpVtbl->Release(pObj); (pObj) = NULL; } }
-#endif
-#endif
-
-#define SAFE_FREE_STRING(string) { dhFreeString(string); (string) = NULL; }
-
-
-
-
-/* ===================================================================== */
-#ifndef DISPHELPER_NO_WITH
-
-#define WITH0(objName, pDisp, szMember) { \
-	DISPATCH_OBJ(objName);            \
-	if (SUCCEEDED(dhGetValue(L"%o", &objName, pDisp, szMember))) {
-
-#define WITH1(objName, pDisp, szMember, arg1) { \
-	DISPATCH_OBJ(objName);                  \
-	if (SUCCEEDED(dhGetValue(L"%o", &objName, pDisp, szMember, arg1))) {
-
-#define WITH2(objName, pDisp, szMember, arg1, arg2) { \
-	DISPATCH_OBJ(objName);                        \
-	if (SUCCEEDED(dhGetValue(L"%o", &objName, pDisp, szMember, arg1, arg2))) {
-
-#define WITH3(objName, pDisp, szMember, arg1, arg2, arg3) { \
-	DISPATCH_OBJ(objName);                              \
-	if (SUCCEEDED(dhGetValue(L"%o", &objName, pDisp, szMember, arg1, arg2, arg3))) {
-
-#define WITH4(objName, pDisp, szMember, arg1, arg2, arg3, arg4) { \
-	DISPATCH_OBJ(objName);                                    \
-	if (SUCCEEDED(dhGetValue(L"%o", &objName, pDisp, szMember, arg1, arg2, arg3, arg4))) {
-
-#define WITH WITH0
-
-#define ON_WITH_ERROR(objName) } else {
-
-#define END_WITH(objName) } SAFE_RELEASE(objName); }
-
-#endif /* ----- DISPHELPER_NO_WITH ----- */
-
-
-
-
-/* ===================================================================== */
-#ifndef DISPHELPER_NO_FOR_EACH
-
-#define FOR_EACH0(objName, pDisp, szMember) { \
-	IEnumVARIANT * xx_pEnum_xx = NULL;    \
-	DISPATCH_OBJ(objName);                \
-	if (SUCCEEDED(dhEnumBegin(&xx_pEnum_xx, pDisp, szMember))) { \
-		while (dhEnumNextObject(xx_pEnum_xx, &objName) == NOERROR) {
-
-#define FOR_EACH1(objName, pDisp, szMember, arg1) { \
-	IEnumVARIANT * xx_pEnum_xx = NULL;          \
-	DISPATCH_OBJ(objName);                      \
-	if (SUCCEEDED(dhEnumBegin(&xx_pEnum_xx, pDisp, szMember, arg1))) { \
-		while (dhEnumNextObject(xx_pEnum_xx, &objName) == NOERROR) {
-
-#define FOR_EACH2(objName, pDisp, szMember, arg1, arg2) { \
-	IEnumVARIANT * xx_pEnum_xx = NULL;          \
-	DISPATCH_OBJ(objName);                      \
-	if (SUCCEEDED(dhEnumBegin(&xx_pEnum_xx, pDisp, szMember, arg1, arg2))) { \
-		while (dhEnumNextObject(xx_pEnum_xx, &objName) == NOERROR) {
-
-
-#define FOR_EACH3(objName, pDisp, szMember, arg1, arg2, arg3) { \
-	IEnumVARIANT * xx_pEnum_xx = NULL;          \
-	DISPATCH_OBJ(objName);                      \
-	if (SUCCEEDED(dhEnumBegin(&xx_pEnum_xx, pDisp, szMember, arg1, arg2, arg3))) { \
-		while (dhEnumNextObject(xx_pEnum_xx, &objName) == NOERROR) {
-
-
-#define FOR_EACH4(objName, pDisp, szMember, arg1, arg2, arg3, arg4) { \
-	IEnumVARIANT * xx_pEnum_xx = NULL;          \
-	DISPATCH_OBJ(objName);                      \
-	if (SUCCEEDED(dhEnumBegin(&xx_pEnum_xx, pDisp, szMember, arg1, arg2, arg3, arg4))) { \
-		while (dhEnumNextObject(xx_pEnum_xx, &objName) == NOERROR) {
-
-#define FOR_EACH FOR_EACH0
-
-#define ON_FOR_EACH_ERROR(objName) SAFE_RELEASE(objName); }} else {{
-
-#define NEXT(objName) SAFE_RELEASE(objName); }} SAFE_RELEASE(objName); SAFE_RELEASE(xx_pEnum_xx); }
-
-#endif /* ----- DISPHELPER_NO_FOR_EACH ----- */
-
-
-
-
-/* ===================================================================== */
-#ifndef DISPHELPER_NO_EXCEPTIONS
-
-/* Structure to store a DispHelper exception */
-typedef struct tagDH_EXCEPTION
-{
-	LPCWSTR szInitialFunction;
-	LPCWSTR szErrorFunction;
-
-	HRESULT hr;
-
-	WCHAR szMember[64];
-	WCHAR szCompleteMember[256];
-
-	UINT swCode;
-	LPWSTR szDescription;
-	LPWSTR szSource;
-	LPWSTR szHelpFile;
-	DWORD dwHelpContext;
-
-	UINT iArgError;
-
-	BOOL bDispatchError;
-
-#ifdef DISPHELPER_INTERNAL_BUILD
-	BOOL bOld;
-#endif
-} DH_EXCEPTION, * PDH_EXCEPTION;
-
-typedef void (*DH_EXCEPTION_CALLBACK) (PDH_EXCEPTION);
-
-/* Structure to store exception options. */
-typedef struct tagDH_EXCEPTION_OPTIONS
-{
-	HWND hwnd;
-	LPCWSTR szAppName;
-	BOOL bShowExceptions;
-	BOOL bDisableRecordExceptions;
-	DH_EXCEPTION_CALLBACK pfnExceptionCallback;
-} DH_EXCEPTION_OPTIONS, * PDH_EXCEPTION_OPTIONS;
-
-/* Functions to manipulate global exception options */
-HRESULT dhToggleExceptions(BOOL bShow);
-HRESULT dhSetExceptionOptions(PDH_EXCEPTION_OPTIONS pExceptionOptions);
-HRESULT dhGetExceptionOptions(PDH_EXCEPTION_OPTIONS pExceptionOptions);
-
-/* Functions to show an exception, format an exception into a string
- * and get a copy of the last exception */
-HRESULT dhShowException(PDH_EXCEPTION pException);
-HRESULT dhGetLastException(PDH_EXCEPTION * pException);
-HRESULT dhFormatExceptionW(PDH_EXCEPTION pException, LPWSTR szBuffer, UINT cchBufferSize, BOOL bFixedFont);
-HRESULT dhFormatExceptionA(PDH_EXCEPTION pException, LPSTR szBuffer, UINT cchBufferSize, BOOL bFixedFont);
-
-#ifdef UNICODE
-#define dhFormatException dhFormatExceptionW
-#else
-#define dhFormatException dhFormatExceptionA
-#endif
-
-#ifdef DISPHELPER_INTERNAL_BUILD
-
-void dhEnter(void);
-HRESULT dhExitEx(HRESULT hr, BOOL bDispatchError, LPCWSTR szMember, LPCWSTR szCompleteMember, EXCEPINFO * pExcepInfo, UINT iArgError, LPCWSTR szFunctionName);
-void dhCleanupThreadException(void);
-
-#define DH_ENTER(szFunctionName) static LPCWSTR xx_szFunctionName_xx = szFunctionName; \
-				    dhEnter()
-
-#define DH_EXITEX(hr, bDispatchError, szMember, szCompleteMember, pExcepInfo, iArgError) \
-		dhExitEx(hr, bDispatchError, szMember, szCompleteMember, pExcepInfo, iArgError, xx_szFunctionName_xx)
-
-#define DH_EXIT(hr, szCompleteMember) DH_EXITEX(hr, FALSE, NULL, szCompleteMember, NULL, 0)
-
-#endif /* ----- DISPHELPER_INTERNAL_BUILD ----- */
-
-#else  /* ----- DISPHELPER_NO_EXCEPTIONS ----- */
-
-/* These macros define out calls to selected exception functions */
-#define dhToggleExceptions(bShow) (E_NOTIMPL)
-#define dhSetExceptionOptions(pExcepOptions) (E_NOTIMPL)
-
-#ifdef DISPHELPER_INTERNAL_BUILD
-#define DH_ENTER(szFunctionName)
-#define DH_EXITEX(hr, bDispatchError, szMember, szCompleteMember, pExcepInfo, iArgError) \
-	(((hr == DISP_E_EXCEPTION && pExcepInfo) ?                      \
-	(SysFreeString(((EXCEPINFO *)(pExcepInfo))->bstrSource),        \
-	 SysFreeString(((EXCEPINFO *)(pExcepInfo))->bstrDescription),   \
-	 SysFreeString(((EXCEPINFO *)(pExcepInfo))->bstrHelpFile), 0) : (0)), hr)
-#define DH_EXIT(hr, szCompleteMember)(hr)
-#endif
-
-#endif /* ----- DISPHELPER_NO_EXCEPTIONS ----- */
-
-
-
-
-
-
-/* ===================================================================== */
-#ifdef DISPHELPER_INTERNAL_BUILD
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <wchar.h>
-
-/* Macro to include or lose debug code. */
-#ifdef DEBUG
-#define DBG_CODE(code) code
-#else
-#define DBG_CODE(code)
-#endif
-
-/* Are we in unicode mode? */
-extern BOOL dh_g_bIsUnicodeMode;
-
-/* Number of objects in an array */
-#undef ARRAYSIZE
-#define ARRAYSIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
-
-/* Maximum number of arguments for a member */
-#define DH_MAX_ARGS 25
-
-/* Maximum length of a member string */
-#define DH_MAX_MEMBER 512
-
-/* This macro is missing from Dev-Cpp/Mingw */
-#ifndef V_UI4
-#define V_UI4(X) V_UNION(X, ulVal)
-#endif
-
-/* Macro to notify programmer of invalid identifier in debug mode. */
-#define DEBUG_NOTIFY_INVALID_IDENTIFIER(chIdentifier) \
-DBG_CODE( { \
-		char buf[256]; \
-		sprintf(buf,"DEBUG: The format string or return identifier contained the invalid identifier '%c'.\n" \
-		"The valid identifiers are \"d/u/e/b/v/B/S/s/T/o/O/t/W/D/f/m\".\n" \
-		"Each %% character should be followed by a valid identifier.\n" \
-		"Identifiers are case sensitive.", (chIdentifier)); \
-		MessageBoxA(NULL, buf, "DEBUG: Invalid Format Identifier", MB_ICONSTOP); \
-	} )
-
-#ifdef _MSC_VER
-#pragma warning(disable : 4706) /* Assignment in conditional expression */
-#endif
-
-#ifndef DISPHELPER_NO_PRAGMA_LIB
-#ifdef __LCC__
-#pragma lib <ole32.lib>
-#pragma lib <oleaut32.lib>
-#pragma lib <uuid.lib>
-#endif
-#endif
-
-
-#endif /* ----- DISPHELPER_INTERNAL_BUILD ----- */
-
-#ifndef DISPHELPER_NO_PRAGMA_LIB
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#pragma comment(lib, "ole32.lib")
-#pragma comment(lib, "oleaut32.lib")
-#pragma comment(lib, "uuid.lib")
-#endif
-#endif
-
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
-
-/* ===================================================================== */
-#if defined(__cplusplus) && !defined(DISPHELPER_NO_CPP_EXTENSIONS)
-
-#include <iostream>
-#include <string>
-
-#ifdef _MSC_VER
-#pragma warning( disable : 4290 ) /* throw() specification ignored */
-#endif
-
-#ifndef DISPHELPER_USE_MS_SMART_PTR
-
-template <class T>
-class CDhComPtr
-{
-public:
-	CDhComPtr() throw() : m_pInterface (NULL) {}
-
-	CDhComPtr(T* pInterface) throw() : m_pInterface (pInterface)
-	{
-		if (m_pInterface) m_pInterface->AddRef();
-	}
-
-	CDhComPtr(const CDhComPtr& original) throw() : m_pInterface (original.m_pInterface)
-	{
-		if (m_pInterface) m_pInterface->AddRef();
-	}
-
-	~CDhComPtr() throw()
-	{
-		Dispose();
-	}
-
-	void Dispose() throw()
-	{
-		if (m_pInterface)
-		{
-			m_pInterface->Release();
-			m_pInterface = NULL;
-		}
-	}
-
-	T* Detach() throw()
-	{
-		T* temp = m_pInterface;
-		m_pInterface = NULL;
-		return temp;
-	}
-
-	inline operator T*() const throw()
-	{
-        	return m_pInterface;
-	}
-
-	T** operator&() throw()
-	{
-		Dispose();
-        	return &m_pInterface;
-	}
-
-	T* operator->() const throw(HRESULT)
-	{
-		if (!m_pInterface) throw E_POINTER;
-		return m_pInterface;
-	}
-
-	CDhComPtr& operator=(T* pInterface) throw()
-	{
-		if (m_pInterface != pInterface)
-		{
-			T* pOldInterface = m_pInterface;
-			m_pInterface = pInterface;
-			if (m_pInterface)  m_pInterface->AddRef();
-			if (pOldInterface) pOldInterface->Release();
-		}
-
-		return *this;
-	}
-
-	CDhComPtr& operator=(const int null) throw(HRESULT)
-	{
-		if (null != 0) throw(E_POINTER);
-		return operator=((T*) NULL);
-	}
-
-	CDhComPtr& operator=(const CDhComPtr& rhs) throw()
-	{
-		return operator=(rhs.m_pInterface);
-	}
-
-private:
-	T* m_pInterface;
-};
-
-typedef CDhComPtr<IDispatch>    CDispPtr;
-typedef CDhComPtr<IEnumVARIANT> CEnumPtr;
-typedef CDhComPtr<IUnknown>     CUnknownPtr;
-
-#else /* DISPHELPER_USE_MS_SMART_PTR */
-
-#include <comdef.h> 
-typedef IDispatchPtr    CDispPtr;
-typedef IEnumVARIANTPtr CEnumPtr;
-typedef IUnknownPtr     CUnknownPtr;
-
-#endif /* DISPHELPER_USE_MS_SMART_PTR */
-
-
-
-
-/* ===================================================================== */
-template <class T>
-class CDhStringTemplate
-{
-public:
-	CDhStringTemplate() throw() : m_strptr (NULL) {}
-
-	CDhStringTemplate(const CDhStringTemplate& original) throw()
-	{
-		Copy(original.m_strptr);
-	}
-
-	CDhStringTemplate(const int null) throw(HRESULT) : m_strptr (NULL)
-	{
-		if (null != 0) throw(E_POINTER);
-	}
-
-	~CDhStringTemplate() throw()
-	{
-		Dispose();
-	}
-
-	void Dispose() throw()
-	{
-		dhFreeString(m_strptr);
-		m_strptr = NULL;
-	}
-
-	T* Detach() throw()
-	{
-		T* temp = m_strptr;
-		m_strptr = NULL;
-		return temp;
-	}
-
-	T** operator&() throw()
-	{
-		Dispose();
-		return &m_strptr;
-	}
-
-	inline operator T*() const throw()
-	{
-		return m_strptr;
-	}
-
-	inline T& operator[](int nIndex) const throw()
-	{
-		return m_strptr[nIndex];
-	}
-
-	CDhStringTemplate& operator=(const CDhStringTemplate& rhs)
-	{
-		if (m_strptr != rhs.m_strptr)
-		{
-			T* temp = m_strptr;
-			Copy(rhs.m_strptr);
-			dhFreeString(temp);
-		}
-
-		return *this;
-	}
-
-	CDhStringTemplate& operator=(const int null) throw(HRESULT)
-	{
-		if (null != 0) throw(E_POINTER);
-		Dispose();
-		return *this;
-	}
-
-private:
-	void Copy(const T* rhs)
-	{
-		if (rhs == NULL)
-		{
-			m_strptr = NULL;
-		}
-		else if (sizeof(T) == sizeof(CHAR))
-		{
-			m_strptr = (T*) SysAllocStringByteLen((LPCSTR) rhs, SysStringByteLen((BSTR) rhs));
-		}
-		else
-		{
-			m_strptr = (T*) SysAllocStringLen((OLECHAR *) rhs, SysStringLen((BSTR) rhs));
-		}
-	}
-
-	T* m_strptr;
-};
-
-typedef CDhStringTemplate<CHAR>    CDhStringA;  /* Ansi string - LPSTR */
-typedef CDhStringTemplate<WCHAR>   CDhStringW;  /* Unicode string - LPWSTR */
-typedef CDhStringTemplate<OLECHAR> CDhStringB;  /* Unicode bstring - BSTR */
-typedef CDhStringTemplate<TCHAR>   CDhStringT;  /* T string - LPTSTR */
-typedef CDhStringTemplate<TCHAR>   CDhString;   /* T string - LPTSTR */
-
-inline std::ostream& operator<<(std::ostream& os, const CDhStringA& s)
-{
-	return os << (s ? s : (char*) "(null)");
-}
-
-inline std::wostream& operator<<(std::wostream& os, const CDhStringW& s)
-{
-	return os << (s ? s : (wchar_t*) L"(null)");
-}
-
-
-
-
-/* ===================================================================== */
-class CDhInitialize
-{
-public:
-	CDhInitialize(const BOOL bInitCom = TRUE) throw() : m_bInitCom (bInitCom)
-	{
-		dhInitialize(m_bInitCom);
-	}
-
-	~CDhInitialize() throw()
-	{
-		dhUninitialize(m_bInitCom);
-	}
-private:
-	BOOL m_bInitCom;
-};
-
-
-
-
-/* ===================================================================== */
-#ifndef DISPHELPER_NO_EXCEPTIONS
-class dhThrowFunctions
-{
-public:
-	static void throw_string() throw(std::string)
-	{
-		CHAR szMessage[512];
-		dhFormatExceptionA(NULL, szMessage, sizeof(szMessage)/sizeof(szMessage[0]), TRUE);
-		throw std::string(szMessage);
-	}
-
-	static void throw_wstring() throw(std::wstring)
-	{
-		WCHAR szMessage[512];
-		dhFormatExceptionW(NULL, szMessage, sizeof(szMessage)/sizeof(szMessage[0]), TRUE);
-		throw std::wstring(szMessage);
-	}
-	
-	static void throw_dhexception() throw(PDH_EXCEPTION)
-	{
-		PDH_EXCEPTION pException = NULL;
-		dhGetLastException(&pException);
-		throw pException;
-	}
-};
-#endif /* DISPHELPER_NO_EXCEPTIONS */
-
-
-
-
-/* ===================================================================== */
-#ifndef DISPHELPER_NO_EXCEPTIONS
-inline bool dhIfFailThrowString(HRESULT hr) throw(std::string)
-{
-	if (FAILED(hr)) dhThrowFunctions::throw_string();
-	return true;
-}
-
-inline bool dhIfFailThrowWString(HRESULT hr) throw(std::wstring)
-{
-	if (FAILED(hr)) dhThrowFunctions::throw_wstring();
-	return true;
-}
-
-inline bool dhIfFailThrowDhException(HRESULT hr) throw(PDH_EXCEPTION)
-{
-	if (FAILED(hr)) dhThrowFunctions::throw_dhexception();
-	return true;
-}
-
-#define dhCheck dhIfFailThrowString
-
-#endif /* DISPHELPER_NO_EXCEPTIONS */
-
-
-
-
-/* ===================================================================== */
-#ifndef DISPHELPER_NO_WITH
-
-#undef WITH0
-#define WITH0(objName, pDisp, szMember) { \
-	CDispPtr objName;                 \
-	if (SUCCEEDED(dhGetValue(L"%o", &objName, pDisp, szMember))) {
-
-#undef WITH1
-#define WITH1(objName, pDisp, szMember, arg1) { \
-	CDispPtr objName;                       \
-	if (SUCCEEDED(dhGetValue(L"%o", &objName, pDisp, szMember, arg1))) {
-
-#undef WITH2
-#define WITH2(objName, pDisp, szMember, arg1, arg2) { \
-	CDispPtr objName;                             \
-	if (SUCCEEDED(dhGetValue(L"%o", &objName, pDisp, szMember, arg1, arg2))) {
-
-#undef WITH3
-#define WITH3(objName, pDisp, szMember, arg1, arg2, arg3) { \
-	CDispPtr objName;                                   \
-	if (SUCCEEDED(dhGetValue(L"%o", &objName, pDisp, szMember, arg1, arg2, arg3))) {
-
-#undef WITH4
-#define WITH4(objName, pDisp, szMember, arg1, arg2, arg3, arg4) { \
-	CDispPtr objName;                                         \
-	if (SUCCEEDED(dhGetValue(L"%o", &objName, pDisp, szMember, arg1, arg2, arg3, arg4))) {
-
-#undef ON_WITH_ERROR
-#define ON_WITH_ERROR(objName) } else {
-
-#undef END_WITH
-#define END_WITH(objName) }}
-
-#define END_WITH_THROW(objName) } else { dhThrowFunctions::throw_string(); }}
-
-#endif /* DISPHELPER_NO_WITH */
-
-
-
-
-/* ===================================================================== */
-#ifndef DISPHELPER_NO_FOR_EACH
-
-#undef FOR_EACH0
-#define FOR_EACH0(objName, pDisp, szMember) { \
-	CEnumPtr xx_pEnum_xx;     \
-	if (SUCCEEDED(dhEnumBegin(&xx_pEnum_xx, pDisp, szMember))) { \
-		CDispPtr objName; \
-		while (dhEnumNextObject(xx_pEnum_xx, &objName) == NOERROR) {
-
-#undef FOR_EACH1
-#define FOR_EACH1(objName, pDisp, szMember, arg1) { \
-	CEnumPtr xx_pEnum_xx;     \
-	if (SUCCEEDED(dhEnumBegin(&xx_pEnum_xx, pDisp, szMember, arg1))) { \
-		CDispPtr objName; \
-		while (dhEnumNextObject(xx_pEnum_xx, &objName) == NOERROR) {
-
-#undef FOR_EACH2
-#define FOR_EACH2(objName, pDisp, szMember, arg1, arg2) { \
-	CEnumPtr xx_pEnum_xx;     \
-	if (SUCCEEDED(dhEnumBegin(&xx_pEnum_xx, pDisp, szMember, arg1, arg2))) { \
-		CDispPtr objName; \
-		while (dhEnumNextObject(xx_pEnum_xx, &objName) == NOERROR) {
-
-#undef FOR_EACH3
-#define FOR_EACH3(objName, pDisp, szMember, arg1, arg2, arg3) { \
-	CEnumPtr xx_pEnum_xx;     \
-	if (SUCCEEDED(dhEnumBegin(&xx_pEnum_xx, pDisp, szMember, arg1, arg2, arg3))) { \
-		CDispPtr objName; \
-		while (dhEnumNextObject(xx_pEnum_xx, &objName) == NOERROR) {
-
-#undef FOR_EACH4
-#define FOR_EACH4(objName, pDisp, szMember, arg1, arg2, arg3, arg4) { \
-	CEnumPtr xx_pEnum_xx;     \
-	if (SUCCEEDED(dhEnumBegin(&xx_pEnum_xx, pDisp, szMember, arg1, arg2, arg3, arg4))) { \
-		CDispPtr objName; \
-		while (dhEnumNextObject(xx_pEnum_xx, &objName) == NOERROR) {
-
-#undef ON_FOR_EACH_ERROR
-#define ON_FOR_EACH_ERROR(objName) }} else {{
-
-#undef NEXT
-#define NEXT(objName) }}}
-
-#define NEXT_THROW(objName) }} else { dhThrowFunctions::throw_string(); }}
-
-#endif /* DISPHELPER_NO_FOR_EACH */
-
-#ifdef _MSC_VER
-#pragma warning( default : 4290 )
-#endif
-
-#endif /* defined(__cplusplus) && !defined(DISPHELPER_NO_CPP_EXTENSIONS) */
-
-#endif /* ----- DISPHELPER_H_INCLUDED ----- */
diff --git a/js/node_modules/serialport/src/win/enumser.cpp b/js/node_modules/serialport/src/win/enumser.cpp
deleted file mode 100644
index f0e058721983064ccd392573f4a92ea57b5edced..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/win/enumser.cpp
+++ /dev/null
@@ -1,1186 +0,0 @@
-/*
-Module : enumser.cpp
-Purpose: Implementation for a class to enumerate the serial ports installed on a PC using a number
-         of different approaches. 
-Created: PJN / 03-10-1998
-History: PJN / 23-02-1999 Code now uses QueryDosDevice if running on NT to determine 
-                          which serial ports are available. This avoids having to open 
-                          the ports at all. It should operate a lot faster in addition.
-         PJN / 12-12-1999 Fixed a problem in the Win9x code path when trying to detect 
-                          deactivated IRDA-ports. When trying to open those, you will 
-                          get the error-code ERROR_GEN_FAILURE.�
-         PJN / 17-05-2000 Code now uses GetDefaultCommConfig in all cases to detect 
-                          the ports.
-         PJN / 29-03-2001 1. Reverted code to use CreateFile or QueryDosDevice as it is 
-                          much faster than using the GetDefaultCommConfig method
-                          2. Updated copyright message
-         PJN / 25-06-2001 1. Guess what, You now have the choice of using the GetDefaultCommConfig
-                          thro the use of three versions of the function. You take your pick.
-                          2. Fixed problem where port fails to be reported thro the CreateFile
-                          mechanism when the error code is ERROR_SHARING_VIOLATION i.e. someone
-                          has the port already open
-         PJN / 11-08-2001 1. Made code path which uses QueryDosDevice more robust by checking to 
-                          make sure the device name is of the form "COMxyz.." where xyz are numeric
-         PJN / 13-08-2001 1. Made the code in IsNumeric more robust when sent an empty string
-                          2. Optimized the code in EnumerateSerialPorts2 somewhat. Thanks to Dennis 
-                          Lim for these suggestions.
-         PJN / 22-05-2003 1. Updated copyright details.
-                          2. Addition of a "EnumerateSerialPorts4" which uses Device Manager API
-         PJN / 20-09-2003 1. Addition of a "EnumerateSerialPorts5" method. This method (hopefully
-                          the last method!) uses EnumPorts and was provided by Andi Martin.
-         PJN / 12-12-2003 1. Updated the sample app to VC 6.
-                          2. Addition of a "EnumerateSerialPorts6" (See Note 4 below) which uses WMI.
-                          3. You can now optionally exclude each function using preprocessor defines
-                          of the form "NO_ENUMSERIAL_USING_XYX".
-                          4. Made the functions members of a C++ class and renamed them to 
-                          use more meaningful names
-         PJN / 13-05-2004 1. Extended CEnumerateSerial::UsingSetupAPI to now also return the friendly
-                          name of the port. Thanks to Jay C. Howard for prompting this update.
-         PJN / 08-07-2006 1. Updated copyright details.
-                          2. Addition of a CENUMERATESERIAL_EXT_CLASS macro to allow the code to be 
-                          easily added to an extension dll.
-                          3. Code now uses newer C++ style casts instead of C style casts.
-                          4. Updated the code to clean compile on VC 2005.
-                          5. Updated the documentation to use the same style as the web site.
-         PJN / 08-11-2006 1. Extended CEnumerateSerial::UsingWMI to now also return the friendly
-                          name of the port. Thanks to Giovanni Bajo for providing this update.
-                          2. Fixed a bug where CEnumerateSerial::UsingSetupAPI forget to empty out 
-                          the Friendly name array on start.
-                          3. VariantInit is now called for the 2 VARIANT structs used in the UsingWMI
-                          method code.
-         PJN / 29-01-2007 1. Updated copyright details.
-                          2. UsingSetupAPI code now uses the GUID_DEVINTERFACE_COMPORT guid to enumerate
-                          COM ports. Thanks to David McMinn for reporting this nice addition.
-                          3. Detection code which uses CreateFile call, now treats the error code
-                          of ERROR_SEM_TIMEOUT as indication that a port is present.
-         PJN / 09-06-2007 1. Following feedback from John Miles, it looks like my previous change of the
-                          29 January 2007 to use GUID_DEVINTERFACE_COMPORT in the UsingSetupAPI method 
-                          had the unintended consequence of causing this method not to work on any 
-                          versions of Windows prior to Windows 2000. What I have now done is reinstate 
-                          the old mechanism using the name UsingSetupAPI2 so that you can continue to use 
-                          this approach if you need to support NT 4 and Windows 9x. The new approach of 
-                          using GUID_DEVINTERFACE_COMPORT has been renamed to UsingSetupAPI1.
-         PJN / 05-07-2007 1. Updated the code to work if the code does not include MFC. In this case, 
-                          CUIntArray parameters becomes the ATL class CSimpleArray<UINT> and CStringArray
-                          parameters become the ATL class CSimpleArray<CString>. Please note that this
-                          support requires a recentish copy of Visual Studio and will not support Visual
-                          C++ 6.0 as the code makes use of the ATL CString class. Thanks to Michael Venus
-                          for prompting this update.
-                          2. CEnumerateSerial::UsingWMI method now uses ATL smart pointers to improve
-                          robustness of the code.
-         PJN / 20-03-2008 1. Updated copyright details
-                          2. Updates to preprocessor logic to correctly include UsingSetupAPI1 and
-                          UsingSetupAPI2 functionality
-                          3. Updated sample app to clean compile on VC 2008
-         PJN / 23-11-2008 1. Updated code to compile correctly using _ATL_CSTRING_EXPLICIT_CONSTRUCTORS define
-                          2. The code now only supports VC 2005 or later. 
-                          3. Code now compiles cleanly using Code Analysis (/analyze)
-                          4. Yes, Addition of another method called "UsingComDB" to enumerate serial ports!. 
-                          This function uses the so called "COM Database" functions which are part of the 
-                          Windows DDK which device drivers can use to support claiming an unused port number 
-                          when the device driver is being installed. Please note that the list returning from 
-                          this function will only report used port numbers. The device may or may not be 
-                          actually present, just that the associated port number is currently "claimed". 
-                          Thanks to Dmitry Nikitin for prompting this very nice addition. The code now 
-                          supports a total of 8 different ways to enumerate serial ports!
-         PJN / 29-11-2008 1. Addition of a ninth and hopefully final method to enumerate serial ports. The
-                          function is called "UsingRegistry" and enumerates the ports by examining the 
-                          registry location at HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM. Thanks to
-                          Martin Oberhuber for prompting this update.
-                          2. Fixed a bug where the last error value was not being preserved in 
-                          CEnumerateSerial::UsingComDB.
-         PJN / 30-04-2009 1. Updated copyright details.
-                          2. Updated the sample app's project settings to more modern default values.
-                          3. Updated the sample app to log the time taken for the various methods.
-         PJN / 27-03-2010 1. Updated copyright details.
-                          2. Code can now optionally use STL instead of MFC or ATL in the API. To use STL 
-                          containers instead of MFC or ATL versions, please define CENUMERATESERIAL_USE_STL before 
-                          you include enumser in your project. Please note that the code still internally uses ATL
-                          in the UsingWMI method, but the other functions do not. This means that the class should
-                          now be partly compilable on VC Express (2005, 2008 or 2010) as none of these have support 
-                          for ATL or MFC. I do not personally have VC Express installed so people's feedback on 
-                          this would be appreciated. Thanks to Bill Adair for providing this update. 
-         PJN / 28-03-2011 1. Updated copyright details.
-                          2. Updated the UsingComDB method to fix an off by one issue. This resulting in the list of 
-                          ports this function reported being incorrect. Thanks to "Jar, Min, Jeong" for reporting 
-                          this issue.
-                          3. Updated sample app to compile cleanly on VC 2010
-         PJN / 14-10-2012 1. Updated copyright details.
-                          2. Code no longer uses LoadLibrary without an absolute path when loading SETUPAPI and 
-                          MSPORTS dlls. This avoids DLL planting security issues.
-                          3. Added a new internal CAutoHandle and CAutoHModule classes which makes the implementation 
-                          for CEnumerateSerial simpler
-                          4. Code now uses an internal RegQueryValueString method to ensure that data returned
-                          from raw Win32 API call RegQueryValueEx is null terminated before it is treated as such
-                          in the code. Thanks to Jeffrey Walton for reporting this security issue.
-                          5. Updated the code to clean compile on VC 2012
-         PJN / 10-01-2013 1. Updated copyright details
-                          2. Spun off CAutoHModule class into its own header file
-                          3. Spun off CAutoHandle class into its own header file
-                          4. Addition of a new CAutoHeapAlloc class which encapsulates HeapAlloc / HeapFree calls
-                          in a C++ class.
-                          5. Removed ATL usage completely from UsingQueryDevice, UsingSetupAPI2 and UsingEnumPorts.
-                          This should allow these methods to support compilers which do not have support for ATL such
-                          as VC Express SKUs.
-          PJN /28-07-2013 1. Did some very light cleanup of the code to reduce dependencies when #defining out parts of 
-                          the code. Thanks to Jay Beavers for providing this update.
-         
-Copyright (c) 1998 - 2013 by PJ Naughter (Web: www.naughter.com, Email: pjna@naughter.com)
-
-All rights reserved.
-
-Copyright / Usage Details:
-
-You are allowed to include the source code in any product (commercial, shareware, freeware or otherwise) 
-when your product is released in binary form. You are allowed to modify the source code in any way you want 
-except you cannot modify the copyright details at the top of each module. If you want to distribute source 
-code with your application, then you are only allowed to distribute versions released by the author. This is 
-to maintain a single distribution point for the source code. 
-
-*/
-
-
-/////////////////////////////////  Includes  //////////////////////////////////
-
-#include "stdafx.h"
-#include "enumser.h"
-#include "AutoHModule.h"
-#include "AutoHandle.h"
-#include "AutoHeapAlloc.h"
-
-#ifndef NO_ENUMSERIAL_USING_WMI
-#ifndef __ATLBASE_H__
-  #include <atlbase.h>
-  #pragma message("To avoid this message, please put atlbase.h in your pre compiled header (normally stdafx.h)")
-#endif
-#endif
-
-
-/////////////////////////////// Macros / Defines //////////////////////////////
-
-#if !defined(NO_ENUMSERIAL_USING_SETUPAPI1) || !defined(NO_ENUMSERIAL_USING_SETUPAPI2)
-  #ifndef _INC_SETUPAPI
-    #pragma message("To avoid this message, please put setupapi.h in your pre compiled header (normally stdafx.h)")
-    #include <setupapi.h>
-  #endif
-
-  #ifndef GUID_DEVINTERFACE_COMPORT
-    DEFINE_GUID(GUID_DEVINTERFACE_COMPORT, 0x86E0D1E0L, 0x8089, 0x11D0, 0x9C, 0xE4, 0x08, 0x00, 0x3E, 0x30, 0x1F, 0x73);
-  #endif
-  
-  typedef HKEY (__stdcall SETUPDIOPENDEVREGKEY)(HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM);
-  typedef BOOL (__stdcall SETUPDICLASSGUIDSFROMNAME)(LPCTSTR, LPGUID, DWORD, PDWORD);
-  typedef BOOL (__stdcall SETUPDIDESTROYDEVICEINFOLIST)(HDEVINFO);
-  typedef BOOL (__stdcall SETUPDIENUMDEVICEINFO)(HDEVINFO, DWORD, PSP_DEVINFO_DATA);
-  typedef HDEVINFO (__stdcall SETUPDIGETCLASSDEVS)(LPGUID, LPCTSTR, HWND, DWORD);
-  typedef BOOL (__stdcall SETUPDIGETDEVICEREGISTRYPROPERTY)(HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD);
-#endif  
-
-#ifndef NO_ENUMSERIAL_USING_ENUMPORTS
-  #ifndef _WINSPOOL_
-  #pragma message("To avoid this message, please put winspool.h in your pre compiled header (normally stdafx.h)")
-  #include <winspool.h>
-  #endif
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_WMI
-  #ifndef __IWbemLocator_FWD_DEFINED__
-  #pragma message("To avoid this message, please put WBemCli.h in your pre compiled header (normally stdafx.h)")
-  #include <WbemCli.h>
-  #endif
-  
-  #ifndef _INC_COMDEF
-  #pragma message("To avoid this message, please put comdef.h in your pre compiled header (normally stdafx.h)")
-  #include <comdef.h>
-  #endif
-
-  #ifndef __ATLBASE_H__
-  #pragma message("EnumSerialPorts as of v1.16 requires ATL support to implement its functionality. If your project is MFC only, then you need to update it to include ATL support")
-  #endif
-  
-  //Automatically pull in the library WbemUuid.Lib since we need the WBem Guids
-  #pragma comment(lib, "WbemUuid.Lib")
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_COMDB
-  #ifndef HCOMDB
-    DECLARE_HANDLE(HCOMDB);
-    typedef HCOMDB *PHCOMDB;
-  #endif
-  
-  #ifndef CDB_REPORT_BYTES
-    #define CDB_REPORT_BYTES 0x1  
-  #endif
-  
-  typedef LONG (__stdcall COMDBOPEN)(PHCOMDB);
-  typedef LONG (__stdcall COMDBCLOSE)(HCOMDB);
-  typedef LONG (__stdcall COMDBGETCURRENTPORTUSAGE)(HCOMDB, PBYTE, DWORD, ULONG, LPDWORD);
-#endif
-
-
-///////////////////////////// Implementation //////////////////////////////////
-
-#ifndef NO_ENUMSERIAL_USING_CREATEFILE
-#if defined CENUMERATESERIAL_USE_STL
-BOOL CEnumerateSerial::UsingCreateFile(std::vector<UINT>& ports)
-#elif defined _AFX
-BOOL CEnumerateSerial::UsingCreateFile(CUIntArray& ports)
-#else
-BOOL CEnumerateSerial::UsingCreateFile(CSimpleArray<UINT>& ports)
-#endif
-{
-  //Make sure we clear out any elements which may already be in the array
-#if defined CENUMERATESERIAL_USE_STL
-  ports.clear();
-#else
-  ports.RemoveAll();
-#endif  
-
-  //Up to 255 COM ports are supported so we iterate through all of them seeing
-  //if we can open them or if we fail to open them, get an access denied or general error error.
-  //Both of these cases indicate that there is a COM port at that number. 
-  for (UINT i=1; i<256; i++)
-  {
-    //Form the Raw device name
-    CString sPort;
-    sPort.Format(_T("\\\\.\\COM%u"), i);
-
-    //Try to open the port
-    BOOL bSuccess = FALSE;
-    CAutoHandle port(CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0));
-    if (port == INVALID_HANDLE_VALUE)
-    {
-      DWORD dwError = GetLastError();
-
-      //Check to see if the error was because some other app had the port open or a general failure
-      if (dwError == ERROR_ACCESS_DENIED || dwError == ERROR_GEN_FAILURE || dwError == ERROR_SHARING_VIOLATION || dwError == ERROR_SEM_TIMEOUT)
-        bSuccess = TRUE;
-    }
-    else
-    {
-      //The port was opened successfully
-      bSuccess = TRUE;
-    }
-
-    //Add the port number to the array which will be returned
-    if (bSuccess)
-    {
-    #if defined CENUMERATESERIAL_USE_STL
-      ports.push_back(i);
-    #else
-      ports.Add(i);
-    #endif  
-    }
-  }
-
-  //Return the success indicator
-  return TRUE;
-}
-#endif
-
-#if !defined(NO_ENUMSERIAL_USING_SETUPAPI1) || !defined(NO_ENUMSERIAL_USING_SETUPAPI2) || !defined(NO_ENUMSERIAL_USING_COMDB)
-HMODULE CEnumerateSerial::LoadLibraryFromSystem32(LPCTSTR lpFileName)
-{
-  //Get the Windows System32 directory
-  TCHAR szFullPath[_MAX_PATH];
-  szFullPath[0] = _T('\0');
-  if (GetSystemDirectory(szFullPath, _countof(szFullPath)) == 0)
-    return NULL;
-
-  //Setup the full path and delegate to LoadLibrary    
-  _tcscat_s(szFullPath, _countof(szFullPath), _T("\\"));
-  _tcscat_s(szFullPath, _countof(szFullPath), lpFileName);
-  return LoadLibrary(szFullPath);
-}
-#endif
-
-#if !defined(NO_ENUMSERIAL_USING_SETUPAPI1) || !defined(NO_ENUMSERIAL_USING_SETUPAPI2)
-BOOL CEnumerateSerial::RegQueryValueString(HKEY kKey, LPCTSTR lpValueName, LPTSTR& pszValue)
-{
-  //Initialize the output parameter
-  pszValue = NULL;
-
-  //First query for the size of the registry value 
-  DWORD dwType = 0;
-  DWORD dwDataSize = 0;
-  LONG nError = RegQueryValueEx(kKey, lpValueName, NULL, &dwType, NULL, &dwDataSize);
-  if (nError != ERROR_SUCCESS)
-  {
-    SetLastError(nError);
-    return FALSE;
-  }
-
-  //Ensure the value is a string
-  if (dwType != REG_SZ)
-  {
-    SetLastError(ERROR_INVALID_DATA);
-    return FALSE;
-  }
-
-  //Allocate enough bytes for the return value
-  DWORD dwAllocatedSize = dwDataSize + sizeof(TCHAR); //+sizeof(TCHAR) is to allow us to NULL terminate the data if it is not null terminated in the registry
-  pszValue = reinterpret_cast<LPTSTR>(LocalAlloc(LMEM_FIXED, dwAllocatedSize)); 
-  if (pszValue == NULL)
-    return FALSE;
-
-  //Recall RegQueryValueEx to return the data
-  pszValue[0] = _T('\0');
-  DWORD dwReturnedSize = dwAllocatedSize;
-  nError = RegQueryValueEx(kKey, lpValueName, NULL, &dwType, reinterpret_cast<LPBYTE>(pszValue), &dwReturnedSize);
-  if (nError != ERROR_SUCCESS)
-  {
-    LocalFree(pszValue);
-    pszValue = NULL;
-    SetLastError(nError);
-    return FALSE;
-  }
-
-  //Handle the case where the data just returned is the same size as the allocated size. This could occur where the data
-  //has been updated in the registry with a non null terminator between the two calls to ReqQueryValueEx above. Rather than
-  //return a potentially non-null terminated block of data, just fail the method call
-  if (dwReturnedSize >= dwAllocatedSize)
-  {
-    SetLastError(ERROR_INVALID_DATA);
-    return FALSE;
-  }
-
-  //NULL terminate the data if it was not returned NULL terminated because it is not stored null terminated in the registry
-  if (pszValue[dwReturnedSize/sizeof(TCHAR) - 1] != _T('\0'))
-    pszValue[dwReturnedSize/sizeof(TCHAR)] = _T('\0');
-
-  return TRUE;
-}
-
-BOOL CEnumerateSerial::QueryRegistryPortName(HKEY hDeviceKey, int& nPort)
-{
-  //What will be the return value from the method (assume the worst)
-  BOOL bAdded = FALSE;
-
-  //Read in the name of the port
-  LPTSTR pszPortName = NULL;
-  if (RegQueryValueString(hDeviceKey, _T("PortName"), pszPortName))
-  {
-    //If it looks like "COMX" then
-    //add it to the array which will be returned
-    size_t nLen = _tcslen(pszPortName);
-    if (nLen > 3)
-    {
-      if ((_tcsnicmp(pszPortName, _T("COM"), 3) == 0) && IsNumeric((pszPortName + 3), FALSE))
-      {
-        //Work out the port number
-        nPort = _ttoi(pszPortName + 3);
-
-        bAdded = TRUE;
-      }
-    }
-    LocalFree(pszPortName);
-  }
-
-  return bAdded;
-}
-#endif //#if !defined(NO_ENUMSERIAL_USING_SETUPAPI1) || !defined(NO_ENUMSERIAL_USING_SETUPAPI2)
-
-BOOL CEnumerateSerial::IsNumeric(LPCSTR pszString, BOOL bIgnoreColon)
-{
-  size_t nLen = strlen(pszString);
-  if (nLen == 0)
-    return FALSE;
-
-  //What will be the return value from this function (assume the best)
-  BOOL bNumeric = TRUE;
-
-  for (size_t i=0; i<nLen && bNumeric; i++)
-  {
-    bNumeric = (isdigit(static_cast<int>(pszString[i])) != 0);
-    if (bIgnoreColon && (pszString[i] == ':'))
-      bNumeric = TRUE;
-  }
-
-  return bNumeric;
-}
-
-BOOL CEnumerateSerial::IsNumeric(LPCWSTR pszString, BOOL bIgnoreColon)
-{
-  size_t nLen = wcslen(pszString);
-  if (nLen == 0)
-    return FALSE;
-
-  //What will be the return value from this function (assume the best)
-  BOOL bNumeric = TRUE;
-
-  for (size_t i=0; i<nLen && bNumeric; i++)
-  {
-    bNumeric = (iswdigit(pszString[i]) != 0);
-    if (bIgnoreColon && (pszString[i] == L':'))
-      bNumeric = TRUE;
-  }
-
-  return bNumeric;
-}
-
-#ifndef NO_ENUMSERIAL_USING_QUERYDOSDEVICE
-#if defined CENUMERATESERIAL_USE_STL
-BOOL CEnumerateSerial::UsingQueryDosDevice(std::vector<UINT>& ports)
-#elif defined _AFX
-BOOL CEnumerateSerial::UsingQueryDosDevice(CUIntArray& ports)
-#else
-BOOL CEnumerateSerial::UsingQueryDosDevice(CSimpleArray<UINT>& ports)
-#endif
-{
-  //What will be the return value from this function (assume the worst)
-  BOOL bSuccess = FALSE;
-
-  //Make sure we clear out any elements which may already be in the array
-#if defined CENUMERATESERIAL_USE_STL
-  ports.clear();
-#else
-  ports.RemoveAll();
-#endif  
-
-  //Determine what OS we are running on
-  OSVERSIONINFO osvi;
-  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
-  BOOL bGetVer = GetVersionEx(&osvi);
-
-  //On NT use the QueryDosDevice API
-  if (bGetVer && (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT))
-  {
-    //Use QueryDosDevice to look for all devices of the form COMx. Since QueryDosDevice does
-    //not consitently report the required size of buffer, lets start with a reasonable buffer size
-    //of 4096 characters and go from there
-    int nChars = 4096;
-    BOOL bWantStop = FALSE;
-    while (nChars && !bWantStop)
-    {
-      CAutoHeapAlloc devices;
-      if (devices.Allocate(nChars * sizeof(TCHAR)))
-      {
-        LPTSTR pszDevices = static_cast<LPTSTR>(devices.m_pData);
-        DWORD dwChars = QueryDosDevice(NULL, pszDevices, nChars);
-        if (dwChars == 0)
-        {
-          DWORD dwError = GetLastError();
-          if (dwError == ERROR_INSUFFICIENT_BUFFER)
-          {
-            //Expand the buffer and  loop around again
-            nChars *= 2;
-          }
-          else
-            bWantStop = TRUE;
-        }
-        else
-        {
-          bSuccess = TRUE;
-          bWantStop = TRUE;
-          size_t i=0;
-          
-          while (pszDevices[i] != _T('\0'))
-          {
-            //Get the current device name
-            TCHAR* pszCurrentDevice = &(pszDevices[i]);
-
-            //If it looks like "COMX" then
-            //add it to the array which will be returned
-            size_t nLen = _tcslen(pszCurrentDevice);
-            if (nLen > 3)
-            {
-              if ((_tcsnicmp(pszCurrentDevice, _T("COM"), 3) == 0) && IsNumeric(&(pszCurrentDevice[3]), FALSE))
-              {
-                //Work out the port number
-                int nPort = _ttoi(&pszCurrentDevice[3]);
-              #if defined CENUMERATESERIAL_USE_STL
-                ports.push_back(nPort);
-              #else
-                ports.Add(nPort);
-              #endif  
-              }
-            }
-
-            //Go to next device name
-            i += (nLen + 1);
-          }
-        }
-      }
-      else
-      {
-        bWantStop = TRUE;
-        SetLastError(ERROR_OUTOFMEMORY);        
-      }
-    }
-  }
-  else
-    SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
-
-  return bSuccess;
-}
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_GETDEFAULTCOMMCONFIG
-#if defined CENUMERATESERIAL_USE_STL
-BOOL CEnumerateSerial::UsingGetDefaultCommConfig(std::vector<UINT>& ports)
-#elif defined _AFX
-BOOL CEnumerateSerial::UsingGetDefaultCommConfig(CUIntArray& ports)
-#else
-BOOL CEnumerateSerial::UsingGetDefaultCommConfig(CSimpleArray<UINT>& ports)
-#endif
-{
-  //Make sure we clear out any elements which may already be in the array
-#if defined CENUMERATESERIAL_USE_STL
-  ports.clear();
-#else
-  ports.RemoveAll();
-#endif  
-
-  //Up to 255 COM ports are supported so we iterate through all of them seeing
-  //if we can get the default configuration
-  for (UINT i=1; i<256; i++)
-  {
-    //Form the Raw device name
-    CString sPort;
-    sPort.Format(_T("COM%u"), i);
-
-    COMMCONFIG cc;
-    DWORD dwSize = sizeof(COMMCONFIG);
-    if (GetDefaultCommConfig(sPort, &cc, &dwSize))
-    {
-    #if defined CENUMERATESERIAL_USE_STL
-      ports.push_back(i);
-    #else
-      ports.Add(i);
-    #endif  
-    }
-  }
-
-  //Return the success indicator
-  return TRUE;
-}
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_SETUPAPI1
-#if defined CENUMERATESERIAL_USE_STL
-#if defined _UNICODE
-BOOL CEnumerateSerial::UsingSetupAPI1(std::vector<UINT>& ports, std::vector<std::wstring>& friendlyNames)
-#else
-BOOL CEnumerateSerial::UsingSetupAPI1(std::vector<UINT>& ports, std::vector<std::string>& friendlyNames)
-#endif
-#elif defined _AFX
-BOOL CEnumerateSerial::UsingSetupAPI1(CUIntArray& ports, CStringArray& friendlyNames)
-#else
-BOOL CEnumerateSerial::UsingSetupAPI1(CSimpleArray<UINT>& ports, CSimpleArray<CString>& friendlyNames)
-#endif
-{
-  //Make sure we clear out any elements which may already be in the array(s)
-#if defined CENUMERATESERIAL_USE_STL
-  ports.clear();
-  friendlyNames.clear();
-#else
-  ports.RemoveAll();
-  friendlyNames.RemoveAll();
-#endif  
-
-  //Get the various function pointers we require from setupapi.dll
-  CAutoHModule setupAPI(LoadLibraryFromSystem32(_T("SETUPAPI.DLL")));
-  if (setupAPI == NULL)
-    return FALSE;
-
-  SETUPDIOPENDEVREGKEY* lpfnLPSETUPDIOPENDEVREGKEY = reinterpret_cast<SETUPDIOPENDEVREGKEY*>(GetProcAddress(setupAPI, "SetupDiOpenDevRegKey"));
-#if defined _UNICODE
-  SETUPDIGETCLASSDEVS* lpfnSETUPDIGETCLASSDEVS = reinterpret_cast<SETUPDIGETCLASSDEVS*>(GetProcAddress(setupAPI, "SetupDiGetClassDevsW"));
-  SETUPDIGETDEVICEREGISTRYPROPERTY* lpfnSETUPDIGETDEVICEREGISTRYPROPERTY = reinterpret_cast<SETUPDIGETDEVICEREGISTRYPROPERTY*>(GetProcAddress(setupAPI, "SetupDiGetDeviceRegistryPropertyW"));
-#else
-  SETUPDIGETCLASSDEVS* lpfnSETUPDIGETCLASSDEVS = reinterpret_cast<SETUPDIGETCLASSDEVS*>(GetProcAddress(setupAPI, "SetupDiGetClassDevsA"));
-  SETUPDIGETDEVICEREGISTRYPROPERTY* lpfnSETUPDIGETDEVICEREGISTRYPROPERTY = reinterpret_cast<SETUPDIGETDEVICEREGISTRYPROPERTY*>(GetProcAddress(setupAPI, "SetupDiGetDeviceRegistryPropertyA"));
-#endif
-  SETUPDIDESTROYDEVICEINFOLIST* lpfnSETUPDIDESTROYDEVICEINFOLIST = reinterpret_cast<SETUPDIDESTROYDEVICEINFOLIST*>(GetProcAddress(setupAPI, "SetupDiDestroyDeviceInfoList"));
-  SETUPDIENUMDEVICEINFO* lpfnSETUPDIENUMDEVICEINFO = reinterpret_cast<SETUPDIENUMDEVICEINFO*>(GetProcAddress(setupAPI, "SetupDiEnumDeviceInfo"));
-
-  if ((lpfnLPSETUPDIOPENDEVREGKEY == NULL) || (lpfnSETUPDIDESTROYDEVICEINFOLIST == NULL) ||
-      (lpfnSETUPDIENUMDEVICEINFO == NULL) || (lpfnSETUPDIGETCLASSDEVS == NULL) || (lpfnSETUPDIGETDEVICEREGISTRYPROPERTY == NULL))
-  {
-    //Set the error to report
-    setupAPI.m_dwError = ERROR_CALL_NOT_IMPLEMENTED;
-
-    return FALSE;
-  }
-  
-  //Now create a "device information set" which is required to enumerate all the ports
-  GUID guid = GUID_DEVINTERFACE_COMPORT;
-  HDEVINFO hDevInfoSet = lpfnSETUPDIGETCLASSDEVS(&guid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
-  if (hDevInfoSet == INVALID_HANDLE_VALUE)
-  {
-    //Set the error to report
-    setupAPI.m_dwError = GetLastError();
-  
-    return FALSE;
-  }
-
-  //Finally do the enumeration
-  BOOL bMoreItems = TRUE;
-  int nIndex = 0;
-  SP_DEVINFO_DATA devInfo;
-  while (bMoreItems)
-  {
-    //Enumerate the current device
-    devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
-    bMoreItems = lpfnSETUPDIENUMDEVICEINFO(hDevInfoSet, nIndex, &devInfo);
-    if (bMoreItems)
-    {
-      //Did we find a serial port for this device
-      BOOL bAdded = FALSE;
-
-      //Get the registry key which stores the ports settings
-      HKEY hDeviceKey = lpfnLPSETUPDIOPENDEVREGKEY(hDevInfoSet, &devInfo, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_QUERY_VALUE);
-      if (hDeviceKey)
-      {
-        int nPort = 0;
-        if (QueryRegistryPortName(hDeviceKey, nPort))
-        {
-        #if defined CENUMERATESERIAL_USE_STL
-          ports.push_back(nPort);
-        #else
-          ports.Add(nPort);
-        #endif  
-          bAdded = TRUE;
-        }
-
-        //Close the key now that we are finished with it
-        RegCloseKey(hDeviceKey);
-      }
-
-      //If the port was a serial port, then also try to get its friendly name
-      if (bAdded)
-      {
-        TCHAR szFriendlyName[1024];
-        szFriendlyName[0] = _T('\0');
-        DWORD dwSize = sizeof(szFriendlyName);
-        DWORD dwType = 0;
-        if (lpfnSETUPDIGETDEVICEREGISTRYPROPERTY(hDevInfoSet, &devInfo, SPDRP_DEVICEDESC, &dwType, reinterpret_cast<PBYTE>(szFriendlyName), dwSize, &dwSize) && (dwType == REG_SZ))
-        {
-        #if defined CENUMERATESERIAL_USE_STL
-          friendlyNames.push_back(szFriendlyName);
-        #else
-          friendlyNames.Add(szFriendlyName);
-        #endif  
-        }
-        else
-        {
-        #if defined CENUMERATESERIAL_USE_STL
-          friendlyNames.push_back(_T(""));
-        #else
-          friendlyNames.Add(_T(""));
-        #endif  
-        }
-      }
-    }
-
-    ++nIndex;
-  }
-
-  //Free up the "device information set" now that we are finished with it
-  lpfnSETUPDIDESTROYDEVICEINFOLIST(hDevInfoSet);
-
-  //Return the success indicator
-  return TRUE;
-}
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_SETUPAPI2
-#if defined CENUMERATESERIAL_USE_STL
-#if defined _UNICODE
-BOOL CEnumerateSerial::UsingSetupAPI2(std::vector<UINT>& ports, std::vector<std::wstring>& friendlyNames)
-#else
-BOOL CEnumerateSerial::UsingSetupAPI2(std::vector<UINT>& ports, std::vector<std::string>& friendlyNames)
-#endif
-#elif defined _AFX
-BOOL CEnumerateSerial::UsingSetupAPI2(CUIntArray& ports, CStringArray& friendlyNames)
-#else
-BOOL CEnumerateSerial::UsingSetupAPI2(CSimpleArray<UINT>& ports, CSimpleArray<CString>& friendlyNames)
-#endif
-{
-  //Make sure we clear out any elements which may already be in the array(s)
-#if defined CENUMERATESERIAL_USE_STL
-  ports.clear();
-  friendlyNames.clear();
-#else
-  ports.RemoveAll();
-  friendlyNames.RemoveAll();
-#endif  
-
-  //Get the function pointers to "SetupDiGetClassDevs", "SetupDiGetClassDevs", "SetupDiEnumDeviceInfo", "SetupDiOpenDevRegKey" 
-  //and "SetupDiDestroyDeviceInfoList" in setupapi.dll
-  CAutoHModule setupAPI(LoadLibraryFromSystem32(_T("SETUPAPI.DLL")));
-  if (setupAPI == NULL)
-    return FALSE;
-
-  SETUPDIOPENDEVREGKEY* lpfnLPSETUPDIOPENDEVREGKEY = reinterpret_cast<SETUPDIOPENDEVREGKEY*>(GetProcAddress(setupAPI, "SetupDiOpenDevRegKey"));
-#if defined _UNICODE
-  SETUPDICLASSGUIDSFROMNAME* lpfnSETUPDICLASSGUIDSFROMNAME = reinterpret_cast<SETUPDICLASSGUIDSFROMNAME*>(GetProcAddress(setupAPI, "SetupDiClassGuidsFromNameW"));
-  SETUPDIGETCLASSDEVS* lpfnSETUPDIGETCLASSDEVS = reinterpret_cast<SETUPDIGETCLASSDEVS*>(GetProcAddress(setupAPI, "SetupDiGetClassDevsW"));
-  SETUPDIGETDEVICEREGISTRYPROPERTY* lpfnSETUPDIGETDEVICEREGISTRYPROPERTY = reinterpret_cast<SETUPDIGETDEVICEREGISTRYPROPERTY*>(GetProcAddress(setupAPI, "SetupDiGetDeviceRegistryPropertyW"));
-#else
-  SETUPDICLASSGUIDSFROMNAME* lpfnSETUPDICLASSGUIDSFROMNAME = reinterpret_cast<SETUPDICLASSGUIDSFROMNAME*>(GetProcAddress(setupAPI, "SetupDiClassGuidsFromNameA"));
-  SETUPDIGETCLASSDEVS* lpfnSETUPDIGETCLASSDEVS = reinterpret_cast<SETUPDIGETCLASSDEVS*>(GetProcAddress(setupAPI, "SetupDiGetClassDevsA"));
-  SETUPDIGETDEVICEREGISTRYPROPERTY* lpfnSETUPDIGETDEVICEREGISTRYPROPERTY = reinterpret_cast<SETUPDIGETDEVICEREGISTRYPROPERTY*>(GetProcAddress(setupAPI, "SetupDiGetDeviceRegistryPropertyA"));
-#endif
-  SETUPDIDESTROYDEVICEINFOLIST* lpfnSETUPDIDESTROYDEVICEINFOLIST = reinterpret_cast<SETUPDIDESTROYDEVICEINFOLIST*>(GetProcAddress(setupAPI, "SetupDiDestroyDeviceInfoList"));
-  SETUPDIENUMDEVICEINFO* lpfnSETUPDIENUMDEVICEINFO = reinterpret_cast<SETUPDIENUMDEVICEINFO*>(GetProcAddress(setupAPI, "SetupDiEnumDeviceInfo"));
-
-  if ((lpfnLPSETUPDIOPENDEVREGKEY == NULL) || (lpfnSETUPDICLASSGUIDSFROMNAME == NULL) || (lpfnSETUPDIDESTROYDEVICEINFOLIST == NULL) ||
-      (lpfnSETUPDIENUMDEVICEINFO == NULL) || (lpfnSETUPDIGETCLASSDEVS == NULL) || (lpfnSETUPDIGETDEVICEREGISTRYPROPERTY == NULL))
-  {
-    //Set the error to report
-    setupAPI.m_dwError = ERROR_CALL_NOT_IMPLEMENTED;
-
-    return FALSE;
-  }
-  
-  //First need to convert the name "Ports" to a GUID using SetupDiClassGuidsFromName
-  DWORD dwGuids = 0;
-  lpfnSETUPDICLASSGUIDSFROMNAME(_T("Ports"), NULL, 0, &dwGuids);
-  if (dwGuids == 0)
-  {
-    //Set the error to report
-    setupAPI.m_dwError = GetLastError();
-
-    return FALSE;
-  }
-
-  //Allocate the needed memory
-  CAutoHeapAlloc guids;
-  if (!guids.Allocate(dwGuids * sizeof(GUID)))
-  {
-    //Set the error to report
-    setupAPI.m_dwError = ERROR_OUTOFMEMORY;
-
-    return FALSE;
-  }
-
-  //Call the function again
-  GUID* pGuids = static_cast<GUID*>(guids.m_pData);
-  if (!lpfnSETUPDICLASSGUIDSFROMNAME(_T("Ports"), pGuids, dwGuids, &dwGuids))
-  {
-    //Set the error to report
-    setupAPI.m_dwError = GetLastError();
-
-    return FALSE;
-  }
-
-  //Now create a "device information set" which is required to enumerate all the ports
-  HDEVINFO hDevInfoSet = lpfnSETUPDIGETCLASSDEVS(pGuids, NULL, NULL, DIGCF_PRESENT);
-  if (hDevInfoSet == INVALID_HANDLE_VALUE)
-  {
-    //Set the error to report
-    setupAPI.m_dwError = GetLastError();
-
-    return FALSE;
-  }
-
-  //Finally do the enumeration
-  BOOL bMoreItems = TRUE;
-  int nIndex = 0;
-  SP_DEVINFO_DATA devInfo;
-  while (bMoreItems)
-  {
-    //Enumerate the current device
-    devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
-    bMoreItems = lpfnSETUPDIENUMDEVICEINFO(hDevInfoSet, nIndex, &devInfo);
-    if (bMoreItems)
-    {
-      //Did we find a serial port for this device
-      BOOL bAdded = FALSE;
-
-      //Get the registry key which stores the ports settings
-      HKEY hDeviceKey = lpfnLPSETUPDIOPENDEVREGKEY(hDevInfoSet, &devInfo, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_QUERY_VALUE);
-      if (hDeviceKey)
-      {
-        int nPort = 0;
-        if (QueryRegistryPortName(hDeviceKey, nPort))
-        {
-        #if defined CENUMERATESERIAL_USE_STL
-          ports.push_back(nPort);
-        #else
-          ports.Add(nPort);
-        #endif  
-          bAdded = TRUE;
-        }
-
-        //Close the key now that we are finished with it
-        RegCloseKey(hDeviceKey);
-      }
-
-      //If the port was a serial port, then also try to get its friendly name
-      if (bAdded)
-      {
-        TCHAR szFriendlyName[1024];
-        szFriendlyName[0] = _T('\0');
-        DWORD dwSize = sizeof(szFriendlyName);
-        DWORD dwType = 0;
-        if (lpfnSETUPDIGETDEVICEREGISTRYPROPERTY(hDevInfoSet, &devInfo, SPDRP_DEVICEDESC, &dwType, reinterpret_cast<PBYTE>(szFriendlyName), dwSize, &dwSize) && (dwType == REG_SZ))
-        {
-        #if defined CENUMERATESERIAL_USE_STL
-          friendlyNames.push_back(szFriendlyName);
-        #else
-          friendlyNames.Add(szFriendlyName);
-        #endif  
-        }
-        else
-        {
-        #if defined CENUMERATESERIAL_USE_STL
-          friendlyNames.push_back(_T(""));
-        #else
-          friendlyNames.Add(_T(""));
-        #endif  
-        }
-      }
-    }
-
-    ++nIndex;
-  }
-
-  //Free up the "device information set" now that we are finished with it
-  lpfnSETUPDIDESTROYDEVICEINFOLIST(hDevInfoSet);
-
-  //Return the success indicator
-  return TRUE;
-}
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_ENUMPORTS
-#if defined CENUMERATESERIAL_USE_STL
-BOOL CEnumerateSerial::UsingEnumPorts(std::vector<UINT>& ports)
-#elif defined _AFX
-BOOL CEnumerateSerial::UsingEnumPorts(CUIntArray& ports)
-#else
-BOOL CEnumerateSerial::UsingEnumPorts(CSimpleArray<UINT>& ports)
-#endif
-{
-  //Make sure we clear out any elements which may already be in the array
-#if defined CENUMERATESERIAL_USE_STL
-  ports.clear();
-#else
-  ports.RemoveAll();
-#endif  
-
-  //Call the first time to determine the size of the buffer to allocate
-  DWORD cbNeeded = 0;
-  DWORD dwPorts = 0;
-  EnumPorts(NULL, 1, NULL, 0, &cbNeeded, &dwPorts);
-
-  //What will be the return value
-  BOOL bSuccess = FALSE;
-
-  //Allocate the buffer and recall
-  CAutoHeapAlloc portsBuffer;
-  if (portsBuffer.Allocate(cbNeeded))
-  {
-    BYTE* pPorts = static_cast<BYTE*>(portsBuffer.m_pData);
-    bSuccess = EnumPorts(NULL, 1, pPorts, cbNeeded, &cbNeeded, &dwPorts);
-    if (bSuccess)
-    {
-      PORT_INFO_1* pPortInfo = reinterpret_cast<PORT_INFO_1*>(pPorts);
-      for (DWORD i=0; i<dwPorts; i++)
-      {
-        //If it looks like "COMX" then
-        //add it to the array which will be returned
-        size_t nLen = _tcslen(pPortInfo->pName);
-        if (nLen > 3)
-        {
-          if ((_tcsnicmp(pPortInfo->pName, _T("COM"), 3) == 0) && IsNumeric(&(pPortInfo->pName[3]), TRUE))
-          {
-            //Work out the port number
-            int nPort = _ttoi(&(pPortInfo->pName[3]));
-          #if defined CENUMERATESERIAL_USE_STL
-            ports.push_back(nPort);
-          #else
-            ports.Add(nPort);
-          #endif  
-          }
-        }
-
-        pPortInfo++;
-      }
-    }
-  }
-  else
-    SetLastError(ERROR_OUTOFMEMORY);        
-  
-  return bSuccess;
-}
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_WMI
-#if defined CENUMERATESERIAL_USE_STL
-#if defined _UNICODE
-BOOL CEnumerateSerial::UsingWMI(std::vector<UINT>& ports, std::vector<std::wstring>& friendlyNames)
-#else
-BOOL CEnumerateSerial::UsingWMI(std::vector<UINT>& ports, std::vector<std::string>& friendlyNames)
-#endif
-#elif defined _AFX
-BOOL CEnumerateSerial::UsingWMI(CUIntArray& ports, CStringArray& friendlyNames)
-#else
-BOOL CEnumerateSerial::UsingWMI(CSimpleArray<UINT>& ports, CSimpleArray<CString>& friendlyNames)
-#endif
-{
-  //Make sure we clear out any elements which may already be in the array(s)
-#if defined CENUMERATESERIAL_USE_STL
-  ports.clear();
-  friendlyNames.clear();
-#else
-  ports.RemoveAll();
-  friendlyNames.RemoveAll();
-#endif  
-
-  //What will be the return value
-  BOOL bSuccess = FALSE;
-
-  //Create the WBEM locator
-  ATL::CComPtr<IWbemLocator> locator;
-  HRESULT hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, reinterpret_cast<void**>(&locator));
-  if (SUCCEEDED(hr))
-  {
-    ATL::CComPtr<IWbemServices> services;
-    hr = locator->ConnectServer(_bstr_t("\\\\.\\root\\cimv2"), NULL, NULL, NULL, 0, NULL, NULL, &services);
-    if (SUCCEEDED(hr))
-    {
-      //Execute the query
-      ATL::CComPtr<IEnumWbemClassObject> classObject;
-      hr = services->CreateInstanceEnum(_bstr_t("Win32_SerialPort"), WBEM_FLAG_RETURN_WBEM_COMPLETE, NULL, &classObject);
-      if (SUCCEEDED(hr))
-      {
-        bSuccess = TRUE;
-
-        //Now enumerate all the ports
-        hr = WBEM_S_NO_ERROR;
-
-        //Final Next will return WBEM_S_FALSE
-        while (hr == WBEM_S_NO_ERROR)
-        {
-          ULONG uReturned = 0;
-          ATL::CComPtr<IWbemClassObject> apObj[10];
-          hr = classObject->Next(WBEM_INFINITE, 10, reinterpret_cast<IWbemClassObject**>(apObj), &uReturned);
-          if (SUCCEEDED(hr))
-          {
-            for (ULONG n=0; n<uReturned; n++)
-            {
-              ATL::CComVariant varProperty1;
-              HRESULT hrGet = Nan::Get(apObj[n], L"DeviceID", 0, &varProperty1, NULL, NULL);
-              if (SUCCEEDED(hrGet) && (varProperty1.vt == VT_BSTR) && (wcslen(varProperty1.bstrVal) > 3))
-              {
-                //If it looks like "COMX" then add it to the array which will be returned
-                if ((_wcsnicmp(varProperty1.bstrVal, L"COM", 3) == 0) && IsNumeric(&(varProperty1.bstrVal[3]), TRUE))
-                {
-                  //Work out the port number
-                  int nPort = _wtoi(&(varProperty1.bstrVal[3]));
-                #if defined CENUMERATESERIAL_USE_STL
-                  ports.push_back(nPort);
-                #else
-                  ports.Add(nPort);
-                #endif
-
-                  //Also get the friendly name of the port
-                  ATL::CComVariant varProperty2;
-                  if Nan::Get((SUCCEEDED(apObj[n], L"Name", 0, &varProperty2, NULL, NULL)) && (varProperty2.vt == VT_BSTR))
-                  {  
-                #if defined CENUMERATESERIAL_USE_STL
-                  #if defined _UNICODE  
-                    std::wstring szName(varProperty2.bstrVal);
-                  #else
-                    std::string szName(ATL::CW2A(varProperty2.bstrVal));
-                  #endif
-                    friendlyNames.push_back(szName);
-                  #else
-                    friendlyNames.Add(CString(varProperty2.bstrVal));    
-                  #endif
-                  }
-                  else
-                  {
-                  #if defined CENUMERATESERIAL_USE_STL
-                    friendlyNames.push_back(_T(""));
-                  #else
-                    friendlyNames.Add(_T(""));
-                  #endif  
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-  
-  return bSuccess;
-}
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_COMDB
-#if defined CENUMERATESERIAL_USE_STL
-BOOL CEnumerateSerial::UsingComDB(std::vector<UINT>& ports)
-#elif defined _AFX
-BOOL CEnumerateSerial::UsingComDB(CUIntArray& ports)
-#else
-BOOL CEnumerateSerial::UsingComDB(CSimpleArray<UINT>& ports)
-#endif
-{
-  //Make sure we clear out any elements which may already be in the array(s)
-#if defined CENUMERATESERIAL_USE_STL
-  ports.clear();
-#else
-  ports.RemoveAll();
-#endif  
-
-  //What will be the return value from this function (assume the worst)
-  BOOL bSuccess = FALSE;
-  
-  //Get the function pointers to "ComDBOpen", "ComDBClose" & "ComDBGetCurrentPortUsage" in msports.dll
-  CAutoHModule msPorts(LoadLibraryFromSystem32(_T("MSPORTS.DLL")));
-  if (msPorts == NULL)
-    return FALSE;
-
-  COMDBOPEN* lpfnLPCOMDBOPEN = reinterpret_cast<COMDBOPEN*>(GetProcAddress(msPorts, "ComDBOpen"));
-  COMDBCLOSE* lpfnLPCOMDBCLOSE = reinterpret_cast<COMDBCLOSE*>(GetProcAddress(msPorts, "ComDBClose"));
-  COMDBGETCURRENTPORTUSAGE* lpfnCOMDBGETCURRENTPORTUSAGE = reinterpret_cast<COMDBGETCURRENTPORTUSAGE*>(GetProcAddress(msPorts, "ComDBGetCurrentPortUsage"));
-  if ((lpfnLPCOMDBOPEN != NULL) && (lpfnLPCOMDBCLOSE != NULL) && (lpfnCOMDBGETCURRENTPORTUSAGE != NULL))
-  {
-    //First need to open up the DB
-    HCOMDB hComDB;
-    DWORD dwComOpen = lpfnLPCOMDBOPEN(&hComDB);
-    if (dwComOpen == ERROR_SUCCESS)
-    {
-      //Work out the size of the buffer required
-      DWORD dwMaxPortsReported = 0;
-      DWORD dwPortUsage = lpfnCOMDBGETCURRENTPORTUSAGE(hComDB, NULL, 0, CDB_REPORT_BYTES, &dwMaxPortsReported);
-      if (dwPortUsage == ERROR_SUCCESS)
-      {
-        //Allocate some heap space and recall the function
-        CAutoHeapAlloc portBytes;
-        if (portBytes.Allocate(dwMaxPortsReported))
-        {
-          bSuccess = TRUE;
-
-          PBYTE pPortBytes = static_cast<PBYTE>(portBytes.m_pData);
-          if (lpfnCOMDBGETCURRENTPORTUSAGE(hComDB, pPortBytes, dwMaxPortsReported, CDB_REPORT_BYTES, &dwMaxPortsReported) == ERROR_SUCCESS)
-          {
-            //Work thro the byte bit array for ports which are in use
-            for (DWORD i=0; i<dwMaxPortsReported; i++)
-            {
-              if (pPortBytes[i])
-              {
-              #if defined CENUMERATESERIAL_USE_STL
-                ports.push_back(i + 1);
-              #else
-                ports.Add(i + 1);
-              #endif
-              }
-            }
-          }
-        }
-        else
-          msPorts.m_dwError = ERROR_OUTOFMEMORY;
-      }
-      else
-        msPorts.m_dwError = dwPortUsage;
-    
-      //Close the DB
-      lpfnLPCOMDBCLOSE(hComDB);
-    }
-    else
-      msPorts.m_dwError = dwComOpen;
-  }
-  else
-    msPorts.m_dwError = ERROR_CALL_NOT_IMPLEMENTED;
-
-  return bSuccess;
-}
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_REGISTRY
-#if defined CENUMERATESERIAL_USE_STL
-#if defined _UNICODE
-BOOL CEnumerateSerial::UsingRegistry(std::vector<std::wstring>& ports)
-#else
-BOOL CEnumerateSerial::UsingRegistry(std::vector<std::string>& ports)
-#endif
-#elif defined _AFX
-BOOL CEnumerateSerial::UsingRegistry(CStringArray& ports)
-#else
-BOOL CEnumerateSerial::UsingRegistry(CSimpleArray<CString>& ports)
-#endif
-{
-  //Make sure we clear out any elements which may already be in the array(s)
-#if defined CENUMERATESERIAL_USE_STL
-  ports.clear();
-#else
-  ports.RemoveAll();
-#endif  
-
-  //What will be the return value from this function (assume the worst)
-  BOOL bSuccess = FALSE;
-
-  HKEY hSERIALCOMM;
-  if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_QUERY_VALUE, &hSERIALCOMM) == ERROR_SUCCESS)
-  {
-    //Get the max value name and max value lengths
-    DWORD dwMaxValueNameLen;
-    DWORD dwMaxValueLen;
-    DWORD dwQueryInfo = RegQueryInfoKey(hSERIALCOMM, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &dwMaxValueNameLen, &dwMaxValueLen, NULL, NULL);
-    if (dwQueryInfo == ERROR_SUCCESS)
-    {
-      DWORD dwMaxValueNameSizeInChars = dwMaxValueNameLen + 1; //Include space for the NULL terminator
-      DWORD dwMaxValueNameSizeInBytes = dwMaxValueNameSizeInChars * sizeof(TCHAR);
-      DWORD dwMaxValueDataSizeInChars = dwMaxValueLen/sizeof(TCHAR) + 1; //Include space for the NULL terminator
-      DWORD dwMaxValueDataSizeInBytes = dwMaxValueDataSizeInChars * sizeof(TCHAR);
-    
-      //Allocate some space for the value name and value data			
-      CAutoHeapAlloc valueName;
-      CAutoHeapAlloc valueData;
-      if (valueName.Allocate(dwMaxValueNameSizeInBytes) && valueData.Allocate(dwMaxValueDataSizeInBytes))
-      {
-        bSuccess = TRUE;
-
-        //Enumerate all the values underneath HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
-        DWORD dwIndex = 0;
-        DWORD dwType;
-        DWORD dwValueNameSize = dwMaxValueNameSizeInChars;
-        DWORD dwDataSize = dwMaxValueDataSizeInBytes;
-        memset(valueName.m_pData, 0, dwMaxValueNameSizeInBytes);
-        memset(valueData.m_pData, 0, dwMaxValueDataSizeInBytes);
-        TCHAR* szValueName = static_cast<TCHAR*>(valueName.m_pData);
-        BYTE* byValue = static_cast<BYTE*>(valueData.m_pData);
-        LONG nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, byValue, &dwDataSize);
-        while (nEnum == ERROR_SUCCESS)
-        {
-          //If the value is of the correct type, then add it to the array
-          if (dwType == REG_SZ)
-          {
-            TCHAR* szPort = reinterpret_cast<TCHAR*>(byValue);
-          #if defined CENUMERATESERIAL_USE_STL
-            ports.push_back(szPort);
-          #else
-            ports.Add(szPort);
-          #endif  						
-          }
-
-          //Prepare for the next time around
-          dwValueNameSize = dwMaxValueNameSizeInChars;
-          dwDataSize = dwMaxValueDataSizeInBytes;
-          memset(valueName.m_pData, 0, dwMaxValueNameSizeInBytes);
-          memset(valueData.m_pData, 0, dwMaxValueDataSizeInBytes);
-          ++dwIndex;
-          nEnum = RegEnumValue(hSERIALCOMM, dwIndex, szValueName, &dwValueNameSize, NULL, &dwType, byValue, &dwDataSize);
-        }
-      }
-      else
-        SetLastError(ERROR_OUTOFMEMORY);
-    }
-    
-    //Close the registry key now that we are finished with it    
-    RegCloseKey(hSERIALCOMM);
-    
-    if (dwQueryInfo != ERROR_SUCCESS)
-      SetLastError(dwQueryInfo);
-  }
-  
-  return bSuccess;
-}
-#endif
diff --git a/js/node_modules/serialport/src/win/enumser.h b/js/node_modules/serialport/src/win/enumser.h
deleted file mode 100644
index 87a143fa3281cff023707f017d16d54167bb1dbf..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/win/enumser.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
-Module : enumser.h
-Purpose: Defines the interface for a class to enumerate the serial ports installed on a PC
-         using a number of different approaches
-Created: PJN / 03-11-1998
-
-Copyright (c) 1998 - 2013 by PJ Naughter (Web: www.naughter.com, Email: pjna@naughter.com)
-
-All rights reserved.
-
-Copyright / Usage Details:
-
-You are allowed to include the source code in any product (commercial, shareware, freeware or otherwise) 
-when your product is released in binary form. You are allowed to modify the source code in any way you want 
-except you cannot modify the copyright details at the top of each module. If you want to distribute source 
-code with your application, then you are only allowed to distribute versions released by the author. This is 
-to maintain a single distribution point for the source code. 
-
-*/
-
-
-///////////////////////// Macros / Structs etc ////////////////////////////////
-
-#pragma once
-
-#ifndef __ENUMSER_H__
-#define __ENUMSER_H__
-
-#ifndef CENUMERATESERIAL_EXT_CLASS
-#define CENUMERATESERIAL_EXT_CLASS
-#endif
-
-
-///////////////////////// Includes ////////////////////////////////////////////                      
-
-#if defined CENUMERATESERIAL_USE_STL
-#ifndef _VECTOR_
-  #include <vector>
-  #pragma message("To avoid this message, please put vector in your pre compiled header (normally stdafx.h)")
-#endif  
-#ifndef _STRING_
-  #include <string>
-  #pragma message("To avoid this message, please put string in your pre compiled header (normally stdafx.h)")
-#endif  
-#else
-#if defined _AFX
-  #ifndef __AFXTEMPL_H__
-    #include <afxtempl.h> 
-    #pragma message("To avoid this message, please put afxtempl.h in your pre compiled header (normally stdafx.h)")
-  #endif
-#else
-  #ifndef __ATLSTR_H__
-    #include <atlstr.h>
-    #pragma message("To avoid this message, please put atlstr.h in your pre compiled header (normally stdafx.h)")
-  #endif  
-#endif
-#endif
-
-
-///////////////////////// Classes /////////////////////////////////////////////
-
-class CENUMERATESERIAL_EXT_CLASS CEnumerateSerial
-{
-public:
-//Methods
-#ifndef NO_ENUMSERIAL_USING_CREATEFILE
-  #if defined CENUMERATESERIAL_USE_STL
-  	static BOOL UsingCreateFile(std::vector<UINT>& ports);
-  #elif defined _AFX
-  	static BOOL UsingCreateFile(CUIntArray& ports);
-  #else
-      static BOOL UsingCreateFile(CSimpleArray<UINT>& ports);
-  #endif
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_QUERYDOSDEVICE
-  #if defined CENUMERATESERIAL_USE_STL
-    static BOOL UsingQueryDosDevice(std::vector<UINT>& ports);
-  #elif defined _AFX
-    static BOOL UsingQueryDosDevice(CUIntArray& ports);
-  #else
-    static BOOL UsingQueryDosDevice(CSimpleArray<UINT>& ports);
-  #endif
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_GETDEFAULTCOMMCONFIG
-  #if defined CENUMERATESERIAL_USE_STL
-	static BOOL UsingGetDefaultCommConfig(std::vector<UINT>& ports);
-  #elif defined _AFX
-    static BOOL UsingGetDefaultCommConfig(CUIntArray& ports);
-  #else
-    static BOOL UsingGetDefaultCommConfig(CSimpleArray<UINT>& ports);
-  #endif
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_SETUPAPI1
-  #if defined CENUMERATESERIAL_USE_STL
-    #if defined _UNICODE
-      static BOOL UsingSetupAPI1(std::vector<UINT>& ports, std::vector<std::wstring>& friendlyNames);
-    #else
-      static BOOL UsingSetupAPI1(std::vector<UINT>& ports, std::vector<std::string>& friendlyNames);
-    #endif
-  #elif defined _AFX
-    static BOOL UsingSetupAPI1(CUIntArray& ports, CStringArray& friendlyNames);
-  #else
-    static BOOL UsingSetupAPI1(CSimpleArray<UINT>& ports, CSimpleArray<CString>& friendlyNames);
-  #endif
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_SETUPAPI2
-  #if defined CENUMERATESERIAL_USE_STL
-    #if defined _UNICODE
-      static BOOL UsingSetupAPI2(std::vector<UINT>& ports, std::vector<std::wstring>& friendlyNames);
-    #else
-      static BOOL UsingSetupAPI2(std::vector<UINT>& ports, std::vector<std::string>& friendlyNames);
-    #endif
-  #elif defined _AFX
-    static BOOL UsingSetupAPI2(CUIntArray& ports, CStringArray& friendlyNames);
-  #else
-    static BOOL UsingSetupAPI2(CSimpleArray<UINT>& ports, CSimpleArray<CString>& friendlyNames);
-  #endif
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_ENUMPORTS
-  #if defined CENUMERATESERIAL_USE_STL
-    static BOOL UsingEnumPorts(std::vector<UINT>& ports);
-  #elif defined _AFX
-    static BOOL UsingEnumPorts(CUIntArray& ports);
-  #else
-    static BOOL UsingEnumPorts(CSimpleArray<UINT>& ports);
-  #endif
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_WMI
-  #if defined CENUMERATESERIAL_USE_STL
-    #if defined _UNICODE
-      static BOOL UsingWMI(std::vector<UINT>& ports, std::vector<std::wstring>& friendlyNames);
-    #else
-      static BOOL UsingWMI(std::vector<UINT>& ports, std::vector<std::string>& friendlyNames);
-    #endif
-  #elif defined _AFX
-    static BOOL UsingWMI(CUIntArray& ports, CStringArray& friendlyNames);
-  #else
-    static BOOL UsingWMI(CSimpleArray<UINT>& ports, CSimpleArray<CString>& friendlyNames);
-  #endif
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_COMDB
-  #if defined CENUMERATESERIAL_USE_STL
-    static BOOL UsingComDB(std::vector<UINT>& ports);
-  #elif defined _AFX
-    static BOOL UsingComDB(CUIntArray& ports);
-  #else
-    static BOOL UsingComDB(CSimpleArray<UINT>& ports);
-  #endif
-#endif
-
-#ifndef NO_ENUMSERIAL_USING_REGISTRY
-  #if defined CENUMERATESERIAL_USE_STL
-    #if defined _UNICODE
-      static BOOL UsingRegistry(std::vector<std::wstring>& ports);
-    #else
-      static BOOL UsingRegistry(std::vector<std::string>& ports);
-    #endif
-  #elif defined _AFX
-    static BOOL UsingRegistry(CStringArray& ports);
-  #else
-    static BOOL UsingRegistry(CSimpleArray<CString>& ports);
-  #endif
-#endif
-
-protected:
-//Methods
-#if !defined(NO_ENUMSERIAL_USING_SETUPAPI1) || !defined(NO_ENUMSERIAL_USING_SETUPAPI2)
-  static BOOL RegQueryValueString(HKEY kKey, LPCTSTR lpValueName, LPTSTR& pszValue);
-  static BOOL QueryRegistryPortName(HKEY hDeviceKey, int& nPort);
-#endif
-#if !defined(NO_ENUMSERIAL_USING_SETUPAPI1) || !defined(NO_ENUMSERIAL_USING_SETUPAPI2) || !defined(NO_ENUMSERIAL_USING_COMDB)
-  static HMODULE LoadLibraryFromSystem32(LPCTSTR lpFileName);
-#endif
-  static BOOL IsNumeric(LPCSTR pszString, BOOL bIgnoreColon);
-  static BOOL IsNumeric(LPCWSTR pszString, BOOL bIgnoreColon);
-};
-
-#endif //__ENUMSER_H__
diff --git a/js/node_modules/serialport/src/win/stdafx.h b/js/node_modules/serialport/src/win/stdafx.h
deleted file mode 100644
index a4fa475f93d3dd7c6c7fc94068d577ab27662868..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/win/stdafx.h
+++ /dev/null
@@ -1,51 +0,0 @@
-#pragma once
-
-#define CENUMERATESERIAL_USE_STL //Uncomment this line if you want to test the STL support in CEnumerateSerial
-
-#ifndef _SECURE_ATL
-#define _SECURE_ATL 1 //Use the Secure C Runtime in ATL
-#endif
-
-#ifndef VC_EXTRALEAN
-#define VC_EXTRALEAN
-#endif
-
-#ifndef WINVER
-#define WINVER 0x0500
-#endif
-
-#ifndef _WIN32_WINNT
-#define _WIN32_WINNT 0x0500
-#endif
-
-#ifndef _WIN32_WINDOWS
-#define _WIN32_WINDOWS 0x0500
-#endif
-
-#ifndef _WIN32_IE
-#define _WIN32_IE 0x0500
-#endif
-
-#ifndef CENUMERATESERIAL_USE_STL
-  #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS	// some CString constructors will be explicit
-
-  #define _AFX_ALL_WARNINGS // turns off MFC's hiding of some common and often safely ignored warning messages
-
-  #include <afxext.h> 
-  #include <afxtempl.h>
-  #include <atlbase.h>
-#else
-  #include "stdstring.h"
-  #define NO_ENUMSERIAL_USING_WMI
-#endif
-
-#include <vector>
-
-#define NO_ENUMSERIAL_USING_ENUMPORTS
-#define NO_ENUMSERIAL_USING_SETUPAPI1
-#define NO_ENUMSERIAL_USING_SETUPAPI2
-#define NO_ENUMSERIAL_USING_WMI
-#define NO_ENUMSERIAL_USING_COMDB
-#define NO_ENUMSERIAL_USING_CREATEFILE
-#define NO_ENUMSERIAL_USING_GETDEFAULTCOMMCONFIG
-#define NO_ENUMSERIAL_USING_REGISTRY
\ No newline at end of file
diff --git a/js/node_modules/serialport/src/win/stdstring.h b/js/node_modules/serialport/src/win/stdstring.h
deleted file mode 100644
index 4ee36c592318334630c5dfcf100763a7b624b1c3..0000000000000000000000000000000000000000
--- a/js/node_modules/serialport/src/win/stdstring.h
+++ /dev/null
@@ -1,4351 +0,0 @@
-// =============================================================================
-//  FILE:  StdString.h
-//  AUTHOR:	Joe O'Leary (with outside help noted in comments)
-//
-//		If you find any bugs in this code, please let me know:
-//
-//				jmoleary@earthlink.net
-//				http://www.joeo.net/stdstring.htm (a bit outdated)
-//
-//      The latest version of this code should always be available at the
-//      following link:
-//
-//              http://www.joeo.net/code/StdString.zip (Dec 6, 2003)
-//
-//
-//  REMARKS:
-//		This header file declares the CStdStr template.  This template derives
-//		the Standard C++ Library basic_string<> template and add to it the
-//		the following conveniences:
-//			- The full MFC CString set of functions (including implicit cast)
-//			- writing to/reading from COM IStream interfaces
-//			- Functional objects for use in STL algorithms
-//
-//		From this template, we intstantiate two classes:  CStdStringA and
-//		CStdStringW.  The name "CStdString" is just a #define of one of these,
-//		based upone the UNICODE macro setting
-//
-//		This header also declares our own version of the MFC/ATL UNICODE-MBCS
-//		conversion macros.  Our version looks exactly like the Microsoft's to
-//		facilitate portability.
-//
-//	NOTE:
-//		If you you use this in an MFC or ATL build, you should include either
-//		afx.h or atlbase.h first, as appropriate.
-//
-//	PEOPLE WHO HAVE CONTRIBUTED TO THIS CLASS:
-//
-//		Several people have helped me iron out problems and othewise improve
-//		this class.  OK, this is a long list but in my own defense, this code
-//		has undergone two major rewrites.  Many of the improvements became
-//		necessary after I rewrote the code as a template.  Others helped me
-//		improve the CString facade.
-//
-//		Anyway, these people are (in chronological order):
-//
-//			- Pete the Plumber (???)
-//			- Julian Selman
-//			- Chris (of Melbsys)
-//			- Dave Plummer
-//			- John C Sipos
-//			- Chris Sells
-//			- Nigel Nunn
-//			- Fan Xia
-//			- Matthew Williams
-//			- Carl Engman
-//			- Mark Zeren
-//			- Craig Watson
-//			- Rich Zuris
-//			- Karim Ratib
-//			- Chris Conti
-//			- Baptiste Lepilleur
-//			- Greg Pickles
-//			- Jim Cline
-//			- Jeff Kohn
-//			- Todd Heckel
-//			- Ullrich Pollähne
-//			- Joe Vitaterna
-//			- Joe Woodbury
-//			- Aaron (no last name)
-//			- Joldakowski (???)
-//			- Scott Hathaway
-//			- Eric Nitzche
-//			- Pablo Presedo
-//			- Farrokh Nejadlotfi
-//			- Jason Mills
-//			- Igor Kholodov
-//			- Mike Crusader
-//			- John James
-//			- Wang Haifeng
-//			- Tim Dowty
-//          - Arnt Witteveen
-//          - Glen Maynard
-//          - Paul DeMarco
-//          - Bagira (full name?)
-//          - Ronny Schulz
-//          - Jakko Van Hunen
-//			- Charles Godwin
-//			- Henk Demper
-//			- Greg Marr
-//			- Bill Carducci
-//			- Brian Groose
-//			- MKingman
-//			- Don Beusee
-//
-//	REVISION HISTORY
-//
-//	  2005-JAN-10 - Thanks to Don Beusee for pointing out the danger in mapping
-//					length-checked formatting functions to non-length-checked
-//					CRT equivalents.  Also thanks to him for motivating me to
-//					optimize my implementation of Replace()
-//
-//	  2004-APR-22 - A big, big thank you to "MKingman" (whoever you are) for
-//					finally spotting a silly little error in StdCodeCvt that
-//					has been causing me (and users of CStdString) problems for
-//					years in some relatively rare conversions.  I had reversed
-//					two length arguments. 
-//
-//    2003-NOV-24 - Thanks to a bunch of people for helping me clean up many
-//					compiler warnings (and yes, even a couple of actual compiler
-//					errors).  These include Henk Demper for figuring out how
-//					to make the Intellisense work on with CStdString on VC6,
-//					something I was never able to do.  Greg Marr pointed out
-//					a compiler warning about an unreferenced symbol and a
-//					problem with my version of Load in MFC builds.  Bill
-//					Carducci took a lot of time with me to help me figure out
-//					why some implementations of the Standard C++ Library were
-//					returning error codes for apparently successful conversions
-//					between ASCII and UNICODE.  Finally thanks to Brian Groose
-//					for helping me fix compiler signed unsigned warnings in
-//					several functions.
-//
-//    2003-JUL-10 - Thanks to Charles Godwin for making me realize my 'FmtArg'
-//					fixes had inadvertently broken the DLL-export code (which is
-//                  normally commented out.  I had to move it up higher.  Also
-//					this helped me catch a bug in ssicoll that would prevent
-//                  compilation, otherwise.
-//
-//    2003-MAR-14 - Thanks to Jakko Van Hunen for pointing out a copy-and-paste
-//                  bug in one of the overloads of FmtArg.
-//
-//    2003-MAR-10 - Thanks to Ronny Schulz for (twice!) sending me some changes
-//                  to help CStdString build on SGI and for pointing out an
-//                  error in placement of my preprocessor macros for ssfmtmsg.
-//
-//    2002-NOV-26 - Thanks to Bagira for pointing out that my implementation of
-//                  SpanExcluding was not properly handling the case in which
-//                  the string did NOT contain any of the given characters
-//
-//    2002-OCT-21 - Many thanks to Paul DeMarco who was invaluable in helping me
-//                  get this code working with Borland's free compiler as well
-//                  as the Dev-C++ compiler (available free at SourceForge).
-//
-//    2002-SEP-13 - Thanks to Glen Maynard who helped me get rid of some loud
-//                  but harmless warnings that were showing up on g++.  Glen
-//                  also pointed out that some pre-declarations of FmtArg<>
-//                  specializations were unnecessary (and no good on G++)
-//
-//    2002-JUN-26 - Thanks to Arnt Witteveen for pointing out that I was using
-//                  static_cast<> in a place in which I should have been using
-//                  reinterpret_cast<> (the ctor for unsigned char strings).
-//                  That's what happens when I don't unit-test properly!
-//                  Arnt also noticed that CString was silently correcting the
-//                  'nCount' argument to Left() and Right() where CStdString was
-//                  not (and crashing if it was bad).  That is also now fixed!
-//
-//	  2002-FEB-25 - Thanks to Tim Dowty for pointing out (and giving me the fix
-//					for) a conversion problem with non-ASCII MBCS characters.
-//					CStdString is now used in my favorite commercial MP3 player!
-//
-//	  2001-DEC-06 - Thanks to Wang Haifeng for spotting a problem in one of the
-//					assignment operators (for _bstr_t) that would cause compiler
-//					errors when refcounting protection was turned off.
-//
-//	  2001-NOV-27 - Remove calls to operator!= which involve reverse_iterators
-//					due to a conflict with the rel_ops operator!=.  Thanks to
-//					John James for pointing this out.
-//
-//    2001-OCT-29 - Added a minor range checking fix for the Mid function to
-//					make it as forgiving as CString's version is.  Thanks to
-//					Igor Kholodov for noticing this.  
-//				  - Added a specialization of std::swap for CStdString.  Thanks
-//					to Mike Crusader for suggesting this!  It's commented out
-//					because you're not supposed to inject your own code into the
-//					'std' namespace.  But if you don't care about that, it's
-//					there if you want it
-//				  - Thanks to Jason Mills for catching a case where CString was
-//					more forgiving in the Delete() function than I was.
-//
-//	  2001-JUN-06 - I was violating the Standard name lookup rules stated
-//					in [14.6.2(3)].  None of the compilers I've tried so
-//					far apparently caught this but HP-UX aCC 3.30 did.  The
-//					fix was to add 'this->' prefixes in many places.
-//					Thanks to Farrokh Nejadlotfi for this!
-//
-//	  2001-APR-27 - StreamLoad was calculating the number of BYTES in one
-//					case, not characters.  Thanks to Pablo Presedo for this.
-//
-//    2001-FEB-23 - Replace() had a bug which caused infinite loops if the
-//					source string was empty.  Fixed thanks to Eric Nitzsche.
-//
-//    2001-FEB-23 - Scott Hathaway was a huge help in providing me with the
-//					ability to build CStdString on Sun Unix systems.  He
-//					sent me detailed build reports about what works and what
-//					does not.  If CStdString compiles on your Unix box, you
-//					can thank Scott for it.
-//
-//	  2000-DEC-29 - Joldakowski noticed one overload of Insert failed to do a
-//					range check as CString's does.  Now fixed -- thanks!
-//
-//	  2000-NOV-07 - Aaron pointed out that I was calling static member
-//					functions of char_traits via a temporary.  This was not
-//					technically wrong, but it was unnecessary and caused
-//					problems for poor old buggy VC5.  Thanks Aaron!
-//
-//	  2000-JUL-11 - Joe Woodbury noted that the CString::Find docs don't match
-//					what the CString::Find code really ends up doing.   I was
-//					trying to match the docs.  Now I match the CString code
-//				  - Joe also caught me truncating strings for GetBuffer() calls
-//					when the supplied length was less than the current length.
-//
-//	  2000-MAY-25 - Better support for STLPORT's Standard library distribution
-//				  - Got rid of the NSP macro - it interfered with Koenig lookup
-//				  - Thanks to Joe Woodbury for catching a TrimLeft() bug that
-//					I introduced in January.  Empty strings were not getting
-//					trimmed
-//
-//	  2000-APR-17 - Thanks to Joe Vitaterna for pointing out that ReverseFind
-//					is supposed to be a const function.
-//
-//	  2000-MAR-07 - Thanks to Ullrich Pollähne for catching a range bug in one
-//					of the overloads of assign.
-//
-//    2000-FEB-01 - You can now use CStdString on the Mac with CodeWarrior!
-//					Thanks to Todd Heckel for helping out with this.
-//
-//	  2000-JAN-23 - Thanks to Jim Cline for pointing out how I could make the
-//					Trim() function more efficient.
-//				  - Thanks to Jeff Kohn for prompting me to find and fix a typo
-//					in one of the addition operators that takes _bstr_t.
-//				  - Got rid of the .CPP file -  you only need StdString.h now!
-//
-//	  1999-DEC-22 - Thanks to Greg Pickles for helping me identify a problem
-//					with my implementation of CStdString::FormatV in which
-//					resulting string might not be properly NULL terminated.
-//
-//	  1999-DEC-06 - Chris Conti pointed yet another basic_string<> assignment
-//					bug that MS has not fixed.  CStdString did nothing to fix
-//					it either but it does now!  The bug was: create a string
-//					longer than 31 characters, get a pointer to it (via c_str())
-//					and then assign that pointer to the original string object.
-//					The resulting string would be empty.  Not with CStdString!
-//
-//	  1999-OCT-06 - BufferSet was erasing the string even when it was merely
-//					supposed to shrink it.  Fixed.  Thanks to Chris Conti.
-//				  - Some of the Q172398 fixes were not checking for assignment-
-//					to-self.  Fixed.  Thanks to Baptiste Lepilleur.
-//
-//	  1999-AUG-20 - Improved Load() function to be more efficient by using 
-//					SizeOfResource().  Thanks to Rich Zuris for this.
-//				  - Corrected resource ID constructor, again thanks to Rich.
-//				  - Fixed a bug that occurred with UNICODE characters above
-//					the first 255 ANSI ones.  Thanks to Craig Watson. 
-//				  - Added missing overloads of TrimLeft() and TrimRight().
-//					Thanks to Karim Ratib for pointing them out
-//
-//	  1999-JUL-21 - Made all calls to GetBuf() with no info check length first.
-//
-//	  1999-JUL-10 - Improved MFC/ATL independence of conversion macros
-//				  - Added SS_NO_REFCOUNT macro to allow you to disable any
-//					reference-counting your basic_string<> impl. may do.
-//				  - Improved ReleaseBuffer() to be as forgiving as CString.
-//					Thanks for Fan Xia for helping me find this and to
-//					Matthew Williams for pointing it out directly.
-//
-//	  1999-JUL-06 - Thanks to Nigel Nunn for catching a very sneaky bug in
-//					ToLower/ToUpper.  They should call GetBuf() instead of
-//					data() in order to ensure the changed string buffer is not
-//					reference-counted (in those implementations that refcount).
-//
-//	  1999-JUL-01 - Added a true CString facade.  Now you can use CStdString as
-//					a drop-in replacement for CString.  If you find this useful,
-//					you can thank Chris Sells for finally convincing me to give
-//					in and implement it.
-//				  - Changed operators << and >> (for MFC CArchive) to serialize
-//					EXACTLY as CString's do.  So now you can send a CString out
-//					to a CArchive and later read it in as a CStdString.   I have
-//					no idea why you would want to do this but you can. 
-//
-//	  1999-JUN-21 - Changed the CStdString class into the CStdStr template.
-//				  - Fixed FormatV() to correctly decrement the loop counter.
-//					This was harmless bug but a bug nevertheless.  Thanks to
-//					Chris (of Melbsys) for pointing it out
-//				  - Changed Format() to try a normal stack-based array before
-//					using to _alloca().
-//				  - Updated the text conversion macros to properly use code
-//					pages and to fit in better in MFC/ATL builds.  In other
-//					words, I copied Microsoft's conversion stuff again. 
-//				  - Added equivalents of CString::GetBuffer, GetBufferSetLength
-//				  - new sscpy() replacement of CStdString::CopyString()
-//				  - a Trim() function that combines TrimRight() and TrimLeft().
-//
-//	  1999-MAR-13 - Corrected the "NotSpace" functional object to use _istpace()
-//					instead of _isspace()   Thanks to Dave Plummer for this.
-//
-//	  1999-FEB-26 - Removed errant line (left over from testing) that #defined
-//					_MFC_VER.  Thanks to John C Sipos for noticing this.
-//
-//	  1999-FEB-03 - Fixed a bug in a rarely-used overload of operator+() that
-//					caused infinite recursion and stack overflow
-//				  - Added member functions to simplify the process of
-//					persisting CStdStrings to/from DCOM IStream interfaces 
-//				  - Added functional objects (e.g. StdStringLessNoCase) that
-//					allow CStdStrings to be used as keys STL map objects with
-//					case-insensitive comparison 
-//				  - Added array indexing operators (i.e. operator[]).  I
-//					originally assumed that these were unnecessary and would be
-//					inherited from basic_string.  However, without them, Visual
-//					C++ complains about ambiguous overloads when you try to use
-//					them.  Thanks to Julian Selman to pointing this out. 
-//
-//	  1998-FEB-?? - Added overloads of assign() function to completely account
-//					for Q172398 bug.  Thanks to "Pete the Plumber" for this
-//
-//	  1998-FEB-?? - Initial submission
-//
-// COPYRIGHT:
-//		2002 Joseph M. O'Leary.  This code is 100% free.  Use it anywhere you
-//      want.  Rewrite it, restructure it, whatever.  If you can write software
-//      that makes money off of it, good for you.  I kinda like capitalism. 
-//      Please don't blame me if it causes your $30 billion dollar satellite
-//      explode in orbit.  If you redistribute it in any form, I'd appreciate it
-//      if you would leave this notice here.
-// =============================================================================
-
-// Avoid multiple inclusion
-
-#ifndef STDSTRING_H
-#define STDSTRING_H
-
-// When using VC, turn off browser references
-// Turn off unavoidable compiler warnings
-
-#if defined(_MSC_VER) && (_MSC_VER > 1100)
-	#pragma component(browser, off, references, "CStdString")
-	#pragma warning (disable : 4290) // C++ Exception Specification ignored
-	#pragma warning (disable : 4127) // Conditional expression is constant
-	#pragma warning (disable : 4097) // typedef name used as synonym for class name
-#endif
-
-// Borland warnings to turn off
-
-#ifdef __BORLANDC__
-    #pragma option push -w-inl
-//	#pragma warn -inl   // Turn off inline function warnings
-#endif
-
-// SS_IS_INTRESOURCE
-// -----------------
-//		A copy of IS_INTRESOURCE from VC7.  Because old VC6 version of winuser.h
-//		doesn't have this.
-
-#define SS_IS_INTRESOURCE(_r) (false)
-
-#if !defined (SS_ANSI) && defined(_MSC_VER)
-	#undef SS_IS_INTRESOURCE
-	#if defined(_WIN64)
-		#define SS_IS_INTRESOURCE(_r) (((unsigned __int64)(_r) >> 16) == 0)
-	#else
-		#define SS_IS_INTRESOURCE(_r) (((unsigned long)(_r) >> 16) == 0)
-	#endif
-#endif
-
-
-// MACRO: SS_UNSIGNED
-// ------------------
-//      This macro causes the addition of a constructor and assignment operator
-//      which take unsigned characters.  CString has such functions and in order
-//      to provide maximum CString-compatability, this code needs them as well.
-//      In practice you will likely never need these functions...
-
-//#define SS_UNSIGNED
-
-#ifdef SS_ALLOW_UNSIGNED_CHARS
-	#define SS_UNSIGNED
-#endif
-
-// MACRO: SS_SAFE_FORMAT
-// ---------------------
-//      This macro provides limited compatability with a questionable CString
-//      "feature".  You can define it in order to avoid a common problem that
-//      people encounter when switching from CString to CStdString.
-//
-//      To illustrate the problem -- With CString, you can do this:
-//
-//          CString sName("Joe");
-//          CString sTmp;
-//          sTmp.Format("My name is %s", sName);                    // WORKS!
-//
-//      However if you were to try this with CStdString, your program would
-//      crash.
-//
-//          CStdString sName("Joe");
-//          CStdString sTmp;
-//          sTmp.Format("My name is %s", sName);                    // CRASHES!
-//
-//      You must explicitly call c_str() or cast the object to the proper type
-//
-//          sTmp.Format("My name is %s", sName.c_str());            // WORKS!
-//          sTmp.Format("My name is %s", static_cast<PCSTR>(sName));// WORKS!
-//          sTmp.Format("My name is %s", (PCSTR)sName);				// WORKS!
-//
-//      This is because it is illegal to pass anything but a POD type as a
-//      variadic argument to a variadic function (i.e. as one of the "..."
-//      arguments).  The type const char* is a POD type.  The type CStdString
-//      is not.  Of course, neither is the type CString, but CString lets you do
-//      it anyway due to the way they laid out the class in binary.  I have no
-//      control over this in CStdString since I derive from whatever
-//      implementation of basic_string is available.
-//
-//      However if you have legacy code (which does this) that you want to take
-//      out of the MFC world and you don't want to rewrite all your calls to
-//      Format(), then you can define this flag and it will no longer crash.
-//
-//      Note however that this ONLY works for Format(), not sprintf, fprintf, 
-//      etc.  If you pass a CStdString object to one of those functions, your
-//      program will crash.  Not much I can do to get around this, short of
-//      writing substitutes for those functions as well.
-
-#define SS_SAFE_FORMAT  // use new template style Format() function
-
-
-// MACRO: SS_NO_IMPLICIT_CAST
-// --------------------------
-//      Some people don't like the implicit cast to const char* (or rather to
-//      const CT*) that CStdString (and MFC's CString) provide.  That was the
-//      whole reason I created this class in the first place, but hey, whatever
-//      bakes your cake.  Just #define this macro to get rid of the the implicit
-//      cast.
-
-//#define SS_NO_IMPLICIT_CAST // gets rid of operator const CT*()
-
-
-// MACRO: SS_NO_REFCOUNT
-// ---------------------
-//		turns off reference counting at the assignment level.  Only needed
-//		for the version of basic_string<> that comes with Visual C++ versions
-//		6.0 or earlier, and only then in some heavily multithreaded scenarios.
-//		Uncomment it if you feel you need it.
-
-//#define SS_NO_REFCOUNT
-
-// MACRO: SS_WIN32
-// ---------------
-//      When this flag is set, we are building code for the Win32 platform and
-//      may use Win32 specific functions (such as LoadString).  This gives us
-//      a couple of nice extras for the code.
-//
-//      Obviously, Microsoft's is not the only compiler available for Win32 out
-//      there.  So I can't just check to see if _MSC_VER is defined to detect
-//      if I'm building on Win32.  So for now, if you use MS Visual C++ or
-//      Borland's compiler, I turn this on.  Otherwise you may turn it on
-//      yourself, if you prefer
-
-#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WIN32)
-    #define SS_WIN32
-#endif
-
-// MACRO: SS_ANSI
-// --------------
-//      When this macro is defined, the code attempts only to use ANSI/ISO
-//      standard library functions to do it's work.  It will NOT attempt to use
-//      any Win32 of Visual C++ specific functions -- even if they are
-//      available.  You may define this flag yourself to prevent any Win32
-//      of VC++ specific functions from being called. 
-
-// If we're not on Win32, we MUST use an ANSI build
-
-#ifndef SS_WIN32
-    #if !defined(SS_NO_ANSI)
-        #define SS_ANSI
-    #endif
-#endif
-
-// MACRO: SS_ALLOCA
-// ----------------
-//      Some implementations of the Standard C Library have a non-standard
-//      function known as alloca().  This functions allows one to allocate a
-//      variable amount of memory on the stack.  It is needed to implement
-//      the ASCII/MBCS conversion macros.
-//
-//      I wanted to find some way to determine automatically if alloca() is
-//		available on this platform via compiler flags but that is asking for
-//		trouble.  The crude test presented here will likely need fixing on
-//		other platforms.  Therefore I'll leave it up to you to fiddle with
-//		this test to determine if it exists.  Just make sure SS_ALLOCA is or
-//		is not defined as appropriate and you control this feature.
-
-#if defined(_MSC_VER) && !defined(SS_ANSI)
-	#define SS_ALLOCA
-#endif
-
-
-// MACRO: SS_MBCS
-// --------------
-//		Setting this macro means you are using MBCS characters.  In MSVC builds,
-//		this macro gets set automatically by detection of the preprocessor flag
-//		_MBCS.  For other platforms you may set it manually if you wish.  The
-//		only effect it currently has is to cause the allocation of more space
-//		for wchar_t --> char conversions.
-//		Note that MBCS does not mean UNICODE.
-//
-//	#define SS_MBCS
-//
-
-#ifdef _MBCS
-	#define SS_MBCS
-#endif
-
-
-// MACRO SS_NO_LOCALE
-// ------------------
-// If your implementation of the Standard C++ Library lacks the <locale> header,
-// you can #define this macro to make your code build properly.  Note that this
-// is some of my newest code and frankly I'm not very sure of it, though it does
-// pass my unit tests.
-
-// #define SS_NO_LOCALE
-
-
-// Compiler Error regarding _UNICODE and UNICODE
-// -----------------------------------------------
-// Microsoft header files are screwy.  Sometimes they depend on a preprocessor 
-// flag named "_UNICODE".  Other times they check "UNICODE" (note the lack of
-// leading underscore in the second version".  In several places, they silently
-// "synchronize" these two flags this by defining one of the other was defined. 
-// In older version of this header, I used to try to do the same thing. 
-//
-// However experience has taught me that this is a bad idea.  You get weird
-// compiler errors that seem to indicate things like LPWSTR and LPTSTR not being
-// equivalent in UNICODE builds, stuff like that (when they MUST be in a proper
-// UNICODE  build).  You end up scratching your head and saying, "But that HAS
-// to compile!".
-//
-// So what should you do if you get this error?
-//
-// Make sure that both macros (_UNICODE and UNICODE) are defined before this
-// file is included.  You can do that by either
-//
-//		a) defining both yourself before any files get included
-//		b) including the proper MS headers in the proper order
-//		c) including this file before any other file, uncommenting
-//		   the #defines below, and commenting out the #errors
-//
-//	Personally I recommend solution a) but it's your call.
-
-#ifdef _MSC_VER
-	#if defined (_UNICODE) && !defined (UNICODE)
-		#error UNICODE defined  but not UNICODE
-	//	#define UNICODE  // no longer silently fix this
-	#endif
-	#if defined (UNICODE) && !defined (_UNICODE)
-		#error Warning, UNICODE defined  but not _UNICODE
-	//	#define _UNICODE  // no longer silently fix this
-	#endif
-#endif
-
-
-// -----------------------------------------------------------------------------
-// MIN and MAX.  The Standard C++ template versions go by so many names (at
-// at least in the MS implementation) that you never know what's available 
-// -----------------------------------------------------------------------------
-template<class Type>
-inline const Type& SSMIN(const Type& arg1, const Type& arg2)
-{
-	return arg2 < arg1 ? arg2 : arg1;
-}
-template<class Type>
-inline const Type& SSMAX(const Type& arg1, const Type& arg2)
-{
-	return arg2 > arg1 ? arg2 : arg1;
-}
-
-// If they have not #included W32Base.h (part of my W32 utility library) then
-// we need to define some stuff.  Otherwise, this is all defined there.
-
-#if !defined(W32BASE_H)
-
-	// If they want us to use only standard C++ stuff (no Win32 stuff)
-
-	#ifdef SS_ANSI
-
-		// On Win32 we have TCHAR.H so just include it.  This is NOT violating
-        // the spirit of SS_ANSI as we are not calling any Win32 functions here.
-        
-		#ifdef SS_WIN32
-
-			#include <TCHAR.H>
-			#include <WTYPES.H>
-			#ifndef STRICT
-				#define STRICT
-			#endif
-
-        // ... but on non-Win32 platforms, we must #define the types we need.
-
-		#else
-
-			typedef const char*		PCSTR;
-			typedef char*			PSTR;
-			typedef const wchar_t*	PCWSTR;
-			typedef wchar_t*		PWSTR;
-			#ifdef UNICODE
-				typedef wchar_t		TCHAR;
-			#else
-				typedef char		TCHAR;
-			#endif
-			typedef wchar_t			OLECHAR;
-
-		#endif	// #ifndef _WIN32
-
-
-		// Make sure ASSERT and verify are defined using only ANSI stuff
-
-		#ifndef ASSERT
-			#include <assert.h>
-			#define ASSERT(f) assert((f))
-		#endif
-		#ifndef VERIFY
-			#ifdef _DEBUG
-				#define VERIFY(x) ASSERT((x))
-			#else
-				#define VERIFY(x) x
-			#endif
-		#endif
-
-	#else // ...else SS_ANSI is NOT defined
-
-		#include <TCHAR.H>
-		#include <WTYPES.H>
-		#ifndef STRICT
-			#define STRICT
-		#endif
-
-		// Make sure ASSERT and verify are defined
-
-		#ifndef ASSERT
-			#include <crtdbg.h>
-			#define ASSERT(f) _ASSERTE((f))
-		#endif
-		#ifndef VERIFY
-			#ifdef _DEBUG
-				#define VERIFY(x) ASSERT((x))
-			#else
-				#define VERIFY(x) x
-			#endif
-		#endif
-
-	#endif // #ifdef SS_ANSI
-
-	#ifndef UNUSED
-		#define UNUSED(x) x
-	#endif
-
-#endif // #ifndef W32BASE_H
-
-// Standard headers needed
-
-#include <string>			// basic_string
-#include <algorithm>		// for_each, etc.
-#include <functional>		// for StdStringLessNoCase, et al
-#ifndef SS_NO_LOCALE
-	#include <locale>			// for various facets
-#endif
-
-// If this is a recent enough version of VC include comdef.h, so we can write
-// member functions to deal with COM types & compiler support classes e.g.
-// _bstr_t
-
-#if defined (_MSC_VER) && (_MSC_VER >= 1100)
-	#include <comdef.h>
-	#define SS_INC_COMDEF		// signal that we #included MS comdef.h file
-	#define STDSTRING_INC_COMDEF
-	#define SS_NOTHROW __declspec(nothrow)
-#else
-	#define SS_NOTHROW
-#endif
-
-#ifndef TRACE
-	#define TRACE_DEFINED_HERE
-	#define TRACE
-#endif
-
-// Microsoft defines PCSTR, PCWSTR, etc, but no PCTSTR.  I hate to use the
-// versions with the "L" in front of them because that's a leftover from Win 16
-// days, even though it evaluates to the same thing.  Therefore, Define a PCSTR
-// as an LPCTSTR.
-
-#if !defined(PCTSTR) && !defined(PCTSTR_DEFINED)
-	typedef const TCHAR*			PCTSTR;
-	#define PCTSTR_DEFINED
-#endif
-
-#if !defined(PCOLESTR) && !defined(PCOLESTR_DEFINED)
-	typedef const OLECHAR*			PCOLESTR;
-	#define PCOLESTR_DEFINED
-#endif
-
-#if !defined(POLESTR) && !defined(POLESTR_DEFINED)
-	typedef OLECHAR*				POLESTR;
-	#define POLESTR_DEFINED
-#endif
-
-#if !defined(PCUSTR) && !defined(PCUSTR_DEFINED)
-	typedef const unsigned char*	PCUSTR;
-	typedef unsigned char*			PUSTR;
-	#define PCUSTR_DEFINED
-#endif
-
-
-// SGI compiler 7.3 doesnt know these  types - oh and btw, remember to use
-// -LANG:std in the CXX Flags
-#if defined(__sgi)
-    typedef unsigned long           DWORD;
-    typedef void *                  LPCVOID;
-#endif
-
-
-// SS_USE_FACET macro and why we need it:
-//
-// Since I'm a good little Standard C++ programmer, I use locales.  Thus, I
-// need to make use of the use_facet<> template function here.   Unfortunately,
-// this need is complicated by the fact the MS' implementation of the Standard
-// C++ Library has a non-standard version of use_facet that takes more
-// arguments than the standard dictates.  Since I'm trying to write CStdString
-// to work with any version of the Standard library, this presents a problem.
-//
-// The upshot of this is that I can't do 'use_facet' directly.  The MS' docs
-// tell me that I have to use a macro, _USE() instead.  Since _USE obviously
-// won't be available in other implementations, this means that I have to write
-// my OWN macro -- SS_USE_FACET -- that evaluates either to _USE or to the
-// standard, use_facet.
-//
-// If you are having trouble with the SS_USE_FACET macro, in your implementation
-// of the Standard C++ Library, you can define your own version of SS_USE_FACET.
-
-#ifndef schMSG
-	#define schSTR(x)	   #x
-	#define schSTR2(x)	schSTR(x)
-	#define schMSG(desc) message(__FILE__ "(" schSTR2(__LINE__) "):" #desc)
-#endif
-
-#ifndef SS_USE_FACET
-
-	// STLPort #defines a macro (__STL_NO_EXPLICIT_FUNCTION_TMPL_ARGS) for
-	// all MSVC builds, erroneously in my opinion.  It causes problems for
-	// my SS_ANSI builds.  In my code, I always comment out that line.  You'll
-	// find it in   \stlport\config\stl_msvc.h
-
-	#if defined(__SGI_STL_PORT) && (__SGI_STL_PORT >= 0x400 )
-
-		#if defined(__STL_NO_EXPLICIT_FUNCTION_TMPL_ARGS) && defined(_MSC_VER)
-			#ifdef SS_ANSI
-				#pragma schMSG(__STL_NO_EXPLICIT_FUNCTION_TMPL_ARGS defined!!)
-			#endif
-		#endif
-		#define SS_USE_FACET(loc, fac) std::use_facet<fac >(loc)
-
-	#elif defined(_MSC_VER )
-
-		#define SS_USE_FACET(loc, fac) std::_USE(loc, fac)
-
-	// ...and
-	#elif defined(_RWSTD_NO_TEMPLATE_ON_RETURN_TYPE)
-
-        #define SS_USE_FACET(loc, fac) std::use_facet(loc, (fac*)0)
-
-	#else
-
-		#define SS_USE_FACET(loc, fac) std::use_facet<fac >(loc)
-
-	#endif
-
-#endif
-
-// =============================================================================
-// UNICODE/MBCS conversion macros.  Made to work just like the MFC/ATL ones.
-// =============================================================================
-
-#include <wchar.h>      // Added to Std Library with Amendment #1.
-
-// First define the conversion helper functions.  We define these regardless of
-// any preprocessor macro settings since their names won't collide. 
-
-// Not sure if we need all these headers.   I believe ANSI says we do.
-
-#include <stdio.h>
-#include <stdarg.h>
-#include <wctype.h>
-#include <ctype.h>
-#include <stdlib.h>
-#ifndef va_start
-	#include <varargs.h>
-#endif
-
-
-#ifdef SS_NO_LOCALE
-
-	#if defined(_WIN32) || defined (_WIN32_WCE)
-
-		inline PWSTR StdCodeCvt(PWSTR pDstW, int nDst, PCSTR pSrcA, int nSrc, 
-			UINT acp=CP_ACP)
-		{
-			ASSERT(0 != pSrcA);
-			ASSERT(0 != pDstW);
-			pDstW[0] = '\0';
-			MultiByteToWideChar(acp, 0, pSrcA, nSrc, pDstW, nDst);
-			return pDstW;
-		}
-		inline PWSTR StdCodeCvt(PWSTR pDstW, int nDst, PCUSTR pSrcA, int nSrc, 
-			UINT acp=CP_ACP)
-		{
-			return StdCodeCvt(pDstW, nDst, (PCSTR)pSrcA, nSrc, acp);
-		}
-
-		inline PSTR StdCodeCvt(PSTR pDstA, int nDst, PCWSTR pSrcW, int nSrc, 
-			UINT acp=CP_ACP)
-		{
-			ASSERT(0 != pDstA);
-			ASSERT(0 != pSrcW);
-			pDstA[0] = '\0';
-			WideCharToMultiByte(acp, 0, pSrcW, nSrc, pDstA, nDst, 0, 0);
-			return pDstA;
-		}
-		inline PUSTR StdCodeCvt(PUSTR pDstA, int nDst, PCWSTR pSrcW, int nSrc, 
-			UINT acp=CP_ACP)
-		{
-			return (PUSTR)StdCodeCvt((PSTR)pDstA, nDst, pSrcW, nSrc, acp);
-		}
-	#else
-	#endif
-
-#else
-
-	// StdCodeCvt - made to look like Win32 functions WideCharToMultiByte
-	//				and MultiByteToWideChar but uses locales in SS_ANSI
-	//				builds.  There are a number of overloads.
-	//              First argument is the destination buffer.
-	//              Second argument is the source buffer
-	//#if defined (SS_ANSI) || !defined (SS_WIN32)
-
-	// 'SSCodeCvt' - shorthand name for the codecvt facet we use
-
-	typedef std::codecvt<wchar_t, char, mbstate_t> SSCodeCvt;
-
-	inline PWSTR StdCodeCvt(PWSTR pDstW, int nDst, PCSTR pSrcA, int nSrc,
-		const std::locale& loc=std::locale())
-	{
-		ASSERT(0 != pSrcA);
-		ASSERT(0 != pDstW);
-
-		pDstW[0]					= '\0';	
-
-		if ( nSrc > 0 )
-		{
-			PCSTR pNextSrcA			= pSrcA;
-			PWSTR pNextDstW			= pDstW;
-			const SSCodeCvt& conv	= SS_USE_FACET(loc, SSCodeCvt);
-			SSCodeCvt::state_type st= { 0 };
-			SSCodeCvt::result res	= conv.in(st,
-                                      pSrcA, pSrcA + nSrc, pNextSrcA,
-                                      pDstW, pDstW + nDst, pNextDstW);
-
-			ASSERT(SSCodeCvt::ok == res);
-			ASSERT(SSCodeCvt::error != res);
-			ASSERT(pNextDstW >= pDstW);
-			ASSERT(pNextSrcA >= pSrcA);
-
-			// Null terminate the converted string
-
-			if ( pNextDstW - pDstW > nDst )
-				*(pDstW + nDst) = '\0';
-			else
-				*pNextDstW = '\0';
-		}
-		return pDstW;
-	}
-	inline PWSTR StdCodeCvt(PWSTR pDstW, int nDst, PCUSTR pSrcA, int nSrc,
-		const std::locale& loc=std::locale())
-	{
-		return StdCodeCvt(pDstW, nDst, (PCSTR)pSrcA, nSrc, loc);
-	}
-
-	inline PSTR StdCodeCvt(PSTR pDstA, int nDst, PCWSTR pSrcW, int nSrc,
-		const std::locale& loc=std::locale())
-	{
-		ASSERT(0 != pDstA);
-		ASSERT(0 != pSrcW);
-
-		pDstA[0]					= '\0';	
-
-		if ( nSrc > 0 )
-		{
-			PSTR pNextDstA			= pDstA;
-			PCWSTR pNextSrcW		= pSrcW;
-			const SSCodeCvt& conv	= SS_USE_FACET(loc, SSCodeCvt);
-			SSCodeCvt::state_type st= { 0 };
-			SSCodeCvt::result res	= conv.out(st,
-                                       pSrcW, pSrcW + nSrc, pNextSrcW,
-                                       pDstA, pDstA + nDst, pNextDstA);
-
-			ASSERT(SSCodeCvt::error != res);
-			ASSERT(SSCodeCvt::ok == res);	// strict, comment out for sanity
-			ASSERT(pNextDstA >= pDstA);
-			ASSERT(pNextSrcW >= pSrcW);
-
-			// Null terminate the converted string
-
-			if ( pNextDstA - pDstA > nDst )
-				*(pDstA + nDst) = '\0';
-			else
-				*pNextDstA = '\0';
-		}
-		return pDstA;
-	}
-
-	inline PUSTR StdCodeCvt(PUSTR pDstA, int nDst, PCWSTR pSrcW, int nSrc,
-		const std::locale& loc=std::locale())
-	{
-		return (PUSTR)StdCodeCvt((PSTR)pDstA, nDst, pSrcW, nSrc, loc);
-	}
-
-#endif
-
-
-
-// Unicode/MBCS conversion macros are only available on implementations of
-// the "C" library that have the non-standard _alloca function.  As far as I
-// know that's only Microsoft's though I've heard that the function exists
-// elsewhere.  
-    
-#if defined(SS_ALLOCA) && !defined SS_NO_CONVERSION
-
-    #include <malloc.h>	// needed for _alloca
-
-    // Define our conversion macros to look exactly like Microsoft's to
-    // facilitate using this stuff both with and without MFC/ATL
-
-    #ifdef _CONVERSION_USES_THREAD_LOCALE
-
-	    #ifndef _DEBUG
-		    #define SSCVT int _cvt; _cvt; UINT _acp=GetACP(); \
-			    _acp; PCWSTR _pw; _pw; PCSTR _pa; _pa
-	    #else
-		    #define SSCVT int _cvt = 0; _cvt; UINT _acp=GetACP();\
-			     _acp; PCWSTR _pw=0; _pw; PCSTR _pa=0; _pa
-	    #endif
-	    #define SSA2W(pa) (\
-		    ((_pa = pa) == 0) ? 0 : (\
-			    _cvt = (sslen(_pa)),\
-			    StdCodeCvt((PWSTR) _alloca((_cvt+1)*2), (_cvt+1)*2, \
-							_pa, _cvt, _acp)))
-	    #define SSW2A(pw) (\
-		    ((_pw = pw) == 0) ? 0 : (\
-			    _cvt = sslen(_pw), \
-			    StdCodeCvt((LPSTR) _alloca((_cvt+1)*2), (_cvt+1)*2, \
-					_pw, _cvt, _acp)))
-	#else
-
-	    #ifndef _DEBUG
-		    #define SSCVT int _cvt; _cvt; UINT _acp=CP_ACP; _acp;\
-			     PCWSTR _pw; _pw; PCSTR _pa; _pa
-	    #else
-		    #define SSCVT int _cvt = 0; _cvt; UINT _acp=CP_ACP; \
-			    _acp; PCWSTR _pw=0; _pw; PCSTR _pa=0; _pa
-	    #endif
-	    #define SSA2W(pa) (\
-		    ((_pa = pa) == 0) ? 0 : (\
-			    _cvt = (sslen(_pa)),\
-			    StdCodeCvt((PWSTR) _alloca((_cvt+1)*2), (_cvt+1)*2, \
-					_pa, _cvt)))
-	    #define SSW2A(pw) (\
-		    ((_pw = pw) == 0) ? 0 : (\
-			    _cvt = (sslen(_pw)),\
-			    StdCodeCvt((LPSTR) _alloca((_cvt+1)*2), (_cvt+1)*2, \
-					_pw, _cvt)))
-    #endif
-
-    #define SSA2CW(pa) ((PCWSTR)SSA2W((pa)))
-    #define SSW2CA(pw) ((PCSTR)SSW2A((pw)))
-
-    #ifdef UNICODE
-	    #define SST2A	SSW2A
-	    #define SSA2T	SSA2W
-	    #define SST2CA	SSW2CA
-	    #define SSA2CT	SSA2CW
-		// (Did you get a compiler error here about not being able to convert
-		// PTSTR into PWSTR?  Then your _UNICODE and UNICODE flags are messed 
-		// up.  Best bet: #define BOTH macros before including any MS headers.)
-	    inline PWSTR	SST2W(PTSTR p)			{ return p; }
-	    inline PTSTR	SSW2T(PWSTR p)			{ return p; }
-	    inline PCWSTR	SST2CW(PCTSTR p)		{ return p; }
-	    inline PCTSTR	SSW2CT(PCWSTR p)		{ return p; }
-    #else
-	    #define SST2W	SSA2W
-	    #define SSW2T	SSW2A
-	    #define SST2CW	SSA2CW
-	    #define SSW2CT	SSW2CA
-	    inline PSTR		SST2A(PTSTR p)			{ return p; }
-	    inline PTSTR	SSA2T(PSTR p)			{ return p; }
-	    inline PCSTR	SST2CA(PCTSTR p)		{ return p; }
-	    inline PCTSTR	SSA2CT(PCSTR p)			{ return p; }
-    #endif // #ifdef UNICODE
-
-    #if defined(UNICODE)
-    // in these cases the default (TCHAR) is the same as OLECHAR
-	    inline PCOLESTR	SST2COLE(PCTSTR p)		{ return p; }
-	    inline PCTSTR	SSOLE2CT(PCOLESTR p)	{ return p; }
-	    inline POLESTR	SST2OLE(PTSTR p)		{ return p; }
-	    inline PTSTR	SSOLE2T(POLESTR p)		{ return p; }
-    #elif defined(OLE2ANSI)
-    // in these cases the default (TCHAR) is the same as OLECHAR
-	    inline PCOLESTR	SST2COLE(PCTSTR p)		{ return p; }
-	    inline PCTSTR	SSOLE2CT(PCOLESTR p)	{ return p; }
-	    inline POLESTR	SST2OLE(PTSTR p)		{ return p; }
-	    inline PTSTR	SSOLE2T(POLESTR p)		{ return p; }
-    #else
-	    //CharNextW doesn't work on Win95 so we use this
-	    #define SST2COLE(pa)	SSA2CW((pa))
-	    #define SST2OLE(pa)		SSA2W((pa))
-	    #define SSOLE2CT(po)	SSW2CA((po))
-	    #define SSOLE2T(po)		SSW2A((po))
-    #endif
-
-    #ifdef OLE2ANSI
-	    #define SSW2OLE		SSW2A
-	    #define SSOLE2W		SSA2W
-	    #define SSW2COLE	SSW2CA
-	    #define SSOLE2CW	SSA2CW
-	    inline POLESTR		SSA2OLE(PSTR p)		{ return p; }
-	    inline PSTR			SSOLE2A(POLESTR p)	{ return p; }
-	    inline PCOLESTR		SSA2COLE(PCSTR p)	{ return p; }
-	    inline PCSTR		SSOLE2CA(PCOLESTR p){ return p; }
-    #else
-	    #define SSA2OLE		SSA2W
-	    #define SSOLE2A		SSW2A
-	    #define SSA2COLE	SSA2CW
-	    #define SSOLE2CA	SSW2CA
-	    inline POLESTR		SSW2OLE(PWSTR p)	{ return p; }
-	    inline PWSTR		SSOLE2W(POLESTR p)	{ return p; }
-	    inline PCOLESTR		SSW2COLE(PCWSTR p)	{ return p; }
-	    inline PCWSTR		SSOLE2CW(PCOLESTR p){ return p; }
-    #endif
-
-    // Above we've defined macros that look like MS' but all have
-    // an 'SS' prefix.  Now we need the real macros.  We'll either
-    // get them from the macros above or from MFC/ATL. 
-
-	#if defined (USES_CONVERSION)
-
-		#define _NO_STDCONVERSION	// just to be consistent
-
-	#else
-
-		#ifdef _MFC_VER
-
-			#include <afxconv.h>
-			#define _NO_STDCONVERSION // just to be consistent
-
-		#else
-
-			#define USES_CONVERSION SSCVT
-			#define A2CW			SSA2CW
-			#define W2CA			SSW2CA
-			#define T2A				SST2A
-			#define A2T				SSA2T
-			#define T2W				SST2W
-			#define W2T				SSW2T
-			#define T2CA			SST2CA
-			#define A2CT			SSA2CT
-			#define T2CW			SST2CW
-			#define W2CT			SSW2CT
-			#define ocslen			sslen
-			#define ocscpy			sscpy
-			#define T2COLE			SST2COLE
-			#define OLE2CT			SSOLE2CT
-			#define T2OLE			SST2COLE
-			#define OLE2T			SSOLE2CT
-			#define A2OLE			SSA2OLE
-			#define OLE2A			SSOLE2A
-			#define W2OLE			SSW2OLE
-			#define OLE2W			SSOLE2W
-			#define A2COLE			SSA2COLE
-			#define OLE2CA			SSOLE2CA
-			#define W2COLE			SSW2COLE
-			#define OLE2CW			SSOLE2CW
-	
-		#endif // #ifdef _MFC_VER
-	#endif // #ifndef USES_CONVERSION
-#endif // #ifndef SS_NO_CONVERSION
-
-// Define ostring - generic name for std::basic_string<OLECHAR>
-
-#if !defined(ostring) && !defined(OSTRING_DEFINED)
-	typedef std::basic_string<OLECHAR> ostring;
-	#define OSTRING_DEFINED
-#endif
-
-// StdCodeCvt when there's no conversion to be done
-inline PSTR StdCodeCvt(PSTR pDst, int nDst, PCSTR pSrc, int nSrc)
-{
-	int nChars = SSMIN(nSrc, nDst);
-
-	if ( nChars > 0 )
-	{
-		pDst[0]				= '\0';
-		std::basic_string<char>::traits_type::copy(pDst, pSrc, nChars);
-//		std::char_traits<char>::copy(pDst, pSrc, nChars);
-		pDst[nChars]	= '\0';
-	}
-
-	return pDst;
-}
-inline PSTR StdCodeCvt(PSTR pDst, int nDst, PCUSTR pSrc, int nSrc)
-{
-	return StdCodeCvt(pDst, nDst, (PCSTR)pSrc, nSrc);
-}
-inline PUSTR StdCodeCvt(PUSTR pDst, int nDst, PCSTR pSrc, int nSrc)
-{
-	return (PUSTR)StdCodeCvt((PSTR)pDst, nDst, pSrc, nSrc);
-}
-
-inline PWSTR StdCodeCvt(PWSTR pDst, int nDst, PCWSTR pSrc, int nSrc)
-{
-	int nChars = SSMIN(nSrc, nDst);
-
-	if ( nChars > 0 )
-	{
-		pDst[0]				= '\0';
-		std::basic_string<wchar_t>::traits_type::copy(pDst, pSrc, nChars);
-//		std::char_traits<wchar_t>::copy(pDst, pSrc, nChars);
-		pDst[nChars]	= '\0';
-	}
-
-	return pDst;
-}
-
-
-// Define tstring -- generic name for std::basic_string<TCHAR>
-
-#if !defined(tstring) && !defined(TSTRING_DEFINED)
-	typedef std::basic_string<TCHAR> tstring;
-	#define TSTRING_DEFINED
-#endif
-
-// a very shorthand way of applying the fix for KB problem Q172398
-// (basic_string assignment bug)
-
-#if defined ( _MSC_VER ) && ( _MSC_VER < 1200 )
-	#define Q172398(x) (x).erase()
-#else
-	#define Q172398(x)
-#endif
-
-// =============================================================================
-// INLINE FUNCTIONS ON WHICH CSTDSTRING RELIES
-//
-// Usually for generic text mapping, we rely on preprocessor macro definitions
-// to map to string functions.  However the CStdStr<> template cannot use
-// macro-based generic text mappings because its character types do not get
-// resolved until template processing which comes AFTER macro processing.  In
-// other words, the preprocessor macro UNICODE is of little help to us in the
-// CStdStr template
-//
-// Therefore, to keep the CStdStr declaration simple, we have these inline
-// functions.  The template calls them often.  Since they are inline (and NOT
-// exported when this is built as a DLL), they will probably be resolved away
-// to nothing. 
-//
-// Without these functions, the CStdStr<> template would probably have to broken
-// out into two, almost identical classes.  Either that or it would be a huge,
-// convoluted mess, with tons of "if" statements all over the place checking the
-// size of template parameter CT.
-// =============================================================================
-
-#ifdef SS_NO_LOCALE
-
-	// --------------------------------------------------------------------------
-	// Win32 GetStringTypeEx wrappers
-	// --------------------------------------------------------------------------
-	inline bool wsGetStringType(LCID lc, DWORD dwT, PCSTR pS, int nSize, 
-		WORD* pWd)
-	{
-		return FALSE != GetStringTypeExA(lc, dwT, pS, nSize, pWd);
-	}
-	inline bool wsGetStringType(LCID lc, DWORD dwT, PCWSTR pS, int nSize, 
-		WORD* pWd)
-	{
-		return FALSE != GetStringTypeExW(lc, dwT, pS, nSize, pWd);
-	}
-
-
-	template<typename CT>
-		inline bool ssisspace (CT t)
-	{ 
-		WORD toYourMother;
-		return	wsGetStringType(GetThreadLocale(), CT_CTYPE1, &t, 1, &toYourMother)
-			&& 0 != (C1_BLANK & toYourMother);
-	}
-
-#endif
-
-// If they defined SS_NO_REFCOUNT, then we must convert all assignments
-
-#if defined (_MSC_VER) && (_MSC_VER < 1300)
-	#ifdef SS_NO_REFCOUNT
-		#define SSREF(x) (x).c_str()
-	#else
-		#define SSREF(x) (x)
-	#endif
-#else
-	#define SSREF(x) (x)
-#endif
-
-// -----------------------------------------------------------------------------
-// sslen: strlen/wcslen wrappers
-// -----------------------------------------------------------------------------
-template<typename CT> inline int sslen(const CT* pT)
-{
-	return 0 == pT ? 0 : (int)std::basic_string<CT>::traits_type::length(pT);
-//	return 0 == pT ? 0 : std::char_traits<CT>::length(pT);
-}
-inline SS_NOTHROW int sslen(const std::string& s)
-{
-	return static_cast<int>(s.length());
-}
-inline SS_NOTHROW int sslen(const std::wstring& s)
-{
-	return static_cast<int>(s.length());
-}
-
-// -----------------------------------------------------------------------------
-// sstolower/sstoupper -- convert characters to upper/lower case
-// -----------------------------------------------------------------------------
-
-#ifdef SS_NO_LOCALE
-	inline char sstoupper(char ch)		{ return (char)::toupper(ch); }
-	inline wchar_t sstoupper(wchar_t ch){ return (wchar_t)::towupper(ch); }
-	inline char sstolower(char ch)		{ return (char)::tolower(ch); }
-	inline wchar_t sstolower(wchar_t ch){ return (wchar_t)::tolower(ch); }
-#else
-	template<typename CT>
-	inline CT sstolower(const CT& t, const std::locale& loc = std::locale())
-	{
-		return std::tolower<CT>(t, loc);
-	}
-	template<typename CT>
-	inline CT sstoupper(const CT& t, const std::locale& loc = std::locale())
-	{
-		return std::toupper<CT>(t, loc);
-	}
-#endif
-
-// -----------------------------------------------------------------------------
-// ssasn: assignment functions -- assign "sSrc" to "sDst"
-// -----------------------------------------------------------------------------
-typedef std::string::size_type		SS_SIZETYPE; // just for shorthand, really
-typedef std::string::pointer		SS_PTRTYPE;  
-typedef std::wstring::size_type		SW_SIZETYPE;
-typedef std::wstring::pointer		SW_PTRTYPE;  
-
-inline void	ssasn(std::string& sDst, const std::string& sSrc)
-{
-	if ( sDst.c_str() != sSrc.c_str() )
-	{
-		sDst.erase();
-		sDst.assign(SSREF(sSrc));
-	}
-}
-inline void	ssasn(std::string& sDst, PCSTR pA)
-{
-	// Watch out for NULLs, as always.
-
-	if ( 0 == pA )
-	{
-		sDst.erase();
-	}
-
-	// If pA actually points to part of sDst, we must NOT erase(), but
-	// rather take a substring
-
-	else if ( pA >= sDst.c_str() && pA <= sDst.c_str() + sDst.size() )
-	{
-		sDst =sDst.substr(static_cast<SS_SIZETYPE>(pA-sDst.c_str()));
-	}
-
-	// Otherwise (most cases) apply the assignment bug fix, if applicable
-	// and do the assignment
-
-	else
-	{
-		Q172398(sDst);
-		sDst.assign(pA);
-	}
-}
-inline void	ssasn(std::string& sDst, const std::wstring& sSrc)
-{
-	if ( sSrc.empty() )
-	{
-		sDst.erase();
-	}
-	else
-	{
-		int nDst	= static_cast<int>(sSrc.size());
-
-		// In MBCS builds, pad the buffer to account for the possibility of
-		// some 3 byte characters.  Not perfect but should get most cases.
-
-#ifdef SS_MBCS
-		nDst	= static_cast<int>(static_cast<double>(nDst) * 1.3);
-#endif
-
-		sDst.resize(nDst+1);
-		PCSTR szCvt = StdCodeCvt(const_cast<SS_PTRTYPE>(sDst.data()), nDst,
-			sSrc.c_str(), static_cast<int>(sSrc.size()));
-
-		// In MBCS builds, we don't know how long the destination string will be.
-
-#ifdef SS_MBCS
-		sDst.resize(sslen(szCvt));
-#else
-		szCvt;
-		sDst.resize(sSrc.size());
-#endif
-	}
-}
-inline void	ssasn(std::string& sDst, PCWSTR pW)
-{
-	int nSrc	= sslen(pW);
-	if ( nSrc > 0 )
-	{
-		int nSrc	= sslen(pW);
-		int nDst	= nSrc;
-
-		// In MBCS builds, pad the buffer to account for the possibility of
-		// some 3 byte characters.  Not perfect but should get most cases.
-
-#ifdef SS_MBCS
-		nDst	= static_cast<int>(static_cast<double>(nDst) * 1.3);
-#endif
-
-		sDst.resize(nDst + 1);
-		PCSTR szCvt = StdCodeCvt(const_cast<SS_PTRTYPE>(sDst.data()), nDst,
-			pW, nSrc);
-
-		// In MBCS builds, we don't know how long the destination string will be.
-
-#ifdef SS_MBCS
-		sDst.resize(sslen(szCvt));
-#else
-		sDst.resize(nDst);
-		szCvt;
-#endif
-	}
-	else
-	{
-		sDst.erase();
-	}
-}
-inline void ssasn(std::string& sDst, const int nNull)
-{
-	UNUSED(nNull);
-	ASSERT(nNull==0);
-	sDst.assign("");
-}	
-inline void	ssasn(std::wstring& sDst, const std::wstring& sSrc)
-{
-	if ( sDst.c_str() != sSrc.c_str() )
-	{
-		sDst.erase();
-		sDst.assign(SSREF(sSrc));
-	}
-}
-inline void	ssasn(std::wstring& sDst, PCWSTR pW)
-{
-	// Watch out for NULLs, as always.
-
-	if ( 0 == pW )
-	{
-		sDst.erase();
-	}
-
-	// If pW actually points to part of sDst, we must NOT erase(), but
-	// rather take a substring
-
-	else if ( pW >= sDst.c_str() && pW <= sDst.c_str() + sDst.size() )
-	{
-		sDst = sDst.substr(static_cast<SW_SIZETYPE>(pW-sDst.c_str()));
-	}
-
-	// Otherwise (most cases) apply the assignment bug fix, if applicable
-	// and do the assignment
-
-	else
-	{
-		Q172398(sDst);
-		sDst.assign(pW);
-	}
-}
-#undef StrSizeType
-inline void	ssasn(std::wstring& sDst, const std::string& sSrc)
-{
-	if ( sSrc.empty() )
-	{
-		sDst.erase();
-	}
-	else
-	{
-		int nSrc	= static_cast<int>(sSrc.size());
-		int nDst	= nSrc;
-
-		sDst.resize(nSrc+1);
-		PCWSTR szCvt = StdCodeCvt(const_cast<SW_PTRTYPE>(sDst.data()), nDst,
-			sSrc.c_str(), nSrc);
-
-		sDst.resize(sslen(szCvt));
-	}
-}
-inline void	ssasn(std::wstring& sDst, PCSTR pA)
-{
-	int nSrc	= sslen(pA);
-
-	if ( 0 == nSrc )
-	{
-		sDst.erase();
-	}
-	else
-	{
-		int nDst	= nSrc;
-		sDst.resize(nDst+1);
-		PCWSTR szCvt = StdCodeCvt(const_cast<SW_PTRTYPE>(sDst.data()), nDst, pA,
-			nSrc);
-
-		sDst.resize(sslen(szCvt));
-	}
-}
-inline void ssasn(std::wstring& sDst, const int nNull)
-{
-	UNUSED(nNull);
-	ASSERT(nNull==0);
-	sDst.assign(L"");
-}
-
-
-// -----------------------------------------------------------------------------
-// ssadd: string object concatenation -- add second argument to first
-// -----------------------------------------------------------------------------
-inline void	ssadd(std::string& sDst, const std::wstring& sSrc)
-{
-	int nSrc	= static_cast<int>(sSrc.size());
-
-	if ( nSrc > 0 )
-	{
-		int nDst	= static_cast<int>(sDst.size());
-		int nAdd	= nSrc;
-
-		// In MBCS builds, pad the buffer to account for the possibility of
-		// some 3 byte characters.  Not perfect but should get most cases.
-
-#ifdef SS_MBCS
-		nAdd		= static_cast<int>(static_cast<double>(nAdd) * 1.3);
-#endif
-
-		sDst.resize(nDst+nAdd+1);
-		PCSTR szCvt = StdCodeCvt(const_cast<SS_PTRTYPE>(sDst.data()+nDst),
-			nAdd, sSrc.c_str(), nSrc);
-
-#ifdef SS_MBCS
-		sDst.resize(nDst + sslen(szCvt));
-#else
-		sDst.resize(nDst + nAdd);
-		szCvt;
-#endif
-	}
-}
-inline void	ssadd(std::string& sDst, const std::string& sSrc)
-{
-	sDst += sSrc;
-}
-inline void	ssadd(std::string& sDst, PCWSTR pW)
-{
-	int nSrc		= sslen(pW);
-	if ( nSrc > 0 )
-	{
-		int nDst	= static_cast<int>(sDst.size());
-		int nAdd	= nSrc;
-
-#ifdef SS_MBCS
-		nAdd	= static_cast<int>(static_cast<double>(nAdd) * 1.3);
-#endif
-
-		sDst.resize(nDst + nAdd + 1);
-		PCSTR szCvt = StdCodeCvt(const_cast<SS_PTRTYPE>(sDst.data()+nDst),
-			nAdd, pW, nSrc);
-
-#ifdef SS_MBCS
-		sDst.resize(nDst + sslen(szCvt));
-#else
-		sDst.resize(nDst + nSrc);
-		szCvt;
-#endif
-	}
-}
-inline void	ssadd(std::string& sDst, PCSTR pA)
-{
-	if ( pA )
-	{
-		// If the string being added is our internal string or a part of our
-		// internal string, then we must NOT do any reallocation without
-		// first copying that string to another object (since we're using a
-		// direct pointer)
-
-		if ( pA >= sDst.c_str() && pA <= sDst.c_str()+sDst.length())
-		{
-			if ( sDst.capacity() <= sDst.size()+sslen(pA) )
-				sDst.append(std::string(pA));
-			else
-				sDst.append(pA);
-		}
-		else
-		{
-			sDst.append(pA); 
-		}
-	}
-}
-inline void	ssadd(std::wstring& sDst, const std::wstring& sSrc)
-{
-	sDst += sSrc;
-}
-inline void	ssadd(std::wstring& sDst, const std::string& sSrc)
-{
-	if ( !sSrc.empty() )
-	{
-		int nSrc	= static_cast<int>(sSrc.size());
-		int nDst	= static_cast<int>(sDst.size());
-
-		sDst.resize(nDst + nSrc + 1);
-		PCWSTR szCvt = StdCodeCvt(const_cast<SW_PTRTYPE>(sDst.data()+nDst), 
-			nSrc, sSrc.c_str(), nSrc+1);
-
-#ifdef SS_MBCS
-		sDst.resize(nDst + sslen(szCvt));
-#else
-		sDst.resize(nDst + nSrc);
-		szCvt;
-#endif
-	}
-}
-inline void	ssadd(std::wstring& sDst, PCSTR pA)
-{
-	int nSrc		= sslen(pA);
-
-	if ( nSrc > 0 )
-	{
-		int nDst	= static_cast<int>(sDst.size());
-
-		sDst.resize(nDst + nSrc + 1);
-		PCWSTR szCvt = StdCodeCvt(const_cast<SW_PTRTYPE>(sDst.data()+nDst),
-			nSrc, pA, nSrc+1);
-
-#ifdef SS_MBCS
-		sDst.resize(nDst + sslen(szCvt));
-#else
-		sDst.resize(nDst + nSrc);
-		szCvt;
-#endif
-	}
-}
-inline void	ssadd(std::wstring& sDst, PCWSTR pW)
-{
-	if ( pW )
-	{
-		// If the string being added is our internal string or a part of our
-		// internal string, then we must NOT do any reallocation without
-		// first copying that string to another object (since we're using a
-		// direct pointer)
-
-		if ( pW >= sDst.c_str() && pW <= sDst.c_str()+sDst.length())
-		{
-			if ( sDst.capacity() <= sDst.size()+sslen(pW) )
-				sDst.append(std::wstring(pW));
-			else
-				sDst.append(pW);
-		}
-		else
-		{
-			sDst.append(pW);
-		}
-	}
-}
-
-
-// -----------------------------------------------------------------------------
-// sscmp: comparison (case sensitive, not affected by locale)
-// -----------------------------------------------------------------------------
-template<typename CT>
-inline int sscmp(const CT* pA1, const CT* pA2)
-{
-    CT f;
-    CT l;
-
-    do 
-    {
-	    f = *(pA1++);
-	    l = *(pA2++);
-    } while ( (f) && (f == l) );
-
-    return (int)(f - l);
-}
-
-// -----------------------------------------------------------------------------
-// ssicmp: comparison (case INsensitive, not affected by locale)
-// -----------------------------------------------------------------------------
-template<typename CT>
-inline int ssicmp(const CT* pA1, const CT* pA2)
-{
-	// Using the "C" locale = "not affected by locale"
-
-	std::locale loc = std::locale::classic();
-    const std::ctype<CT>& ct = SS_USE_FACET(loc, std::ctype<CT>);
-    CT f;
-    CT l;
-
-    do 
-    {
-	    f = ct.tolower(*(pA1++));
-	    l = ct.tolower(*(pA2++));
-    } while ( (f) && (f == l) );
-
-    return (int)(f - l);
-}
-
-// -----------------------------------------------------------------------------
-// ssupr/sslwr: Uppercase/Lowercase conversion functions
-// -----------------------------------------------------------------------------
-
-template<typename CT>
-inline void sslwr(CT* pT, size_t nLen, const std::locale& loc=std::locale())
-{
-	SS_USE_FACET(loc, std::ctype<CT>).tolower(pT, pT+nLen);
-}
-template<typename CT>
-inline void ssupr(CT* pT, size_t nLen, const std::locale& loc=std::locale())
-{
-	SS_USE_FACET(loc, std::ctype<CT>).toupper(pT, pT+nLen);
-}
-
-// -----------------------------------------------------------------------------
-// vsprintf/vswprintf or _vsnprintf/_vsnwprintf equivalents.  In standard
-// builds we can't use _vsnprintf/_vsnwsprintf because they're MS extensions.
-//
-// -----------------------------------------------------------------------------
-// Borland's headers put some ANSI "C" functions in the 'std' namespace. 
-// Promote them to the global namespace so we can use them here.
-
-#if defined(__BORLANDC__)
-    using std::vsprintf;
-    using std::vswprintf;
-#endif
-
-	// GNU is supposed to have vsnprintf and vsnwprintf.  But only the newer
-	// distributions do.
-
-#if defined(__GNUC__)
-
-	inline int ssvsprintf(PSTR pA, size_t nCount, PCSTR pFmtA, va_list vl)
-	{ 
-		return vsnprintf(pA, nCount, pFmtA, vl);
-	}
-	inline int ssvsprintf(PWSTR pW, size_t nCount, PCWSTR pFmtW, va_list vl)
-	{
-		return vswprintf(pW, nCount, pFmtW, vl);
-	}
-
-	// Else if this is VC++ in a regular (non-ANSI) build
-#elif defined(_MSC_VER) && !defined(SS_ANSI)
-
-	inline int	ssvsprintf(PSTR pA, size_t nCount, PCSTR pFmtA, va_list vl)
-	{ 
-		return _vsnprintf(pA, nCount, pFmtA, vl);
-	}
-	inline int	ssvsprintf(PWSTR pW, size_t nCount, PCWSTR pFmtW, va_list vl)
-	{
-		return _vsnwprintf(pW, nCount, pFmtW, vl);
-	}
-
-	// Else (an ANSI build) if they want to allow "dangerous" (i.e. non-length-
-	// checked) formatting
-#elif defined (SS_DANGEROUS_FORMAT)  // ignore buffer size parameter if needed?
-
-	inline int ssvsprintf(PSTR pA, size_t /*nCount*/, PCSTR pFmtA, va_list vl)
-	{
-		return vsprintf(pA, pFmtA, vl);
-	}
-
-	inline int ssvsprintf(PWSTR pW, size_t nCount, PCWSTR pFmtW, va_list vl)
-	{
-		// JMO: Some distributions of the "C" have a version of vswprintf that
-        // takes 3 arguments (e.g. Microsoft, Borland, GNU).  Others have a 
-        // version which takes 4 arguments (an extra "count" argument in the
-        // second position.  The best stab I can take at this so far is that if
-        // you are NOT running with MS, Borland, or GNU, then I'll assume you
-        // have the version that takes 4 arguments.
-        //
-        // I'm sure that these checks don't catch every platform correctly so if
-        // you get compiler errors on one of the lines immediately below, it's
-        // probably because your implemntation takes a different number of
-        // arguments.  You can comment out the offending line (and use the
-        // alternate version) or you can figure out what compiler flag to check
-        // and add that preprocessor check in.  Regardless, if you get an error
-        // on these lines, I'd sure like to hear from you about it.
-        //
-        // Thanks to Ronny Schulz for the SGI-specific checks here.
-
-//	#if !defined(__MWERKS__) && !defined(__SUNPRO_CC_COMPAT) && !defined(__SUNPRO_CC)
-    #if    !defined(_MSC_VER) \
-        && !defined (__BORLANDC__) \
-        && !defined(__GNUC__) \
-        && !defined(__sgi)
-
-        return vswprintf(pW, nCount, pFmtW, vl);
-
-    // suddenly with the current SGI 7.3 compiler there is no such function as
-    // vswprintf and the substitute needs explicit casts to compile
-
-    #elif defined(__sgi)
-
-        nCount;
-        return vsprintf( (char *)pW, (char *)pFmtW, vl);
-
-    #else
-
-        nCount;
-        return vswprintf(pW, pFmtW, vl);
-
-    #endif
-
-	}
-
-	// OK, it's some kind of ANSI build but no "dangerous" formatting allowed
-#else 
-
-	// GOT COMPILER PROBLEMS HERE?
-	// ---------------------------
-	// Does your compiler choke on one or more of the following 2 functions?  It
-	// probably means that you don't have have either vsnprintf or vsnwprintf in
-	// your version of the CRT.  This is understandable since neither is an ANSI
-	// "C" function.  However it still leaves you in a dilemma.  In order to make
-	// this code build, you're going to have to to use some non-length-checked
-	// formatting functions that every CRT has:  vsprintf and vswprintf.  
-	//
-	// This is very dangerous.  With the proper erroneous (or malicious) code, it
-	// can lead to buffer overlows and crashing your PC.  Use at your own risk
-	// In order to use them, just #define SS_DANGEROUS_FORMAT at the top of
-	// this file.
-	//
-	// Even THEN you might not be all the way home due to some non-conforming
-	// distributions.  More on this in the comments below.
-
-	inline int	ssvsprintf(PSTR pA, size_t nCount, PCSTR pFmtA, va_list vl)
-	{
-	#ifdef _MSC_VER
-			return _vsnprintf(pA, nCount, pFmtA, vl);
-	#else
-			return vsnprintf(pA, nCount, pFmtA, vl);
-	#endif
-	}
-	inline int	ssvsprintf(PWSTR pW, size_t nCount, PCWSTR pFmtW, va_list vl)
-	{
-	#ifdef _MSC_VER
-			return _vsnwprintf(pW, nCount, pFmtW, vl);
-	#else
-			return vsnwprintf(pW, nCount, pFmtW, vl);
-	#endif
-	}
-
-#endif
-
-
-
-
-// -----------------------------------------------------------------------------
-// ssload: Type safe, overloaded ::LoadString wrappers
-// There is no equivalent of these in non-Win32-specific builds.  However, I'm
-// thinking that with the message facet, there might eventually be one
-// -----------------------------------------------------------------------------
-#if defined (SS_WIN32) && !defined(SS_ANSI)
-	inline int ssload(HMODULE hInst, UINT uId, PSTR pBuf, int nMax)
-	{
-		return ::LoadStringA(hInst, uId, pBuf, nMax);
-	}
-	inline int ssload(HMODULE hInst, UINT uId, PWSTR pBuf, int nMax)
-	{
-		return ::LoadStringW(hInst, uId, pBuf, nMax);
-	}
-#endif
-
-
-// -----------------------------------------------------------------------------
-// sscoll/ssicoll: Collation wrappers
-//		Note -- with MSVC I have reversed the arguments order here because the
-//		functions appear to return the opposite of what they should
-// -----------------------------------------------------------------------------
-#ifndef SS_NO_LOCALE
-template <typename CT>
-inline int sscoll(const CT* sz1, int nLen1, const CT* sz2, int nLen2)
-{
-	const std::collate<CT>& coll =
-		SS_USE_FACET(std::locale(), std::collate<CT>);
-
-	return coll.compare(sz2, sz2+nLen2, sz1, sz1+nLen1);
-}
-template <typename CT>
-inline int ssicoll(const CT* sz1, int nLen1, const CT* sz2, int nLen2)
-{
-	const std::locale loc;
-	const std::collate<CT>& coll = SS_USE_FACET(loc, std::collate<CT>);
-
-	// Some implementations seem to have trouble using the collate<>
-	// facet typedefs so we'll just default to basic_string and hope
-	// that's what the collate facet uses (which it generally should)
-
-//	std::collate<CT>::string_type s1(sz1);
-//	std::collate<CT>::string_type s2(sz2);
-	const std::basic_string<CT> sEmpty;
-    std::basic_string<CT> s1(sz1 ? sz1 : sEmpty.c_str());
-    std::basic_string<CT> s2(sz2 ? sz2 : sEmpty.c_str());
-
-	sslwr(const_cast<CT*>(s1.c_str()), nLen1, loc);
-	sslwr(const_cast<CT*>(s2.c_str()), nLen2, loc);
-	return coll.compare(s2.c_str(), s2.c_str()+nLen2,
-						s1.c_str(), s1.c_str()+nLen1);
-}
-#endif
-
-
-// -----------------------------------------------------------------------------
-// ssfmtmsg: FormatMessage equivalents.  Needed because I added a CString facade
-// Again -- no equivalent of these on non-Win32 builds but their might one day
-// be one if the message facet gets implemented
-// -----------------------------------------------------------------------------
-#if defined (SS_WIN32) && !defined(SS_ANSI)
-	inline DWORD ssfmtmsg(DWORD dwFlags, LPCVOID pSrc, DWORD dwMsgId,
-						  DWORD dwLangId, PSTR pBuf, DWORD nSize,
-						  va_list* vlArgs)
-	{ 
-		return FormatMessageA(dwFlags, pSrc, dwMsgId, dwLangId,
-							  pBuf, nSize,vlArgs);
-	}
-	inline DWORD ssfmtmsg(DWORD dwFlags, LPCVOID pSrc, DWORD dwMsgId,
-						  DWORD dwLangId, PWSTR pBuf, DWORD nSize,
-						  va_list* vlArgs)
-	{
-		return FormatMessageW(dwFlags, pSrc, dwMsgId, dwLangId,
-							  pBuf, nSize,vlArgs);
-	}
-#else
-#endif
- 
-
-
-// FUNCTION: sscpy.  Copies up to 'nMax' characters from pSrc to pDst.
-// -----------------------------------------------------------------------------
-// FUNCTION:  sscpy
-//		inline int sscpy(PSTR pDst, PCSTR pSrc, int nMax=-1);
-//		inline int sscpy(PUSTR pDst,  PCSTR pSrc, int nMax=-1)
-//		inline int sscpy(PSTR pDst, PCWSTR pSrc, int nMax=-1);
-//		inline int sscpy(PWSTR pDst, PCWSTR pSrc, int nMax=-1);
-//		inline int sscpy(PWSTR pDst, PCSTR pSrc, int nMax=-1);
-//
-// DESCRIPTION:
-//		This function is very much (but not exactly) like strcpy.  These
-//		overloads simplify copying one C-style string into another by allowing
-//		the caller to specify two different types of strings if necessary.
-//
-//		The strings must NOT overlap
-//
-//		"Character" is expressed in terms of the destination string, not
-//		the source.  If no 'nMax' argument is supplied, then the number of
-//		characters copied will be sslen(pSrc).  A NULL terminator will
-//		also be added so pDst must actually be big enough to hold nMax+1
-//		characters.  The return value is the number of characters copied,
-//		not including the NULL terminator.
-//
-// PARAMETERS: 
-//		pSrc - the string to be copied FROM.  May be a char based string, an
-//			   MBCS string (in Win32 builds) or a wide string (wchar_t).
-//		pSrc - the string to be copied TO.  Also may be either MBCS or wide
-//		nMax - the maximum number of characters to be copied into szDest.  Note
-//			   that this is expressed in whatever a "character" means to pDst.
-//			   If pDst is a wchar_t type string than this will be the maximum
-//			   number of wchar_ts that my be copied.  The pDst string must be
-//			   large enough to hold least nMaxChars+1 characters.
-//			   If the caller supplies no argument for nMax this is a signal to
-//			   the routine to copy all the characters in pSrc, regardless of
-//			   how long it is.
-//
-// RETURN VALUE: none
-// -----------------------------------------------------------------------------
-template<typename CT1, typename CT2>
-inline int sscpycvt(CT1* pDst, const CT2* pSrc, int nMax)
-{
-	// Note -- we assume pDst is big enough to hold pSrc.  If not, we're in
-	// big trouble.  No bounds checking.  Caveat emptor.
-	
-	int nSrc = sslen(pSrc);
-
-	const CT1* szCvt = StdCodeCvt(pDst, nMax, pSrc, nSrc);
-
-	// If we're copying the same size characters, then all the "code convert"
-	// just did was basically memcpy so the #of characters copied is the same
-	// as the number requested.  I should probably specialize this function
-	// template to achieve this purpose as it is silly to do a runtime check
-	// of a fact known at compile time.  I'll get around to it.
-
-	return sslen(szCvt);
-}
-
-inline int sscpycvt(PSTR pDst, PCSTR pSrc, int nMax)
-{
-	int nCount = nMax;
-	for (; nCount > 0 && *pSrc; ++pSrc, ++pDst, --nCount)
-		std::basic_string<char>::traits_type::assign(*pDst, *pSrc);
-
-	*pDst =  '\0';
-	return nMax - nCount;
-}
-inline int sscpycvt(PWSTR pDst, PCWSTR pSrc, int nMax)
-{
-	int nCount = nMax;
-	for (; nCount > 0 && *pSrc; ++pSrc, ++pDst, --nCount)
-		std::basic_string<wchar_t>::traits_type::assign(*pDst, *pSrc);
-
-	*pDst = L'\0';
-	return nMax - nCount;
-}
-inline int sscpycvt(PWSTR pDst, PCSTR pSrc, int nMax)
-{
-	// Note -- we assume pDst is big enough to hold pSrc.  If not, we're in
-	// big trouble.  No bounds checking.  Caveat emptor.
-
-	const PWSTR szCvt = StdCodeCvt(pDst, nMax, pSrc, nMax);
-	return sslen(szCvt);
-}
-
-template<typename CT1, typename CT2>
-inline int sscpy(CT1* pDst, const CT2* pSrc, int nMax, int nLen)
-{
-	return sscpycvt(pDst, pSrc, SSMIN(nMax, nLen));
-}
-template<typename CT1, typename CT2>
-inline int sscpy(CT1* pDst, const CT2* pSrc, int nMax)
-{
-	return sscpycvt(pDst, pSrc, SSMIN(nMax, sslen(pSrc)));
-}
-template<typename CT1, typename CT2>
-inline int sscpy(CT1* pDst, const CT2* pSrc)
-{
-	return sscpycvt(pDst, pSrc, sslen(pSrc));
-}
-template<typename CT1, typename CT2>
-inline int sscpy(CT1* pDst, const std::basic_string<CT2>& sSrc, int nMax)
-{
-	return sscpycvt(pDst, sSrc.c_str(), SSMIN(nMax, (int)sSrc.length()));
-}
-template<typename CT1, typename CT2>
-inline int sscpy(CT1* pDst, const std::basic_string<CT2>& sSrc)
-{
-	return sscpycvt(pDst, sSrc.c_str(), (int)sSrc.length());
-}
-
-#ifdef SS_INC_COMDEF
-	template<typename CT1>
-	inline int sscpy(CT1* pDst, const _bstr_t& bs, int nMax)
-	{
-		return sscpycvt(pDst, static_cast<PCOLESTR>(bs),
-            SSMIN(nMax, static_cast<int>(bs.length())));
-	}
-	template<typename CT1>
-	inline int sscpy(CT1* pDst, const _bstr_t& bs)
-	{
-		return sscpy(pDst, bs, static_cast<int>(bs.length()));
-	}
-#endif
-
-
-// -----------------------------------------------------------------------------
-// Functional objects for changing case.  They also let you pass locales
-// -----------------------------------------------------------------------------
-
-#ifdef SS_NO_LOCALE
-	template<typename CT>
-	struct SSToUpper : public std::unary_function<CT, CT>
-	{
-		inline CT operator()(const CT& t) const
-		{
-			return sstoupper(t);
-		}
-	};
-	template<typename CT>
-	struct SSToLower : public std::unary_function<CT, CT>
-	{
-		inline CT operator()(const CT& t) const
-		{
-			return sstolower(t);
-		}
-	};
-#else
-	template<typename CT>
-	struct SSToUpper : public std::binary_function<CT, std::locale, CT>
-	{
-		inline CT operator()(const CT& t, const std::locale& loc) const
-		{
-			return sstoupper<CT>(t, loc);
-		}
-	};
-	template<typename CT>
-	struct SSToLower : public std::binary_function<CT, std::locale, CT>
-	{
-		inline CT operator()(const CT& t, const std::locale& loc) const
-		{
-			return sstolower<CT>(t, loc);
-		}
-	};
-#endif
-
-// This struct is used for TrimRight() and TrimLeft() function implementations.
-//template<typename CT>
-//struct NotSpace : public std::unary_function<CT, bool>
-//{
-//	const std::locale& loc;
-//	inline NotSpace(const std::locale& locArg) : loc(locArg) {}
-//	inline bool operator() (CT t) { return !std::isspace(t, loc); }
-//};
-template<typename CT>
-struct NotSpace : public std::unary_function<CT, bool>
-{
-	// DINKUMWARE BUG:
-	// Note -- using std::isspace in a COM DLL gives us access violations
-	// because it causes the dynamic addition of a function to be called
-	// when the library shuts down.  Unfortunately the list is maintained
-	// in DLL memory but the function is in static memory.  So the COM DLL
-	// goes away along with the function that was supposed to be called,
-	// and then later when the DLL CRT shuts down it unloads the list and
-	// tries to call the long-gone function.
-	// This is DinkumWare's implementation problem.  If you encounter this
-	// problem, you may replace the calls here with good old isspace() and
-	// iswspace() from the CRT unless they specify SS_ANSI
-    
-#ifdef SS_NO_LOCALE
-	
-	bool operator() (CT t) const { return !ssisspace(t); }
-
-#else
-	const std::locale loc;
-	NotSpace(const std::locale& locArg=std::locale()) : loc(locArg) {}
-	bool operator() (CT t) const { return !std::isspace(t, loc); }
-#endif
-};
-
-
-
-
-//			Now we can define the template (finally!)
-// =============================================================================
-// TEMPLATE: CStdStr
-//		template<typename CT> class CStdStr : public std::basic_string<CT>
-//
-// REMARKS:
-//		This template derives from basic_string<CT> and adds some MFC CString-
-//		like functionality
-//
-//		Basically, this is my attempt to make Standard C++ library strings as
-//		easy to use as the MFC CString class.
-//
-//		Note that although this is a template, it makes the assumption that the
-//		template argument (CT, the character type) is either char or wchar_t.  
-// =============================================================================
-
-//#define CStdStr _SS	// avoid compiler warning 4786
-
-//    template<typename ARG> ARG& FmtArg(ARG& arg)  { return arg; }
-//    PCSTR  FmtArg(const std::string& arg)  { return arg.c_str(); }
-//    PCWSTR FmtArg(const std::wstring& arg) { return arg.c_str(); }
-
-template<typename ARG>
-struct FmtArg
-{
-    explicit FmtArg(const ARG& arg) : a_(arg) {}
-    const ARG& operator()() const { return a_; }
-    const ARG& a_;
-private:
-    FmtArg& operator=(const FmtArg&) { return *this; }
-};
-
-template<typename CT>
-class CStdStr : public std::basic_string<CT>
-{
-	// Typedefs for shorter names.  Using these names also appears to help
-	// us avoid some ambiguities that otherwise arise on some platforms
-
-	#define MYBASE std::basic_string<CT>				 // my base class
-	//typedef typename std::basic_string<CT>		MYBASE;	 // my base class
-	typedef CStdStr<CT>							MYTYPE;	 // myself
-	typedef typename MYBASE::const_pointer		PCMYSTR; // PCSTR or PCWSTR 
-	typedef typename MYBASE::pointer			PMYSTR;	 // PSTR or PWSTR
-	typedef typename MYBASE::iterator			MYITER;  // my iterator type
-	typedef typename MYBASE::const_iterator		MYCITER; // you get the idea...
-	typedef typename MYBASE::reverse_iterator	MYRITER;
-	typedef typename MYBASE::size_type			MYSIZE;   
-	typedef typename MYBASE::value_type			MYVAL; 
-	typedef typename MYBASE::allocator_type		MYALLOC;
-	
-public:
-	// shorthand conversion from PCTSTR to string resource ID
-	#define SSRES(pctstr)  LOWORD(reinterpret_cast<unsigned long>(pctstr))	
-
-	bool TryLoad(const void* pT)
-	{
-		bool bLoaded = false;
-
-#if defined(SS_WIN32) && !defined(SS_ANSI)
-		if ( ( pT != NULL ) && SS_IS_INTRESOURCE(pT) )
-		{
-			UINT nId = LOWORD(reinterpret_cast<unsigned long>(pT));
-			if ( !LoadString(nId) )
-			{
-				TRACE(_T("Can't load string %u\n"), SSRES(pT));
-			}
-			bLoaded = true;
-		}
-#endif
-
-		return bLoaded;
-	}
-
-
-	// CStdStr inline constructors
-	CStdStr()
-	{
-	}
-
-	CStdStr(const MYTYPE& str) : MYBASE(SSREF(str))
-	{
-	}
-
-	CStdStr(const std::string& str)
-	{
-		ssasn(*this, SSREF(str));
-	}
-
-	CStdStr(const std::wstring& str)
-	{
-		ssasn(*this, SSREF(str));
-	}
-
-	CStdStr(PCMYSTR pT, MYSIZE n) : MYBASE(NULL == pT ? MYTYPE().c_str() : pT, n)
-	{
-	}
-
-#ifdef SS_UNSIGNED
-	CStdStr(PCUSTR pU)
-	{
-		*this = reinterpret_cast<PCSTR>(pU);
-	}
-#endif
-
-	CStdStr(PCSTR pA)
-	{
-	#ifdef SS_ANSI
-		*this = pA;
-	#else
-		if ( !TryLoad(pA) )
-			*this = pA;
-	#endif
-	}
-
-	CStdStr(PCWSTR pW)
-	{
-	#ifdef SS_ANSI
-		*this = pW;
-	#else
-		if ( !TryLoad(pW) )
-			*this = pW;
-	#endif
-	}
-
-	CStdStr(MYCITER first, MYCITER last)
-		: MYBASE(first, last)
-	{
-	}
-
-	CStdStr(MYSIZE nSize, MYVAL ch, const MYALLOC& al=MYALLOC())
-		: MYBASE(nSize, ch, al)
-	{
-	}
-
-	#ifdef SS_INC_COMDEF
-		CStdStr(const _bstr_t& bstr)
-		{
-			if ( bstr.length() > 0 )
-				this->append(static_cast<PCMYSTR>(bstr), bstr.length());
-		}
-	#endif
-
-	// CStdStr inline assignment operators -- the ssasn function now takes care
-	// of fixing  the MSVC assignment bug (see knowledge base article Q172398).
-	MYTYPE& operator=(const MYTYPE& str)
-	{ 
-		ssasn(*this, str); 
-		return *this;
-	}
-
-	MYTYPE& operator=(const std::string& str)
-	{
-		ssasn(*this, str);
-		return *this;
-	}
-
-	MYTYPE& operator=(const std::wstring& str)
-	{
-		ssasn(*this, str);
-		return *this;
-	}
-
-	MYTYPE& operator=(PCSTR pA)
-	{
-		ssasn(*this, pA);
-		return *this;
-	}
-
-	MYTYPE& operator=(PCWSTR pW)
-	{
-		ssasn(*this, pW);
-		return *this;
-	}
-
-#ifdef SS_UNSIGNED
-	MYTYPE& operator=(PCUSTR pU)
-	{
-		ssasn(*this, reinterpret_cast<PCSTR>(pU));
-		return *this;
-	}
-#endif
-
-	MYTYPE& operator=(CT t)
-	{
-		Q172398(*this);
-		this->assign(1, t);
-		return *this;
-	}
-
-	#ifdef SS_INC_COMDEF
-		MYTYPE& operator=(const _bstr_t& bstr)
-		{
-			if ( bstr.length() > 0 )
-			{
-				this->assign(static_cast<PCMYSTR>(bstr), bstr.length());
-				return *this;
-			}
-			else
-			{
-				this->erase();
-				return *this;
-			}
-		}
-	#endif
-
-
-	// Overloads  also needed to fix the MSVC assignment bug (KB: Q172398)
-	//  *** Thanks to Pete The Plumber for catching this one ***
-	// They also are compiled if you have explicitly turned off refcounting
-	#if ( defined(_MSC_VER) && ( _MSC_VER < 1200 ) ) || defined(SS_NO_REFCOUNT) 
-
-		MYTYPE& assign(const MYTYPE& str)
-		{
-			Q172398(*this);
-			sscpy(GetBuffer(str.size()+1), SSREF(str));
-			this->ReleaseBuffer(str.size());
-			return *this;
-		}
-
-		MYTYPE& assign(const MYTYPE& str, MYSIZE nStart, MYSIZE nChars)
-		{
-			// This overload of basic_string::assign is supposed to assign up to
-			// <nChars> or the NULL terminator, whichever comes first.  Since we
-			// are about to call a less forgiving overload (in which <nChars>
-			// must be a valid length), we must adjust the length here to a safe
-			// value.  Thanks to Ullrich Pollähne for catching this bug
-
-			nChars		= SSMIN(nChars, str.length() - nStart);
-			MYTYPE strTemp(str.c_str()+nStart, nChars);
-			Q172398(*this);
-			this->assign(strTemp);
-			return *this;
-		}
-
-		MYTYPE& assign(const MYBASE& str)
-		{
-			ssasn(*this, str);
-			return *this;
-		}
-
-		MYTYPE& assign(const MYBASE& str, MYSIZE nStart, MYSIZE nChars)
-		{
-			// This overload of basic_string::assign is supposed to assign up to
-			// <nChars> or the NULL terminator, whichever comes first.  Since we
-			// are about to call a less forgiving overload (in which <nChars>
-			// must be a valid length), we must adjust the length here to a safe
-			// value. Thanks to Ullrich Pollähne for catching this bug
-
-			nChars		= SSMIN(nChars, str.length() - nStart);
-
-			// Watch out for assignment to self
-
-			if ( this == &str )
-			{
-				MYTYPE strTemp(str.c_str() + nStart, nChars);
-				static_cast<MYBASE*>(this)->assign(strTemp);
-			}
-			else
-			{
-				Q172398(*this);
-				static_cast<MYBASE*>(this)->assign(str.c_str()+nStart, nChars);
-			}
-			return *this;
-		}
-
-		MYTYPE& assign(const CT* pC, MYSIZE nChars)
-		{
-			// Q172398 only fix -- erase before assigning, but not if we're
-			// assigning from our own buffer
-
-	#if defined ( _MSC_VER ) && ( _MSC_VER < 1200 )
-			if ( !this->empty() &&
-				( pC < this->data() || pC > this->data() + this->capacity() ) )
-			{
-				this->erase();
-			}
-	#endif
-			Q172398(*this);
-			static_cast<MYBASE*>(this)->assign(pC, nChars);
-			return *this;
-		}
-
-		MYTYPE& assign(MYSIZE nChars, MYVAL val)
-		{
-			Q172398(*this);
-			static_cast<MYBASE*>(this)->assign(nChars, val);
-			return *this;
-		}
-
-		MYTYPE& assign(const CT* pT)
-		{
-			return this->assign(pT, MYBASE::traits_type::length(pT));
-		}
-
-		MYTYPE& assign(MYCITER iterFirst, MYCITER iterLast)
-		{
-	#if defined ( _MSC_VER ) && ( _MSC_VER < 1200 ) 
-			// Q172398 fix.  don't call erase() if we're assigning from ourself
-			if ( iterFirst < this->begin() ||
-                 iterFirst > this->begin() + this->size() )
-            {
-				this->erase()
-            }
-	#endif
-			this->replace(this->begin(), this->end(), iterFirst, iterLast);
-			return *this;
-		}
-	#endif
-
-
-	// -------------------------------------------------------------------------
-	// CStdStr inline concatenation.
-	// -------------------------------------------------------------------------
-	MYTYPE& operator+=(const MYTYPE& str)
-	{
-		ssadd(*this, str);
-		return *this;
-	}
-
-	MYTYPE& operator+=(const std::string& str)
-	{
-		ssadd(*this, str);
-		return *this; 
-	}
-
-	MYTYPE& operator+=(const std::wstring& str)
-	{
-		ssadd(*this, str);
-		return *this;
-	}
-
-	MYTYPE& operator+=(PCSTR pA)
-	{
-		ssadd(*this, pA);
-		return *this;
-	}
-
-	MYTYPE& operator+=(PCWSTR pW)
-	{
-		ssadd(*this, pW);
-		return *this;
-	}
-
-	MYTYPE& operator+=(CT t)
-	{
-		this->append(1, t);
-		return *this;
-	}
-	#ifdef SS_INC_COMDEF	// if we have _bstr_t, define a += for it too.
-		MYTYPE& operator+=(const _bstr_t& bstr)
-		{
-			return this->operator+=(static_cast<PCMYSTR>(bstr));
-		}
-	#endif
-
-
-	// -------------------------------------------------------------------------
-	// Case changing functions
-	// -------------------------------------------------------------------------
-
-    MYTYPE& ToUpper(const std::locale& loc=std::locale())
-	{
-		// Note -- if there are any MBCS character sets in which the lowercase
-		// form a character takes up a different number of bytes than the
-		// uppercase form, this would probably not work...
-
-		std::transform(this->begin(),
-					   this->end(),
-					   this->begin(),
-#ifdef SS_NO_LOCALE
-					   SSToUpper<CT>());
-#else
-					   std::bind2nd(SSToUpper<CT>(), loc));
-#endif
-
-		// ...but if it were, this would probably work better.  Also, this way
-		// seems to be a bit faster when anything other then the "C" locale is
-		// used...
-
-//		if ( !empty() )
-//		{
-//			ssupr(this->GetBuf(), this->size(), loc);
-//			this->RelBuf();
-//		}
-
-		return *this;
-	}
-
-	MYTYPE& ToLower(const std::locale& loc=std::locale())
-	{
-		// Note -- if there are any MBCS character sets in which the lowercase
-		// form a character takes up a different number of bytes than the
-		// uppercase form, this would probably not work...
-
-		std::transform(this->begin(),
-					   this->end(),
-					   this->begin(),
-#ifdef SS_NO_LOCALE
-					   SSToLower<CT>());
-#else
-					   std::bind2nd(SSToLower<CT>(), loc));
-#endif
-
-		// ...but if it were, this would probably work better.  Also, this way
-		// seems to be a bit faster when anything other then the "C" locale is
-		// used...
-
-//		if ( !empty() )
-//		{
-//			sslwr(this->GetBuf(), this->size(), loc);
-//			this->RelBuf();
-//		}
-		return *this;
-	}
-
-
-	MYTYPE& Normalize()
-	{
-		return Trim().ToLower();
-	}
-
-
-	// -------------------------------------------------------------------------
-	// CStdStr -- Direct access to character buffer.  In the MS' implementation,
-	// the at() function that we use here also calls _Freeze() providing us some
-	// protection from multithreading problems associated with ref-counting.
-    // In VC 7 and later, of course, the ref-counting stuff is gone.
-	// -------------------------------------------------------------------------
-
-	CT* GetBuf(int nMinLen=-1)
-	{
-		if ( static_cast<int>(this->size()) < nMinLen )
-			this->resize(static_cast<MYSIZE>(nMinLen));
-
-		return this->empty() ? const_cast<CT*>(this->data()) : &(this->at(0));
-	}
-
-	CT* SetBuf(int nLen)
-	{
-		nLen = ( nLen > 0 ? nLen : 0 );
-		if ( this->capacity() < 1 && nLen == 0 )
-			this->resize(1);
-
-		this->resize(static_cast<MYSIZE>(nLen));
-		return const_cast<CT*>(this->data());
-	}
-	void RelBuf(int nNewLen=-1)
-	{
-		this->resize(static_cast<MYSIZE>(nNewLen > -1 ? nNewLen :
-                                                        sslen(this->c_str())));
-	}
-
-	void BufferRel()		 { RelBuf(); }			// backwards compatability
-	CT*  Buffer()			 { return GetBuf(); }	// backwards compatability
-	CT*  BufferSet(int nLen) { return SetBuf(nLen);}// backwards compatability
-
-	bool Equals(const CT* pT, bool bUseCase=false) const
-	{
-		return  0 == (bUseCase ? this->compare(pT) : ssicmp(this->c_str(), pT));
-	} 
-
-	// -------------------------------------------------------------------------
-	// FUNCTION:  CStdStr::Load
-	// REMARKS:
-	//		Loads string from resource specified by nID
-	//
-	// PARAMETERS:
-	//		nID - resource Identifier.  Purely a Win32 thing in this case
-	//
-	// RETURN VALUE:
-	//		true if successful, false otherwise
-	// -------------------------------------------------------------------------
-
-#ifndef SS_ANSI
-
-	bool Load(UINT nId, HMODULE hModule=NULL)
-	{
-		bool bLoaded		= false;	// set to true of we succeed.
-
-	#ifdef _MFC_VER		// When in Rome (or MFC land)...
-
-		// If they gave a resource handle, use it.  Note - this is archaic
-		// and not really what I would recommend.  But then again, in MFC
-		// land, you ought to be using CString for resources anyway since
-		// it walks the resource chain for you.
-
-		HMODULE hModuleOld = NULL;
-
-		if ( NULL != hModule )
-		{
-			hModuleOld = AfxGetResourceHandle();
-			AfxSetResourceHandle(hModule);
-		}
-
-		// ...load the string
-
-		CString strRes;
-		bLoaded				= FALSE != strRes.LoadString(nId);
-
-		// ...and if we set the resource handle, restore it.
-
-		if ( NULL != hModuleOld )
-			AfxSetResourceHandle(hModule);
-
-		if ( bLoaded )
-			*this			= strRes;
-
-	#else // otherwise make our own hackneyed version of CString's Load
-		
-		// Get the resource name and module handle
-
-		if ( NULL == hModule )
-			hModule			= GetResourceHandle();
-
-		PCTSTR szName		= MAKEINTRESOURCE((nId>>4)+1); // lifted 
-		DWORD dwSize		= 0;
-
-		// No sense continuing if we can't find the resource
-
-		HRSRC hrsrc			= ::FindResource(hModule, szName, RT_STRING);
-
-		if ( NULL == hrsrc )
-		{
-			TRACE(_T("Cannot find resource %d: 0x%X"), nId, ::GetLastError());
-		}
-		else if ( 0 == (dwSize = ::SizeofResource(hModule, hrsrc) / sizeof(CT)))
-		{
-			TRACE(_T("Cant get size of resource %d 0x%X\n"),nId,GetLastError());
-		}
-		else
-		{
-			bLoaded			= 0 != ssload(hModule, nId, GetBuf(dwSize), dwSize);
-			ReleaseBuffer();
-		}
-
-	#endif  // #ifdef _MFC_VER
-
-		if ( !bLoaded )
-			TRACE(_T("String not loaded 0x%X\n"), ::GetLastError());
-
-		return bLoaded;
-	}
-
-#endif  // #ifdef SS_ANSI
-	
-	// -------------------------------------------------------------------------
-	// FUNCTION:  CStdStr::Format
-	//		void _cdecl Formst(CStdStringA& PCSTR szFormat, ...)
-	//		void _cdecl Format(PCSTR szFormat);
-	//           
-	// DESCRIPTION:
-	//		This function does sprintf/wsprintf style formatting on CStdStringA
-	//		objects.  It looks a lot like MFC's CString::Format.  Some people
-	//		might even call this identical.  Fortunately, these people are now
-	//		dead... heh heh.
-	//
-	// PARAMETERS: 
-	//		nId - ID of string resource holding the format string
-	//		szFormat - a PCSTR holding the format specifiers
-	//		argList - a va_list holding the arguments for the format specifiers.
-	//
-	// RETURN VALUE:  None.
-	// -------------------------------------------------------------------------
-	// formatting (using wsprintf style formatting)
-
-    // If they want a Format() function that safely handles string objects
-    // without casting
- 
-#ifdef SS_SAFE_FORMAT       
-    
-    // Question:  Joe, you wacky coder you, why do you have so many overloads
-    //      of the Format() function
-    // Answer:  One reason only - CString compatability.  In short, by making
-    //      the Format() function a template this way, I can do strong typing
-    //      and allow people to pass CStdString arguments as fillers for
-    //      "%s" format specifiers without crashing their program!  The downside
-    //      is that I need to overload on the number of arguments.   If you are
-    //      passing more arguments than I have listed below in any of my
-    //      overloads, just add another one.
-    //
-    //      Yes, yes, this is really ugly.  In essence what I am doing here is
-    //      protecting people from a bad (and incorrect) programming practice
-    //      that they should not be doing anyway.  I am protecting them from
-    //      themselves.  Why am I doing this?  Well, if you had any idea the
-    //      number of times I've been emailed by people about this
-    //      "incompatability" in my code, you wouldn't ask.
-
-	void Fmt(const CT* szFmt, ...)
-	{
-		va_list argList;
-		va_start(argList, szFmt);
-		FormatV(szFmt, argList);
-		va_end(argList);
-	}
-
-#ifndef SS_ANSI
-
-    void Format(UINT nId)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) ) 
-            this->swap(strFmt);
-    }
-    template<class A1>
-    void Format(UINT nId, const A1& v)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-            Fmt(strFmt, FmtArg<A1>(v)());
-    }
-    template<class A1, class A2>
-    void Format(UINT nId, const A1& v1, const A2& v2)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-           Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)());
-    }
-    template<class A1, class A2, class A3>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(),FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(),FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)(), FmtArg<A7>(v7)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-           Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-                FmtArg<A9>(v9)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-                FmtArg<A9>(v9)(), FmtArg<A10>(v10)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-                FmtArg<A9>(v9)(),FmtArg<A10>(v10)(),FmtArg<A11>(v11)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-                FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-                FmtArg<A12>(v12)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12,
-        class A13>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12, const A13& v13)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-                FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-                FmtArg<A12>(v12)(), FmtArg<A13>(v13)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12,
-        class A13, class A14>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12, const A13& v13, const A14& v14)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-                FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-                FmtArg<A12>(v12)(), FmtArg<A13>(v13)(),FmtArg<A14>(v14)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12,
-        class A13, class A14, class A15>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12, const A13& v13, const A14& v14, const A15& v15)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-                FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-                FmtArg<A12>(v12)(),FmtArg<A13>(v13)(),FmtArg<A14>(v14)(),
-                FmtArg<A15>(v15)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12,
-        class A13, class A14, class A15, class A16>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12, const A13& v13, const A14& v14, const A15& v15,
-                const A16& v16)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-                FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-                FmtArg<A12>(v12)(),FmtArg<A13>(v13)(),FmtArg<A14>(v14)(),
-                FmtArg<A15>(v15)(), FmtArg<A16>(v16)());
-        }
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12,
-        class A13, class A14, class A15, class A16, class A17>
-    void Format(UINT nId, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12, const A13& v13, const A14& v14, const A15& v15,
-                const A16& v16, const A17& v17)
-    {
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-        {
-            Fmt(strFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-                FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-                FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-                FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-                FmtArg<A12>(v12)(),FmtArg<A13>(v13)(),FmtArg<A14>(v14)(),
-                FmtArg<A15>(v15)(),FmtArg<A16>(v16)(),FmtArg<A17>(v17)());
-        }
-    }
-    
-#endif // #ifndef SS_ANSI
-
-    // ...now the other overload of Format: the one that takes a string literal
-
-    void Format(const CT* szFmt)
-    {
-        *this = szFmt;
-    }
-    template<class A1>
-    void Format(const CT* szFmt, const A1& v)
-    {
-        Fmt(szFmt, FmtArg<A1>(v)());
-    }
-    template<class A1, class A2>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)());
-    }
-    template<class A1, class A2, class A3>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)());
-    }
-    template<class A1, class A2, class A3, class A4>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)(), FmtArg<A7>(v7)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-            FmtArg<A9>(v9)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-            FmtArg<A9>(v9)(), FmtArg<A10>(v10)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-            FmtArg<A9>(v9)(),FmtArg<A10>(v10)(),FmtArg<A11>(v11)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-            FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-            FmtArg<A12>(v12)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12,
-        class A13>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12, const A13& v13)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-            FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-            FmtArg<A12>(v12)(), FmtArg<A13>(v13)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12,
-        class A13, class A14>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12, const A13& v13, const A14& v14)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-            FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-            FmtArg<A12>(v12)(), FmtArg<A13>(v13)(),FmtArg<A14>(v14)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12,
-        class A13, class A14, class A15>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12, const A13& v13, const A14& v14, const A15& v15)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-            FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-            FmtArg<A12>(v12)(),FmtArg<A13>(v13)(),FmtArg<A14>(v14)(),
-            FmtArg<A15>(v15)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12,
-        class A13, class A14, class A15, class A16>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12, const A13& v13, const A14& v14, const A15& v15,
-                const A16& v16)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-            FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-            FmtArg<A12>(v12)(),FmtArg<A13>(v13)(),FmtArg<A14>(v14)(),
-            FmtArg<A15>(v15)(), FmtArg<A16>(v16)());
-    }
-    template<class A1, class A2, class A3, class A4, class A5, class A6,
-        class A7, class A8, class A9, class A10, class A11, class A12,
-        class A13, class A14, class A15, class A16, class A17>
-    void Format(const CT* szFmt, const A1& v1, const A2& v2, const A3& v3,
-                const A4& v4, const A5& v5, const A6& v6, const A7& v7,
-                const A8& v8, const A9& v9, const A10& v10, const A11& v11,
-                const A12& v12, const A13& v13, const A14& v14, const A15& v15,
-                const A16& v16, const A17& v17)
-    {
-        Fmt(szFmt, FmtArg<A1>(v1)(), FmtArg<A2>(v2)(),
-            FmtArg<A3>(v3)(), FmtArg<A4>(v4)(), FmtArg<A5>(v5)(),
-            FmtArg<A6>(v6)(), FmtArg<A7>(v7)(), FmtArg<A8>(v8)(),
-            FmtArg<A9>(v9)(), FmtArg<A10>(v10)(),FmtArg<A11>(v11)(),
-            FmtArg<A12>(v12)(),FmtArg<A13>(v13)(),FmtArg<A14>(v14)(),
-            FmtArg<A15>(v15)(),FmtArg<A16>(v16)(),FmtArg<A17>(v17)());
-    }
-
-#else  // #ifdef SS_SAFE_FORMAT
-
-
-#ifndef SS_ANSI
-
-	void Format(UINT nId, ...)
-	{
-		va_list argList;
-		va_start(argList, nId);
-
-		MYTYPE strFmt;
-		if ( strFmt.Load(nId) )
-			FormatV(strFmt, argList);
-
-		va_end(argList);
-	}
-    
-#endif  // #ifdef SS_ANSI
-
-	void Format(const CT* szFmt, ...)
-	{
-		va_list argList;
-		va_start(argList, szFmt);
-		FormatV(szFmt, argList);
-		va_end(argList);
-	}
-
-#endif // #ifdef SS_SAFE_FORMAT
-
-	void AppendFormat(const CT* szFmt, ...)
-	{
-		va_list argList;
-		va_start(argList, szFmt);
-		AppendFormatV(szFmt, argList);
-		va_end(argList);
-	}
-
-	#define MAX_FMT_TRIES		5	 // #of times we try 
-	#define FMT_BLOCK_SIZE		2048 // # of bytes to increment per try
-	#define BUFSIZE_1ST	256
-	#define BUFSIZE_2ND 512
-	#define STD_BUF_SIZE		1024
-
-	// an efficient way to add formatted characters to the string.  You may only
-	// add up to STD_BUF_SIZE characters at a time, though
-	void AppendFormatV(const CT* szFmt, va_list argList)
-	{
-		CT szBuf[STD_BUF_SIZE];
-		int nLen = ssvsprintf(szBuf, STD_BUF_SIZE-1, szFmt, argList);
-
-		if ( 0 < nLen )
-			this->append(szBuf, nLen);
-	}
-
-	// -------------------------------------------------------------------------
-	// FUNCTION:  FormatV
-	//		void FormatV(PCSTR szFormat, va_list, argList);
-	//           
-	// DESCRIPTION:
-	//		This function formats the string with sprintf style format-specs. 
-	//		It makes a general guess at required buffer size and then tries
-	//		successively larger buffers until it finds one big enough or a
-	//		threshold (MAX_FMT_TRIES) is exceeded.
-	//
-	// PARAMETERS: 
-	//		szFormat - a PCSTR holding the format of the output
-	//		argList - a Microsoft specific va_list for variable argument lists
-	//
-	// RETURN VALUE: 
-	// -------------------------------------------------------------------------
-
-	void FormatV(const CT* szFormat, va_list argList)
-	{
-	#ifdef SS_ANSI
-		MYTYPE str;
-		int nLen	= sslen(szFormat) + STD_BUF_SIZE;
-		ssvsprintf(str.GetBuffer(nLen), nLen-1, szFormat, argList);
-		str.ReleaseBuffer();
-		*this = str;
-
-	#else
-
-		CT* pBuf			= NULL;
-		int nChars			= 1;
-		int nUsed			= 0;
-		size_type nActual	= 0;
-		int nTry			= 0;
-
-		do	
-		{
-			// Grow more than linearly (e.g. 512, 1536, 3072, etc)
-
-			nChars			+= ((nTry+1) * FMT_BLOCK_SIZE);
-			pBuf			= reinterpret_cast<CT*>(_alloca(sizeof(CT)*nChars));
-			nUsed			= ssvsprintf(pBuf, nChars-1, szFormat, argList);
-
-			// Ensure proper NULL termination.
-
-			nActual			= nUsed == -1 ? nChars-1 : SSMIN(nUsed, nChars-1);
-			pBuf[nActual]= '\0';
-
-
-		} while ( nUsed < 0 && nTry++ < MAX_FMT_TRIES );
-
-		// assign whatever we managed to format
-
-		this->assign(pBuf, nActual);
-
-	#endif
-	}
-
-	// -------------------------------------------------------------------------
-	// CString Facade Functions:
-	//
-	// The following methods are intended to allow you to use this class as a
-	// near drop-in replacement for CString.
-	// -------------------------------------------------------------------------
-	#ifdef SS_WIN32
-		BSTR AllocSysString() const
-		{
-			ostring os;
-			ssasn(os, *this);
-			return ::SysAllocString(os.c_str());
-		}
-	#endif
-
-#ifndef SS_NO_LOCALE
-	int Collate(PCMYSTR szThat) const
-	{
-		return sscoll(this->c_str(), this->length(), szThat, sslen(szThat));
-	}
-
-	int CollateNoCase(PCMYSTR szThat) const
-	{
-		return ssicoll(this->c_str(), this->length(), szThat, sslen(szThat));
-	}
-#endif
-	int Compare(PCMYSTR szThat) const
-	{
-		return this->compare(szThat);	
-	}
-
-	int CompareNoCase(PCMYSTR szThat)	const
-	{
-		return ssicmp(this->c_str(), szThat);
-	}
-
-	int Delete(int nIdx, int nCount=1)
-	{
-        if ( nIdx < 0 )
-			nIdx = 0;
-
-		if ( nIdx < this->GetLength() )
-			this->erase(static_cast<MYSIZE>(nIdx), static_cast<MYSIZE>(nCount));
-
-		return GetLength();
-	}
-
-	void Empty()
-	{
-		this->erase();
-	}
-
-	int Find(CT ch) const
-	{
-		MYSIZE nIdx	= this->find_first_of(ch);
-		return static_cast<int>(MYBASE::npos == nIdx  ? -1 : nIdx);
-	}
-
-	int Find(PCMYSTR szSub) const
-	{
-		MYSIZE nIdx	= this->find(szSub);
-		return static_cast<int>(MYBASE::npos == nIdx ? -1 : nIdx);
-	}
-
-	int Find(CT ch, int nStart) const
-	{
-		// CString::Find docs say add 1 to nStart when it's not zero
-		// CString::Find code doesn't do that however.  We'll stick
-		// with what the code does
-
-		MYSIZE nIdx	= this->find_first_of(ch, static_cast<MYSIZE>(nStart));
-		return static_cast<int>(MYBASE::npos == nIdx ? -1 : nIdx);
-	}
-
-	int Find(PCMYSTR szSub, int nStart) const
-	{
-		// CString::Find docs say add 1 to nStart when it's not zero
-		// CString::Find code doesn't do that however.  We'll stick
-		// with what the code does
-
-		MYSIZE nIdx	= this->find(szSub, static_cast<MYSIZE>(nStart));
-		return static_cast<int>(MYBASE::npos == nIdx ? -1 : nIdx);
-	}
-
-	int FindOneOf(PCMYSTR szCharSet) const
-	{
-		MYSIZE nIdx = this->find_first_of(szCharSet);
-		return static_cast<int>(MYBASE::npos == nIdx ? -1 : nIdx);
-	}
-
-#ifndef SS_ANSI
-	void FormatMessage(PCMYSTR szFormat, ...) throw(std::exception)
-	{
-		va_list argList;
-		va_start(argList, szFormat);
-		PMYSTR szTemp;
-		if ( ssfmtmsg(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ALLOCATE_BUFFER,
-					   szFormat, 0, 0,
-					   reinterpret_cast<PMYSTR>(&szTemp), 0, &argList) == 0 ||
-			 szTemp == 0 )
-		{
-			throw std::runtime_error("out of memory");
-		}
-		*this = szTemp;
-		LocalFree(szTemp);
-		va_end(argList);
-	}
-
-	void FormatMessage(UINT nFormatId, ...) throw(std::exception)
-	{
-		MYTYPE sFormat;
-		VERIFY(sFormat.LoadString(nFormatId));
-		va_list argList;
-		va_start(argList, nFormatId);
-		PMYSTR szTemp;
-		if ( ssfmtmsg(FORMAT_MESSAGE_FROM_STRING|FORMAT_MESSAGE_ALLOCATE_BUFFER,
-					   sFormat, 0, 0,
-					   reinterpret_cast<PMYSTR>(&szTemp), 0, &argList) == 0 ||
-			szTemp == 0)
-		{
-			throw std::runtime_error("out of memory");
-		}
-		*this = szTemp;
-		LocalFree(szTemp);
-		va_end(argList);
-	}
-#endif
-
-	// GetAllocLength -- an MSVC7 function but it costs us nothing to add it.
-
-	int GetAllocLength()
-	{
-		return static_cast<int>(this->capacity());
-	}
-
-	// -------------------------------------------------------------------------
-	// GetXXXX -- Direct access to character buffer
-	// -------------------------------------------------------------------------
-	CT GetAt(int nIdx) const
-	{
-		return this->at(static_cast<MYSIZE>(nIdx));
-	}
-
-	CT* GetBuffer(int nMinLen=-1)
-	{
-		return GetBuf(nMinLen);
-	}
-
-	CT* GetBufferSetLength(int nLen)
-	{
-		return BufferSet(nLen);
-	}
-
-	// GetLength() -- MFC docs say this is the # of BYTES but
-	// in truth it is the number of CHARACTERs (chars or wchar_ts)
-
-	int GetLength() const
-	{
-		return static_cast<int>(this->length());
-	}
-	
-    // GetString function added in Visual Studio 2008, if I recall correctly.
-
-    PCMYSTR GetString() const
-    {
-        return this->c_str();
-    }
-
-	int Insert(int nIdx, CT ch)
-	{
-		if ( static_cast<MYSIZE>(nIdx) > this->size()-1 )
-			this->append(1, ch);
-		else
-			this->insert(static_cast<MYSIZE>(nIdx), 1, ch);
-
-		return GetLength();
-	}
-	int Insert(int nIdx, PCMYSTR sz)
-	{
-		if ( static_cast<MYSIZE>(nIdx) >= this->size() )
-			this->append(sz, static_cast<MYSIZE>(sslen(sz)));
-		else
-			this->insert(static_cast<MYSIZE>(nIdx), sz);
-
-		return GetLength();
-	}
-
-	bool IsEmpty() const
-	{
-		return this->empty();
-	}
-
-	MYTYPE Left(int nCount) const
-	{
-        // Range check the count.
-
-		nCount = SSMAX(0, SSMIN(nCount, static_cast<int>(this->size())));
-		return this->substr(0, static_cast<MYSIZE>(nCount)); 
-	}
-
-#ifndef SS_ANSI
-	bool LoadString(UINT nId)
-	{
-		return this->Load(nId);
-	}
-#endif
-
-	void MakeLower()
-	{
-		ToLower();
-	}
-
-	void MakeReverse()
-	{
-		std::reverse(this->begin(), this->end());
-	}
-
-	void MakeUpper()
-	{ 
-		ToUpper();
-	}
-
-	MYTYPE Mid(int nFirst) const
-	{
-		return Mid(nFirst, this->GetLength()-nFirst);
-	}
-
-	MYTYPE Mid(int nFirst, int nCount) const
-	{
-		// CString does range checking here.  Since we're trying to emulate it,
-		// we must check too.
-
-		if ( nFirst < 0 )
-			nFirst = 0;
-		if ( nCount < 0 )
-			nCount = 0;
-
-		int nSize = static_cast<int>(this->size());
-
-		if ( nFirst + nCount > nSize )
-			nCount = nSize - nFirst;
-
-		if ( nFirst > nSize )
-			return MYTYPE();
-
-		ASSERT(nFirst >= 0);
-		ASSERT(nFirst + nCount <= nSize);
-
-		return this->substr(static_cast<MYSIZE>(nFirst),
-							static_cast<MYSIZE>(nCount));
-	}
-
-	void ReleaseBuffer(int nNewLen=-1)
-	{
-		RelBuf(nNewLen);
-	}
-
-	int Remove(CT ch)
-	{
-		MYSIZE nIdx		= 0;
-		int nRemoved	= 0;
-		while ( (nIdx=this->find_first_of(ch)) != MYBASE::npos )
-		{
-			this->erase(nIdx, 1);
-			nRemoved++;
-		}
-		return nRemoved;
-	}
-
-	int Replace(CT chOld, CT chNew)
-	{
-		int nReplaced	= 0;
-
-		for ( MYITER iter=this->begin(); iter != this->end(); ++iter )
-		{
-			if ( *iter == chOld )
-			{
-				*iter = chNew;
-				nReplaced++;
-			}
-		}
-
-		return nReplaced;
-	}
-
-	int Replace(PCMYSTR szOld, PCMYSTR szNew)
-	{
-		int nReplaced		= 0;
-		MYSIZE nIdx			= 0;
-		MYSIZE nOldLen		= sslen(szOld);
-
-		if ( 0 != nOldLen )
-		{
-			// If the replacement string is longer than the one it replaces, this
-			// string is going to have to grow in size,  Figure out how much
-			// and grow it all the way now, rather than incrementally
-
-			MYSIZE nNewLen		= sslen(szNew);
-			if ( nNewLen > nOldLen )
-			{
-				int nFound			= 0;
-				while ( nIdx < this->length() &&
-					(nIdx=this->find(szOld, nIdx)) != MYBASE::npos )
-				{
-					nFound++;
-					nIdx += nOldLen;
-				}
-				this->reserve(this->size() + nFound * (nNewLen - nOldLen));
-			}
-
-
-			static const CT ch	= CT(0);
-			PCMYSTR szRealNew	= szNew == 0 ? &ch : szNew;
-			nIdx				= 0;
-
-			while ( nIdx < this->length() && 
-				(nIdx=this->find(szOld, nIdx)) != MYBASE::npos )
-			{
-				this->replace(this->begin()+nIdx, this->begin()+nIdx+nOldLen,
-					szRealNew);
-
-				nReplaced++;
-				nIdx += nNewLen;
-			}
-		}
-
-		return nReplaced;
-	}
-
-	int ReverseFind(CT ch) const
-	{
-		MYSIZE nIdx	= this->find_last_of(ch);
-		return static_cast<int>(MYBASE::npos == nIdx ? -1 : nIdx);
-	}
-
-	// ReverseFind overload that's not in CString but might be useful
-	int ReverseFind(PCMYSTR szFind, MYSIZE pos=MYBASE::npos) const
-	{
-		MYSIZE nIdx	= this->rfind(0 == szFind ? MYTYPE() : szFind, pos);
-		return static_cast<int>(MYBASE::npos == nIdx ? -1 : nIdx);
-	}
-
-	MYTYPE Right(int nCount) const
-	{
-        // Range check the count.
-
-		nCount = SSMAX(0, SSMIN(nCount, static_cast<int>(this->size())));
-		return this->substr(this->size()-static_cast<MYSIZE>(nCount));
-	}
-
-	void SetAt(int nIndex, CT ch)
-	{
-		ASSERT(this->size() > static_cast<MYSIZE>(nIndex));
-		this->at(static_cast<MYSIZE>(nIndex))		= ch;
-	}
-
-#ifndef SS_ANSI
-	BSTR SetSysString(BSTR* pbstr) const
-	{
-		ostring os;
-		ssasn(os, *this);
-		if ( !::SysReAllocStringLen(pbstr, os.c_str(), os.length()) )
-			throw std::runtime_error("out of memory");
-
-		ASSERT(*pbstr != 0);
-		return *pbstr;
-	}
-#endif
-
-	MYTYPE SpanExcluding(PCMYSTR szCharSet) const
-	{
-        MYSIZE pos = this->find_first_of(szCharSet);
-        return pos == MYBASE::npos ? *this : Left(pos);
-	}
-
-	MYTYPE SpanIncluding(PCMYSTR szCharSet) const
-	{
-        MYSIZE pos = this->find_first_not_of(szCharSet);
-        return pos == MYBASE::npos ? *this : Left(pos);
-	}
-
-#if defined SS_WIN32 && !defined(UNICODE) && !defined(SS_ANSI)
-
-	// CString's OemToAnsi and AnsiToOem functions are available only in
-	// Unicode builds.  However since we're a template we also need a
-	// runtime check of CT and a reinterpret_cast to account for the fact
-	// that CStdStringW gets instantiated even in non-Unicode builds.
-
-	void AnsiToOem()
-	{
-		if ( sizeof(CT) == sizeof(char) && !empty() )
-		{
-			::CharToOem(reinterpret_cast<PCSTR>(this->c_str()),
-						reinterpret_cast<PSTR>(GetBuf()));
-		}
-		else
-		{
-			ASSERT(false);
-		}
-	}
-
-	void OemToAnsi()
-	{
-		if ( sizeof(CT) == sizeof(char) && !empty() )
-		{
-			::OemToChar(reinterpret_cast<PCSTR>(this->c_str()),
-						reinterpret_cast<PSTR>(GetBuf()));
-		}
-		else
-		{
-			ASSERT(false);
-		}
-	}
-
-#endif
-	
-
-	// -------------------------------------------------------------------------
-	// Trim and its variants
-	// -------------------------------------------------------------------------
-	MYTYPE& Trim()
-	{
-		return TrimLeft().TrimRight();
-	}
-
-	MYTYPE& TrimLeft()
-	{
-		this->erase(this->begin(),
-			std::find_if(this->begin(), this->end(), NotSpace<CT>()));
-
-		return *this;
-	}
-
-	MYTYPE&  TrimLeft(CT tTrim)
-	{
-		this->erase(0, this->find_first_not_of(tTrim));
-		return *this;
-	}
-
-	MYTYPE&  TrimLeft(PCMYSTR szTrimChars)
-	{
-		this->erase(0, this->find_first_not_of(szTrimChars));
-		return *this;
-	}
-
-	MYTYPE& TrimRight()
-	{
-		// NOTE:  When comparing reverse_iterators here (MYRITER), I avoid using
-		// operator!=.  This is because namespace rel_ops also has a template
-		// operator!= which conflicts with the global operator!= already defined
-		// for reverse_iterator in the header <utility>.
-		// Thanks to John James for alerting me to this.
-
-		MYRITER it = std::find_if(this->rbegin(), this->rend(), NotSpace<CT>());
-		if ( !(this->rend() == it) )
-			this->erase(this->rend() - it);
-
-		this->erase(!(it == this->rend()) ? this->find_last_of(*it) + 1 : 0);
-		return *this;
-	}
-
-	MYTYPE&  TrimRight(CT tTrim)
-	{
-		MYSIZE nIdx	= this->find_last_not_of(tTrim);
-		this->erase(MYBASE::npos == nIdx ? 0 : ++nIdx);
-		return *this;
-	}
-
-	MYTYPE&  TrimRight(PCMYSTR szTrimChars)
-	{
-		MYSIZE nIdx	= this->find_last_not_of(szTrimChars);
-		this->erase(MYBASE::npos == nIdx ? 0 : ++nIdx);
-		return *this;
-	}
-
-	void			FreeExtra()
-	{
-		MYTYPE mt;
-		this->swap(mt);
-		if ( !mt.empty() )
-			this->assign(mt.c_str(), mt.size());
-	}
-
-	// I have intentionally not implemented the following CString
-	// functions.   You cannot make them work without taking advantage
-	// of implementation specific behavior.  However if you absolutely
-	// MUST have them, uncomment out these lines for "sort-of-like"
-	// their behavior.  You're on your own.
-
-//	CT*				LockBuffer()	{ return GetBuf(); }// won't really lock
-//	void			UnlockBuffer(); { }	// why have UnlockBuffer w/o LockBuffer?
-
-	// Array-indexing operators.  Required because we defined an implicit cast
-	// to operator const CT* (Thanks to Julian Selman for pointing this out)
-
-	CT& operator[](int nIdx)
-	{
-		return static_cast<MYBASE*>(this)->operator[](static_cast<MYSIZE>(nIdx));
-	}
-
-	const CT& operator[](int nIdx) const
-	{
-		return static_cast<const MYBASE*>(this)->operator[](static_cast<MYSIZE>(nIdx));
-	}
-
-	CT& operator[](unsigned int nIdx)
-	{
-		return static_cast<MYBASE*>(this)->operator[](static_cast<MYSIZE>(nIdx));
-	}
-
-	const CT& operator[](unsigned int nIdx) const
-	{
-		return static_cast<const MYBASE*>(this)->operator[](static_cast<MYSIZE>(nIdx));
-	}
-
-#ifndef SS_NO_IMPLICIT_CAST
-	operator const CT*() const
-	{
-		return this->c_str();
-	}
-#endif
-
-	// IStream related functions.  Useful in IPersistStream implementations
-
-#ifdef SS_INC_COMDEF
-
-	// struct SSSHDR - useful for non Std C++ persistence schemes.
-	typedef struct SSSHDR
-	{
-		BYTE	byCtrl;
-		ULONG	nChars;
-	} SSSHDR;	// as in "Standard String Stream Header"
-
-	#define SSSO_UNICODE	0x01	// the string is a wide string
-	#define SSSO_COMPRESS	0x02	// the string is compressed
-
-	// -------------------------------------------------------------------------
-	// FUNCTION: StreamSize
-	// REMARKS:
-	//		Returns how many bytes it will take to StreamSave() this CStdString
-	//		object to an IStream.
-	// -------------------------------------------------------------------------
-	ULONG StreamSize() const
-	{
-		// Control header plus string
-		ASSERT(this->size()*sizeof(CT) < 0xffffffffUL - sizeof(SSSHDR));
-		return (this->size() * sizeof(CT)) + sizeof(SSSHDR);
-	}
-
-	// -------------------------------------------------------------------------
-	// FUNCTION: StreamSave
-	// REMARKS:
-	//		Saves this CStdString object to a COM IStream.
-	// -------------------------------------------------------------------------
-	HRESULT StreamSave(IStream* pStream) const
-	{
-		ASSERT(this->size()*sizeof(CT) < 0xffffffffUL - sizeof(SSSHDR));
-		HRESULT hr		= E_FAIL;
-		ASSERT(pStream != 0);
-		SSSHDR hdr;
-		hdr.byCtrl		= sizeof(CT) == 2 ? SSSO_UNICODE : 0;
-		hdr.nChars		= this->size();
-
-
-		if ( FAILED(hr=pStream->Write(&hdr, sizeof(SSSHDR), 0)) )
-		{
-			TRACE(_T("StreamSave: Cannot write control header, ERR=0x%X\n"),hr);
-		}
-		else if ( empty() )
-		{
-			;		// nothing to write
-		}
-		else if ( FAILED(hr=pStream->Write(this->c_str(),
-			this->size()*sizeof(CT), 0)) )
-		{
-			TRACE(_T("StreamSave: Cannot write string to stream 0x%X\n"), hr);
-		}
-
-		return hr;
-	}
-
-
-	// -------------------------------------------------------------------------
-	// FUNCTION: StreamLoad
-	// REMARKS:
-	//		This method loads the object from an IStream.
-	// -------------------------------------------------------------------------
-	HRESULT StreamLoad(IStream* pStream)
-	{
-		ASSERT(pStream != 0);
-		SSSHDR hdr;
-		HRESULT hr			= E_FAIL;
-
-		if ( FAILED(hr=pStream->Read(&hdr, sizeof(SSSHDR), 0)) )
-		{
-			TRACE(_T("StreamLoad: Cant read control header, ERR=0x%X\n"), hr);
-		}
-		else if ( hdr.nChars > 0 )
-		{
-			ULONG nRead		= 0;
-			PMYSTR pMyBuf	= BufferSet(hdr.nChars);
-
-			// If our character size matches the character size of the string
-			// we're trying to read, then we can read it directly into our
-			// buffer. Otherwise, we have to read into an intermediate buffer
-			// and convert.
-			
-			if ( (hdr.byCtrl & SSSO_UNICODE) != 0 )
-			{
-				ULONG nBytes	= hdr.nChars * sizeof(wchar_t);
-				if ( sizeof(CT) == sizeof(wchar_t) )
-				{
-					if ( FAILED(hr=pStream->Read(pMyBuf, nBytes, &nRead)) )
-						TRACE(_T("StreamLoad: Cannot read string: 0x%X\n"), hr);
-				}
-				else
-				{	
-					PWSTR pBufW = reinterpret_cast<PWSTR>(_alloca((nBytes)+1));
-					if ( FAILED(hr=pStream->Read(pBufW, nBytes, &nRead)) )
-						TRACE(_T("StreamLoad: Cannot read string: 0x%X\n"), hr);
-					else
-						sscpy(pMyBuf, pBufW, hdr.nChars);
-				}
-			}
-			else
-			{
-				ULONG nBytes	= hdr.nChars * sizeof(char);
-				if ( sizeof(CT) == sizeof(char) )
-				{
-					if ( FAILED(hr=pStream->Read(pMyBuf, nBytes, &nRead)) )
-						TRACE(_T("StreamLoad: Cannot read string: 0x%X\n"), hr);
-				}
-				else
-				{
-					PSTR pBufA = reinterpret_cast<PSTR>(_alloca(nBytes));
-					if ( FAILED(hr=pStream->Read(pBufA, hdr.nChars, &nRead)) )
-						TRACE(_T("StreamLoad: Cannot read string: 0x%X\n"), hr);
-					else
-						sscpy(pMyBuf, pBufA, hdr.nChars);
-				}
-			}
-		}
-		else
-		{
-			this->erase();
-		}
-		return hr;
-	}
-#endif // #ifdef SS_INC_COMDEF
-
-#ifndef SS_ANSI
-
-	// SetResourceHandle/GetResourceHandle.  In MFC builds, these map directly
-	// to AfxSetResourceHandle and AfxGetResourceHandle.  In non-MFC builds they
-	// point to a single static HINST so that those who call the member
-	// functions that take resource IDs can provide an alternate HINST of a DLL
-	// to search.  This is not exactly the list of HMODULES that MFC provides
-	// but it's better than nothing.
-
-	#ifdef _MFC_VER
-		static void SetResourceHandle(HMODULE hNew)
-		{
-			AfxSetResourceHandle(hNew);
-		}
-		static HMODULE GetResourceHandle()
-		{
-			return AfxGetResourceHandle();
-		}
-	#else
-		static void SetResourceHandle(HMODULE hNew)
-		{
-			SSResourceHandle() = hNew;
-		}
-		static HMODULE GetResourceHandle()
-		{
-			return SSResourceHandle();
-		}
-	#endif
-
-#endif
-};
-
-// -----------------------------------------------------------------------------
-// MSVC USERS: HOW TO EXPORT CSTDSTRING FROM A DLL
-//
-// If you are using MS Visual C++ and you want to export CStdStringA and
-// CStdStringW from a DLL, then all you need to
-//
-//		1.	make sure that all components link to the same DLL version
-//			of the CRT (not the static one).
-//		2.	Uncomment the 3 lines of code below
-//		3.	#define 2 macros per the instructions in MS KnowledgeBase
-//			article Q168958.  The macros are:
-//
-//		MACRO		DEFINTION WHEN EXPORTING		DEFINITION WHEN IMPORTING
-//		-----		------------------------		-------------------------
-//		SSDLLEXP	(nothing, just #define it)		extern
-//		SSDLLSPEC	__declspec(dllexport)			__declspec(dllimport)
-//
-//		Note that these macros must be available to ALL clients who want to 
-//		link to the DLL and use the class.  If they 
-//
-// A word of advice: Don't bother.
-//
-// Really, it is not necessary to export CStdString functions from a DLL.  I
-// never do.  In my projects, I do generally link to the DLL version of the
-// Standard C++ Library, but I do NOT attempt to export CStdString functions.
-// I simply include the header where it is needed and allow for the code
-// redundancy.
-//
-// That redundancy is a lot less than you think.  This class does most of its
-// work via the Standard C++ Library, particularly the base_class basic_string<>
-// member functions.  Most of the functions here are small enough to be inlined
-// anyway.  Besides, you'll find that in actual practice you use less than 1/2
-// of the code here, even in big projects and different modules will use as
-// little as 10% of it.  That means a lot less functions actually get linked
-// your binaries.  If you export this code from a DLL, it ALL gets linked in.
-//
-// I've compared the size of the binaries from exporting vs NOT exporting.  Take
-// my word for it -- exporting this code is not worth the hassle.
-//
-// -----------------------------------------------------------------------------
-//#pragma warning(disable:4231) // non-standard extension ("extern template")
-//	SSDLLEXP template class SSDLLSPEC CStdStr<char>;
-//	SSDLLEXP template class SSDLLSPEC CStdStr<wchar_t>;
-
-
-// =============================================================================
-//						END OF CStdStr INLINE FUNCTION DEFINITIONS
-// =============================================================================
-
-//	Now typedef our class names based upon this humongous template
-
-typedef CStdStr<char>		CStdStringA;	// a better std::string
-typedef CStdStr<wchar_t>	CStdStringW;	// a better std::wstring
-typedef CStdStr<OLECHAR>	CStdStringO;	// almost always CStdStringW
-
-// -----------------------------------------------------------------------------
-// CStdStr addition functions defined as inline
-// -----------------------------------------------------------------------------
-
-
-inline CStdStringA operator+(const CStdStringA& s1, const CStdStringA& s2)
-{
-	CStdStringA sRet(SSREF(s1));
-	sRet.append(s2);
-	return sRet;
-}
-inline CStdStringA operator+(const CStdStringA& s1, CStdStringA::value_type t)
-{
-	CStdStringA sRet(SSREF(s1));
-	sRet.append(1, t);
-	return sRet;
-}
-inline CStdStringA operator+(const CStdStringA& s1, PCSTR pA)
-{
-	CStdStringA sRet(SSREF(s1));
-	sRet.append(pA);
-	return sRet;
-}
-inline CStdStringA operator+(PCSTR pA, const CStdStringA& sA)
-{
-	CStdStringA sRet;
-	CStdStringA::size_type nObjSize = sA.size();
-	CStdStringA::size_type nLitSize = 
-		static_cast<CStdStringA::size_type>(sslen(pA));
-
-	sRet.reserve(nLitSize + nObjSize);
-	sRet.assign(pA);
-	sRet.append(sA);
-	return sRet;
-}
-
-
-inline CStdStringA operator+(const CStdStringA& s1, const CStdStringW& s2)
-{
-	return s1 + CStdStringA(s2);
-}
-inline CStdStringW operator+(const CStdStringW& s1, const CStdStringW& s2)
-{
-	CStdStringW sRet(SSREF(s1));
-	sRet.append(s2);
-	return sRet;
-}
-inline CStdStringA operator+(const CStdStringA& s1, PCWSTR pW)
-{
-	return s1 + CStdStringA(pW);
-}
-
-#ifdef UNICODE
-	inline CStdStringW operator+(PCWSTR pW, const CStdStringA& sA)
-	{
-		return CStdStringW(pW) + CStdStringW(SSREF(sA));
-	}
-	inline CStdStringW operator+(PCSTR pA, const CStdStringW& sW)
-	{
-		return CStdStringW(pA) + sW;
-	}
-#else
-	inline CStdStringA operator+(PCWSTR pW, const CStdStringA& sA)
-	{
-		return CStdStringA(pW) + sA;
-	}
-	inline CStdStringA operator+(PCSTR pA, const CStdStringW& sW)
-	{
-		return pA + CStdStringA(sW);
-	}
-#endif
-
-// ...Now the wide string versions.
-inline CStdStringW operator+(const CStdStringW& s1, CStdStringW::value_type t)
-{
-	CStdStringW sRet(SSREF(s1));
-	sRet.append(1, t);
-	return sRet;
-}
-inline CStdStringW operator+(const CStdStringW& s1, PCWSTR pW)
-{
-	CStdStringW sRet(SSREF(s1));
-	sRet.append(pW);
-	return sRet;
-}
-inline CStdStringW operator+(PCWSTR pW, const CStdStringW& sW)
-{
-	CStdStringW sRet;
-	CStdStringW::size_type nObjSize = sW.size();
-	CStdStringA::size_type nLitSize = 
-		static_cast<CStdStringW::size_type>(sslen(pW));
-
-	sRet.reserve(nLitSize + nObjSize);
-	sRet.assign(pW);
-	sRet.append(sW);
-	return sRet;
-}
-
-inline CStdStringW operator+(const CStdStringW& s1, const CStdStringA& s2)
-{
-	return s1 + CStdStringW(s2);
-}
-inline CStdStringW operator+(const CStdStringW& s1, PCSTR pA)
-{
-	return s1 + CStdStringW(pA);
-}
-
-
-// New-style format function is a template
-
-#ifdef SS_SAFE_FORMAT
-
-template<>
-struct FmtArg<CStdStringA>
-{
-    explicit FmtArg(const CStdStringA& arg) : a_(arg) {}
-    PCSTR operator()() const { return a_.c_str(); }
-    const CStdStringA& a_;
-private:
-    FmtArg<CStdStringA>& operator=(const FmtArg<CStdStringA>&) { return *this; }
-};
-template<>
-struct FmtArg<CStdStringW>
-{
-    explicit FmtArg(const CStdStringW& arg) : a_(arg) {}
-    PCWSTR operator()() const { return a_.c_str(); }
-    const CStdStringW& a_;
-private:
-    FmtArg<CStdStringW>& operator=(const FmtArg<CStdStringW>&) { return *this; }
-};
-
-template<>
-struct FmtArg<std::string>
-{
-    explicit FmtArg(const std::string& arg) : a_(arg) {}
-    PCSTR operator()() const { return a_.c_str(); }
-    const std::string& a_;
-private:
-    FmtArg<std::string>& operator=(const FmtArg<std::string>&) { return *this; }
-};
-template<>
-struct FmtArg<std::wstring>
-{
-    explicit FmtArg(const std::wstring& arg) : a_(arg) {}
-    PCWSTR operator()() const { return a_.c_str(); }
-    const std::wstring& a_;
-private:
-    FmtArg<std::wstring>& operator=(const FmtArg<std::wstring>&) {return *this;}
-};
-#endif // #ifdef SS_SAFEFORMAT
-
-#ifndef SS_ANSI
-	// SSResourceHandle: our MFC-like resource handle
-	inline HMODULE& SSResourceHandle()
-	{
-		static HMODULE hModuleSS	= GetModuleHandle(0);
-		return hModuleSS;
-	}
-#endif
-
-
-// In MFC builds, define some global serialization operators
-// Special operators that allow us to serialize CStdStrings to CArchives.
-// Note that we use an intermediate CString object in order to ensure that
-// we use the exact same format.
-
-#ifdef _MFC_VER
-	inline CArchive& AFXAPI operator<<(CArchive& ar, const CStdStringA& strA)
-	{
-		CString strTemp(strA);
-		return ar << strTemp;
-	}
-	inline CArchive& AFXAPI operator<<(CArchive& ar, const CStdStringW& strW)
-	{
-		CString strTemp(strW);
-		return ar << strTemp;
-	}
-
-	inline CArchive& AFXAPI operator>>(CArchive& ar, CStdStringA& strA)
-	{
-		CString strTemp;
-		ar >> strTemp;
-		strA = strTemp;
-		return ar;
-	}
-	inline CArchive& AFXAPI operator>>(CArchive& ar, CStdStringW& strW)
-	{
-		CString strTemp;
-		ar >> strTemp;
-		strW = strTemp;
-		return ar;
-	}
-#endif	// #ifdef _MFC_VER -- (i.e. is this MFC?)
-
-
-
-// -----------------------------------------------------------------------------
-// GLOBAL FUNCTION:  WUFormat
-//		CStdStringA WUFormat(UINT nId, ...);
-//		CStdStringA WUFormat(PCSTR szFormat, ...);
-//
-// REMARKS:
-//		This function allows the caller for format and return a CStdStringA
-//		object with a single line of code.
-// -----------------------------------------------------------------------------
-
-inline CStdStringA WUFormatA(PCSTR szFormat, ...)
-{
-	va_list argList;
-	va_start(argList, szFormat);
-	CStdStringA strOut;
-	strOut.FormatV(szFormat, argList);
-	va_end(argList);
-	return strOut;
-}
-inline CStdStringW WUFormatW(PCWSTR szwFormat, ...)
-{
-	va_list argList;
-	va_start(argList, szwFormat);
-	CStdStringW strOut;
-	strOut.FormatV(szwFormat, argList);
-	va_end(argList);
-	return strOut;
-}
-#ifdef SS_ANSI
-#else
-	inline CStdStringA WUFormatA(UINT nId, ...)
-	{
-		va_list argList;
-		va_start(argList, nId);
-
-		CStdStringA strFmt;
-		CStdStringA strOut;
-		if ( strFmt.Load(nId) )
-			strOut.FormatV(strFmt, argList);
-
-		va_end(argList);
-		return strOut;
-	}
-
-	inline CStdStringW WUFormatW(UINT nId, ...)
-	{
-		va_list argList;
-		va_start(argList, nId);
-
-		CStdStringW strFmt;
-		CStdStringW strOut;
-		if ( strFmt.Load(nId) )
-			strOut.FormatV(strFmt, argList);
-
-		va_end(argList);
-		return strOut;
-	}
-#endif // #ifdef SS_ANSI
-
-
-
-#if defined(SS_WIN32) && !defined (SS_ANSI)
-	// -------------------------------------------------------------------------
-	// FUNCTION: WUSysMessage
-	//	 CStdStringA WUSysMessageA(DWORD dwError, DWORD dwLangId=SS_DEFLANGID);
-	//	 CStdStringW WUSysMessageW(DWORD dwError, DWORD dwLangId=SS_DEFLANGID);
-	//           
-	// DESCRIPTION:
-	//	 This function simplifies the process of obtaining a string equivalent
-	//	 of a system error code returned from GetLastError().  You simply
-	//	 supply the value returned by GetLastError() to this function and the
-	//	 corresponding system string is returned in the form of a CStdStringA.
-	//
-	// PARAMETERS: 
-	//	 dwError - a DWORD value representing the error code to be translated
-	//	 dwLangId - the language id to use.  defaults to english.
-	//
-	// RETURN VALUE: 
-	//	 a CStdStringA equivalent of the error code.  Currently, this function
-	//	 only returns either English of the system default language strings.  
-	// -------------------------------------------------------------------------
-	#define SS_DEFLANGID MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT)
-	inline CStdStringA WUSysMessageA(DWORD dwError, DWORD dwLangId=SS_DEFLANGID)
-	{
-		CHAR szBuf[512];
-
-		if ( 0 != ::FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError,
-								   dwLangId, szBuf, 511, NULL) )
-			return WUFormatA("%s (0x%X)", szBuf, dwError);
-		else
- 			return WUFormatA("Unknown error (0x%X)", dwError);
-	}
-	inline CStdStringW WUSysMessageW(DWORD dwError, DWORD dwLangId=SS_DEFLANGID)
-	{
-		WCHAR szBuf[512];
-
-		if ( 0 != ::FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError,
-								   dwLangId, szBuf, 511, NULL) )
-			return WUFormatW(L"%s (0x%X)", szBuf, dwError);
-		else
- 			return WUFormatW(L"Unknown error (0x%X)", dwError);
-	}
-#endif
-
-// Define TCHAR based friendly names for some of these functions
-
-#ifdef UNICODE
-	//#define CStdString				CStdStringW
-	typedef CStdStringW				CStdString;
-	#define WUSysMessage			WUSysMessageW
-	#define WUFormat				WUFormatW
-#else
-	//#define CStdString				CStdStringA
-	typedef CStdStringA				CStdString;
-	#define WUSysMessage			WUSysMessageA
-	#define WUFormat				WUFormatA
-#endif
-
-// ...and some shorter names for the space-efficient
-
-#define WUSysMsg					WUSysMessage
-#define WUSysMsgA					WUSysMessageA
-#define WUSysMsgW					WUSysMessageW
-#define WUFmtA						WUFormatA
-#define	WUFmtW						WUFormatW
-#define WUFmt						WUFormat
-#define WULastErrMsg()				WUSysMessage(::GetLastError())
-#define WULastErrMsgA()				WUSysMessageA(::GetLastError())
-#define WULastErrMsgW()				WUSysMessageW(::GetLastError())
-
-
-// -----------------------------------------------------------------------------
-// FUNCTIONAL COMPARATORS:
-// REMARKS:
-//		These structs are derived from the std::binary_function template.  They
-//		give us functional classes (which may be used in Standard C++ Library
-//		collections and algorithms) that perform case-insensitive comparisons of
-//		CStdString objects.  This is useful for maps in which the key may be the
-//		 proper string but in the wrong case.
-// -----------------------------------------------------------------------------
-#define StdStringLessNoCaseW		SSLNCW	// avoid VC compiler warning 4786
-#define StdStringEqualsNoCaseW		SSENCW		
-#define StdStringLessNoCaseA		SSLNCA		
-#define StdStringEqualsNoCaseA		SSENCA		
-
-#ifdef UNICODE
-	#define StdStringLessNoCase		SSLNCW		
-	#define StdStringEqualsNoCase	SSENCW		
-#else
-	#define StdStringLessNoCase		SSLNCA		
-	#define StdStringEqualsNoCase	SSENCA		
-#endif
-
-struct StdStringLessNoCaseW
-	: std::binary_function<CStdStringW, CStdStringW, bool>
-{
-	inline
-	bool operator()(const CStdStringW& sLeft, const CStdStringW& sRight) const
-	{ return ssicmp(sLeft.c_str(), sRight.c_str()) < 0; }
-};
-struct StdStringEqualsNoCaseW
-	: std::binary_function<CStdStringW, CStdStringW, bool>
-{
-	inline
-	bool operator()(const CStdStringW& sLeft, const CStdStringW& sRight) const
-	{ return ssicmp(sLeft.c_str(), sRight.c_str()) == 0; }
-};
-struct StdStringLessNoCaseA
-	: std::binary_function<CStdStringA, CStdStringA, bool>
-{
-	inline
-	bool operator()(const CStdStringA& sLeft, const CStdStringA& sRight) const
-	{ return ssicmp(sLeft.c_str(), sRight.c_str()) < 0; }
-};
-struct StdStringEqualsNoCaseA
-	: std::binary_function<CStdStringA, CStdStringA, bool>
-{
-	inline
-	bool operator()(const CStdStringA& sLeft, const CStdStringA& sRight) const
-	{ return ssicmp(sLeft.c_str(), sRight.c_str()) == 0; }
-};
-
-// If we had to define our own version of TRACE above, get rid of it now
-
-#ifdef TRACE_DEFINED_HERE
-	#undef TRACE
-	#undef TRACE_DEFINED_HERE
-#endif
-
-
-// These std::swap specializations come courtesy of Mike Crusader. 
-
-//namespace std
-//{
-//	inline void swap(CStdStringA& s1, CStdStringA& s2) throw()
-//	{
-//		s1.swap(s2);
-//	}
-//	template<>
-//	inline void swap(CStdStringW& s1, CStdStringW& s2) throw()
-//	{
-//		s1.swap(s2);
-//	}
-//}
-
-// Turn back on any Borland warnings we turned off.
-
-#ifdef __BORLANDC__
-    #pragma option pop  // Turn back on inline function warnings
-//	#pragma warn +inl   // Turn back on inline function warnings
-#endif
-
-#endif	// #ifndef STDSTRING_H
diff --git a/js/node_modules/ws/.npmignore b/js/node_modules/ws/.npmignore
deleted file mode 100644
index 1eba800f80ff8ccda68e32f76eaeebc4cfea738c..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/.npmignore
+++ /dev/null
@@ -1,11 +0,0 @@
-npm-debug.log
-node_modules
-.*.swp
-.lock-*
-build
-
-bench
-doc
-examples
-test
-
diff --git a/js/node_modules/ws/.travis.yml b/js/node_modules/ws/.travis.yml
deleted file mode 100644
index 5002b4984518918e1ac8ab4a258a2bab16825fc3..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/.travis.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-language: node_js
-sudo: false
-node_js:
-  - "5"
-  - "4"
-  - "0.12"
-addons:
-  apt:
-    sources:
-      - ubuntu-toolchain-r-test
-    packages:
-      - gcc-4.9
-      - g++-4.9
-before_install:
-  - export CC="gcc-4.9" CXX="g++-4.9"
diff --git a/js/node_modules/ws/Makefile b/js/node_modules/ws/Makefile
deleted file mode 100644
index 00f19fa01ca24d8d4e807fdb9493a75a50d3042a..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/Makefile
+++ /dev/null
@@ -1,40 +0,0 @@
-ALL_TESTS = $(shell find test/ -name '*.test.js')
-ALL_INTEGRATION = $(shell find test/ -name '*.integration.js')
-
-all:
-	node-gyp configure build
-
-clean:
-	node-gyp clean
-
-run-tests:
-	@./node_modules/.bin/mocha \
-		-t 5000 \
-		-s 2400 \
-		$(TESTFLAGS) \
-		$(TESTS)
-
-run-integrationtests:
-	@./node_modules/.bin/mocha \
-		-t 5000 \
-		-s 6000 \
-		$(TESTFLAGS) \
-		$(TESTS)
-
-test:
-	@$(MAKE) NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_PATH=lib TESTS="$(ALL_TESTS)" run-tests
-
-integrationtest:
-	@$(MAKE) NODE_TLS_REJECT_UNAUTHORIZED=0 NODE_PATH=lib TESTS="$(ALL_INTEGRATION)" run-integrationtests
-
-benchmark:
-	@node bench/sender.benchmark.js
-	@node bench/parser.benchmark.js
-
-autobahn:
-	@NODE_PATH=lib node test/autobahn.js
-
-autobahn-server:
-	@NODE_PATH=lib node test/autobahn-server.js
-
-.PHONY: test
diff --git a/js/node_modules/ws/README.md b/js/node_modules/ws/README.md
deleted file mode 100644
index 9be2e51d95bd40883ce983800ebb6114c0f7a06d..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/README.md
+++ /dev/null
@@ -1,242 +0,0 @@
-# ws: a node.js websocket library
-
-[![Build Status](https://travis-ci.org/websockets/ws.svg?branch=master)](https://travis-ci.org/websockets/ws)
-
-`ws` is a simple to use WebSocket implementation, up-to-date against RFC-6455,
-and [probably the fastest WebSocket library for node.js][archive].
-
-Passes the quite extensive Autobahn test suite. See http://websockets.github.com/ws
-for the full reports.
-
-## Protocol support
-
-* **Hixie draft 76** (Old and deprecated, but still in use by Safari and Opera.
-  Added to ws version 0.4.2, but server only. Can be disabled by setting the
-  `disableHixie` option to true.)
-* **HyBi drafts 07-12** (Use the option `protocolVersion: 8`)
-* **HyBi drafts 13-17** (Current default, alternatively option `protocolVersion: 13`)
-
-### Installing
-
-```
-npm install --save ws
-```
-
-### Opt-in for performance
-
-There are 2 optional modules that can be installed along side with the `ws`
-module. These modules are binary addons which improve certain operations, but as
-they are binary addons they require compilation which can fail if no c++
-compiler is installed on the host system.
-
-- `npm install --save bufferutil`: Improves internal buffer operations which
-  allows for faster processing of masked WebSocket frames and general buffer
-  operations. 
-- `npm install --save utf-8-validate`: The specification requires validation of
-  invalid UTF-8 chars, some of these validations could not be done in JavaScript
-  hence the need for a binary addon. In most cases you will already be
-  validating the input that you receive for security purposes leading to double
-  validation. But if you want to be 100% spec conform and fast validation of UTF-8
-  then this module is a must.
-
-### Sending and receiving text data
-
-```js
-var WebSocket = require('ws');
-var ws = new WebSocket('ws://www.host.com/path');
-
-ws.on('open', function open() {
-  ws.send('something');
-});
-
-ws.on('message', function(data, flags) {
-  // flags.binary will be set if a binary data is received.
-  // flags.masked will be set if the data was masked.
-});
-```
-
-### Sending binary data
-
-```js
-var WebSocket = require('ws');
-var ws = new WebSocket('ws://www.host.com/path');
-
-ws.on('open', function open() {
-  var array = new Float32Array(5);
-
-  for (var i = 0; i < array.length; ++i) {
-    array[i] = i / 2;
-  }
-
-  ws.send(array, { binary: true, mask: true });
-});
-```
-
-Setting `mask`, as done for the send options above, will cause the data to be
-masked according to the WebSocket protocol. The same option applies for text
-data.
-
-### Server example
-
-```js
-var WebSocketServer = require('ws').Server
-  , wss = new WebSocketServer({ port: 8080 });
-
-wss.on('connection', function connection(ws) {
-  ws.on('message', function incoming(message) {
-    console.log('received: %s', message);
-  });
-
-  ws.send('something');
-});
-```
-
-### ExpressJS example
-
-```js
-var server = require('http').createServer()
-  , url = require('url')
-  , WebSocketServer = require('ws').Server
-  , wss = new WebSocketServer({ server: server })
-  , express = require('express')
-  , app = express()
-  , port = 4080;
-
-app.use(function (req, res) {
-  res.send({ msg: "hello" });
-});
-
-wss.on('connection', function connection(ws) {
-  var location = url.parse(ws.upgradeReq.url, true);
-  // you might use location.query.access_token to authenticate or share sessions
-  // or ws.upgradeReq.headers.cookie (see http://stackoverflow.com/a/16395220/151312)
-  
-  ws.on('message', function incoming(message) {
-    console.log('received: %s', message);
-  });
-
-  ws.send('something');
-});
-
-server.on('request', app);
-server.listen(port, function () { console.log('Listening on ' + server.address().port) });
-```
-
-### Server sending broadcast data
-
-```js
-var WebSocketServer = require('ws').Server
-  , wss = new WebSocketServer({ port: 8080 });
-
-wss.broadcast = function broadcast(data) {
-  wss.clients.forEach(function each(client) {
-    client.send(data);
-  });
-};
-```
-
-### Error handling best practices
-
-```js
-// If the WebSocket is closed before the following send is attempted
-ws.send('something');
-
-// Errors (both immediate and async write errors) can be detected in an optional
-// callback. The callback is also the only way of being notified that data has
-// actually been sent.
-ws.send('something', function ack(error) {
-  // if error is not defined, the send has been completed,
-  // otherwise the error object will indicate what failed.
-});
-
-// Immediate errors can also be handled with try/catch-blocks, but **note** that
-// since sends are inherently asynchronous, socket write failures will *not* be
-// captured when this technique is used.
-try { ws.send('something'); }
-catch (e) { /* handle error */ }
-```
-
-### echo.websocket.org demo
-
-```js
-var WebSocket = require('ws');
-var ws = new WebSocket('ws://echo.websocket.org/', {
-  protocolVersion: 8, 
-  origin: 'http://websocket.org'
-});
-
-ws.on('open', function open() {
-  console.log('connected');
-  ws.send(Date.now().toString(), {mask: true});
-});
-
-ws.on('close', function close() {
-  console.log('disconnected');
-});
-
-ws.on('message', function message(data, flags) {
-  console.log('Roundtrip time: ' + (Date.now() - parseInt(data)) + 'ms', flags);
-
-  setTimeout(function timeout() {
-    ws.send(Date.now().toString(), {mask: true});
-  }, 500);
-});
-```
-
-### Browserify users
-When including ws via a browserify bundle, ws returns global.WebSocket which has slightly different API. 
-You should use the standard WebSockets API instead.
-
-https://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_client_applications#Availability_of_WebSockets
-
-
-### Other examples
-
-For a full example with a browser client communicating with a ws server, see the
-examples folder.
-
-Note that the usage together with Express 3.0 is quite different from Express
-2.x. The difference is expressed in the two different serverstats-examples.
-
-Otherwise, see the test cases.
-
-### Running the tests
-
-```
-make test
-```
-
-## API Docs
-
-See [`/doc/ws.md`](https://github.com/websockets/ws/blob/master/doc/ws.md) for Node.js-like docs for the ws classes.
-
-## Changelog
-
-We're using the GitHub [`releases`](https://github.com/websockets/ws/releases) for changelog entries.
-
-## License
-
-(The MIT License)
-
-Copyright (c) 2011 Einar Otto Stangvik &lt;einaros@gmail.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-[archive]: http://web.archive.org/web/20130314230536/http://hobbycoding.posterous.com/the-fastest-websocket-module-for-nodejs
diff --git a/js/node_modules/ws/index.js b/js/node_modules/ws/index.js
deleted file mode 100644
index a7e8644b99dcb8bb1757faa502c722b6aefe6826..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/index.js
+++ /dev/null
@@ -1,49 +0,0 @@
-'use strict';
-
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-var WS = module.exports = require('./lib/WebSocket');
-
-WS.Server = require('./lib/WebSocketServer');
-WS.Sender = require('./lib/Sender');
-WS.Receiver = require('./lib/Receiver');
-
-/**
- * Create a new WebSocket server.
- *
- * @param {Object} options Server options
- * @param {Function} fn Optional connection listener.
- * @returns {WS.Server}
- * @api public
- */
-WS.createServer = function createServer(options, fn) {
-  var server = new WS.Server(options);
-
-  if (typeof fn === 'function') {
-    server.on('connection', fn);
-  }
-
-  return server;
-};
-
-/**
- * Create a new WebSocket connection.
- *
- * @param {String} address The URL/address we need to connect to.
- * @param {Function} fn Open listener.
- * @returns {WS}
- * @api public
- */
-WS.connect = WS.createConnection = function connect(address, fn) {
-  var client = new WS(address);
-
-  if (typeof fn === 'function') {
-    client.on('open', fn);
-  }
-
-  return client;
-};
diff --git a/js/node_modules/ws/lib/BufferPool.js b/js/node_modules/ws/lib/BufferPool.js
deleted file mode 100644
index 8ee599057fda087bcdb585b3a1d97cfc52a5747a..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/BufferPool.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-var util = require('util');
-
-function BufferPool(initialSize, growStrategy, shrinkStrategy) {
-  if (this instanceof BufferPool === false) {
-    throw new TypeError("Classes can't be function-called");
-  }
-
-  if (typeof initialSize === 'function') {
-    shrinkStrategy = growStrategy;
-    growStrategy = initialSize;
-    initialSize = 0;
-  }
-  else if (typeof initialSize === 'undefined') {
-    initialSize = 0;
-  }
-  this._growStrategy = (growStrategy || function(db, size) {
-    return db.used + size;
-  }).bind(null, this);
-  this._shrinkStrategy = (shrinkStrategy || function(db) {
-    return initialSize;
-  }).bind(null, this);
-  this._buffer = initialSize ? new Buffer(initialSize) : null;
-  this._offset = 0;
-  this._used = 0;
-  this._changeFactor = 0;
-  this.__defineGetter__('size', function(){
-    return this._buffer == null ? 0 : this._buffer.length;
-  });
-  this.__defineGetter__('used', function(){
-    return this._used;
-  });
-}
-
-BufferPool.prototype.get = function(length) {
-  if (this._buffer == null || this._offset + length > this._buffer.length) {
-    var newBuf = new Buffer(this._growStrategy(length));
-    this._buffer = newBuf;
-    this._offset = 0;
-  }
-  this._used += length;
-  var buf = this._buffer.slice(this._offset, this._offset + length);
-  this._offset += length;
-  return buf;
-}
-
-BufferPool.prototype.reset = function(forceNewBuffer) {
-  var len = this._shrinkStrategy();
-  if (len < this.size) this._changeFactor -= 1;
-  if (forceNewBuffer || this._changeFactor < -2) {
-    this._changeFactor = 0;
-    this._buffer = len ? new Buffer(len) : null;
-  }
-  this._offset = 0;
-  this._used = 0;
-}
-
-module.exports = BufferPool;
diff --git a/js/node_modules/ws/lib/BufferUtil.fallback.js b/js/node_modules/ws/lib/BufferUtil.fallback.js
deleted file mode 100644
index 508542c9e506a95f20c60517febd3e1f68536058..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/BufferUtil.fallback.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-module.exports.BufferUtil = {
-  merge: function(mergedBuffer, buffers) {
-    var offset = 0;
-    for (var i = 0, l = buffers.length; i < l; ++i) {
-      var buf = buffers[i];
-      buf.copy(mergedBuffer, offset);
-      offset += buf.length;
-    }
-  },
-  mask: function(source, mask, output, offset, length) {
-    var maskNum = mask.readUInt32LE(0, true);
-    var i = 0;
-    for (; i < length - 3; i += 4) {
-      var num = maskNum ^ source.readUInt32LE(i, true);
-      if (num < 0) num = 4294967296 + num;
-      output.writeUInt32LE(num, offset + i, true);
-    }
-    switch (length % 4) {
-      case 3: output[offset + i + 2] = source[i + 2] ^ mask[2];
-      case 2: output[offset + i + 1] = source[i + 1] ^ mask[1];
-      case 1: output[offset + i] = source[i] ^ mask[0];
-      case 0:;
-    }
-  },
-  unmask: function(data, mask) {
-    var maskNum = mask.readUInt32LE(0, true);
-    var length = data.length;
-    var i = 0;
-    for (; i < length - 3; i += 4) {
-      var num = maskNum ^ data.readUInt32LE(i, true);
-      if (num < 0) num = 4294967296 + num;
-      data.writeUInt32LE(num, i, true);
-    }
-    switch (length % 4) {
-      case 3: data[i + 2] = data[i + 2] ^ mask[2];
-      case 2: data[i + 1] = data[i + 1] ^ mask[1];
-      case 1: data[i] = data[i] ^ mask[0];
-      case 0:;
-    }
-  }
-}
diff --git a/js/node_modules/ws/lib/BufferUtil.js b/js/node_modules/ws/lib/BufferUtil.js
deleted file mode 100644
index 18c69989496afe65dd42055ac5a0eb17e05223b5..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/BufferUtil.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-try {
-  module.exports = require('bufferutil');
-} catch (e) {
-  module.exports = require('./BufferUtil.fallback');
-}
diff --git a/js/node_modules/ws/lib/ErrorCodes.js b/js/node_modules/ws/lib/ErrorCodes.js
deleted file mode 100644
index 55ebd529b7cbe22cacb391fa0094f3323dc61cdc..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/ErrorCodes.js
+++ /dev/null
@@ -1,24 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-module.exports = {
-  isValidErrorCode: function(code) {
-    return (code >= 1000 && code <= 1011 && code != 1004 && code != 1005 && code != 1006) ||
-         (code >= 3000 && code <= 4999);
-  },
-  1000: 'normal',
-  1001: 'going away',
-  1002: 'protocol error',
-  1003: 'unsupported data',
-  1004: 'reserved',
-  1005: 'reserved for extensions',
-  1006: 'reserved for extensions',
-  1007: 'inconsistent or invalid data',
-  1008: 'policy violation',
-  1009: 'message too big',
-  1010: 'extension handshake missing',
-  1011: 'an unexpected condition prevented the request from being fulfilled',
-};
\ No newline at end of file
diff --git a/js/node_modules/ws/lib/Extensions.js b/js/node_modules/ws/lib/Extensions.js
deleted file mode 100644
index a465ace2ba3255aa55b94a55d61d8a386482fba8..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/Extensions.js
+++ /dev/null
@@ -1,70 +0,0 @@
-
-var util = require('util');
-
-/**
- * Module exports.
- */
-
-exports.parse = parse;
-exports.format = format;
-
-/**
- * Parse extensions header value
- */
-
-function parse(value) {
-  value = value || '';
-
-  var extensions = {};
-
-  value.split(',').forEach(function(v) {
-    var params = v.split(';');
-    var token = params.shift().trim();
-    var paramsList = extensions[token] = extensions[token] || [];
-    var parsedParams = {};
-
-    params.forEach(function(param) {
-      var parts = param.trim().split('=');
-      var key = parts[0];
-      var value = parts[1];
-      if (typeof value === 'undefined') {
-        value = true;
-      } else {
-        // unquote value
-        if (value[0] === '"') {
-          value = value.slice(1);
-        }
-        if (value[value.length - 1] === '"') {
-          value = value.slice(0, value.length - 1);
-        }
-      }
-      (parsedParams[key] = parsedParams[key] || []).push(value);
-    });
-
-    paramsList.push(parsedParams);
-  });
-
-  return extensions;
-}
-
-/**
- * Format extensions header value
- */
-
-function format(value) {
-  return Object.keys(value).map(function(token) {
-    var paramsList = value[token];
-    if (!util.isArray(paramsList)) {
-      paramsList = [paramsList];
-    }
-    return paramsList.map(function(params) {
-      return [token].concat(Object.keys(params).map(function(k) {
-        var p = params[k];
-        if (!util.isArray(p)) p = [p];
-        return p.map(function(v) {
-          return v === true ? k : k + '=' + v;
-        }).join('; ');
-      })).join('; ');
-    }).join(', ');
-  }).join(', ');
-}
diff --git a/js/node_modules/ws/lib/PerMessageDeflate.js b/js/node_modules/ws/lib/PerMessageDeflate.js
deleted file mode 100644
index 5324bd8e633ca3c44da9cda0672b93aaa9f665bc..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/PerMessageDeflate.js
+++ /dev/null
@@ -1,325 +0,0 @@
-
-var zlib = require('zlib');
-
-var AVAILABLE_WINDOW_BITS = [8, 9, 10, 11, 12, 13, 14, 15];
-var DEFAULT_WINDOW_BITS = 15;
-var DEFAULT_MEM_LEVEL = 8;
-
-PerMessageDeflate.extensionName = 'permessage-deflate';
-
-/**
- * Per-message Compression Extensions implementation
- */
-
-function PerMessageDeflate(options, isServer) {
-  if (this instanceof PerMessageDeflate === false) {
-    throw new TypeError("Classes can't be function-called");
-  }
-
-  this._options = options || {};
-  this._isServer = !!isServer;
-  this._inflate = null;
-  this._deflate = null;
-  this.params = null;
-}
-
-/**
- * Create extension parameters offer
- *
- * @api public
- */
-
-PerMessageDeflate.prototype.offer = function() {
-  var params = {};
-  if (this._options.serverNoContextTakeover) {
-    params.server_no_context_takeover = true;
-  }
-  if (this._options.clientNoContextTakeover) {
-    params.client_no_context_takeover = true;
-  }
-  if (this._options.serverMaxWindowBits) {
-    params.server_max_window_bits = this._options.serverMaxWindowBits;
-  }
-  if (this._options.clientMaxWindowBits) {
-    params.client_max_window_bits = this._options.clientMaxWindowBits;
-  } else if (this._options.clientMaxWindowBits == null) {
-    params.client_max_window_bits = true;
-  }
-  return params;
-};
-
-/**
- * Accept extension offer
- *
- * @api public
- */
-
-PerMessageDeflate.prototype.accept = function(paramsList) {
-  paramsList = this.normalizeParams(paramsList);
-
-  var params;
-  if (this._isServer) {
-    params = this.acceptAsServer(paramsList);
-  } else {
-    params = this.acceptAsClient(paramsList);
-  }
-
-  this.params = params;
-  return params;
-};
-
-/**
- * Releases all resources used by the extension
- *
- * @api public
- */
-
-PerMessageDeflate.prototype.cleanup = function() {
-  if (this._inflate) {
-    if (this._inflate.writeInProgress) {
-      this._inflate.pendingClose = true;
-    } else {
-      if (this._inflate.close) this._inflate.close();
-      this._inflate = null;
-    }
-  }
-  if (this._deflate) {
-    if (this._deflate.writeInProgress) {
-      this._deflate.pendingClose = true;
-    } else {
-      if (this._deflate.close) this._deflate.close();
-      this._deflate = null;
-    }
-  }
-};
-
-/**
- * Accept extension offer from client
- *
- * @api private
- */
-
-PerMessageDeflate.prototype.acceptAsServer = function(paramsList) {
-  var accepted = {};
-  var result = paramsList.some(function(params) {
-    accepted = {};
-    if (this._options.serverNoContextTakeover === false && params.server_no_context_takeover) {
-      return;
-    }
-    if (this._options.serverMaxWindowBits === false && params.server_max_window_bits) {
-      return;
-    }
-    if (typeof this._options.serverMaxWindowBits === 'number' &&
-        typeof params.server_max_window_bits === 'number' &&
-        this._options.serverMaxWindowBits > params.server_max_window_bits) {
-      return;
-    }
-    if (typeof this._options.clientMaxWindowBits === 'number' && !params.client_max_window_bits) {
-      return;
-    }
-
-    if (this._options.serverNoContextTakeover || params.server_no_context_takeover) {
-      accepted.server_no_context_takeover = true;
-    }
-    if (this._options.clientNoContextTakeover) {
-      accepted.client_no_context_takeover = true;
-    }
-    if (this._options.clientNoContextTakeover !== false && params.client_no_context_takeover) {
-      accepted.client_no_context_takeover = true;
-    }
-    if (typeof this._options.serverMaxWindowBits === 'number') {
-      accepted.server_max_window_bits = this._options.serverMaxWindowBits;
-    } else if (typeof params.server_max_window_bits === 'number') {
-      accepted.server_max_window_bits = params.server_max_window_bits;
-    }
-    if (typeof this._options.clientMaxWindowBits === 'number') {
-      accepted.client_max_window_bits = this._options.clientMaxWindowBits;
-    } else if (this._options.clientMaxWindowBits !== false && typeof params.client_max_window_bits === 'number') {
-      accepted.client_max_window_bits = params.client_max_window_bits;
-    }
-    return true;
-  }, this);
-
-  if (!result) {
-    throw new Error('Doesn\'t support the offered configuration');
-  }
-
-  return accepted;
-};
-
-/**
- * Accept extension response from server
- *
- * @api privaye
- */
-
-PerMessageDeflate.prototype.acceptAsClient = function(paramsList) {
-  var params = paramsList[0];
-  if (this._options.clientNoContextTakeover != null) {
-    if (this._options.clientNoContextTakeover === false && params.client_no_context_takeover) {
-      throw new Error('Invalid value for "client_no_context_takeover"');
-    }
-  }
-  if (this._options.clientMaxWindowBits != null) {
-    if (this._options.clientMaxWindowBits === false && params.client_max_window_bits) {
-      throw new Error('Invalid value for "client_max_window_bits"');
-    }
-    if (typeof this._options.clientMaxWindowBits === 'number' &&
-        (!params.client_max_window_bits || params.client_max_window_bits > this._options.clientMaxWindowBits)) {
-      throw new Error('Invalid value for "client_max_window_bits"');
-    }
-  }
-  return params;
-};
-
-/**
- * Normalize extensions parameters
- *
- * @api private
- */
-
-PerMessageDeflate.prototype.normalizeParams = function(paramsList) {
-  return paramsList.map(function(params) {
-    Object.keys(params).forEach(function(key) {
-      var value = params[key];
-      if (value.length > 1) {
-        throw new Error('Multiple extension parameters for ' + key);
-      }
-
-      value = value[0];
-
-      switch (key) {
-      case 'server_no_context_takeover':
-      case 'client_no_context_takeover':
-        if (value !== true) {
-          throw new Error('invalid extension parameter value for ' + key + ' (' + value + ')');
-        }
-        params[key] = true;
-        break;
-      case 'server_max_window_bits':
-      case 'client_max_window_bits':
-        if (typeof value === 'string') {
-          value = parseInt(value, 10);
-          if (!~AVAILABLE_WINDOW_BITS.indexOf(value)) {
-            throw new Error('invalid extension parameter value for ' + key + ' (' + value + ')');
-          }
-        }
-        if (!this._isServer && value === true) {
-          throw new Error('Missing extension parameter value for ' + key);
-        }
-        params[key] = value;
-        break;
-      default:
-        throw new Error('Not defined extension parameter (' + key + ')');
-      }
-    }, this);
-    return params;
-  }, this);
-};
-
-/**
- * Decompress message
- *
- * @api public
- */
-
-PerMessageDeflate.prototype.decompress = function (data, fin, callback) {
-  var endpoint = this._isServer ? 'client' : 'server';
-
-  if (!this._inflate) {
-    var maxWindowBits = this.params[endpoint + '_max_window_bits'];
-    this._inflate = zlib.createInflateRaw({
-      windowBits: 'number' === typeof maxWindowBits ? maxWindowBits : DEFAULT_WINDOW_BITS
-    });
-  }
-  this._inflate.writeInProgress = true;
-
-  var self = this;
-  var buffers = [];
-
-  this._inflate.on('error', onError).on('data', onData);
-  this._inflate.write(data);
-  if (fin) {
-    this._inflate.write(new Buffer([0x00, 0x00, 0xff, 0xff]));
-  }
-  this._inflate.flush(function() {
-    cleanup();
-    callback(null, Buffer.concat(buffers));
-  });
-
-  function onError(err) {
-    cleanup();
-    callback(err);
-  }
-
-  function onData(data) {
-    buffers.push(data);
-  }
-
-  function cleanup() {
-    if (!self._inflate) return;
-    self._inflate.removeListener('error', onError);
-    self._inflate.removeListener('data', onData);
-    self._inflate.writeInProgress = false;
-    if ((fin && self.params[endpoint + '_no_context_takeover']) || self._inflate.pendingClose) {
-      if (self._inflate.close) self._inflate.close();
-      self._inflate = null;
-    }
-  }
-};
-
-/**
- * Compress message
- *
- * @api public
- */
-
-PerMessageDeflate.prototype.compress = function (data, fin, callback) {
-  var endpoint = this._isServer ? 'server' : 'client';
-
-  if (!this._deflate) {
-    var maxWindowBits = this.params[endpoint + '_max_window_bits'];
-    this._deflate = zlib.createDeflateRaw({
-      flush: zlib.Z_SYNC_FLUSH,
-      windowBits: 'number' === typeof maxWindowBits ? maxWindowBits : DEFAULT_WINDOW_BITS,
-      memLevel: this._options.memLevel || DEFAULT_MEM_LEVEL
-    });
-  }
-  this._deflate.writeInProgress = true;
-
-  var self = this;
-  var buffers = [];
-
-  this._deflate.on('error', onError).on('data', onData);
-  this._deflate.write(data);
-  this._deflate.flush(function() {
-    cleanup();
-    var data = Buffer.concat(buffers);
-    if (fin) {
-      data = data.slice(0, data.length - 4);
-    }
-    callback(null, data);
-  });
-
-  function onError(err) {
-    cleanup();
-    callback(err);
-  }
-
-  function onData(data) {
-    buffers.push(data);
-  }
-
-  function cleanup() {
-    if (!self._deflate) return;
-    self._deflate.removeListener('error', onError);
-    self._deflate.removeListener('data', onData);
-    self._deflate.writeInProgress = false;
-    if ((fin && self.params[endpoint + '_no_context_takeover']) || self._deflate.pendingClose) {
-      if (self._deflate.close) self._deflate.close();
-      self._deflate = null;
-    }
-  }
-};
-
-module.exports = PerMessageDeflate;
diff --git a/js/node_modules/ws/lib/Receiver.hixie.js b/js/node_modules/ws/lib/Receiver.hixie.js
deleted file mode 100644
index 66bc561b733aa29d4a95c49be0f0a670f88e896f..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/Receiver.hixie.js
+++ /dev/null
@@ -1,184 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-var util = require('util');
-
-/**
- * State constants
- */
-
-var EMPTY = 0
-  , BODY = 1;
-var BINARYLENGTH = 2
-  , BINARYBODY = 3;
-
-/**
- * Hixie Receiver implementation
- */
-
-function Receiver () {
-  if (this instanceof Receiver === false) {
-    throw new TypeError("Classes can't be function-called");
-  }
-
-  this.state = EMPTY;
-  this.buffers = [];
-  this.messageEnd = -1;
-  this.spanLength = 0;
-  this.dead = false;
-
-  this.onerror = function() {};
-  this.ontext = function() {};
-  this.onbinary = function() {};
-  this.onclose = function() {};
-  this.onping = function() {};
-  this.onpong = function() {};
-}
-
-module.exports = Receiver;
-
-/**
- * Add new data to the parser.
- *
- * @api public
- */
-
-Receiver.prototype.add = function(data) {
-  var self = this;
-  function doAdd() {
-    if (self.state === EMPTY) {
-      if (data.length == 2 && data[0] == 0xFF && data[1] == 0x00) {
-        self.reset();
-        self.onclose();
-        return;
-      }
-      if (data[0] === 0x80) {
-        self.messageEnd = 0;
-        self.state = BINARYLENGTH;
-        data = data.slice(1);
-      } else {
-
-      if (data[0] !== 0x00) {
-        self.error('payload must start with 0x00 byte', true);
-        return;
-      }
-      data = data.slice(1);
-      self.state = BODY;
-
-      }
-    }
-    if (self.state === BINARYLENGTH) {
-      var i = 0;
-      while ((i < data.length) && (data[i] & 0x80)) {
-        self.messageEnd = 128 * self.messageEnd + (data[i] & 0x7f);
-        ++i;
-      }
-      if (i < data.length) {
-        self.messageEnd = 128 * self.messageEnd + (data[i] & 0x7f);
-        self.state = BINARYBODY;
-        ++i;
-      }
-      if (i > 0)
-        data = data.slice(i);
-    }
-    if (self.state === BINARYBODY) {
-      var dataleft = self.messageEnd - self.spanLength;
-      if (data.length >= dataleft) {
-        // consume the whole buffer to finish the frame
-        self.buffers.push(data);
-        self.spanLength += dataleft;
-        self.messageEnd = dataleft;
-        return self.parse();
-      }
-      // frame's not done even if we consume it all
-      self.buffers.push(data);
-      self.spanLength += data.length;
-      return;
-    }
-    self.buffers.push(data);
-    if ((self.messageEnd = bufferIndex(data, 0xFF)) != -1) {
-      self.spanLength += self.messageEnd;
-      return self.parse();
-    }
-    else self.spanLength += data.length;
-  }
-  while(data) data = doAdd();
-};
-
-/**
- * Releases all resources used by the receiver.
- *
- * @api public
- */
-
-Receiver.prototype.cleanup = function() {
-  this.dead = true;
-  this.state = EMPTY;
-  this.buffers = [];
-};
-
-/**
- * Process buffered data.
- *
- * @api public
- */
-
-Receiver.prototype.parse = function() {
-  var output = new Buffer(this.spanLength);
-  var outputIndex = 0;
-  for (var bi = 0, bl = this.buffers.length; bi < bl - 1; ++bi) {
-    var buffer = this.buffers[bi];
-    buffer.copy(output, outputIndex);
-    outputIndex += buffer.length;
-  }
-  var lastBuffer = this.buffers[this.buffers.length - 1];
-  if (this.messageEnd > 0) lastBuffer.copy(output, outputIndex, 0, this.messageEnd);
-  if (this.state !== BODY) --this.messageEnd;
-  var tail = null;
-  if (this.messageEnd < lastBuffer.length - 1) {
-    tail = lastBuffer.slice(this.messageEnd + 1);
-  }
-  this.reset();
-  this.ontext(output.toString('utf8'));
-  return tail;
-};
-
-/**
- * Handles an error
- *
- * @api private
- */
-
-Receiver.prototype.error = function (reason, terminate) {
-  this.reset();
-  this.onerror(reason, terminate);
-  return this;
-};
-
-/**
- * Reset parser state
- *
- * @api private
- */
-
-Receiver.prototype.reset = function (reason) {
-  if (this.dead) return;
-  this.state = EMPTY;
-  this.buffers = [];
-  this.messageEnd = -1;
-  this.spanLength = 0;
-};
-
-/**
- * Internal api
- */
-
-function bufferIndex(buffer, byte) {
-  for (var i = 0, l = buffer.length; i < l; ++i) {
-    if (buffer[i] === byte) return i;
-  }
-  return -1;
-}
diff --git a/js/node_modules/ws/lib/Receiver.js b/js/node_modules/ws/lib/Receiver.js
deleted file mode 100644
index b3183bfb485cc0f301647a97a0cc7b1ee970634e..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/Receiver.js
+++ /dev/null
@@ -1,702 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-var util = require('util')
-  , Validation = require('./Validation').Validation
-  , ErrorCodes = require('./ErrorCodes')
-  , BufferPool = require('./BufferPool')
-  , bufferUtil = require('./BufferUtil').BufferUtil
-  , PerMessageDeflate = require('./PerMessageDeflate');
-
-/**
- * HyBi Receiver implementation
- */
-
-function Receiver (extensions) {
-  if (this instanceof Receiver === false) {
-    throw new TypeError("Classes can't be function-called");
-  }
-
-  // memory pool for fragmented messages
-  var fragmentedPoolPrevUsed = -1;
-  this.fragmentedBufferPool = new BufferPool(1024, function(db, length) {
-    return db.used + length;
-  }, function(db) {
-    return fragmentedPoolPrevUsed = fragmentedPoolPrevUsed >= 0 ?
-      Math.ceil((fragmentedPoolPrevUsed + db.used) / 2) :
-      db.used;
-  });
-
-  // memory pool for unfragmented messages
-  var unfragmentedPoolPrevUsed = -1;
-  this.unfragmentedBufferPool = new BufferPool(1024, function(db, length) {
-    return db.used + length;
-  }, function(db) {
-    return unfragmentedPoolPrevUsed = unfragmentedPoolPrevUsed >= 0 ?
-      Math.ceil((unfragmentedPoolPrevUsed + db.used) / 2) :
-      db.used;
-  });
-
-  this.extensions = extensions || {};
-  this.state = {
-    activeFragmentedOperation: null,
-    lastFragment: false,
-    masked: false,
-    opcode: 0,
-    fragmentedOperation: false
-  };
-  this.overflow = [];
-  this.headerBuffer = new Buffer(10);
-  this.expectOffset = 0;
-  this.expectBuffer = null;
-  this.expectHandler = null;
-  this.currentMessage = [];
-  this.messageHandlers = [];
-  this.expectHeader(2, this.processPacket);
-  this.dead = false;
-  this.processing = false;
-
-  this.onerror = function() {};
-  this.ontext = function() {};
-  this.onbinary = function() {};
-  this.onclose = function() {};
-  this.onping = function() {};
-  this.onpong = function() {};
-}
-
-module.exports = Receiver;
-
-/**
- * Add new data to the parser.
- *
- * @api public
- */
-
-Receiver.prototype.add = function(data) {
-  var dataLength = data.length;
-  if (dataLength == 0) return;
-  if (this.expectBuffer == null) {
-    this.overflow.push(data);
-    return;
-  }
-  var toRead = Math.min(dataLength, this.expectBuffer.length - this.expectOffset);
-  fastCopy(toRead, data, this.expectBuffer, this.expectOffset);
-  this.expectOffset += toRead;
-  if (toRead < dataLength) {
-    this.overflow.push(data.slice(toRead));
-  }
-  while (this.expectBuffer && this.expectOffset == this.expectBuffer.length) {
-    var bufferForHandler = this.expectBuffer;
-    this.expectBuffer = null;
-    this.expectOffset = 0;
-    this.expectHandler.call(this, bufferForHandler);
-  }
-};
-
-/**
- * Releases all resources used by the receiver.
- *
- * @api public
- */
-
-Receiver.prototype.cleanup = function() {
-  this.dead = true;
-  this.overflow = null;
-  this.headerBuffer = null;
-  this.expectBuffer = null;
-  this.expectHandler = null;
-  this.unfragmentedBufferPool = null;
-  this.fragmentedBufferPool = null;
-  this.state = null;
-  this.currentMessage = null;
-  this.onerror = null;
-  this.ontext = null;
-  this.onbinary = null;
-  this.onclose = null;
-  this.onping = null;
-  this.onpong = null;
-};
-
-/**
- * Waits for a certain amount of header bytes to be available, then fires a callback.
- *
- * @api private
- */
-
-Receiver.prototype.expectHeader = function(length, handler) {
-  if (length == 0) {
-    handler(null);
-    return;
-  }
-  this.expectBuffer = this.headerBuffer.slice(this.expectOffset, this.expectOffset + length);
-  this.expectHandler = handler;
-  var toRead = length;
-  while (toRead > 0 && this.overflow.length > 0) {
-    var fromOverflow = this.overflow.pop();
-    if (toRead < fromOverflow.length) this.overflow.push(fromOverflow.slice(toRead));
-    var read = Math.min(fromOverflow.length, toRead);
-    fastCopy(read, fromOverflow, this.expectBuffer, this.expectOffset);
-    this.expectOffset += read;
-    toRead -= read;
-  }
-};
-
-/**
- * Waits for a certain amount of data bytes to be available, then fires a callback.
- *
- * @api private
- */
-
-Receiver.prototype.expectData = function(length, handler) {
-  if (length == 0) {
-    handler(null);
-    return;
-  }
-  this.expectBuffer = this.allocateFromPool(length, this.state.fragmentedOperation);
-  this.expectHandler = handler;
-  var toRead = length;
-  while (toRead > 0 && this.overflow.length > 0) {
-    var fromOverflow = this.overflow.pop();
-    if (toRead < fromOverflow.length) this.overflow.push(fromOverflow.slice(toRead));
-    var read = Math.min(fromOverflow.length, toRead);
-    fastCopy(read, fromOverflow, this.expectBuffer, this.expectOffset);
-    this.expectOffset += read;
-    toRead -= read;
-  }
-};
-
-/**
- * Allocates memory from the buffer pool.
- *
- * @api private
- */
-
-Receiver.prototype.allocateFromPool = function(length, isFragmented) {
-  return (isFragmented ? this.fragmentedBufferPool : this.unfragmentedBufferPool).get(length);
-};
-
-/**
- * Start processing a new packet.
- *
- * @api private
- */
-
-Receiver.prototype.processPacket = function (data) {
-  if (this.extensions[PerMessageDeflate.extensionName]) {
-    if ((data[0] & 0x30) != 0) {
-      this.error('reserved fields (2, 3) must be empty', 1002);
-      return;
-    }
-  } else {
-    if ((data[0] & 0x70) != 0) {
-      this.error('reserved fields must be empty', 1002);
-      return;
-    }
-  }
-  this.state.lastFragment = (data[0] & 0x80) == 0x80;
-  this.state.masked = (data[1] & 0x80) == 0x80;
-  var compressed = (data[0] & 0x40) == 0x40;
-  var opcode = data[0] & 0xf;
-  if (opcode === 0) {
-    if (compressed) {
-      this.error('continuation frame cannot have the Per-message Compressed bits', 1002);
-      return;
-    }
-    // continuation frame
-    this.state.fragmentedOperation = true;
-    this.state.opcode = this.state.activeFragmentedOperation;
-    if (!(this.state.opcode == 1 || this.state.opcode == 2)) {
-      this.error('continuation frame cannot follow current opcode', 1002);
-      return;
-    }
-  }
-  else {
-    if (opcode < 3 && this.state.activeFragmentedOperation != null) {
-      this.error('data frames after the initial data frame must have opcode 0', 1002);
-      return;
-    }
-    if (opcode >= 8 && compressed) {
-      this.error('control frames cannot have the Per-message Compressed bits', 1002);
-      return;
-    }
-    this.state.compressed = compressed;
-    this.state.opcode = opcode;
-    if (this.state.lastFragment === false) {
-      this.state.fragmentedOperation = true;
-      this.state.activeFragmentedOperation = opcode;
-    }
-    else this.state.fragmentedOperation = false;
-  }
-  var handler = opcodes[this.state.opcode];
-  if (typeof handler == 'undefined') this.error('no handler for opcode ' + this.state.opcode, 1002);
-  else {
-    handler.start.call(this, data);
-  }
-};
-
-/**
- * Endprocessing a packet.
- *
- * @api private
- */
-
-Receiver.prototype.endPacket = function() {
-  if (!this.state.fragmentedOperation) this.unfragmentedBufferPool.reset(true);
-  else if (this.state.lastFragment) this.fragmentedBufferPool.reset(true);
-  this.expectOffset = 0;
-  this.expectBuffer = null;
-  this.expectHandler = null;
-  if (this.state.lastFragment && this.state.opcode === this.state.activeFragmentedOperation) {
-    // end current fragmented operation
-    this.state.activeFragmentedOperation = null;
-  }
-  this.state.lastFragment = false;
-  this.state.opcode = this.state.activeFragmentedOperation != null ? this.state.activeFragmentedOperation : 0;
-  this.state.masked = false;
-  this.expectHeader(2, this.processPacket);
-};
-
-/**
- * Reset the parser state.
- *
- * @api private
- */
-
-Receiver.prototype.reset = function() {
-  if (this.dead) return;
-  this.state = {
-    activeFragmentedOperation: null,
-    lastFragment: false,
-    masked: false,
-    opcode: 0,
-    fragmentedOperation: false
-  };
-  this.fragmentedBufferPool.reset(true);
-  this.unfragmentedBufferPool.reset(true);
-  this.expectOffset = 0;
-  this.expectBuffer = null;
-  this.expectHandler = null;
-  this.overflow = [];
-  this.currentMessage = [];
-  this.messageHandlers = [];
-};
-
-/**
- * Unmask received data.
- *
- * @api private
- */
-
-Receiver.prototype.unmask = function (mask, buf, binary) {
-  if (mask != null && buf != null) bufferUtil.unmask(buf, mask);
-  if (binary) return buf;
-  return buf != null ? buf.toString('utf8') : '';
-};
-
-/**
- * Concatenates a list of buffers.
- *
- * @api private
- */
-
-Receiver.prototype.concatBuffers = function(buffers) {
-  var length = 0;
-  for (var i = 0, l = buffers.length; i < l; ++i) length += buffers[i].length;
-  var mergedBuffer = new Buffer(length);
-  bufferUtil.merge(mergedBuffer, buffers);
-  return mergedBuffer;
-};
-
-/**
- * Handles an error
- *
- * @api private
- */
-
-Receiver.prototype.error = function (reason, protocolErrorCode) {
-  this.reset();
-  this.onerror(reason, protocolErrorCode);
-  return this;
-};
-
-/**
- * Execute message handler buffers
- *
- * @api private
- */
-
-Receiver.prototype.flush = function() {
-  if (this.processing || this.dead) return;
-
-  var handler = this.messageHandlers.shift();
-  if (!handler) return;
-
-  this.processing = true;
-  var self = this;
-
-  handler(function() {
-    self.processing = false;
-    self.flush();
-  });
-};
-
-/**
- * Apply extensions to message
- *
- * @api private
- */
-
-Receiver.prototype.applyExtensions = function(messageBuffer, fin, compressed, callback) {
-  var self = this;
-  if (compressed) {
-    this.extensions[PerMessageDeflate.extensionName].decompress(messageBuffer, fin, function(err, buffer) {
-      if (self.dead) return;
-      if (err) {
-        callback(new Error('invalid compressed data'));
-        return;
-      }
-      callback(null, buffer);
-    });
-  } else {
-    callback(null, messageBuffer);
-  }
-};
-
-/**
- * Buffer utilities
- */
-
-function readUInt16BE(start) {
-  return (this[start]<<8) +
-         this[start+1];
-}
-
-function readUInt32BE(start) {
-  return (this[start]<<24) +
-         (this[start+1]<<16) +
-         (this[start+2]<<8) +
-         this[start+3];
-}
-
-function fastCopy(length, srcBuffer, dstBuffer, dstOffset) {
-  switch (length) {
-    default: srcBuffer.copy(dstBuffer, dstOffset, 0, length); break;
-    case 16: dstBuffer[dstOffset+15] = srcBuffer[15];
-    case 15: dstBuffer[dstOffset+14] = srcBuffer[14];
-    case 14: dstBuffer[dstOffset+13] = srcBuffer[13];
-    case 13: dstBuffer[dstOffset+12] = srcBuffer[12];
-    case 12: dstBuffer[dstOffset+11] = srcBuffer[11];
-    case 11: dstBuffer[dstOffset+10] = srcBuffer[10];
-    case 10: dstBuffer[dstOffset+9] = srcBuffer[9];
-    case 9: dstBuffer[dstOffset+8] = srcBuffer[8];
-    case 8: dstBuffer[dstOffset+7] = srcBuffer[7];
-    case 7: dstBuffer[dstOffset+6] = srcBuffer[6];
-    case 6: dstBuffer[dstOffset+5] = srcBuffer[5];
-    case 5: dstBuffer[dstOffset+4] = srcBuffer[4];
-    case 4: dstBuffer[dstOffset+3] = srcBuffer[3];
-    case 3: dstBuffer[dstOffset+2] = srcBuffer[2];
-    case 2: dstBuffer[dstOffset+1] = srcBuffer[1];
-    case 1: dstBuffer[dstOffset] = srcBuffer[0];
-  }
-}
-
-function clone(obj) {
-  var cloned = {};
-  for (var k in obj) {
-    if (obj.hasOwnProperty(k)) {
-      cloned[k] = obj[k];
-    }
-  }
-  return cloned;
-}
-
-/**
- * Opcode handlers
- */
-
-var opcodes = {
-  // text
-  '1': {
-    start: function(data) {
-      var self = this;
-      // decode length
-      var firstLength = data[1] & 0x7f;
-      if (firstLength < 126) {
-        opcodes['1'].getData.call(self, firstLength);
-      }
-      else if (firstLength == 126) {
-        self.expectHeader(2, function(data) {
-          opcodes['1'].getData.call(self, readUInt16BE.call(data, 0));
-        });
-      }
-      else if (firstLength == 127) {
-        self.expectHeader(8, function(data) {
-          if (readUInt32BE.call(data, 0) != 0) {
-            self.error('packets with length spanning more than 32 bit is currently not supported', 1008);
-            return;
-          }
-          opcodes['1'].getData.call(self, readUInt32BE.call(data, 4));
-        });
-      }
-    },
-    getData: function(length) {
-      var self = this;
-      if (self.state.masked) {
-        self.expectHeader(4, function(data) {
-          var mask = data;
-          self.expectData(length, function(data) {
-            opcodes['1'].finish.call(self, mask, data);
-          });
-        });
-      }
-      else {
-        self.expectData(length, function(data) {
-          opcodes['1'].finish.call(self, null, data);
-        });
-      }
-    },
-    finish: function(mask, data) {
-      var self = this;
-      var packet = this.unmask(mask, data, true) || new Buffer(0);
-      var state = clone(this.state);
-      this.messageHandlers.push(function(callback) {
-        self.applyExtensions(packet, state.lastFragment, state.compressed, function(err, buffer) {
-          if (err) return self.error(err.message, 1007);
-          if (buffer != null) self.currentMessage.push(buffer);
-
-          if (state.lastFragment) {
-            var messageBuffer = self.concatBuffers(self.currentMessage);
-            self.currentMessage = [];
-            if (!Validation.isValidUTF8(messageBuffer)) {
-              self.error('invalid utf8 sequence', 1007);
-              return;
-            }
-            self.ontext(messageBuffer.toString('utf8'), {masked: state.masked, buffer: messageBuffer});
-          }
-          callback();
-        });
-      });
-      this.flush();
-      this.endPacket();
-    }
-  },
-  // binary
-  '2': {
-    start: function(data) {
-      var self = this;
-      // decode length
-      var firstLength = data[1] & 0x7f;
-      if (firstLength < 126) {
-        opcodes['2'].getData.call(self, firstLength);
-      }
-      else if (firstLength == 126) {
-        self.expectHeader(2, function(data) {
-          opcodes['2'].getData.call(self, readUInt16BE.call(data, 0));
-        });
-      }
-      else if (firstLength == 127) {
-        self.expectHeader(8, function(data) {
-          if (readUInt32BE.call(data, 0) != 0) {
-            self.error('packets with length spanning more than 32 bit is currently not supported', 1008);
-            return;
-          }
-          opcodes['2'].getData.call(self, readUInt32BE.call(data, 4, true));
-        });
-      }
-    },
-    getData: function(length) {
-      var self = this;
-      if (self.state.masked) {
-        self.expectHeader(4, function(data) {
-          var mask = data;
-          self.expectData(length, function(data) {
-            opcodes['2'].finish.call(self, mask, data);
-          });
-        });
-      }
-      else {
-        self.expectData(length, function(data) {
-          opcodes['2'].finish.call(self, null, data);
-        });
-      }
-    },
-    finish: function(mask, data) {
-      var self = this;
-      var packet = this.unmask(mask, data, true) || new Buffer(0);
-      var state = clone(this.state);
-      this.messageHandlers.push(function(callback) {
-        self.applyExtensions(packet, state.lastFragment, state.compressed, function(err, buffer) {
-          if (err) return self.error(err.message, 1007);
-          if (buffer != null) self.currentMessage.push(buffer);
-          if (state.lastFragment) {
-            var messageBuffer = self.concatBuffers(self.currentMessage);
-            self.currentMessage = [];
-            self.onbinary(messageBuffer, {masked: state.masked, buffer: messageBuffer});
-          }
-          callback();
-        });
-      });
-      this.flush();
-      this.endPacket();
-    }
-  },
-  // close
-  '8': {
-    start: function(data) {
-      var self = this;
-      if (self.state.lastFragment == false) {
-        self.error('fragmented close is not supported', 1002);
-        return;
-      }
-
-      // decode length
-      var firstLength = data[1] & 0x7f;
-      if (firstLength < 126) {
-        opcodes['8'].getData.call(self, firstLength);
-      }
-      else {
-        self.error('control frames cannot have more than 125 bytes of data', 1002);
-      }
-    },
-    getData: function(length) {
-      var self = this;
-      if (self.state.masked) {
-        self.expectHeader(4, function(data) {
-          var mask = data;
-          self.expectData(length, function(data) {
-            opcodes['8'].finish.call(self, mask, data);
-          });
-        });
-      }
-      else {
-        self.expectData(length, function(data) {
-          opcodes['8'].finish.call(self, null, data);
-        });
-      }
-    },
-    finish: function(mask, data) {
-      var self = this;
-      data = self.unmask(mask, data, true);
-
-      var state = clone(this.state);
-      this.messageHandlers.push(function() {
-        if (data && data.length == 1) {
-          self.error('close packets with data must be at least two bytes long', 1002);
-          return;
-        }
-        var code = data && data.length > 1 ? readUInt16BE.call(data, 0) : 1000;
-        if (!ErrorCodes.isValidErrorCode(code)) {
-          self.error('invalid error code', 1002);
-          return;
-        }
-        var message = '';
-        if (data && data.length > 2) {
-          var messageBuffer = data.slice(2);
-          if (!Validation.isValidUTF8(messageBuffer)) {
-            self.error('invalid utf8 sequence', 1007);
-            return;
-          }
-          message = messageBuffer.toString('utf8');
-        }
-        self.onclose(code, message, {masked: state.masked});
-        self.reset();
-      });
-      this.flush();
-    },
-  },
-  // ping
-  '9': {
-    start: function(data) {
-      var self = this;
-      if (self.state.lastFragment == false) {
-        self.error('fragmented ping is not supported', 1002);
-        return;
-      }
-
-      // decode length
-      var firstLength = data[1] & 0x7f;
-      if (firstLength < 126) {
-        opcodes['9'].getData.call(self, firstLength);
-      }
-      else {
-        self.error('control frames cannot have more than 125 bytes of data', 1002);
-      }
-    },
-    getData: function(length) {
-      var self = this;
-      if (self.state.masked) {
-        self.expectHeader(4, function(data) {
-          var mask = data;
-          self.expectData(length, function(data) {
-            opcodes['9'].finish.call(self, mask, data);
-          });
-        });
-      }
-      else {
-        self.expectData(length, function(data) {
-          opcodes['9'].finish.call(self, null, data);
-        });
-      }
-    },
-    finish: function(mask, data) {
-      var self = this;
-      data = this.unmask(mask, data, true);
-      var state = clone(this.state);
-      this.messageHandlers.push(function(callback) {
-        self.onping(data, {masked: state.masked, binary: true});
-        callback();
-      });
-      this.flush();
-      this.endPacket();
-    }
-  },
-  // pong
-  '10': {
-    start: function(data) {
-      var self = this;
-      if (self.state.lastFragment == false) {
-        self.error('fragmented pong is not supported', 1002);
-        return;
-      }
-
-      // decode length
-      var firstLength = data[1] & 0x7f;
-      if (firstLength < 126) {
-        opcodes['10'].getData.call(self, firstLength);
-      }
-      else {
-        self.error('control frames cannot have more than 125 bytes of data', 1002);
-      }
-    },
-    getData: function(length) {
-      var self = this;
-      if (this.state.masked) {
-        this.expectHeader(4, function(data) {
-          var mask = data;
-          self.expectData(length, function(data) {
-            opcodes['10'].finish.call(self, mask, data);
-          });
-        });
-      }
-      else {
-        this.expectData(length, function(data) {
-          opcodes['10'].finish.call(self, null, data);
-        });
-      }
-    },
-    finish: function(mask, data) {
-      var self = this;
-      data = self.unmask(mask, data, true);
-      var state = clone(this.state);
-      this.messageHandlers.push(function(callback) {
-        self.onpong(data, {masked: state.masked, binary: true});
-        callback();
-      });
-      this.flush();
-      this.endPacket();
-    }
-  }
-}
diff --git a/js/node_modules/ws/lib/Sender.hixie.js b/js/node_modules/ws/lib/Sender.hixie.js
deleted file mode 100644
index b87d9dd9362189d8a806607f56c7c2632b2fbf31..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/Sender.hixie.js
+++ /dev/null
@@ -1,124 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-var events = require('events')
-  , util = require('util')
-  , EventEmitter = events.EventEmitter;
-
-/**
- * Hixie Sender implementation
- */
-
-function Sender(socket) {
-  if (this instanceof Sender === false) {
-    throw new TypeError("Classes can't be function-called");
-  }
-
-  events.EventEmitter.call(this);
-
-  this.socket = socket;
-  this.continuationFrame = false;
-  this.isClosed = false;
-}
-
-module.exports = Sender;
-
-/**
- * Inherits from EventEmitter.
- */
-
-util.inherits(Sender, events.EventEmitter);
-
-/**
- * Frames and writes data.
- *
- * @api public
- */
-
-Sender.prototype.send = function(data, options, cb) {
-  if (this.isClosed) return;
-
-  var isString = typeof data == 'string'
-    , length = isString ? Buffer.byteLength(data) : data.length
-    , lengthbytes = (length > 127) ? 2 : 1 // assume less than 2**14 bytes
-    , writeStartMarker = this.continuationFrame == false
-    , writeEndMarker = !options || !(typeof options.fin != 'undefined' && !options.fin)
-    , buffer = new Buffer((writeStartMarker ? ((options && options.binary) ? (1 + lengthbytes) : 1) : 0) + length + ((writeEndMarker && !(options && options.binary)) ? 1 : 0))
-    , offset = writeStartMarker ? 1 : 0;
-
-  if (writeStartMarker) {
-    if (options && options.binary) {
-      buffer.write('\x80', 'binary');
-      // assume length less than 2**14 bytes
-      if (lengthbytes > 1)
-        buffer.write(String.fromCharCode(128+length/128), offset++, 'binary');
-      buffer.write(String.fromCharCode(length&0x7f), offset++, 'binary');
-    } else
-      buffer.write('\x00', 'binary');
-  }
-
-  if (isString) buffer.write(data, offset, 'utf8');
-  else data.copy(buffer, offset, 0);
-
-  if (writeEndMarker) {
-    if (options && options.binary) {
-      // sending binary, not writing end marker
-    } else
-      buffer.write('\xff', offset + length, 'binary');
-    this.continuationFrame = false;
-  }
-  else this.continuationFrame = true;
-
-  try {
-    this.socket.write(buffer, 'binary', cb);
-  } catch (e) {
-    this.error(e.toString());
-  }
-};
-
-/**
- * Sends a close instruction to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.close = function(code, data, mask, cb) {
-  if (this.isClosed) return;
-  this.isClosed = true;
-  try {
-    if (this.continuationFrame) this.socket.write(new Buffer([0xff], 'binary'));
-    this.socket.write(new Buffer([0xff, 0x00]), 'binary', cb);
-  } catch (e) {
-    this.error(e.toString());
-  }
-};
-
-/**
- * Sends a ping message to the remote party. Not available for hixie.
- *
- * @api public
- */
-
-Sender.prototype.ping = function(data, options) {};
-
-/**
- * Sends a pong message to the remote party. Not available for hixie.
- *
- * @api public
- */
-
-Sender.prototype.pong = function(data, options) {};
-
-/**
- * Handles an error
- *
- * @api private
- */
-
-Sender.prototype.error = function (reason) {
-  this.emit('error', reason);
-  return this;
-};
diff --git a/js/node_modules/ws/lib/Sender.js b/js/node_modules/ws/lib/Sender.js
deleted file mode 100644
index d34061e07ee933270170c9ccaf24e9260733bcb2..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/Sender.js
+++ /dev/null
@@ -1,324 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-var events = require('events')
-  , util = require('util')
-  , EventEmitter = events.EventEmitter
-  , ErrorCodes = require('./ErrorCodes')
-  , bufferUtil = require('./BufferUtil').BufferUtil
-  , PerMessageDeflate = require('./PerMessageDeflate');
-
-/**
- * HyBi Sender implementation
- */
-
-function Sender(socket, extensions) {
-  if (this instanceof Sender === false) {
-    throw new TypeError("Classes can't be function-called");
-  }
-
-  events.EventEmitter.call(this);
-
-  this._socket = socket;
-  this.extensions = extensions || {};
-  this.firstFragment = true;
-  this.compress = false;
-  this.messageHandlers = [];
-  this.processing = false;
-}
-
-/**
- * Inherits from EventEmitter.
- */
-
-util.inherits(Sender, events.EventEmitter);
-
-/**
- * Sends a close instruction to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.close = function(code, data, mask, cb) {
-  if (typeof code !== 'undefined') {
-    if (typeof code !== 'number' ||
-      !ErrorCodes.isValidErrorCode(code)) throw new Error('first argument must be a valid error code number');
-  }
-  code = code || 1000;
-  var dataBuffer = new Buffer(2 + (data ? Buffer.byteLength(data) : 0));
-  writeUInt16BE.call(dataBuffer, code, 0);
-  if (dataBuffer.length > 2) dataBuffer.write(data, 2);
-
-  var self = this;
-  this.messageHandlers.push(function(callback) {
-    self.frameAndSend(0x8, dataBuffer, true, mask);
-    callback();
-    if (typeof cb == 'function') cb();
-  });
-  this.flush();
-};
-
-/**
- * Sends a ping message to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.ping = function(data, options) {
-  var mask = options && options.mask;
-  var self = this;
-  this.messageHandlers.push(function(callback) {
-    self.frameAndSend(0x9, data || '', true, mask);
-    callback();
-  });
-  this.flush();
-};
-
-/**
- * Sends a pong message to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.pong = function(data, options) {
-  var mask = options && options.mask;
-  var self = this;
-  this.messageHandlers.push(function(callback) {
-    self.frameAndSend(0xa, data || '', true, mask);
-    callback();
-  });
-  this.flush();
-};
-
-/**
- * Sends text or binary data to the remote party.
- *
- * @api public
- */
-
-Sender.prototype.send = function(data, options, cb) {
-  var finalFragment = options && options.fin === false ? false : true;
-  var mask = options && options.mask;
-  var compress = options && options.compress;
-  var opcode = options && options.binary ? 2 : 1;
-  if (this.firstFragment === false) {
-    opcode = 0;
-    compress = false;
-  } else {
-    this.firstFragment = false;
-    this.compress = compress;
-  }
-  if (finalFragment) this.firstFragment = true
-
-  var compressFragment = this.compress;
-
-  var self = this;
-  this.messageHandlers.push(function(callback) {
-    self.applyExtensions(data, finalFragment, compressFragment, function(err, data) {
-      if (err) {
-        if (typeof cb == 'function') cb(err);
-        else self.emit('error', err);
-        return;
-      }
-      self.frameAndSend(opcode, data, finalFragment, mask, compress, cb);
-      callback();
-    });
-  });
-  this.flush();
-};
-
-/**
- * Frames and sends a piece of data according to the HyBi WebSocket protocol.
- *
- * @api private
- */
-
-Sender.prototype.frameAndSend = function(opcode, data, finalFragment, maskData, compressed, cb) {
-  var canModifyData = false;
-
-  if (!data) {
-    try {
-      this._socket.write(new Buffer([opcode | (finalFragment ? 0x80 : 0), 0 | (maskData ? 0x80 : 0)].concat(maskData ? [0, 0, 0, 0] : [])), 'binary', cb);
-    }
-    catch (e) {
-      if (typeof cb == 'function') cb(e);
-      else this.emit('error', e);
-    }
-    return;
-  }
-
-  if (!Buffer.isBuffer(data)) {
-    canModifyData = true;
-    if (data && (typeof data.byteLength !== 'undefined' || typeof data.buffer !== 'undefined')) {
-      data = getArrayBuffer(data);
-    } else {
-      //
-      // If people want to send a number, this would allocate the number in
-      // bytes as memory size instead of storing the number as buffer value. So
-      // we need to transform it to string in order to prevent possible
-      // vulnerabilities / memory attacks.
-      //
-      if (typeof data === 'number') data = data.toString();
-
-      data = new Buffer(data);
-    }
-  }
-
-  var dataLength = data.length
-    , dataOffset = maskData ? 6 : 2
-    , secondByte = dataLength;
-
-  if (dataLength >= 65536) {
-    dataOffset += 8;
-    secondByte = 127;
-  }
-  else if (dataLength > 125) {
-    dataOffset += 2;
-    secondByte = 126;
-  }
-
-  var mergeBuffers = dataLength < 32768 || (maskData && !canModifyData);
-  var totalLength = mergeBuffers ? dataLength + dataOffset : dataOffset;
-  var outputBuffer = new Buffer(totalLength);
-  outputBuffer[0] = finalFragment ? opcode | 0x80 : opcode;
-  if (compressed) outputBuffer[0] |= 0x40;
-
-  switch (secondByte) {
-    case 126:
-      writeUInt16BE.call(outputBuffer, dataLength, 2);
-      break;
-    case 127:
-      writeUInt32BE.call(outputBuffer, 0, 2);
-      writeUInt32BE.call(outputBuffer, dataLength, 6);
-  }
-
-  if (maskData) {
-    outputBuffer[1] = secondByte | 0x80;
-    var mask = this._randomMask || (this._randomMask = getRandomMask());
-    outputBuffer[dataOffset - 4] = mask[0];
-    outputBuffer[dataOffset - 3] = mask[1];
-    outputBuffer[dataOffset - 2] = mask[2];
-    outputBuffer[dataOffset - 1] = mask[3];
-    if (mergeBuffers) {
-      bufferUtil.mask(data, mask, outputBuffer, dataOffset, dataLength);
-      try {
-        this._socket.write(outputBuffer, 'binary', cb);
-      }
-      catch (e) {
-        if (typeof cb == 'function') cb(e);
-        else this.emit('error', e);
-      }
-    }
-    else {
-      bufferUtil.mask(data, mask, data, 0, dataLength);
-      try {
-        this._socket.write(outputBuffer, 'binary');
-        this._socket.write(data, 'binary', cb);
-      }
-      catch (e) {
-        if (typeof cb == 'function') cb(e);
-        else this.emit('error', e);
-      }
-    }
-  }
-  else {
-    outputBuffer[1] = secondByte;
-    if (mergeBuffers) {
-      data.copy(outputBuffer, dataOffset);
-      try {
-        this._socket.write(outputBuffer, 'binary', cb);
-      }
-      catch (e) {
-        if (typeof cb == 'function') cb(e);
-        else this.emit('error', e);
-      }
-    }
-    else {
-      try {
-        this._socket.write(outputBuffer, 'binary');
-        this._socket.write(data, 'binary', cb);
-      }
-      catch (e) {
-        if (typeof cb == 'function') cb(e);
-        else this.emit('error', e);
-      }
-    }
-  }
-};
-
-/**
- * Execute message handler buffers
- *
- * @api private
- */
-
-Sender.prototype.flush = function() {
-  if (this.processing) return;
-
-  var handler = this.messageHandlers.shift();
-  if (!handler) return;
-
-  this.processing = true;
-
-  var self = this;
-
-  handler(function() {
-    self.processing = false;
-    self.flush();
-  });
-};
-
-/**
- * Apply extensions to message
- *
- * @api private
- */
-
-Sender.prototype.applyExtensions = function(data, fin, compress, callback) {
-  if (compress && data) {
-    if ((data.buffer || data) instanceof ArrayBuffer) {
-      data = getArrayBuffer(data);
-    }
-    this.extensions[PerMessageDeflate.extensionName].compress(data, fin, callback);
-  } else {
-    callback(null, data);
-  }
-};
-
-module.exports = Sender;
-
-function writeUInt16BE(value, offset) {
-  this[offset] = (value & 0xff00)>>8;
-  this[offset+1] = value & 0xff;
-}
-
-function writeUInt32BE(value, offset) {
-  this[offset] = (value & 0xff000000)>>24;
-  this[offset+1] = (value & 0xff0000)>>16;
-  this[offset+2] = (value & 0xff00)>>8;
-  this[offset+3] = value & 0xff;
-}
-
-function getArrayBuffer(data) {
-  // data is either an ArrayBuffer or ArrayBufferView.
-  var array = new Uint8Array(data.buffer || data)
-    , l = data.byteLength || data.length
-    , o = data.byteOffset || 0
-    , buffer = new Buffer(l);
-  for (var i = 0; i < l; ++i) {
-    buffer[i] = array[o+i];
-  }
-  return buffer;
-}
-
-function getRandomMask() {
-  return new Buffer([
-    ~~(Math.random() * 255),
-    ~~(Math.random() * 255),
-    ~~(Math.random() * 255),
-    ~~(Math.random() * 255)
-  ]);
-}
diff --git a/js/node_modules/ws/lib/Validation.fallback.js b/js/node_modules/ws/lib/Validation.fallback.js
deleted file mode 100644
index 2c7c4fd48b2777280eae63f809f39c136a954f97..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/Validation.fallback.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
- 
-module.exports.Validation = {
-  isValidUTF8: function(buffer) {
-    return true;
-  }
-};
-
diff --git a/js/node_modules/ws/lib/Validation.js b/js/node_modules/ws/lib/Validation.js
deleted file mode 100644
index 0795fb7f0c4c92b557156a5bcdd0d906456ca315..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/Validation.js
+++ /dev/null
@@ -1,13 +0,0 @@
-'use strict';
-
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-try {
-  module.exports = require('utf-8-validate');
-} catch (e) {
-  module.exports = require('./Validation.fallback');
-}
diff --git a/js/node_modules/ws/lib/WebSocket.js b/js/node_modules/ws/lib/WebSocket.js
deleted file mode 100644
index 4e06c80710836f43350a9c1d5b5f98bb906ff9b2..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/WebSocket.js
+++ /dev/null
@@ -1,965 +0,0 @@
-'use strict';
-
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-var url = require('url')
-  , util = require('util')
-  , http = require('http')
-  , https = require('https')
-  , crypto = require('crypto')
-  , stream = require('stream')
-  , Ultron = require('ultron')
-  , Options = require('options')
-  , Sender = require('./Sender')
-  , Receiver = require('./Receiver')
-  , SenderHixie = require('./Sender.hixie')
-  , ReceiverHixie = require('./Receiver.hixie')
-  , Extensions = require('./Extensions')
-  , PerMessageDeflate = require('./PerMessageDeflate')
-  , EventEmitter = require('events').EventEmitter;
-
-/**
- * Constants
- */
-
-// Default protocol version
-
-var protocolVersion = 13;
-
-// Close timeout
-
-var closeTimeout = 30 * 1000; // Allow 30 seconds to terminate the connection cleanly
-
-/**
- * WebSocket implementation
- *
- * @constructor
- * @param {String} address Connection address.
- * @param {String|Array} protocols WebSocket protocols.
- * @param {Object} options Additional connection options.
- * @api public
- */
-function WebSocket(address, protocols, options) {
-  if (this instanceof WebSocket === false) {
-    return new WebSocket(address, protocols, options);
-  }
-
-  EventEmitter.call(this);
-
-  if (protocols && !Array.isArray(protocols) && 'object' === typeof protocols) {
-    // accept the "options" Object as the 2nd argument
-    options = protocols;
-    protocols = null;
-  }
-
-  if ('string' === typeof protocols) {
-    protocols = [ protocols ];
-  }
-
-  if (!Array.isArray(protocols)) {
-    protocols = [];
-  }
-
-  this._socket = null;
-  this._ultron = null;
-  this._closeReceived = false;
-  this.bytesReceived = 0;
-  this.readyState = null;
-  this.supports = {};
-  this.extensions = {};
-
-  if (Array.isArray(address)) {
-    initAsServerClient.apply(this, address.concat(options));
-  } else {
-    initAsClient.apply(this, [address, protocols, options]);
-  }
-}
-
-/**
- * Inherits from EventEmitter.
- */
-util.inherits(WebSocket, EventEmitter);
-
-/**
- * Ready States
- */
-["CONNECTING", "OPEN", "CLOSING", "CLOSED"].forEach(function each(state, index) {
-    WebSocket.prototype[state] = WebSocket[state] = index;
-});
-
-/**
- * Gracefully closes the connection, after sending a description message to the server
- *
- * @param {Object} data to be sent to the server
- * @api public
- */
-WebSocket.prototype.close = function close(code, data) {
-  if (this.readyState === WebSocket.CLOSED) return;
-
-  if (this.readyState === WebSocket.CONNECTING) {
-    this.readyState = WebSocket.CLOSED;
-    return;
-  }
-
-  if (this.readyState === WebSocket.CLOSING) {
-    if (this._closeReceived && this._isServer) {
-      this.terminate();
-    }
-    return;
-  }
-
-  var self = this;
-  try {
-    this.readyState = WebSocket.CLOSING;
-    this._closeCode = code;
-    this._closeMessage = data;
-    var mask = !this._isServer;
-    this._sender.close(code, data, mask, function(err) {
-      if (err) self.emit('error', err);
-
-      if (self._closeReceived && self._isServer) {
-        self.terminate();
-      } else {
-        // ensure that the connection is cleaned up even when no response of closing handshake.
-        clearTimeout(self._closeTimer);
-        self._closeTimer = setTimeout(cleanupWebsocketResources.bind(self, true), closeTimeout);
-      }
-    });
-  } catch (e) {
-    this.emit('error', e);
-  }
-};
-
-/**
- * Pause the client stream
- *
- * @api public
- */
-WebSocket.prototype.pause = function pauser() {
-  if (this.readyState !== WebSocket.OPEN) throw new Error('not opened');
-
-  return this._socket.pause();
-};
-
-/**
- * Sends a ping
- *
- * @param {Object} data to be sent to the server
- * @param {Object} Members - mask: boolean, binary: boolean
- * @param {boolean} dontFailWhenClosed indicates whether or not to throw if the connection isnt open
- * @api public
- */
-WebSocket.prototype.ping = function ping(data, options, dontFailWhenClosed) {
-  if (this.readyState !== WebSocket.OPEN) {
-    if (dontFailWhenClosed === true) return;
-    throw new Error('not opened');
-  }
-
-  options = options || {};
-
-  if (typeof options.mask === 'undefined') options.mask = !this._isServer;
-
-  this._sender.ping(data, options);
-};
-
-/**
- * Sends a pong
- *
- * @param {Object} data to be sent to the server
- * @param {Object} Members - mask: boolean, binary: boolean
- * @param {boolean} dontFailWhenClosed indicates whether or not to throw if the connection isnt open
- * @api public
- */
-WebSocket.prototype.pong = function(data, options, dontFailWhenClosed) {
-  if (this.readyState !== WebSocket.OPEN) {
-    if (dontFailWhenClosed === true) return;
-    throw new Error('not opened');
-  }
-
-  options = options || {};
-
-  if (typeof options.mask === 'undefined') options.mask = !this._isServer;
-
-  this._sender.pong(data, options);
-};
-
-/**
- * Resume the client stream
- *
- * @api public
- */
-WebSocket.prototype.resume = function resume() {
-  if (this.readyState !== WebSocket.OPEN) throw new Error('not opened');
-
-  return this._socket.resume();
-};
-
-/**
- * Sends a piece of data
- *
- * @param {Object} data to be sent to the server
- * @param {Object} Members - mask: boolean, binary: boolean, compress: boolean
- * @param {function} Optional callback which is executed after the send completes
- * @api public
- */
-
-WebSocket.prototype.send = function send(data, options, cb) {
-  if (typeof options === 'function') {
-    cb = options;
-    options = {};
-  }
-
-  if (this.readyState !== WebSocket.OPEN) {
-    if (typeof cb === 'function') cb(new Error('not opened'));
-    else throw new Error('not opened');
-    return;
-  }
-
-  if (!data) data = '';
-  if (this._queue) {
-    var self = this;
-    this._queue.push(function() { self.send(data, options, cb); });
-    return;
-  }
-
-  options = options || {};
-  options.fin = true;
-
-  if (typeof options.binary === 'undefined') {
-    options.binary = (data instanceof ArrayBuffer || data instanceof Buffer ||
-      data instanceof Uint8Array ||
-      data instanceof Uint16Array ||
-      data instanceof Uint32Array ||
-      data instanceof Int8Array ||
-      data instanceof Int16Array ||
-      data instanceof Int32Array ||
-      data instanceof Float32Array ||
-      data instanceof Float64Array);
-  }
-
-  if (typeof options.mask === 'undefined') options.mask = !this._isServer;
-  if (typeof options.compress === 'undefined') options.compress = true;
-  if (!this.extensions[PerMessageDeflate.extensionName]) {
-    options.compress = false;
-  }
-
-  var readable = typeof stream.Readable === 'function'
-    ? stream.Readable
-    : stream.Stream;
-
-  if (data instanceof readable) {
-    startQueue(this);
-    var self = this;
-
-    sendStream(this, data, options, function send(error) {
-      process.nextTick(function tock() {
-        executeQueueSends(self);
-      });
-
-      if (typeof cb === 'function') cb(error);
-    });
-  } else {
-    this._sender.send(data, options, cb);
-  }
-};
-
-/**
- * Streams data through calls to a user supplied function
- *
- * @param {Object} Members - mask: boolean, binary: boolean, compress: boolean
- * @param {function} 'function (error, send)' which is executed on successive ticks of which send is 'function (data, final)'.
- * @api public
- */
-WebSocket.prototype.stream = function stream(options, cb) {
-  if (typeof options === 'function') {
-    cb = options;
-    options = {};
-  }
-
-  var self = this;
-
-  if (typeof cb !== 'function') throw new Error('callback must be provided');
-
-  if (this.readyState !== WebSocket.OPEN) {
-    if (typeof cb === 'function') cb(new Error('not opened'));
-    else throw new Error('not opened');
-    return;
-  }
-
-  if (this._queue) {
-    this._queue.push(function () { self.stream(options, cb); });
-    return;
-  }
-
-  options = options || {};
-
-  if (typeof options.mask === 'undefined') options.mask = !this._isServer;
-  if (typeof options.compress === 'undefined') options.compress = true;
-  if (!this.extensions[PerMessageDeflate.extensionName]) {
-    options.compress = false;
-  }
-
-  startQueue(this);
-
-  function send(data, final) {
-    try {
-      if (self.readyState !== WebSocket.OPEN) throw new Error('not opened');
-      options.fin = final === true;
-      self._sender.send(data, options);
-      if (!final) process.nextTick(cb.bind(null, null, send));
-      else executeQueueSends(self);
-    } catch (e) {
-      if (typeof cb === 'function') cb(e);
-      else {
-        delete self._queue;
-        self.emit('error', e);
-      }
-    }
-  }
-
-  process.nextTick(cb.bind(null, null, send));
-};
-
-/**
- * Immediately shuts down the connection
- *
- * @api public
- */
-WebSocket.prototype.terminate = function terminate() {
-  if (this.readyState === WebSocket.CLOSED) return;
-
-  if (this._socket) {
-    this.readyState = WebSocket.CLOSING;
-
-    // End the connection
-    try { this._socket.end(); }
-    catch (e) {
-      // Socket error during end() call, so just destroy it right now
-      cleanupWebsocketResources.call(this, true);
-      return;
-    }
-
-    // Add a timeout to ensure that the connection is completely
-    // cleaned up within 30 seconds, even if the clean close procedure
-    // fails for whatever reason
-    // First cleanup any pre-existing timeout from an earlier "terminate" call,
-    // if one exists.  Otherwise terminate calls in quick succession will leak timeouts
-    // and hold the program open for `closeTimout` time.
-    if (this._closeTimer) { clearTimeout(this._closeTimer); }
-    this._closeTimer = setTimeout(cleanupWebsocketResources.bind(this, true), closeTimeout);
-  } else if (this.readyState === WebSocket.CONNECTING) {
-    cleanupWebsocketResources.call(this, true);
-  }
-};
-
-/**
- * Expose bufferedAmount
- *
- * @api public
- */
-Object.defineProperty(WebSocket.prototype, 'bufferedAmount', {
-  get: function get() {
-    var amount = 0;
-    if (this._socket) {
-      amount = this._socket.bufferSize || 0;
-    }
-    return amount;
-  }
-});
-
-/**
- * Emulates the W3C Browser based WebSocket interface using function members.
- *
- * @see http://dev.w3.org/html5/websockets/#the-websocket-interface
- * @api public
- */
-['open', 'error', 'close', 'message'].forEach(function(method) {
-  Object.defineProperty(WebSocket.prototype, 'on' + method, {
-    /**
-     * Returns the current listener
-     *
-     * @returns {Mixed} the set function or undefined
-     * @api public
-     */
-    get: function get() {
-      var listener = this.listeners(method)[0];
-      return listener ? (listener._listener ? listener._listener : listener) : undefined;
-    },
-
-    /**
-     * Start listening for events
-     *
-     * @param {Function} listener the listener
-     * @returns {Mixed} the set function or undefined
-     * @api public
-     */
-    set: function set(listener) {
-      this.removeAllListeners(method);
-      this.addEventListener(method, listener);
-    }
-  });
-});
-
-/**
- * Emulates the W3C Browser based WebSocket interface using addEventListener.
- *
- * @see https://developer.mozilla.org/en/DOM/element.addEventListener
- * @see http://dev.w3.org/html5/websockets/#the-websocket-interface
- * @api public
- */
-WebSocket.prototype.addEventListener = function(method, listener) {
-  var target = this;
-
-  function onMessage (data, flags) {
-    listener.call(target, new MessageEvent(data, !!flags.binary, target));
-  }
-
-  function onClose (code, message) {
-    listener.call(target, new CloseEvent(code, message, target));
-  }
-
-  function onError (event) {
-    event.type = 'error';
-    event.target = target;
-    listener.call(target, event);
-  }
-
-  function onOpen () {
-    listener.call(target, new OpenEvent(target));
-  }
-
-  if (typeof listener === 'function') {
-    if (method === 'message') {
-      // store a reference so we can return the original function from the
-      // addEventListener hook
-      onMessage._listener = listener;
-      this.on(method, onMessage);
-    } else if (method === 'close') {
-      // store a reference so we can return the original function from the
-      // addEventListener hook
-      onClose._listener = listener;
-      this.on(method, onClose);
-    } else if (method === 'error') {
-      // store a reference so we can return the original function from the
-      // addEventListener hook
-      onError._listener = listener;
-      this.on(method, onError);
-    } else if (method === 'open') {
-      // store a reference so we can return the original function from the
-      // addEventListener hook
-      onOpen._listener = listener;
-      this.on(method, onOpen);
-    } else {
-      this.on(method, listener);
-    }
-  }
-};
-
-module.exports = WebSocket;
-module.exports.buildHostHeader = buildHostHeader
-
-/**
- * W3C MessageEvent
- *
- * @see http://www.w3.org/TR/html5/comms.html
- * @constructor
- * @api private
- */
-function MessageEvent(dataArg, isBinary, target) {
-  this.type = 'message';
-  this.data = dataArg;
-  this.target = target;
-  this.binary = isBinary; // non-standard.
-}
-
-/**
- * W3C CloseEvent
- *
- * @see http://www.w3.org/TR/html5/comms.html
- * @constructor
- * @api private
- */
-function CloseEvent(code, reason, target) {
-  this.type = 'close';
-  this.wasClean = (typeof code === 'undefined' || code === 1000);
-  this.code = code;
-  this.reason = reason;
-  this.target = target;
-}
-
-/**
- * W3C OpenEvent
- *
- * @see http://www.w3.org/TR/html5/comms.html
- * @constructor
- * @api private
- */
-function OpenEvent(target) {
-  this.type = 'open';
-  this.target = target;
-}
-
-// Append port number to Host header, only if specified in the url
-// and non-default
-function buildHostHeader(isSecure, hostname, port) {
-  var headerHost = hostname;
-  if (hostname) {
-    if ((isSecure && (port != 443)) || (!isSecure && (port != 80))){
-      headerHost = headerHost + ':' + port;
-    }
-  }
-  return headerHost;
-}
-
-/**
- * Entirely private apis,
- * which may or may not be bound to a sepcific WebSocket instance.
- */
-function initAsServerClient(req, socket, upgradeHead, options) {
-  options = new Options({
-    protocolVersion: protocolVersion,
-    protocol: null,
-    extensions: {}
-  }).merge(options);
-
-  // expose state properties
-  this.protocol = options.value.protocol;
-  this.protocolVersion = options.value.protocolVersion;
-  this.extensions = options.value.extensions;
-  this.supports.binary = (this.protocolVersion !== 'hixie-76');
-  this.upgradeReq = req;
-  this.readyState = WebSocket.CONNECTING;
-  this._isServer = true;
-
-  // establish connection
-  if (options.value.protocolVersion === 'hixie-76') {
-    establishConnection.call(this, ReceiverHixie, SenderHixie, socket, upgradeHead);
-  } else {
-    establishConnection.call(this, Receiver, Sender, socket, upgradeHead);
-  }
-}
-
-function initAsClient(address, protocols, options) {
-  options = new Options({
-    origin: null,
-    protocolVersion: protocolVersion,
-    host: null,
-    headers: null,
-    protocol: protocols.join(','),
-    agent: null,
-
-    // ssl-related options
-    pfx: null,
-    key: null,
-    passphrase: null,
-    cert: null,
-    ca: null,
-    ciphers: null,
-    rejectUnauthorized: null,
-    perMessageDeflate: true,
-    localAddress: null
-  }).merge(options);
-
-  if (options.value.protocolVersion !== 8 && options.value.protocolVersion !== 13) {
-    throw new Error('unsupported protocol version');
-  }
-
-  // verify URL and establish http class
-  var serverUrl = url.parse(address);
-  var isUnixSocket = serverUrl.protocol === 'ws+unix:';
-  if (!serverUrl.host && !isUnixSocket) throw new Error('invalid url');
-  var isSecure = serverUrl.protocol === 'wss:' || serverUrl.protocol === 'https:';
-  var httpObj = isSecure ? https : http;
-  var port = serverUrl.port || (isSecure ? 443 : 80);
-  var auth = serverUrl.auth;
-
-  // prepare extensions
-  var extensionsOffer = {};
-  var perMessageDeflate;
-  if (options.value.perMessageDeflate) {
-    perMessageDeflate = new PerMessageDeflate(typeof options.value.perMessageDeflate !== true ? options.value.perMessageDeflate : {}, false);
-    extensionsOffer[PerMessageDeflate.extensionName] = perMessageDeflate.offer();
-  }
-
-  // expose state properties
-  this._isServer = false;
-  this.url = address;
-  this.protocolVersion = options.value.protocolVersion;
-  this.supports.binary = (this.protocolVersion !== 'hixie-76');
-
-  // begin handshake
-  var key = new Buffer(options.value.protocolVersion + '-' + Date.now()).toString('base64');
-  var shasum = crypto.createHash('sha1');
-  shasum.update(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11');
-  var expectedServerKey = shasum.digest('base64');
-
-  var agent = options.value.agent;
-
-  var headerHost = buildHostHeader(isSecure, serverUrl.hostname, port)
-
-  var requestOptions = {
-    port: port,
-    host: serverUrl.hostname,
-    headers: {
-      'Connection': 'Upgrade',
-      'Upgrade': 'websocket',
-      'Host': headerHost,
-      'Sec-WebSocket-Version': options.value.protocolVersion,
-      'Sec-WebSocket-Key': key
-    }
-  };
-
-  // If we have basic auth.
-  if (auth) {
-    requestOptions.headers.Authorization = 'Basic ' + new Buffer(auth).toString('base64');
-  }
-
-  if (options.value.protocol) {
-    requestOptions.headers['Sec-WebSocket-Protocol'] = options.value.protocol;
-  }
-
-  if (options.value.host) {
-    requestOptions.headers.Host = options.value.host;
-  }
-
-  if (options.value.headers) {
-    for (var header in options.value.headers) {
-       if (options.value.headers.hasOwnProperty(header)) {
-        requestOptions.headers[header] = options.value.headers[header];
-       }
-    }
-  }
-
-  if (Object.keys(extensionsOffer).length) {
-    requestOptions.headers['Sec-WebSocket-Extensions'] = Extensions.format(extensionsOffer);
-  }
-
-  if (options.isDefinedAndNonNull('pfx')
-   || options.isDefinedAndNonNull('key')
-   || options.isDefinedAndNonNull('passphrase')
-   || options.isDefinedAndNonNull('cert')
-   || options.isDefinedAndNonNull('ca')
-   || options.isDefinedAndNonNull('ciphers')
-   || options.isDefinedAndNonNull('rejectUnauthorized')) {
-
-    if (options.isDefinedAndNonNull('pfx')) requestOptions.pfx = options.value.pfx;
-    if (options.isDefinedAndNonNull('key')) requestOptions.key = options.value.key;
-    if (options.isDefinedAndNonNull('passphrase')) requestOptions.passphrase = options.value.passphrase;
-    if (options.isDefinedAndNonNull('cert')) requestOptions.cert = options.value.cert;
-    if (options.isDefinedAndNonNull('ca')) requestOptions.ca = options.value.ca;
-    if (options.isDefinedAndNonNull('ciphers')) requestOptions.ciphers = options.value.ciphers;
-    if (options.isDefinedAndNonNull('rejectUnauthorized')) requestOptions.rejectUnauthorized = options.value.rejectUnauthorized;
-
-    if (!agent) {
-        // global agent ignores client side certificates
-        agent = new httpObj.Agent(requestOptions);
-    }
-  }
-
-  requestOptions.path = serverUrl.path || '/';
-
-  if (agent) {
-    requestOptions.agent = agent;
-  }
-
-  if (isUnixSocket) {
-    requestOptions.socketPath = serverUrl.pathname;
-  }
-
-  if (options.value.localAddress) {
-    requestOptions.localAddress = options.value.localAddress;
-  }
-
-  if (options.value.origin) {
-    if (options.value.protocolVersion < 13) requestOptions.headers['Sec-WebSocket-Origin'] = options.value.origin;
-    else requestOptions.headers.Origin = options.value.origin;
-  }
-
-  var self = this;
-  var req = httpObj.request(requestOptions);
-
-  req.on('error', function onerror(error) {
-    self.emit('error', error);
-    cleanupWebsocketResources.call(self, error);
-  });
-
-  req.once('response', function response(res) {
-    var error;
-
-    if (!self.emit('unexpected-response', req, res)) {
-      error = new Error('unexpected server response (' + res.statusCode + ')');
-      req.abort();
-      self.emit('error', error);
-    }
-
-    cleanupWebsocketResources.call(self, error);
-  });
-
-  req.once('upgrade', function upgrade(res, socket, upgradeHead) {
-    if (self.readyState === WebSocket.CLOSED) {
-      // client closed before server accepted connection
-      self.emit('close');
-      self.removeAllListeners();
-      socket.end();
-      return;
-    }
-
-    var serverKey = res.headers['sec-websocket-accept'];
-    if (typeof serverKey === 'undefined' || serverKey !== expectedServerKey) {
-      self.emit('error', 'invalid server key');
-      self.removeAllListeners();
-      socket.end();
-      return;
-    }
-
-    var serverProt = res.headers['sec-websocket-protocol'];
-    var protList = (options.value.protocol || "").split(/, */);
-    var protError = null;
-
-    if (!options.value.protocol && serverProt) {
-      protError = 'server sent a subprotocol even though none requested';
-    } else if (options.value.protocol && !serverProt) {
-      protError = 'server sent no subprotocol even though requested';
-    } else if (serverProt && protList.indexOf(serverProt) === -1) {
-      protError = 'server responded with an invalid protocol';
-    }
-
-    if (protError) {
-      self.emit('error', protError);
-      self.removeAllListeners();
-      socket.end();
-      return;
-    } else if (serverProt) {
-      self.protocol = serverProt;
-    }
-
-    var serverExtensions = Extensions.parse(res.headers['sec-websocket-extensions']);
-    if (perMessageDeflate && serverExtensions[PerMessageDeflate.extensionName]) {
-      try {
-        perMessageDeflate.accept(serverExtensions[PerMessageDeflate.extensionName]);
-      } catch (err) {
-        self.emit('error', 'invalid extension parameter');
-        self.removeAllListeners();
-        socket.end();
-        return;
-      }
-      self.extensions[PerMessageDeflate.extensionName] = perMessageDeflate;
-    }
-
-    establishConnection.call(self, Receiver, Sender, socket, upgradeHead);
-
-    // perform cleanup on http resources
-    req.removeAllListeners();
-    req = null;
-    agent = null;
-  });
-
-  req.end();
-  this.readyState = WebSocket.CONNECTING;
-}
-
-function establishConnection(ReceiverClass, SenderClass, socket, upgradeHead) {
-  var ultron = this._ultron = new Ultron(socket)
-    , called = false
-    , self = this;
-
-  socket.setTimeout(0);
-  socket.setNoDelay(true);
-
-  this._receiver = new ReceiverClass(this.extensions);
-  this._socket = socket;
-
-  // socket cleanup handlers
-  ultron.on('end', cleanupWebsocketResources.bind(this));
-  ultron.on('close', cleanupWebsocketResources.bind(this));
-  ultron.on('error', cleanupWebsocketResources.bind(this));
-
-  // ensure that the upgradeHead is added to the receiver
-  function firstHandler(data) {
-    if (called || self.readyState === WebSocket.CLOSED) return;
-
-    called = true;
-    socket.removeListener('data', firstHandler);
-    ultron.on('data', realHandler);
-
-    if (upgradeHead && upgradeHead.length > 0) {
-      realHandler(upgradeHead);
-      upgradeHead = null;
-    }
-
-    if (data) realHandler(data);
-  }
-
-  // subsequent packets are pushed straight to the receiver
-  function realHandler(data) {
-    self.bytesReceived += data.length;
-    self._receiver.add(data);
-  }
-
-  ultron.on('data', firstHandler);
-
-  // if data was passed along with the http upgrade,
-  // this will schedule a push of that on to the receiver.
-  // this has to be done on next tick, since the caller
-  // hasn't had a chance to set event handlers on this client
-  // object yet.
-  process.nextTick(firstHandler);
-
-  // receiver event handlers
-  self._receiver.ontext = function ontext(data, flags) {
-    flags = flags || {};
-
-    self.emit('message', data, flags);
-  };
-
-  self._receiver.onbinary = function onbinary(data, flags) {
-    flags = flags || {};
-
-    flags.binary = true;
-    self.emit('message', data, flags);
-  };
-
-  self._receiver.onping = function onping(data, flags) {
-    flags = flags || {};
-
-    self.pong(data, {
-      mask: !self._isServer,
-      binary: flags.binary === true
-    }, true);
-
-    self.emit('ping', data, flags);
-  };
-
-  self._receiver.onpong = function onpong(data, flags) {
-    self.emit('pong', data, flags || {});
-  };
-
-  self._receiver.onclose = function onclose(code, data, flags) {
-    flags = flags || {};
-
-    self._closeReceived = true;
-    self.close(code, data);
-  };
-
-  self._receiver.onerror = function onerror(reason, errorCode) {
-    // close the connection when the receiver reports a HyBi error code
-    self.close(typeof errorCode !== 'undefined' ? errorCode : 1002, '');
-    self.emit('error', reason, errorCode);
-  };
-
-  // finalize the client
-  this._sender = new SenderClass(socket, this.extensions);
-  this._sender.on('error', function onerror(error) {
-    self.close(1002, '');
-    self.emit('error', error);
-  });
-
-  this.readyState = WebSocket.OPEN;
-  this.emit('open');
-}
-
-function startQueue(instance) {
-  instance._queue = instance._queue || [];
-}
-
-function executeQueueSends(instance) {
-  var queue = instance._queue;
-  if (typeof queue === 'undefined') return;
-
-  delete instance._queue;
-  for (var i = 0, l = queue.length; i < l; ++i) {
-    queue[i]();
-  }
-}
-
-function sendStream(instance, stream, options, cb) {
-  stream.on('data', function incoming(data) {
-    if (instance.readyState !== WebSocket.OPEN) {
-      if (typeof cb === 'function') cb(new Error('not opened'));
-      else {
-        delete instance._queue;
-        instance.emit('error', new Error('not opened'));
-      }
-      return;
-    }
-
-    options.fin = false;
-    instance._sender.send(data, options);
-  });
-
-  stream.on('end', function end() {
-    if (instance.readyState !== WebSocket.OPEN) {
-      if (typeof cb === 'function') cb(new Error('not opened'));
-      else {
-        delete instance._queue;
-        instance.emit('error', new Error('not opened'));
-      }
-      return;
-    }
-
-    options.fin = true;
-    instance._sender.send(null, options);
-
-    if (typeof cb === 'function') cb(null);
-  });
-}
-
-function cleanupWebsocketResources(error) {
-  if (this.readyState === WebSocket.CLOSED) return;
-
-  var emitClose = this.readyState !== WebSocket.CONNECTING;
-  this.readyState = WebSocket.CLOSED;
-
-  clearTimeout(this._closeTimer);
-  this._closeTimer = null;
-
-  if (emitClose) {
-    // If the connection was closed abnormally (with an error), or if
-    // the close control frame was not received then the close code
-    // must default to 1006.
-    if (error || !this._closeReceived) {
-      this._closeCode = 1006;
-    }
-    this.emit('close', this._closeCode || 1000, this._closeMessage || '');
-  }
-
-  if (this._socket) {
-    if (this._ultron) this._ultron.destroy();
-    this._socket.on('error', function onerror() {
-      try { this.destroy(); }
-      catch (e) {}
-    });
-
-    try {
-      if (!error) this._socket.end();
-      else this._socket.destroy();
-    } catch (e) { /* Ignore termination errors */ }
-
-    this._socket = null;
-    this._ultron = null;
-  }
-
-  if (this._sender) {
-    this._sender.removeAllListeners();
-    this._sender = null;
-  }
-
-  if (this._receiver) {
-    this._receiver.cleanup();
-    this._receiver = null;
-  }
-
-  if (this.extensions[PerMessageDeflate.extensionName]) {
-    this.extensions[PerMessageDeflate.extensionName].cleanup();
-  }
-
-  this.extensions = null;
-
-  this.removeAllListeners();
-  this.on('error', function onerror() {}); // catch all errors after this
-  delete this._queue;
-}
diff --git a/js/node_modules/ws/lib/WebSocketServer.js b/js/node_modules/ws/lib/WebSocketServer.js
deleted file mode 100644
index ba0e4c050bb3a00e059f56f86be78bae2578e42a..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/lib/WebSocketServer.js
+++ /dev/null
@@ -1,513 +0,0 @@
-/*!
- * ws: a node.js websocket client
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-var util = require('util')
-  , events = require('events')
-  , http = require('http')
-  , crypto = require('crypto')
-  , Options = require('options')
-  , WebSocket = require('./WebSocket')
-  , Extensions = require('./Extensions')
-  , PerMessageDeflate = require('./PerMessageDeflate')
-  , tls = require('tls')
-  , url = require('url');
-
-/**
- * WebSocket Server implementation
- */
-
-function WebSocketServer(options, callback) {
-  if (this instanceof WebSocketServer === false) {
-    return new WebSocketServer(options, callback);
-  }
-
-  events.EventEmitter.call(this);
-
-  options = new Options({
-    host: '0.0.0.0',
-    port: null,
-    server: null,
-    verifyClient: null,
-    handleProtocols: null,
-    path: null,
-    noServer: false,
-    disableHixie: false,
-    clientTracking: true,
-    perMessageDeflate: true
-  }).merge(options);
-
-  if (!options.isDefinedAndNonNull('port') && !options.isDefinedAndNonNull('server') && !options.value.noServer) {
-    throw new TypeError('`port` or a `server` must be provided');
-  }
-
-  var self = this;
-
-  if (options.isDefinedAndNonNull('port')) {
-    this._server = http.createServer(function (req, res) {
-      var body = http.STATUS_CODES[426];
-      res.writeHead(426, {
-        'Content-Length': body.length,
-        'Content-Type': 'text/plain'
-      });
-      res.end(body);
-    });
-    this._server.allowHalfOpen = false;
-    this._server.listen(options.value.port, options.value.host, callback);
-    this._closeServer = function() { if (self._server) self._server.close(); };
-  }
-  else if (options.value.server) {
-    this._server = options.value.server;
-    if (options.value.path) {
-      // take note of the path, to avoid collisions when multiple websocket servers are
-      // listening on the same http server
-      if (this._server._webSocketPaths && options.value.server._webSocketPaths[options.value.path]) {
-        throw new Error('two instances of WebSocketServer cannot listen on the same http server path');
-      }
-      if (typeof this._server._webSocketPaths !== 'object') {
-        this._server._webSocketPaths = {};
-      }
-      this._server._webSocketPaths[options.value.path] = 1;
-    }
-  }
-  if (this._server) this._server.once('listening', function() { self.emit('listening'); });
-
-  if (typeof this._server != 'undefined') {
-    this._server.on('error', function(error) {
-      self.emit('error', error)
-    });
-    this._server.on('upgrade', function(req, socket, upgradeHead) {
-      //copy upgradeHead to avoid retention of large slab buffers used in node core
-      var head = new Buffer(upgradeHead.length);
-      upgradeHead.copy(head);
-
-      self.handleUpgrade(req, socket, head, function(client) {
-        self.emit('connection'+req.url, client);
-        self.emit('connection', client);
-      });
-    });
-  }
-
-  this.options = options.value;
-  this.path = options.value.path;
-  this.clients = [];
-}
-
-/**
- * Inherits from EventEmitter.
- */
-
-util.inherits(WebSocketServer, events.EventEmitter);
-
-/**
- * Immediately shuts down the connection.
- *
- * @api public
- */
-
-WebSocketServer.prototype.close = function(callback) {
-  // terminate all associated clients
-  var error = null;
-  try {
-    for (var i = 0, l = this.clients.length; i < l; ++i) {
-      this.clients[i].terminate();
-    }
-  }
-  catch (e) {
-    error = e;
-  }
-
-  // remove path descriptor, if any
-  if (this.path && this._server._webSocketPaths) {
-    delete this._server._webSocketPaths[this.path];
-    if (Object.keys(this._server._webSocketPaths).length == 0) {
-      delete this._server._webSocketPaths;
-    }
-  }
-
-  // close the http server if it was internally created
-  try {
-    if (typeof this._closeServer !== 'undefined') {
-      this._closeServer();
-    }
-  }
-  finally {
-    delete this._server;
-  }
-  if(callback)
-    callback(error);
-  else if(error)
-    throw error;
-}
-
-/**
- * Handle a HTTP Upgrade request.
- *
- * @api public
- */
-
-WebSocketServer.prototype.handleUpgrade = function(req, socket, upgradeHead, cb) {
-  // check for wrong path
-  if (this.options.path) {
-    var u = url.parse(req.url);
-    if (u && u.pathname !== this.options.path) return;
-  }
-
-  if (typeof req.headers.upgrade === 'undefined' || req.headers.upgrade.toLowerCase() !== 'websocket') {
-    abortConnection(socket, 400, 'Bad Request');
-    return;
-  }
-
-  if (req.headers['sec-websocket-key1']) handleHixieUpgrade.apply(this, arguments);
-  else handleHybiUpgrade.apply(this, arguments);
-}
-
-module.exports = WebSocketServer;
-
-/**
- * Entirely private apis,
- * which may or may not be bound to a sepcific WebSocket instance.
- */
-
-function handleHybiUpgrade(req, socket, upgradeHead, cb) {
-  // handle premature socket errors
-  var errorHandler = function() {
-    try { socket.destroy(); } catch (e) {}
-  }
-  socket.on('error', errorHandler);
-
-  // verify key presence
-  if (!req.headers['sec-websocket-key']) {
-    abortConnection(socket, 400, 'Bad Request');
-    return;
-  }
-
-  // verify version
-  var version = parseInt(req.headers['sec-websocket-version']);
-  if ([8, 13].indexOf(version) === -1) {
-    abortConnection(socket, 400, 'Bad Request');
-    return;
-  }
-
-  // verify protocol
-  var protocols = req.headers['sec-websocket-protocol'];
-
-  // verify client
-  var origin = version < 13 ?
-    req.headers['sec-websocket-origin'] :
-    req.headers['origin'];
-
-  // handle extensions offer
-  var extensionsOffer = Extensions.parse(req.headers['sec-websocket-extensions']);
-
-  // handler to call when the connection sequence completes
-  var self = this;
-  var completeHybiUpgrade2 = function(protocol) {
-
-    // calc key
-    var key = req.headers['sec-websocket-key'];
-    var shasum = crypto.createHash('sha1');
-    shasum.update(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
-    key = shasum.digest('base64');
-
-    var headers = [
-        'HTTP/1.1 101 Switching Protocols'
-      , 'Upgrade: websocket'
-      , 'Connection: Upgrade'
-      , 'Sec-WebSocket-Accept: ' + key
-    ];
-
-    if (typeof protocol != 'undefined') {
-      headers.push('Sec-WebSocket-Protocol: ' + protocol);
-    }
-
-    var extensions = {};
-    try {
-      extensions = acceptExtensions.call(self, extensionsOffer);
-    } catch (err) {
-      abortConnection(socket, 400, 'Bad Request');
-      return;
-    }
-
-    if (Object.keys(extensions).length) {
-      var serverExtensions = {};
-      Object.keys(extensions).forEach(function(token) {
-        serverExtensions[token] = [extensions[token].params]
-      });
-      headers.push('Sec-WebSocket-Extensions: ' + Extensions.format(serverExtensions));
-    }
-
-    // allows external modification/inspection of handshake headers
-    self.emit('headers', headers);
-
-    socket.setTimeout(0);
-    socket.setNoDelay(true);
-    try {
-      socket.write(headers.concat('', '').join('\r\n'));
-    }
-    catch (e) {
-      // if the upgrade write fails, shut the connection down hard
-      try { socket.destroy(); } catch (e) {}
-      return;
-    }
-
-    var client = new WebSocket([req, socket, upgradeHead], {
-      protocolVersion: version,
-      protocol: protocol,
-      extensions: extensions
-    });
-
-    if (self.options.clientTracking) {
-      self.clients.push(client);
-      client.on('close', function() {
-        var index = self.clients.indexOf(client);
-        if (index != -1) {
-          self.clients.splice(index, 1);
-        }
-      });
-    }
-
-    // signal upgrade complete
-    socket.removeListener('error', errorHandler);
-    cb(client);
-  }
-
-  // optionally call external protocol selection handler before
-  // calling completeHybiUpgrade2
-  var completeHybiUpgrade1 = function() {
-    // choose from the sub-protocols
-    if (typeof self.options.handleProtocols == 'function') {
-        var protList = (protocols || "").split(/, */);
-        var callbackCalled = false;
-        var res = self.options.handleProtocols(protList, function(result, protocol) {
-          callbackCalled = true;
-          if (!result) abortConnection(socket, 401, 'Unauthorized');
-          else completeHybiUpgrade2(protocol);
-        });
-        if (!callbackCalled) {
-            // the handleProtocols handler never called our callback
-            abortConnection(socket, 501, 'Could not process protocols');
-        }
-        return;
-    } else {
-        if (typeof protocols !== 'undefined') {
-            completeHybiUpgrade2(protocols.split(/, */)[0]);
-        }
-        else {
-            completeHybiUpgrade2();
-        }
-    }
-  }
-
-  // optionally call external client verification handler
-  if (typeof this.options.verifyClient == 'function') {
-    var info = {
-      origin: origin,
-      secure: typeof req.connection.authorized !== 'undefined' || typeof req.connection.encrypted !== 'undefined',
-      req: req
-    };
-    if (this.options.verifyClient.length == 2) {
-      this.options.verifyClient(info, function(result, code, name) {
-        if (typeof code === 'undefined') code = 401;
-        if (typeof name === 'undefined') name = http.STATUS_CODES[code];
-
-        if (!result) abortConnection(socket, code, name);
-        else completeHybiUpgrade1();
-      });
-      return;
-    }
-    else if (!this.options.verifyClient(info)) {
-      abortConnection(socket, 401, 'Unauthorized');
-      return;
-    }
-  }
-
-  completeHybiUpgrade1();
-}
-
-function handleHixieUpgrade(req, socket, upgradeHead, cb) {
-  // handle premature socket errors
-  var errorHandler = function() {
-    try { socket.destroy(); } catch (e) {}
-  }
-  socket.on('error', errorHandler);
-
-  // bail if options prevent hixie
-  if (this.options.disableHixie) {
-    abortConnection(socket, 401, 'Hixie support disabled');
-    return;
-  }
-
-  // verify key presence
-  if (!req.headers['sec-websocket-key2']) {
-    abortConnection(socket, 400, 'Bad Request');
-    return;
-  }
-
-  var origin = req.headers['origin']
-    , self = this;
-
-  // setup handshake completion to run after client has been verified
-  var onClientVerified = function() {
-    var wshost;
-    if (!req.headers['x-forwarded-host'])
-        wshost = req.headers.host;
-    else
-        wshost = req.headers['x-forwarded-host'];
-    var location = ((req.headers['x-forwarded-proto'] === 'https' || socket.encrypted) ? 'wss' : 'ws') + '://' + wshost + req.url
-      , protocol = req.headers['sec-websocket-protocol'];
-
-    // handshake completion code to run once nonce has been successfully retrieved
-    var completeHandshake = function(nonce, rest) {
-      // calculate key
-      var k1 = req.headers['sec-websocket-key1']
-        , k2 = req.headers['sec-websocket-key2']
-        , md5 = crypto.createHash('md5');
-
-      [k1, k2].forEach(function (k) {
-        var n = parseInt(k.replace(/[^\d]/g, ''))
-          , spaces = k.replace(/[^ ]/g, '').length;
-        if (spaces === 0 || n % spaces !== 0){
-          abortConnection(socket, 400, 'Bad Request');
-          return;
-        }
-        n /= spaces;
-        md5.update(String.fromCharCode(
-          n >> 24 & 0xFF,
-          n >> 16 & 0xFF,
-          n >> 8  & 0xFF,
-          n       & 0xFF));
-      });
-      md5.update(nonce.toString('binary'));
-
-      var headers = [
-          'HTTP/1.1 101 Switching Protocols'
-        , 'Upgrade: WebSocket'
-        , 'Connection: Upgrade'
-        , 'Sec-WebSocket-Location: ' + location
-      ];
-      if (typeof protocol != 'undefined') headers.push('Sec-WebSocket-Protocol: ' + protocol);
-      if (typeof origin != 'undefined') headers.push('Sec-WebSocket-Origin: ' + origin);
-
-      socket.setTimeout(0);
-      socket.setNoDelay(true);
-      try {
-        // merge header and hash buffer
-        var headerBuffer = new Buffer(headers.concat('', '').join('\r\n'));
-        var hashBuffer = new Buffer(md5.digest('binary'), 'binary');
-        var handshakeBuffer = new Buffer(headerBuffer.length + hashBuffer.length);
-        headerBuffer.copy(handshakeBuffer, 0);
-        hashBuffer.copy(handshakeBuffer, headerBuffer.length);
-
-        // do a single write, which - upon success - causes a new client websocket to be setup
-        socket.write(handshakeBuffer, 'binary', function(err) {
-          if (err) return; // do not create client if an error happens
-          var client = new WebSocket([req, socket, rest], {
-            protocolVersion: 'hixie-76',
-            protocol: protocol
-          });
-          if (self.options.clientTracking) {
-            self.clients.push(client);
-            client.on('close', function() {
-              var index = self.clients.indexOf(client);
-              if (index != -1) {
-                self.clients.splice(index, 1);
-              }
-            });
-          }
-
-          // signal upgrade complete
-          socket.removeListener('error', errorHandler);
-          cb(client);
-        });
-      }
-      catch (e) {
-        try { socket.destroy(); } catch (e) {}
-        return;
-      }
-    }
-
-    // retrieve nonce
-    var nonceLength = 8;
-    if (upgradeHead && upgradeHead.length >= nonceLength) {
-      var nonce = upgradeHead.slice(0, nonceLength);
-      var rest = upgradeHead.length > nonceLength ? upgradeHead.slice(nonceLength) : null;
-      completeHandshake.call(self, nonce, rest);
-    }
-    else {
-      // nonce not present in upgradeHead, so we must wait for enough data
-      // data to arrive before continuing
-      var nonce = new Buffer(nonceLength);
-      upgradeHead.copy(nonce, 0);
-      var received = upgradeHead.length;
-      var rest = null;
-      var handler = function (data) {
-        var toRead = Math.min(data.length, nonceLength - received);
-        if (toRead === 0) return;
-        data.copy(nonce, received, 0, toRead);
-        received += toRead;
-        if (received == nonceLength) {
-          socket.removeListener('data', handler);
-          if (toRead < data.length) rest = data.slice(toRead);
-          completeHandshake.call(self, nonce, rest);
-        }
-      }
-      socket.on('data', handler);
-    }
-  }
-
-  // verify client
-  if (typeof this.options.verifyClient == 'function') {
-    var info = {
-      origin: origin,
-      secure: typeof req.connection.authorized !== 'undefined' || typeof req.connection.encrypted !== 'undefined',
-      req: req
-    };
-    if (this.options.verifyClient.length == 2) {
-      var self = this;
-      this.options.verifyClient(info, function(result, code, name) {
-        if (typeof code === 'undefined') code = 401;
-        if (typeof name === 'undefined') name = http.STATUS_CODES[code];
-
-        if (!result) abortConnection(socket, code, name);
-        else onClientVerified.apply(self);
-      });
-      return;
-    }
-    else if (!this.options.verifyClient(info)) {
-      abortConnection(socket, 401, 'Unauthorized');
-      return;
-    }
-  }
-
-  // no client verification required
-  onClientVerified();
-}
-
-function acceptExtensions(offer) {
-  var extensions = {};
-  var options = this.options.perMessageDeflate;
-  if (options && offer[PerMessageDeflate.extensionName]) {
-    var perMessageDeflate = new PerMessageDeflate(options !== true ? options : {}, true);
-    perMessageDeflate.accept(offer[PerMessageDeflate.extensionName]);
-    extensions[PerMessageDeflate.extensionName] = perMessageDeflate;
-  }
-  return extensions;
-}
-
-function abortConnection(socket, code, name) {
-  try {
-    var response = [
-      'HTTP/1.1 ' + code + ' ' + name,
-      'Content-type: text/html'
-    ];
-    socket.write(response.concat('', '').join('\r\n'));
-  }
-  catch (e) { /* ignore errors - we've aborted this connection */ }
-  finally {
-    // ensure that an early aborted connection is shut down completely
-    try { socket.destroy(); } catch (e) {}
-  }
-}
diff --git a/js/node_modules/ws/node_modules/options/.npmignore b/js/node_modules/ws/node_modules/options/.npmignore
deleted file mode 100644
index 1b18fb395abf82ea95cf29c79c2b015bed126e0a..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/options/.npmignore
+++ /dev/null
@@ -1,7 +0,0 @@
-npm-debug.log
-node_modules
-.*.swp
-.lock-*
-build/
-
-test
diff --git a/js/node_modules/ws/node_modules/options/Makefile b/js/node_modules/ws/node_modules/options/Makefile
deleted file mode 100644
index 7496b6fcc5008519c078985a624fac04b6e9e285..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/options/Makefile
+++ /dev/null
@@ -1,12 +0,0 @@
-ALL_TESTS = $(shell find test/ -name '*.test.js')
-
-run-tests:
-	@./node_modules/.bin/mocha \
-		-t 2000 \
-		$(TESTFLAGS) \
-		$(TESTS)
-
-test:
-	@$(MAKE) NODE_PATH=lib TESTS="$(ALL_TESTS)" run-tests
-
-.PHONY: test
diff --git a/js/node_modules/ws/node_modules/options/README.md b/js/node_modules/ws/node_modules/options/README.md
deleted file mode 100644
index 0dabc7551c4fb3f756fd8b7a7a178a26c1d8952d..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/options/README.md
+++ /dev/null
@@ -1,69 +0,0 @@
-# options.js #
-
-A very light-weight in-code option parsers for node.js.
-
-## Usage ##
-
-``` js
-var Options = require("options");
-
-// Create an Options object
-function foo(options) {
-        var default_options = {
-                foo : "bar"
-        };
-        
-        // Create an option object with default value
-        var opts = new Options(default_options);
-        
-        // Merge options
-        opts = opts.merge(options);
-        
-        // Reset to default value
-        opts.reset();
-        
-        // Copy selected attributes out
-        var seled_att = opts.copy("foo");
-        
-        // Read json options from a file. 
-        opts.read("options.file"); // Sync
-        opts.read("options.file", function(err){ // Async
-                if(err){ // If error occurs
-                        console.log("File error.");
-                }else{
-                        // No error
-                }
-        });
-        
-        // Attributes defined or not
-        opts.isDefinedAndNonNull("foobar");
-        opts.isDefined("foobar");
-}
-
-```
-
-
-## License ##
-
-(The MIT License)
-
-Copyright (c) 2012 Einar Otto Stangvik &lt;einaros@gmail.com&gt;
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/js/node_modules/ws/node_modules/options/lib/options.js b/js/node_modules/ws/node_modules/options/lib/options.js
deleted file mode 100644
index 4fc45e90a8c90bc27ed7ab9c064c095c79b2051e..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/options/lib/options.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/*!
- * Copyright(c) 2011 Einar Otto Stangvik <einaros@gmail.com>
- * MIT Licensed
- */
-
-var fs = require('fs');
-
-function Options(defaults) {
-  var internalValues = {};
-  var values = this.value = {};
-  Object.keys(defaults).forEach(function(key) {
-    internalValues[key] = defaults[key];
-    Object.defineProperty(values, key, {
-      get: function() { return internalValues[key]; },
-      configurable: false,
-      enumerable: true
-    });
-  });
-  this.reset = function() {
-    Object.keys(defaults).forEach(function(key) {
-      internalValues[key] = defaults[key];
-    });
-    return this;
-  };
-  this.merge = function(options, required) {
-    options = options || {};
-    if (Object.prototype.toString.call(required) === '[object Array]') {
-      var missing = [];
-      for (var i = 0, l = required.length; i < l; ++i) {
-        var key = required[i];
-        if (!(key in options)) {
-          missing.push(key);
-        }
-      }
-      if (missing.length > 0) {
-        if (missing.length > 1) {
-          throw new Error('options ' +
-            missing.slice(0, missing.length - 1).join(', ') + ' and ' +
-            missing[missing.length - 1] + ' must be defined');
-        }
-        else throw new Error('option ' + missing[0] + ' must be defined');
-      }
-    }
-    Object.keys(options).forEach(function(key) {
-      if (key in internalValues) {
-        internalValues[key] = options[key];
-      }
-    });
-    return this;
-  };
-  this.copy = function(keys) {
-    var obj = {};
-    Object.keys(defaults).forEach(function(key) {
-      if (keys.indexOf(key) !== -1) {
-        obj[key] = values[key];
-      }
-    });
-    return obj;
-  };
-  this.read = function(filename, cb) {
-    if (typeof cb == 'function') {
-      var self = this;
-      fs.readFile(filename, function(error, data) {
-        if (error) return cb(error);
-        var conf = JSON.parse(data);
-        self.merge(conf);
-        cb();
-      });
-    }
-    else {
-      var conf = JSON.parse(fs.readFileSync(filename));
-      this.merge(conf);
-    }
-    return this;
-  };
-  this.isDefined = function(key) {
-    return typeof values[key] != 'undefined';
-  };
-  this.isDefinedAndNonNull = function(key) {
-    return typeof values[key] != 'undefined' && values[key] !== null;
-  };
-  Object.freeze(values);
-  Object.freeze(this);
-}
-
-module.exports = Options;
diff --git a/js/node_modules/ws/node_modules/options/package.json b/js/node_modules/ws/node_modules/options/package.json
deleted file mode 100644
index 8c9e173dda72a8b3694d07cb53fead0144d522dd..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/options/package.json
+++ /dev/null
@@ -1,50 +0,0 @@
-{
-  "author": {
-    "name": "Einar Otto Stangvik",
-    "email": "einaros@gmail.com",
-    "url": "http://2x.io"
-  },
-  "name": "options",
-  "description": "A very light-weight in-code option parsers for node.js.",
-  "version": "0.0.6",
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/einaros/options.js.git"
-  },
-  "main": "lib/options",
-  "scripts": {
-    "test": "make test"
-  },
-  "engines": {
-    "node": ">=0.4.0"
-  },
-  "dependencies": {},
-  "devDependencies": {
-    "mocha": "latest"
-  },
-  "gitHead": "ff53d0a092c897cb95964232a96fe17da65c11af",
-  "bugs": {
-    "url": "https://github.com/einaros/options.js/issues"
-  },
-  "homepage": "https://github.com/einaros/options.js",
-  "_id": "options@0.0.6",
-  "_shasum": "ec22d312806bb53e731773e7cdaefcf1c643128f",
-  "_from": "options@>=0.0.5",
-  "_npmVersion": "1.4.21",
-  "_npmUser": {
-    "name": "einaros",
-    "email": "einaros@gmail.com"
-  },
-  "maintainers": [
-    {
-      "name": "einaros",
-      "email": "einaros@gmail.com"
-    }
-  ],
-  "dist": {
-    "shasum": "ec22d312806bb53e731773e7cdaefcf1c643128f",
-    "tarball": "http://registry.npmjs.org/options/-/options-0.0.6.tgz"
-  },
-  "directories": {},
-  "_resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz"
-}
diff --git a/js/node_modules/ws/node_modules/ultron/.npmignore b/js/node_modules/ws/node_modules/ultron/.npmignore
deleted file mode 100644
index 66210a2a6e98c945d6e5569eeb76a99aef87ca07..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/ultron/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-node_modules
-coverage
-.tern-port
diff --git a/js/node_modules/ws/node_modules/ultron/.travis.yml b/js/node_modules/ws/node_modules/ultron/.travis.yml
deleted file mode 100644
index a505004be97cb46491c3caf571ac907cae296253..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/ultron/.travis.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-sudo: false
-language: node_js
-node_js:
-  - "0.12"
-  - "0.10"
-  - "0.8"
-  - "iojs"
-before_install:
-  - 'if [ "${TRAVIS_NODE_VERSION}" == "0.8" ]; then npm install -g npm@2.11.1; fi'
-script:
-  - "npm run test-travis"
-after_script:
-  - "npm install coveralls@2.11.x && cat coverage/lcov.info | coveralls"
-matrix:
-  fast_finish: true
-notifications:
-  irc:
-    channels:
-      - "irc.freenode.org#unshift"
-    on_success: change
-    on_failure: change
diff --git a/js/node_modules/ws/node_modules/ultron/LICENSE b/js/node_modules/ws/node_modules/ultron/LICENSE
deleted file mode 100644
index 6dc9316a6c92f2782c0bcf29951bf2a704524277..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/ultron/LICENSE
+++ /dev/null
@@ -1,22 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2015 Unshift.io, Arnout Kazemier,  the Contributors.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
-
diff --git a/js/node_modules/ws/node_modules/ultron/README.md b/js/node_modules/ws/node_modules/ultron/README.md
deleted file mode 100644
index 84fa3f2387bd0674cfab883e8202a32bc6aa1508..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/ultron/README.md
+++ /dev/null
@@ -1,97 +0,0 @@
-# Ultron
-
-[![Made by unshift](https://img.shields.io/badge/made%20by-unshift-00ffcc.svg?style=flat-square)](http://unshift.io)[![Version npm](http://img.shields.io/npm/v/ultron.svg?style=flat-square)](http://browsenpm.org/package/ultron)[![Build Status](http://img.shields.io/travis/unshiftio/ultron/master.svg?style=flat-square)](https://travis-ci.org/unshiftio/ultron)[![Dependencies](https://img.shields.io/david/unshiftio/ultron.svg?style=flat-square)](https://david-dm.org/unshiftio/ultron)[![Coverage Status](http://img.shields.io/coveralls/unshiftio/ultron/master.svg?style=flat-square)](https://coveralls.io/r/unshiftio/ultron?branch=master)[![IRC channel](http://img.shields.io/badge/IRC-irc.freenode.net%23unshift-00a8ff.svg?style=flat-square)](http://webchat.freenode.net/?channels=unshift)
-
-Ultron is a high-intelligence robot. It gathers intelligence so it can start
-improving upon his rudimentary design. It will learn your event emitting
-patterns and find ways to exterminate them. Allowing you to remove only the
-event emitters that **you** assigned and not the ones that your users or
-developers assigned. This can prevent race conditions, memory leaks and even file
-descriptor leaks from ever happening as you won't remove clean up processes.
-
-## Installation
-
-The module is designed to be used in browsers using browserify and in Node.js.
-You can install the module through the public npm registry by running the
-following command in CLI:
-
-```
-npm install --save ultron
-```
-
-## Usage
-
-In all examples we assume that you've required the library as following:
-
-```js
-'use strict';
-
-var Ultron = require('ultron');
-```
-
-Now that we've required the library we can construct our first `Ultron` instance.
-The constructor requires one argument which should be the `EventEmitter`
-instance that we need to operate upon. This can be the `EventEmitter` module
-that ships with Node.js or `EventEmitter3` or anything else as long as it
-follow the same API and internal structure as these 2. So with that in mind we
-can create the instance:
-
-```js
-//
-// For the sake of this example we're going to construct an empty EventEmitter
-//
-var EventEmitter = require('events').EventEmitter; // or require('eventmitter3');
-var events = new EventEmitter();
-
-var ultron = new Ultron(events);
-```
-
-You can now use the following API's from the Ultron instance:
-
-### Ultron.on
-
-Register a new event listener for the given event. It follows the exact same API
-as `EventEmitter.on` but it will return itself instead of returning the
-EventEmitter instance. If you are using EventEmitter3 it also supports the
-context param:
-
-```js
-ultron.on('event-name', handler, { custom: 'function context' });
-```
-
-### Ultron.once
-
-Exactly the same as the [Ultron.on](#ultronon) but it only allows the execution
-once.
-
-### Ultron.remove
-
-This is where all the magic happens and the safe removal starts. This function
-accepts different argument styles:
-
-- No arguments, assume that all events need to be removed so it will work as
-  `removeAllListeners()` API.
-- 1 argument, when it's a string it will be split on ` ` and `,` to create a
-  list of events that need to be cleared.
-- Multiple arguments, we assume that they are all names of events that need to
-  be cleared.
-
-```js
-ultron.remove('foo, bar baz');        // Removes foo, bar and baz.
-ultron.remove('foo', 'bar', 'baz');   // Removes foo, bar and baz.
-ultron.remove();                      // Removes everything.
-```
-
-If you just want to remove a single event listener using a function reference
-you can still use the EventEmitter's `removeListener(event, fn)` API:
-
-```js
-function foo() {}
-
-ulton.on('foo', foo);
-events.removeListener('foo', foo);
-```
-
-## License
-
-MIT
diff --git a/js/node_modules/ws/node_modules/ultron/index.js b/js/node_modules/ws/node_modules/ultron/index.js
deleted file mode 100644
index af17ab7ccb34c158654707e57015d4a4db812fb7..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/ultron/index.js
+++ /dev/null
@@ -1,129 +0,0 @@
-'use strict';
-
-var has = Object.prototype.hasOwnProperty;
-
-/**
- * An auto incrementing id which we can use to create "unique" Ultron instances
- * so we can track the event emitters that are added through the Ultron
- * interface.
- *
- * @type {Number}
- * @private
- */
-var id = 0;
-
-/**
- * Ultron is high-intelligence robot. It gathers intelligence so it can start improving
- * upon his rudimentary design. It will learn from your EventEmitting patterns
- * and exterminate them.
- *
- * @constructor
- * @param {EventEmitter} ee EventEmitter instance we need to wrap.
- * @api public
- */
-function Ultron(ee) {
-  if (!(this instanceof Ultron)) return new Ultron(ee);
-
-  this.id = id++;
-  this.ee = ee;
-}
-
-/**
- * Register a new EventListener for the given event.
- *
- * @param {String} event Name of the event.
- * @param {Functon} fn Callback function.
- * @param {Mixed} context The context of the function.
- * @returns {Ultron}
- * @api public
- */
-Ultron.prototype.on = function on(event, fn, context) {
-  fn.__ultron = this.id;
-  this.ee.on(event, fn, context);
-
-  return this;
-};
-/**
- * Add an EventListener that's only called once.
- *
- * @param {String} event Name of the event.
- * @param {Function} fn Callback function.
- * @param {Mixed} context The context of the function.
- * @returns {Ultron}
- * @api public
- */
-Ultron.prototype.once = function once(event, fn, context) {
-  fn.__ultron = this.id;
-  this.ee.once(event, fn, context);
-
-  return this;
-};
-
-/**
- * Remove the listeners we assigned for the given event.
- *
- * @returns {Ultron}
- * @api public
- */
-Ultron.prototype.remove = function remove() {
-  var args = arguments
-    , event;
-
-  //
-  // When no event names are provided we assume that we need to clear all the
-  // events that were assigned through us.
-  //
-  if (args.length === 1 && 'string' === typeof args[0]) {
-    args = args[0].split(/[, ]+/);
-  } else if (!args.length) {
-    args = [];
-
-    for (event in this.ee._events) {
-      if (has.call(this.ee._events, event)) args.push(event);
-    }
-  }
-
-  for (var i = 0; i < args.length; i++) {
-    var listeners = this.ee.listeners(args[i]);
-
-    for (var j = 0; j < listeners.length; j++) {
-      event = listeners[j];
-
-      //
-      // Once listeners have a `listener` property that stores the real listener
-      // in the EventEmitter that ships with Node.js.
-      //
-      if (event.listener) {
-        if (event.listener.__ultron !== this.id) continue;
-        delete event.listener.__ultron;
-      } else {
-        if (event.__ultron !== this.id) continue;
-        delete event.__ultron;
-      }
-
-      this.ee.removeListener(args[i], event);
-    }
-  }
-
-  return this;
-};
-
-/**
- * Destroy the Ultron instance, remove all listeners and release all references.
- *
- * @returns {Boolean}
- * @api public
- */
-Ultron.prototype.destroy = function destroy() {
-  if (!this.ee) return false;
-
-  this.remove();
-  this.ee = null;
-
-  return true;
-};
-
-//
-// Expose the module.
-//
-module.exports = Ultron;
diff --git a/js/node_modules/ws/node_modules/ultron/package.json b/js/node_modules/ws/node_modules/ultron/package.json
deleted file mode 100644
index 567452e81ace786858f76923b29a50199a57c0a5..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/ultron/package.json
+++ /dev/null
@@ -1,73 +0,0 @@
-{
-  "name": "ultron",
-  "version": "1.0.2",
-  "description": "Ultron is high-intelligence robot. It gathers intel so it can start improving upon his rudimentary design",
-  "main": "index.js",
-  "scripts": {
-    "100%": "istanbul check-coverage --statements 100 --functions 100 --lines 100 --branches 100",
-    "test": "mocha test.js",
-    "watch": "mocha --watch test.js",
-    "coverage": "istanbul cover ./node_modules/.bin/_mocha -- test.js",
-    "test-travis": "istanbul cover node_modules/.bin/_mocha --report lcovonly -- test.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/unshiftio/ultron.git"
-  },
-  "keywords": [
-    "Ultron",
-    "robot",
-    "gather",
-    "intelligence",
-    "event",
-    "events",
-    "eventemitter",
-    "emitter",
-    "cleanup"
-  ],
-  "author": {
-    "name": "Arnout Kazemier"
-  },
-  "license": "MIT",
-  "devDependencies": {
-    "assume": "1.2.x",
-    "eventemitter3": "1.1.x",
-    "istanbul": "0.3.x",
-    "mocha": "2.2.x",
-    "pre-commit": "1.0.x"
-  },
-  "bugs": {
-    "url": "https://github.com/unshiftio/ultron/issues"
-  },
-  "homepage": "https://github.com/unshiftio/ultron",
-  "gitHead": "a10482ae98a09120821545456c90c6d60d540f7c",
-  "_id": "ultron@1.0.2",
-  "_shasum": "ace116ab557cd197386a4e88f4685378c8b2e4fa",
-  "_from": "ultron@>=1.0.0 <1.1.0",
-  "_npmVersion": "2.9.1",
-  "_nodeVersion": "0.12.3",
-  "_npmUser": {
-    "name": "3rdeden",
-    "email": "npm@3rd-Eden.com"
-  },
-  "maintainers": [
-    {
-      "name": "unshift",
-      "email": "npm@unshift.io"
-    },
-    {
-      "name": "v1",
-      "email": "info@3rd-Eden.com"
-    },
-    {
-      "name": "3rdeden",
-      "email": "npm@3rd-Eden.com"
-    }
-  ],
-  "dist": {
-    "shasum": "ace116ab557cd197386a4e88f4685378c8b2e4fa",
-    "tarball": "http://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz"
-  },
-  "directories": {},
-  "_resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz"
-}
diff --git a/js/node_modules/ws/node_modules/ultron/test.js b/js/node_modules/ws/node_modules/ultron/test.js
deleted file mode 100644
index 1fd4f1bb5f6a8d023b9e8a1c3154d5fdde068f3d..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/node_modules/ultron/test.js
+++ /dev/null
@@ -1,327 +0,0 @@
-/* istanbul ignore next */
-describe('Ultron', function () {
-  'use strict';
-
-  var EventEmitter = require('eventemitter3')
-    , EE = require('events').EventEmitter
-    , assume = require('assume')
-    , Ultron = require('./')
-    , ultron
-    , ee;
-
-  beforeEach(function () {
-    ee = new EventEmitter();
-    ultron = new Ultron(ee);
-  });
-
-  afterEach(function () {
-    ultron.destroy();
-    ee.removeAllListeners();
-  });
-
-  it('is exposed as a function', function () {
-    assume(Ultron).is.a('function');
-  });
-
-  it('can be initialized without the new keyword', function () {
-    assume(Ultron(ee)).is.instanceOf(Ultron);
-  });
-
-  it('assigns a unique id to every instance', function () {
-    for (var i = 0; i < 100; i++) {
-      assume(ultron.id).does.not.equal((new Ultron()).id);
-    }
-  });
-
-  it('allows removal through the event emitter', function () {
-    function foo() {}
-    function bar() {}
-
-    ultron.on('foo', foo);
-    ultron.once('foo', bar);
-
-    assume(foo.__ultron).equals(ultron.id);
-    assume(bar.__ultron).equals(ultron.id);
-    assume(ee.listeners('foo').length).equals(2);
-
-    ee.removeListener('foo', foo);
-    assume(ee.listeners('foo').length).equals(1);
-
-    ee.removeListener('foo', bar);
-    assume(ee.listeners('foo').length).equals(0);
-  });
-
-  describe('#on', function () {
-    it('assigns a listener', function () {
-      assume(ee.listeners('foo').length).equals(0);
-
-      function foo() {}
-
-      ultron.on('foo', foo);
-      assume(ee.listeners('foo').length).equals(1);
-      assume(ee.listeners('foo')[0]).equals(foo);
-    });
-
-    it('tags the assigned function', function () {
-      assume(ee.listeners('foo').length).equals(0);
-
-      ultron.on('foo', function () {});
-      assume(ee.listeners('foo')[0].__ultron).equals(ultron.id);
-    });
-
-    it('also passes in the context', function (next) {
-      var context = 1313;
-
-      ultron.on('foo', function (a, b, c) {
-        assume(a).equals('a');
-        assume(b).equals('b');
-        assume(c).equals('c');
-
-        assume(this).equals(context);
-
-        next();
-      }, context);
-
-      ee.emit('foo', 'a', 'b', 'c');
-    });
-
-    it('works with regular eventemitters as well', function (next) {
-      var ee = new EE()
-        , ultron = new Ultron(ee);
-
-      ultron.on('foo', function (a, b, c) {
-        assume(a).equals('a');
-        assume(b).equals('b');
-        assume(c).equals('c');
-
-        next();
-      });
-
-      ee.emit('foo', 'a', 'b', 'c');
-    });
-  });
-
-  describe('#once', function () {
-    it('assigns a listener', function () {
-      assume(ee.listeners('foo').length).equals(0);
-
-      function foo() {}
-      ultron.once('foo', foo);
-      assume(ee.listeners('foo').length).equals(1);
-      assume(ee.listeners('foo')[0]).equals(foo);
-    });
-
-    it('tags the assigned function', function () {
-      assume(ee.listeners('foo').length).equals(0);
-
-      ultron.once('foo', function () {});
-      assume(ee.listeners('foo')[0].__ultron).equals(ultron.id);
-    });
-
-    it('also passes in the context', function (next) {
-      var context = 1313;
-
-      ultron.once('foo', function (a, b, c) {
-        assume(a).equals('a');
-        assume(b).equals('b');
-        assume(c).equals('c');
-
-        assume(this).equals(context);
-
-        next();
-      }, context);
-
-      ee.emit('foo', 'a', 'b', 'c');
-      ee.emit('foo', 'a', 'b', 'c'); // Ensure that we don't double execute
-    });
-
-    it('works with regular eventemitters as well', function (next) {
-      var ee = new EE()
-        , ultron = new Ultron(ee);
-
-      ultron.once('foo', function (a, b, c) {
-        assume(a).equals('a');
-        assume(b).equals('b');
-        assume(c).equals('c');
-
-        next();
-      });
-
-      ee.emit('foo', 'a', 'b', 'c');
-      ee.emit('foo', 'a', 'b', 'c'); // Ensure that we don't double execute
-    });
-  });
-
-  describe('#remove', function () {
-    it('removes only our assigned `on` listeners', function () {
-      function foo() {}
-      function bar() {}
-
-      ee.on('foo', foo);
-      ultron.on('foo', bar);
-      assume(ee.listeners('foo').length).equals(2);
-
-      ultron.remove('foo');
-      assume(ee.listeners('foo').length).equals(1);
-      assume(ee.listeners('foo')[0]).equals(foo);
-    });
-
-    it('removes our private __ultron references', function () {
-      function once() {}
-      function on() {}
-
-      assume('__ultron' in once).is.false();
-      assume('__ultron' in on).is.false();
-
-      ultron.on('foo', on);
-      ultron.once('bar', once);
-
-      assume('__ultron' in once).is.true();
-      assume('__ultron' in on).is.true();
-
-      ultron.remove('foo, bar');
-
-      assume('__ultron' in once).is.false();
-      assume('__ultron' in on).is.false();
-
-      ultron.destroy();
-
-      ee = new EE();
-      ultron = new Ultron(ee);
-
-      assume('__ultron' in once).is.false();
-      assume('__ultron' in on).is.false();
-
-      ultron.on('foo', on);
-      ultron.once('bar', once);
-
-      assume('__ultron' in once).is.true();
-      assume('__ultron' in on).is.true();
-
-      ultron.remove('foo, bar');
-
-      assume('__ultron' in once).is.false();
-      assume('__ultron' in on).is.false();
-    });
-
-    it('removes only our assigned `once` listeners', function () {
-      function foo() {}
-      function bar() {}
-
-      ee.once('foo', foo);
-      ultron.once('foo', bar);
-      assume(ee.listeners('foo').length).equals(2);
-
-      ultron.remove('foo');
-      assume(ee.listeners('foo').length).equals(1);
-      assume(ee.listeners('foo')[0]).equals(foo);
-    });
-
-    it('removes only our assigned `once` listeners from regular EE', function () {
-      var ee = new EE()
-        , ultron = new Ultron(ee);
-
-      function foo() {}
-      function bar() {}
-
-      ee.once('foo', foo);
-      ultron.once('foo', bar);
-      assume(ee.listeners('foo').length).equals(2);
-
-      ultron.remove('foo');
-      assume(ee.listeners('foo').length).equals(1);
-      assume(ee.listeners('foo')[0].listener).equals(foo);
-    });
-
-    it('removes all assigned events if called without args', function () {
-      function foo() {}
-      function bar() {}
-
-      ultron.on('foo', foo);
-      ultron.on('bar', bar);
-
-      assume(ee.listeners('foo').length).equals(1);
-      assume(ee.listeners('bar').length).equals(1);
-
-      ultron.remove();
-
-      assume(ee.listeners('foo').length).equals(0);
-      assume(ee.listeners('bar').length).equals(0);
-    });
-
-    it('removes multiple listeners based on args', function () {
-      function foo() {}
-      function bar() {}
-      function baz() {}
-
-      ultron.on('foo', foo);
-      ultron.on('bar', bar);
-      ultron.on('baz', baz);
-
-      assume(ee.listeners('foo').length).equals(1);
-      assume(ee.listeners('bar').length).equals(1);
-      assume(ee.listeners('baz').length).equals(1);
-
-      ultron.remove('foo', 'bar');
-
-      assume(ee.listeners('foo').length).equals(0);
-      assume(ee.listeners('bar').length).equals(0);
-      assume(ee.listeners('baz').length).equals(1);
-    });
-
-    it('removes multiple listeners if first arg is seperated string', function () {
-      function foo() {}
-      function bar() {}
-      function baz() {}
-
-      ultron.on('foo', foo);
-      ultron.on('bar', bar);
-      ultron.on('baz', baz);
-
-      assume(ee.listeners('foo').length).equals(1);
-      assume(ee.listeners('bar').length).equals(1);
-      assume(ee.listeners('baz').length).equals(1);
-
-      ultron.remove('foo, bar');
-
-      assume(ee.listeners('foo').length).equals(0);
-      assume(ee.listeners('bar').length).equals(0);
-      assume(ee.listeners('baz').length).equals(1);
-    });
-  });
-
-  describe('#destroy', function () {
-    it('removes all listeners', function () {
-      function foo() {}
-      function bar() {}
-      function baz() {}
-
-      ultron.on('foo', foo);
-      ultron.on('bar', bar);
-      ultron.on('baz', baz);
-
-      assume(ee.listeners('foo').length).equals(1);
-      assume(ee.listeners('bar').length).equals(1);
-      assume(ee.listeners('baz').length).equals(1);
-
-      ultron.destroy();
-
-      assume(ee.listeners('foo').length).equals(0);
-      assume(ee.listeners('bar').length).equals(0);
-      assume(ee.listeners('baz').length).equals(0);
-    });
-
-    it('removes the .ee reference', function () {
-      assume(ultron.ee).equals(ee);
-      ultron.destroy();
-      assume(ultron.ee).equals(null);
-    });
-
-    it('returns booleans for state indication', function () {
-      assume(ultron.destroy()).is.true();
-      assume(ultron.destroy()).is.false();
-      assume(ultron.destroy()).is.false();
-      assume(ultron.destroy()).is.false();
-    });
-  });
-});
diff --git a/js/node_modules/ws/package.json b/js/node_modules/ws/package.json
deleted file mode 100644
index ec02d3ad10e86208a641510cf088bfb0ccc9fb41..0000000000000000000000000000000000000000
--- a/js/node_modules/ws/package.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "author": {
-    "name": "Einar Otto Stangvik",
-    "email": "einaros@gmail.com",
-    "url": "http://2x.io"
-  },
-  "name": "ws",
-  "description": "simple to use, blazing fast and thoroughly tested websocket client, server and console for node.js, up-to-date against RFC-6455",
-  "version": "1.0.1",
-  "license": "MIT",
-  "keywords": [
-    "Hixie",
-    "HyBi",
-    "Push",
-    "RFC-6455",
-    "WebSocket",
-    "WebSockets",
-    "real-time"
-  ],
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/websockets/ws.git"
-  },
-  "scripts": {
-    "test": "make test"
-  },
-  "dependencies": {
-    "options": ">=0.0.5",
-    "ultron": "1.0.x"
-  },
-  "devDependencies": {
-    "ansi": "0.3.x",
-    "benchmark": "0.3.x",
-    "bufferutil": "1.2.x",
-    "expect.js": "0.3.x",
-    "mocha": "2.3.x",
-    "should": "8.0.x",
-    "tinycolor": "0.0.x",
-    "utf-8-validate": "1.2.x"
-  },
-  "gypfile": true,
-  "gitHead": "40a9d686288b5d0be13f2bf2f3f5da07afc8cda2",
-  "bugs": {
-    "url": "https://github.com/websockets/ws/issues"
-  },
-  "homepage": "https://github.com/websockets/ws#readme",
-  "_id": "ws@1.0.1",
-  "_shasum": "7d0b2a2e58cddd819039c29c9de65045e1b310e9",
-  "_from": "ws@*",
-  "_npmVersion": "3.5.1",
-  "_nodeVersion": "4.2.3",
-  "_npmUser": {
-    "name": "3rdeden",
-    "email": "npm@3rd-Eden.com"
-  },
-  "maintainers": [
-    {
-      "name": "einaros",
-      "email": "einaros@gmail.com"
-    },
-    {
-      "name": "v1",
-      "email": "info@3rd-Eden.com"
-    },
-    {
-      "name": "3rdeden",
-      "email": "npm@3rd-Eden.com"
-    }
-  ],
-  "dist": {
-    "shasum": "7d0b2a2e58cddd819039c29c9de65045e1b310e9",
-    "tarball": "http://registry.npmjs.org/ws/-/ws-1.0.1.tgz"
-  },
-  "directories": {},
-  "_resolved": "https://registry.npmjs.org/ws/-/ws-1.0.1.tgz"
-}