diff --git a/node_modules/to-regex/LICENSE b/node_modules/to-regex/LICENSE
new file mode 100644
index 0000000..7c9987b
--- /dev/null
+++ b/node_modules/to-regex/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016-2018, Jon Schlinkert.
+
+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/node_modules/to-regex/README.md b/node_modules/to-regex/README.md
new file mode 100644
index 0000000..5a28fc3
--- /dev/null
+++ b/node_modules/to-regex/README.md
@@ -0,0 +1,205 @@
+# to-regex [![NPM version](https://img.shields.io/npm/v/to-regex.svg?style=flat)](https://www.npmjs.com/package/to-regex) [![NPM monthly downloads](https://img.shields.io/npm/dm/to-regex.svg?style=flat)](https://npmjs.org/package/to-regex) [![NPM total downloads](https://img.shields.io/npm/dt/to-regex.svg?style=flat)](https://npmjs.org/package/to-regex) [![Linux Build Status](https://img.shields.io/travis/jonschlinkert/to-regex.svg?style=flat&label=Travis)](https://travis-ci.org/jonschlinkert/to-regex)
+
+> Generate a regex from a string or array of strings.
+
+Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support.
+
+- [Install](#install)
+- [Usage](#usage)
+- [Options](#options)
+  * [options.contains](#optionscontains)
+  * [options.negate](#optionsnegate)
+  * [options.nocase](#optionsnocase)
+  * [options.flags](#optionsflags)
+  * [options.cache](#optionscache)
+  * [options.safe](#optionssafe)
+- [About](#about)
+  * [Related projects](#related-projects)
+  * [Author](#author)
+  * [License](#license)
+
+_(TOC generated by [verb](https://github.com/verbose/verb) using [markdown-toc](https://github.com/jonschlinkert/markdown-toc))_
+
+## Install
+
+Install with [npm](https://www.npmjs.com/):
+
+```sh
+$ npm install --save to-regex
+```
+
+## Usage
+
+```js
+var toRegex = require('to-regex');
+
+console.log(toRegex('foo'));
+//=> /^(?:foo)$/
+
+console.log(toRegex('foo', {negate: true}));
+//=> /^(?:(?:(?!^(?:foo)$).)*)$/
+
+console.log(toRegex('foo', {contains: true}));
+//=> /(?:foo)/
+
+console.log(toRegex(['foo', 'bar'], {negate: true}));
+//=> /^(?:(?:(?!^(?:(?:foo)|(?:bar))$).)*)$/
+
+console.log(toRegex(['foo', 'bar'], {negate: true, contains: true}));
+//=> /^(?:(?:(?!(?:(?:foo)|(?:bar))).)*)$/
+```
+
+## Options
+
+### options.contains
+
+**Type**: `Boolean`
+
+**Default**: `undefined`
+
+Generate a regex that will match any string that _contains_ the given pattern. By default, regex is strict will only return true for exact matches.
+
+```js
+var toRegex = require('to-regex');
+console.log(toRegex('foo', {contains: true}));
+//=> /(?:foo)/
+```
+
+### options.negate
+
+**Type**: `Boolean`
+
+**Default**: `undefined`
+
+Create a regex that will match everything except the given pattern.
+
+```js
+var toRegex = require('to-regex');
+console.log(toRegex('foo', {negate: true}));
+//=> /^(?:(?:(?!^(?:foo)$).)*)$/
+```
+
+### options.nocase
+
+**Type**: `Boolean`
+
+**Default**: `undefined`
+
+Adds the `i` flag, to enable case-insensitive matching.
+
+```js
+var toRegex = require('to-regex');
+console.log(toRegex('foo', {nocase: true}));
+//=> /^(?:foo)$/i
+```
+
+Alternatively you can pass the flags you want directly on [options.flags](#options.flags).
+
+### options.flags
+
+**Type**: `String`
+
+**Default**: `undefined`
+
+Define the flags you want to use on the generated regex.
+
+```js
+var toRegex = require('to-regex');
+console.log(toRegex('foo', {flags: 'gm'}));
+//=> /^(?:foo)$/gm
+console.log(toRegex('foo', {flags: 'gmi', nocase: true})); //<= handles redundancy
+//=> /^(?:foo)$/gmi
+```
+
+### options.cache
+
+**Type**: `Boolean`
+
+**Default**: `true`
+
+Generated regex is cached based on the provided string and options. As a result, runtime compilation only happens once per pattern (as long as options are also the same), which can result in dramatic speed improvements.
+
+This also helps with debugging, since adding options and pattern are added to the generated regex.
+
+**Disable caching**
+
+```js
+toRegex('foo', {cache: false});
+```
+
+### options.safe
+
+**Type**: `Boolean`
+
+**Default**: `undefined`
+
+Check the generated regular expression with [safe-regex](https://github.com/substack/safe-regex) and throw an error if the regex is potentially unsafe.
+
+**Examples**
+
+```js
+console.log(toRegex('(x+x+)+y'));
+//=> /^(?:(x+x+)+y)$/
+
+// The following would throw an error
+toRegex('(x+x+)+y', {safe: true});
+```
+
+## About
+
+<details>
+<summary><strong>Contributing</strong></summary>
+
+Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new).
+
+</details>
+
+<details>
+<summary><strong>Running Tests</strong></summary>
+
+Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command:
+
+```sh
+$ npm install && npm test
+```
+
+</details>
+
+<details>
+<summary><strong>Building docs</strong></summary>
+
+_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_
+
+To generate the readme, run the following command:
+
+```sh
+$ npm install -g verbose/verb#dev verb-generate-readme && verb
+```
+
+</details>
+
+### Related projects
+
+You might also be interested in these projects:
+
+* [has-glob](https://www.npmjs.com/package/has-glob): Returns `true` if an array has a glob pattern. | [homepage](https://github.com/jonschlinkert/has-glob "Returns `true` if an array has a glob pattern.")
+* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet")
+* [path-regex](https://www.npmjs.com/package/path-regex): Regular expression for matching the parts of a file path. | [homepage](https://github.com/regexps/path-regex "Regular expression for matching the parts of a file path.")
+* [to-regex-range](https://www.npmjs.com/package/to-regex-range): Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than… [more](https://github.com/micromatch/to-regex-range) | [homepage](https://github.com/micromatch/to-regex-range "Pass two numbers, get a regex-compatible source string for matching ranges. Validated against more than 2.78 million test assertions.")
+
+### Author
+
+**Jon Schlinkert**
+
+* [linkedin/in/jonschlinkert](https://linkedin.com/in/jonschlinkert)
+* [github/jonschlinkert](https://github.com/jonschlinkert)
+* [twitter/jonschlinkert](https://twitter.com/jonschlinkert)
+
+### License
+
+Copyright © 2018, [Jon Schlinkert](https://github.com/jonschlinkert).
+Released under the [MIT License](LICENSE).
+
+***
+
+_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on February 24, 2018._
\ No newline at end of file
diff --git a/node_modules/to-regex/index.js b/node_modules/to-regex/index.js
new file mode 100644
index 0000000..a87d015
--- /dev/null
+++ b/node_modules/to-regex/index.js
@@ -0,0 +1,155 @@
+'use strict';
+
+var safe = require('safe-regex');
+var define = require('define-property');
+var extend = require('extend-shallow');
+var not = require('regex-not');
+var MAX_LENGTH = 1024 * 64;
+
+/**
+ * Session cache
+ */
+
+var cache = {};
+
+/**
+ * Create a regular expression from the given `pattern` string.
+ *
+ * @param {String|RegExp} `pattern` Pattern can be a string or regular expression.
+ * @param {Object} `options`
+ * @return {RegExp}
+ * @api public
+ */
+
+module.exports = function(patterns, options) {
+  if (!Array.isArray(patterns)) {
+    return makeRe(patterns, options);
+  }
+  return makeRe(patterns.join('|'), options);
+};
+
+/**
+ * Create a regular expression from the given `pattern` string.
+ *
+ * @param {String|RegExp} `pattern` Pattern can be a string or regular expression.
+ * @param {Object} `options`
+ * @return {RegExp}
+ * @api public
+ */
+
+function makeRe(pattern, options) {
+  if (pattern instanceof RegExp) {
+    return pattern;
+  }
+
+  if (typeof pattern !== 'string') {
+    throw new TypeError('expected a string');
+  }
+
+  if (pattern.length > MAX_LENGTH) {
+    throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters');
+  }
+
+  var key = pattern;
+  // do this before shallow cloning options, it's a lot faster
+  if (!options || (options && options.cache !== false)) {
+    key = createKey(pattern, options);
+
+    if (cache.hasOwnProperty(key)) {
+      return cache[key];
+    }
+  }
+
+  var opts = extend({}, options);
+  if (opts.contains === true) {
+    if (opts.negate === true) {
+      opts.strictNegate = false;
+    } else {
+      opts.strict = false;
+    }
+  }
+
+  if (opts.strict === false) {
+    opts.strictOpen = false;
+    opts.strictClose = false;
+  }
+
+  var open = opts.strictOpen !== false ? '^' : '';
+  var close = opts.strictClose !== false ? '$' : '';
+  var flags = opts.flags || '';
+  var regex;
+
+  if (opts.nocase === true && !/i/.test(flags)) {
+    flags += 'i';
+  }
+
+  try {
+    if (opts.negate || typeof opts.strictNegate === 'boolean') {
+      pattern = not.create(pattern, opts);
+    }
+
+    var str = open + '(?:' + pattern + ')' + close;
+    regex = new RegExp(str, flags);
+
+    if (opts.safe === true && safe(regex) === false) {
+      throw new Error('potentially unsafe regular expression: ' + regex.source);
+    }
+
+  } catch (err) {
+    if (opts.strictErrors === true || opts.safe === true) {
+      err.key = key;
+      err.pattern = pattern;
+      err.originalOptions = options;
+      err.createdOptions = opts;
+      throw err;
+    }
+
+    try {
+      regex = new RegExp('^' + pattern.replace(/(\W)/g, '\\$1') + '$');
+    } catch (err) {
+      regex = /.^/; //<= match nothing
+    }
+  }
+
+  if (opts.cache !== false) {
+    memoize(regex, key, pattern, opts);
+  }
+  return regex;
+}
+
+/**
+ * Memoize generated regex. This can result in dramatic speed improvements
+ * and simplify debugging by adding options and pattern to the regex. It can be
+ * disabled by passing setting `options.cache` to false.
+ */
+
+function memoize(regex, key, pattern, options) {
+  define(regex, 'cached', true);
+  define(regex, 'pattern', pattern);
+  define(regex, 'options', options);
+  define(regex, 'key', key);
+  cache[key] = regex;
+}
+
+/**
+ * Create the key to use for memoization. The key is generated
+ * by iterating over the options and concatenating key-value pairs
+ * to the pattern string.
+ */
+
+function createKey(pattern, options) {
+  if (!options) return pattern;
+  var key = pattern;
+  for (var prop in options) {
+    if (options.hasOwnProperty(prop)) {
+      key += ';' + prop + '=' + String(options[prop]);
+    }
+  }
+  return key;
+}
+
+/**
+ * Expose `makeRe`
+ */
+
+module.exports.makeRe = makeRe;
diff --git a/node_modules/to-regex/package.json b/node_modules/to-regex/package.json
new file mode 100644
index 0000000..f9e801c
--- /dev/null
+++ b/node_modules/to-regex/package.json
@@ -0,0 +1,97 @@
+{
+  "_from": "to-regex@^3.0.2",
+  "_id": "to-regex@3.0.2",
+  "_inBundle": false,
+  "_integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+  "_location": "/to-regex",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "to-regex@^3.0.2",
+    "name": "to-regex",
+    "escapedName": "to-regex",
+    "rawSpec": "^3.0.2",
+    "saveSpec": null,
+    "fetchSpec": "^3.0.2"
+  },
+  "_requiredBy": [
+    "/braces",
+    "/expand-brackets",
+    "/extglob",
+    "/micromatch",
+    "/nanomatch"
+  ],
+  "_resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+  "_shasum": "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce",
+  "_spec": "to-regex@^3.0.2",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\micromatch",
+  "author": {
+    "name": "Jon Schlinkert",
+    "url": "https://github.com/jonschlinkert"
+  },
+  "bugs": {
+    "url": "https://github.com/jonschlinkert/to-regex/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "define-property": "^2.0.2",
+    "extend-shallow": "^3.0.2",
+    "regex-not": "^1.0.2",
+    "safe-regex": "^1.1.0"
+  },
+  "deprecated": false,
+  "description": "Generate a regex from a string or array of strings.",
+  "devDependencies": {
+    "gulp-format-md": "^1.0.0",
+    "mocha": "^3.5.3"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "files": [
+    "index.js"
+  ],
+  "homepage": "https://github.com/jonschlinkert/to-regex",
+  "keywords": [
+    "match",
+    "regex",
+    "regular expression",
+    "test",
+    "to"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "to-regex",
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/jonschlinkert/to-regex.git"
+  },
+  "scripts": {
+    "test": "mocha"
+  },
+  "verb": {
+    "toc": {
+      "method": "preWrite"
+    },
+    "layout": "default",
+    "tasks": [
+      "readme"
+    ],
+    "plugins": [
+      "gulp-format-md"
+    ],
+    "related": {
+      "list": [
+        "has-glob",
+        "is-glob",
+        "path-regex",
+        "to-regex-range"
+      ]
+    },
+    "lint": {
+      "reflinks": true
+    }
+  },
+  "version": "3.0.2"
+}
