From 2e95c887f0a7c9e80f031062c982f3b1a04573a0 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Mon, 18 Nov 2019 16:40:21 +0800 Subject: [PATCH 01/34] Add upcoming release tag in Change log --- ChangeLog.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 8264d8881..37f8c5d39 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -2,6 +2,9 @@ > Note. This file includes changes after 3.0.0-preview. For legacy Azurite changes, please goto GitHub [releases](https://github.com/Azure/Azurite/releases). +Upcoming Release + + 2019.11 Version 3.3.0-preview - Azurite now supports customized account names and keys by environment variable `AZURITE_ACCOUNTS`. From 46db6c1ebd409acb6276316ca98303a8cd61a836 Mon Sep 17 00:00:00 2001 From: sangeetha5491 Date: Mon, 25 Nov 2019 07:57:57 +0530 Subject: [PATCH 02/34] List containers should be displayed in sorted order (#280) * list containers should be displayed in sorted order * delete containers at the end of test * address review comments and add unit tests * update ChangeLog.md * update ChangeLog.md * Update src/blob/persistence/LokiBlobMetadataStore.ts Co-Authored-By: xiaonlimsft * fix nextMarker for SQLBlobMetadataStore when result length is equal to max result * change assertions in 2 unit tests * fix formatting --- ChangeLog.md | 1 + src/blob/handlers/ServiceHandler.ts | 2 +- src/blob/persistence/IBlobMetadataStore.ts | 4 +- src/blob/persistence/LokiBlobMetadataStore.ts | 16 +-- src/blob/persistence/SqlBlobMetadataStore.ts | 18 +-- tests/blob/apis/service.test.ts | 109 ++++++++++++++++++ 6 files changed, 132 insertions(+), 18 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 37f8c5d39..c25bc7258 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,6 +4,7 @@ Upcoming Release +- Fixed a bug that to return the list of containers in sorted order. 2019.11 Version 3.3.0-preview diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index f06753c18..eff88729e 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -215,7 +215,7 @@ export default class ServiceHandler extends BaseHandler options.maxresults || DEFAULT_LIST_CONTAINERS_MAX_RESULTS; options.prefix = options.prefix || ""; - const marker = parseInt(options.marker || "0", 10); + const marker = options.marker || ""; const containers = await this.metadataStore.listContainers( context, diff --git a/src/blob/persistence/IBlobMetadataStore.ts b/src/blob/persistence/IBlobMetadataStore.ts index 99c002788..fc772ca9b 100644 --- a/src/blob/persistence/IBlobMetadataStore.ts +++ b/src/blob/persistence/IBlobMetadataStore.ts @@ -251,8 +251,8 @@ export interface IBlobMetadataStore account: string, prefix?: string, maxResults?: number, - marker?: number - ): Promise<[ContainerModel[], number | undefined]>; + marker?: string + ): Promise<[ContainerModel[], string | undefined]>; /** * Create a container. diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index e5033807b..6a74c93b9 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -293,8 +293,8 @@ export default class LokiBlobMetadataStore * @param {string} account * @param {string} [prefix=""] * @param {number} [maxResults=5000] - * @param {number} [marker=0] - * @returns {(Promise<[ContainerModel[], number | undefined]>)} + * @param {string} [marker=""] + * @returns {(Promise<[ContainerModel[], string | undefined]>)} * @memberof LokiBlobMetadataStore */ public async listContainers( @@ -302,16 +302,15 @@ export default class LokiBlobMetadataStore account: string, prefix: string = "", maxResults: number = DEFAULT_LIST_CONTAINERS_MAX_RESULTS, - marker: number = 0 - ): Promise<[ContainerModel[], number | undefined]> { + marker: string = "" + ): Promise<[ContainerModel[], string | undefined]> { const coll = this.db.getCollection(this.CONTAINERS_COLLECTION); const query = prefix === "" - ? { $loki: { $gt: marker }, accountName: account } + ? { name: { $gt: marker }, accountName: account } : { - name: { $regex: `^${this.escapeRegex(prefix)}` }, - $loki: { $gt: marker }, + name: { $regex: `^${this.escapeRegex(prefix)}`, $gt: marker }, accountName: account }; @@ -319,6 +318,7 @@ export default class LokiBlobMetadataStore .chain() .find(query) .limit(maxResults + 1) + .simplesort("name") .data(); if (docs.length <= maxResults) { @@ -333,7 +333,7 @@ export default class LokiBlobMetadataStore ]; } else { // In this case, the last item is the one we get in addition, should set the Marker before it. - const nextMarker = docs[docs.length - 1].$loki - 1; + const nextMarker = docs[docs.length - 2].name; docs.pop(); return [ docs.map(doc => { diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index 6c43c2749..e45dee23c 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -487,8 +487,8 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { account: string, prefix: string = "", maxResults: number = DEFAULT_LIST_CONTAINERS_MAX_RESULTS, - marker: number | undefined - ): Promise<[ContainerModel[], number | undefined]> { + marker: string + ): Promise<[ContainerModel[], string | undefined]> { const whereQuery: any = { accountName: account }; if (prefix.length > 0) { @@ -497,8 +497,8 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { }; } - if (marker !== undefined) { - whereQuery.containerId = { + if (marker !== "") { + whereQuery.containerName = { [Op.gt]: marker }; } @@ -506,7 +506,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { const findResult = await ContainersModel.findAll({ limit: maxResults, where: whereQuery as any, - order: [["containerId", "ASC"]] + order: [["containerName", "ASC"]] }); const leaseUpdateMapper = (model: ContainersModel) => { @@ -517,11 +517,15 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { ).sync(new ContainerLeaseSyncer(containerModel)); }; - if (findResult.length < maxResults) { + if (findResult.length <= maxResults) { return [findResult.map(leaseUpdateMapper), undefined]; } else { const tail = findResult[findResult.length - 1]; - const nextMarker = this.getModelValue(tail, "containerId", true); + const nextMarker = this.getModelValue( + tail, + "containerName", + true + ); return [findResult.map(leaseUpdateMapper), nextMarker]; } } diff --git a/tests/blob/apis/service.test.ts b/tests/blob/apis/service.test.ts index b751fd957..7b29ff8f9 100644 --- a/tests/blob/apis/service.test.ts +++ b/tests/blob/apis/service.test.ts @@ -142,6 +142,115 @@ describe("ServiceAPIs", () => { ); }); + it("List containers in sorted order", async () => { + const containerNamePostfix = getUniqueName("container"); + const containerName1 = `cc${containerNamePostfix}`; + const containerName2 = `aa${containerNamePostfix}`; + const containerName3 = `bb${containerNamePostfix}`; + const containerURL1 = ContainerURL.fromServiceURL( + serviceURL, + containerName1 + ); + const containerURL2 = ContainerURL.fromServiceURL( + serviceURL, + containerName2 + ); + const containerURL3 = ContainerURL.fromServiceURL( + serviceURL, + containerName3 + ); + await containerURL1.create(Aborter.none); + await containerURL2.create(Aborter.none); + await containerURL3.create(Aborter.none); + const result = await serviceURL.listContainersSegment( + Aborter.none, + undefined + ); + assert.equal(result.containerItems.length, 3); + assert.ok(result.containerItems[0].name.startsWith("aa")); + assert.ok(result.containerItems[1].name.startsWith("bb")); + assert.ok(result.containerItems[2].name.startsWith("cc")); + await containerURL1.delete(Aborter.none); + await containerURL2.delete(Aborter.none); + await containerURL3.delete(Aborter.none); + }); + + it("List containers with marker", async () => { + const containerNamePostfix = getUniqueName("container"); + const containerName1 = `cc${containerNamePostfix}`; + const containerName2 = `aa${containerNamePostfix}`; + const containerName3 = `bb${containerNamePostfix}`; + const containerURL1 = ContainerURL.fromServiceURL( + serviceURL, + containerName1 + ); + const containerURL2 = ContainerURL.fromServiceURL( + serviceURL, + containerName2 + ); + const containerURL3 = ContainerURL.fromServiceURL( + serviceURL, + containerName3 + ); + await containerURL1.create(Aborter.none); + await containerURL2.create(Aborter.none); + await containerURL3.create(Aborter.none); + const result = await serviceURL.listContainersSegment( + Aborter.none, + containerName2 + ); + assert.equal(result.containerItems.length, 2); + assert.equal(result.containerItems[0].name, containerName3); + assert.equal(result.containerItems[1].name, containerName1); + await containerURL1.delete(Aborter.none); + await containerURL2.delete(Aborter.none); + await containerURL3.delete(Aborter.none); + }); + + it("List containers with marker and max result length less than result size", async () => { + const containerNamePostfix = getUniqueName("container"); + const containerName1 = `cc${containerNamePostfix}`; + const containerName2 = `aa${containerNamePostfix}`; + const containerName3 = `bb${containerNamePostfix}`; + const containerURL1 = ContainerURL.fromServiceURL( + serviceURL, + containerName1 + ); + const containerURL2 = ContainerURL.fromServiceURL( + serviceURL, + containerName2 + ); + const containerURL3 = ContainerURL.fromServiceURL( + serviceURL, + containerName3 + ); + await containerURL1.create(Aborter.none); + await containerURL2.create(Aborter.none); + await containerURL3.create(Aborter.none); + const result1 = await serviceURL.listContainersSegment( + Aborter.none, + containerName2, + { maxresults: 1 } + ); + + assert.equal(result1.containerItems.length, 1); + assert.equal(result1.containerItems[0].name, containerName3); + assert.equal(result1.nextMarker, containerName3); + + const result2 = await serviceURL.listContainersSegment( + Aborter.none, + result1.nextMarker, + { maxresults: 1 } + ); + assert.equal(result2.containerItems.length, 1); + assert.ok(result2.containerItems[0].name, containerName1); + assert.equal(result2.nextMarker, ""); + + await containerURL1.delete(Aborter.none); + await containerURL2.delete(Aborter.none); + await containerURL3.delete(Aborter.none); + }); + it("ListContainers with default parameters", async () => { const result = await serviceURL.listContainersSegment(Aborter.none); assert.ok(typeof result.requestId); From 61699c17361575b8b90bae3f42d4f9b12f81953c Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Fri, 13 Dec 2019 13:26:45 +0800 Subject: [PATCH 03/34] Add component governance detection --- azure-pipelines.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 847839ff7..cc4de4739 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -360,3 +360,14 @@ jobs: docker run xstoreazurite.azurecr.io/public/azure-storage/azurite:latest azurite-queue -v workingDirectory: "./" displayName: "Validate docker image" + + - job: governance + displayName: Component Governance Component Detection + pool: + vmImage: "ubuntu-16.04" + steps: + - task: ComponentGovernanceComponentDetection@0 + inputs: + scanType: 'Register' + verbosity: 'Verbose' + alertWarningLevel: 'High' \ No newline at end of file From 4518ff5e3ec51bb0ae66fb55d3e44ce4cd11438a Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Mon, 16 Dec 2019 12:23:45 +0800 Subject: [PATCH 04/34] Fix get snapshot 404 issue, and add API version validation (#297) --- ChangeLog.md | 2 ++ .../context/blobStorageContext.middleware.ts | 13 ++++++---- src/blob/persistence/LokiBlobMetadataStore.ts | 9 +++++-- src/blob/persistence/SqlBlobMetadataStore.ts | 5 +++- src/blob/utils/constants.ts | 24 ++++++++++++++++++- src/common/utils/utils.ts | 21 ++++++++++++++++ .../context/queueStorageContext.middleware.ts | 14 +++++++---- src/queue/utils/constants.ts | 24 ++++++++++++++++++- 8 files changed, 99 insertions(+), 13 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index c25bc7258..dbb6a25af 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -5,6 +5,8 @@ Upcoming Release - Fixed a bug that to return the list of containers in sorted order. +- Fixed a bug that get/download blob snapshot fail. +- Check input request "x-ms-version" Header, only valid version are allowed 2019.11 Version 3.3.0-preview diff --git a/src/blob/context/blobStorageContext.middleware.ts b/src/blob/context/blobStorageContext.middleware.ts index 71462e348..6cf600084 100644 --- a/src/blob/context/blobStorageContext.middleware.ts +++ b/src/blob/context/blobStorageContext.middleware.ts @@ -2,11 +2,13 @@ import { NextFunction, Request, Response } from "express"; import uuid from "uuid/v4"; import logger from "../../common/Logger"; +import { checkApiVersion } from "../../common/utils/utils"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import { DEFAULT_CONTEXT_PATH, HeaderConstants, SECONDARY_SUFFIX, + ValidAPIVersions, VERSION } from "../utils/constants"; import BlobStorageContext from "./BlobStorageContext"; @@ -26,11 +28,16 @@ export default function blobStorageContextMiddleware( ): void { // Set server header in every Azurite response res.setHeader(HeaderConstants.SERVER, `Azurite-Blob/${VERSION}`); + const requestID = uuid(); + + const apiVersion = req.header(HeaderConstants.X_MS_VERSION); + if (apiVersion !== undefined) { + checkApiVersion(apiVersion, ValidAPIVersions, requestID); + } const blobContext = new BlobStorageContext(res.locals, DEFAULT_CONTEXT_PATH); blobContext.startTime = new Date(); - const requestID = uuid(); blobContext.xMsRequestID = requestID; logger.info( @@ -76,9 +83,7 @@ export default function blobStorageContextMiddleware( ); logger.error( - `BlobStorageContextMiddleware: BlobStorageContextMiddleware: ${ - handlerError.message - }`, + `BlobStorageContextMiddleware: BlobStorageContextMiddleware: ${handlerError.message}`, requestID ); diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 6a74c93b9..b7e4f8610 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -3,7 +3,10 @@ import Loki from "lokijs"; import uuid from "uuid/v4"; import IGCExtentProvider from "../../common/IGCExtentProvider"; -import { rimrafAsync } from "../../common/utils/utils"; +import { + convertDateTimeStringMsTo7Digital, + rimrafAsync +} from "../../common/utils/utils"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import * as Models from "../generated/artifacts/models"; import { LeaseStatusType } from "../generated/artifacts/models"; @@ -946,7 +949,9 @@ export default class LokiBlobMetadataStore const snapshotBlob: BlobModel = { name: doc.name, deleted: false, - snapshot: context.startTime!.toISOString(), + snapshot: convertDateTimeStringMsTo7Digital( + context.startTime!.toISOString() + ), properties: { ...doc.properties }, metadata: metadata ? { ...metadata } : { ...doc.metadata }, accountName: doc.accountName, diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index e45dee23c..21a9e2e40 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -15,6 +15,7 @@ import { DEFAULT_SQL_CHARSET, DEFAULT_SQL_COLLATE } from "../../common/utils/constants"; +import { convertDateTimeStringMsTo7Digital } from "../../common/utils/utils"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import * as Models from "../generated/artifacts/models"; import { BlobType, LeaseAccessConditions } from "../generated/artifacts/models"; @@ -1619,7 +1620,9 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { context ).validate(new BlobReadLeaseValidator(leaseAccessConditions)); - snapshotBlob.snapshot = context.startTime!.toISOString(); + snapshotBlob.snapshot = convertDateTimeStringMsTo7Digital( + context.startTime!.toISOString() + ); snapshotBlob.metadata = metadata || snapshotBlob.metadata; new BlobLeaseSyncer(snapshotBlob).sync({ diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 9555a7696..e5ff2af3f 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -47,7 +47,8 @@ export const HeaderConstants = { USER_AGENT: "User-Agent", X_MS_CLIENT_REQUEST_ID: "x-ms-client-request-id", X_MS_DATE: "x-ms-date", - SERVER: "Server" + SERVER: "Server", + X_MS_VERSION: "x-ms-version" }; export const SECONDARY_SUFFIX = "-secondary"; @@ -59,3 +60,24 @@ export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ maxConcurrency: 10 } ]; + +export const ValidAPIVersions = [ + "2019-02-02", + "2018-11-09", + "2018-03-28", + "2017-11-09", + "2017-07-29", + "2017-04-17", + "2016-05-31", + "2015-12-11", + "2015-07-08", + "2015-04-05", + "2015-02-21", + "2014-02-14", + "2013-08-15", + "2012-02-12", + "2011-08-18", + "2009-09-19", + "2009-07-17", + "2009-04-14" +]; diff --git a/src/common/utils/utils.ts b/src/common/utils/utils.ts index aed467499..ebc6a8877 100644 --- a/src/common/utils/utils.ts +++ b/src/common/utils/utils.ts @@ -1,8 +1,29 @@ import rimraf = require("rimraf"); import { promisify } from "util"; +import StorageErrorFactory from "../../blob/errors/StorageErrorFactory"; export const rimrafAsync = promisify(rimraf); export function minDate(date1: Date, date2: Date): Date { return date1 > date2 ? date2 : date1; } + +export function checkApiVersion( + inputApiVersion: string, + validApiVersions: Array, + requestId: string +): void { + if (!validApiVersions.includes(inputApiVersion)) { + throw StorageErrorFactory.getInvalidHeaderValue(requestId, { + HeaderName: "x-ms-version", + HeaderValue: inputApiVersion + }); + } +} + +// Blob Snapshot is has 7 digital for Milliseconds, but Datatime has Milliseconds with 3 digital. So need convert. +export function convertDateTimeStringMsTo7Digital( + dateTimeString: string +): string { + return dateTimeString.replace("Z", "0000Z"); +} diff --git a/src/queue/context/queueStorageContext.middleware.ts b/src/queue/context/queueStorageContext.middleware.ts index d79ad61ef..422421729 100644 --- a/src/queue/context/queueStorageContext.middleware.ts +++ b/src/queue/context/queueStorageContext.middleware.ts @@ -2,11 +2,13 @@ import { NextFunction, Request, Response } from "express"; import uuid from "uuid/v4"; import logger from "../../common/Logger"; +import { checkApiVersion } from "../../common/utils/utils"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import { DEFAULT_QUEUE_CONTEXT_PATH, HeaderConstants, SECONDARY_SUFFIX, + ValidAPIVersions, VERSION } from "../utils/constants"; import { isValidName, nameValidateCode } from "../utils/utils"; @@ -28,13 +30,19 @@ export default function queueStorageContextMiddleware( // Set server header in every Azurite response res.setHeader(HeaderConstants.SERVER, `Azurite-Queue/${VERSION}`); + const requestID = uuid(); + + const apiVersion = req.header(HeaderConstants.X_MS_VERSION); + if (apiVersion !== undefined) { + checkApiVersion(apiVersion, ValidAPIVersions, requestID); + } + const queueContext = new QueueStorageContext( res.locals, DEFAULT_QUEUE_CONTEXT_PATH ); queueContext.startTime = new Date(); - const requestID = uuid(); queueContext.xMsRequestID = requestID; logger.info( @@ -96,9 +104,7 @@ export default function queueStorageContextMiddleware( ); logger.error( - `QueueStorageContextMiddleware: QueueStorageContextMiddleware: ${ - handlerError.message - }`, + `QueueStorageContextMiddleware: QueueStorageContextMiddleware: ${handlerError.message}`, requestID ); diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 29572c4f4..c34be3b48 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -71,7 +71,8 @@ export const HeaderConstants = { ACCESS_CONTROL_ALLOW_HEADERS: "Access-Control-Allow-Headers", ACCESS_CONTROL_MAX_AGE: "Access-Control-Max-Age", ACCESS_CONTROL_REQUEST_METHOD: "access-control-request-method", - ACCESS_CONTROL_REQUEST_HEADERS: "access-control-request-headers" + ACCESS_CONTROL_REQUEST_HEADERS: "access-control-request-headers", + X_MS_VERSION: "x-ms-version" }; export const SECONDARY_SUFFIX = "-secondary"; @@ -88,3 +89,24 @@ export const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ maxConcurrency: 1 } ]; + +export const ValidAPIVersions = [ + "2019-02-02", + "2018-11-09", + "2018-03-28", + "2017-11-09", + "2017-07-29", + "2017-04-17", + "2016-05-31", + "2015-12-11", + "2015-07-08", + "2015-04-05", + "2015-02-21", + "2014-02-14", + "2013-08-15", + "2012-02-12", + "2011-08-18", + "2009-09-19", + "2009-07-17", + "2009-04-14" +]; From 1299a5c9262520d9f7e002b62bd4fc3601f1f73f Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Tue, 17 Dec 2019 11:56:27 +0800 Subject: [PATCH 05/34] Added support for blob CORS; Optional ExposedHeaders and RequestHeaders; (#299) * Added support for blob CORS, fixed #285 * AllowedHeaders and ExposedHeaders are optional now when setting CORS, fixed #294 --- ChangeLog.md | 7 + package.json | 4 +- src/blob/BlobRequestListenerFactory.ts | 19 +- src/blob/SqlBlobRequestListenerFactory.ts | 21 +- src/blob/errors/StorageErrorFactory.ts | 26 + src/blob/generated/artifacts/mappers.ts | 2 - src/blob/generated/artifacts/models.ts | 4 +- src/blob/generated/handlers/IHandlers.ts | 14 +- src/blob/handlers/ServiceHandler.ts | 8 + .../preflight/PreflightMiddlewareFactory.ts | 422 ++++++++++++ src/blob/utils/constants.ts | 17 +- src/queue/QueueRequestListenerFactory.ts | 8 +- src/queue/generated/artifacts/mappers.ts | 2 - src/queue/generated/artifacts/models.ts | 4 +- src/queue/handlers/ServiceHandler.ts | 7 + .../preflight/PreflightMiddlewareFactory.ts | 107 +-- src/queue/utils/constants.ts | 4 + swagger/blob-storage-2019-02-02.json | 2 - swagger/queue-storage.json | 2 - .../OPTIONSRequestPolicyFactory.ts | 72 ++ .../blob/RequestPolicy/OriginPolicyFactory.ts | 35 + tests/blob/apis/service.test.ts | 19 + tests/blob/blobCorsRequest.test.ts | 639 ++++++++++++++++++ tests/queue/apis/queueService.test.ts | 22 +- tests/queue/queueCorsRequest.test.ts | 49 +- 25 files changed, 1416 insertions(+), 100 deletions(-) create mode 100644 src/blob/preflight/PreflightMiddlewareFactory.ts create mode 100644 tests/blob/RequestPolicy/OPTIONSRequestPolicyFactory.ts create mode 100644 tests/blob/RequestPolicy/OriginPolicyFactory.ts create mode 100644 tests/blob/blobCorsRequest.test.ts diff --git a/ChangeLog.md b/ChangeLog.md index dbb6a25af..e212662f8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -8,6 +8,13 @@ Upcoming Release - Fixed a bug that get/download blob snapshot fail. - Check input request "x-ms-version" Header, only valid version are allowed +Blob: +- Added support for CORS. +- AllowedHeaders and ExposedHeaders are optional now when setting CORS. + +Queue: +- AllowedHeaders and ExposedHeaders are optional now when setting CORS. + 2019.11 Version 3.3.0-preview - Azurite now supports customized account names and keys by environment variable `AZURITE_ACCOUNTS`. diff --git a/package.json b/package.json index c0c7a248d..198aa8562 100644 --- a/package.json +++ b/package.json @@ -180,8 +180,8 @@ "docker:publish:internal": "cross-var docker push xstoreazurite.azurecr.io/internal/azure-storage/azurite:$npm_package_version", "build": "tsc", "build:autorestdebug": "autorest ./swagger/blob.md --typescript --typescript.debugger --use=E:/GitHub/XiaoningLiu/autorest.typescript.server", - "build:autorest:blob": "autorest ./swagger/blob.md --typescript --use=E:/GitHub/XiaoningLiu/autorest.typescript.server", - "build:autorest:queue": "autorest ./swagger/queue.md --typescript --use=E:/GitHub/XiaoningLiu/autorest.typescript.server", + "build:autorest:blob": "autorest ./swagger/blob.md --typescript --use=S:/GitHub/XiaoningLiu/autorest.typescript.server", + "build:autorest:queue": "autorest ./swagger/queue.md --typescript --use=S:/GitHub/XiaoningLiu/autorest.typescript.server", "watch": "tsc -watch -p ./", "blob": "node -r ts-node/register src/blob/main.ts", "queue": "node -r ts-node/register src/queue/main.ts", diff --git a/src/blob/BlobRequestListenerFactory.ts b/src/blob/BlobRequestListenerFactory.ts index 837e46419..c284227a3 100644 --- a/src/blob/BlobRequestListenerFactory.ts +++ b/src/blob/BlobRequestListenerFactory.ts @@ -23,6 +23,7 @@ import PageBlobHandler from "./handlers/PageBlobHandler"; import PageBlobRangesManager from "./handlers/PageBlobRangesManager"; import ServiceHandler from "./handlers/ServiceHandler"; import IBlobMetadataStore from "./persistence/IBlobMetadataStore"; +import PreflightMiddlewareFactory from "./preflight/PreflightMiddlewareFactory"; import { DEFAULT_CONTEXT_PATH } from "./utils/constants"; /** @@ -88,9 +89,13 @@ export default class BlobRequestListenerFactory this.metadataStore, this.extentStore, logger - ) + ), + directoryHandler: {} as any }; + // CORS request handling, preflight request and the corresponding actual request + const preflightMiddlewareFactory = new PreflightMiddlewareFactory(logger); + /* * Generated middleware should follow strict orders * Manually created middleware can be injected into any points @@ -134,9 +139,21 @@ export default class BlobRequestListenerFactory // Generated, inject handlers to create a handler middleware app.use(middlewareFactory.createHandlerMiddleware(handlers)); + // CORS + app.use( + preflightMiddlewareFactory.createCorsRequestMiddleware(this.metadataStore) + ); + // Generated, will serialize response models into HTTP response app.use(middlewareFactory.createSerializerMiddleware()); + // Preflight + app.use( + preflightMiddlewareFactory.createOptionsHandlerMiddleware( + this.metadataStore + ) + ); + // Generated, will return MiddlewareError and Errors thrown in previous middleware/handlers to HTTP response app.use(middlewareFactory.createErrorMiddleware()); diff --git a/src/blob/SqlBlobRequestListenerFactory.ts b/src/blob/SqlBlobRequestListenerFactory.ts index 13864dfc1..f08294ae0 100644 --- a/src/blob/SqlBlobRequestListenerFactory.ts +++ b/src/blob/SqlBlobRequestListenerFactory.ts @@ -1,4 +1,5 @@ import express from "express"; +import morgan = require("morgan"); import IAccountDataStore from "../common/IAccountDataStore"; import IRequestListenerFactory from "../common/IRequestListenerFactory"; @@ -22,9 +23,9 @@ import PageBlobHandler from "./handlers/PageBlobHandler"; import PageBlobRangesManager from "./handlers/PageBlobRangesManager"; import ServiceHandler from "./handlers/ServiceHandler"; import IBlobMetadataStore from "./persistence/IBlobMetadataStore"; +import PreflightMiddlewareFactory from "./preflight/PreflightMiddlewareFactory"; import { DEFAULT_CONTEXT_PATH } from "./utils/constants"; -import morgan = require("morgan"); /** * Default RequestListenerFactory based on express framework. * @@ -88,9 +89,13 @@ export default class SqlBlobRequestListenerFactory this.metadataStore, this.extentStore, logger - ) + ), + directoryHandler: {} as any }; + // CORS request handling, preflight request and the corresponding actual request + const preflightMiddlewareFactory = new PreflightMiddlewareFactory(logger); + /* * Generated middleware should follow strict orders * Manually created middleware can be injected into any points @@ -134,9 +139,21 @@ export default class SqlBlobRequestListenerFactory // Generated, inject handlers to create a handler middleware app.use(middlewareFactory.createHandlerMiddleware(handlers)); + // CORS + app.use( + preflightMiddlewareFactory.createCorsRequestMiddleware(this.metadataStore) + ); + // Generated, will serialize response models into HTTP response app.use(middlewareFactory.createSerializerMiddleware()); + // Preflight + app.use( + preflightMiddlewareFactory.createOptionsHandlerMiddleware( + this.metadataStore + ) + ); + // Generated, will return MiddlewareError and Errors thrown in previous middleware/handlers to HTTP response app.use(middlewareFactory.createErrorMiddleware()); diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index c1e975640..3e2e7d938 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -423,4 +423,30 @@ export default class StorageErrorFactory { additionalMessages ); } + + public static getInvalidCorsHeaderValue( + contextID: string = "", + additionalMessages?: { [key: string]: string } + ): StorageError { + return new StorageError( + 400, + "InvalidHeaderValue", + "A required CORS header is not present.", + contextID, + additionalMessages + ); + } + + public static corsPreflightFailure( + contextID: string = "", + additionalMessages?: { [key: string]: string } + ): StorageError { + return new StorageError( + 403, + "CorsPreflightFailure", + "CORS not enabled or no matching rule found for this request.", + contextID, + additionalMessages + ); + } } diff --git a/src/blob/generated/artifacts/mappers.ts b/src/blob/generated/artifacts/mappers.ts index 86d92d23e..7d8feed38 100644 --- a/src/blob/generated/artifacts/mappers.ts +++ b/src/blob/generated/artifacts/mappers.ts @@ -1085,7 +1085,6 @@ export const CorsRule: msRest.CompositeMapper = { }, allowedHeaders: { xmlName: "AllowedHeaders", - required: true, serializedName: "AllowedHeaders", type: { name: "String" @@ -1093,7 +1092,6 @@ export const CorsRule: msRest.CompositeMapper = { }, exposedHeaders: { xmlName: "ExposedHeaders", - required: true, serializedName: "ExposedHeaders", type: { name: "String" diff --git a/src/blob/generated/artifacts/models.ts b/src/blob/generated/artifacts/models.ts index 52ec56983..982185ffa 100644 --- a/src/blob/generated/artifacts/models.ts +++ b/src/blob/generated/artifacts/models.ts @@ -350,12 +350,12 @@ export interface CorsRule { /** * the request headers that the origin domain may specify on the CORS request. */ - allowedHeaders: string; + allowedHeaders?: string; /** * The response headers that may be sent in the response to the CORS request and exposed by the * browser to the request issuer */ - exposedHeaders: string; + exposedHeaders?: string; /** * The maximum amount time that a browser should cache the preflight OPTIONS request. */ diff --git a/src/blob/generated/handlers/IHandlers.ts b/src/blob/generated/handlers/IHandlers.ts index 8b176dd8b..67ee9160d 100644 --- a/src/blob/generated/handlers/IHandlers.ts +++ b/src/blob/generated/handlers/IHandlers.ts @@ -1,16 +1,16 @@ -import IAppendBlobHandler from "./IAppendBlobHandler"; -// import IDirectoryHandler from "./IDirectoryHandler"; -import IBlobHandler from "./IBlobHandler"; -import IBlockBlobHandler from "./IBlockBlobHandler"; -import IContainerHandler from "./IContainerHandler"; -import IPageBlobHandler from "./IPageBlobHandler"; // tslint:disable:ordered-imports import IServiceHandler from "./IServiceHandler"; +import IContainerHandler from "./IContainerHandler"; +import IDirectoryHandler from "./IDirectoryHandler"; +import IBlobHandler from "./IBlobHandler"; +import IPageBlobHandler from "./IPageBlobHandler"; +import IAppendBlobHandler from "./IAppendBlobHandler"; +import IBlockBlobHandler from "./IBlockBlobHandler"; export interface IHandlers { serviceHandler: IServiceHandler; containerHandler: IContainerHandler; - // directoryHandler: IDirectoryHandler; + directoryHandler: IDirectoryHandler; blobHandler: IBlobHandler; pageBlobHandler: IPageBlobHandler; appendBlobHandler: IAppendBlobHandler; diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index eff88729e..46baf3323 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -64,6 +64,7 @@ export default class ServiceHandler extends BaseHandler ): Promise { throw new Error("Method not implemented."); } + public submitBatch( body: NodeJS.ReadableStream, contentLength: number, @@ -102,6 +103,13 @@ export default class ServiceHandler extends BaseHandler storageServiceProperties.cors = undefined; } + // Azure Storage allows allowedHeaders and exposedHeaders to be empty, + // Azurite will set to empty string for this scenario + for (const cors of storageServiceProperties.cors || []) { + cors.allowedHeaders = cors.allowedHeaders || ""; + cors.exposedHeaders = cors.exposedHeaders || ""; + } + await this.metadataStore.setServiceProperties(context, { ...storageServiceProperties, accountName diff --git a/src/blob/preflight/PreflightMiddlewareFactory.ts b/src/blob/preflight/PreflightMiddlewareFactory.ts new file mode 100644 index 000000000..0af5cf423 --- /dev/null +++ b/src/blob/preflight/PreflightMiddlewareFactory.ts @@ -0,0 +1,422 @@ +import * as msRest from "@azure/ms-rest-js"; +import { + ErrorRequestHandler, + NextFunction, + Request, + RequestHandler, + Response +} from "express"; + +import ILogger from "../../common/ILogger"; +import BlobStorageContext from "../context/BlobStorageContext"; +import StorageErrorFactory from "../errors/StorageErrorFactory"; +import * as Mappers from "../generated/artifacts/mappers"; +import Specifications from "../generated/artifacts/specifications"; +import MiddlewareError from "../generated/errors/MiddlewareError"; +import IBlobMetadataStore from "../persistence/IBlobMetadataStore"; +import { + DEFAULT_CONTEXT_PATH, + HeaderConstants, + MethodConstants +} from "../utils/constants"; + +export default class PreflightMiddlewareFactory { + constructor(private readonly logger: ILogger) {} + + public createOptionsHandlerMiddleware( + metadataStore: IBlobMetadataStore + ): ErrorRequestHandler { + return ( + err: MiddlewareError | Error, + req: Request, + res: Response, + next: NextFunction + ) => { + if (req.method.toUpperCase() === MethodConstants.OPTIONS) { + const context = new BlobStorageContext( + res.locals, + DEFAULT_CONTEXT_PATH + ); + + const requestId = context.contextId; + const account = context.account!; + + this.logger.info( + `PreflightMiddlewareFactory.createOptionsHandlerMiddleware(): OPTIONS request.`, + requestId + ); + + const origin = req.header(HeaderConstants.ORIGIN); + if (origin === undefined || typeof origin !== "string") { + return next( + StorageErrorFactory.getInvalidCorsHeaderValue(requestId, { + MessageDetails: `Invalid required CORS header Origin ${JSON.stringify( + origin + )}` + }) + ); + } + + const requestMethod = req.header( + HeaderConstants.ACCESS_CONTROL_REQUEST_METHOD + ); + if (requestMethod === undefined || typeof requestMethod !== "string") { + return next( + StorageErrorFactory.getInvalidCorsHeaderValue(requestId, { + MessageDetails: `Invalid required CORS header Access-Control-Request-Method ${JSON.stringify( + requestMethod + )}` + }) + ); + } + + const requestHeaders = req.headers[ + HeaderConstants.ACCESS_CONTROL_REQUEST_HEADERS + ] as string; + + metadataStore + .getServiceProperties(context, account) + .then(properties => { + if (properties === undefined || properties.cors === undefined) { + return next( + StorageErrorFactory.corsPreflightFailure(requestId, { + MessageDetails: "No CORS rules matches this request" + }) + ); + } + + const corsSet = properties.cors; + for (const cors of corsSet) { + if ( + !this.checkOrigin(origin, cors.allowedOrigins) || + !this.checkMethod(requestMethod, cors.allowedMethods) + ) { + continue; + } + if ( + requestHeaders !== undefined && + !this.checkHeaders(requestHeaders, cors.allowedHeaders || "") + ) { + continue; + } + + res.setHeader( + HeaderConstants.ACCESS_CONTROL_ALLOW_ORIGIN, + origin + ); + res.setHeader( + HeaderConstants.ACCESS_CONTROL_ALLOW_METHODS, + requestMethod + ); + if (requestHeaders !== undefined) { + res.setHeader( + HeaderConstants.ACCESS_CONTROL_REQUEST_HEADERS, + requestHeaders + ); + } + res.setHeader( + HeaderConstants.ACCESS_CONTROL_MAX_AGE, + cors.maxAgeInSeconds + ); + res.setHeader( + HeaderConstants.ACCESS_CONTROL_ALLOW_CREDENTIALS, + "true" + ); + + return next(); + } + return next( + StorageErrorFactory.corsPreflightFailure(requestId, { + MessageDetails: "No CORS rules matches this request" + }) + ); + }) + .catch(next); + } else { + next(err); + } + }; + } + + public createCorsRequestMiddleware( + metadataStore: IBlobMetadataStore + ): RequestHandler { + return (req: Request, res: Response, next: NextFunction) => { + if (req.method.toUpperCase() === MethodConstants.OPTIONS) { + return next(); + } + + const context = new BlobStorageContext(res.locals, DEFAULT_CONTEXT_PATH); + + // const requestId = res.locals.azurite_queue_context.contextId; + const account = context.account!; + + const origin = req.headers[HeaderConstants.ORIGIN] as string | undefined; + + const method = req.method; + if (method === undefined || typeof method !== "string") { + return next(); + } + + metadataStore + .getServiceProperties(context, account) + .then(properties => { + if (properties === undefined || properties.cors === undefined) { + return next(); + } + const corsSet = properties.cors; + const resHeaders = this.getResponseHeaders(res); + + for (const cors of corsSet) { + if ( + this.checkOrigin(origin, cors.allowedOrigins) && + this.checkMethod(method, cors.allowedMethods) + ) { + const exposedHeaders = this.getExposedHeaders( + resHeaders, + cors.exposedHeaders || "" + ); + + res.setHeader( + HeaderConstants.ACCESS_CONTROL_EXPOSED_HEADER, + exposedHeaders + ); + + res.setHeader( + HeaderConstants.ACCESS_CONTROL_ALLOW_ORIGIN, + cors.allowedOrigins || "" + ); + + if (cors.allowedOrigins !== "*") { + res.setHeader(HeaderConstants.VARY, "Origin"); + res.setHeader( + HeaderConstants.ACCESS_CONTROL_ALLOW_CREDENTIALS, + "true" + ); + } + + return next(); + } + } + if (corsSet.length > 0) { + res.setHeader(HeaderConstants.VARY, "Origin"); + } + return next(); + }) + .catch(next); + }; + } + + private checkOrigin( + origin: string | undefined, + allowedOrigin: string + ): boolean { + if (allowedOrigin === "*") { + return true; + } + if (origin === undefined) { + return false; + } + const allowedOriginArray = allowedOrigin.split(","); + for (const corsOrigin of allowedOriginArray) { + if (origin.trim() === corsOrigin.trim()) { + return true; + } + } + return false; + } + + private checkMethod(method: string, allowedMethod: string): boolean { + const allowedMethodArray = allowedMethod.split(","); + for (const corsMethod of allowedMethodArray) { + if (method.trim() === corsMethod.trim()) { + return true; + } + } + return false; + } + + private checkHeaders(headers: string, allowedHeaders: string): boolean { + const headersArray = headers.split(","); + const allowedHeadersArray = allowedHeaders.split(","); + for (const header of headersArray) { + let flag = false; + const trimmedHeader = header.trim().toLowerCase(); + + for (const allowedHeader of allowedHeadersArray) { + // TODO: Should remove the wrapping blank when set CORS through set properties for service. + const trimmedAllowedHeader = allowedHeader.trim().toLowerCase(); + if ( + trimmedHeader === trimmedAllowedHeader || + (trimmedAllowedHeader[trimmedAllowedHeader.length - 1] === "*" && + trimmedHeader.startsWith( + trimmedAllowedHeader.substr(0, trimmedAllowedHeader.length - 1) + )) + ) { + flag = true; + break; + } + } + + if (flag === false) { + return false; + } + } + + return true; + } + + private getResponseHeaders(res: Response): string[] { + const context = new BlobStorageContext(res.locals, DEFAULT_CONTEXT_PATH); + const handlerResponse = context.handlerResponses; + const statusCodeInResponse: number = handlerResponse.statusCode; + const spec = Specifications[context.operation!]; + const responseSpec = spec.responses[statusCodeInResponse]; + if (!responseSpec) { + throw new TypeError( + `Request specification doesn't include provided response status code` + ); + } + + // Serialize headers + const headerSerializer = new msRest.Serializer(Mappers); + const headersMapper = responseSpec.headersMapper; + + const responseHeaderSet = []; + if (headersMapper && headersMapper.type.name === "Composite") { + const mappersForAllHeaders = headersMapper.type.modelProperties || {}; + + // Handle headerMapper one by one + for (const key in mappersForAllHeaders) { + if (mappersForAllHeaders.hasOwnProperty(key)) { + const headerMapper = mappersForAllHeaders[key]; + const headerName = headerMapper.serializedName; + const headerValueOriginal = handlerResponse[key]; + const headerValueSerialized = headerSerializer.serialize( + headerMapper, + headerValueOriginal + ); + + // Handle collection of headers starting with same prefix, such as x-ms-meta prefix + const headerCollectionPrefix = (headerMapper as msRest.DictionaryMapper) + .headerCollectionPrefix; + if ( + headerCollectionPrefix !== undefined && + headerValueOriginal !== undefined + ) { + for (const collectionHeaderPartialName in headerValueSerialized) { + if ( + headerValueSerialized.hasOwnProperty( + collectionHeaderPartialName + ) + ) { + const collectionHeaderValueSerialized = + headerValueSerialized[collectionHeaderPartialName]; + const collectionHeaderName = `${headerCollectionPrefix}${collectionHeaderPartialName}`; + if ( + collectionHeaderName && + collectionHeaderValueSerialized !== undefined + ) { + responseHeaderSet.push(collectionHeaderName); + } + } + } + } else { + if (headerName && headerValueSerialized !== undefined) { + responseHeaderSet.push(headerName); + } + } + } + } + } + + if ( + spec.isXML && + responseSpec.bodyMapper && + responseSpec.bodyMapper.type.name !== "Stream" + ) { + responseHeaderSet.push("content-type"); + responseHeaderSet.push("content-length"); + } else if ( + handlerResponse.body && + responseSpec.bodyMapper && + responseSpec.bodyMapper.type.name === "Stream" + ) { + responseHeaderSet.push("content-length"); + } + + const headers = res.getHeaders(); + for (const header in headers) { + if (typeof header === "string") { + responseHeaderSet.push(header); + } + } + + // TODO: Should extract the header by some policy. + // or apply a referred list indicates the related headers. + responseHeaderSet.push("Date"); + responseHeaderSet.push("Connection"); + responseHeaderSet.push("Transfer-Encoding"); + + return responseHeaderSet; + } + + private getExposedHeaders( + responseHeaders: any, + exposedHeaders: string + ): string { + const exposedHeaderRules = exposedHeaders.split(","); + const prefixRules = []; + const simpleHeaders = []; + for (let i = 0; i < exposedHeaderRules.length; i++) { + exposedHeaderRules[i] = exposedHeaderRules[i].trim(); + if (exposedHeaderRules[i].endsWith("*")) { + prefixRules.push( + exposedHeaderRules[i] + .substr(0, exposedHeaderRules[i].length - 1) + .toLowerCase() + ); + } else { + simpleHeaders.push(exposedHeaderRules[i]); + } + } + + const resExposedHeaders: string[] = []; + for (const header of responseHeaders) { + let isMatch = false; + for (const rule of prefixRules) { + if (header.toLowerCase().startsWith(rule)) { + isMatch = true; + break; + } + } + if (!isMatch) { + for (const simpleHeader of simpleHeaders) { + if (header.toLowerCase() === simpleHeader.toLowerCase()) { + isMatch = true; + break; + } + } + } + + if (isMatch) { + resExposedHeaders.push(header); + } + } + + for (const simpleHeader of simpleHeaders) { + let isMatch = false; + for (const header of resExposedHeaders) { + if (simpleHeader.toLowerCase() === header.toLowerCase()) { + isMatch = true; + break; + } + } + if (!isMatch) { + resExposedHeaders.push(simpleHeader); + } + } + + return resExposedHeaders.join(","); + } +} diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index e5ff2af3f..a94d94b80 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -48,7 +48,22 @@ export const HeaderConstants = { X_MS_CLIENT_REQUEST_ID: "x-ms-client-request-id", X_MS_DATE: "x-ms-date", SERVER: "Server", - X_MS_VERSION: "x-ms-version" + X_MS_META: "x-ms-meta-", + X_MS_VERSION: "x-ms-version", + ORIGIN: "origin", + VARY: "Vary", + ACCESS_CONTROL_EXPOSED_HEADER: "Access-Control-Exposed-Headers", + ACCESS_CONTROL_ALLOW_ORIGIN: "Access-Control-Allow-Origin", + ACCESS_CONTROL_ALLOW_CREDENTIALS: "Access-Control-Allow-Credentials", + ACCESS_CONTROL_ALLOW_METHODS: "Access-Control-Allow-Methods", + ACCESS_CONTROL_ALLOW_HEADERS: "Access-Control-Allow-Headers", + ACCESS_CONTROL_MAX_AGE: "Access-Control-Max-Age", + ACCESS_CONTROL_REQUEST_METHOD: "access-control-request-method", + ACCESS_CONTROL_REQUEST_HEADERS: "access-control-request-headers" +}; + +export const MethodConstants = { + OPTIONS: "OPTIONS" }; export const SECONDARY_SUFFIX = "-secondary"; diff --git a/src/queue/QueueRequestListenerFactory.ts b/src/queue/QueueRequestListenerFactory.ts index 06a6c145c..379f116a0 100644 --- a/src/queue/QueueRequestListenerFactory.ts +++ b/src/queue/QueueRequestListenerFactory.ts @@ -1,4 +1,5 @@ import express from "express"; +import morgan = require("morgan"); import IAccountDataStore from "../common/IAccountDataStore"; import IRequestListenerFactory from "../common/IRequestListenerFactory"; @@ -21,7 +22,6 @@ import { IQueueMetadataStore } from "./persistence/IQueueMetadataStore"; import PreflightMiddlewareFactory from "./preflight/PreflightMiddlewareFactory"; import { DEFAULT_QUEUE_CONTEXT_PATH } from "./utils/constants"; -import morgan = require("morgan"); /** * Default RequestListenerFactory based on express framework. * @@ -120,9 +120,7 @@ export default class QueueRequestListenerFactory // tslint:disable-next-line:max-line-length // See as https://docs.microsoft.com/en-us/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services app.use( - preflightMiddlewareFactory.createActualCorsRequestMiddleware( - this.metadataStore - ) + preflightMiddlewareFactory.createCorsRequestMiddleware(this.metadataStore) ); // Generated, will serialize response models into HTTP response @@ -131,7 +129,7 @@ export default class QueueRequestListenerFactory // CORS preflight request handling, processing OPTIONS requests. // TODO: Should support OPTIONS in swagger and autorest, then this handling can be moved to ServiceHandler. app.use( - preflightMiddlewareFactory.createOPTIONSHandlerMiddleware( + preflightMiddlewareFactory.createOptionsHandlerMiddleware( this.metadataStore ) ); diff --git a/src/queue/generated/artifacts/mappers.ts b/src/queue/generated/artifacts/mappers.ts index 7b242b9d3..bbafd2ea9 100644 --- a/src/queue/generated/artifacts/mappers.ts +++ b/src/queue/generated/artifacts/mappers.ts @@ -164,7 +164,6 @@ export const CorsRule: msRest.CompositeMapper = { }, allowedHeaders: { xmlName: "AllowedHeaders", - required: true, serializedName: "AllowedHeaders", type: { name: "String" @@ -172,7 +171,6 @@ export const CorsRule: msRest.CompositeMapper = { }, exposedHeaders: { xmlName: "ExposedHeaders", - required: true, serializedName: "ExposedHeaders", type: { name: "String" diff --git a/src/queue/generated/artifacts/models.ts b/src/queue/generated/artifacts/models.ts index 1b656d232..d1933ed44 100644 --- a/src/queue/generated/artifacts/models.ts +++ b/src/queue/generated/artifacts/models.ts @@ -77,12 +77,12 @@ export interface CorsRule { /** * the request headers that the origin domain may specify on the CORS request. */ - allowedHeaders: string; + allowedHeaders?: string; /** * The response headers that may be sent in the response to the CORS request and exposed by the * browser to the request issuer */ - exposedHeaders: string; + exposedHeaders?: string; /** * The maximum amount time that a browser should cache the preflight OPTIONS request. */ diff --git a/src/queue/handlers/ServiceHandler.ts b/src/queue/handlers/ServiceHandler.ts index 0a86b9475..1f85f21e5 100644 --- a/src/queue/handlers/ServiceHandler.ts +++ b/src/queue/handlers/ServiceHandler.ts @@ -93,6 +93,13 @@ export default class ServiceHandler extends BaseHandler storageServiceProperties.cors = undefined; } + // Azure Storage allows allowedHeaders and exposedHeaders to be empty, + // Azurite will set to empty string for this scenario + for (const cors of storageServiceProperties.cors || []) { + cors.allowedHeaders = cors.allowedHeaders || ""; + cors.exposedHeaders = cors.exposedHeaders || ""; + } + await this.metadataStore.updateServiceProperties({ ...storageServiceProperties, accountName diff --git a/src/queue/preflight/PreflightMiddlewareFactory.ts b/src/queue/preflight/PreflightMiddlewareFactory.ts index a609ccd28..3ce581712 100644 --- a/src/queue/preflight/PreflightMiddlewareFactory.ts +++ b/src/queue/preflight/PreflightMiddlewareFactory.ts @@ -1,3 +1,4 @@ +import * as msRest from "@azure/ms-rest-js"; import { ErrorRequestHandler, NextFunction, @@ -6,20 +7,23 @@ import { Response } from "express"; -import * as msRest from "@azure/ms-rest-js"; - import ILogger from "../../common/ILogger"; +import QueueStorageContext from "../context/QueueStorageContext"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import * as Mappers from "../generated/artifacts/mappers"; import Specifications from "../generated/artifacts/specifications"; import MiddlewareError from "../generated/errors/MiddlewareError"; import IQueueMetadataStore from "../persistence/IQueueMetadataStore"; -import { HeaderConstants } from "../utils/constants"; +import { + DEFAULT_QUEUE_CONTEXT_PATH, + HeaderConstants, + MethodConstants +} from "../utils/constants"; export default class PreflightMiddlewareFactory { constructor(private readonly logger: ILogger) {} - public createOPTIONSHandlerMiddleware( + public createOptionsHandlerMiddleware( metadataStore: IQueueMetadataStore ): ErrorRequestHandler { return ( @@ -28,30 +32,40 @@ export default class PreflightMiddlewareFactory { res: Response, next: NextFunction ) => { - if (req.method === "OPTIONS") { - this.logger.info(`preflightMiddleware: Get an option request.`); + if (req.method.toUpperCase() === MethodConstants.OPTIONS) { + const context = new QueueStorageContext( + res.locals, + DEFAULT_QUEUE_CONTEXT_PATH + ); - const requestId = res.locals.azurite_queue_context.contextID; - const account = res.locals.azurite_queue_context.account; + const requestId = context.contextID; + const account = context.account!; - const originHeader = HeaderConstants.ORIGIN; - const origin = req.headers[originHeader] as string; - if (origin === undefined) { + this.logger.info( + `PreflightMiddlewareFactory.createOptionsHandlerMiddleware(): OPTIONS request.`, + requestId + ); + + const origin = req.header(HeaderConstants.ORIGIN); + if (origin === undefined || typeof origin !== "string") { return next( StorageErrorFactory.getInvalidCorsHeaderValue(requestId, { - MessageDetails: "Missing required CORS header Origin" + MessageDetails: `Invalid required CORS header Origin ${JSON.stringify( + origin + )}` }) ); } - const requestMethod = req.headers[ + const requestMethod = req.header( HeaderConstants.ACCESS_CONTROL_REQUEST_METHOD - ] as string; - if (requestMethod === undefined) { + ); + if (requestMethod === undefined || typeof requestMethod !== "string") { return next( StorageErrorFactory.getInvalidCorsHeaderValue(requestId, { - MessageDetails: - "Missing required CORS header Access-Control-Request-Method" + MessageDetails: `Invalid required CORS header Access-Control-Request-Method ${JSON.stringify( + requestMethod + )}` }) ); } @@ -70,8 +84,8 @@ export default class PreflightMiddlewareFactory { }) ); } - const corsSet = properties!.cors!; + const corsSet = properties.cors; for (const cors of corsSet) { if ( !this.checkOrigin(origin, cors.allowedOrigins) || @@ -81,7 +95,7 @@ export default class PreflightMiddlewareFactory { } if ( requestHeaders !== undefined && - !this.checkHeaders(requestHeaders, cors.allowedHeaders) + !this.checkHeaders(requestHeaders, cors.allowedHeaders || "") ) { continue; } @@ -96,7 +110,7 @@ export default class PreflightMiddlewareFactory { ); if (requestHeaders !== undefined) { res.setHeader( - HeaderConstants.ACCESS_CONTROL_ALLOW_METHODS, + HeaderConstants.ACCESS_CONTROL_REQUEST_HEADERS, requestHeaders ); } @@ -124,19 +138,28 @@ export default class PreflightMiddlewareFactory { }; } - public createActualCorsRequestMiddleware( + public createCorsRequestMiddleware( metadataStore: IQueueMetadataStore ): RequestHandler { return (req: Request, res: Response, next: NextFunction) => { - if (req.method === "OPTIONS") { + if (req.method.toUpperCase() === MethodConstants.OPTIONS) { return next(); } + const context = new QueueStorageContext( + res.locals, + DEFAULT_QUEUE_CONTEXT_PATH + ); + // const requestId = res.locals.azurite_queue_context.contextID; - const account = res.locals.azurite_queue_context.account; + const account = context.account!; - const originHeader = HeaderConstants.ORIGIN; - const origin = req.headers[originHeader] as string | undefined; + const origin = req.headers[HeaderConstants.ORIGIN] as string | undefined; + + const method = req.method; + if (method === undefined || typeof method !== "string") { + return next(); + } metadataStore .getServiceProperties(account) @@ -144,14 +167,17 @@ export default class PreflightMiddlewareFactory { if (properties === undefined || properties.cors === undefined) { return next(); } - const corsSet = properties!.cors!; + const corsSet = properties.cors; const resHeaders = this.getResponseHeaders(res); for (const cors of corsSet) { - if (this.checkOrigin(origin, cors.allowedOrigins)) { + if ( + this.checkOrigin(origin, cors.allowedOrigins) && + this.checkMethod(method, cors.allowedMethods) + ) { const exposedHeaders = this.getExposedHeaders( resHeaders, - cors.exposedHeaders + cors.exposedHeaders || "" ); res.setHeader( @@ -163,6 +189,7 @@ export default class PreflightMiddlewareFactory { HeaderConstants.ACCESS_CONTROL_ALLOW_ORIGIN, cors.allowedOrigins ); + if (cors.allowedOrigins !== "*") { res.setHeader(HeaderConstants.VARY, "Origin"); res.setHeader( @@ -195,7 +222,7 @@ export default class PreflightMiddlewareFactory { } const allowedOriginArray = allowedOrigin.split(","); for (const corsOrigin of allowedOriginArray) { - if (origin.trimLeft().trimRight() === corsOrigin.trimLeft().trimRight()) { + if (origin.trim() === corsOrigin.trim()) { return true; } } @@ -205,7 +232,7 @@ export default class PreflightMiddlewareFactory { private checkMethod(method: string, allowedMethod: string): boolean { const allowedMethodArray = allowedMethod.split(","); for (const corsMethod of allowedMethodArray) { - if (method.trimLeft().trimRight() === corsMethod.trimLeft().trimRight()) { + if (method.trim() === corsMethod.trim()) { return true; } } @@ -217,22 +244,16 @@ export default class PreflightMiddlewareFactory { const allowedHeadersArray = allowedHeaders.split(","); for (const header of headersArray) { let flag = false; - const trimedHeader = header - .trimLeft() - .trimRight() - .toLowerCase(); + const trimmedHeader = header.trim().toLowerCase(); for (const allowedHeader of allowedHeadersArray) { // TODO: Should remove the wrapping blank when set CORS through set properties for service. - const trimedAllowedHeader = allowedHeader - .trimLeft() - .trimRight() - .toLowerCase(); + const trimmedAllowedHeader = allowedHeader.trim().toLowerCase(); if ( - trimedHeader === trimedAllowedHeader || - (trimedAllowedHeader[trimedAllowedHeader.length - 1] === "*" && - trimedHeader.startsWith( - trimedAllowedHeader.substr(0, trimedAllowedHeader.length - 1) + trimmedHeader === trimmedAllowedHeader || + (trimmedAllowedHeader[trimmedAllowedHeader.length - 1] === "*" && + trimmedHeader.startsWith( + trimmedAllowedHeader.substr(0, trimmedAllowedHeader.length - 1) )) ) { flag = true; @@ -350,7 +371,7 @@ export default class PreflightMiddlewareFactory { const prefixRules = []; const simpleHeaders = []; for (let i = 0; i < exposedHeaderRules.length; i++) { - exposedHeaderRules[i] = exposedHeaderRules[i].trimLeft().trimRight(); + exposedHeaderRules[i] = exposedHeaderRules[i].trim(); if (exposedHeaderRules[i].endsWith("*")) { prefixRules.push( exposedHeaderRules[i] diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index c34be3b48..6eefaf03f 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -41,6 +41,10 @@ export const UPDATE_VISIBILITYTIMEOUT_MAX = 604800; export const EMPTY_EXTENT_CHUNK = { id: "", offset: 0, count: 0 }; +export const MethodConstants = { + OPTIONS: "OPTIONS" +}; + export const HeaderConstants = { AUTHORIZATION: "authorization", AUTHORIZATION_SCHEME: "Bearer", diff --git a/swagger/blob-storage-2019-02-02.json b/swagger/blob-storage-2019-02-02.json index c4acd6fe9..aa4a884b8 100644 --- a/swagger/blob-storage-2019-02-02.json +++ b/swagger/blob-storage-2019-02-02.json @@ -8406,8 +8406,6 @@ "required": [ "AllowedOrigins", "AllowedMethods", - "AllowedHeaders", - "ExposedHeaders", "MaxAgeInSeconds" ], "properties": { diff --git a/swagger/queue-storage.json b/swagger/queue-storage.json index fce28cbfc..addd13fcf 100644 --- a/swagger/queue-storage.json +++ b/swagger/queue-storage.json @@ -1318,8 +1318,6 @@ "required": [ "AllowedOrigins", "AllowedMethods", - "AllowedHeaders", - "ExposedHeaders", "MaxAgeInSeconds" ], "properties": { diff --git a/tests/blob/RequestPolicy/OPTIONSRequestPolicyFactory.ts b/tests/blob/RequestPolicy/OPTIONSRequestPolicyFactory.ts new file mode 100644 index 000000000..57e042fcc --- /dev/null +++ b/tests/blob/RequestPolicy/OPTIONSRequestPolicyFactory.ts @@ -0,0 +1,72 @@ +import { BaseRequestPolicy, WebResource } from "@azure/storage-blob"; + +// Create a policy factory with create() method provided +// In TypeScript, following factory class needs to implement Azure.RequestPolicyFactory type +export default class OPTIONSRequestPolicyFactory { + // Constructor to accept parameters + private origin: string | undefined; + private requstMethod: string | undefined; + private requestHeaders: string | undefined; + + constructor(origin?: string, requstMethod?: string, requestHeaders?: string) { + this.origin = origin; + this.requstMethod = requstMethod; + this.requestHeaders = requestHeaders; + } + + // create() method needs to create a new RequestIDPolicy object + create(nextPolicy: any, options: any) { + return new OPTIONSRequestPolicy( + nextPolicy, + options, + this.origin, + this.requstMethod, + this.requestHeaders + ); + } +} + +// Create a policy by extending from Azure.BaseRequestPolicy +class OPTIONSRequestPolicy extends BaseRequestPolicy { + private origin: string | undefined; + private requstMethod: string | undefined; + private requestHeaders: string | undefined; + constructor( + nextPolicy: any, + options: any, + origin?: string, + requstMethod?: string, + requestHeaders?: string + ) { + super(nextPolicy, options); + this.origin = origin; + this.requstMethod = requstMethod; + this.requestHeaders = requestHeaders; + } + + // Customize HTTP requests and responses by overriding sendRequest + // Parameter request is Azure.WebResource type + async sendRequest(request: WebResource) { + request.method = "OPTIONS"; + request.headers.set("Origin", `${this.origin}`); + if (this.origin !== undefined) { + request.headers.set("Origin", `${this.origin}`); + } + if (this.requstMethod !== undefined) { + request.headers.set( + "Access-Control-Request-Method", + `${this.requstMethod}` + ); + } + if (this.requestHeaders !== undefined) { + request.headers.set( + "Access-Control-Request-Headers", + `${this.requestHeaders}` + ); + } + + const response = await this._nextPolicy.sendRequest(request); + + return response; + } +} diff --git a/tests/blob/RequestPolicy/OriginPolicyFactory.ts b/tests/blob/RequestPolicy/OriginPolicyFactory.ts new file mode 100644 index 000000000..a95efe526 --- /dev/null +++ b/tests/blob/RequestPolicy/OriginPolicyFactory.ts @@ -0,0 +1,35 @@ +import { BaseRequestPolicy, WebResource } from "@azure/storage-blob"; + +// Create a policy factory with create() method provided +// In TypeScript, following factory class needs to implement Azure.RequestPolicyFactory type +export default class OriginPolicyFactory { + // Constructor to accept parameters + private origin: string; + constructor(origin: any) { + this.origin = origin; + } + + // create() method needs to create a new RequestIDPolicy object + create(nextPolicy: any, options: any) { + return new OriginPolicy(nextPolicy, options, this.origin); + } +} + +// Create a policy by extending from Azure.BaseRequestPolicy +class OriginPolicy extends BaseRequestPolicy { + private origin: string; + constructor(nextPolicy: any, options: any, origin: any) { + super(nextPolicy, options); + this.origin = origin; + } + + // Customize HTTP requests and responses by overriding sendRequest + // Parameter request is Azure.WebResource type + async sendRequest(request: WebResource) { + request.headers.set("Origin", `${this.origin}`); + + const response = await this._nextPolicy.sendRequest(request); + + return response; + } +} diff --git a/tests/blob/apis/service.test.ts b/tests/blob/apis/service.test.ts index 7b29ff8f9..ced19aa60 100644 --- a/tests/blob/apis/service.test.ts +++ b/tests/blob/apis/service.test.ts @@ -67,6 +67,25 @@ describe("ServiceAPIs", () => { ); }); + it("Set CORS with empty AllowedHeaders, ExposedHeaders", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = { + allowedHeaders: "", + allowedMethods: "GET", + allowedOrigins: "example.com", + exposedHeaders: "", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + const result = await serviceURL.getProperties(Aborter.none); + assert.deepStrictEqual(result.cors![0], newCORS); + }); + it("SetServiceProperties", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); diff --git a/tests/blob/blobCorsRequest.test.ts b/tests/blob/blobCorsRequest.test.ts new file mode 100644 index 000000000..2442d54ad --- /dev/null +++ b/tests/blob/blobCorsRequest.test.ts @@ -0,0 +1,639 @@ +import { + Aborter, + ServiceURL, + SharedKeyCredential, + StorageURL +} from "@azure/storage-queue"; +import * as assert from "assert"; + +import { configLogger } from "../../src/common/Logger"; +import BlobTestServerFactory from "../BlobTestServerFactory"; +import { + EMULATOR_ACCOUNT_KEY, + EMULATOR_ACCOUNT_NAME, + sleep +} from "../testutils"; +import OPTIONSRequestPolicyFactory from "./RequestPolicy/OPTIONSRequestPolicyFactory"; +import OriginPolicyFactory from "./RequestPolicy/OriginPolicyFactory"; + +// Set true to enable debug log +configLogger(false); + +describe("Blob Cors requests test", () => { + const factory = new BlobTestServerFactory(); + const server = factory.createServer(); + + const baseURL = `http://${server.config.host}:${server.config.port}/devstoreaccount1`; + const serviceURL = new ServiceURL( + baseURL, + StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ) + ); + + before(async () => { + await server.start(); + }); + + after(async () => { + await server.close(); + await server.clean(); + }); + + it("OPTIONS request without cors rules in server should be fail", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + serviceProperties.cors = []; + await serviceURL.setProperties(Aborter.none, serviceProperties); + + const origin = "Origin"; + const requestMethod = "GET"; + + const pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod) + ); + const serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + let error; + try { + await serviceURLforOPTIONS.getProperties(Aborter.none); + } catch (err) { + error = err; + } + + assert.ok(error.statusCode === 403); + assert.ok( + error.body.message.includes( + "CORS not enabled or no matching rule found for this request." + ) + ); + }); + + it("OPTIONS request should not work without matching cors rules", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "test", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + let origin = "Origin"; + let requestMethod = "GET"; + + let pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod) + ); + let serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + let error; + try { + await serviceURLforOPTIONS.getProperties(Aborter.none); + } catch (err) { + error = err; + } + + assert.ok(error.statusCode === 403); + assert.ok( + error.body.message.includes( + "CORS not enabled or no matching rule found for this request." + ) + ); + + origin = "test"; + requestMethod = "GET"; + + pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod) + ); + serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + const res = await serviceURLforOPTIONS.getProperties(Aborter.none); + assert.ok(res._response.status === 200); + }); + + it("OPTIONS request should not work without Origin header or matching allowedOrigins", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "test", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + const origin = "Origin"; + const requestMethod = "GET"; + + let pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod) + ); + let serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + let error; + try { + await serviceURLforOPTIONS.getProperties(Aborter.none); + } catch (err) { + error = err; + } + + assert.ok(error.statusCode === 403); + assert.ok( + error.body.message.includes( + "CORS not enabled or no matching rule found for this request." + ) + ); + + pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(undefined, requestMethod) + ); + serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + try { + await serviceURLforOPTIONS.getProperties(Aborter.none); + } catch (err) { + error = err; + } + + assert.ok(error.statusCode === 403); + assert.ok( + error.body.message.includes( + "CORS not enabled or no matching rule found for this request." + ) + ); + }); + + it("OPTIONS request should not work without requestMethod header or matching allowedMethods", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "test", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + const origin = "test"; + const requestMethod = "PUT"; + + let pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod) + ); + let serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + let error; + try { + await serviceURLforOPTIONS.getProperties(Aborter.none); + } catch (err) { + error = err; + } + + assert.ok(error.statusCode === 403); + assert.ok( + error.body.message.includes( + "CORS not enabled or no matching rule found for this request." + ) + ); + + pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, undefined) + ); + serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + try { + await serviceURLforOPTIONS.getProperties(Aborter.none); + } catch (err) { + error = err; + } + + assert.ok(error.statusCode === 400); + assert.ok( + error.body.message.includes("A required CORS header is not present.") + ); + }); + + it("OPTIONS request should check the defined requestHeaders", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = [ + { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "test", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }, + { + allowedHeaders: "*", + allowedMethods: "PUT", + allowedOrigins: "test", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }, + { + allowedHeaders: "head*", + allowedMethods: "POST", + allowedOrigins: "test", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + } + ]; + + serviceProperties.cors = newCORS; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + // No match + let origin = "test"; + let requestMethod = "GET"; + let reqestHeaders = "head"; + + let pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + ); + let serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + let error; + try { + await serviceURLforOPTIONS.getProperties(Aborter.none); + } catch (err) { + error = err; + } + + assert.ok(error.statusCode === 403); + assert.ok( + error.body.message.includes( + "CORS not enabled or no matching rule found for this request." + ) + ); + + // Match first cors. + origin = "test"; + requestMethod = "GET"; + reqestHeaders = "header"; + + pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + ); + serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + let res = await serviceURLforOPTIONS.getProperties(Aborter.none); + assert.ok(res._response.status === 200); + + // Match second cors. + origin = "test"; + requestMethod = "PUT"; + reqestHeaders = "head"; + + pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + ); + serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + res = await serviceURLforOPTIONS.getProperties(Aborter.none); + assert.ok(res._response.status === 200); + + // No match. + origin = "test"; + requestMethod = "POST"; + reqestHeaders = "hea"; + + pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + ); + serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + error; + try { + await serviceURLforOPTIONS.getProperties(Aborter.none); + } catch (err) { + error = err; + } + + assert.ok(error.statusCode === 403); + assert.ok( + error.body.message.includes( + "CORS not enabled or no matching rule found for this request." + ) + ); + + // Match third cors. + origin = "test"; + requestMethod = "POST"; + reqestHeaders = "headerheader"; + + pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod, reqestHeaders) + ); + serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + res = await serviceURLforOPTIONS.getProperties(Aborter.none); + assert.ok(res._response.status === 200); + }); + + it("OPTIONS request should work with matching rule containing Origion *", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "*", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + const origin = "anyOrigin"; + const requestMethod = "GET"; + + const pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift( + new OPTIONSRequestPolicyFactory(origin, requestMethod) + ); + const serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + + const res = await serviceURLforOPTIONS.getProperties(Aborter.none); + assert.ok(res._response.status === 200); + }); + + it("Response of request to service without cors rules should not contains cors info", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + serviceProperties.cors = []; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + const origin = "anyOrigin"; + const pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift(new OriginPolicyFactory(origin)); + const serviceURLwithOrigin = new ServiceURL(baseURL, pipeline); + + const res: any = await serviceURLwithOrigin.getProperties(Aborter.none); + + assert.ok(res["access-control-allow-origin"] === undefined); + assert.ok(res["access-control-exposed-headers"] === undefined); + assert.ok(res.vary === undefined); + }); + + it("Service with mismatching cors rules should response header Vary", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "test", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + const origin = "anyOrigin"; + const pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift(new OriginPolicyFactory(origin)); + const serviceURLwithOrigin = new ServiceURL(baseURL, pipeline); + + let res: any = await serviceURLwithOrigin.getProperties(Aborter.none); + assert.ok(res.vary !== undefined); + + res = await serviceURL.getProperties(Aborter.none); + assert.ok(res.vary !== undefined); + }); + + it("Request Match rule exists that allows all origins (*)", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "*", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + const origin = "anyOrigin"; + const pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift(new OriginPolicyFactory(origin)); + const serviceURLwithOrigin = new ServiceURL(baseURL, pipeline); + + let res: any = await serviceURLwithOrigin.getProperties(Aborter.none); + assert.ok(res["access-control-allow-origin"] === "*"); + assert.ok(res.vary === undefined); + assert.ok(res["access-control-exposed-headers"] !== undefined); + + res = await serviceURL.getProperties(Aborter.none); + assert.ok(res["access-control-allow-origin"] === "*"); + assert.ok(res.vary === undefined); + assert.ok(res["access-control-exposed-headers"] !== undefined); + }); + + it("Request Match rule exists for exact origin", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "exactOrigin", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + const origin = "exactOrigin"; + const pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift(new OriginPolicyFactory(origin)); + const serviceURLwithOrigin = new ServiceURL(baseURL, pipeline); + + const res: any = await serviceURLwithOrigin.getProperties(Aborter.none); + assert.ok(res["access-control-allow-origin"] === origin); + assert.ok(res.vary !== undefined); + assert.ok(res["access-control-exposed-headers"] !== undefined); + }); + + it("Request Match rule in sequence", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = [ + { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "exactOrigin", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }, + { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "*", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + } + ]; + + serviceProperties.cors = newCORS; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + const origin = "exactOrigin"; + const pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift(new OriginPolicyFactory(origin)); + const serviceURLwithOrigin = new ServiceURL(baseURL, pipeline); + + const res: any = await serviceURLwithOrigin.getProperties(Aborter.none); + assert.ok(res["access-control-allow-origin"] === origin); + assert.ok(res.vary !== undefined); + assert.ok(res["access-control-exposed-headers"] !== undefined); + }); +}); diff --git a/tests/queue/apis/queueService.test.ts b/tests/queue/apis/queueService.test.ts index a33930605..87af2647e 100644 --- a/tests/queue/apis/queueService.test.ts +++ b/tests/queue/apis/queueService.test.ts @@ -1,5 +1,3 @@ -import * as assert from "assert"; - import { Aborter, QueueURL, @@ -7,6 +5,7 @@ import { SharedKeyCredential, StorageURL } from "@azure/storage-queue"; +import * as assert from "assert"; import { configLogger } from "../../../src/common/Logger"; import { StoreDestinationArray } from "../../../src/common/persistence/IExtentStore"; @@ -90,6 +89,25 @@ describe("QueueServiceAPIs", () => { } }); + it("Set CORS with empty AllowedHeaders, ExposedHeaders", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = { + allowedHeaders: "", + allowedMethods: "GET", + allowedOrigins: "example.com", + exposedHeaders: "", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + const result = await serviceURL.getProperties(Aborter.none); + assert.deepStrictEqual(result.cors![0], newCORS); + }); + it("Set Queue service properties", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); assert.equal( diff --git a/tests/queue/queueCorsRequest.test.ts b/tests/queue/queueCorsRequest.test.ts index 8ba85c613..e8b1bc5d0 100644 --- a/tests/queue/queueCorsRequest.test.ts +++ b/tests/queue/queueCorsRequest.test.ts @@ -1,11 +1,10 @@ -import * as assert from "assert"; - import { Aborter, ServiceURL, SharedKeyCredential, StorageURL } from "@azure/storage-queue"; +import * as assert from "assert"; import { configLogger } from "../../src/common/Logger"; import { StoreDestinationArray } from "../../src/common/persistence/IExtentStore"; @@ -186,8 +185,8 @@ describe("Queue Cors requests test", () => { await sleep(100); - let origin = "Origin"; - let requestMethod = "GET"; + const origin = "Origin"; + const requestMethod = "GET"; let pipeline = StorageURL.newPipeline( new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), @@ -256,8 +255,8 @@ describe("Queue Cors requests test", () => { await sleep(100); - let origin = "test"; - let requestMethod = "PUT"; + const origin = "test"; + const requestMethod = "PUT"; let pipeline = StorageURL.newPipeline( new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), @@ -475,10 +474,10 @@ describe("Queue Cors requests test", () => { await sleep(100); - let origin = "anyOrigin"; - let requestMethod = "GET"; + const origin = "anyOrigin"; + const requestMethod = "GET"; - let pipeline = StorageURL.newPipeline( + const pipeline = StorageURL.newPipeline( new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), { retryOptions: { maxTries: 1 } @@ -487,7 +486,7 @@ describe("Queue Cors requests test", () => { pipeline.factories.unshift( new OPTIONSRequestPolicyFactory(origin, requestMethod) ); - let serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); + const serviceURLforOPTIONS = new ServiceURL(baseURL, pipeline); const res = await serviceURLforOPTIONS.getProperties(Aborter.none); assert.ok(res._response.status === 200); @@ -502,7 +501,7 @@ describe("Queue Cors requests test", () => { await sleep(100); - let origin = "anyOrigin"; + const origin = "anyOrigin"; const pipeline = StorageURL.newPipeline( new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), { @@ -516,10 +515,10 @@ describe("Queue Cors requests test", () => { assert.ok(res["access-control-allow-origin"] === undefined); assert.ok(res["access-control-exposed-headers"] === undefined); - assert.ok(res["vary"] === undefined); + assert.ok(res.vary === undefined); }); - it("Service with mismaching cors rules should response header Vary", async () => { + it("Service with mismatching cors rules should response header Vary", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -536,7 +535,7 @@ describe("Queue Cors requests test", () => { await sleep(100); - let origin = "anyOrigin"; + const origin = "anyOrigin"; const pipeline = StorageURL.newPipeline( new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), { @@ -547,10 +546,10 @@ describe("Queue Cors requests test", () => { const serviceURLwithOrigin = new ServiceURL(baseURL, pipeline); let res: any = await serviceURLwithOrigin.getProperties(Aborter.none); - assert.ok(res["vary"] !== undefined); + assert.ok(res.vary !== undefined); res = await serviceURL.getProperties(Aborter.none); - assert.ok(res["vary"] !== undefined); + assert.ok(res.vary !== undefined); }); it("Request Match rule exists that allows all origins (*)", async () => { @@ -570,7 +569,7 @@ describe("Queue Cors requests test", () => { await sleep(100); - let origin = "anyOrigin"; + const origin = "anyOrigin"; const pipeline = StorageURL.newPipeline( new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), { @@ -582,12 +581,12 @@ describe("Queue Cors requests test", () => { let res: any = await serviceURLwithOrigin.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === "*"); - assert.ok(res["vary"] === undefined); + assert.ok(res.vary === undefined); assert.ok(res["access-control-exposed-headers"] !== undefined); res = await serviceURL.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === "*"); - assert.ok(res["vary"] === undefined); + assert.ok(res.vary === undefined); assert.ok(res["access-control-exposed-headers"] !== undefined); }); @@ -608,7 +607,7 @@ describe("Queue Cors requests test", () => { await sleep(100); - let origin = "exactOrigin"; + const origin = "exactOrigin"; const pipeline = StorageURL.newPipeline( new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), { @@ -618,9 +617,9 @@ describe("Queue Cors requests test", () => { pipeline.factories.unshift(new OriginPolicyFactory(origin)); const serviceURLwithOrigin = new ServiceURL(baseURL, pipeline); - let res: any = await serviceURLwithOrigin.getProperties(Aborter.none); + const res: any = await serviceURLwithOrigin.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === origin); - assert.ok(res["vary"] !== undefined); + assert.ok(res.vary !== undefined); assert.ok(res["access-control-exposed-headers"] !== undefined); }); @@ -650,7 +649,7 @@ describe("Queue Cors requests test", () => { await sleep(100); - let origin = "exactOrigin"; + const origin = "exactOrigin"; const pipeline = StorageURL.newPipeline( new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), { @@ -660,9 +659,9 @@ describe("Queue Cors requests test", () => { pipeline.factories.unshift(new OriginPolicyFactory(origin)); const serviceURLwithOrigin = new ServiceURL(baseURL, pipeline); - let res: any = await serviceURLwithOrigin.getProperties(Aborter.none); + const res: any = await serviceURLwithOrigin.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === origin); - assert.ok(res["vary"] !== undefined); + assert.ok(res.vary !== undefined); assert.ok(res["access-control-exposed-headers"] !== undefined); }); }); From a974a88283f9e1151455ae1fa5573578eb3d1f6d Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Tue, 17 Dec 2019 11:57:29 +0800 Subject: [PATCH 06/34] Fixed a race condition that GC will delete active write extents; Force flush data into disk before request returns; (#309) * Fixed a race condition that GC will delete active write extents, fixed #288 * Force flush data into disk before data upload request returns. --- ChangeLog.md | 4 +- src/blob/gc/BlobGCManager.ts | 6 +- src/common/persistence/FDCache.ts | 10 +-- src/common/persistence/FSExtentStore.ts | 110 ++++++++++++++++-------- src/common/persistence/IExtentStore.ts | 4 +- src/common/persistence/IFDCache.ts | 8 +- src/queue/gc/QueueGCManager.ts | 7 +- 7 files changed, 96 insertions(+), 53 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index e212662f8..2e7f7f5c1 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -6,7 +6,9 @@ Upcoming Release - Fixed a bug that to return the list of containers in sorted order. - Fixed a bug that get/download blob snapshot fail. -- Check input request "x-ms-version" Header, only valid version are allowed +- Check input request "x-ms-version" Header, only valid version are allowed. +- Fixed a race condition that GC will delete active write extents. +- Force flush data into disk before data upload request returns. Blob: - Added support for CORS. diff --git a/src/blob/gc/BlobGCManager.ts b/src/blob/gc/BlobGCManager.ts index 7c23e3973..a21b92e4b 100644 --- a/src/blob/gc/BlobGCManager.ts +++ b/src/blob/gc/BlobGCManager.ts @@ -239,11 +239,11 @@ export default class BlobGCManager implements IGCManager { // sweep if (allExtents.size > 0) { this.logger.info( - `BlobGCManager:markSweep() Delete unreferenced extents.` + `BlobGCManager:markSweep() Try to delete ${allExtents.entries} unreferenced extents.` ); - await this.extentStore.deleteExtents(allExtents); + const deletedCount = await this.extentStore.deleteExtents(allExtents); this.logger.info( - `BlobGCManager:markSweep() Deleted unreferenced extents.` + `BlobGCManager:markSweep() Deleted unreferenced ${deletedCount} extents, after excluding active write extents.` ); } } diff --git a/src/common/persistence/FDCache.ts b/src/common/persistence/FDCache.ts index 6014757f8..2f343962d 100644 --- a/src/common/persistence/FDCache.ts +++ b/src/common/persistence/FDCache.ts @@ -73,10 +73,10 @@ export default class FDCache implements IFDCache { * Return -1 if the fd does not exist in the cache. * * @param {string} id - * @returns {(number | undefined)} + * @returns {Promise<(number | undefined)>} * @memberof FDCache */ - public get(id: string): number | undefined { + public async get(id: string): Promise { const fd = this.cache.get(id); return fd; } @@ -87,17 +87,17 @@ export default class FDCache implements IFDCache { * * @param {string} id * @param {number} fd - * @returns {void} + * @returns {Promise} * @memberof IFDCache */ - public insert(id: string, fd: number): void { + public async insert(id: string, fd: number): Promise { const count = this.queue.length; if (count === this.size) { const head = this.queue.shift(); const cachedfd = this.cache.get(head!); if (cachedfd !== undefined) { - closeAsync(cachedfd); this.cache.delete(head!); + await closeAsync(cachedfd); } } this.queue.push(id); diff --git a/src/common/persistence/FSExtentStore.ts b/src/common/persistence/FSExtentStore.ts index 7e40a2e3e..5c271c028 100644 --- a/src/common/persistence/FSExtentStore.ts +++ b/src/common/persistence/FSExtentStore.ts @@ -1,8 +1,9 @@ import { createReadStream, createWriteStream, + fdatasync, mkdir, - openSync, + open, stat, unlink } from "fs"; @@ -46,11 +47,11 @@ enum AppendStatusCode { interface IAppendExtent { id: string; offset: number; - appendStatus: AppendStatusCode; // 0 for idle, 1 for appeding + appendStatus: AppendStatusCode; // 0 for idle, 1 for appending persistencyId: string; } -// const openAsync = promisify(open); +const openAsync = promisify(open); /** * Persistency layer data store source implementation interacting with the storage media. @@ -64,14 +65,14 @@ export default class FSExtentStore implements IExtentStore { private readonly metadataStore: IExtentMetadataStore; private readonly appendQueue: IOperationQueue; private readonly readQueue: IOperationQueue; - private readonly fdCache: IFDCache; + private readonly fdWriteCache: IFDCache; private initialized: boolean = false; private closed: boolean = false; - // The current extents to be appended data. - private appendExtentArray: IAppendExtent[]; - private appendExtentNumber: number; + // The active extents to be appended data. + private activeWriteExtents: IAppendExtent[]; + private activeWriteExtentsNumber: number; private persistencyPath: Map; @@ -80,9 +81,8 @@ export default class FSExtentStore implements IExtentStore { private readonly persistencyConfiguration: StoreDestinationArray, private readonly logger: ILogger ) { - this.appendExtentArray = []; + this.activeWriteExtents = []; this.persistencyPath = new Map(); - this.fdCache = new FDCache(100); for (const storeDestination of persistencyConfiguration) { this.persistencyPath.set( @@ -93,14 +93,17 @@ export default class FSExtentStore implements IExtentStore { const appendExtent = this.createAppendExtent( storeDestination.persistencyId ); - this.appendExtentArray.push(appendExtent); + this.activeWriteExtents.push(appendExtent); } } - this.appendExtentNumber = this.appendExtentArray.length; + this.activeWriteExtentsNumber = this.activeWriteExtents.length; + this.fdWriteCache = new FDCache(this.activeWriteExtentsNumber); this.metadataStore = metadata; - this.appendQueue = new OperationQueue(this.appendExtentNumber, logger); - // TODO:Should add to interface to pass this parameter. + this.appendQueue = new OperationQueue( + this.activeWriteExtentsNumber, + logger + ); this.readQueue = new OperationQueue(DEFAULT_READ_CONCURRENCY, logger); } @@ -125,8 +128,8 @@ export default class FSExtentStore implements IExtentStore { await this.metadataStore.init(); } - if (!this.fdCache.isInitialized()) { - await this.fdCache.init(); + if (!this.fdWriteCache.isInitialized()) { + await this.fdWriteCache.init(); } this.initialized = true; @@ -134,8 +137,8 @@ export default class FSExtentStore implements IExtentStore { } public async close(): Promise { - if (!this.fdCache.isClosed()) { - await this.fdCache.close(); + if (!this.fdWriteCache.isClosed()) { + await this.fdWriteCache.close(); } if (!this.metadataStore.isClosed()) { @@ -178,28 +181,28 @@ export default class FSExtentStore implements IExtentStore { (async (): Promise => { let appendExtentIdx = 0; - for (let i = 1; i < this.appendExtentNumber; i++) { + for (let i = 1; i < this.activeWriteExtentsNumber; i++) { if ( - this.appendExtentArray[i].appendStatus === AppendStatusCode.Idle + this.activeWriteExtents[i].appendStatus === AppendStatusCode.Idle ) { appendExtentIdx = i; break; } } - this.appendExtentArray[appendExtentIdx].appendStatus = + this.activeWriteExtents[appendExtentIdx].appendStatus = AppendStatusCode.Appending; this.logger.info( - `FSExtentStore:appendExtent() Select extent from idle location for extent append operation. LocationId:${appendExtentIdx} extentId:${this.appendExtentArray[appendExtentIdx].id} offset:${this.appendExtentArray[appendExtentIdx].offset} MAX_EXTENT_SIZE:${MAX_EXTENT_SIZE} `, + `FSExtentStore:appendExtent() Select extent from idle location for extent append operation. LocationId:${appendExtentIdx} extentId:${this.activeWriteExtents[appendExtentIdx].id} offset:${this.activeWriteExtents[appendExtentIdx].offset} MAX_EXTENT_SIZE:${MAX_EXTENT_SIZE} `, contextId ); if ( - this.appendExtentArray[appendExtentIdx].offset > MAX_EXTENT_SIZE + this.activeWriteExtents[appendExtentIdx].offset > MAX_EXTENT_SIZE ) { - this.getNewExtent(this.appendExtentArray[appendExtentIdx]); + this.getNewExtent(this.activeWriteExtents[appendExtentIdx]); this.logger.info( - `FSExtentStore:appendExtent() Size of selected extent offset is larger than maximum extent size ${MAX_EXTENT_SIZE} bytes, try appending to new extent. New extent LocationID:${appendExtentIdx} extentId:${this.appendExtentArray[appendExtentIdx].id} offset:${this.appendExtentArray[appendExtentIdx].offset} MAX_EXTENT_SIZE:${MAX_EXTENT_SIZE} `, + `FSExtentStore:appendExtent() Size of selected extent offset is larger than maximum extent size ${MAX_EXTENT_SIZE} bytes, try appending to new extent. New extent LocationID:${appendExtentIdx} extentId:${this.activeWriteExtents[appendExtentIdx].id} offset:${this.activeWriteExtents[appendExtentIdx].offset} MAX_EXTENT_SIZE:${MAX_EXTENT_SIZE} `, contextId ); } @@ -211,18 +214,18 @@ export default class FSExtentStore implements IExtentStore { rs = data; } - const appendExtent = this.appendExtentArray[appendExtentIdx]; + const appendExtent = this.activeWriteExtents[appendExtentIdx]; const id = appendExtent.id; const path = this.generateExtentPath(appendExtent.persistencyId, id); - let fd = this.fdCache.get(id); + let fd = await this.fdWriteCache.get(id); this.logger.debug( `FSExtentStore:appendExtent() Get fd:${fd} for extent:${id} from cache.`, contextId ); if (fd === undefined) { - fd = openSync(path, "a"); // TODO: async - this.fdCache.insert(id, fd); + fd = await openAsync(path, "a"); + await this.fdWriteCache.insert(id, fd); this.logger.debug( `FSExtentStore:appendExtent() Open file:${path} for extent:${id}, get new fd:${fd}`, contextId @@ -243,7 +246,7 @@ export default class FSExtentStore implements IExtentStore { ); try { - count = await this.streamPipe(rs, ws); + count = await this.streamPipe(rs, ws, fd); const offset = appendExtent.offset; appendExtent.offset += count; @@ -419,11 +422,19 @@ export default class FSExtentStore implements IExtentStore { * Delete the extents from persistency layer. * * @param {Iterable} persistency - * @returns {Promise} + * @returns {Promise} Number of extents deleted * @memberof IExtentStore */ - public async deleteExtents(extents: Iterable): Promise { + public async deleteExtents(extents: Iterable): Promise { + let count = 0; for (const id of extents) { + // Should not delete active write extents + // Will not throw error because GC doesn't know extent is active, and will call this method to + // delete active extents + if (this.isActiveExtent(id)) { + continue; + } + const persistencyId = await this.metadataStore.getExtentPersistencyId(id); const path = this.generateExtentPath(persistencyId, id); @@ -435,8 +446,10 @@ export default class FSExtentStore implements IExtentStore { await this.metadataStore.deleteExtent(id); } } + + count++; } - return; + return count; } /** @@ -451,7 +464,8 @@ export default class FSExtentStore implements IExtentStore { private async streamPipe( rs: NodeJS.ReadableStream, - ws: Writable + ws: Writable, + fd?: number ): Promise { return new Promise((resolve, reject) => { let count: number = 0; @@ -483,12 +497,40 @@ export default class FSExtentStore implements IExtentStore { rs.resume(); }) .on("finish", () => { - resolve(count); + if (typeof fd === "number") { + fdatasync(fd, err => { + if (err) { + reject(err); + } else { + resolve(count); + } + }); + } else { + resolve(count); + } }) .on("error", reject); }); } + /** + * Check an extent is one of active extents or not. + * + * @private + * @param {string} id + * @returns {boolean} + * @memberof FSExtentStore + */ + private isActiveExtent(id: string): boolean { + // TODO: Use map instead of array to quick check + for (const extent of this.activeWriteExtents) { + if (extent.id === id) { + return true; + } + } + return false; + } + /** * Create a new append extent model for a new write directory. * diff --git a/src/common/persistence/IExtentStore.ts b/src/common/persistence/IExtentStore.ts index bb8be4fb9..13ff0dc69 100644 --- a/src/common/persistence/IExtentStore.ts +++ b/src/common/persistence/IExtentStore.ts @@ -80,10 +80,10 @@ export default interface IExtentStore extends IDataStore, ICleaner { * Delete the extents from persistency layer. * * @param {Iterable} persistency - * @returns {Promise} + * @returns {Promise} Number of extents deleted * @memberof IExtentStore */ - deleteExtents(persistency: Iterable): Promise; + deleteExtents(persistency: Iterable): Promise; /** * Return its metadata store. diff --git a/src/common/persistence/IFDCache.ts b/src/common/persistence/IFDCache.ts index 746f1eff4..e271c78ab 100644 --- a/src/common/persistence/IFDCache.ts +++ b/src/common/persistence/IFDCache.ts @@ -36,18 +36,18 @@ export default interface IFDCache { * Return -1 if the fd does not exist in the cache. * * @param {string} id - * @returns {(number | undefined)} + * @returns {Promise<(number | undefined)>} * @memberof IFDCache */ - get(id: string): number | undefined; + get(id: string): Promise; /** * Insert a new fd to the cache. * * @param {string} id * @param {number} fd - * @returns {void} + * @returns {Promise} * @memberof IFDCache */ - insert(id: string, fd: number): void; + insert(id: string, fd: number): Promise; } diff --git a/src/queue/gc/QueueGCManager.ts b/src/queue/gc/QueueGCManager.ts index dd9c51bbd..d916c8756 100644 --- a/src/queue/gc/QueueGCManager.ts +++ b/src/queue/gc/QueueGCManager.ts @@ -197,12 +197,11 @@ export default class QueueGCManager implements IGCManager { if (allExtents.size > 0) { this.logger.info( - `QueueGCManager:markSweep() Start to delete unreferenced extents.` + `QueueGCManager:markSweep() Start to delete ${allExtents.size} unreferenced extents.` ); - await this.extentStore.deleteExtents(allExtents); + const deletedCount = await this.extentStore.deleteExtents(allExtents); this.logger.info( - `QueueGCManager:markSweep() Finish Deleting - unreferenced extents.` + `QueueGCManager:markSweep() Deleted ${deletedCount} unreferenced extents, after excluding active write extents.` ); } } From 83e5f64a4f5798dbcba632be900210b6edd5cce6 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Wed, 18 Dec 2019 11:06:27 +0800 Subject: [PATCH 07/34] =?UTF-8?q?Added=20detailed=20logging=20for=20stream?= =?UTF-8?q?=20pipe=20and=20FDCache;=20Update=20default=20ma=E2=80=A6=20(#3?= =?UTF-8?q?24)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Added detailed logging for stream pipe and FDCache; Update default max extent size to 64MB; * Fixed a race condition that FECache will close active fd; * Remove FD Cache --- src/common/persistence/FDCache.ts | 116 ---------------------- src/common/persistence/FSExtentStore.ts | 126 +++++++++++++++++++----- src/common/persistence/IFDCache.ts | 53 ---------- src/common/utils/constants.ts | 2 +- 4 files changed, 101 insertions(+), 196 deletions(-) delete mode 100644 src/common/persistence/FDCache.ts delete mode 100644 src/common/persistence/IFDCache.ts diff --git a/src/common/persistence/FDCache.ts b/src/common/persistence/FDCache.ts deleted file mode 100644 index 2f343962d..000000000 --- a/src/common/persistence/FDCache.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { close } from "fs"; -import { promisify } from "util"; - -import { - DEFAULT_FD_CACHE_NUMBER, - FD_CACHE_NUMBER_MAX, - FD_CACHE_NUMBER_MIN -} from "../utils/constants"; -import IFDCache from "./IFDCache"; - -const closeAsync = promisify(close); - -export default class FDCache implements IFDCache { - private initialized: boolean = false; - private closed: boolean = false; - - private size: number; - private queue: string[]; - private cache: Map; - - public constructor(size: number = DEFAULT_FD_CACHE_NUMBER) { - if (size < FD_CACHE_NUMBER_MIN || size > FD_CACHE_NUMBER_MAX) { - size = DEFAULT_FD_CACHE_NUMBER; - } - this.size = size; - this.queue = []; - this.cache = new Map(); - } - - /** - * Init the FDCache. - * - * @returns {Promise} - * @memberof IFDCache - */ - public async init(): Promise { - this.initialized = true; - } - - /** - * Close FDCache, release the file descriptor. - * - * @returns {Promise} - * @memberof IFDCache - */ - public async close(): Promise { - await this.clear(); - this.closed = true; - } - - /** - * Whether the fd has been initialized. - * - * @returns {boolean} - * @memberof IFDCache - */ - public isInitialized(): boolean { - return this.initialized; - } - - /** - * Whether the fd has benn closed. - * - * @returns {boolean} - * @memberof IFDCache - */ - public isClosed(): boolean { - return this.closed; - } - - /** - * Get the fd with the given id. - * Return -1 if the fd does not exist in the cache. - * - * @param {string} id - * @returns {Promise<(number | undefined)>} - * @memberof FDCache - */ - public async get(id: string): Promise { - const fd = this.cache.get(id); - return fd; - } - - /** - * Insert a new fd to the cache. - * Replace an old item if the cache is full. The replaced FD should be closed. - * - * @param {string} id - * @param {number} fd - * @returns {Promise} - * @memberof IFDCache - */ - public async insert(id: string, fd: number): Promise { - const count = this.queue.length; - if (count === this.size) { - const head = this.queue.shift(); - const cachedfd = this.cache.get(head!); - if (cachedfd !== undefined) { - this.cache.delete(head!); - await closeAsync(cachedfd); - } - } - this.queue.push(id); - this.cache.set(id, fd); - } - - public async clear(): Promise { - const closeFDPromises: Promise[] = []; - this.cache.forEach(fd => { - closeFDPromises.push(closeAsync(fd)); - }); - await Promise.all(closeFDPromises); - this.queue = []; - this.cache.clear(); - } -} diff --git a/src/common/persistence/FSExtentStore.ts b/src/common/persistence/FSExtentStore.ts index 5c271c028..73988be2a 100644 --- a/src/common/persistence/FSExtentStore.ts +++ b/src/common/persistence/FSExtentStore.ts @@ -1,4 +1,5 @@ import { + close, createReadStream, createWriteStream, fdatasync, @@ -22,13 +23,11 @@ import { } from "../utils/constants"; import { rimrafAsync } from "../utils/utils"; import ZeroBytesStream from "../ZeroBytesStream"; -import FDCache from "./FDCache"; import IExtentMetadataStore, { IExtentModel } from "./IExtentMetadataStore"; import IExtentStore, { IExtentChunk, StoreDestinationArray } from "./IExtentStore"; -import IFDCache from "./IFDCache"; import IOperationQueue from "./IOperationQueue"; import OperationQueue from "./OperationQueue"; @@ -48,10 +47,12 @@ interface IAppendExtent { id: string; offset: number; appendStatus: AppendStatusCode; // 0 for idle, 1 for appending - persistencyId: string; + locationId: string; + fd?: number; } const openAsync = promisify(open); +const closeAsync = promisify(close); /** * Persistency layer data store source implementation interacting with the storage media. @@ -65,7 +66,6 @@ export default class FSExtentStore implements IExtentStore { private readonly metadataStore: IExtentMetadataStore; private readonly appendQueue: IOperationQueue; private readonly readQueue: IOperationQueue; - private readonly fdWriteCache: IFDCache; private initialized: boolean = false; private closed: boolean = false; @@ -97,7 +97,6 @@ export default class FSExtentStore implements IExtentStore { } } this.activeWriteExtentsNumber = this.activeWriteExtents.length; - this.fdWriteCache = new FDCache(this.activeWriteExtentsNumber); this.metadataStore = metadata; this.appendQueue = new OperationQueue( @@ -128,19 +127,11 @@ export default class FSExtentStore implements IExtentStore { await this.metadataStore.init(); } - if (!this.fdWriteCache.isInitialized()) { - await this.fdWriteCache.init(); - } - this.initialized = true; this.closed = false; } public async close(): Promise { - if (!this.fdWriteCache.isClosed()) { - await this.fdWriteCache.close(); - } - if (!this.metadataStore.isClosed()) { await this.metadataStore.close(); } @@ -198,11 +189,34 @@ export default class FSExtentStore implements IExtentStore { ); if ( - this.activeWriteExtents[appendExtentIdx].offset > MAX_EXTENT_SIZE + this.activeWriteExtents[appendExtentIdx].offset >= MAX_EXTENT_SIZE ) { - this.getNewExtent(this.activeWriteExtents[appendExtentIdx]); this.logger.info( - `FSExtentStore:appendExtent() Size of selected extent offset is larger than maximum extent size ${MAX_EXTENT_SIZE} bytes, try appending to new extent. New extent LocationID:${appendExtentIdx} extentId:${this.activeWriteExtents[appendExtentIdx].id} offset:${this.activeWriteExtents[appendExtentIdx].offset} MAX_EXTENT_SIZE:${MAX_EXTENT_SIZE} `, + `FSExtentStore:appendExtent() Size of selected extent offset is larger than maximum extent size ${MAX_EXTENT_SIZE} bytes, try appending to new extent.`, + contextId + ); + + const selectedFd = this.activeWriteExtents[appendExtentIdx].fd; + if (selectedFd) { + this.logger.info( + `FSExtentStore:appendExtent() Close unused fd:${selectedFd}.`, + contextId + ); + try { + await closeAsync(selectedFd); + } catch (err) { + this.logger.error( + `FSExtentStore:appendExtent() Close unused fd:${selectedFd} error:${JSON.stringify( + err + )}.`, + contextId + ); + } + } + + await this.getNewExtent(this.activeWriteExtents[appendExtentIdx]); + this.logger.info( + `FSExtentStore:appendExtent() Allocated new extent LocationID:${appendExtentIdx} extentId:${this.activeWriteExtents[appendExtentIdx].id} offset:${this.activeWriteExtents[appendExtentIdx].offset} MAX_EXTENT_SIZE:${MAX_EXTENT_SIZE} `, contextId ); } @@ -216,16 +230,15 @@ export default class FSExtentStore implements IExtentStore { const appendExtent = this.activeWriteExtents[appendExtentIdx]; const id = appendExtent.id; - const path = this.generateExtentPath(appendExtent.persistencyId, id); - - let fd = await this.fdWriteCache.get(id); + const path = this.generateExtentPath(appendExtent.locationId, id); + let fd = appendExtent.fd; this.logger.debug( `FSExtentStore:appendExtent() Get fd:${fd} for extent:${id} from cache.`, contextId ); if (fd === undefined) { fd = await openAsync(path, "a"); - await this.fdWriteCache.insert(id, fd); + appendExtent.fd = fd; this.logger.debug( `FSExtentStore:appendExtent() Open file:${path} for extent:${id}, get new fd:${fd}`, contextId @@ -233,11 +246,15 @@ export default class FSExtentStore implements IExtentStore { } const ws = createWriteStream(path, { - flags: "a", fd, autoClose: false }); + this.logger.debug( + `FSExtentStore:appendExtent() Created write stream for fd:${fd}`, + contextId + ); + let count = 0; this.logger.debug( @@ -246,13 +263,13 @@ export default class FSExtentStore implements IExtentStore { ); try { - count = await this.streamPipe(rs, ws, fd); + count = await this.streamPipe(rs, ws, fd, contextId); const offset = appendExtent.offset; appendExtent.offset += count; const extent: IExtentModel = { id, - persistencyId: appendExtent.persistencyId, + persistencyId: appendExtent.locationId, path: id, size: count + offset, lastModifiedInMS: Date.now() @@ -465,9 +482,15 @@ export default class FSExtentStore implements IExtentStore { private async streamPipe( rs: NodeJS.ReadableStream, ws: Writable, - fd?: number + fd?: number, + contextId?: string ): Promise { return new Promise((resolve, reject) => { + this.logger.debug( + `FSExtentStore:streamPipe() Start piping data to write stream`, + contextId + ); + let count: number = 0; let wsEnd = false; @@ -478,18 +501,42 @@ export default class FSExtentStore implements IExtentStore { } }) .on("end", () => { + this.logger.debug( + `FSExtentStore:streamPipe() Readable stream triggers close event, ${count} bytes piped`, + contextId + ); + if (!wsEnd) { + this.logger.debug( + `FSExtentStore:streamPipe() Invoke write stream end()`, + contextId + ); ws.end(); wsEnd = true; } }) .on("close", () => { + this.logger.debug( + `FSExtentStore:streamPipe() Readable stream triggers close event, ${count} bytes piped`, + contextId + ); + if (!wsEnd) { + this.logger.debug( + `FSExtentStore:streamPipe() Invoke write stream end()`, + contextId + ); ws.end(); wsEnd = true; } }) .on("error", err => { + this.logger.debug( + `FSExtentStore:streamPipe() Readable stream triggers error event, error:${JSON.stringify( + err + )}, after ${count} bytes piped. Invoke write stream destroy() method.`, + contextId + ); ws.destroy(err); }); @@ -498,18 +545,44 @@ export default class FSExtentStore implements IExtentStore { }) .on("finish", () => { if (typeof fd === "number") { + this.logger.debug( + `FSExtentStore:streamPipe() Writable stream triggers finish event, after ${count} bytes piped. Flush data to fd:${fd}.`, + contextId + ); fdatasync(fd, err => { if (err) { + this.logger.debug( + `FSExtentStore:streamPipe() Flush data to fd:${fd} failed with error:${JSON.stringify( + err + )}. Reject streamPipe().`, + contextId + ); reject(err); } else { + this.logger.debug( + `FSExtentStore:streamPipe() Flush data to fd:${fd} successfully. Resolve streamPipe().`, + contextId + ); resolve(count); } }); } else { + this.logger.debug( + `FSExtentStore:streamPipe() Resolve streamPipe() without flushing data.`, + contextId + ); resolve(count); } }) - .on("error", reject); + .on("error", err => { + this.logger.debug( + `FSExtentStore:streamPipe() Writable stream triggers error event, error:${JSON.stringify( + err + )}, after ${count} bytes piped. Reject streamPipe().`, + contextId + ); + reject(err); + }); }); } @@ -544,7 +617,7 @@ export default class FSExtentStore implements IExtentStore { id: uuid(), offset: 0, appendStatus: AppendStatusCode.Idle, - persistencyId + locationId: persistencyId }; } @@ -558,6 +631,7 @@ export default class FSExtentStore implements IExtentStore { private getNewExtent(appendExtent: IAppendExtent) { appendExtent.id = uuid(); appendExtent.offset = 0; + appendExtent.fd = undefined; } /** diff --git a/src/common/persistence/IFDCache.ts b/src/common/persistence/IFDCache.ts deleted file mode 100644 index e271c78ab..000000000 --- a/src/common/persistence/IFDCache.ts +++ /dev/null @@ -1,53 +0,0 @@ -export default interface IFDCache { - /** - * Init the FDCache. - * - * @returns {Promise} - * @memberof IFDCache - */ - init(): Promise; - - /** - * Close FDCache, release the file descriptor. - * - * @returns {Promise} - * @memberof IFDCache - */ - close(): Promise; - - /** - * Whether the fd has been initialized. - * - * @returns {boolean} - * @memberof IFDCache - */ - isInitialized(): boolean; - - /** - * Whether the fd has benn closed. - * - * @returns {boolean} - * @memberof IFDCache - */ - isClosed(): boolean; - - /** - * Get the fd with the given id. - * Return -1 if the fd does not exist in the cache. - * - * @param {string} id - * @returns {Promise<(number | undefined)>} - * @memberof IFDCache - */ - get(id: string): Promise; - - /** - * Insert a new fd to the cache. - * - * @param {string} id - * @param {number} fd - * @returns {Promise} - * @memberof IFDCache - */ - insert(id: string, fd: number): Promise; -} diff --git a/src/common/utils/constants.ts b/src/common/utils/constants.ts index 1d73b38df..991d65800 100644 --- a/src/common/utils/constants.ts +++ b/src/common/utils/constants.ts @@ -3,7 +3,7 @@ export const DEFAULT_ACCOUNTS_REFRESH_INTERVAL = 60 * 1000; // 60s export const DEFAULT_FD_CACHE_NUMBER = 100; export const FD_CACHE_NUMBER_MIN = 1; export const FD_CACHE_NUMBER_MAX = 100; -export const DEFAULT_MAX_EXTENT_SIZE = 4 * 1024 * 1024; +export const DEFAULT_MAX_EXTENT_SIZE = 64 * 1024 * 1024; // 64 MB export const DEFAULT_READ_CONCURRENCY = 100; export const DEFAULT_EXTENT_GC_PROTECT_TIME_IN_MS = 10 * 60 * 1000; // 10mins export const DEFAULT_SQL_CHARSET = "utf8mb4"; From 15c15a0f8697ecf580f6fdc847a3dbac061b4a7e Mon Sep 17 00:00:00 2001 From: Lin Jian Date: Wed, 18 Dec 2019 12:15:38 +0800 Subject: [PATCH 08/34] fix CORS typos (#325) * fix CORS typos * CORS get headers --- .../preflight/PreflightMiddlewareFactory.ts | 4 +- src/blob/utils/constants.ts | 2 +- src/queue/QueueRequestListenerFactory.ts | 11 +- .../preflight/PreflightMiddlewareFactory.ts | 162 ++++++++++-------- src/queue/utils/constants.ts | 2 +- tests/blob/blobCorsRequest.test.ts | 10 +- tests/queue/queueCorsRequest.test.ts | 10 +- 7 files changed, 114 insertions(+), 87 deletions(-) diff --git a/src/blob/preflight/PreflightMiddlewareFactory.ts b/src/blob/preflight/PreflightMiddlewareFactory.ts index 0af5cf423..cf3f88156 100644 --- a/src/blob/preflight/PreflightMiddlewareFactory.ts +++ b/src/blob/preflight/PreflightMiddlewareFactory.ts @@ -110,7 +110,7 @@ export default class PreflightMiddlewareFactory { ); if (requestHeaders !== undefined) { res.setHeader( - HeaderConstants.ACCESS_CONTROL_REQUEST_HEADERS, + HeaderConstants.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders ); } @@ -178,7 +178,7 @@ export default class PreflightMiddlewareFactory { ); res.setHeader( - HeaderConstants.ACCESS_CONTROL_EXPOSED_HEADER, + HeaderConstants.ACCESS_CONTROL_EXPOSE_HEADER, exposedHeaders ); diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index a94d94b80..38af1919c 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -52,7 +52,7 @@ export const HeaderConstants = { X_MS_VERSION: "x-ms-version", ORIGIN: "origin", VARY: "Vary", - ACCESS_CONTROL_EXPOSED_HEADER: "Access-Control-Exposed-Headers", + ACCESS_CONTROL_EXPOSE_HEADER: "Access-Control-Expose-Headers", ACCESS_CONTROL_ALLOW_ORIGIN: "Access-Control-Allow-Origin", ACCESS_CONTROL_ALLOW_CREDENTIALS: "Access-Control-Allow-Credentials", ACCESS_CONTROL_ALLOW_METHODS: "Access-Control-Allow-Methods", diff --git a/src/queue/QueueRequestListenerFactory.ts b/src/queue/QueueRequestListenerFactory.ts index 379f116a0..45b402072 100644 --- a/src/queue/QueueRequestListenerFactory.ts +++ b/src/queue/QueueRequestListenerFactory.ts @@ -120,7 +120,16 @@ export default class QueueRequestListenerFactory // tslint:disable-next-line:max-line-length // See as https://docs.microsoft.com/en-us/rest/api/storageservices/cross-origin-resource-sharing--cors--support-for-the-azure-storage-services app.use( - preflightMiddlewareFactory.createCorsRequestMiddleware(this.metadataStore) + preflightMiddlewareFactory.createCorsRequestMiddleware( + this.metadataStore, + false + ) + ); + app.use( + preflightMiddlewareFactory.createCorsRequestMiddleware( + this.metadataStore, + true + ) ); // Generated, will serialize response models into HTTP response diff --git a/src/queue/preflight/PreflightMiddlewareFactory.ts b/src/queue/preflight/PreflightMiddlewareFactory.ts index 3ce581712..6e432ad78 100644 --- a/src/queue/preflight/PreflightMiddlewareFactory.ts +++ b/src/queue/preflight/PreflightMiddlewareFactory.ts @@ -110,7 +110,7 @@ export default class PreflightMiddlewareFactory { ); if (requestHeaders !== undefined) { res.setHeader( - HeaderConstants.ACCESS_CONTROL_REQUEST_HEADERS, + HeaderConstants.ACCESS_CONTROL_ALLOW_HEADERS, requestHeaders ); } @@ -139,11 +139,17 @@ export default class PreflightMiddlewareFactory { } public createCorsRequestMiddleware( - metadataStore: IQueueMetadataStore - ): RequestHandler { - return (req: Request, res: Response, next: NextFunction) => { + metadataStore: IQueueMetadataStore, + blockErrorRequest: boolean = false + ): ErrorRequestHandler | RequestHandler { + const internalMethod = ( + err: MiddlewareError | Error | undefined, + req: Request, + res: Response, + next: NextFunction + ) => { if (req.method.toUpperCase() === MethodConstants.OPTIONS) { - return next(); + return next(err); } const context = new QueueStorageContext( @@ -158,14 +164,14 @@ export default class PreflightMiddlewareFactory { const method = req.method; if (method === undefined || typeof method !== "string") { - return next(); + return next(err); } metadataStore .getServiceProperties(account) .then(properties => { if (properties === undefined || properties.cors === undefined) { - return next(); + return next(err); } const corsSet = properties.cors; const resHeaders = this.getResponseHeaders(res); @@ -181,7 +187,7 @@ export default class PreflightMiddlewareFactory { ); res.setHeader( - HeaderConstants.ACCESS_CONTROL_EXPOSED_HEADER, + HeaderConstants.ACCESS_CONTROL_EXPOSE_HEADER, exposedHeaders ); @@ -198,16 +204,24 @@ export default class PreflightMiddlewareFactory { ); } - return next(); + return next(err); } } if (corsSet.length > 0) { res.setHeader(HeaderConstants.VARY, "Origin"); } - return next(); + return next(err); }) .catch(next); }; + + if (blockErrorRequest) { + return internalMethod; + } else { + return (req: Request, res: Response, next: NextFunction) => { + internalMethod(undefined, req, res, next); + }; + } } private checkOrigin( @@ -270,81 +284,85 @@ export default class PreflightMiddlewareFactory { } private getResponseHeaders(res: Response): string[] { + const responseHeaderSet = []; + const handlerResponse = res.locals.azurite_queue_context.handlerResponses; - const statusCodeInResponse: number = handlerResponse.statusCode; - const spec = Specifications[res.locals.azurite_queue_context.operation]; - const responseSpec = spec.responses[statusCodeInResponse]; - if (!responseSpec) { - throw new TypeError( - `Request specification doesn't include provided response status code` - ); - } - // Serialize headers - const headerSerializer = new msRest.Serializer(Mappers); - const headersMapper = responseSpec.headersMapper; + if (handlerResponse) { + const statusCodeInResponse: number = handlerResponse.statusCode; + const spec = Specifications[res.locals.azurite_queue_context.operation]; + const responseSpec = spec.responses[statusCodeInResponse]; + if (!responseSpec) { + throw new TypeError( + `Request specification doesn't include provided response status code` + ); + } - const responseHeaderSet = []; - if (headersMapper && headersMapper.type.name === "Composite") { - const mappersForAllHeaders = headersMapper.type.modelProperties || {}; - - // Handle headerMapper one by one - for (const key in mappersForAllHeaders) { - if (mappersForAllHeaders.hasOwnProperty(key)) { - const headerMapper = mappersForAllHeaders[key]; - const headerName = headerMapper.serializedName; - const headerValueOriginal = handlerResponse[key]; - const headerValueSerialized = headerSerializer.serialize( - headerMapper, - headerValueOriginal - ); + // Serialize headers + const headerSerializer = new msRest.Serializer(Mappers); + const headersMapper = responseSpec.headersMapper; + + if (headersMapper && headersMapper.type.name === "Composite") { + const mappersForAllHeaders = headersMapper.type.modelProperties || {}; + + // Handle headerMapper one by one + for (const key in mappersForAllHeaders) { + if (mappersForAllHeaders.hasOwnProperty(key)) { + const headerMapper = mappersForAllHeaders[key]; + const headerName = headerMapper.serializedName; + const headerValueOriginal = handlerResponse[key]; + const headerValueSerialized = headerSerializer.serialize( + headerMapper, + headerValueOriginal + ); - // Handle collection of headers starting with same prefix, such as x-ms-meta prefix - const headerCollectionPrefix = (headerMapper as msRest.DictionaryMapper) - .headerCollectionPrefix; - if ( - headerCollectionPrefix !== undefined && - headerValueOriginal !== undefined - ) { - for (const collectionHeaderPartialName in headerValueSerialized) { - if ( - headerValueSerialized.hasOwnProperty( - collectionHeaderPartialName - ) - ) { - const collectionHeaderValueSerialized = - headerValueSerialized[collectionHeaderPartialName]; - const collectionHeaderName = `${headerCollectionPrefix}${collectionHeaderPartialName}`; + // Handle collection of headers starting with same prefix, such as x-ms-meta prefix + const headerCollectionPrefix = (headerMapper as msRest.DictionaryMapper) + .headerCollectionPrefix; + if ( + headerCollectionPrefix !== undefined && + headerValueOriginal !== undefined + ) { + for (const collectionHeaderPartialName in headerValueSerialized) { if ( - collectionHeaderName && - collectionHeaderValueSerialized !== undefined + headerValueSerialized.hasOwnProperty( + collectionHeaderPartialName + ) ) { - responseHeaderSet.push(collectionHeaderName); + const collectionHeaderValueSerialized = + headerValueSerialized[collectionHeaderPartialName]; + const collectionHeaderName = `${headerCollectionPrefix}${collectionHeaderPartialName}`; + if ( + collectionHeaderName && + collectionHeaderValueSerialized !== undefined + ) { + responseHeaderSet.push(collectionHeaderName); + } } } - } - } else { - if (headerName && headerValueSerialized !== undefined) { - responseHeaderSet.push(headerName); + } else { + if (headerName && headerValueSerialized !== undefined) { + responseHeaderSet.push(headerName); + } } } } } - } - if ( - spec.isXML && - responseSpec.bodyMapper && - responseSpec.bodyMapper.type.name !== "Stream" - ) { - responseHeaderSet.push("content-type"); - responseHeaderSet.push("content-length"); - } else if ( - handlerResponse.body && - responseSpec.bodyMapper && - responseSpec.bodyMapper.type.name === "Stream" - ) { - responseHeaderSet.push("content-length"); + if ( + spec.isXML && + responseSpec.bodyMapper && + responseSpec.bodyMapper.type.name !== "Stream" + ) { + responseHeaderSet.push("content-type"); + responseHeaderSet.push("content-length"); + } else if ( + handlerResponse.body && + responseSpec.bodyMapper && + responseSpec.bodyMapper.type.name === "Stream" + ) { + responseHeaderSet.push("content-length"); + } } const headers = res.getHeaders(); diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 6eefaf03f..e3b729bf0 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -68,7 +68,7 @@ export const HeaderConstants = { X_MS_META: "x-ms-meta-", ORIGIN: "origin", VARY: "Vary", - ACCESS_CONTROL_EXPOSED_HEADER: "Access-Control-Exposed-Headers", + ACCESS_CONTROL_EXPOSE_HEADER: "Access-Control-Expose-Headers", ACCESS_CONTROL_ALLOW_ORIGIN: "Access-Control-Allow-Origin", ACCESS_CONTROL_ALLOW_CREDENTIALS: "Access-Control-Allow-Credentials", ACCESS_CONTROL_ALLOW_METHODS: "Access-Control-Allow-Methods", diff --git a/tests/blob/blobCorsRequest.test.ts b/tests/blob/blobCorsRequest.test.ts index 2442d54ad..92db40b15 100644 --- a/tests/blob/blobCorsRequest.test.ts +++ b/tests/blob/blobCorsRequest.test.ts @@ -486,7 +486,7 @@ describe("Blob Cors requests test", () => { const res: any = await serviceURLwithOrigin.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === undefined); - assert.ok(res["access-control-exposed-headers"] === undefined); + assert.ok(res["access-control-expose-headers"] === undefined); assert.ok(res.vary === undefined); }); @@ -554,12 +554,12 @@ describe("Blob Cors requests test", () => { let res: any = await serviceURLwithOrigin.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === "*"); assert.ok(res.vary === undefined); - assert.ok(res["access-control-exposed-headers"] !== undefined); + assert.ok(res["access-control-expose-headers"] !== undefined); res = await serviceURL.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === "*"); assert.ok(res.vary === undefined); - assert.ok(res["access-control-exposed-headers"] !== undefined); + assert.ok(res["access-control-expose-headers"] !== undefined); }); it("Request Match rule exists for exact origin", async () => { @@ -592,7 +592,7 @@ describe("Blob Cors requests test", () => { const res: any = await serviceURLwithOrigin.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === origin); assert.ok(res.vary !== undefined); - assert.ok(res["access-control-exposed-headers"] !== undefined); + assert.ok(res["access-control-expose-headers"] !== undefined); }); it("Request Match rule in sequence", async () => { @@ -634,6 +634,6 @@ describe("Blob Cors requests test", () => { const res: any = await serviceURLwithOrigin.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === origin); assert.ok(res.vary !== undefined); - assert.ok(res["access-control-exposed-headers"] !== undefined); + assert.ok(res["access-control-expose-headers"] !== undefined); }); }); diff --git a/tests/queue/queueCorsRequest.test.ts b/tests/queue/queueCorsRequest.test.ts index e8b1bc5d0..cba6a8041 100644 --- a/tests/queue/queueCorsRequest.test.ts +++ b/tests/queue/queueCorsRequest.test.ts @@ -514,7 +514,7 @@ describe("Queue Cors requests test", () => { const res: any = await serviceURLwithOrigin.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === undefined); - assert.ok(res["access-control-exposed-headers"] === undefined); + assert.ok(res["access-control-expose-headers"] === undefined); assert.ok(res.vary === undefined); }); @@ -582,12 +582,12 @@ describe("Queue Cors requests test", () => { let res: any = await serviceURLwithOrigin.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === "*"); assert.ok(res.vary === undefined); - assert.ok(res["access-control-exposed-headers"] !== undefined); + assert.ok(res["access-control-expose-headers"] !== undefined); res = await serviceURL.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === "*"); assert.ok(res.vary === undefined); - assert.ok(res["access-control-exposed-headers"] !== undefined); + assert.ok(res["access-control-expose-headers"] !== undefined); }); it("Request Match rule exists for exact origin", async () => { @@ -620,7 +620,7 @@ describe("Queue Cors requests test", () => { const res: any = await serviceURLwithOrigin.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === origin); assert.ok(res.vary !== undefined); - assert.ok(res["access-control-exposed-headers"] !== undefined); + assert.ok(res["access-control-expose-headers"] !== undefined); }); it("Request Match rule in sequence", async () => { @@ -662,6 +662,6 @@ describe("Queue Cors requests test", () => { const res: any = await serviceURLwithOrigin.getProperties(Aborter.none); assert.ok(res["access-control-allow-origin"] === origin); assert.ok(res.vary !== undefined); - assert.ok(res["access-control-exposed-headers"] !== undefined); + assert.ok(res["access-control-expose-headers"] !== undefined); }); }); From ba16f4bf6159ab48b84d8cfee86cc7092a3ab270 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Wed, 18 Dec 2019 12:58:13 +0800 Subject: [PATCH 09/34] Block blockID longer than 64, fixed #289 (#315) --- ChangeLog.md | 1 + src/blob/errors/StorageErrorFactory.ts | 57 +++++++++++++++++++++++++- src/blob/handlers/BlockBlobHandler.ts | 25 ++++++++++- 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 2e7f7f5c1..068fc3993 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -13,6 +13,7 @@ Upcoming Release Blob: - Added support for CORS. - AllowedHeaders and ExposedHeaders are optional now when setting CORS. +- Stage block cannot have blockID longer than 64. Queue: - AllowedHeaders and ExposedHeaders are optional now when setting CORS. diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index 3e2e7d938..f6f16a370 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -40,12 +40,65 @@ export default class StorageErrorFactory { ); } - public static getInvalidQueryParameterValue(contextID: string): StorageError { + public static getInvalidQueryParameterValue( + contextID: string = DefaultID, + parameterName?: string, + parameterValue?: string, + reason?: string + ): StorageError { + const additionalMessages: { + [key: string]: string; + } = {}; + + if (parameterName) { + additionalMessages.QueryParameterName = parameterName; + } + + if (parameterValue) { + additionalMessages.QueryParameterValue = parameterValue; + } + + if (reason) { + additionalMessages.Reason = reason; + } + return new StorageError( 400, "InvalidQueryParameterValue", `Value for one of the query parameters specified in the request URI is invalid.`, - contextID + contextID, + additionalMessages + ); + } + + public static getOutOfRangeInput( + contextID: string = DefaultID, + parameterName?: string, + parameterValue?: string, + reason?: string + ): StorageError { + const additionalMessages: { + [key: string]: string; + } = {}; + + if (parameterName) { + additionalMessages.QueryParameterName = parameterName; + } + + if (parameterValue) { + additionalMessages.QueryParameterValue = parameterValue; + } + + if (reason) { + additionalMessages.Reason = reason; + } + + return new StorageError( + 400, + "OutOfRangeInput", + `One of the request inputs is out of range.`, + contextID, + additionalMessages ); } diff --git a/src/blob/handlers/BlockBlobHandler.ts b/src/blob/handlers/BlockBlobHandler.ts index 561313b99..c1a03ee65 100644 --- a/src/blob/handlers/BlockBlobHandler.ts +++ b/src/blob/handlers/BlockBlobHandler.ts @@ -156,13 +156,14 @@ export default class BlockBlobHandler extends BaseHandler options: Models.BlockBlobStageBlockOptionalParams, context: Context ): Promise { - // TODO: Check Lease status, and set to available if it's expired, see sample in BlobHandler.setMetadata() const blobCtx = new BlobStorageContext(context); const accountName = blobCtx.account!; const containerName = blobCtx.container!; const blobName = blobCtx.blob!; const date = blobCtx.startTime!; + this.validateBlockId(blockId, blobCtx); + await this.metadataStore.checkContainerExist( context, accountName, @@ -390,4 +391,26 @@ export default class BlockBlobHandler extends BaseHandler } return undefined; } + + private validateBlockId(blockId: string, context: Context): void { + const rawBlockId = Buffer.from(blockId, "base64"); + + if (blockId !== rawBlockId.toString("base64")) { + throw StorageErrorFactory.getInvalidQueryParameterValue( + context.contextId, + "blockid", + blockId, + "Not a valid base64 string." + ); + } + + if (rawBlockId.length > 64) { + throw StorageErrorFactory.getOutOfRangeInput( + context.contextId!, + "blockid", + blockId, + "Block ID length cannot exceed 64." + ); + } + } } From f55792af782e72ce2ca4ba9795c66fe157974bad Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Wed, 18 Dec 2019 13:14:06 +0800 Subject: [PATCH 10/34] Add a test case for unicode blob name #282 (#319) --- tests/blob/specialnaming.test.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/tests/blob/specialnaming.test.ts b/tests/blob/specialnaming.test.ts index 0039b8970..052a439da 100644 --- a/tests/blob/specialnaming.test.ts +++ b/tests/blob/specialnaming.test.ts @@ -65,6 +65,23 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); + it("Should work with special container and blob names with unicode", async () => { + const blobName: string = getUniqueName("unicod\u00e9"); + const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, blobName); + + await blockBlobURL.upload(Aborter.none, "A", 1); + const response = await containerURL.listBlobHierarchySegment( + Aborter.none, + "$", + undefined, + { + prefix: blobName + } + ); + assert.notDeepEqual(response.segment.blobItems.length, 0); + assert.deepStrictEqual(response.segment.blobItems[0].name, blobName); + }); + it("Should work with special container and blob names with spaces in URL string", async () => { const blobName: string = getUniqueName("blob empty"); const blockBlobURL = new BlockBlobURL( From 6af3cc17dc194d3dc39147f73f1fc52f635ec782 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Wed, 18 Dec 2019 13:18:38 +0800 Subject: [PATCH 11/34] Added support to create block blob with empty block list, fixed #277 (#316) --- ChangeLog.md | 1 + src/blob/errors/StorageErrorFactory.ts | 11 +++ src/blob/handlers/BlockBlobHandler.ts | 8 +- src/blob/persistence/LokiBlobMetadataStore.ts | 88 ++++++++++++------- src/blob/persistence/SqlBlobMetadataStore.ts | 4 +- tests/blob/apis/blockblob.test.ts | 19 ++++ 6 files changed, 94 insertions(+), 37 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 068fc3993..de6255935 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -13,6 +13,7 @@ Upcoming Release Blob: - Added support for CORS. - AllowedHeaders and ExposedHeaders are optional now when setting CORS. +- Added support to create block blob with empty block list. - Stage block cannot have blockID longer than 64. Queue: diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index f6f16a370..0a60748a4 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -109,6 +109,17 @@ export default class StorageErrorFactory { return new StorageError(400, "InvalidOperation", message, contextID); } + public static getInvalidBlockList( + contextID: string = DefaultID + ): StorageError { + return new StorageError( + 400, + "InvalidBlockList", + "The specified block list is invalid.", + contextID + ); + } + public static getInvalidPageRange(contextID: string): StorageError { return new StorageError( 416, diff --git a/src/blob/handlers/BlockBlobHandler.ts b/src/blob/handlers/BlockBlobHandler.ts index c1a03ee65..5cb593c0a 100644 --- a/src/blob/handlers/BlockBlobHandler.ts +++ b/src/blob/handlers/BlockBlobHandler.ts @@ -235,9 +235,7 @@ export default class BlockBlobHandler extends BaseHandler options.blobHTTPHeaders = options.blobHTTPHeaders || {}; const contentType = - options.blobHTTPHeaders.blobContentType || - context.request!.getHeader("content-type") || - "application/octet-stream"; + options.blobHTTPHeaders.blobContentType || "application/octet-stream"; // Here we leveraged generated code utils to parser xml // Re-parsing request body to get destination blocks @@ -284,6 +282,7 @@ export default class BlockBlobHandler extends BaseHandler isCommitted: true }; + blob.properties.blobType = Models.BlobType.BlockBlob; blob.metadata = options.metadata; blob.properties.accessTier = Models.AccessTier.Hot; blob.properties.cacheControl = options.blobHTTPHeaders.blobCacheControl; @@ -304,6 +303,9 @@ export default class BlockBlobHandler extends BaseHandler HeaderValue: `${options.tier}` }); } + } else { + blob.properties.accessTier = Models.AccessTier.Hot; + blob.properties.accessTierInferred = true; } await this.metadataStore.commitBlockList( diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index b7e4f8610..d238ef468 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -53,6 +53,7 @@ import IBlobMetadataStore, { ServicePropertiesModel, SetContainerAccessPolicyOptions } from "./IBlobMetadataStore"; +import { ILease } from "./ILeaseState"; import LeaseFactory from "./LeaseFactory"; /** @@ -1859,11 +1860,20 @@ export default class LokiBlobMetadataStore blob.containerName, blob.name, blob.snapshot, - context + context, + // XStore allows commit block list with empty block list to create a block blob without stage block call + // In this case, there will no existing blob doc exists + false ); - const lease = new BlobLeaseAdapter(doc); - new BlobWriteLeaseValidator(leaseAccessConditions).validate(lease, context); + let lease: ILease | undefined; + if (doc) { + lease = new BlobLeaseAdapter(doc); + new BlobWriteLeaseValidator(leaseAccessConditions).validate( + lease, + context + ); + } // Get all blocks in persistency layer const blockColl = this.db.getCollection(this.BLOCKS_COLLECTION); @@ -1877,8 +1887,10 @@ export default class LokiBlobMetadataStore .data(); const pCommittedBlocksMap: Map = new Map(); // persistencyCommittedBlocksMap - for (const pBlock of blob.committedBlocksInOrder || []) { - pCommittedBlocksMap.set(pBlock.name, pBlock); + if (doc) { + for (const pBlock of doc.committedBlocksInOrder || []) { + pCommittedBlocksMap.set(pBlock.name, pBlock); + } } const pUncommittedBlocksMap: Map = new Map(); // persistencyUncommittedBlocksMap @@ -1896,7 +1908,7 @@ export default class LokiBlobMetadataStore block_1.blockName ); if (pUncommittedBlock === undefined) { - throw StorageErrorFactory.getInvalidOperation(context.contextId!); + throw StorageErrorFactory.getInvalidBlockList(context.contextId!); } else { selectedBlockList.push(pUncommittedBlock); } @@ -1904,7 +1916,7 @@ export default class LokiBlobMetadataStore case "committed": const pCommittedBlock = pCommittedBlocksMap.get(block_1.blockName); if (pCommittedBlock === undefined) { - throw StorageErrorFactory.getInvalidOperation(context.contextId!); + throw StorageErrorFactory.getInvalidBlockList(context.contextId!); } else { selectedBlockList.push(pCommittedBlock); } @@ -1914,40 +1926,52 @@ export default class LokiBlobMetadataStore pUncommittedBlocksMap.get(block_1.blockName) || pCommittedBlocksMap.get(block_1.blockName); if (pLatestBlock === undefined) { - throw StorageErrorFactory.getInvalidOperation(context.contextId!); + throw StorageErrorFactory.getInvalidBlockList(context.contextId!); } else { selectedBlockList.push(pLatestBlock); } break; default: - throw StorageErrorFactory.getInvalidOperation(context.contextId!); + throw StorageErrorFactory.getInvalidBlockList(context.contextId!); } } - // Commit block list - doc.committedBlocksInOrder = selectedBlockList; - doc.isCommitted = true; - - doc.metadata = blob.metadata; - doc.properties.accessTier = blob.properties.accessTier; - doc.properties.etag = blob.properties.etag; - doc.properties.accessTierInferred = true; - doc.properties.cacheControl = blob.properties.cacheControl; - doc.properties.contentType = blob.properties.contentType; - doc.properties.contentMD5 = blob.properties.contentMD5; - doc.properties.contentEncoding = blob.properties.contentEncoding; - doc.properties.contentLanguage = blob.properties.contentLanguage; - doc.properties.contentDisposition = blob.properties.contentDisposition; - doc.properties.contentLength = selectedBlockList - .map(block => block.size) - .reduce((total, val) => { - return total + val; - }); - - // set lease state to available if it's expired - new BlobWriteLeaseSyncer(doc).sync(lease); + if (doc) { + // Commit block list + doc.properties.blobType = blob.properties.blobType; + doc.committedBlocksInOrder = selectedBlockList; + doc.isCommitted = true; + doc.metadata = blob.metadata; + doc.properties.accessTier = blob.properties.accessTier; + doc.properties.accessTierInferred = blob.properties.accessTierInferred; + doc.properties.etag = blob.properties.etag; + doc.properties.cacheControl = blob.properties.cacheControl; + doc.properties.contentType = blob.properties.contentType; + doc.properties.contentMD5 = blob.properties.contentMD5; + doc.properties.contentEncoding = blob.properties.contentEncoding; + doc.properties.contentLanguage = blob.properties.contentLanguage; + doc.properties.contentDisposition = blob.properties.contentDisposition; + doc.properties.contentLength = selectedBlockList + .map(block => block.size) + .reduce((total, val) => { + return total + val; + }, 0); + + // set lease state to available if it's expired + if (lease) { + new BlobWriteLeaseSyncer(doc).sync(lease); + } - coll.update(doc); + coll.update(doc); + } else { + blob.committedBlocksInOrder = selectedBlockList; + blob.properties.contentLength = selectedBlockList + .map(block => block.size) + .reduce((total, val) => { + return total + val; + }, 0); + coll.insert(blob); + } blockColl.findAndRemove({ accountName: blob.accountName, diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index 21a9e2e40..1fb3ea1c3 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -1387,7 +1387,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { PersistencyBlockModel > = new Map(); // persistencyUncommittedBlocksMap - const badRequestError = StorageErrorFactory.getInvalidOperation( + const badRequestError = StorageErrorFactory.getInvalidBlockList( context.contextId ); @@ -1484,7 +1484,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { .map(block => block.size) .reduce((total, val) => { return total + val; - }), + }, 0), blobType: BlobType.BlockBlob } }; diff --git a/tests/blob/apis/blockblob.test.ts b/tests/blob/apis/blockblob.test.ts index dca193394..1ebb7a134 100644 --- a/tests/blob/apis/blockblob.test.ts +++ b/tests/blob/apis/blockblob.test.ts @@ -84,6 +84,12 @@ describe("BlockBlobAPIs", () => { ); }); + it("upload empty blob", async () => { + await blockBlobURL.upload(Aborter.none, "", 0); + const result = await blobURL.download(Aborter.none, 0); + assert.deepStrictEqual(await bodyToString(result, 0), ""); + }); + it("upload with string body and all parameters set", async () => { const body: string = getUniqueName("randomstring"); const options = { @@ -197,6 +203,19 @@ describe("BlockBlobAPIs", () => { ); }); + it("commitBlockList with empty list should create an empty block blob", async () => { + await blockBlobURL.commitBlockList(Aborter.none, []); + + const listResponse = await blockBlobURL.getBlockList( + Aborter.none, + "committed" + ); + assert.equal(listResponse.committedBlocks!.length, 0); + + const result = await blobURL.download(Aborter.none, 0); + assert.deepStrictEqual(await bodyToString(result, 0), ""); + }); + it("commitBlockList with all parameters set", async () => { const body = "HelloWorld"; await blockBlobURL.stageBlock( From 70d2311d2dc3197a5b2dd1e40f33d710827ce33d Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Wed, 18 Dec 2019 21:36:25 +0800 Subject: [PATCH 12/34] Improved blob/queue CORS implementation (#340) --- src/blob/BlobRequestListenerFactory.ts | 11 +- src/blob/SqlBlobRequestListenerFactory.ts | 11 +- .../preflight/PreflightMiddlewareFactory.ts | 188 +++++++++++------- src/blob/utils/constants.ts | 2 +- src/queue/QueueRequestListenerFactory.ts | 4 +- .../preflight/PreflightMiddlewareFactory.ts | 30 ++- src/queue/utils/constants.ts | 2 +- tests/blob/blobCorsRequest.test.ts | 56 +++++- tests/queue/queueCorsRequest.test.ts | 56 +++++- 9 files changed, 262 insertions(+), 98 deletions(-) diff --git a/src/blob/BlobRequestListenerFactory.ts b/src/blob/BlobRequestListenerFactory.ts index c284227a3..61f3493b4 100644 --- a/src/blob/BlobRequestListenerFactory.ts +++ b/src/blob/BlobRequestListenerFactory.ts @@ -141,7 +141,16 @@ export default class BlobRequestListenerFactory // CORS app.use( - preflightMiddlewareFactory.createCorsRequestMiddleware(this.metadataStore) + preflightMiddlewareFactory.createCorsRequestMiddleware( + this.metadataStore, + true + ) + ); + app.use( + preflightMiddlewareFactory.createCorsRequestMiddleware( + this.metadataStore, + false + ) ); // Generated, will serialize response models into HTTP response diff --git a/src/blob/SqlBlobRequestListenerFactory.ts b/src/blob/SqlBlobRequestListenerFactory.ts index f08294ae0..b0890d4d9 100644 --- a/src/blob/SqlBlobRequestListenerFactory.ts +++ b/src/blob/SqlBlobRequestListenerFactory.ts @@ -141,7 +141,16 @@ export default class SqlBlobRequestListenerFactory // CORS app.use( - preflightMiddlewareFactory.createCorsRequestMiddleware(this.metadataStore) + preflightMiddlewareFactory.createCorsRequestMiddleware( + this.metadataStore, + true + ) + ); + app.use( + preflightMiddlewareFactory.createCorsRequestMiddleware( + this.metadataStore, + false + ) ); // Generated, will serialize response models into HTTP response diff --git a/src/blob/preflight/PreflightMiddlewareFactory.ts b/src/blob/preflight/PreflightMiddlewareFactory.ts index cf3f88156..c562a5ea4 100644 --- a/src/blob/preflight/PreflightMiddlewareFactory.ts +++ b/src/blob/preflight/PreflightMiddlewareFactory.ts @@ -139,34 +139,46 @@ export default class PreflightMiddlewareFactory { } public createCorsRequestMiddleware( - metadataStore: IBlobMetadataStore - ): RequestHandler { - return (req: Request, res: Response, next: NextFunction) => { + metadataStore: IBlobMetadataStore, + blockErrorRequest: boolean = false + ): ErrorRequestHandler | RequestHandler { + const internalMethod = ( + err: MiddlewareError | Error | undefined, + req: Request, + res: Response, + next: NextFunction + ) => { if (req.method.toUpperCase() === MethodConstants.OPTIONS) { - return next(); + return next(err); } const context = new BlobStorageContext(res.locals, DEFAULT_CONTEXT_PATH); - // const requestId = res.locals.azurite_queue_context.contextId; const account = context.account!; const origin = req.headers[HeaderConstants.ORIGIN] as string | undefined; + if (origin === undefined) { + return next(err); + } const method = req.method; if (method === undefined || typeof method !== "string") { - return next(); + return next(err); } metadataStore .getServiceProperties(context, account) .then(properties => { if (properties === undefined || properties.cors === undefined) { - return next(); + return next(err); } const corsSet = properties.cors; - const resHeaders = this.getResponseHeaders(res); + const resHeaders = this.getResponseHeaders( + res, + err instanceof MiddlewareError ? err : undefined + ); + // Here we will match CORS settings in order and select first matched CORS for (const cors of corsSet) { if ( this.checkOrigin(origin, cors.allowedOrigins) && @@ -178,13 +190,13 @@ export default class PreflightMiddlewareFactory { ); res.setHeader( - HeaderConstants.ACCESS_CONTROL_EXPOSE_HEADER, + HeaderConstants.ACCESS_CONTROL_EXPOSE_HEADERS, exposedHeaders ); res.setHeader( HeaderConstants.ACCESS_CONTROL_ALLOW_ORIGIN, - cors.allowedOrigins || "" + cors.allowedOrigins === "*" ? "*" : origin! // origin is not undefined as checked in checkOrigin() ); if (cors.allowedOrigins !== "*") { @@ -195,16 +207,24 @@ export default class PreflightMiddlewareFactory { ); } - return next(); + return next(err); } } if (corsSet.length > 0) { res.setHeader(HeaderConstants.VARY, "Origin"); } - return next(); + return next(err); }) .catch(next); }; + + if (blockErrorRequest) { + return internalMethod; + } else { + return (req: Request, res: Response, next: NextFunction) => { + internalMethod(undefined, req, res, next); + }; + } } private checkOrigin( @@ -214,12 +234,14 @@ export default class PreflightMiddlewareFactory { if (allowedOrigin === "*") { return true; } + if (origin === undefined) { return false; } + const allowedOriginArray = allowedOrigin.split(","); for (const corsOrigin of allowedOriginArray) { - if (origin.trim() === corsOrigin.trim()) { + if (origin.trim().toLowerCase() === corsOrigin.trim().toLowerCase()) { return true; } } @@ -229,7 +251,7 @@ export default class PreflightMiddlewareFactory { private checkMethod(method: string, allowedMethod: string): boolean { const allowedMethodArray = allowedMethod.split(","); for (const corsMethod of allowedMethodArray) { - if (method.trim() === corsMethod.trim()) { + if (method.trim().toLowerCase() === corsMethod.trim().toLowerCase()) { return true; } } @@ -266,83 +288,87 @@ export default class PreflightMiddlewareFactory { return true; } - private getResponseHeaders(res: Response): string[] { + private getResponseHeaders(res: Response, err?: MiddlewareError): string[] { + const responseHeaderSet = []; + const context = new BlobStorageContext(res.locals, DEFAULT_CONTEXT_PATH); const handlerResponse = context.handlerResponses; - const statusCodeInResponse: number = handlerResponse.statusCode; - const spec = Specifications[context.operation!]; - const responseSpec = spec.responses[statusCodeInResponse]; - if (!responseSpec) { - throw new TypeError( - `Request specification doesn't include provided response status code` - ); - } - // Serialize headers - const headerSerializer = new msRest.Serializer(Mappers); - const headersMapper = responseSpec.headersMapper; + if (handlerResponse && context.operation) { + const statusCodeInResponse: number = handlerResponse.statusCode; + const spec = Specifications[context.operation]; + const responseSpec = spec.responses[statusCodeInResponse]; + if (!responseSpec) { + throw new TypeError( + `Request specification doesn't include provided response status code` + ); + } - const responseHeaderSet = []; - if (headersMapper && headersMapper.type.name === "Composite") { - const mappersForAllHeaders = headersMapper.type.modelProperties || {}; - - // Handle headerMapper one by one - for (const key in mappersForAllHeaders) { - if (mappersForAllHeaders.hasOwnProperty(key)) { - const headerMapper = mappersForAllHeaders[key]; - const headerName = headerMapper.serializedName; - const headerValueOriginal = handlerResponse[key]; - const headerValueSerialized = headerSerializer.serialize( - headerMapper, - headerValueOriginal - ); + // Serialize headers + const headerSerializer = new msRest.Serializer(Mappers); + const headersMapper = responseSpec.headersMapper; + + if (headersMapper && headersMapper.type.name === "Composite") { + const mappersForAllHeaders = headersMapper.type.modelProperties || {}; + + // Handle headerMapper one by one + for (const key in mappersForAllHeaders) { + if (mappersForAllHeaders.hasOwnProperty(key)) { + const headerMapper = mappersForAllHeaders[key]; + const headerName = headerMapper.serializedName; + const headerValueOriginal = handlerResponse[key]; + const headerValueSerialized = headerSerializer.serialize( + headerMapper, + headerValueOriginal + ); - // Handle collection of headers starting with same prefix, such as x-ms-meta prefix - const headerCollectionPrefix = (headerMapper as msRest.DictionaryMapper) - .headerCollectionPrefix; - if ( - headerCollectionPrefix !== undefined && - headerValueOriginal !== undefined - ) { - for (const collectionHeaderPartialName in headerValueSerialized) { - if ( - headerValueSerialized.hasOwnProperty( - collectionHeaderPartialName - ) - ) { - const collectionHeaderValueSerialized = - headerValueSerialized[collectionHeaderPartialName]; - const collectionHeaderName = `${headerCollectionPrefix}${collectionHeaderPartialName}`; + // Handle collection of headers starting with same prefix, such as x-ms-meta prefix + const headerCollectionPrefix = (headerMapper as msRest.DictionaryMapper) + .headerCollectionPrefix; + if ( + headerCollectionPrefix !== undefined && + headerValueOriginal !== undefined + ) { + for (const collectionHeaderPartialName in headerValueSerialized) { if ( - collectionHeaderName && - collectionHeaderValueSerialized !== undefined + headerValueSerialized.hasOwnProperty( + collectionHeaderPartialName + ) ) { - responseHeaderSet.push(collectionHeaderName); + const collectionHeaderValueSerialized = + headerValueSerialized[collectionHeaderPartialName]; + const collectionHeaderName = `${headerCollectionPrefix}${collectionHeaderPartialName}`; + if ( + collectionHeaderName && + collectionHeaderValueSerialized !== undefined + ) { + responseHeaderSet.push(collectionHeaderName); + } } } - } - } else { - if (headerName && headerValueSerialized !== undefined) { - responseHeaderSet.push(headerName); + } else { + if (headerName && headerValueSerialized !== undefined) { + responseHeaderSet.push(headerName); + } } } } } - } - if ( - spec.isXML && - responseSpec.bodyMapper && - responseSpec.bodyMapper.type.name !== "Stream" - ) { - responseHeaderSet.push("content-type"); - responseHeaderSet.push("content-length"); - } else if ( - handlerResponse.body && - responseSpec.bodyMapper && - responseSpec.bodyMapper.type.name === "Stream" - ) { - responseHeaderSet.push("content-length"); + if ( + spec.isXML && + responseSpec.bodyMapper && + responseSpec.bodyMapper.type.name !== "Stream" + ) { + responseHeaderSet.push("content-type"); + responseHeaderSet.push("content-length"); + } else if ( + handlerResponse.body && + responseSpec.bodyMapper && + responseSpec.bodyMapper.type.name === "Stream" + ) { + responseHeaderSet.push("content-length"); + } } const headers = res.getHeaders(); @@ -352,6 +378,14 @@ export default class PreflightMiddlewareFactory { } } + if (err) { + for (const key in err.headers) { + if (err.headers.hasOwnProperty(key)) { + responseHeaderSet.push(key); + } + } + } + // TODO: Should extract the header by some policy. // or apply a referred list indicates the related headers. responseHeaderSet.push("Date"); diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 38af1919c..9395d7844 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -52,7 +52,7 @@ export const HeaderConstants = { X_MS_VERSION: "x-ms-version", ORIGIN: "origin", VARY: "Vary", - ACCESS_CONTROL_EXPOSE_HEADER: "Access-Control-Expose-Headers", + ACCESS_CONTROL_EXPOSE_HEADERS: "Access-Control-Expose-Headers", ACCESS_CONTROL_ALLOW_ORIGIN: "Access-Control-Allow-Origin", ACCESS_CONTROL_ALLOW_CREDENTIALS: "Access-Control-Allow-Credentials", ACCESS_CONTROL_ALLOW_METHODS: "Access-Control-Allow-Methods", diff --git a/src/queue/QueueRequestListenerFactory.ts b/src/queue/QueueRequestListenerFactory.ts index 45b402072..fd7e086a5 100644 --- a/src/queue/QueueRequestListenerFactory.ts +++ b/src/queue/QueueRequestListenerFactory.ts @@ -122,13 +122,13 @@ export default class QueueRequestListenerFactory app.use( preflightMiddlewareFactory.createCorsRequestMiddleware( this.metadataStore, - false + true ) ); app.use( preflightMiddlewareFactory.createCorsRequestMiddleware( this.metadataStore, - true + false ) ); diff --git a/src/queue/preflight/PreflightMiddlewareFactory.ts b/src/queue/preflight/PreflightMiddlewareFactory.ts index 6e432ad78..9e1018b4d 100644 --- a/src/queue/preflight/PreflightMiddlewareFactory.ts +++ b/src/queue/preflight/PreflightMiddlewareFactory.ts @@ -157,10 +157,12 @@ export default class PreflightMiddlewareFactory { DEFAULT_QUEUE_CONTEXT_PATH ); - // const requestId = res.locals.azurite_queue_context.contextID; const account = context.account!; const origin = req.headers[HeaderConstants.ORIGIN] as string | undefined; + if (origin === undefined) { + return next(err); + } const method = req.method; if (method === undefined || typeof method !== "string") { @@ -174,8 +176,12 @@ export default class PreflightMiddlewareFactory { return next(err); } const corsSet = properties.cors; - const resHeaders = this.getResponseHeaders(res); + const resHeaders = this.getResponseHeaders( + res, + err instanceof MiddlewareError ? err : undefined + ); + // Here we will match CORS settings in order and select first matched CORS for (const cors of corsSet) { if ( this.checkOrigin(origin, cors.allowedOrigins) && @@ -187,13 +193,13 @@ export default class PreflightMiddlewareFactory { ); res.setHeader( - HeaderConstants.ACCESS_CONTROL_EXPOSE_HEADER, + HeaderConstants.ACCESS_CONTROL_EXPOSE_HEADERS, exposedHeaders ); res.setHeader( HeaderConstants.ACCESS_CONTROL_ALLOW_ORIGIN, - cors.allowedOrigins + cors.allowedOrigins === "*" ? "*" : origin! // origin is not undefined as checked in checkOrigin() ); if (cors.allowedOrigins !== "*") { @@ -231,12 +237,14 @@ export default class PreflightMiddlewareFactory { if (allowedOrigin === "*") { return true; } + if (origin === undefined) { return false; } + const allowedOriginArray = allowedOrigin.split(","); for (const corsOrigin of allowedOriginArray) { - if (origin.trim() === corsOrigin.trim()) { + if (origin.trim().toLowerCase() === corsOrigin.trim().toLowerCase()) { return true; } } @@ -246,7 +254,7 @@ export default class PreflightMiddlewareFactory { private checkMethod(method: string, allowedMethod: string): boolean { const allowedMethodArray = allowedMethod.split(","); for (const corsMethod of allowedMethodArray) { - if (method.trim() === corsMethod.trim()) { + if (method.trim().toLowerCase() === corsMethod.trim().toLowerCase()) { return true; } } @@ -283,7 +291,7 @@ export default class PreflightMiddlewareFactory { return true; } - private getResponseHeaders(res: Response): string[] { + private getResponseHeaders(res: Response, err?: MiddlewareError): string[] { const responseHeaderSet = []; const handlerResponse = res.locals.azurite_queue_context.handlerResponses; @@ -372,6 +380,14 @@ export default class PreflightMiddlewareFactory { } } + if (err) { + for (const key in err.headers) { + if (err.headers.hasOwnProperty(key)) { + responseHeaderSet.push(key); + } + } + } + // TODO: Should extract the header by some policy. // or apply a referred list indicates the related headers. responseHeaderSet.push("Date"); diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index e3b729bf0..189520e83 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -68,7 +68,7 @@ export const HeaderConstants = { X_MS_META: "x-ms-meta-", ORIGIN: "origin", VARY: "Vary", - ACCESS_CONTROL_EXPOSE_HEADER: "Access-Control-Expose-Headers", + ACCESS_CONTROL_EXPOSE_HEADERS: "Access-Control-Expose-Headers", ACCESS_CONTROL_ALLOW_ORIGIN: "Access-Control-Allow-Origin", ACCESS_CONTROL_ALLOW_CREDENTIALS: "Access-Control-Allow-Credentials", ACCESS_CONTROL_ALLOW_METHODS: "Access-Control-Allow-Methods", diff --git a/tests/blob/blobCorsRequest.test.ts b/tests/blob/blobCorsRequest.test.ts index 92db40b15..f56d58773 100644 --- a/tests/blob/blobCorsRequest.test.ts +++ b/tests/blob/blobCorsRequest.test.ts @@ -1,9 +1,10 @@ import { Aborter, + ContainerURL, ServiceURL, SharedKeyCredential, StorageURL -} from "@azure/storage-queue"; +} from "@azure/storage-blob"; import * as assert from "assert"; import { configLogger } from "../../src/common/Logger"; @@ -521,7 +522,7 @@ describe("Blob Cors requests test", () => { assert.ok(res.vary !== undefined); res = await serviceURL.getProperties(Aborter.none); - assert.ok(res.vary !== undefined); + assert.ok(res.vary === undefined); }); it("Request Match rule exists that allows all origins (*)", async () => { @@ -557,9 +558,9 @@ describe("Blob Cors requests test", () => { assert.ok(res["access-control-expose-headers"] !== undefined); res = await serviceURL.getProperties(Aborter.none); - assert.ok(res["access-control-allow-origin"] === "*"); + assert.ok(res["access-control-allow-origin"] === undefined); assert.ok(res.vary === undefined); - assert.ok(res["access-control-expose-headers"] !== undefined); + assert.ok(res["access-control-expose-headers"] === undefined); }); it("Request Match rule exists for exact origin", async () => { @@ -595,6 +596,53 @@ describe("Blob Cors requests test", () => { assert.ok(res["access-control-expose-headers"] !== undefined); }); + it("Requests with error response should apply for CORS", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "exactOrigin", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + const origin = "exactOrigin"; + const pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift(new OriginPolicyFactory(origin)); + const serviceURLwithOrigin = new ServiceURL(baseURL, pipeline); + + const containerURLwithOrigin = ContainerURL.fromServiceURL( + serviceURLwithOrigin, + "notexistcontainer" + ); + + try { + await containerURLwithOrigin.getProperties(Aborter.none); + } catch (err) { + assert.ok( + err.response.headers._headersMap["access-control-allow-origin"] + .value === origin + ); + assert.ok(err.response.headers._headersMap.vary !== undefined); + assert.ok( + err.response.headers._headersMap["access-control-expose-headers"] !== + undefined + ); + } + }); + it("Request Match rule in sequence", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); diff --git a/tests/queue/queueCorsRequest.test.ts b/tests/queue/queueCorsRequest.test.ts index cba6a8041..ae9427161 100644 --- a/tests/queue/queueCorsRequest.test.ts +++ b/tests/queue/queueCorsRequest.test.ts @@ -2,7 +2,8 @@ import { Aborter, ServiceURL, SharedKeyCredential, - StorageURL + StorageURL, + QueueURL } from "@azure/storage-queue"; import * as assert from "assert"; @@ -549,7 +550,7 @@ describe("Queue Cors requests test", () => { assert.ok(res.vary !== undefined); res = await serviceURL.getProperties(Aborter.none); - assert.ok(res.vary !== undefined); + assert.ok(res.vary === undefined); }); it("Request Match rule exists that allows all origins (*)", async () => { @@ -585,9 +586,9 @@ describe("Queue Cors requests test", () => { assert.ok(res["access-control-expose-headers"] !== undefined); res = await serviceURL.getProperties(Aborter.none); - assert.ok(res["access-control-allow-origin"] === "*"); + assert.ok(res["access-control-allow-origin"] === undefined); assert.ok(res.vary === undefined); - assert.ok(res["access-control-expose-headers"] !== undefined); + assert.ok(res["access-control-expose-headers"] === undefined); }); it("Request Match rule exists for exact origin", async () => { @@ -623,6 +624,53 @@ describe("Queue Cors requests test", () => { assert.ok(res["access-control-expose-headers"] !== undefined); }); + it("Requests with error response should apply for CORS", async () => { + const serviceProperties = await serviceURL.getProperties(Aborter.none); + + const newCORS = { + allowedHeaders: "header", + allowedMethods: "GET", + allowedOrigins: "exactOrigin", + exposedHeaders: "*", + maxAgeInSeconds: 8888 + }; + + serviceProperties.cors = [newCORS]; + + await serviceURL.setProperties(Aborter.none, serviceProperties); + + await sleep(100); + + const origin = "exactOrigin"; + const pipeline = StorageURL.newPipeline( + new SharedKeyCredential(EMULATOR_ACCOUNT_NAME, EMULATOR_ACCOUNT_KEY), + { + retryOptions: { maxTries: 1 } + } + ); + pipeline.factories.unshift(new OriginPolicyFactory(origin)); + const serviceURLwithOrigin = new ServiceURL(baseURL, pipeline); + + const queueURLwithOrigin = QueueURL.fromServiceURL( + serviceURLwithOrigin, + "notexistcontainer" + ); + + try { + await queueURLwithOrigin.getProperties(Aborter.none); + } catch (err) { + assert.ok( + err.response.headers._headersMap["access-control-allow-origin"] + .value === origin + ); + assert.ok(err.response.headers._headersMap.vary !== undefined); + assert.ok( + err.response.headers._headersMap["access-control-expose-headers"] !== + undefined + ); + } + }); + it("Request Match rule in sequence", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); From 25812373d824a0b4180a808a95ac65667d3821b6 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Thu, 19 Dec 2019 19:29:20 +0800 Subject: [PATCH 13/34] Fixed a bug that Azurite Blob service cannot start in Mac as Visual Studio Extension, fixed #302 (#341) * Fixed a bug that Azurite Blob service cannot start in Mac as Visual Studio Extension, fixed #302 * Fixed a typo in VSC queue port description --- ChangeLog.md | 15 +++++++++++---- package.json | 2 +- src/common/VSCServerManagerBlob.ts | 8 +++++++- src/common/VSCServerManagerQueue.ts | 15 ++++++--------- 4 files changed, 25 insertions(+), 15 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index de6255935..5a120d0fb 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -11,15 +11,18 @@ Upcoming Release - Force flush data into disk before data upload request returns. Blob: + - Added support for CORS. - AllowedHeaders and ExposedHeaders are optional now when setting CORS. - Added support to create block blob with empty block list. - Stage block cannot have blockID longer than 64. +- Fixed a bug that Azurite Blob service cannot start in Mac as Visual Studio Extension. Queue: + - AllowedHeaders and ExposedHeaders are optional now when setting CORS. -2019.11 Version 3.3.0-preview + 2019.11 Version 3.3.0-preview - Azurite now supports customized account names and keys by environment variable `AZURITE_ACCOUNTS`. - Improved logging for underlayer operations, such as persistency data read and write operations. @@ -29,6 +32,7 @@ Queue: - [Breaking] This version cannot guarantee compatible with persisted database models in Azurite workspace used by previous version. Clean Azurite workspace folder and restart Azurite in case any errors. Notice that, data will be lost after cleaning Azurite workspace folder. Blob: + - Fixed a bug that snapshot blob doesn't honor metadata options. - Force alphabetical order for list blob results. - Updated Azure Storage API version to 2019-02-02, and added following new features: @@ -40,21 +44,24 @@ Blob: - Added GC support for blob SQL metadata store. Queue: + - Responses now includes x-ms-client-request-id when request provided client request ID. -2019.08 Version 3.2.0-preview + 2019.08 Version 3.2.0-preview - Updated repository link to https to compatible with Visual Studio Code. Blob: + - Fix listblobs order when filtering by prefix. Queue: + - Added Azure Storage Queue Service features (API version: 2019-02-02). - Decoupled persistence layer into service metadata storage and extent file storage. - Supported Cors and Preflight in Queue service. -2019.06 Version 3.1.2-preview + 2019.06 Version 3.1.2-preview - Integrated Azurite with Visual Studio Code as an extension. - Added Visual Studio Code extension usage guidelines. @@ -64,6 +71,6 @@ Queue: - Fixed an issue that metadata doesn't get copied when copy blob. - Fixed GetBlockBlob missing Content-Range header -2019.05 Version 3.0.0-preview + 2019.05 Version 3.0.0-preview - Initial Release of Azurite V3. diff --git a/package.json b/package.json index 198aa8562..13fbf6f4d 100644 --- a/package.json +++ b/package.json @@ -163,7 +163,7 @@ "azurite.queuePort": { "type": "number", "default": 10001, - "description": "Queue service listening port, by default 10000" + "description": "Queue service listening port, by default 10001" } } } diff --git a/src/common/VSCServerManagerBlob.ts b/src/common/VSCServerManagerBlob.ts index 73efd8d9a..a86c56874 100644 --- a/src/common/VSCServerManagerBlob.ts +++ b/src/common/VSCServerManagerBlob.ts @@ -5,7 +5,8 @@ import BlobServer from "../blob/BlobServer"; import { DEFAULT_BLOB_EXTENT_LOKI_DB_PATH, DEFAULT_BLOB_LOKI_DB_PATH, - DEFAULT_BLOB_PERSISTENCE_ARRAY + DEFAULT_BLOB_PERSISTENCE_ARRAY, + DEFAULT_BLOB_PERSISTENCE_PATH } from "../blob/utils/constants"; import * as Logger from "./Logger"; import NoLoggerStrategy from "./NoLoggerStrategy"; @@ -69,6 +70,11 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { const env = new VSCEnvironment(); const location = await env.location(); + DEFAULT_BLOB_PERSISTENCE_ARRAY[0].persistencyPath = join( + location, + DEFAULT_BLOB_PERSISTENCE_PATH + ); + // Initialize server configuration const config = new BlobConfiguration( env.blobHost(), diff --git a/src/common/VSCServerManagerQueue.ts b/src/common/VSCServerManagerQueue.ts index 2f86887f9..d50fe66d8 100644 --- a/src/common/VSCServerManagerQueue.ts +++ b/src/common/VSCServerManagerQueue.ts @@ -7,11 +7,11 @@ import QueueServer from "../queue/QueueServer"; import { DEFAULT_QUEUE_EXTENT_LOKI_DB_PATH, DEFAULT_QUEUE_LOKI_DB_PATH, + DEFAULT_QUEUE_PERSISTENCE_ARRAY, DEFAULT_QUEUE_PERSISTENCE_PATH } from "../queue/utils/constants"; import * as Logger from "./Logger"; import NoLoggerStrategy from "./NoLoggerStrategy"; -import { StoreDestinationArray } from "./persistence/IExtentStore"; import VSCChannelLoggerStrategy from "./VSCChannelLoggerStrategy"; import VSCChannelWriteStream from "./VSCChannelWriteStream"; import VSCEnvironment from "./VSCQueueEnvironment"; @@ -76,13 +76,10 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { const location = await env.location(); await accessAsync(location); - const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ - { - persistencyId: "Default", - persistencyPath: join(location, DEFAULT_QUEUE_PERSISTENCE_PATH), - maxConcurrency: 10 - } - ]; + DEFAULT_QUEUE_PERSISTENCE_ARRAY[0].persistencyPath = join( + location, + DEFAULT_QUEUE_PERSISTENCE_PATH + ); // Initialize server configuration const config = new QueueConfiguration( @@ -90,7 +87,7 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { env.queuePort(), join(location, DEFAULT_QUEUE_LOKI_DB_PATH), join(location, DEFAULT_QUEUE_EXTENT_LOKI_DB_PATH), - DEFUALT_QUEUE_PERSISTENCE_ARRAY, + DEFAULT_QUEUE_PERSISTENCE_ARRAY, !env.silent(), this.accessChannelStream, env.debug() === true, From ac5680956baa698aeebb9ba194ae8586544d35a5 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Thu, 19 Dec 2019 19:30:46 +0800 Subject: [PATCH 14/34] Fixed a bug that set blob tier doesn't work with account SAS. Fixed #306 (#342) --- ChangeLog.md | 1 + .../OperationAccountSASPermission.ts | 9 ++++ tests/blob/sas.test.ts | 46 +++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/ChangeLog.md b/ChangeLog.md index 5a120d0fb..4c2c31ec3 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -16,6 +16,7 @@ Blob: - AllowedHeaders and ExposedHeaders are optional now when setting CORS. - Added support to create block blob with empty block list. - Stage block cannot have blockID longer than 64. +- Fixed a bug that set blob tier doesn't work with account SAS. - Fixed a bug that Azurite Blob service cannot start in Mac as Visual Studio Extension. Queue: diff --git a/src/blob/authentication/OperationAccountSASPermission.ts b/src/blob/authentication/OperationAccountSASPermission.ts index 0e19dd56e..4fdbc6871 100644 --- a/src/blob/authentication/OperationAccountSASPermission.ts +++ b/src/blob/authentication/OperationAccountSASPermission.ts @@ -515,4 +515,13 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( ) ); +OPERATION_ACCOUNT_SAS_PERMISSIONS.set( + Operation.Blob_SetTier, + new OperationAccountSASPermission( + AccountSASService.Blob, + AccountSASResourceType.Object, + AccountSASPermission.Write + ) +); + export default OPERATION_ACCOUNT_SAS_PERMISSIONS; diff --git a/tests/blob/sas.test.ts b/tests/blob/sas.test.ts index fc01750af..888938436 100644 --- a/tests/blob/sas.test.ts +++ b/tests/blob/sas.test.ts @@ -87,6 +87,52 @@ describe("Shared Access Signature (SAS) authentication", () => { await serviceURLWithSAS.getAccountInfo(Aborter.none); }); + it("generateAccountSASQueryParameters should work for set blob tier", async () => { + const now = new Date(); + now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server + + const tmr = new Date(); + tmr.setDate(tmr.getDate() + 1); + + // By default, credential is always the last element of pipeline factories + const factories = serviceURL.pipeline.factories; + const sharedKeyCredential = factories[factories.length - 1]; + + const sas = generateAccountSASQueryParameters( + { + expiryTime: tmr, + ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, + permissions: AccountSASPermissions.parse("w").toString(), + protocol: SASProtocol.HTTPSandHTTP, + resourceTypes: AccountSASResourceTypes.parse("sco").toString(), + services: AccountSASServices.parse("btqf").toString(), + startTime: now, + version: "2016-05-31" + }, + sharedKeyCredential as SharedKeyCredential + ).toString(); + + const sasURL = `${serviceURL.url}?${sas}`; + const serviceURLWithSAS = new ServiceURL( + sasURL, + StorageURL.newPipeline(new AnonymousCredential()) + ); + + const containerURLWithSAS = ContainerURL.fromServiceURL( + serviceURLWithSAS, + getUniqueName("con") + ); + await containerURLWithSAS.create(Aborter.none); + + const blockBlobURLWithSAS = BlockBlobURL.fromContainerURL( + containerURLWithSAS, + getUniqueName("blob") + ); + await blockBlobURLWithSAS.upload(Aborter.none, "abc", 3); + + await blockBlobURLWithSAS.setTier(Aborter.none, "Hot"); + }); + it("generateAccountSASQueryParameters should not work with invalid permission", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); From be68faa0b3e028dbdbd9b928a96f87169976ad73 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 19 Dec 2019 19:38:25 +0800 Subject: [PATCH 15/34] Fix lease issues (#343) --- ChangeLog.md | 4 + src/blob/errors/StorageErrorFactory.ts | 17 +++- src/blob/handlers/BlobHandler.ts | 3 +- src/blob/handlers/PageBlobHandler.ts | 18 ++-- src/blob/persistence/LeaseBreakingState.ts | 36 +++++-- src/blob/persistence/LeaseBrokenState.ts | 14 ++- src/blob/persistence/LeaseLeasedState.ts | 54 ++++++++--- src/blob/persistence/LokiBlobMetadataStore.ts | 26 ++++-- tests/blob/apis/blob.test.ts | 93 +++++++++++++++++++ 9 files changed, 221 insertions(+), 44 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 4c2c31ec3..0f1abb4bd 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -16,6 +16,10 @@ Blob: - AllowedHeaders and ExposedHeaders are optional now when setting CORS. - Added support to create block blob with empty block list. - Stage block cannot have blockID longer than 64. +- Fix the issue that Copy Blob will overwrite the destination blob Lease status. +- Fix the issue that Change Lease fail when blob lease id only matches the input ProposedLeaseId. +- Fix the issue that UploadPage, ClearPage will fail on leased Page blob, even input correct lease id. +- Change some lease error code to align with server. - Fixed a bug that set blob tier doesn't work with account SAS. - Fixed a bug that Azurite Blob service cannot start in Mac as Visual Studio Extension. diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index 0a60748a4..0583a196a 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -171,6 +171,17 @@ export default class StorageErrorFactory { ); } + public static getLeaseIsBreakingAndCannotBeAcquired( + contextID: string = DefaultID + ): StorageError { + return new StorageError( + 409, + "LeaseIsBreakingAndCannotBeAcquired", + "There is already a breaking lease, and can't be acquired.", + contextID + ); + } + public static getLeaseNotPresentWithLeaseOperation( contextID: string = DefaultID ): StorageError { @@ -242,7 +253,7 @@ export default class StorageErrorFactory { ): StorageError { return new StorageError( 412, - "LeaseLost", + "LeaseNotPresentWithContainerOperation", "A lease ID was specified, but the lease for the container has expired.", contextID ); @@ -298,7 +309,7 @@ export default class StorageErrorFactory { ): StorageError { return new StorageError( 412, - "LeaseIdMismatchWithBlobOperation ", + "LeaseIdMismatchWithBlobOperation", "The lease ID specified did not match the lease ID for the blob.", contextID ); @@ -307,7 +318,7 @@ export default class StorageErrorFactory { public static getBlobLeaseLost(contextID: string = DefaultID): StorageError { return new StorageError( 412, - "LeaseLost ", + "LeaseNotPresentWithBlobOperation", "A lease ID was specified, but the lease for the blob has expired.", contextID ); diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 60f7e3782..f74f2b49b 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -639,7 +639,8 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { accountName, containerName, blobName, - undefined + undefined, + options.leaseAccessConditions ); if (blob.properties.copyId !== copyId) { diff --git a/src/blob/handlers/PageBlobHandler.ts b/src/blob/handlers/PageBlobHandler.ts index 3a4f9813c..cc9425e1b 100644 --- a/src/blob/handlers/PageBlobHandler.ts +++ b/src/blob/handlers/PageBlobHandler.ts @@ -171,7 +171,8 @@ export default class PageBlobHandler extends BaseHandler accountName, containerName, blobName, - undefined + undefined, + options.leaseAccessConditions ); if (blob.properties.blobType !== Models.BlobType.PageBlob) { @@ -218,7 +219,8 @@ export default class PageBlobHandler extends BaseHandler blob, start, end, - persistency + persistency, + options.leaseAccessConditions ); const response: Models.PageBlobUploadPagesResponse = { @@ -260,7 +262,8 @@ export default class PageBlobHandler extends BaseHandler accountName, containerName, blobName, - undefined + undefined, + options.leaseAccessConditions ); if (blob.properties.blobType !== Models.BlobType.PageBlob) { @@ -318,7 +321,8 @@ export default class PageBlobHandler extends BaseHandler accountName, containerName, blobName, - options.snapshot + options.snapshot, + options.leaseAccessConditions ); if (blob.properties.blobType !== Models.BlobType.PageBlob) { @@ -390,7 +394,8 @@ export default class PageBlobHandler extends BaseHandler accountName, containerName, blobName, - blobContentLength + blobContentLength, + options.leaseAccessConditions ); const response: Models.PageBlobResizeResponse = { @@ -424,7 +429,8 @@ export default class PageBlobHandler extends BaseHandler containerName, blobName, sequenceNumberAction, - options.blobSequenceNumber + options.blobSequenceNumber, + options.leaseAccessConditions ); const response: Models.PageBlobUpdateSequenceNumberResponse = { diff --git a/src/blob/persistence/LeaseBreakingState.ts b/src/blob/persistence/LeaseBreakingState.ts index f89f23bbf..f24f22699 100644 --- a/src/blob/persistence/LeaseBreakingState.ts +++ b/src/blob/persistence/LeaseBreakingState.ts @@ -74,7 +74,13 @@ export default class LeaseBreakingState extends LeaseStateBase { } public acquire(duration: number, proposedLeaseId: string = ""): ILeaseState { - throw StorageErrorFactory.getLeaseAlreadyPresent(this.context.contextId); + if (proposedLeaseId === this.lease.leaseId) { + throw StorageErrorFactory.getLeaseIsBreakingAndCannotBeAcquired( + this.context.contextId + ); + } else { + throw StorageErrorFactory.getLeaseAlreadyPresent(this.context.contextId); + } } public break(breakPeriod?: number): ILeaseState { @@ -120,16 +126,28 @@ export default class LeaseBreakingState extends LeaseStateBase { ); } - public renew(): ILeaseState { - throw StorageErrorFactory.getLeaseIsBrokenAndCannotBeRenewed( - this.context.contextId - ); + public renew(proposedLeaseId: string): ILeaseState { + if (proposedLeaseId === this.lease.leaseId) { + throw StorageErrorFactory.getLeaseIsBrokenAndCannotBeRenewed( + this.context.contextId + ); + } else { + throw StorageErrorFactory.getLeaseIdMismatchWithLeaseOperation( + this.context.contextId + ); + } } - public change(): ILeaseState { - throw StorageErrorFactory.getLeaseIsBreakingAndCannotBeChanged( - this.context.contextId - ); + public change(proposedLeaseId: string): ILeaseState { + if (proposedLeaseId === this.lease.leaseId) { + throw StorageErrorFactory.getLeaseIsBreakingAndCannotBeChanged( + this.context.contextId + ); + } else { + throw StorageErrorFactory.getLeaseIdMismatchWithLeaseOperation( + this.context.contextId + ); + } } public release(leaseId: string): ILeaseState { diff --git a/src/blob/persistence/LeaseBrokenState.ts b/src/blob/persistence/LeaseBrokenState.ts index 6757ff0b5..7bc0b159b 100644 --- a/src/blob/persistence/LeaseBrokenState.ts +++ b/src/blob/persistence/LeaseBrokenState.ts @@ -178,10 +178,16 @@ export default class LeaseBrokenState extends LeaseStateBase { return this; } - public renew(): ILeaseState { - throw StorageErrorFactory.getLeaseIsBrokenAndCannotBeRenewed( - this.context.contextId - ); + public renew(proposedLeaseId: string): ILeaseState { + if (proposedLeaseId === this.lease.leaseId) { + throw StorageErrorFactory.getLeaseIsBrokenAndCannotBeRenewed( + this.context.contextId + ); + } else { + throw StorageErrorFactory.getLeaseIdMismatchWithLeaseOperation( + this.context.contextId + ); + } } public change(): ILeaseState { diff --git a/src/blob/persistence/LeaseLeasedState.ts b/src/blob/persistence/LeaseLeasedState.ts index 12c7fa3ef..b0ddde602 100644 --- a/src/blob/persistence/LeaseLeasedState.ts +++ b/src/blob/persistence/LeaseLeasedState.ts @@ -130,18 +130,35 @@ export default class LeaseLeasedState extends LeaseStateBase { public break(breakPeriod?: number): ILeaseState { if (this.lease.leaseDurationType === LeaseDurationType.Infinite) { - return new LeaseBrokenState( - { - leaseId: this.lease.leaseId, - leaseState: LeaseStateType.Broken, - leaseStatus: LeaseStatusType.Unlocked, - leaseDurationType: undefined, - leaseDurationSeconds: undefined, - leaseExpireTime: undefined, - leaseBreakTime: undefined - }, - this.context - ); + if (breakPeriod === 0 || breakPeriod === undefined) { + return new LeaseBrokenState( + { + leaseId: this.lease.leaseId, + leaseState: LeaseStateType.Broken, + leaseStatus: LeaseStatusType.Unlocked, + leaseDurationType: undefined, + leaseDurationSeconds: undefined, + leaseExpireTime: undefined, + leaseBreakTime: undefined + }, + this.context + ); + } else { + return new LeaseBreakingState( + { + leaseId: this.lease.leaseId, + leaseState: LeaseStateType.Breaking, + leaseStatus: LeaseStatusType.Locked, + leaseDurationType: undefined, + leaseDurationSeconds: undefined, + leaseExpireTime: undefined, + leaseBreakTime: new Date( + this.context.startTime!.getTime() + breakPeriod * 1000 + ) + }, + this.context + ); + } } // Following only cares about this.lease.leaseDurationType === LeaseDurationType.Fixed @@ -202,7 +219,13 @@ export default class LeaseLeasedState extends LeaseStateBase { ); } - public renew(): ILeaseState { + public renew(leaseId: string): ILeaseState { + if (this.lease.leaseId !== leaseId) { + throw StorageErrorFactory.getLeaseIdMismatchWithLeaseOperation( + this.context.contextId + ); + } + if (this.lease.leaseDurationType === LeaseDurationType.Infinite) { return this; } @@ -226,7 +249,10 @@ export default class LeaseLeasedState extends LeaseStateBase { } public change(leaseId: string, proposedLeaseId: string): ILeaseState { - if (this.lease.leaseId !== leaseId) { + if ( + this.lease.leaseId !== leaseId && + this.lease.leaseId !== proposedLeaseId + ) { throw StorageErrorFactory.getLeaseIdMismatchWithLeaseOperation( this.context.contextId ); diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index d238ef468..fee47f287 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -1647,9 +1647,18 @@ export default class LokiBlobMetadataStore creationTime: context.startTime!, lastModified: context.startTime!, etag: newEtag(), - leaseStatus: Models.LeaseStatusType.Unlocked, - leaseState: Models.LeaseStateType.Available, - leaseDuration: undefined, + leaseStatus: + destBlob !== undefined + ? destBlob.properties.leaseStatus + : Models.LeaseStatusType.Unlocked, + leaseState: + destBlob !== undefined + ? destBlob.properties.leaseState + : Models.LeaseStateType.Available, + leaseDuration: + destBlob !== undefined + ? destBlob.properties.leaseDuration + : undefined, copyId: uuid(), copyStatus: Models.CopyStatusType.Success, copySource, @@ -1673,10 +1682,13 @@ export default class LokiBlobMetadataStore containerName: destination.container, pageRangesInOrder: sourceBlob.pageRangesInOrder, isCommitted: sourceBlob.isCommitted, - leaseDurationSeconds: undefined, - leaseId: undefined, - leaseExpireTime: undefined, - leaseBreakTime: undefined, + leaseDurationSeconds: + destBlob !== undefined ? destBlob.leaseDurationSeconds : undefined, + leaseId: destBlob !== undefined ? destBlob.leaseId : undefined, + leaseExpireTime: + destBlob !== undefined ? destBlob.leaseExpireTime : undefined, + leaseBreakTime: + destBlob !== undefined ? destBlob.leaseBreakTime : undefined, committedBlocksInOrder: sourceBlob.committedBlocksInOrder, persistency: sourceBlob.persistency }; diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index 0fa13902f..ef0791656 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -560,4 +560,97 @@ describe("BlobAPIs", () => { assert.ok(result.lastModified); assert.deepStrictEqual(result.metadata, metadata2); }); + + it("Copy blob should not override destination Lease status", async () => { + const sourceBlob = getUniqueName("blob"); + const destBlob = getUniqueName("blob"); + + const sourceBlobURL = BlockBlobURL.fromContainerURL( + containerURL, + sourceBlob + ); + const destBlobURL = BlockBlobURL.fromContainerURL(containerURL, destBlob); + + await sourceBlobURL.upload(Aborter.none, "hello", 5); + await destBlobURL.upload(Aborter.none, "hello", 5); + + const leaseResult = await destBlobURL.acquireLease(Aborter.none, "", -1); + const leaseId = leaseResult.leaseId; + assert.ok(leaseId); + + const getResult = await destBlobURL.getProperties(Aborter.none); + assert.equal(getResult.leaseDuration, "infinite"); + assert.equal(getResult.leaseState, "leased"); + assert.equal(getResult.leaseStatus, "locked"); + + await destBlobURL.startCopyFromURL(Aborter.none, sourceBlobURL.url, { + blobAccessConditions: { leaseAccessConditions: { leaseId } } + }); + + const result = await destBlobURL.getProperties(Aborter.none); + assert.ok(result.date); + assert.deepStrictEqual(result.blobType, "BlockBlob"); + assert.ok(result.lastModified); + assert.equal(getResult.leaseDuration, "infinite"); + assert.equal(getResult.leaseState, "leased"); + assert.equal(getResult.leaseStatus, "locked"); + + await destBlobURL.releaseLease(Aborter.none, leaseId!); + }); + + it("Acquire Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + // TODO: implement the case later + }); + + it("Renew Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + // TODO: implement the case later + }); + + it("Change Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + // TODO: implement the case later + }); + + it("Renew: Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + // TODO: implement the case later + }); + + it("Acquire Lease on Broken Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + // TODO: implement the case later + }); + + it("Break Lease on Infinite Lease, if give valid breakPeriod, should be broken after breadperiod", async () => { + // TODO: implement the case later + }); + + it("Break Lease on Infinite Lease, if not give breakPeriod, should be broken immidiately", async () => { + // TODO: implement the case later + }); + + it("Renew: Lease on Leased status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + // TODO: implement the case later + }); + + it("Change Lease on Leased status, if input LeaseId not match anyone of leaseID or proposedLeaseId, throw LeaseIdMismatchWithLease error", async () => { + // TODO: implement the case later + }); + + it("Change Lease on Leased status, if input LeaseId matches proposedLeaseId, will change success", async () => { + // TODO: implement the case later + }); + + it("UploadPage on a Leased page blob, if input LeaseId matches, will success", async () => { + // TODO: implement the case later + }); + + it("ClearPage on a Leased page blob, if input LeaseId matches, will success", async () => { + // TODO: implement the case later + }); + + it("Resize a Leased page blob, if input LeaseId matches, will success", async () => { + // TODO: implement the case later + }); + + it("UpdateSequenceNumber a Leased page blob, if input LeaseId matches, will success", async () => { + // TODO: implement the case later + }); }); From 238c4c82a6ef701af9a808bc0fd06efac4b496f2 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 19 Dec 2019 19:59:41 +0800 Subject: [PATCH 16/34] Filter getBlockList returnValue with BlockListingFilter (#326); Allow max TTL in PutMessage (#308) (#344) * In getBlockList, filter the returned block list with input BlockListingFilter * Fix Put message fail with max messagettl. * Update it.only to it --- ChangeLog.md | 3 +- src/blob/handlers/BlockBlobHandler.ts | 20 +++++++++- src/queue/handlers/MessagesHandler.ts | 13 +++++-- tests/blob/apis/blockblob.test.ts | 54 +++++++++++++++++++++++++++ tests/queue/apis/messages.test.ts | 2 +- 5 files changed, 85 insertions(+), 7 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 0f1abb4bd..931c4e9c3 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -11,7 +11,7 @@ Upcoming Release - Force flush data into disk before data upload request returns. Blob: - +- In getBlockList, filter the returned block list with input BlockListingFilter. - Added support for CORS. - AllowedHeaders and ExposedHeaders are optional now when setting CORS. - Added support to create block blob with empty block list. @@ -26,6 +26,7 @@ Blob: Queue: - AllowedHeaders and ExposedHeaders are optional now when setting CORS. +- Fix Put message fail with max messagettl. 2019.11 Version 3.3.0-preview diff --git a/src/blob/handlers/BlockBlobHandler.ts b/src/blob/handlers/BlockBlobHandler.ts index 5cb593c0a..3f2ae57eb 100644 --- a/src/blob/handlers/BlockBlobHandler.ts +++ b/src/blob/handlers/BlockBlobHandler.ts @@ -365,8 +365,24 @@ export default class BlockBlobHandler extends BaseHandler uncommittedBlocks: [] }; - response.uncommittedBlocks = res.uncommittedBlocks; - response.committedBlocks = res.committedBlocks; + if ( + options.listType !== undefined && + (options.listType.toLowerCase() === + Models.BlockListType.All.toLowerCase() || + options.listType.toLowerCase() === + Models.BlockListType.Uncommitted.toLowerCase()) + ) { + response.uncommittedBlocks = res.uncommittedBlocks; + } + if ( + options.listType === undefined || + options.listType.toLowerCase() === + Models.BlockListType.All.toLowerCase() || + options.listType.toLowerCase() === + Models.BlockListType.Committed.toLowerCase() + ) { + response.committedBlocks = res.committedBlocks; + } response.clientRequestId = options.requestId; return response; diff --git a/src/queue/handlers/MessagesHandler.ts b/src/queue/handlers/MessagesHandler.ts index 646b40b4a..4b36c05d1 100644 --- a/src/queue/handlers/MessagesHandler.ts +++ b/src/queue/handlers/MessagesHandler.ts @@ -271,9 +271,16 @@ export default class MessagesHandler extends BaseHandler } ); } else { - message.expirationTime.setTime( - context.startTime!.getTime() + options.messageTimeToLive * 1000 - ); + if ( + new Date(NEVER_EXPIRE_DATE).getTime() - context.startTime!.getTime() < + options.messageTimeToLive * 1000 + ) { + message.expirationTime = new Date(NEVER_EXPIRE_DATE); + } else { + message.expirationTime.setTime( + context.startTime!.getTime() + options.messageTimeToLive * 1000 + ); + } } } diff --git a/tests/blob/apis/blockblob.test.ts b/tests/blob/apis/blockblob.test.ts index 1ebb7a134..871af764b 100644 --- a/tests/blob/apis/blockblob.test.ts +++ b/tests/blob/apis/blockblob.test.ts @@ -303,6 +303,60 @@ describe("BlockBlobAPIs", () => { assert.equal(listResponse.committedBlocks![0].size, body.length); }); + it("getBlockList_BlockListingFilter", async () => { + const body = "HelloWorld"; + await blockBlobURL.stageBlock( + Aborter.none, + base64encode("1"), + body, + body.length + ); + await blockBlobURL.stageBlock( + Aborter.none, + base64encode("2"), + body, + body.length + ); + await blockBlobURL.commitBlockList(Aborter.none, [ + base64encode("1"), + base64encode("2") + ]); + + await blockBlobURL.stageBlock( + Aborter.none, + base64encode("3"), + body, + body.length + ); + + let listResponse = await blockBlobURL.getBlockList( + Aborter.none, + "committed" + ); + assert.equal(listResponse.committedBlocks!.length, 2); + assert.equal(listResponse.committedBlocks![0].name, base64encode("1")); + assert.equal(listResponse.committedBlocks![0].size, body.length); + assert.equal(listResponse.committedBlocks![1].name, base64encode("2")); + assert.equal(listResponse.committedBlocks![1].size, body.length); + assert.equal(listResponse.uncommittedBlocks!.length, 0); + + listResponse = await blockBlobURL.getBlockList(Aborter.none, "uncommitted"); + assert.equal(listResponse.uncommittedBlocks!.length, 1); + assert.equal(listResponse.uncommittedBlocks![0].name, base64encode("3")); + assert.equal(listResponse.uncommittedBlocks![0].size, body.length); + assert.equal(listResponse.committedBlocks!.length, 0); + + listResponse = await blockBlobURL.getBlockList(Aborter.none, "all"); + assert.equal(listResponse.committedBlocks!.length, 2); + assert.equal(listResponse.committedBlocks![0].name, base64encode("1")); + assert.equal(listResponse.committedBlocks![0].size, body.length); + assert.equal(listResponse.committedBlocks![1].name, base64encode("2")); + assert.equal(listResponse.committedBlocks![1].size, body.length); + assert.equal(listResponse.uncommittedBlocks!.length, 1); + assert.equal(listResponse.uncommittedBlocks![0].name, base64encode("3")); + assert.equal(listResponse.uncommittedBlocks![0].size, body.length); + }); + it("upload with Readable stream body and default parameters", async () => { const body: string = getUniqueName("randomstring"); const bodyBuffer = Buffer.from(body); diff --git a/tests/queue/apis/messages.test.ts b/tests/queue/apis/messages.test.ts index 53c24fc86..6f89015b0 100644 --- a/tests/queue/apis/messages.test.ts +++ b/tests/queue/apis/messages.test.ts @@ -173,7 +173,7 @@ describe("Messages APIs test", () => { visibilitytimeout: 5 }); await messagesURL.enqueue(Aborter.none, messageContent, { - messageTimeToLive: 20, + messageTimeToLive: Number.MAX_SAFE_INTEGER, visibilitytimeout: 19 }); From 0ae6547ed25e1698fe65ac4cbe4a63d4a8ced386 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Mon, 23 Dec 2019 11:33:39 +0800 Subject: [PATCH 17/34] Fixed a bug that uncommiited block blob invalid length. Fixed #327 (#348) --- ChangeLog.md | 4 +- src/blob/persistence/LokiBlobMetadataStore.ts | 2 +- src/blob/persistence/SqlBlobMetadataStore.ts | 41 +++++++++++++++---- tests/blob/apis/blockblob.test.ts | 12 ++++++ 4 files changed, 48 insertions(+), 11 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 931c4e9c3..00db97332 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -11,7 +11,8 @@ Upcoming Release - Force flush data into disk before data upload request returns. Blob: -- In getBlockList, filter the returned block list with input BlockListingFilter. + +- In getBlockList, filter the returned block list with input BlockListingFilter. - Added support for CORS. - AllowedHeaders and ExposedHeaders are optional now when setting CORS. - Added support to create block blob with empty block list. @@ -22,6 +23,7 @@ Blob: - Change some lease error code to align with server. - Fixed a bug that set blob tier doesn't work with account SAS. - Fixed a bug that Azurite Blob service cannot start in Mac as Visual Studio Extension. +- Fixed a bug that uncommiited block blob invalid length. Queue: diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index fee47f287..936f42400 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -1820,7 +1820,7 @@ export default class LokiBlobMetadataStore creationTime: context.startTime, lastModified: context.startTime, etag, - contentLength: block.persistency.count, + contentLength: 0, blobType: Models.BlobType.BlockBlob }, snapshot: "", diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index 1fb3ea1c3..bb69ec5d4 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -24,6 +24,7 @@ import { DEFAULT_LIST_BLOBS_MAX_RESULTS, DEFAULT_LIST_CONTAINERS_MAX_RESULTS } from "../utils/constants"; +import { newEtag } from "../utils/utils"; import BlobLeaseAdapter from "./BlobLeaseAdapter"; import BlobLeaseSyncer from "./BlobLeaseSyncer"; import BlobReadLeaseValidator from "./BlobReadLeaseValidator"; @@ -1282,16 +1283,38 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { new BlobLeaseAdapter(blobModel), context ).validate(new BlobWriteLeaseValidator(leaseAccessConditions)); + } else { + const newBlob = { + deleted: false, + accountName: block.accountName, + containerName: block.containerName, + name: block.blobName, + properties: { + creationTime: context.startTime!, + lastModified: context.startTime!, + etag: newEtag(), + contentLength: 0, + blobType: Models.BlobType.BlockBlob + }, + snapshot: "", + isCommitted: false + }; + await BlobsModel.upsert(this.convertBlobModelToDbModel(newBlob), { + transaction: t + }); } - await BlocksModel.upsert({ - accountName: block.accountName, - containerName: block.containerName, - blobName: block.blobName, - blockName: block.name, - size: block.size, - persistency: this.serializeModelValue(block.persistency) - }); + await BlocksModel.upsert( + { + accountName: block.accountName, + containerName: block.containerName, + blobName: block.blobName, + blockName: block.name, + size: block.size, + persistency: this.serializeModelValue(block.persistency) + }, + { transaction: t } + ); }); } @@ -2813,7 +2836,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { snapshot: blob.snapshot, blobType: blob.properties.blobType, blobSequenceNumber: blob.properties.blobSequenceNumber || null, - isCommitted: true, + isCommitted: blob.isCommitted, lastModified: blob.properties.lastModified, creationTime: blob.properties.creationTime || null, etag: blob.properties.etag, diff --git a/tests/blob/apis/blockblob.test.ts b/tests/blob/apis/blockblob.test.ts index 871af764b..5d7ddaed8 100644 --- a/tests/blob/apis/blockblob.test.ts +++ b/tests/blob/apis/blockblob.test.ts @@ -151,6 +151,18 @@ describe("BlockBlobAPIs", () => { body, body.length ); + + const listBlobResponse = await containerURL.listBlobFlatSegment( + Aborter.none, + undefined, + { include: ["uncommittedblobs"] } + ); + assert.equal(listBlobResponse.segment.blobItems.length, 1); + assert.deepStrictEqual( + listBlobResponse.segment.blobItems[0].properties.contentLength, + 0 + ); + const listResponse = await blockBlobURL.getBlockList( Aborter.none, "uncommitted" From 429594eb30dd9539679cd76c3421172966c235f9 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Mon, 23 Dec 2019 11:38:51 +0800 Subject: [PATCH 18/34] Added a test case for commit existing blocks, #323 (#349) --- tests/blob/apis/blockblob.test.ts | 46 +++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/tests/blob/apis/blockblob.test.ts b/tests/blob/apis/blockblob.test.ts index 5d7ddaed8..7bd6a60bf 100644 --- a/tests/blob/apis/blockblob.test.ts +++ b/tests/blob/apis/blockblob.test.ts @@ -215,6 +215,52 @@ describe("BlockBlobAPIs", () => { ); }); + it("commitBlockList with previous committed blocks", async () => { + const body = "HelloWorld"; + await blockBlobURL.stageBlock( + Aborter.none, + base64encode("1"), + body, + body.length + ); + await blockBlobURL.stageBlock( + Aborter.none, + base64encode("2"), + body, + body.length + ); + const result_commit = await blockBlobURL.commitBlockList(Aborter.none, [ + base64encode("1"), + base64encode("2") + ]); + assert.equal( + result_commit._response.request.headers.get("x-ms-client-request-id"), + result_commit.clientRequestId + ); + const listResponse = await blockBlobURL.getBlockList( + Aborter.none, + "committed" + ); + assert.equal(listResponse.committedBlocks!.length, 2); + assert.equal(listResponse.committedBlocks![0].name, base64encode("1")); + assert.equal(listResponse.committedBlocks![0].size, body.length); + assert.equal(listResponse.committedBlocks![1].name, base64encode("2")); + assert.equal(listResponse.committedBlocks![1].size, body.length); + assert.equal( + listResponse._response.request.headers.get("x-ms-client-request-id"), + listResponse.clientRequestId + ); + + await blockBlobURL.commitBlockList(Aborter.none, [base64encode("2")]); + const listResponse2 = await blockBlobURL.getBlockList( + Aborter.none, + "committed" + ); + assert.equal(listResponse2.committedBlocks!.length, 1); + assert.equal(listResponse2.committedBlocks![0].name, base64encode("2")); + assert.equal(listResponse2.committedBlocks![0].size, body.length); + }); + it("commitBlockList with empty list should create an empty block blob", async () => { await blockBlobURL.commitBlockList(Aborter.none, []); From 8ba9dd060bc34bc134a529eb623406fb32110989 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Mon, 23 Dec 2019 11:48:43 +0800 Subject: [PATCH 19/34] Fixed issues mentioned in #337 during CPP SDK testing (#350) * Fixed a bug that download page blob doesn't return content range header. * Removed the limitation that download page blob must align with 512bytes boundary. --- ChangeLog.md | 1 + src/blob/handlers/BlobHandler.ts | 13 +++++++++++- src/blob/handlers/PageBlobHandler.ts | 30 ++++++++++++++++++---------- src/blob/utils/utils.ts | 15 ++++++++++---- src/common/ZeroBytesStream.ts | 2 +- tests/blob/apis/pageblob.test.ts | 23 +++++++++++++++++++++ 6 files changed, 67 insertions(+), 17 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 00db97332..11f828478 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -23,6 +23,7 @@ Blob: - Change some lease error code to align with server. - Fixed a bug that set blob tier doesn't work with account SAS. - Fixed a bug that Azurite Blob service cannot start in Mac as Visual Studio Extension. +- Fixed a bug that download page blob doesn't return content range header. - Fixed a bug that uncommiited block blob invalid length. Queue: diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index f74f2b49b..742f64eb1 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -863,7 +863,8 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { // Deserializer doesn't handle range header currently, manually parse range headers here const rangesParts = deserializePageBlobRangeHeader( context.request!.getHeader("range"), - context.request!.getHeader("x-ms-range") + context.request!.getHeader("x-ms-range"), + false ); const rangeStart = rangesParts[0]; let rangeEnd = rangesParts[1]; @@ -929,6 +930,15 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { body = await bodyGetter(); } + let contentRange: string | undefined; + if ( + context.request!.getHeader("range") || + context.request!.getHeader("x-ms-range") + ) { + contentRange = `bytes ${rangeStart}-${rangeEnd}/${blob.properties + .contentLength!}`; + } + const response: Models.BlobDownloadResponse = { statusCode: rangesParts[1] === Infinity ? 200 : 206, body, @@ -939,6 +949,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { version: BLOB_API_VERSION, ...blob.properties, contentLength, + contentRange, contentMD5, blobContentMD5: blob.properties.contentMD5, isServerEncrypted: true, diff --git a/src/blob/handlers/PageBlobHandler.ts b/src/blob/handlers/PageBlobHandler.ts index cc9425e1b..faa7a2080 100644 --- a/src/blob/handlers/PageBlobHandler.ts +++ b/src/blob/handlers/PageBlobHandler.ts @@ -188,11 +188,14 @@ export default class PageBlobHandler extends BaseHandler context ); - const ranges = deserializePageBlobRangeHeader( - blobCtx.request!.getHeader("range"), - blobCtx.request!.getHeader("x-ms-range") - ); - if (!ranges) { + let ranges; + try { + ranges = deserializePageBlobRangeHeader( + blobCtx.request!.getHeader("range"), + blobCtx.request!.getHeader("x-ms-range"), + true + ); + } catch (err) { throw StorageErrorFactory.getInvalidPageRange(blobCtx.contextId!); } @@ -273,13 +276,17 @@ export default class PageBlobHandler extends BaseHandler ); } - const ranges = deserializePageBlobRangeHeader( - blobCtx.request!.getHeader("range"), - blobCtx.request!.getHeader("x-ms-range") - ); - if (!ranges) { + let ranges; + try { + ranges = deserializePageBlobRangeHeader( + blobCtx.request!.getHeader("range"), + blobCtx.request!.getHeader("x-ms-range"), + true + ); + } catch (err) { throw StorageErrorFactory.getInvalidPageRange(blobCtx.contextId!); } + const start = ranges[0]; const end = ranges[1]; @@ -334,7 +341,8 @@ export default class PageBlobHandler extends BaseHandler let ranges = deserializePageBlobRangeHeader( blobCtx.request!.getHeader("range"), - blobCtx.request!.getHeader("x-ms-range") + blobCtx.request!.getHeader("x-ms-range"), + false ); if (!ranges) { ranges = [0, blob.properties.contentLength! - 1]; diff --git a/src/blob/utils/utils.ts b/src/blob/utils/utils.ts index fd975ed87..c70c8bc54 100644 --- a/src/blob/utils/utils.ts +++ b/src/blob/utils/utils.ts @@ -69,7 +69,9 @@ export async function getMD5FromStream( .on("end", () => { resolve(hash.digest()); }) - .on("error", reject); + .on("error", err => { + reject(err); + }); }); } @@ -175,19 +177,24 @@ export function deserializeRangeHeader( */ export function deserializePageBlobRangeHeader( rangeHeaderValue?: string, - xMsRangeHeaderValue?: string + xMsRangeHeaderValue?: string, + force512boundary = true ): [number, number] { const ranges = deserializeRangeHeader(rangeHeaderValue, xMsRangeHeaderValue); const startInclusive = ranges[0]; const endInclusive = ranges[1]; - if (startInclusive % 512 !== 0) { + if (force512boundary && startInclusive % 512 !== 0) { throw new RangeError( `deserializePageBlobRangeHeader: range start value ${startInclusive} doesn't align with 512 boundary.` ); } - if (endInclusive !== Infinity && (endInclusive + 1) % 512 !== 0) { + if ( + force512boundary && + endInclusive !== Infinity && + (endInclusive + 1) % 512 !== 0 + ) { throw new RangeError( `deserializePageBlobRangeHeader: range end value ${endInclusive} doesn't align with 512 boundary.` ); diff --git a/src/common/ZeroBytesStream.ts b/src/common/ZeroBytesStream.ts index 2348bf81a..0e099e452 100644 --- a/src/common/ZeroBytesStream.ts +++ b/src/common/ZeroBytesStream.ts @@ -21,9 +21,9 @@ export default class ZeroBytesStream extends Readable { this.leftBytes -= zeroBytesRangeUnit; this.push(zeroBytesChunk); } else { - this.leftBytes -= zeroBytesRangeUnit; process.nextTick(() => { this.push(Buffer.alloc(this.leftBytes)); + this.leftBytes = 0; }); } } diff --git a/tests/blob/apis/pageblob.test.ts b/tests/blob/apis/pageblob.test.ts index ed47d275b..7f1f1ce14 100644 --- a/tests/blob/apis/pageblob.test.ts +++ b/tests/blob/apis/pageblob.test.ts @@ -141,6 +141,29 @@ describe("PageBlobAPIs", () => { ); }); + it("download page blob with partial ranges", async () => { + const length = 512 * 10; + await pageBlobURL.create(Aborter.none, length); + + const ranges = await pageBlobURL.getPageRanges(Aborter.none, 0, length); + assert.deepStrictEqual((ranges.pageRange || []).length, 0); + assert.deepStrictEqual((ranges.clearRange || []).length, 0); + assert.equal( + ranges._response.request.headers.get("x-ms-client-request-id"), + ranges.clientRequestId + ); + const result = await blobURL.download(Aborter.none, 0, 10); + assert.deepStrictEqual(result.contentRange, `bytes 0-9/5120`); + assert.deepStrictEqual( + await bodyToString(result, length), + "\u0000".repeat(10) + ); + assert.equal( + result._response.request.headers.get("x-ms-client-request-id"), + result.clientRequestId + ); + }); + it("download page blob with no ranges uploaded", async () => { const length = 512 * 10; await pageBlobURL.create(Aborter.none, length); From 55c5b3cc900c470ec850bb855baa832bdc5054b8 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Mon, 23 Dec 2019 12:38:57 +0800 Subject: [PATCH 20/34] GC Fix (#352) * Fixed a bug that persistency location cannot be customized through -l parameter. * Fixed a bug that GC will remove uncommitted blocks Co-authored-by: Wei Wei --- ChangeLog.md | 2 ++ src/blob/BlobServerFactory.ts | 6 ++++++ .../BlobReferredExtentsAsyncIterator.ts | 19 ++++++++++++++++--- src/blob/persistence/LokiBlobMetadataStore.ts | 4 ++-- src/common/persistence/FSExtentStore.ts | 7 +++++++ 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 11f828478..8b9565be9 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -23,6 +23,8 @@ Blob: - Change some lease error code to align with server. - Fixed a bug that set blob tier doesn't work with account SAS. - Fixed a bug that Azurite Blob service cannot start in Mac as Visual Studio Extension. +- Fixed a bug that persistency location cannot be customized through -l parameter. +- Fixed a bug that GC will remove uncommitted blocks. - Fixed a bug that download page blob doesn't return content range header. - Fixed a bug that uncommiited block blob invalid length. diff --git a/src/blob/BlobServerFactory.ts b/src/blob/BlobServerFactory.ts index da3ec38d6..5df952afa 100644 --- a/src/blob/BlobServerFactory.ts +++ b/src/blob/BlobServerFactory.ts @@ -6,6 +6,7 @@ import BlobEnvironment from "./BlobEnvironment"; import BlobServer from "./BlobServer"; import SqlBlobConfiguration from "./SqlBlobConfiguration"; import SqlBlobServer from "./SqlBlobServer"; +import { DEFAULT_BLOB_PERSISTENCE_PATH } from "./utils/constants"; import { DEFAULT_BLOB_EXTENT_LOKI_DB_PATH, DEFAULT_BLOB_LOKI_DB_PATH, @@ -22,6 +23,11 @@ export class BlobServerFactory { const location = await env.location(); const debugFilePath = await env.debug(); + DEFAULT_BLOB_PERSISTENCE_ARRAY[0].persistencyPath = join( + location, + DEFAULT_BLOB_PERSISTENCE_PATH + ); + // TODO: Check we need to create blob server against SQL or Loki const databaseConnectionString = process.env.AZURITE_DB; const isSQL = databaseConnectionString !== undefined; diff --git a/src/blob/persistence/BlobReferredExtentsAsyncIterator.ts b/src/blob/persistence/BlobReferredExtentsAsyncIterator.ts index 3e08ec653..4e5d6f846 100644 --- a/src/blob/persistence/BlobReferredExtentsAsyncIterator.ts +++ b/src/blob/persistence/BlobReferredExtentsAsyncIterator.ts @@ -52,6 +52,17 @@ export default class BlobReferredExtentsAsyncIterator }` ); + // this._logger.debug( + // `BlobReferredExtentsAsyncIterator:next() committedBlocksInOrder:${JSON.stringify( + // blob.committedBlocksInOrder + // )}` + // ); + // this._logger.debug( + // `BlobReferredExtentsAsyncIterator:next() pageRangesInOrder:${JSON.stringify( + // blob.pageRangesInOrder + // )}` + // ); + for (const block of blob.committedBlocksInOrder || []) { extents.push(block.persistency.id); } @@ -78,9 +89,11 @@ export default class BlobReferredExtentsAsyncIterator this.state = State.DONE; } - this.logger.debug( - `BlobReferredExtentsAsyncIterator:next() Handle blocks ${blocks.length}` - ); + // this._logger.debug( + // `BlobReferredExtentsAsyncIterator:next() Handle uncommitted blocks ${ + // blocks.length + // } ${JSON.stringify(blocks)}` + // ); return { done: false, diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 936f42400..083a414a5 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -2358,11 +2358,11 @@ export default class LokiBlobMetadataStore .data(); if (blockDocs.length <= maxResults) { - return [blockDocs, undefined]; + return [blockDocs.map(block => block.persistency), undefined]; } else { blockDocs.pop(); const nextMarker = `${blockDocs[maxResults - 1].$loki}`; - return [blockDocs, nextMarker]; + return [blockDocs.map(block => block.persistency), nextMarker]; } } diff --git a/src/common/persistence/FSExtentStore.ts b/src/common/persistence/FSExtentStore.ts index 73988be2a..7a9e807e5 100644 --- a/src/common/persistence/FSExtentStore.ts +++ b/src/common/persistence/FSExtentStore.ts @@ -449,12 +449,19 @@ export default class FSExtentStore implements IExtentStore { // Will not throw error because GC doesn't know extent is active, and will call this method to // delete active extents if (this.isActiveExtent(id)) { + this.logger.debug( + `FSExtentStore:deleteExtents() Skip deleting active extent:${id}` + ); continue; } const persistencyId = await this.metadataStore.getExtentPersistencyId(id); const path = this.generateExtentPath(persistencyId, id); + this.logger.debug( + `FSExtentStore:deleteExtents() Delete extent:${id} location:${persistencyId} path:${path}` + ); + try { await unlinkAsync(path); await this.metadataStore.deleteExtent(id); From 8c3caf6e087ba191b7c29af5118e39db1f08ed19 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Mon, 23 Dec 2019 16:27:10 +0800 Subject: [PATCH 21/34] [Breaking] Updated persistencyId to locationId for extent model (#355) --- BreakingChanges.md | 4 ++++ ChangeLog.md | 3 ++- package.json | 2 +- src/azurite.ts | 2 +- src/blob/BlobServerFactory.ts | 2 +- src/blob/utils/constants.ts | 4 ++-- src/common/VSCServerManagerBlob.ts | 4 ++-- src/common/VSCServerManagerQueue.ts | 4 ++-- src/common/persistence/FSExtentStore.ts | 22 +++++++++---------- .../persistence/IExtentMetadataStore.ts | 6 ++--- src/common/persistence/IExtentStore.ts | 4 ++-- .../persistence/LokiExtentMetadataStore.ts | 6 ++--- .../persistence/SqlExtentMetadataStore.ts | 18 ++++++--------- src/queue/main.ts | 2 +- src/queue/utils/constants.ts | 4 ++-- tests/BlobTestServerFactory.ts | 4 ++-- tests/queue/apis/messageid.test.ts | 4 ++-- tests/queue/apis/messages.test.ts | 4 ++-- tests/queue/apis/queue.test.ts | 4 ++-- tests/queue/apis/queueService.test.ts | 4 ++-- tests/queue/queueAuthentication.test.ts | 4 ++-- tests/queue/queueCorsRequest.test.ts | 4 ++-- tests/queue/queueSas.test.ts | 4 ++-- tests/queue/queueSpecialnaming.test.ts | 4 ++-- 24 files changed, 62 insertions(+), 61 deletions(-) diff --git a/BreakingChanges.md b/BreakingChanges.md index 92e910ed7..fee6fef05 100644 --- a/BreakingChanges.md +++ b/BreakingChanges.md @@ -2,6 +2,10 @@ > Note. This file includes breaking changes after 3.0.0-preview. For legacy Azurite changes, please goto GitHub [releases](https://github.com/Azure/Azurite/releases). +Upcoming Release + +- [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. Please clean up Azurite previous version workspace data files and restart Azurite. + 2019.11 Version 3.3.0-preview - [Breaking] This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. \ No newline at end of file diff --git a/ChangeLog.md b/ChangeLog.md index 8b9565be9..06bae28eb 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -12,6 +12,7 @@ Upcoming Release Blob: +- [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. Please clean up Azurite previous version workspace data files and restart Azurite. - In getBlockList, filter the returned block list with input BlockListingFilter. - Added support for CORS. - AllowedHeaders and ExposedHeaders are optional now when setting CORS. @@ -26,7 +27,7 @@ Blob: - Fixed a bug that persistency location cannot be customized through -l parameter. - Fixed a bug that GC will remove uncommitted blocks. - Fixed a bug that download page blob doesn't return content range header. -- Fixed a bug that uncommiited block blob invalid length. +- Fixed a bug that uncommitted block blob invalid length. Queue: diff --git a/package.json b/package.json index 13fbf6f4d..21a2a3be4 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ }, "dependencies": { "@azure/ms-rest-js": "^1.5.0", - "@types/validator": "^10.11.3", "args": "^5.0.1", "etag": "^1.8.1", "express": "^4.16.4", @@ -38,6 +37,7 @@ "xml2js": "^0.4.19" }, "devDependencies": { + "@types/validator": "^10.11.3", "@azure/storage-blob": "^10.4.1", "@azure/storage-queue": "^10.2.0", "@types/args": "^3.0.0", diff --git a/src/azurite.ts b/src/azurite.ts index 3608bb9b8..ef6ef5a40 100644 --- a/src/azurite.ts +++ b/src/azurite.ts @@ -40,7 +40,7 @@ async function main() { // TODO: Align with blob DEFAULT_BLOB_PERSISTENCE_ARRAY // TODO: Join for all paths in the array - DEFAULT_QUEUE_PERSISTENCE_ARRAY[0].persistencyPath = join( + DEFAULT_QUEUE_PERSISTENCE_ARRAY[0].locationPath = join( location, DEFAULT_QUEUE_PERSISTENCE_PATH ); diff --git a/src/blob/BlobServerFactory.ts b/src/blob/BlobServerFactory.ts index 5df952afa..f289cea03 100644 --- a/src/blob/BlobServerFactory.ts +++ b/src/blob/BlobServerFactory.ts @@ -23,7 +23,7 @@ export class BlobServerFactory { const location = await env.location(); const debugFilePath = await env.debug(); - DEFAULT_BLOB_PERSISTENCE_ARRAY[0].persistencyPath = join( + DEFAULT_BLOB_PERSISTENCE_ARRAY[0].locationPath = join( location, DEFAULT_BLOB_PERSISTENCE_PATH ); diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 9395d7844..e28d10518 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -70,8 +70,8 @@ export const SECONDARY_SUFFIX = "-secondary"; export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ { - persistencyId: "Default", - persistencyPath: DEFAULT_BLOB_PERSISTENCE_PATH, + locationId: "Default", + locationPath: DEFAULT_BLOB_PERSISTENCE_PATH, maxConcurrency: 10 } ]; diff --git a/src/common/VSCServerManagerBlob.ts b/src/common/VSCServerManagerBlob.ts index a86c56874..ae208d8ad 100644 --- a/src/common/VSCServerManagerBlob.ts +++ b/src/common/VSCServerManagerBlob.ts @@ -62,7 +62,7 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { await rimrafAsync(config.extentDBPath); await rimrafAsync(config.metadataDBPath); for (const path of config.persistencePathArray) { - await rimrafAsync(path.persistencyPath); + await rimrafAsync(path.locationPath); } } @@ -70,7 +70,7 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { const env = new VSCEnvironment(); const location = await env.location(); - DEFAULT_BLOB_PERSISTENCE_ARRAY[0].persistencyPath = join( + DEFAULT_BLOB_PERSISTENCE_ARRAY[0].locationPath = join( location, DEFAULT_BLOB_PERSISTENCE_PATH ); diff --git a/src/common/VSCServerManagerQueue.ts b/src/common/VSCServerManagerQueue.ts index d50fe66d8..d045719b0 100644 --- a/src/common/VSCServerManagerQueue.ts +++ b/src/common/VSCServerManagerQueue.ts @@ -67,7 +67,7 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { await rimrafAsync(config.extentDBPath); await rimrafAsync(config.metadataDBPath); for (const path of config.persistencePathArray) { - await rimrafAsync(path.persistencyPath); + await rimrafAsync(path.locationPath); } } @@ -76,7 +76,7 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { const location = await env.location(); await accessAsync(location); - DEFAULT_QUEUE_PERSISTENCE_ARRAY[0].persistencyPath = join( + DEFAULT_QUEUE_PERSISTENCE_ARRAY[0].locationPath = join( location, DEFAULT_QUEUE_PERSISTENCE_PATH ); diff --git a/src/common/persistence/FSExtentStore.ts b/src/common/persistence/FSExtentStore.ts index 7a9e807e5..a482cea46 100644 --- a/src/common/persistence/FSExtentStore.ts +++ b/src/common/persistence/FSExtentStore.ts @@ -86,12 +86,12 @@ export default class FSExtentStore implements IExtentStore { for (const storeDestination of persistencyConfiguration) { this.persistencyPath.set( - storeDestination.persistencyId, - storeDestination.persistencyPath + storeDestination.locationId, + storeDestination.locationPath ); for (let i = 0; i < storeDestination.maxConcurrency; i++) { const appendExtent = this.createAppendExtent( - storeDestination.persistencyId + storeDestination.locationId ); this.activeWriteExtents.push(appendExtent); } @@ -117,9 +117,9 @@ export default class FSExtentStore implements IExtentStore { public async init(): Promise { for (const storeDestination of this.persistencyConfiguration) { try { - await statAsync(storeDestination.persistencyPath); + await statAsync(storeDestination.locationPath); } catch { - await mkdirAsync(storeDestination.persistencyPath); + await mkdirAsync(storeDestination.locationPath); } } @@ -143,7 +143,7 @@ export default class FSExtentStore implements IExtentStore { if (this.isClosed()) { for (const path of this.persistencyConfiguration) { try { - await rimrafAsync(path.persistencyPath); + await rimrafAsync(path.locationPath); } catch { // TODO: Find out why sometimes it throws no permission error /* NOOP */ @@ -269,7 +269,7 @@ export default class FSExtentStore implements IExtentStore { const extent: IExtentModel = { id, - persistencyId: appendExtent.locationId, + locationId: appendExtent.locationId, path: id, size: count + offset, lastModifiedInMS: Date.now() @@ -324,7 +324,7 @@ export default class FSExtentStore implements IExtentStore { return new ZeroBytesStream(subRangeCount); } - const persistencyId = await this.metadataStore.getExtentPersistencyId( + const persistencyId = await this.metadataStore.getExtentLocationId( extentChunk.id ); @@ -455,11 +455,11 @@ export default class FSExtentStore implements IExtentStore { continue; } - const persistencyId = await this.metadataStore.getExtentPersistencyId(id); - const path = this.generateExtentPath(persistencyId, id); + const locationId = await this.metadataStore.getExtentLocationId(id); + const path = this.generateExtentPath(locationId, id); this.logger.debug( - `FSExtentStore:deleteExtents() Delete extent:${id} location:${persistencyId} path:${path}` + `FSExtentStore:deleteExtents() Delete extent:${id} location:${locationId} path:${path}` ); try { diff --git a/src/common/persistence/IExtentMetadataStore.ts b/src/common/persistence/IExtentMetadataStore.ts index a7e8b0cc6..deedff4b4 100644 --- a/src/common/persistence/IExtentMetadataStore.ts +++ b/src/common/persistence/IExtentMetadataStore.ts @@ -17,12 +17,12 @@ export interface IExtentModel { id: string; /** - * Destination persistencyId or called location ID. + * Destination locationId. * * @type {string} * @memberof IExtentModel */ - persistencyId: string; + locationId: string; /** * Relative local file path/name. @@ -104,5 +104,5 @@ export default interface IExtentMetadataStore * @returns {Promise} * @memberof IExtentMetadataStore */ - getExtentPersistencyId(extentId: string): Promise; + getExtentLocationId(extentId: string): Promise; } diff --git a/src/common/persistence/IExtentStore.ts b/src/common/persistence/IExtentStore.ts index 13ff0dc69..a7de1a0f1 100644 --- a/src/common/persistence/IExtentStore.ts +++ b/src/common/persistence/IExtentStore.ts @@ -16,8 +16,8 @@ export interface IExtentChunk { } interface IStoreDestinationConfigure { - persistencyPath: string; - persistencyId: string; + locationPath: string; + locationId: string; maxConcurrency: number; } diff --git a/src/common/persistence/LokiExtentMetadataStore.ts b/src/common/persistence/LokiExtentMetadataStore.ts index 6ee2465d1..1a0c31f6b 100644 --- a/src/common/persistence/LokiExtentMetadataStore.ts +++ b/src/common/persistence/LokiExtentMetadataStore.ts @@ -210,9 +210,9 @@ export default class LokiExtentMetadata implements IExtentMetadataStore { * @returns {Promise} * @memberof IExtentMetadata */ - public async getExtentPersistencyId(extentId: string): Promise { + public async getExtentLocationId(extentId: string): Promise { const coll = this.db.getCollection(this.EXTENTS_COLLECTION); - const doc = coll.findOne({ id: extentId }); - return doc.persistencyId; + const doc = coll.findOne({ id: extentId }) as IExtentModel; + return doc.locationId; } } diff --git a/src/common/persistence/SqlExtentMetadataStore.ts b/src/common/persistence/SqlExtentMetadataStore.ts index ff0cf9c15..418923fe9 100644 --- a/src/common/persistence/SqlExtentMetadataStore.ts +++ b/src/common/persistence/SqlExtentMetadataStore.ts @@ -48,7 +48,7 @@ export default class SqlExtentMetadataStore implements IExtentMetadataStore { type: "VARCHAR(255)", primaryKey: true }, - persistencyId: { + locationId: { allowNull: false, type: "VARCHAR(255)" }, @@ -155,7 +155,7 @@ export default class SqlExtentMetadataStore implements IExtentMetadataStore { const getId = this.getModelValue(extentsModel, "id", true); return { id: getId, - persistencyId: this.getModelValue( + locationId: this.getModelValue( extentsModel, "persistencyId", true @@ -203,13 +203,13 @@ export default class SqlExtentMetadataStore implements IExtentMetadataStore { } /** - * Get the persistencyId for a given extentId. + * Get the locationId for a given extentId. * * @param {string} extentId * @returns {Promise} * @memberof IExtentMetadata */ - public async getExtentPersistencyId(extentId: string): Promise { + public async getExtentLocationId(extentId: string): Promise { return ExtentsModel.findOne({ where: { id: extentId @@ -217,15 +217,11 @@ export default class SqlExtentMetadataStore implements IExtentMetadataStore { }).then(res => { if (res === null || res === undefined) { throw Error( - `SqlExtentMetadataStore:getExtentPersistencyId() Error. Extent not exists.` + `SqlExtentMetadataStore:getExtentLocationId() Error. Extent not exists.` ); } - const persistencyId = this.getModelValue( - res, - "persistencyId", - true - ); - return persistencyId; + const locationId = this.getModelValue(res, "locationId", true); + return locationId; }); } diff --git a/src/queue/main.ts b/src/queue/main.ts index 27cf098cb..175759aeb 100644 --- a/src/queue/main.ts +++ b/src/queue/main.ts @@ -35,7 +35,7 @@ async function main() { // Initialize server configuration // TODO: Should provide the absolute path directly. - DEFAULT_QUEUE_PERSISTENCE_ARRAY[0].persistencyPath = join( + DEFAULT_QUEUE_PERSISTENCE_ARRAY[0].locationPath = join( location, DEFAULT_QUEUE_PERSISTENCE_PATH ); diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index 189520e83..c20d65cc0 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -88,8 +88,8 @@ export enum QUEUE_STATUSCODE { export const DEFAULT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { - persistencyId: "Default", - persistencyPath: DEFAULT_QUEUE_PERSISTENCE_PATH, + locationId: "Default", + locationPath: DEFAULT_QUEUE_PERSISTENCE_PATH, maxConcurrency: 1 } ]; diff --git a/tests/BlobTestServerFactory.ts b/tests/BlobTestServerFactory.ts index df2e834cb..dd7d7ceab 100644 --- a/tests/BlobTestServerFactory.ts +++ b/tests/BlobTestServerFactory.ts @@ -13,8 +13,8 @@ export default class BlobTestServerFactory { const host = "127.0.0.1"; const persistenceArray: StoreDestinationArray = [ { - persistencyId: "test", - persistencyPath: "__test_blob_extent__", + locationId: "test", + locationPath: "__test_blob_extent__", maxConcurrency: 10 } ]; diff --git a/tests/queue/apis/messageid.test.ts b/tests/queue/apis/messageid.test.ts index 9d10d8caa..3c7adfa4b 100644 --- a/tests/queue/apis/messageid.test.ts +++ b/tests/queue/apis/messageid.test.ts @@ -35,8 +35,8 @@ describe("MessageId APIs test", () => { const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { - persistencyId: "queueTest", - persistencyPath: persistencePath, + locationId: "queueTest", + locationPath: persistencePath, maxConcurrency: 10 } ]; diff --git a/tests/queue/apis/messages.test.ts b/tests/queue/apis/messages.test.ts index 6f89015b0..f48779f26 100644 --- a/tests/queue/apis/messages.test.ts +++ b/tests/queue/apis/messages.test.ts @@ -33,8 +33,8 @@ describe("Messages APIs test", () => { const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { - persistencyId: "queueTest", - persistencyPath: persistencePath, + locationId: "queueTest", + locationPath: persistencePath, maxConcurrency: 10 } ]; diff --git a/tests/queue/apis/queue.test.ts b/tests/queue/apis/queue.test.ts index f7e39a455..264208b45 100644 --- a/tests/queue/apis/queue.test.ts +++ b/tests/queue/apis/queue.test.ts @@ -32,8 +32,8 @@ describe("Queue APIs test", () => { const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { - persistencyId: "queueTest", - persistencyPath: persistencePath, + locationId: "queueTest", + locationPath: persistencePath, maxConcurrency: 10 } ]; diff --git a/tests/queue/apis/queueService.test.ts b/tests/queue/apis/queueService.test.ts index 87af2647e..1ea19eea3 100644 --- a/tests/queue/apis/queueService.test.ts +++ b/tests/queue/apis/queueService.test.ts @@ -32,8 +32,8 @@ describe("QueueServiceAPIs", () => { const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { - persistencyId: "queueTest", - persistencyPath: persistencePath, + locationId: "queueTest", + locationPath: persistencePath, maxConcurrency: 10 } ]; diff --git a/tests/queue/queueAuthentication.test.ts b/tests/queue/queueAuthentication.test.ts index bcbdc6291..b5c763b2b 100644 --- a/tests/queue/queueAuthentication.test.ts +++ b/tests/queue/queueAuthentication.test.ts @@ -33,8 +33,8 @@ describe("Queue Authentication", () => { const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { - persistencyId: "queueTest", - persistencyPath: persistencePath, + locationId: "queueTest", + locationPath: persistencePath, maxConcurrency: 10 } ]; diff --git a/tests/queue/queueCorsRequest.test.ts b/tests/queue/queueCorsRequest.test.ts index ae9427161..b0d0852b1 100644 --- a/tests/queue/queueCorsRequest.test.ts +++ b/tests/queue/queueCorsRequest.test.ts @@ -33,8 +33,8 @@ describe("Queue Cors requests test", () => { const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { - persistencyId: "queueTest", - persistencyPath: persistencePath, + locationId: "queueTest", + locationPath: persistencePath, maxConcurrency: 10 } ]; diff --git a/tests/queue/queueSas.test.ts b/tests/queue/queueSas.test.ts index 103fefc08..54b1441d7 100644 --- a/tests/queue/queueSas.test.ts +++ b/tests/queue/queueSas.test.ts @@ -43,8 +43,8 @@ describe("Queue SAS test", () => { const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { - persistencyId: "queueTest", - persistencyPath: persistencePath, + locationId: "queueTest", + locationPath: persistencePath, maxConcurrency: 10 } ]; diff --git a/tests/queue/queueSpecialnaming.test.ts b/tests/queue/queueSpecialnaming.test.ts index eb7bc79ab..d7a079ecd 100644 --- a/tests/queue/queueSpecialnaming.test.ts +++ b/tests/queue/queueSpecialnaming.test.ts @@ -31,8 +31,8 @@ describe("Queue SpecialNaming", () => { const DEFUALT_QUEUE_PERSISTENCE_ARRAY: StoreDestinationArray = [ { - persistencyId: "queueTest", - persistencyPath: persistencePath, + locationId: "queueTest", + locationPath: persistencePath, maxConcurrency: 10 } ]; From f975d02d877489fc25192c228543164b766d4ae4 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Mon, 23 Dec 2019 16:30:28 +0800 Subject: [PATCH 22/34] [Breaking] Apply LokiFsStructuredAdapter as default blob metadata loki adapter to improve performance. (#356) --- BreakingChanges.md | 6 ++++-- ChangeLog.md | 12 +++++++----- src/blob/persistence/LokiBlobMetadataStore.ts | 9 +++++++++ src/blob/utils/constants.ts | 3 ++- src/common/utils/utils.ts | 4 ++++ 5 files changed, 26 insertions(+), 8 deletions(-) diff --git a/BreakingChanges.md b/BreakingChanges.md index fee6fef05..9759cf9b2 100644 --- a/BreakingChanges.md +++ b/BreakingChanges.md @@ -2,10 +2,12 @@ > Note. This file includes breaking changes after 3.0.0-preview. For legacy Azurite changes, please goto GitHub [releases](https://github.com/Azure/Azurite/releases). -Upcoming Release +# Incoming Release +- [Breaking] Apply LokiFsStructuredAdapter as default blob metadata loki adapter to improve performance. + - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. - [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. Please clean up Azurite previous version workspace data files and restart Azurite. -2019.11 Version 3.3.0-preview +# 2019.11 Version 3.3.0-preview - [Breaking] This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. \ No newline at end of file diff --git a/ChangeLog.md b/ChangeLog.md index 06bae28eb..d6aec80a8 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -2,7 +2,7 @@ > Note. This file includes changes after 3.0.0-preview. For legacy Azurite changes, please goto GitHub [releases](https://github.com/Azure/Azurite/releases). -Upcoming Release +# Upcoming Release - Fixed a bug that to return the list of containers in sorted order. - Fixed a bug that get/download blob snapshot fail. @@ -12,6 +12,8 @@ Upcoming Release Blob: +- [Breaking] Apply LokiFsStructuredAdapter as default blob metadata loki adapter to improve performance. + - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. - [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. Please clean up Azurite previous version workspace data files and restart Azurite. - In getBlockList, filter the returned block list with input BlockListingFilter. - Added support for CORS. @@ -34,7 +36,7 @@ Queue: - AllowedHeaders and ExposedHeaders are optional now when setting CORS. - Fix Put message fail with max messagettl. - 2019.11 Version 3.3.0-preview +# 2019.11 Version 3.3.0-preview - Azurite now supports customized account names and keys by environment variable `AZURITE_ACCOUNTS`. - Improved logging for underlayer operations, such as persistency data read and write operations. @@ -59,7 +61,7 @@ Queue: - Responses now includes x-ms-client-request-id when request provided client request ID. - 2019.08 Version 3.2.0-preview +# 2019.08 Version 3.2.0-preview - Updated repository link to https to compatible with Visual Studio Code. @@ -73,7 +75,7 @@ Queue: - Decoupled persistence layer into service metadata storage and extent file storage. - Supported Cors and Preflight in Queue service. - 2019.06 Version 3.1.2-preview +# 2019.06 Version 3.1.2-preview - Integrated Azurite with Visual Studio Code as an extension. - Added Visual Studio Code extension usage guidelines. @@ -83,6 +85,6 @@ Queue: - Fixed an issue that metadata doesn't get copied when copy blob. - Fixed GetBlockBlob missing Content-Range header - 2019.05 Version 3.0.0-preview +# 2019.05 Version 3.0.0-preview - Initial Release of Azurite V3. diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 083a414a5..2d192ec1e 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -7,6 +7,7 @@ import { convertDateTimeStringMsTo7Digital, rimrafAsync } from "../../common/utils/utils"; +import { lfsa } from "../../common/utils/utils"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import * as Models from "../generated/artifacts/models"; import { LeaseStatusType } from "../generated/artifacts/models"; @@ -99,6 +100,7 @@ export default class LokiBlobMetadataStore public constructor(public readonly lokiDBPath: string) { this.db = new Loki(lokiDBPath, { + adapter: new lfsa(), autosave: true, autosaveInterval: 5000 }); @@ -206,6 +208,13 @@ export default class LokiBlobMetadataStore public async clean(): Promise { if (this.isClosed()) { await rimrafAsync(this.lokiDBPath); + + // Remove separate metadata collection json files generated by LokiFsStructuredAdapter + const searchScope = 20; // Should be larger than number of collections for every loki database + for (let i = 0; i < searchScope; i++) { + await rimrafAsync(`${this.lokiDBPath}.${i}`); + } + return; } throw new Error(`Cannot clean LokiBlobMetadataStore, it's not closed.`); diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index e28d10518..2be20fcf7 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -19,6 +19,7 @@ export const DEFAULT_ENABLE_ACCESS_LOG = true; export const DEFAULT_CONTEXT_PATH = "azurite_blob_context"; export const LOGGER_CONFIGS = {}; export const DEFAULT_GC_INTERVAL_MS = 10 * 60 * 1000; +export const DEFAULT_WRITE_CONCURRENCY_PER_LOCATION = 50; export const EMULATOR_ACCOUNT_NAME = "devstoreaccount1"; export const EMULATOR_ACCOUNT_KEY = Buffer.from( "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==", @@ -72,7 +73,7 @@ export const DEFAULT_BLOB_PERSISTENCE_ARRAY: StoreDestinationArray = [ { locationId: "Default", locationPath: DEFAULT_BLOB_PERSISTENCE_PATH, - maxConcurrency: 10 + maxConcurrency: DEFAULT_WRITE_CONCURRENCY_PER_LOCATION } ]; diff --git a/src/common/utils/utils.ts b/src/common/utils/utils.ts index ebc6a8877..757b9e93f 100644 --- a/src/common/utils/utils.ts +++ b/src/common/utils/utils.ts @@ -2,6 +2,10 @@ import rimraf = require("rimraf"); import { promisify } from "util"; import StorageErrorFactory from "../../blob/errors/StorageErrorFactory"; +// LokiFsStructuredAdapter +// tslint:disable-next-line:no-var-requires +export const lfsa = require("lokijs/src/loki-fs-structured-adapter.js"); + export const rimrafAsync = promisify(rimraf); export function minDate(date1: Date, date2: Date): Date { From 69a5a103725800bd4e5390930c625ec9c6eed6e2 Mon Sep 17 00:00:00 2001 From: Manfred Date: Mon, 23 Dec 2019 21:36:55 +1300 Subject: [PATCH 23/34] Add .gitattributes to assist people using different host operating systems. Add .dockerignore to minimise the amount of files sent to docker machine when creating the docker image. Replaced "npm install" with "npm ci" in various places, in particular in Dockerfile to make container image builds repeatable. (#354) --- .dockerignore | 5 +++++ .gitattributes | 6 ++++++ CONTRIBUTION.md | 6 +++--- Dockerfile | 2 +- README.md | 2 +- 5 files changed, 16 insertions(+), 5 deletions(-) create mode 100644 .dockerignore create mode 100644 .gitattributes diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..d459c651a --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +.vscode/** +node_modules/** +swagger/** +__blobstorage__/** +__queuestorage__/** diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..4b21edde3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,6 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto eol=lf + +# Denote all files that are truly binary and should not be modified. +*.png binary +*.jpg binary diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index ebe32af65..6ffd4a9ee 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -15,14 +15,14 @@ In the root of the repository, we have provided pre-defined debugging scripts. T Manually follow following steps to build and run all services in Azurite: ```bash -npm install +npm ci npm run azurite ``` Or build and run a certain service like Blob service: ```bash -npm install +npm ci npm run blob ``` @@ -57,7 +57,7 @@ We also provide a predefined Visual Studio Code debug configuration "Current Moc Or manually execute all test cases: ```bash -npm install +npm ci npm run test ``` diff --git a/Dockerfile b/Dockerfile index 81af50359..ef9ef376b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,7 +8,7 @@ VOLUME [ "/data" ] COPY . . RUN npm config set unsafe-perm=true -RUN npm install +RUN npm ci RUN npm run build RUN npm install -g diff --git a/README.md b/README.md index a04caf27d..e8c2cd74b 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ Try with any of following ways to start an Azurite V3 instance. After cloning source code, execute following commands to install and start Azurite V3. ```bash -npm install +npm ci npm run build npm install -g azurite From 2395dec0eb8f235922ba34633bd81e3b33704caf Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Mon, 23 Dec 2019 17:26:23 +0800 Subject: [PATCH 24/34] Refactor files structure (#357) --- package-lock.json | 3 +- src/blob/BlobRequestListenerFactory.ts | 6 +-- src/blob/SqlBlobRequestListenerFactory.ts | 6 +-- src/blob/handlers/BlobHandler.ts | 2 +- .../handlers/PageBlobAccessTierThreshold.ts | 45 ------------------- src/blob/handlers/PageBlobHandler.ts | 4 +- .../BlobLeaseAdapter.ts | 2 +- .../{persistence => lease}/BlobLeaseSyncer.ts | 2 +- .../BlobReadLeaseValidator.ts | 0 .../BlobWriteLeaseSyncer.ts | 2 +- .../BlobWriteLeaseValidator.ts | 0 .../ContainerDeleteLeaseValidator.ts | 0 .../ContainerLeaseAdapter.ts | 2 +- .../ContainerLeaseSyncer.ts | 2 +- .../ContainerReadLeaseValidator.ts | 0 .../{persistence => lease}/ILeaseState.ts | 0 .../LeaseAvailableState.ts | 0 .../LeaseBreakingState.ts | 0 .../LeaseBrokenState.ts | 0 .../LeaseExpiredState.ts | 0 .../{persistence => lease}/LeaseFactory.ts | 0 .../LeaseLeasedState.ts | 0 .../{persistence => lease}/LeaseStateBase.ts | 0 .../AuthenticationMiddlewareFactory.ts | 2 +- .../PreflightMiddlewareFactory.ts | 0 .../blobStorageContext.middleware.ts | 2 +- src/blob/persistence/LokiBlobMetadataStore.ts | 22 ++++----- src/blob/persistence/SqlBlobMetadataStore.ts | 22 ++++----- src/queue/QueueRequestListenerFactory.ts | 6 +-- .../AuthenticationMiddlewareFactory.ts | 2 +- .../PreflightMiddlewareFactory.ts | 0 .../queueStorageContext.middleware.ts | 2 +- 32 files changed, 45 insertions(+), 89 deletions(-) delete mode 100644 src/blob/handlers/PageBlobAccessTierThreshold.ts rename src/blob/{persistence => lease}/BlobLeaseAdapter.ts (96%) rename src/blob/{persistence => lease}/BlobLeaseSyncer.ts (91%) rename src/blob/{persistence => lease}/BlobReadLeaseValidator.ts (100%) rename src/blob/{persistence => lease}/BlobWriteLeaseSyncer.ts (96%) rename src/blob/{persistence => lease}/BlobWriteLeaseValidator.ts (100%) rename src/blob/{persistence => lease}/ContainerDeleteLeaseValidator.ts (100%) rename src/blob/{persistence => lease}/ContainerLeaseAdapter.ts (96%) rename src/blob/{persistence => lease}/ContainerLeaseSyncer.ts (91%) rename src/blob/{persistence => lease}/ContainerReadLeaseValidator.ts (100%) rename src/blob/{persistence => lease}/ILeaseState.ts (100%) rename src/blob/{persistence => lease}/LeaseAvailableState.ts (100%) rename src/blob/{persistence => lease}/LeaseBreakingState.ts (100%) rename src/blob/{persistence => lease}/LeaseBrokenState.ts (100%) rename src/blob/{persistence => lease}/LeaseExpiredState.ts (100%) rename src/blob/{persistence => lease}/LeaseFactory.ts (100%) rename src/blob/{persistence => lease}/LeaseLeasedState.ts (100%) rename src/blob/{persistence => lease}/LeaseStateBase.ts (100%) rename src/blob/{authentication => middlewares}/AuthenticationMiddlewareFactory.ts (96%) rename src/blob/{preflight => middlewares}/PreflightMiddlewareFactory.ts (100%) rename src/blob/{context => middlewares}/blobStorageContext.middleware.ts (98%) rename src/queue/{authentication => middlewares}/AuthenticationMiddlewareFactory.ts (96%) rename src/queue/{preflight => middlewares}/PreflightMiddlewareFactory.ts (100%) rename src/queue/{context => middlewares}/queueStorageContext.middleware.ts (98%) diff --git a/package-lock.json b/package-lock.json index 5791c0693..c91bc2854 100644 --- a/package-lock.json +++ b/package-lock.json @@ -379,7 +379,8 @@ "@types/validator": { "version": "10.11.3", "resolved": "https://registry.npmjs.org/@types/validator/-/validator-10.11.3.tgz", - "integrity": "sha512-GKF2VnEkMmEeEGvoo03ocrP9ySMuX1ypKazIYMlsjfslfBMhOAtC5dmEWKdJioW4lJN7MZRS88kalTsVClyQ9w==" + "integrity": "sha512-GKF2VnEkMmEeEGvoo03ocrP9ySMuX1ypKazIYMlsjfslfBMhOAtC5dmEWKdJioW4lJN7MZRS88kalTsVClyQ9w==", + "dev": true }, "@types/vscode": { "version": "1.39.0", diff --git a/src/blob/BlobRequestListenerFactory.ts b/src/blob/BlobRequestListenerFactory.ts index 61f3493b4..f5b287f4b 100644 --- a/src/blob/BlobRequestListenerFactory.ts +++ b/src/blob/BlobRequestListenerFactory.ts @@ -7,11 +7,9 @@ import logger from "../common/Logger"; import IExtentStore from "../common/persistence/IExtentStore"; import { RequestListener } from "../common/ServerBase"; import AccountSASAuthenticator from "./authentication/AccountSASAuthenticator"; -import AuthenticationMiddlewareFactory from "./authentication/AuthenticationMiddlewareFactory"; import BlobSASAuthenticator from "./authentication/BlobSASAuthenticator"; import BlobSharedKeyAuthenticator from "./authentication/BlobSharedKeyAuthenticator"; import PublicAccessAuthenticator from "./authentication/PublicAccessAuthenticator"; -import blobStorageContextMiddleware from "./context/blobStorageContext.middleware"; import ExpressMiddlewareFactory from "./generated/ExpressMiddlewareFactory"; import IHandlers from "./generated/handlers/IHandlers"; import MiddlewareFactory from "./generated/MiddlewareFactory"; @@ -22,8 +20,10 @@ import ContainerHandler from "./handlers/ContainerHandler"; import PageBlobHandler from "./handlers/PageBlobHandler"; import PageBlobRangesManager from "./handlers/PageBlobRangesManager"; import ServiceHandler from "./handlers/ServiceHandler"; +import AuthenticationMiddlewareFactory from "./middlewares/AuthenticationMiddlewareFactory"; +import blobStorageContextMiddleware from "./middlewares/blobStorageContext.middleware"; +import PreflightMiddlewareFactory from "./middlewares/PreflightMiddlewareFactory"; import IBlobMetadataStore from "./persistence/IBlobMetadataStore"; -import PreflightMiddlewareFactory from "./preflight/PreflightMiddlewareFactory"; import { DEFAULT_CONTEXT_PATH } from "./utils/constants"; /** diff --git a/src/blob/SqlBlobRequestListenerFactory.ts b/src/blob/SqlBlobRequestListenerFactory.ts index b0890d4d9..f44d769d7 100644 --- a/src/blob/SqlBlobRequestListenerFactory.ts +++ b/src/blob/SqlBlobRequestListenerFactory.ts @@ -7,11 +7,9 @@ import logger from "../common/Logger"; import IExtentStore from "../common/persistence/IExtentStore"; import { RequestListener } from "../common/ServerBase"; import AccountSASAuthenticator from "./authentication/AccountSASAuthenticator"; -import AuthenticationMiddlewareFactory from "./authentication/AuthenticationMiddlewareFactory"; import BlobSASAuthenticator from "./authentication/BlobSASAuthenticator"; import BlobSharedKeyAuthenticator from "./authentication/BlobSharedKeyAuthenticator"; import PublicAccessAuthenticator from "./authentication/PublicAccessAuthenticator"; -import blobStorageContextMiddleware from "./context/blobStorageContext.middleware"; import ExpressMiddlewareFactory from "./generated/ExpressMiddlewareFactory"; import IHandlers from "./generated/handlers/IHandlers"; import MiddlewareFactory from "./generated/MiddlewareFactory"; @@ -22,8 +20,10 @@ import ContainerHandler from "./handlers/ContainerHandler"; import PageBlobHandler from "./handlers/PageBlobHandler"; import PageBlobRangesManager from "./handlers/PageBlobRangesManager"; import ServiceHandler from "./handlers/ServiceHandler"; +import AuthenticationMiddlewareFactory from "./middlewares/AuthenticationMiddlewareFactory"; +import blobStorageContextMiddleware from "./middlewares/blobStorageContext.middleware"; +import PreflightMiddlewareFactory from "./middlewares/PreflightMiddlewareFactory"; import IBlobMetadataStore from "./persistence/IBlobMetadataStore"; -import PreflightMiddlewareFactory from "./preflight/PreflightMiddlewareFactory"; import { DEFAULT_CONTEXT_PATH } from "./utils/constants"; /** diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 742f64eb1..15785d1f6 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -2,13 +2,13 @@ import { URL } from "url"; import IExtentStore from "../../common/persistence/IExtentStore"; import BlobStorageContext from "../context/BlobStorageContext"; -import { extractStoragePartsFromPath } from "../context/blobStorageContext.middleware"; import NotImplementedError from "../errors/NotImplementedError"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import * as Models from "../generated/artifacts/models"; import Context from "../generated/Context"; import IBlobHandler from "../generated/handlers/IBlobHandler"; import ILogger from "../generated/utils/ILogger"; +import { extractStoragePartsFromPath } from "../middlewares/blobStorageContext.middleware"; import IBlobMetadataStore, { BlobModel } from "../persistence/IBlobMetadataStore"; diff --git a/src/blob/handlers/PageBlobAccessTierThreshold.ts b/src/blob/handlers/PageBlobAccessTierThreshold.ts deleted file mode 100644 index 76f173579..000000000 --- a/src/blob/handlers/PageBlobAccessTierThreshold.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { AccessTier, PageBlobAccessTier } from "../generated/artifacts/models"; - -// https://docs.microsoft.com/en-us/azure/virtual-machines/windows/disks-types#premium-ssd - -const GB = 1024 * 1024 * 1024; - -const PageBlobAccessTierThreshold = new Map< - AccessTier | PageBlobAccessTier, - number ->(); - -PageBlobAccessTierThreshold.set(AccessTier.P4, 32 * GB); -PageBlobAccessTierThreshold.set(PageBlobAccessTier.P4, 32 * GB); - -PageBlobAccessTierThreshold.set(AccessTier.P6, 64 * GB); -PageBlobAccessTierThreshold.set(PageBlobAccessTier.P6, 64 * GB); - -PageBlobAccessTierThreshold.set(AccessTier.P10, 128 * GB); -PageBlobAccessTierThreshold.set(PageBlobAccessTier.P10, 128 * GB); - -PageBlobAccessTierThreshold.set(AccessTier.P15, 256 * GB); -PageBlobAccessTierThreshold.set(PageBlobAccessTier.P15, 256 * GB); - -PageBlobAccessTierThreshold.set(AccessTier.P20, 512 * GB); -PageBlobAccessTierThreshold.set(PageBlobAccessTier.P20, 512 * GB); - -PageBlobAccessTierThreshold.set(AccessTier.P30, 1024 * GB); -PageBlobAccessTierThreshold.set(PageBlobAccessTier.P30, 1024 * GB); - -PageBlobAccessTierThreshold.set(AccessTier.P40, 2048 * GB); -PageBlobAccessTierThreshold.set(PageBlobAccessTier.P40, 2048 * GB); - -PageBlobAccessTierThreshold.set(AccessTier.P50, 4095 * GB); -PageBlobAccessTierThreshold.set(PageBlobAccessTier.P50, 4095 * GB); - -PageBlobAccessTierThreshold.set(AccessTier.P60, 8192 * GB); -PageBlobAccessTierThreshold.set(PageBlobAccessTier.P60, 8192 * GB); - -PageBlobAccessTierThreshold.set(AccessTier.P70, 16384 * GB); -PageBlobAccessTierThreshold.set(PageBlobAccessTier.P70, 16384 * GB); - -PageBlobAccessTierThreshold.set(AccessTier.P80, 32767 * GB); -PageBlobAccessTierThreshold.set(PageBlobAccessTier.P80, 32767 * GB); - -export default PageBlobAccessTierThreshold; diff --git a/src/blob/handlers/PageBlobHandler.ts b/src/blob/handlers/PageBlobHandler.ts index faa7a2080..6bf8660a7 100644 --- a/src/blob/handlers/PageBlobHandler.ts +++ b/src/blob/handlers/PageBlobHandler.ts @@ -6,8 +6,8 @@ import * as Models from "../generated/artifacts/models"; import Context from "../generated/Context"; import IPageBlobHandler from "../generated/handlers/IPageBlobHandler"; import ILogger from "../generated/utils/ILogger"; -import BlobLeaseAdapter from "../persistence/BlobLeaseAdapter"; -import BlobWriteLeaseValidator from "../persistence/BlobWriteLeaseValidator"; +import BlobLeaseAdapter from "../lease/BlobLeaseAdapter"; +import BlobWriteLeaseValidator from "../lease/BlobWriteLeaseValidator"; import IBlobMetadataStore, { BlobModel } from "../persistence/IBlobMetadataStore"; diff --git a/src/blob/persistence/BlobLeaseAdapter.ts b/src/blob/lease/BlobLeaseAdapter.ts similarity index 96% rename from src/blob/persistence/BlobLeaseAdapter.ts rename to src/blob/lease/BlobLeaseAdapter.ts index 0d1d6395f..73475ef25 100644 --- a/src/blob/persistence/BlobLeaseAdapter.ts +++ b/src/blob/lease/BlobLeaseAdapter.ts @@ -3,7 +3,7 @@ import { LeaseStateType, LeaseStatusType } from "../generated/artifacts/models"; -import { BlobModel } from "./IBlobMetadataStore"; +import { BlobModel } from "../persistence/IBlobMetadataStore"; import { ILease } from "./ILeaseState"; export default class BlobLeaseAdapter implements ILease { diff --git a/src/blob/persistence/BlobLeaseSyncer.ts b/src/blob/lease/BlobLeaseSyncer.ts similarity index 91% rename from src/blob/persistence/BlobLeaseSyncer.ts rename to src/blob/lease/BlobLeaseSyncer.ts index 4d40dc74c..4f043a0f7 100644 --- a/src/blob/persistence/BlobLeaseSyncer.ts +++ b/src/blob/lease/BlobLeaseSyncer.ts @@ -1,4 +1,4 @@ -import { BlobModel } from "./IBlobMetadataStore"; +import { BlobModel } from "../persistence/IBlobMetadataStore"; import { ILease, ILeaseSyncer } from "./ILeaseState"; export default class BlobLeaseSyncer implements ILeaseSyncer { diff --git a/src/blob/persistence/BlobReadLeaseValidator.ts b/src/blob/lease/BlobReadLeaseValidator.ts similarity index 100% rename from src/blob/persistence/BlobReadLeaseValidator.ts rename to src/blob/lease/BlobReadLeaseValidator.ts diff --git a/src/blob/persistence/BlobWriteLeaseSyncer.ts b/src/blob/lease/BlobWriteLeaseSyncer.ts similarity index 96% rename from src/blob/persistence/BlobWriteLeaseSyncer.ts rename to src/blob/lease/BlobWriteLeaseSyncer.ts index c156e2038..b26a519aa 100644 --- a/src/blob/persistence/BlobWriteLeaseSyncer.ts +++ b/src/blob/lease/BlobWriteLeaseSyncer.ts @@ -1,5 +1,5 @@ import { LeaseStateType, LeaseStatusType } from "../generated/artifacts/models"; -import { BlobModel } from "./IBlobMetadataStore"; +import { BlobModel } from "../persistence/IBlobMetadataStore"; import { ILease, ILeaseSyncer } from "./ILeaseState"; /** diff --git a/src/blob/persistence/BlobWriteLeaseValidator.ts b/src/blob/lease/BlobWriteLeaseValidator.ts similarity index 100% rename from src/blob/persistence/BlobWriteLeaseValidator.ts rename to src/blob/lease/BlobWriteLeaseValidator.ts diff --git a/src/blob/persistence/ContainerDeleteLeaseValidator.ts b/src/blob/lease/ContainerDeleteLeaseValidator.ts similarity index 100% rename from src/blob/persistence/ContainerDeleteLeaseValidator.ts rename to src/blob/lease/ContainerDeleteLeaseValidator.ts diff --git a/src/blob/persistence/ContainerLeaseAdapter.ts b/src/blob/lease/ContainerLeaseAdapter.ts similarity index 96% rename from src/blob/persistence/ContainerLeaseAdapter.ts rename to src/blob/lease/ContainerLeaseAdapter.ts index 4fc853ed5..2da556faa 100644 --- a/src/blob/persistence/ContainerLeaseAdapter.ts +++ b/src/blob/lease/ContainerLeaseAdapter.ts @@ -3,7 +3,7 @@ import { LeaseStateType, LeaseStatusType } from "../generated/artifacts/models"; -import { ContainerModel } from "./IBlobMetadataStore"; +import { ContainerModel } from "../persistence/IBlobMetadataStore"; import { ILease } from "./ILeaseState"; export default class ContainerLeaseAdapter implements ILease { diff --git a/src/blob/persistence/ContainerLeaseSyncer.ts b/src/blob/lease/ContainerLeaseSyncer.ts similarity index 91% rename from src/blob/persistence/ContainerLeaseSyncer.ts rename to src/blob/lease/ContainerLeaseSyncer.ts index 523f1f9df..ce55b1395 100644 --- a/src/blob/persistence/ContainerLeaseSyncer.ts +++ b/src/blob/lease/ContainerLeaseSyncer.ts @@ -1,4 +1,4 @@ -import { ContainerModel } from "./IBlobMetadataStore"; +import { ContainerModel } from "../persistence/IBlobMetadataStore"; import { ILease, ILeaseSyncer } from "./ILeaseState"; export default class ContainerLeaseSyncer diff --git a/src/blob/persistence/ContainerReadLeaseValidator.ts b/src/blob/lease/ContainerReadLeaseValidator.ts similarity index 100% rename from src/blob/persistence/ContainerReadLeaseValidator.ts rename to src/blob/lease/ContainerReadLeaseValidator.ts diff --git a/src/blob/persistence/ILeaseState.ts b/src/blob/lease/ILeaseState.ts similarity index 100% rename from src/blob/persistence/ILeaseState.ts rename to src/blob/lease/ILeaseState.ts diff --git a/src/blob/persistence/LeaseAvailableState.ts b/src/blob/lease/LeaseAvailableState.ts similarity index 100% rename from src/blob/persistence/LeaseAvailableState.ts rename to src/blob/lease/LeaseAvailableState.ts diff --git a/src/blob/persistence/LeaseBreakingState.ts b/src/blob/lease/LeaseBreakingState.ts similarity index 100% rename from src/blob/persistence/LeaseBreakingState.ts rename to src/blob/lease/LeaseBreakingState.ts diff --git a/src/blob/persistence/LeaseBrokenState.ts b/src/blob/lease/LeaseBrokenState.ts similarity index 100% rename from src/blob/persistence/LeaseBrokenState.ts rename to src/blob/lease/LeaseBrokenState.ts diff --git a/src/blob/persistence/LeaseExpiredState.ts b/src/blob/lease/LeaseExpiredState.ts similarity index 100% rename from src/blob/persistence/LeaseExpiredState.ts rename to src/blob/lease/LeaseExpiredState.ts diff --git a/src/blob/persistence/LeaseFactory.ts b/src/blob/lease/LeaseFactory.ts similarity index 100% rename from src/blob/persistence/LeaseFactory.ts rename to src/blob/lease/LeaseFactory.ts diff --git a/src/blob/persistence/LeaseLeasedState.ts b/src/blob/lease/LeaseLeasedState.ts similarity index 100% rename from src/blob/persistence/LeaseLeasedState.ts rename to src/blob/lease/LeaseLeasedState.ts diff --git a/src/blob/persistence/LeaseStateBase.ts b/src/blob/lease/LeaseStateBase.ts similarity index 100% rename from src/blob/persistence/LeaseStateBase.ts rename to src/blob/lease/LeaseStateBase.ts diff --git a/src/blob/authentication/AuthenticationMiddlewareFactory.ts b/src/blob/middlewares/AuthenticationMiddlewareFactory.ts similarity index 96% rename from src/blob/authentication/AuthenticationMiddlewareFactory.ts rename to src/blob/middlewares/AuthenticationMiddlewareFactory.ts index ae71f4705..e1c73ddb2 100644 --- a/src/blob/authentication/AuthenticationMiddlewareFactory.ts +++ b/src/blob/middlewares/AuthenticationMiddlewareFactory.ts @@ -1,11 +1,11 @@ import { NextFunction, Request, RequestHandler, Response } from "express"; import ILogger from "../../common/ILogger"; +import IAuthenticator from "../authentication/IAuthenticator"; import BlobStorageContext from "../context/BlobStorageContext"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import ExpressRequestAdapter from "../generated/ExpressRequestAdapter"; import { DEFAULT_CONTEXT_PATH } from "../utils/constants"; -import IAuthenticator from "./IAuthenticator"; export default class AuthenticationMiddlewareFactory { constructor(private readonly logger: ILogger) {} diff --git a/src/blob/preflight/PreflightMiddlewareFactory.ts b/src/blob/middlewares/PreflightMiddlewareFactory.ts similarity index 100% rename from src/blob/preflight/PreflightMiddlewareFactory.ts rename to src/blob/middlewares/PreflightMiddlewareFactory.ts diff --git a/src/blob/context/blobStorageContext.middleware.ts b/src/blob/middlewares/blobStorageContext.middleware.ts similarity index 98% rename from src/blob/context/blobStorageContext.middleware.ts rename to src/blob/middlewares/blobStorageContext.middleware.ts index 6cf600084..7985c99e0 100644 --- a/src/blob/context/blobStorageContext.middleware.ts +++ b/src/blob/middlewares/blobStorageContext.middleware.ts @@ -3,6 +3,7 @@ import uuid from "uuid/v4"; import logger from "../../common/Logger"; import { checkApiVersion } from "../../common/utils/utils"; +import BlobStorageContext from "../context/BlobStorageContext"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import { DEFAULT_CONTEXT_PATH, @@ -11,7 +12,6 @@ import { ValidAPIVersions, VERSION } from "../utils/constants"; -import BlobStorageContext from "./BlobStorageContext"; /** * A middleware extract related blob service context. diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 2d192ec1e..3c5b13be5 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -13,21 +13,23 @@ import * as Models from "../generated/artifacts/models"; import { LeaseStatusType } from "../generated/artifacts/models"; import Context from "../generated/Context"; import PageBlobRangesManager from "../handlers/PageBlobRangesManager"; +import BlobLeaseAdapter from "../lease/BlobLeaseAdapter"; +import BlobLeaseSyncer from "../lease/BlobLeaseSyncer"; +import BlobReadLeaseValidator from "../lease/BlobReadLeaseValidator"; +import BlobWriteLeaseSyncer from "../lease/BlobWriteLeaseSyncer"; +import BlobWriteLeaseValidator from "../lease/BlobWriteLeaseValidator"; +import ContainerDeleteLeaseValidator from "../lease/ContainerDeleteLeaseValidator"; +import ContainerLeaseAdapter from "../lease/ContainerLeaseAdapter"; +import ContainerLeaseSyncer from "../lease/ContainerLeaseSyncer"; +import ContainerReadLeaseValidator from "../lease/ContainerReadLeaseValidator"; +import { ILease } from "../lease/ILeaseState"; +import LeaseFactory from "../lease/LeaseFactory"; import { DEFAULT_LIST_BLOBS_MAX_RESULTS, DEFAULT_LIST_CONTAINERS_MAX_RESULTS } from "../utils/constants"; import { newEtag } from "../utils/utils"; -import BlobLeaseAdapter from "./BlobLeaseAdapter"; -import BlobLeaseSyncer from "./BlobLeaseSyncer"; -import BlobReadLeaseValidator from "./BlobReadLeaseValidator"; import BlobReferredExtentsAsyncIterator from "./BlobReferredExtentsAsyncIterator"; -import BlobWriteLeaseSyncer from "./BlobWriteLeaseSyncer"; -import BlobWriteLeaseValidator from "./BlobWriteLeaseValidator"; -import ContainerDeleteLeaseValidator from "./ContainerDeleteLeaseValidator"; -import ContainerLeaseAdapter from "./ContainerLeaseAdapter"; -import ContainerLeaseSyncer from "./ContainerLeaseSyncer"; -import ContainerReadLeaseValidator from "./ContainerReadLeaseValidator"; import IBlobMetadataStore, { AcquireBlobLeaseResponse, AcquireContainerLeaseResponse, @@ -54,8 +56,6 @@ import IBlobMetadataStore, { ServicePropertiesModel, SetContainerAccessPolicyOptions } from "./IBlobMetadataStore"; -import { ILease } from "./ILeaseState"; -import LeaseFactory from "./LeaseFactory"; /** * This is a metadata source implementation for blob based on loki DB. diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index bb69ec5d4..eb5ada394 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -20,21 +20,23 @@ import StorageErrorFactory from "../errors/StorageErrorFactory"; import * as Models from "../generated/artifacts/models"; import { BlobType, LeaseAccessConditions } from "../generated/artifacts/models"; import Context from "../generated/Context"; +import BlobLeaseAdapter from "../lease/BlobLeaseAdapter"; +import BlobLeaseSyncer from "../lease/BlobLeaseSyncer"; +import BlobReadLeaseValidator from "../lease/BlobReadLeaseValidator"; +import BlobWriteLeaseSyncer from "../lease/BlobWriteLeaseSyncer"; +import BlobWriteLeaseValidator from "../lease/BlobWriteLeaseValidator"; +import ContainerDeleteLeaseValidator from "../lease/ContainerDeleteLeaseValidator"; +import ContainerLeaseAdapter from "../lease/ContainerLeaseAdapter"; +import ContainerLeaseSyncer from "../lease/ContainerLeaseSyncer"; +import ContainerReadLeaseValidator from "../lease/ContainerReadLeaseValidator"; +import { ILease } from "../lease/ILeaseState"; +import LeaseFactory from "../lease/LeaseFactory"; import { DEFAULT_LIST_BLOBS_MAX_RESULTS, DEFAULT_LIST_CONTAINERS_MAX_RESULTS } from "../utils/constants"; import { newEtag } from "../utils/utils"; -import BlobLeaseAdapter from "./BlobLeaseAdapter"; -import BlobLeaseSyncer from "./BlobLeaseSyncer"; -import BlobReadLeaseValidator from "./BlobReadLeaseValidator"; import BlobReferredExtentsAsyncIterator from "./BlobReferredExtentsAsyncIterator"; -import BlobWriteLeaseSyncer from "./BlobWriteLeaseSyncer"; -import BlobWriteLeaseValidator from "./BlobWriteLeaseValidator"; -import ContainerDeleteLeaseValidator from "./ContainerDeleteLeaseValidator"; -import ContainerLeaseAdapter from "./ContainerLeaseAdapter"; -import ContainerLeaseSyncer from "./ContainerLeaseSyncer"; -import ContainerReadLeaseValidator from "./ContainerReadLeaseValidator"; import IBlobMetadataStore, { AcquireBlobLeaseResponse, AcquireContainerLeaseResponse, @@ -60,8 +62,6 @@ import IBlobMetadataStore, { ServicePropertiesModel, SetContainerAccessPolicyOptions } from "./IBlobMetadataStore"; -import { ILease } from "./ILeaseState"; -import LeaseFactory from "./LeaseFactory"; // tslint:disable: max-classes-per-file class ServicesModel extends Model {} diff --git a/src/queue/QueueRequestListenerFactory.ts b/src/queue/QueueRequestListenerFactory.ts index fd7e086a5..4ee386ed2 100644 --- a/src/queue/QueueRequestListenerFactory.ts +++ b/src/queue/QueueRequestListenerFactory.ts @@ -7,10 +7,8 @@ import logger from "../common/Logger"; import IExtentStore from "../common/persistence/IExtentStore"; import { RequestListener } from "../common/ServerBase"; import AccountSASAuthenticator from "./authentication/AccountSASAuthenticator"; -import AuthenticationMiddlewareFactory from "./authentication/AuthenticationMiddlewareFactory"; import QueueSASAuthenticator from "./authentication/QueueSASAuthenticator"; import QueueSharedKeyAuthenticator from "./authentication/QueueSharedKeyAuthenticator"; -import queueStorageContextMiddleware from "./context/queueStorageContext.middleware"; import ExpressMiddlewareFactory from "./generated/ExpressMiddlewareFactory"; import IHandlers from "./generated/handlers/IHandlers"; import MiddlewareFactory from "./generated/MiddlewareFactory"; @@ -18,8 +16,10 @@ import MessageIdHandler from "./handlers/MessageIdHandler"; import MessagesHandler from "./handlers/MessagesHandler"; import QueueHandler from "./handlers/QueueHandler"; import ServiceHandler from "./handlers/ServiceHandler"; +import AuthenticationMiddlewareFactory from "./middlewares/AuthenticationMiddlewareFactory"; +import PreflightMiddlewareFactory from "./middlewares/PreflightMiddlewareFactory"; +import queueStorageContextMiddleware from "./middlewares/queueStorageContext.middleware"; import { IQueueMetadataStore } from "./persistence/IQueueMetadataStore"; -import PreflightMiddlewareFactory from "./preflight/PreflightMiddlewareFactory"; import { DEFAULT_QUEUE_CONTEXT_PATH } from "./utils/constants"; /** diff --git a/src/queue/authentication/AuthenticationMiddlewareFactory.ts b/src/queue/middlewares/AuthenticationMiddlewareFactory.ts similarity index 96% rename from src/queue/authentication/AuthenticationMiddlewareFactory.ts rename to src/queue/middlewares/AuthenticationMiddlewareFactory.ts index 9f67162e4..4b0b724b2 100644 --- a/src/queue/authentication/AuthenticationMiddlewareFactory.ts +++ b/src/queue/middlewares/AuthenticationMiddlewareFactory.ts @@ -1,11 +1,11 @@ import { NextFunction, Request, RequestHandler, Response } from "express"; import ILogger from "../../common/ILogger"; +import IAuthenticator from "../authentication/IAuthenticator"; import QueueStorageContext from "../context/QueueStorageContext"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import ExpressRequestAdapter from "../generated/ExpressRequestAdapter"; import { DEFAULT_QUEUE_CONTEXT_PATH } from "../utils/constants"; -import IAuthenticator from "./IAuthenticator"; // TODO: Extract and move this part to common export default class AuthenticationMiddlewareFactory { diff --git a/src/queue/preflight/PreflightMiddlewareFactory.ts b/src/queue/middlewares/PreflightMiddlewareFactory.ts similarity index 100% rename from src/queue/preflight/PreflightMiddlewareFactory.ts rename to src/queue/middlewares/PreflightMiddlewareFactory.ts diff --git a/src/queue/context/queueStorageContext.middleware.ts b/src/queue/middlewares/queueStorageContext.middleware.ts similarity index 98% rename from src/queue/context/queueStorageContext.middleware.ts rename to src/queue/middlewares/queueStorageContext.middleware.ts index 422421729..501d44120 100644 --- a/src/queue/context/queueStorageContext.middleware.ts +++ b/src/queue/middlewares/queueStorageContext.middleware.ts @@ -3,6 +3,7 @@ import uuid from "uuid/v4"; import logger from "../../common/Logger"; import { checkApiVersion } from "../../common/utils/utils"; +import QueueStorageContext from "../context/QueueStorageContext"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import { DEFAULT_QUEUE_CONTEXT_PATH, @@ -12,7 +13,6 @@ import { VERSION } from "../utils/constants"; import { isValidName, nameValidateCode } from "../utils/utils"; -import QueueStorageContext from "./QueueStorageContext"; /** * A middleware extract related queue service context. From 298d490c9da9476a3acd10dc50a1a66d702fa2ae Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Tue, 24 Dec 2019 22:21:01 +0800 Subject: [PATCH 25/34] Added test case tags; Added support CI integration for SQL; Update pipeline support node v12 (#360) * Added test case tags; Added support CI integration for SQL; * Added test case tags; Added support CI integration for SQL; * Update pipeline to support node.js v12 * Remove mariadb; Add mysql into ci pipeline; --- .vscode/launch.json | 4 +- CONTRIBUTION.md | 9 +- ChangeLog.md | 1 + README.md | 7 +- azure-pipelines.yml | 133 ++-- package-lock.json | 599 ++++++++++++++++-- package.json | 12 +- src/blob/handlers/ContainerHandler.ts | 8 +- src/blob/persistence/LokiBlobMetadataStore.ts | 4 + src/blob/persistence/SqlBlobMetadataStore.ts | 5 +- .../persistence/SqlExtentMetadataStore.ts | 2 +- src/common/utils/constants.ts | 2 +- tests/BlobTestServerFactory.ts | 16 +- tests/blob/apis/blob.test.ts | 76 +-- tests/blob/apis/blockblob.test.ts | 24 +- tests/blob/apis/container.test.ts | 40 +- tests/blob/apis/pageblob.test.ts | 72 +-- tests/blob/apis/service.test.ts | 66 +- tests/blob/authentication.test.ts | 8 +- tests/blob/blobCorsRequest.test.ts | 24 +- tests/blob/blockblob.highlevel.test.ts | 30 +- .../handlers/PageBlobRangesManager.test.ts | 2 +- tests/blob/sas.test.ts | 32 +- tests/blob/specialnaming.test.ts | 40 +- tests/queue/apis/messageid.test.ts | 10 +- tests/queue/apis/messages.test.ts | 14 +- tests/queue/apis/queue.test.ts | 16 +- tests/queue/apis/queueService.test.ts | 10 +- tests/queue/queueAuthentication.test.ts | 8 +- tests/queue/queueCorsRequest.test.ts | 24 +- tests/queue/queueSas.test.ts | 26 +- tests/queue/queueSpecialnaming.test.ts | 6 +- tests/testutils.ts | 132 ---- 33 files changed, 934 insertions(+), 528 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index adb2eb698..8e1857cc9 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -32,7 +32,7 @@ "runtimeArgs": ["-r", "ts-node/register"], "args": ["${workspaceFolder}/src/blob/main.ts", "-d", "debug.log"], "env": { - "AZURITE_DB": "mariadb://root:my-secret-pw@127.0.0.1:3306/azurite_blob", + "AZURITE_DB": "mysql://root:my-secret-pw@127.0.0.1:3306/azurite_blob", "AZURITE_ACCOUNTS": "" }, "outputCapture": "std" @@ -82,7 +82,7 @@ ], "env": { "AZURITE_ACCOUNTS": "", - "AZURITE_TEST_DB": "mariadb://root:my-secret-pw@127.0.0.1:3306/azurite_blob_test" + "AZURITE_TEST_DB": "mysql://root:my-secret-pw@127.0.0.1:3306/azurite_blob_test" }, "internalConsoleOptions": "openOnSessionStart", "outputCapture": "std" diff --git a/CONTRIBUTION.md b/CONTRIBUTION.md index 6ffd4a9ee..df0f70827 100644 --- a/CONTRIBUTION.md +++ b/CONTRIBUTION.md @@ -30,19 +30,18 @@ npm run blob By default, Azurite leverages loki as metadata database. However, loki limits Azurite's scalability and extensibility. -Set environment variable `AZURITE_DB=dialect://[username][:password][@]host:port/database` to make Azurite blob service switch to a SQL database based metadata storage, like MySql, SqlServer, MariaDB. +Set environment variable `AZURITE_DB=dialect://[username][:password][@]host:port/database` to make Azurite blob service switch to a SQL database based metadata storage, like MySql, SqlServer. -For example, connect to MariaDB, MySql or SqlServer by set environment variables: +For example, connect to MySql or SqlServer by set environment variables: ```bash -set AZURITE_DB=mariadb://root:my-secret-pw@127.0.0.1:3306/azurite_blob -set AZURITE_DB=mysql://localhost:3306/azurite_blob +set AZURITE_DB=mysql://root:my-secret-pw@127.0.0.1:3306/azurite_blob set AZURITE_DB=mssql://username:password@localhost:1024/azurite_blob ``` > Note. Need to manually create database before starting Azurite instance. -> Tips. Create database instance quickly with docker, for example `docker run --name mariadb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:latest`. +> Tips. Create database instance quickly with docker, for example `docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest`. And grant external access and create database `azurite_blob` using `docker exec mysql mysql -u root -pmy-secret-pw -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; create database azurite_blob;"`. Notice that, above commands are examples, you need to carefully define the access permissions in your production environment. ## Develop for Visual Studio Code Extension diff --git a/ChangeLog.md b/ChangeLog.md index d6aec80a8..bada693f4 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -15,6 +15,7 @@ Blob: - [Breaking] Apply LokiFsStructuredAdapter as default blob metadata loki adapter to improve performance. - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. - [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. Please clean up Azurite previous version workspace data files and restart Azurite. +- [Breaking] Remove MariaDb from SQL support temporarily due to license issue. - In getBlockList, filter the returned block list with input BlockListingFilter. - Added support for CORS. - AllowedHeaders and ExposedHeaders are optional now when setting CORS. diff --git a/README.md b/README.md index e8c2cd74b..ee9cb5f6f 100644 --- a/README.md +++ b/README.md @@ -294,12 +294,11 @@ Azurite will refresh customized account name and key from environment variable e By default, Azurite leverages [loki](https://github.com/techfort/LokiJS) as metadata database. However, loki limits Azurite's scalability and extensibility. -Set environment variable `AZURITE_DB=dialect://[username][:password][@]host:port/database` to make Azurite blob service switch to a SQL database based metadata storage, like MySql, SqlServer, MariaDB. +Set environment variable `AZURITE_DB=dialect://[username][:password][@]host:port/database` to make Azurite blob service switch to a SQL database based metadata storage, like MySql, SqlServer. -For example, connect to MariaDB, MySql or SqlServer by set environment variables: +For example, connect to MySql or SqlServer by set environment variables: ```bash -set AZURITE_DB=mariadb://root:my-secret-pw@127.0.0.1:3306/azurite_blob set AZURITE_DB=mysql://localhost:3306/azurite_blob set AZURITE_DB=mssql://username:password@localhost:1024/azurite_blob ``` @@ -308,7 +307,7 @@ set AZURITE_DB=mssql://username:password@localhost:1024/azurite_blob > Note. Blob Copy & Page Blob are not supported by SQL based metadata implementation. -> Tips. Create database instance quickly with docker, for example `docker run --name mariadb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:latest`. +> Tips. Create database instance quickly with docker, for example `docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest`. Grant external access and create database `azurite_blob` using `docker exec mysql mysql -u root -pmy-secret-pw -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; create database azurite_blob;"`. Notice that, above commands are examples, you need to carefully define the access permissions in your production environment. ## Usage with Azure Storage SDKs or Tools diff --git a/azure-pipelines.yml b/azure-pipelines.yml index cc4de4739..fa35f7a81 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -19,6 +19,8 @@ jobs: node_version: 8.x node_10_x: node_version: 10.x + node_12_x: + node_version: 12.x steps: - task: NodeTool@0 inputs: @@ -26,14 +28,9 @@ jobs: displayName: "Install Node.js" - script: | - npm install + npm ci workingDirectory: "./" - displayName: "npm install" - - - script: | - npm run lint - workingDirectory: "./" - displayName: "tslint" + displayName: "npm ci" - script: | npm run test:blob @@ -51,6 +48,8 @@ jobs: node_version: 8.x node_10_x: node_version: 10.x + node_12_x: + node_version: 12.x steps: - task: NodeTool@0 inputs: @@ -58,14 +57,9 @@ jobs: displayName: "Install Node.js" - script: | - npm install - workingDirectory: "./" - displayName: "npm install" - - - script: | - npm run lint + npm ci workingDirectory: "./" - displayName: "tslint" + displayName: "npm ci" - script: | npm run test:blob @@ -83,6 +77,8 @@ jobs: node_version: 8.x node_10_x: node_version: 10.x + node_12_x: + node_version: 12.x steps: - task: NodeTool@0 inputs: @@ -90,17 +86,49 @@ jobs: displayName: "Install Node.js" - script: | - npm install + npm ci workingDirectory: "./" - displayName: "npm install" + displayName: "npm ci" - script: | - npm run lint + npm run test:blob workingDirectory: "./" - displayName: "tslint" + displayName: "npm run test:blob" + env: {} + + - job: blobtestmysql + displayName: Blob Test Mysql + pool: + vmImage: "ubuntu-16.04" + strategy: + matrix: + node_8_x: + node_version: 8.x + node_10_x: + node_version: 10.x + node_12_x: + node_version: 12.x + steps: + - task: NodeTool@0 + inputs: + versionSpec: "$(node_version)" + displayName: "Install Node.js" - script: | - npm run test:blob + npm ci + workingDirectory: "./" + displayName: "npm ci" + + - script: | + docker run --name mysql -p 13306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql + sleep 60 + docker exec mysql mysql -u root -pmy-secret-pw -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" + docker exec mysql mysql -u root -pmy-secret-pw -e "create database azurite_blob_test;" + workingDirectory: "./" + displayName: "Setup mysql docker instance" + + - script: | + npm run test:blob:sql:ci workingDirectory: "./" displayName: "npm run test:blob" env: {} @@ -115,6 +143,8 @@ jobs: node_version: 8.x node_10_x: node_version: 10.x + node_12_x: + node_version: 12.x steps: - task: NodeTool@0 inputs: @@ -122,14 +152,9 @@ jobs: displayName: "Install Node.js" - script: | - npm install - workingDirectory: "./" - displayName: "npm install" - - - script: | - npm run lint + npm ci workingDirectory: "./" - displayName: "tslint" + displayName: "npm ci" - script: | npm run test:queue @@ -147,6 +172,8 @@ jobs: node_version: 8.x node_10_x: node_version: 10.x + node_12_x: + node_version: 12.x steps: - task: NodeTool@0 inputs: @@ -154,14 +181,9 @@ jobs: displayName: "Install Node.js" - script: | - npm install + npm ci workingDirectory: "./" - displayName: "npm install" - - - script: | - npm run lint - workingDirectory: "./" - displayName: "tslint" + displayName: "npm ci" - script: | npm run test:queue @@ -179,6 +201,8 @@ jobs: node_version: 8.x node_10_x: node_version: 10.x + node_12_x: + node_version: 12.x steps: - task: NodeTool@0 inputs: @@ -186,21 +210,16 @@ jobs: displayName: "Install Node.js" - script: | - npm install + npm ci workingDirectory: "./" - displayName: "npm install" - - - script: | - npm run lint - workingDirectory: "./" - displayName: "tslint" + displayName: "npm ci" - script: | npm run test:queue workingDirectory: "./" displayName: "npm run test:queue" env: {} - + - job: azuritenodejslinux displayName: Azurite Linux pool: @@ -211,6 +230,8 @@ jobs: node_version: 8.x node_10_x: node_version: 10.x + node_12_x: + node_version: 12.x steps: - task: NodeTool@0 inputs: @@ -218,9 +239,9 @@ jobs: displayName: "Install Node.js" - script: | - npm install + npm ci workingDirectory: "./" - displayName: "npm install" + displayName: "npm ci" - script: | npm run lint @@ -257,6 +278,8 @@ jobs: node_version: 8.x node_10_x: node_version: 10.x + node_12_x: + node_version: 12.x steps: - task: NodeTool@0 inputs: @@ -264,9 +287,9 @@ jobs: displayName: "Install Node.js" - script: | - npm install + npm ci workingDirectory: "./" - displayName: "npm install" + displayName: "npm ci" - script: | npm run lint @@ -286,7 +309,7 @@ jobs: - script: | npm uninstall -g azurite npm run build - npm install -g + npm ci -g azurite -v azurite-blob -v azurite-queue -v @@ -303,6 +326,8 @@ jobs: node_version: 8.x node_10_x: node_version: 10.x + node_12_x: + node_version: 12.x steps: - task: NodeTool@0 inputs: @@ -310,9 +335,9 @@ jobs: displayName: "Install Node.js" - script: | - npm install + npm ci workingDirectory: "./" - displayName: "npm install" + displayName: "npm ci" - script: | npm run lint @@ -338,16 +363,16 @@ jobs: azurite-queue -v workingDirectory: "./" displayName: "Validate npm global installation from GitHub code base" - + - job: docker displayName: Docker Build pool: vmImage: "ubuntu-16.04" steps: - script: | - npm install + npm ci workingDirectory: "./" - displayName: "npm install" + displayName: "npm ci" - script: | npm run docker:build @@ -368,6 +393,6 @@ jobs: steps: - task: ComponentGovernanceComponentDetection@0 inputs: - scanType: 'Register' - verbosity: 'Verbose' - alertWarningLevel: 'High' \ No newline at end of file + scanType: "Register" + verbosity: "Verbose" + alertWarningLevel: "High" diff --git a/package-lock.json b/package-lock.json index c91bc2854..7ebf0f858 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@azure/ms-rest-azure-env": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-azure-env/-/ms-rest-azure-env-1.1.2.tgz", + "integrity": "sha512-l7z0DPCi2Hp88w12JhDTtx5d0Y3+vhfE7JKJb9O7sEz71Cwp053N8piTtTnnk/tUor9oZHgEKi/p3tQQmLPjvA==" + }, "@azure/ms-rest-js": { "version": "1.8.13", "resolved": "https://registry.npmjs.org/@azure/ms-rest-js/-/ms-rest-js-1.8.13.tgz", @@ -19,6 +24,16 @@ "xml2js": "^0.4.19" } }, + "@azure/ms-rest-nodeauth": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@azure/ms-rest-nodeauth/-/ms-rest-nodeauth-2.0.2.tgz", + "integrity": "sha512-KmNNICOxt3EwViAJI3iu2VH8t8BQg5J2rSAyO4IUYLF9ZwlyYsP419pdvl4NBUhluAP2cgN7dfD2V6E6NOMZlQ==", + "requires": { + "@azure/ms-rest-azure-env": "^1.1.2", + "@azure/ms-rest-js": "^1.8.7", + "adal-node": "^0.1.28" + } + }, "@azure/storage-blob": { "version": "10.5.0", "resolved": "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-10.5.0.tgz", @@ -247,11 +262,6 @@ "@types/range-parser": "*" } }, - "@types/geojson": { - "version": "7946.0.7", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", - "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==" - }, "@types/glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", @@ -306,10 +316,9 @@ } }, "@types/node": { - "version": "11.13.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.13.20.tgz", - "integrity": "sha512-JE0UpLWZTV1sGcaj0hN+Q0760OEjpgyFJ06DOMVW6qKBducKdJQaIw0TGL6ccj7VXRduIOHLWQi+tHwulZJHVQ==", - "dev": true + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.1.0.tgz", + "integrity": "sha512-zwrxviZS08kRX40nqBrmERElF2vpw4IUTd5khkhBTfFH8AOaeoLVx48EC4+ZzS2/Iga7NevncqnsUSYjM4OWYA==" }, "@types/node-fetch": { "version": "2.5.0", @@ -326,6 +335,15 @@ "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==", "dev": true }, + "@types/readable-stream": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.5.tgz", + "integrity": "sha512-Mq2eLkGYamlcolW603FY2ROBvcl90jPF+3jLkjpBV6qS+2aVeJqlgRG0TVAa1oWbmPdb5yOWlOPVvQle76nUNw==", + "requires": { + "@types/node": "*", + "safe-buffer": "*" + } + }, "@types/rimraf": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.2.tgz", @@ -415,6 +433,40 @@ "negotiator": "0.6.2" } }, + "adal-node": { + "version": "0.1.28", + "resolved": "https://registry.npmjs.org/adal-node/-/adal-node-0.1.28.tgz", + "integrity": "sha1-RoxLs+u9lrEnBmn0ucuk4AZepIU=", + "requires": { + "@types/node": "^8.0.47", + "async": ">=0.6.0", + "date-utils": "*", + "jws": "3.x.x", + "request": ">= 2.52.0", + "underscore": ">= 1.3.1", + "uuid": "^3.1.0", + "xmldom": ">= 0.1.x", + "xpath.js": "~1.1.0" + }, + "dependencies": { + "@types/node": { + "version": "8.10.59", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.59.tgz", + "integrity": "sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ==" + } + } + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", @@ -435,6 +487,11 @@ "color-convert": "^1.9.0" } }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" + }, "any-observable": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", @@ -516,6 +573,19 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", "dev": true }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -547,6 +617,16 @@ "integrity": "sha512-3jU9yDR71d2thRnKdPH03DaWbla1Iqnrx2rqUUwbMrb4di36a8+nttCQaTWG7biWPJc6Ke6zSSTzFH0uhya+Nw==", "dev": true }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", + "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" + }, "axios": { "version": "0.19.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", @@ -1519,6 +1599,34 @@ "safe-buffer": "5.1.2" } }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz", + "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==", + "requires": { + "readable-stream": "^3.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "bluebird": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", @@ -1607,6 +1715,11 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -1670,6 +1783,20 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==" }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1997,12 +2124,25 @@ "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "date-fns": { "version": "1.30.1", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", "dev": true }, + "date-utils": { + "version": "1.2.21", + "resolved": "https://registry.npmjs.org/date-utils/-/date-utils-1.2.21.tgz", + "integrity": "sha1-YfsWzcEnSzyayq/+n8ad+HIKK2Q=" + }, "debug": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", @@ -2183,6 +2323,23 @@ "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.1.tgz", "integrity": "sha512-ch5OQgvGDK2u8pSZeSYAQaV/lczImd7pMJ7BcEPXmnFVjy4yJIzP6CsODJUTH8mg1tyH1Z2abOiuJO3DjZ/GBw==" }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2284,8 +2441,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esutils": { "version": "2.0.3", @@ -2443,6 +2599,11 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -2529,6 +2690,21 @@ } } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, "fast-safe-stringify": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", @@ -2634,6 +2810,11 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, "form-data": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", @@ -2684,6 +2865,14 @@ "simple-git": "^1.85.0" } }, + "generate-function": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", + "requires": { + "is-property": "^1.0.2" + } + }, "get-own-enumerable-property-symbols": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.0.tgz", @@ -2711,6 +2900,14 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", @@ -2757,6 +2954,20 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -2883,6 +3094,16 @@ "toidentifier": "1.0.0" } }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, "husky": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/husky/-/husky-1.3.1.tgz", @@ -3202,6 +3423,11 @@ "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -3229,6 +3455,11 @@ "has-symbols": "^1.0.0" } }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -3252,6 +3483,11 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", @@ -3268,6 +3504,16 @@ "esprima": "^4.0.0" } }, + "jsbi": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.1.1.tgz", + "integrity": "sha512-+HQESPaV0mRiH614z4JPVPAftcRC2p53x92lySPzUzFwJbJTMpzHz8OYUkcXPN3fOcHUe0NdVcHnCtX/1+eCrA==" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", @@ -3280,12 +3526,57 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -3529,7 +3820,6 @@ "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, "requires": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" @@ -3556,34 +3846,6 @@ "object-visit": "^1.0.0" } }, - "mariadb": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mariadb/-/mariadb-2.1.1.tgz", - "integrity": "sha512-ja+4wyo7jCbTiGcR90Q1UiAT1OA1DMmswpXpOWS3z9Tl2tHQ5LYP8Dx8WMhAqoOdbClzHABkeRDydg4gRglGhA==", - "requires": { - "@types/geojson": "^7946.0.7", - "@types/node": "^12.7.4", - "denque": "^1.4.1", - "iconv-lite": "^0.5.0", - "long": "^4.0.0", - "moment-timezone": "^0.5.26" - }, - "dependencies": { - "@types/node": { - "version": "12.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.5.tgz", - "integrity": "sha512-9fq4jZVhPNW8r+UYKnxF1e2HkDWOWKM5bC2/7c9wPV835I0aOrVbS/Hw/pWPk2uKrNXQqg9Z959Kz+IYDd5p3w==" - }, - "iconv-lite": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", - "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } - } - }, "markdown-it": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", @@ -3826,6 +4088,53 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "mysql2": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.1.0.tgz", + "integrity": "sha512-9kGVyi930rG2KaHrz3sHwtc6K+GY9d8wWk1XRSYxQiunvGcn4DwuZxOwmK11ftuhhwrYDwGx9Ta4VBwznJn36A==", + "requires": { + "cardinal": "^2.1.1", + "denque": "^1.4.1", + "generate-function": "^2.3.1", + "iconv-lite": "^0.5.0", + "long": "^4.0.0", + "lru-cache": "^5.1.1", + "named-placeholders": "^1.1.2", + "seq-queue": "^0.0.5", + "sqlstring": "^2.3.1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", + "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "named-placeholders": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "requires": { + "lru-cache": "^4.1.3" + } + }, "nanomatch": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", @@ -3845,6 +4154,11 @@ "to-regex": "^3.0.1" } }, + "native-duplexpair": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", + "integrity": "sha1-eJkHjmS/PIo9cyYBs9QP8F21j6A=" + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -3926,6 +4240,11 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4192,6 +4511,11 @@ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", "dev": true }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", @@ -4272,8 +4596,7 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { "version": "1.4.0", @@ -4350,6 +4673,14 @@ "util-deprecate": "~1.0.1" } }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "requires": { + "esprima": "~4.0.0" + } + }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -4430,6 +4761,64 @@ "is-finite": "^1.0.0" } }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + } + } + }, "resolve": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", @@ -4575,6 +4964,11 @@ } } }, + "seq-queue": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + }, "sequelize": { "version": "5.18.4", "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-5.18.4.tgz", @@ -4931,6 +5325,27 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -5057,6 +5472,59 @@ "integrity": "sha512-6PC+JRGmNjiG3kJ56ZMNWDPL8hjyghF5cMXIFOKg+NiwwEZZIvxTWd0pinWKyD227odg9ygF8xVhhz7gb8Uq7A==", "dev": true }, + "tedious": { + "version": "6.6.5", + "resolved": "https://registry.npmjs.org/tedious/-/tedious-6.6.5.tgz", + "integrity": "sha512-kS3xw5KT46QIokXeGJ47d/xc93bPa+bB5rKHpGkCc1iO0JCOlGTm+93RHBgs3DD7FQdIn9HyvzurR2plb7z4NA==", + "requires": { + "@azure/ms-rest-nodeauth": "2.0.2", + "@types/node": "^12.12.17", + "@types/readable-stream": "^2.3.5", + "bl": "^3.0.0", + "depd": "^2.0.0", + "iconv-lite": "^0.5.0", + "jsbi": "^3.1.1", + "native-duplexpair": "^1.0.0", + "punycode": "^2.1.0", + "readable-stream": "^3.4.0", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "@types/node": { + "version": "12.12.22", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.22.tgz", + "integrity": "sha512-r5i93jqbPWGXYXxianGATOxTelkp6ih/U0WVnvaqAvTqM+0U6J3kw6Xk6uq/dWNRkEVw/0SLcO5ORXbVNz4FMQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "iconv-lite": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.0.tgz", + "integrity": "sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "readable-stream": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + } + } + }, "text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -5255,6 +5723,19 @@ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -5297,8 +5778,7 @@ "underscore": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" }, "union-value": { "version": "1.0.1", @@ -5357,6 +5837,14 @@ } } }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, "uri-templates": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/uri-templates/-/uri-templates-0.2.0.tgz", @@ -5424,6 +5912,16 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "vsce": { "version": "1.66.0", "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.66.0.tgz", @@ -5584,11 +6082,20 @@ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" }, + "xmldom": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.2.1.tgz", + "integrity": "sha512-kXXiYvmblIgEemGeB75y97FyaZavx6SQhGppLw5TKWAD2Wd0KAly0g23eVLh17YcpxZpnFym1Qk/eaRjy1APPg==" + }, + "xpath.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xpath.js/-/xpath.js-1.1.0.tgz", + "integrity": "sha512-jg+qkfS4K8E7965sqaUl8mRngXiKb3WZGfONgE18pr03FUQiuSV6G+Ej4tS55B+rIQSFEIw3phdVAQ4pPqNWfQ==" + }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yauzl": { "version": "2.10.0", diff --git a/package.json b/package.json index 21a2a3be4..fa9298f1a 100644 --- a/package.json +++ b/package.json @@ -25,11 +25,12 @@ "etag": "^1.8.1", "express": "^4.16.4", "lokijs": "^1.5.6", - "mariadb": "^2.1.1", "morgan": "^1.9.1", "multistream": "^2.1.1", + "mysql2": "^2.1.0", "rimraf": "^2.6.3", "sequelize": "^5.18.4", + "tedious": "^6.6.5", "tslib": "^1.9.3", "uri-templates": "^0.2.0", "uuid": "^3.3.2", @@ -49,7 +50,7 @@ "@types/mocha": "^5.2.6", "@types/morgan": "^1.7.35", "@types/multistream": "^2.1.1", - "@types/node": "^11.13.0", + "@types/node": "^13.1.0", "@types/rimraf": "^2.0.2", "@types/uri-templates": "^0.1.29", "@types/uuid": "^3.4.4", @@ -187,9 +188,10 @@ "queue": "node -r ts-node/register src/queue/main.ts", "azurite": "node -r ts-node/register src/azurite.ts", "lint": "tslint -p tsconfig.json -c tslint.json src/**/*.ts", - "test": "npm run lint && mocha --compilers ts-node/register --no-timeouts --recursive tests/**/*.test.ts tests/**/**/*.test.ts", - "test:blob": "npm run lint && mocha --compilers ts-node/register --no-timeouts --recursive tests/blob/*.test.ts tests/blob/**/*.test.ts", - "test:blob:sql": "npm run lint && cross-env AZURITE_TEST_DB=mariadb://root:my-secret-pw@127.0.0.1:3306/azurite_blob_test mocha --compilers ts-node/register --no-timeouts --recursive tests/blob/*.test.ts tests/blob/**/*.test.ts", + "test": "npm run lint && mocha --compilers ts-node/register --no-timeouts --grep @loki --recursive tests/**/*.test.ts tests/**/**/*.test.ts", + "test:blob": "npm run lint && mocha --compilers ts-node/register --no-timeouts --grep @loki --recursive tests/blob/*.test.ts tests/blob/**/*.test.ts", + "test:blob:sql": "npm run lint && cross-env AZURITE_TEST_DB=mysql://root:my-secret-pw@127.0.0.1:3306/azurite_blob_test mocha --compilers ts-node/register --no-timeouts --grep @sql --recursive tests/blob/*.test.ts tests/blob/**/*.test.ts", + "test:blob:sql:ci": "npm run lint && cross-env AZURITE_TEST_DB=mysql://root:my-secret-pw@127.0.0.1:13306/azurite_blob_test mocha --compilers ts-node/register --no-timeouts --grep @sql --recursive tests/blob/*.test.ts tests/blob/**/*.test.ts", "test:queue": "npm run lint && mocha --compilers ts-node/register --no-timeouts --recursive tests/queue/*.test.ts tests/queue/**/*.test.ts", "clean": "rimraf dist typings *.log coverage __testspersistence__ temp __testsstorage__ .nyc_output debug.log *.vsix", "clean:deep": "npm run clean && rimraf debug.log __*", diff --git a/src/blob/handlers/ContainerHandler.ts b/src/blob/handlers/ContainerHandler.ts index cd9440122..6d879a1a8 100644 --- a/src/blob/handlers/ContainerHandler.ts +++ b/src/blob/handlers/ContainerHandler.ts @@ -561,7 +561,13 @@ export default class ContainerHandler extends BaseHandler maxResults: options.maxresults, delimiter, segment: { - blobItems + blobItems: blobs.map(item => { + return { + ...item, + deleted: item.deleted !== true ? undefined : true, + properties: { ...item.properties, etag: item.properties.etag } + }; + }) }, clientRequestId: options.requestId, nextMarker: `${nextMarker || ""}` diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 3c5b13be5..c923fe631 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -327,9 +327,13 @@ export default class LokiBlobMetadataStore accountName: account }; + // Workaround for loki which will ignore $gt when providing $regex + const query2 = { name: { $gt: marker } }; + const docs = coll .chain() .find(query) + .find(query2) .limit(maxResults + 1) .simplesort("name") .data(); diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index eb5ada394..f9352a1d7 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -506,7 +506,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { } const findResult = await ContainersModel.findAll({ - limit: maxResults, + limit: maxResults + 1, where: whereQuery as any, order: [["containerName", "ASC"]] }); @@ -522,7 +522,8 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { if (findResult.length <= maxResults) { return [findResult.map(leaseUpdateMapper), undefined]; } else { - const tail = findResult[findResult.length - 1]; + const tail = findResult[findResult.length - 2]; + findResult.pop(); const nextMarker = this.getModelValue( tail, "containerName", diff --git a/src/common/persistence/SqlExtentMetadataStore.ts b/src/common/persistence/SqlExtentMetadataStore.ts index 418923fe9..60d04fc4a 100644 --- a/src/common/persistence/SqlExtentMetadataStore.ts +++ b/src/common/persistence/SqlExtentMetadataStore.ts @@ -157,7 +157,7 @@ export default class SqlExtentMetadataStore implements IExtentMetadataStore { id: getId, locationId: this.getModelValue( extentsModel, - "persistencyId", + "locationId", true ), path: this.getModelValue(extentsModel, "path") || getId, diff --git a/src/common/utils/constants.ts b/src/common/utils/constants.ts index 991d65800..e2f3cb1d9 100644 --- a/src/common/utils/constants.ts +++ b/src/common/utils/constants.ts @@ -21,6 +21,6 @@ export const DEFAULT_SQL_OPTIONS = { charset: DEFAULT_SQL_CHARSET, collate: DEFAULT_SQL_COLLATE, dialectOptions: { - timezone: "Etc/GMT-0" + timezone: "+00:00" } }; diff --git a/tests/BlobTestServerFactory.ts b/tests/BlobTestServerFactory.ts index dd7d7ceab..46cedf98d 100644 --- a/tests/BlobTestServerFactory.ts +++ b/tests/BlobTestServerFactory.ts @@ -3,6 +3,7 @@ import BlobServer from "../src/blob/BlobServer"; import SqlBlobConfiguration from "../src/blob/SqlBlobConfiguration"; import SqlBlobServer from "../src/blob/SqlBlobServer"; import { StoreDestinationArray } from "../src/common/persistence/IExtentStore"; +import { DEFAULT_SQL_OPTIONS } from "../src/common/utils/constants"; export default class BlobTestServerFactory { public createServer(): BlobServer | SqlBlobServer { @@ -20,24 +21,11 @@ export default class BlobTestServerFactory { ]; if (isSQL) { - const sqlOptions = { - logging: false, - pool: { - max: 100, - min: 0, - acquire: 30000, - idle: 10000 - }, - dialectOptions: { - timezone: "Etc/GMT-0" - } - }; - const config = new SqlBlobConfiguration( host, port, databaseConnectionString!, - sqlOptions, + DEFAULT_SQL_OPTIONS, persistenceArray, false, undefined, diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index ef0791656..1eebcebb4 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -69,7 +69,7 @@ describe("BlobAPIs", () => { await containerURL.delete(Aborter.none); }); - it("download with with default parameters", async () => { + it("download with with default parameters @loki @sql", async () => { const result = await blobURL.download(Aborter.none, 0); assert.deepStrictEqual(await bodyToString(result, content.length), content); assert.equal(result.contentRange, undefined); @@ -79,7 +79,7 @@ describe("BlobAPIs", () => { ); }); - it("download all parameters set", async () => { + it("download all parameters set @loki @sql", async () => { const result = await blobURL.download(Aborter.none, 0, 1, { rangeGetContentMD5: true }); @@ -91,7 +91,7 @@ describe("BlobAPIs", () => { ); }); - it("download entire with range", async () => { + it("download entire with range @loki @sql", async () => { const result = await blobURL.download(Aborter.none, 0, content.length); assert.deepStrictEqual(await bodyToString(result, content.length), content); assert.equal( @@ -104,7 +104,7 @@ describe("BlobAPIs", () => { ); }); - it("delete", async () => { + it("delete @loki @sql", async () => { const result = await blobURL.delete(Aborter.none); assert.equal( result._response.request.headers.get("x-ms-client-request-id"), @@ -112,7 +112,7 @@ describe("BlobAPIs", () => { ); }); - it("should create a snapshot from a blob", async () => { + it("should create a snapshot from a blob @loki @sql", async () => { const result = await blobURL.createSnapshot(Aborter.none); assert.ok(result.snapshot); assert.equal( @@ -121,7 +121,7 @@ describe("BlobAPIs", () => { ); }); - it("should create a snapshot with metadata from a blob", async () => { + it("should create a snapshot with metadata from a blob @loki @sql", async () => { const metadata = { meta1: "val1", meta3: "val3" @@ -138,7 +138,7 @@ describe("BlobAPIs", () => { assert.deepStrictEqual(result2.metadata, metadata); }); - it("should delete snapshot", async () => { + it("should delete snapshot @loki @sql", async () => { const result = await blobURL.createSnapshot(Aborter.none); assert.ok(result.snapshot); assert.equal( @@ -164,7 +164,7 @@ describe("BlobAPIs", () => { ); }); - it("should also list snapshots", async () => { + it("should also list snapshots @loki @sql", async () => { const result = await blobURL.createSnapshot(Aborter.none); assert.ok(result.snapshot); const result2 = await containerURL.listBlobFlatSegment( @@ -177,7 +177,7 @@ describe("BlobAPIs", () => { assert.strictEqual(result2.segment.blobItems!.length, 2); }); - it("should setMetadata with new metadata set", async () => { + it("should setMetadata with new metadata set @loki @sql", async () => { const metadata = { a: "a", b: "b" @@ -195,7 +195,7 @@ describe("BlobAPIs", () => { ); }); - it("acquireLease_available_proposedLeaseId_fixed", async () => { + it("acquireLease_available_proposedLeaseId_fixed @loki @sql", async () => { const guid = "ca761232ed4211cebacd00aa0057b223"; const duration = 30; const result_acquire = await blobURL.acquireLease( @@ -224,7 +224,7 @@ describe("BlobAPIs", () => { ); }); - it("acquireLease_available_NoproposedLeaseId_infinite", async () => { + it("acquireLease_available_NoproposedLeaseId_infinite @loki @sql", async () => { const leaseResult = await blobURL.acquireLease(Aborter.none, "", -1); const leaseId = leaseResult.leaseId; assert.ok(leaseId); @@ -237,7 +237,7 @@ describe("BlobAPIs", () => { await blobURL.releaseLease(Aborter.none, leaseId!); }); - it("releaseLease", async () => { + it("releaseLease @loki @sql", async () => { const guid = "ca761232ed4211cebacd00aa0057b223"; const duration = -1; await blobURL.acquireLease(Aborter.none, guid, duration); @@ -254,7 +254,7 @@ describe("BlobAPIs", () => { assert.equal(result.leaseStatus, "unlocked"); }); - it("renewLease", async () => { + it("renewLease @loki @sql", async () => { const guid = "ca761232ed4211cebacd00aa0057b223"; const duration = 15; await blobURL.acquireLease(Aborter.none, guid, duration); @@ -283,7 +283,7 @@ describe("BlobAPIs", () => { await blobURL.releaseLease(Aborter.none, guid); }); - it("changeLease", async () => { + it("changeLease @loki @sql", async () => { const guid = "ca761232ed4211cebacd00aa0057b223"; const duration = 15; await blobURL.acquireLease(Aborter.none, guid, duration); @@ -308,7 +308,7 @@ describe("BlobAPIs", () => { await blobURL.releaseLease(Aborter.none, newGuid); }); - it("breakLease", async () => { + it("breakLease @loki @sql", async () => { const guid = "ca761232ed4211cebacd00aa0057b223"; const duration = 15; await blobURL.acquireLease(Aborter.none, guid, duration); @@ -350,7 +350,7 @@ describe("BlobAPIs", () => { assert.equal(result4.leaseStatus, "unlocked"); }); - it("should get the correct headers back when setting metadata", async () => { + it("should get the correct headers back when setting metadata @loki @sql", async () => { const metadata = { a: "a", b: "b" @@ -376,7 +376,7 @@ describe("BlobAPIs", () => { // https://docs.microsoft.com/en-us/rest/api/storageservices/get-blob-properties // as properties retrieval is implemented, the properties should be added to the tests below // https://developer.mozilla.org/en-US/docs/Web/HTTP/Header - it("should get the correct properties set based on set HTTP headers", async () => { + it("should get the correct properties set based on set HTTP headers @loki @sql", async () => { const cacheControl = "no-cache"; const contentType = "text/plain; charset=UTF-8"; const md5 = new Uint8Array([1, 2, 3, 4, 5]); @@ -404,7 +404,7 @@ describe("BlobAPIs", () => { assert.deepStrictEqual(result.contentLanguage, contentLanguage); }); - it("setTier set default to cool", async () => { + it("setTier set default to cool @loki @sql", async () => { const result = await blockBlobURL.setTier(Aborter.none, "Cool"); assert.equal( result._response.request.headers.get("x-ms-client-request-id"), @@ -415,7 +415,7 @@ describe("BlobAPIs", () => { assert.equal(properties.accessTier!.toLowerCase(), "cool"); }); - it("setTier set archive to hot", async () => { + it("setTier set archive to hot @loki @sql", async () => { await blockBlobURL.setTier(Aborter.none, "Archive"); let properties = await blockBlobURL.getProperties(Aborter.none); assert.equal(properties.accessTier!.toLowerCase(), "archive"); @@ -430,7 +430,7 @@ describe("BlobAPIs", () => { } }); - it("setHTTPHeaders with default parameters", async () => { + it("setHTTPHeaders with default parameters @loki @sql", async () => { await blobURL.setHTTPHeaders(Aborter.none, {}); const result = await blobURL.getProperties(Aborter.none); @@ -445,7 +445,7 @@ describe("BlobAPIs", () => { assert.ok(!result.contentDisposition); }); - it("setHTTPHeaders with all parameters set", async () => { + it("setHTTPHeaders with all parameters set @loki @sql", async () => { const headers = { blobCacheControl: "blobCacheControl", blobContentDisposition: "blobContentDisposition", @@ -473,7 +473,7 @@ describe("BlobAPIs", () => { ); }); - it("Copy blob should work", async () => { + it("Copy blob should work @loki", async () => { const sourceBlob = getUniqueName("blob"); const destBlob = getUniqueName("blob"); @@ -534,7 +534,7 @@ describe("BlobAPIs", () => { ); }); - it("Copy blob should work to override metadata", async () => { + it("Copy blob should work to override metadata @loki", async () => { const sourceBlob = getUniqueName("blob"); const destBlob = getUniqueName("blob"); @@ -561,7 +561,7 @@ describe("BlobAPIs", () => { assert.deepStrictEqual(result.metadata, metadata2); }); - it("Copy blob should not override destination Lease status", async () => { + it("Copy blob should not override destination Lease status @loki", async () => { const sourceBlob = getUniqueName("blob"); const destBlob = getUniqueName("blob"); @@ -598,59 +598,59 @@ describe("BlobAPIs", () => { await destBlobURL.releaseLease(Aborter.none, leaseId!); }); - it("Acquire Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + it("Acquire Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error @loki @sql", async () => { // TODO: implement the case later }); - it("Renew Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + it("Renew Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error @loki @sql", async () => { // TODO: implement the case later }); - it("Change Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + it("Change Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error @loki @sql", async () => { // TODO: implement the case later }); - it("Renew: Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + it("Renew: Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error @loki @sql", async () => { // TODO: implement the case later }); - it("Acquire Lease on Broken Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + it("Acquire Lease on Broken Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error @loki @sql", async () => { // TODO: implement the case later }); - it("Break Lease on Infinite Lease, if give valid breakPeriod, should be broken after breadperiod", async () => { + it("Break Lease on Infinite Lease, if give valid breakPeriod, should be broken after breadperiod @loki @sql", async () => { // TODO: implement the case later }); - it("Break Lease on Infinite Lease, if not give breakPeriod, should be broken immidiately", async () => { + it("Break Lease on Infinite Lease, if not give breakPeriod, should be broken immidiately @loki @sql", async () => { // TODO: implement the case later }); - it("Renew: Lease on Leased status, if LeaseId not match, throw LeaseIdMismatchWithLease error", async () => { + it("Renew: Lease on Leased status, if LeaseId not match, throw LeaseIdMismatchWithLease error @loki @sql", async () => { // TODO: implement the case later }); - it("Change Lease on Leased status, if input LeaseId not match anyone of leaseID or proposedLeaseId, throw LeaseIdMismatchWithLease error", async () => { + it("Change Lease on Leased status, if input LeaseId not match anyone of leaseID or proposedLeaseId, throw LeaseIdMismatchWithLease error @loki @sql", async () => { // TODO: implement the case later }); - it("Change Lease on Leased status, if input LeaseId matches proposedLeaseId, will change success", async () => { + it("Change Lease on Leased status, if input LeaseId matches proposedLeaseId, will change success @loki @sql", async () => { // TODO: implement the case later }); - it("UploadPage on a Leased page blob, if input LeaseId matches, will success", async () => { + it("UploadPage on a Leased page blob, if input LeaseId matches, will success @loki @sql", async () => { // TODO: implement the case later }); - it("ClearPage on a Leased page blob, if input LeaseId matches, will success", async () => { + it("ClearPage on a Leased page blob, if input LeaseId matches, will success @loki @sql", async () => { // TODO: implement the case later }); - it("Resize a Leased page blob, if input LeaseId matches, will success", async () => { + it("Resize a Leased page blob, if input LeaseId matches, will success @loki @sql", async () => { // TODO: implement the case later }); - it("UpdateSequenceNumber a Leased page blob, if input LeaseId matches, will success", async () => { + it("UpdateSequenceNumber a Leased page blob, if input LeaseId matches, will success @loki @sql", async () => { // TODO: implement the case later }); }); diff --git a/tests/blob/apis/blockblob.test.ts b/tests/blob/apis/blockblob.test.ts index 7bd6a60bf..d86011609 100644 --- a/tests/blob/apis/blockblob.test.ts +++ b/tests/blob/apis/blockblob.test.ts @@ -65,7 +65,7 @@ describe("BlockBlobAPIs", () => { await containerURL.delete(Aborter.none); }); - it("upload with string body and default parameters", async () => { + it("upload with string body and default parameters @loki @sql", async () => { const body: string = getUniqueName("randomstring"); const result_upload = await blockBlobURL.upload( Aborter.none, @@ -84,13 +84,13 @@ describe("BlockBlobAPIs", () => { ); }); - it("upload empty blob", async () => { + it("upload empty blob @loki @sql", async () => { await blockBlobURL.upload(Aborter.none, "", 0); const result = await blobURL.download(Aborter.none, 0); assert.deepStrictEqual(await bodyToString(result, 0), ""); }); - it("upload with string body and all parameters set", async () => { + it("upload with string body and all parameters set @loki @sql", async () => { const body: string = getUniqueName("randomstring"); const options = { blobCacheControl: "blobCacheControl", @@ -133,7 +133,7 @@ describe("BlockBlobAPIs", () => { ); }); - it("stageBlock", async () => { + it("stageBlock @loki @sql", async () => { const body = "HelloWorld"; const result_stage = await blockBlobURL.stageBlock( Aborter.none, @@ -178,7 +178,7 @@ describe("BlockBlobAPIs", () => { ); }); - it("commitBlockList", async () => { + it("commitBlockList @loki @sql", async () => { const body = "HelloWorld"; await blockBlobURL.stageBlock( Aborter.none, @@ -215,7 +215,7 @@ describe("BlockBlobAPIs", () => { ); }); - it("commitBlockList with previous committed blocks", async () => { + it("commitBlockList with previous committed blocks @loki @sql", async () => { const body = "HelloWorld"; await blockBlobURL.stageBlock( Aborter.none, @@ -261,7 +261,7 @@ describe("BlockBlobAPIs", () => { assert.equal(listResponse2.committedBlocks![0].size, body.length); }); - it("commitBlockList with empty list should create an empty block blob", async () => { + it("commitBlockList with empty list should create an empty block blob @loki @sql", async () => { await blockBlobURL.commitBlockList(Aborter.none, []); const listResponse = await blockBlobURL.getBlockList( @@ -274,7 +274,7 @@ describe("BlockBlobAPIs", () => { assert.deepStrictEqual(await bodyToString(result, 0), ""); }); - it("commitBlockList with all parameters set", async () => { + it("commitBlockList with all parameters set @loki @sql", async () => { const body = "HelloWorld"; await blockBlobURL.stageBlock( Aborter.none, @@ -339,7 +339,7 @@ describe("BlockBlobAPIs", () => { ); }); - it("getBlockList", async () => { + it("getBlockList @loki @sql", async () => { const body = "HelloWorld"; await blockBlobURL.stageBlock( Aborter.none, @@ -361,7 +361,7 @@ describe("BlockBlobAPIs", () => { assert.equal(listResponse.committedBlocks![0].size, body.length); }); - it("getBlockList_BlockListingFilter", async () => { + it("getBlockList_BlockListingFilter @loki @sql", async () => { const body = "HelloWorld"; await blockBlobURL.stageBlock( Aborter.none, @@ -415,7 +415,7 @@ describe("BlockBlobAPIs", () => { assert.equal(listResponse.uncommittedBlocks![0].size, body.length); }); - it("upload with Readable stream body and default parameters", async () => { + it("upload with Readable stream body and default parameters @loki @sql", async () => { const body: string = getUniqueName("randomstring"); const bodyBuffer = Buffer.from(body); @@ -440,7 +440,7 @@ describe("BlockBlobAPIs", () => { assert.deepStrictEqual(downloadedBody, body); }); - it("upload with Chinese string body and default parameters", async () => { + it("upload with Chinese string body and default parameters @loki @sql", async () => { const body: string = getUniqueName("randomstring你好"); await blockBlobURL.upload(Aborter.none, body, Buffer.byteLength(body)); const result = await blobURL.download(Aborter.none, 0); diff --git a/tests/blob/apis/container.test.ts b/tests/blob/apis/container.test.ts index 3d7ef8c8c..0be89487c 100644 --- a/tests/blob/apis/container.test.ts +++ b/tests/blob/apis/container.test.ts @@ -58,7 +58,7 @@ describe("ContainerAPIs", () => { await containerURL.delete(Aborter.none); }); - it("setMetadata", async () => { + it("setMetadata @loki @sql", async () => { const metadata = { key0: "val0", keya: "vala", @@ -70,7 +70,7 @@ describe("ContainerAPIs", () => { assert.deepEqual(result.metadata, metadata); }); - it("getProperties", async () => { + it("getProperties @loki @sql", async () => { const result = await containerURL.getProperties(Aborter.none); assert.ok(result.eTag!.length > 0); assert.ok(result.lastModified); @@ -87,7 +87,7 @@ describe("ContainerAPIs", () => { ); }); - it("getProperties should return 404 for non existed container", async () => { + it("getProperties should return 404 for non existed container @loki @sql", async () => { const nonExistedContainerURL = ContainerURL.fromServiceURL( serviceURL, "404container_" @@ -103,12 +103,12 @@ describe("ContainerAPIs", () => { assert.ok(expectedError); }); - it("create with default parameters", done => { + it("create with default parameters @loki @sql", done => { // create() with default parameters has been tested in beforeEach done(); }); - it("create with all parameters configured", async () => { + it("create with all parameters configured @loki @sql", async () => { const cURL = ContainerURL.fromServiceURL( serviceURL, getUniqueName(containerName) @@ -125,12 +125,12 @@ describe("ContainerAPIs", () => { assert.deepEqual(result.metadata, metadata); }); - it("delete", done => { + it("delete @loki @sql", done => { // delete() with default parameters has been tested in afterEach done(); }); - it("listBlobHierarchySegment with default parameters", async () => { + it("listBlobHierarchySegment with default parameters @loki @sql", async () => { const blobURLs = []; for (let i = 0; i < 3; i++) { const blobURL = BlobURL.fromContainerURL( @@ -170,7 +170,7 @@ describe("ContainerAPIs", () => { } }); - it("listBlobHierarchySegment with all parameters configured", async () => { + it("listBlobHierarchySegment with all parameters configured @loki @sql", async () => { const blobURLs = []; const prefix = "blockblob"; const metadata = { @@ -270,7 +270,7 @@ describe("ContainerAPIs", () => { } }); - it("acquireLease_available_proposedLeaseId_fixed", async () => { + it("acquireLease_available_proposedLeaseId_fixed @loki @sql", async () => { const guid = "ca761232-ed42-11ce-bacd-00aa0057b223"; const duration = 30; const result_acquire = await containerURL.acquireLease( @@ -299,7 +299,7 @@ describe("ContainerAPIs", () => { ); }); - it("acquireLease_available_NoproposedLeaseId_infinite", async () => { + it("acquireLease_available_NoproposedLeaseId_infinite @loki @sql", async () => { const leaseResult = await containerURL.acquireLease(Aborter.none, "", -1); const leaseId = leaseResult.leaseId; assert.ok(leaseId); @@ -316,7 +316,7 @@ describe("ContainerAPIs", () => { await containerURL.releaseLease(Aborter.none, leaseId!); }); - it("releaseLease", async () => { + it("releaseLease @loki @sql", async () => { const guid = "ca761232ed4211cebacd00aa0057b223"; const duration = -1; await containerURL.acquireLease(Aborter.none, guid, duration); @@ -329,7 +329,7 @@ describe("ContainerAPIs", () => { await containerURL.releaseLease(Aborter.none, guid); }); - it("renewLease", async () => { + it("renewLease @loki @sql", async () => { const guid = "ca761232ed4211cebacd00aa0057b223"; const duration = 15; await containerURL.acquireLease(Aborter.none, guid, duration); @@ -358,7 +358,7 @@ describe("ContainerAPIs", () => { await containerURL.releaseLease(Aborter.none, guid); }); - it("changeLease", async () => { + it("changeLease @loki @sql", async () => { const guid = "ca761232ed4211cebacd00aa0057b223"; const duration = 15; await containerURL.acquireLease(Aborter.none, guid, duration); @@ -383,7 +383,7 @@ describe("ContainerAPIs", () => { await containerURL.releaseLease(Aborter.none, newGuid); }); - it("breakLease", async () => { + it("breakLease @loki @sql", async () => { const guid = "ca761232ed4211cebacd00aa0057b223"; const duration = 15; await containerURL.acquireLease(Aborter.none, guid, duration); @@ -424,7 +424,7 @@ describe("ContainerAPIs", () => { assert.equal(result3.leaseStatus, "unlocked"); }); - it("should correctly list all blobs in the container using listBlobFlatSegment with default parameters", async () => { + it("should correctly list all blobs in the container using listBlobFlatSegment with default parameters @loki @sql", async () => { const blobURLs = []; for (let i = 0; i < 3; i++) { const blobURL = BlobURL.fromContainerURL( @@ -456,7 +456,7 @@ describe("ContainerAPIs", () => { } }); - it("should correctly order all blobs in the container", async () => { + it("should correctly order all blobs in the container @loki @sql", async () => { const blobURLs = []; const blobNames: Array = []; @@ -497,7 +497,7 @@ describe("ContainerAPIs", () => { } }); - it("returns a valid, correct nextMarker", async () => { + it("returns a valid, correct nextMarker @loki @sql", async () => { const blobURLs = []; let blobNames: Array = [ "blockblob/abc-001", @@ -592,7 +592,7 @@ describe("ContainerAPIs", () => { } }); - it("getAccessPolicy", async () => { + it("getAccessPolicy @loki @sql", async () => { const result = await containerURL.getAccessPolicy(Aborter.none); assert.ok(result.eTag!.length > 0); assert.ok(result.lastModified); @@ -605,7 +605,7 @@ describe("ContainerAPIs", () => { ); }); - it("setAccessPolicy_publicAccess", async () => { + it("setAccessPolicy_publicAccess @loki @sql", async () => { const access = "blob"; const containerAcl = [ { @@ -628,7 +628,7 @@ describe("ContainerAPIs", () => { }); // Skip since getAccessPolicy can't get signedIdentifiers now - it("setAccessPolicy_signedIdentifiers", async () => { + it("setAccessPolicy_signedIdentifiers @loki @sql", async () => { const access = "container"; const containerAcl = [ { diff --git a/tests/blob/apis/pageblob.test.ts b/tests/blob/apis/pageblob.test.ts index 7f1f1ce14..724c02c73 100644 --- a/tests/blob/apis/pageblob.test.ts +++ b/tests/blob/apis/pageblob.test.ts @@ -64,7 +64,7 @@ describe("PageBlobAPIs", () => { await containerURL.delete(Aborter.none); }); - it("create with default parameters", async () => { + it("create with default parameters @loki", async () => { const reuslt_create = await pageBlobURL.create(Aborter.none, 512); assert.equal( reuslt_create._response.request.headers.get("x-ms-client-request-id"), @@ -82,7 +82,7 @@ describe("PageBlobAPIs", () => { ); }); - it("create with all parameters set", async () => { + it("create with all parameters set @loki", async () => { const options = { blobHTTPHeaders: { blobCacheControl: "blobCacheControl", @@ -141,7 +141,7 @@ describe("PageBlobAPIs", () => { ); }); - it("download page blob with partial ranges", async () => { + it("download page blob with partial ranges @loki", async () => { const length = 512 * 10; await pageBlobURL.create(Aborter.none, length); @@ -164,7 +164,7 @@ describe("PageBlobAPIs", () => { ); }); - it("download page blob with no ranges uploaded", async () => { + it("download page blob with no ranges uploaded @loki", async () => { const length = 512 * 10; await pageBlobURL.create(Aborter.none, length); @@ -187,7 +187,7 @@ describe("PageBlobAPIs", () => { ); }); - it("download page blob with no ranges uploaded after resize to bigger size", async () => { + it("download page blob with no ranges uploaded after resize to bigger size @loki", async () => { let length = 512 * 10; await pageBlobURL.create(Aborter.none, length); @@ -230,7 +230,7 @@ describe("PageBlobAPIs", () => { ); }); - it("download page blob with no ranges uploaded after resize to smaller size", async () => { + it("download page blob with no ranges uploaded after resize to smaller size @loki", async () => { let length = 512 * 10; await pageBlobURL.create(Aborter.none, length); @@ -261,7 +261,7 @@ describe("PageBlobAPIs", () => { ); }); - it("uploadPages", async () => { + it("uploadPages @loki", async () => { await pageBlobURL.create(Aborter.none, 1024); const result = await blobURL.download(Aborter.none, 0); @@ -286,7 +286,7 @@ describe("PageBlobAPIs", () => { assert.equal(await bodyToString(page2, 512), "b".repeat(512)); }); - it("uploadPages with sequential pages", async () => { + it("uploadPages with sequential pages @loki", async () => { const length = 512 * 3; await pageBlobURL.create(Aborter.none, length); @@ -319,7 +319,7 @@ describe("PageBlobAPIs", () => { assert.deepStrictEqual(ranges.pageRange![2], { start: 1024, end: 1535 }); }); - it("uploadPages with one big page range", async () => { + it("uploadPages with one big page range @loki", async () => { const length = 512 * 3; await pageBlobURL.create(Aborter.none, length); @@ -353,7 +353,7 @@ describe("PageBlobAPIs", () => { assert.deepStrictEqual(ranges.pageRange![0], { start: 0, end: 1535 }); }); - it("uploadPages with non-sequential pages", async () => { + it("uploadPages with non-sequential pages @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -392,7 +392,7 @@ describe("PageBlobAPIs", () => { assert.deepStrictEqual(ranges.pageRange![1], { start: 1536, end: 2047 }); }); - it("uploadPages to internally override a sequential range", async () => { + it("uploadPages to internally override a sequential range @loki", async () => { const length = 512 * 3; await pageBlobURL.create(Aborter.none, length); @@ -430,7 +430,7 @@ describe("PageBlobAPIs", () => { assert.deepStrictEqual(ranges.pageRange![2], { start: 1024, end: 1535 }); }); - it("uploadPages to internally right align override a sequential range", async () => { + it("uploadPages to internally right align override a sequential range @loki", async () => { const length = 512 * 3; await pageBlobURL.create(Aborter.none, length); @@ -467,7 +467,7 @@ describe("PageBlobAPIs", () => { assert.deepStrictEqual(ranges.pageRange![1], { start: 1024, end: 1535 }); }); - it("uploadPages to internally left align override a sequential range", async () => { + it("uploadPages to internally left align override a sequential range @loki", async () => { const length = 512 * 3; await pageBlobURL.create(Aborter.none, length); @@ -504,7 +504,7 @@ describe("PageBlobAPIs", () => { assert.deepStrictEqual(ranges.pageRange![1], { start: 512, end: 1535 }); }); - it("uploadPages to totally override a sequential range", async () => { + it("uploadPages to totally override a sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -556,7 +556,7 @@ describe("PageBlobAPIs", () => { assert.deepStrictEqual(ranges.pageRange![0], { start: 0, end: length - 1 }); }); - it("uploadPages to left override a sequential range", async () => { + it("uploadPages to left override a sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -606,7 +606,7 @@ describe("PageBlobAPIs", () => { assert.deepStrictEqual(ranges.pageRange![1], { start: 1024, end: 2047 }); }); - it("uploadPages to right override a sequential range", async () => { + it("uploadPages to right override a sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -662,7 +662,7 @@ describe("PageBlobAPIs", () => { }); }); - it("resize override a sequential range", async () => { + it("resize override a sequential range @loki", async () => { let length = 512 * 3; await pageBlobURL.create(Aborter.none, length); @@ -703,7 +703,7 @@ describe("PageBlobAPIs", () => { assert.deepStrictEqual(ranges.pageRange![0], { start: 0, end: length - 1 }); }); - it("uploadPages to internally override a non-sequential range", async () => { + it("uploadPages to internally override a non-sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -770,7 +770,7 @@ describe("PageBlobAPIs", () => { }); }); - it("uploadPages to internally insert into a non-sequential range", async () => { + it("uploadPages to internally insert into a non-sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -837,7 +837,7 @@ describe("PageBlobAPIs", () => { }); }); - it("uploadPages to totally override a non-sequential range", async () => { + it("uploadPages to totally override a non-sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -896,7 +896,7 @@ describe("PageBlobAPIs", () => { }); }); - it("uploadPages to left override a non-sequential range", async () => { + it("uploadPages to left override a non-sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -959,7 +959,7 @@ describe("PageBlobAPIs", () => { }); }); - it("uploadPages to insert into a non-sequential range", async () => { + it("uploadPages to insert into a non-sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -1026,7 +1026,7 @@ describe("PageBlobAPIs", () => { }); }); - it("uploadPages to right override a non-sequential range", async () => { + it("uploadPages to right override a non-sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -1089,7 +1089,7 @@ describe("PageBlobAPIs", () => { }); }); - it("clearPages", async () => { + it("clearPages @loki", async () => { await pageBlobURL.create(Aborter.none, 1024); let result = await blobURL.download(Aborter.none, 0); assert.deepStrictEqual( @@ -1113,7 +1113,7 @@ describe("PageBlobAPIs", () => { ); }); - it("clearPages to internally override a sequential range", async () => { + it("clearPages to internally override a sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -1164,7 +1164,7 @@ describe("PageBlobAPIs", () => { }); }); - it("clearPages to totally override a sequential range", async () => { + it("clearPages to totally override a sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -1207,7 +1207,7 @@ describe("PageBlobAPIs", () => { assert.deepStrictEqual((ranges.clearRange || []).length, 0); }); - it("clearPages to left override a sequential range", async () => { + it("clearPages to left override a sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -1254,7 +1254,7 @@ describe("PageBlobAPIs", () => { }); }); - it("clearPages to right override a sequential range", async () => { + it("clearPages to right override a sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -1301,7 +1301,7 @@ describe("PageBlobAPIs", () => { }); }); - it("clearPages to internally override a non-sequential range", async () => { + it("clearPages to internally override a non-sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -1349,7 +1349,7 @@ describe("PageBlobAPIs", () => { }); }); - it("clearPages to internally insert into a non-sequential range", async () => { + it("clearPages to internally insert into a non-sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -1401,7 +1401,7 @@ describe("PageBlobAPIs", () => { }); }); - it("clearPages to totally override a non-sequential range", async () => { + it("clearPages to totally override a non-sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -1441,7 +1441,7 @@ describe("PageBlobAPIs", () => { assert.deepStrictEqual((ranges.clearRange || []).length, 0); }); - it("clearPages to left override a non-sequential range", async () => { + it("clearPages to left override a non-sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -1493,7 +1493,7 @@ describe("PageBlobAPIs", () => { }); }); - it("clearPages to right override a non-sequential range", async () => { + it("clearPages to right override a non-sequential range @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); @@ -1541,7 +1541,7 @@ describe("PageBlobAPIs", () => { }); }); - it("getPageRanges", async () => { + it("getPageRanges @loki", async () => { await pageBlobURL.create(Aborter.none, 1024); const result = await blobURL.download(Aborter.none, 0); @@ -1560,7 +1560,7 @@ describe("PageBlobAPIs", () => { assert.equal(page2.pageRange![0].end, 1023); }); - it("updateSequenceNumber", async () => { + it("updateSequenceNumber @loki", async () => { await pageBlobURL.create(Aborter.none, 1024); let propertiesResponse = await pageBlobURL.getProperties(Aborter.none); @@ -1585,7 +1585,7 @@ describe("PageBlobAPIs", () => { }); // devstoreaccount1 is standard storage account which doesn't support premium page blob tiers - it.skip("setTier for Page blob", async () => { + it.skip("setTier for Page blob @loki", async () => { const length = 512 * 5; await pageBlobURL.create(Aborter.none, length); let propertiesResponse = await pageBlobURL.getProperties(Aborter.none); diff --git a/tests/blob/apis/service.test.ts b/tests/blob/apis/service.test.ts index ced19aa60..4e3b6119e 100644 --- a/tests/blob/apis/service.test.ts +++ b/tests/blob/apis/service.test.ts @@ -46,7 +46,7 @@ describe("ServiceAPIs", () => { await server.clean(); }); - it("GetServiceProperties", async () => { + it("GetServiceProperties @loki @sql", async () => { const result = await serviceURL.getProperties(Aborter.none); assert.ok(typeof result.requestId); @@ -55,10 +55,10 @@ describe("ServiceAPIs", () => { assert.ok(result.version!.length > 0); if (result.cors && result.cors!.length > 0) { - assert.ok(result.cors![0].allowedHeaders.length > 0); + assert.ok(result.cors![0].allowedHeaders.length >= 0); assert.ok(result.cors![0].allowedMethods.length > 0); assert.ok(result.cors![0].allowedOrigins.length > 0); - assert.ok(result.cors![0].exposedHeaders.length > 0); + assert.ok(result.cors![0].exposedHeaders.length >= 0); assert.ok(result.cors![0].maxAgeInSeconds >= 0); } assert.equal( @@ -67,7 +67,7 @@ describe("ServiceAPIs", () => { ); }); - it("Set CORS with empty AllowedHeaders, ExposedHeaders", async () => { + it("Set CORS with empty AllowedHeaders, ExposedHeaders @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -86,7 +86,7 @@ describe("ServiceAPIs", () => { assert.deepStrictEqual(result.cors![0], newCORS); }); - it("SetServiceProperties", async () => { + it("SetServiceProperties @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); serviceProperties.logging = { @@ -161,11 +161,11 @@ describe("ServiceAPIs", () => { ); }); - it("List containers in sorted order", async () => { - const containerNamePostfix = getUniqueName("container"); - const containerName1 = `cc${containerNamePostfix}`; - const containerName2 = `aa${containerNamePostfix}`; - const containerName3 = `bb${containerNamePostfix}`; + it("List containers in sorted order @loki @sql", async () => { + const containerNamePrefix = getUniqueName("container"); + const containerName1 = `${containerNamePrefix}cc`; + const containerName2 = `${containerNamePrefix}aa`; + const containerName3 = `${containerNamePrefix}bb`; const containerURL1 = ContainerURL.fromServiceURL( serviceURL, containerName1 @@ -183,22 +183,25 @@ describe("ServiceAPIs", () => { await containerURL3.create(Aborter.none); const result = await serviceURL.listContainersSegment( Aborter.none, - undefined + undefined, + { + prefix: containerNamePrefix + } ); assert.equal(result.containerItems.length, 3); - assert.ok(result.containerItems[0].name.startsWith("aa")); - assert.ok(result.containerItems[1].name.startsWith("bb")); - assert.ok(result.containerItems[2].name.startsWith("cc")); + assert.ok(result.containerItems[0].name.endsWith("aa")); + assert.ok(result.containerItems[1].name.endsWith("bb")); + assert.ok(result.containerItems[2].name.endsWith("cc")); await containerURL1.delete(Aborter.none); await containerURL2.delete(Aborter.none); await containerURL3.delete(Aborter.none); }); - it("List containers with marker", async () => { - const containerNamePostfix = getUniqueName("container"); - const containerName1 = `cc${containerNamePostfix}`; - const containerName2 = `aa${containerNamePostfix}`; - const containerName3 = `bb${containerNamePostfix}`; + it("List containers with marker @loki @sql", async () => { + const containerNamePrefix = getUniqueName("container"); + const containerName1 = `${containerNamePrefix}cc`; + const containerName2 = `${containerNamePrefix}aa`; + const containerName3 = `${containerNamePrefix}bb`; const containerURL1 = ContainerURL.fromServiceURL( serviceURL, containerName1 @@ -216,7 +219,10 @@ describe("ServiceAPIs", () => { await containerURL3.create(Aborter.none); const result = await serviceURL.listContainersSegment( Aborter.none, - containerName2 + containerName2, + { + prefix: containerNamePrefix + } ); assert.equal(result.containerItems.length, 2); assert.equal(result.containerItems[0].name, containerName3); @@ -226,11 +232,11 @@ describe("ServiceAPIs", () => { await containerURL3.delete(Aborter.none); }); - it("List containers with marker and max result length less than result size", async () => { - const containerNamePostfix = getUniqueName("container"); - const containerName1 = `cc${containerNamePostfix}`; - const containerName2 = `aa${containerNamePostfix}`; - const containerName3 = `bb${containerNamePostfix}`; + it("List containers with marker and max result length less than result size @loki @sql", async () => { + const containerNamePrefix = getUniqueName("container"); + const containerName1 = `${containerNamePrefix}cc`; + const containerName2 = `${containerNamePrefix}aa`; + const containerName3 = `${containerNamePrefix}bb`; const containerURL1 = ContainerURL.fromServiceURL( serviceURL, containerName1 @@ -249,7 +255,7 @@ describe("ServiceAPIs", () => { const result1 = await serviceURL.listContainersSegment( Aborter.none, containerName2, - { maxresults: 1 } + { maxresults: 1, prefix: containerNamePrefix } ); assert.equal(result1.containerItems.length, 1); @@ -259,7 +265,7 @@ describe("ServiceAPIs", () => { const result2 = await serviceURL.listContainersSegment( Aborter.none, result1.nextMarker, - { maxresults: 1 } + { maxresults: 1, prefix: containerNamePrefix } ); assert.equal(result2.containerItems.length, 1); assert.ok(result2.containerItems[0].name, containerName1); @@ -270,7 +276,7 @@ describe("ServiceAPIs", () => { await containerURL3.delete(Aborter.none); }); - it("ListContainers with default parameters", async () => { + it("ListContainers with default parameters @loki @sql", async () => { const result = await serviceURL.listContainersSegment(Aborter.none); assert.ok(typeof result.requestId); assert.ok(result.requestId!.length > 0); @@ -292,7 +298,7 @@ describe("ServiceAPIs", () => { ); }); - it("ListContainers with all parameters configured", async () => { + it("ListContainers with all parameters configured @loki @sql", async () => { const containerNamePrefix = getUniqueName("container"); const containerName1 = `${containerNamePrefix}x1`; const containerName2 = `${containerNamePrefix}x2`; @@ -368,7 +374,7 @@ describe("ServiceAPIs", () => { await containerURL2.delete(Aborter.none); }); - it("get Account info", async () => { + it("get Account info @loki @sql", async () => { const result = await serviceURL.getAccountInfo(Aborter.none); assert.equal(result.accountKind, EMULATOR_ACCOUNT_KIND); assert.equal(result.skuName, EMULATOR_ACCOUNT_SKUNAME); diff --git a/tests/blob/authentication.test.ts b/tests/blob/authentication.test.ts index 0a169dd24..230965133 100644 --- a/tests/blob/authentication.test.ts +++ b/tests/blob/authentication.test.ts @@ -33,7 +33,7 @@ describe("Authentication", () => { await server.clean(); }); - it("Should not work without credential", async () => { + it("Should not work without credential @loki @sql", async () => { const serviceURL = new ServiceURL( baseURL, StorageURL.newPipeline(new AnonymousCredential(), { @@ -61,7 +61,7 @@ describe("Authentication", () => { } }); - it("Should not work without correct account name", async () => { + it("Should not work without correct account name @loki @sql", async () => { const serviceURL = new ServiceURL( baseURL, StorageURL.newPipeline( @@ -92,7 +92,7 @@ describe("Authentication", () => { } }); - it("Should not work without correct account key", async () => { + it("Should not work without correct account key @loki @sql", async () => { const serviceURL = new ServiceURL( baseURL, StorageURL.newPipeline( @@ -123,7 +123,7 @@ describe("Authentication", () => { } }); - it("Should work with correct shared key", async () => { + it("Should work with correct shared key @loki @sql", async () => { const serviceURL = new ServiceURL( baseURL, StorageURL.newPipeline( diff --git a/tests/blob/blobCorsRequest.test.ts b/tests/blob/blobCorsRequest.test.ts index f56d58773..761ed6ac7 100644 --- a/tests/blob/blobCorsRequest.test.ts +++ b/tests/blob/blobCorsRequest.test.ts @@ -44,7 +44,7 @@ describe("Blob Cors requests test", () => { await server.clean(); }); - it("OPTIONS request without cors rules in server should be fail", async () => { + it("OPTIONS request without cors rules in server should be fail @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); serviceProperties.cors = []; await serviceURL.setProperties(Aborter.none, serviceProperties); @@ -78,7 +78,7 @@ describe("Blob Cors requests test", () => { ); }); - it("OPTIONS request should not work without matching cors rules", async () => { + it("OPTIONS request should not work without matching cors rules @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -141,7 +141,7 @@ describe("Blob Cors requests test", () => { assert.ok(res._response.status === 200); }); - it("OPTIONS request should not work without Origin header or matching allowedOrigins", async () => { + it("OPTIONS request should not work without Origin header or matching allowedOrigins @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -211,7 +211,7 @@ describe("Blob Cors requests test", () => { ); }); - it("OPTIONS request should not work without requestMethod header or matching allowedMethods", async () => { + it("OPTIONS request should not work without requestMethod header or matching allowedMethods @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -279,7 +279,7 @@ describe("Blob Cors requests test", () => { ); }); - it("OPTIONS request should check the defined requestHeaders", async () => { + it("OPTIONS request should check the defined requestHeaders @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = [ @@ -430,7 +430,7 @@ describe("Blob Cors requests test", () => { assert.ok(res._response.status === 200); }); - it("OPTIONS request should work with matching rule containing Origion *", async () => { + it("OPTIONS request should work with matching rule containing Origion * @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -465,7 +465,7 @@ describe("Blob Cors requests test", () => { assert.ok(res._response.status === 200); }); - it("Response of request to service without cors rules should not contains cors info", async () => { + it("Response of request to service without cors rules should not contains cors info @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); serviceProperties.cors = []; @@ -491,7 +491,7 @@ describe("Blob Cors requests test", () => { assert.ok(res.vary === undefined); }); - it("Service with mismatching cors rules should response header Vary", async () => { + it("Service with mismatching cors rules should response header Vary @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -525,7 +525,7 @@ describe("Blob Cors requests test", () => { assert.ok(res.vary === undefined); }); - it("Request Match rule exists that allows all origins (*)", async () => { + it("Request Match rule exists that allows all origins (*) @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -563,7 +563,7 @@ describe("Blob Cors requests test", () => { assert.ok(res["access-control-expose-headers"] === undefined); }); - it("Request Match rule exists for exact origin", async () => { + it("Request Match rule exists for exact origin @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -596,7 +596,7 @@ describe("Blob Cors requests test", () => { assert.ok(res["access-control-expose-headers"] !== undefined); }); - it("Requests with error response should apply for CORS", async () => { + it("Requests with error response should apply for CORS @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -643,7 +643,7 @@ describe("Blob Cors requests test", () => { } }); - it("Request Match rule in sequence", async () => { + it("Request Match rule in sequence @loki @sql", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = [ diff --git a/tests/blob/blockblob.highlevel.test.ts b/tests/blob/blockblob.highlevel.test.ts index 0d0ff4084..1857169b5 100644 --- a/tests/blob/blockblob.highlevel.test.ts +++ b/tests/blob/blockblob.highlevel.test.ts @@ -99,7 +99,7 @@ describe("BlockBlobHighlevel", () => { await server.clean(); }); - it("uploadFileToBlockBlob should success when blob >= BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES", async () => { + it("uploadFileToBlockBlob should success when blob >= BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES @loki @sql", async () => { const result = await uploadFileToBlockBlob( Aborter.none, tempFileLarge, @@ -128,7 +128,7 @@ describe("BlockBlobHighlevel", () => { assert.ok(downloadedData.equals(uploadedData)); }); - it("uploadFileToBlockBlob should success when blob < BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES", async () => { + it("uploadFileToBlockBlob should success when blob < BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES @loki @sql", async () => { await uploadFileToBlockBlob(Aborter.none, tempFileSmall, blockBlobURL, { blockSize: 4 * 1024 * 1024, parallelism: 20 @@ -149,7 +149,7 @@ describe("BlockBlobHighlevel", () => { }); // tslint:disable-next-line:max-line-length - it("uploadFileToBlockBlob should success when blob < BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES and configured maxSingleShotSize", async () => { + it("uploadFileToBlockBlob should success when blob < BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES and configured maxSingleShotSize @loki @sql", async () => { await uploadFileToBlockBlob(Aborter.none, tempFileSmall, blockBlobURL, { maxSingleShotSize: 0 }); @@ -168,7 +168,7 @@ describe("BlockBlobHighlevel", () => { assert.ok(downloadedData.equals(uploadedData)); }); - it("uploadFileToBlockBlob should update progress when blob >= BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES", async () => { + it("uploadFileToBlockBlob should update progress when blob >= BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES @loki @sql", async () => { let eventTriggered = false; const aborter = Aborter.none; @@ -186,7 +186,7 @@ describe("BlockBlobHighlevel", () => { assert.ok(eventTriggered); }); - it("uploadFileToBlockBlob should update progress when blob < BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES", async () => { + it("uploadFileToBlockBlob should update progress when blob < BLOCK_BLOB_MAX_UPLOAD_BLOB_BYTES @loki @sql", async () => { let eventTriggered = false; const aborter = Aborter.none; @@ -204,7 +204,7 @@ describe("BlockBlobHighlevel", () => { assert.ok(eventTriggered); }); - it("uploadStreamToBlockBlob should success", async () => { + it("uploadStreamToBlockBlob should success @loki @sql", async () => { const rs = fs.createReadStream(tempFileLarge); const result = await uploadStreamToBlockBlob( Aborter.none, @@ -236,7 +236,7 @@ describe("BlockBlobHighlevel", () => { fs.unlinkSync(downloadFilePath); }); - it("uploadStreamToBlockBlob should success for tiny buffers", async () => { + it("uploadStreamToBlockBlob should success for tiny buffers @loki @sql", async () => { const buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]); const bufferStream = new PassThrough(); bufferStream.end(buf); @@ -266,7 +266,7 @@ describe("BlockBlobHighlevel", () => { fs.unlinkSync(downloadFilePath); }); - it("uploadStreamToBlockBlob should abort", async () => { + it("uploadStreamToBlockBlob should abort @loki @sql", async () => { const rs = fs.createReadStream(tempFileLarge); const aborter = Aborter.timeout(1); @@ -284,7 +284,7 @@ describe("BlockBlobHighlevel", () => { } }); - it("uploadStreamToBlockBlob should update progress event", async () => { + it("uploadStreamToBlockBlob should update progress event @loki @sql", async () => { const rs = fs.createReadStream(tempFileLarge); let eventTriggered = false; @@ -304,7 +304,7 @@ describe("BlockBlobHighlevel", () => { assert.ok(eventTriggered); }); - it("downloadBlobToBuffer should success", async () => { + it("downloadBlobToBuffer should success @loki @sql", async () => { const rs = fs.createReadStream(tempFileLarge); const result = await uploadStreamToBlockBlob( Aborter.none, @@ -329,7 +329,7 @@ describe("BlockBlobHighlevel", () => { assert.ok(localFileContent.equals(buf)); }); - it("downloadBlobToBuffer should update progress event", async () => { + it("downloadBlobToBuffer should update progress event @loki @sql", async () => { const rs = fs.createReadStream(tempFileSmall); await uploadStreamToBlockBlob( Aborter.none, @@ -356,7 +356,7 @@ describe("BlockBlobHighlevel", () => { assert.ok(eventTriggered); }); - it("bloburl.download should success when internal stream unexpected ends at the stream end", async () => { + it("bloburl.download should success when internal stream unexpected ends at the stream end @loki @sql", async () => { const uploadResponse = await uploadFileToBlockBlob( Aborter.none, tempFileSmall, @@ -407,7 +407,7 @@ describe("BlockBlobHighlevel", () => { assert.ok(downloadedData.equals(uploadedData)); }); - it("bloburl.download should download full data successfully when internal stream unexcepted ends", async () => { + it("bloburl.download should download full data successfully when internal stream unexcepted ends @loki @sql", async () => { const uploadResponse = await uploadFileToBlockBlob( Aborter.none, tempFileSmall, @@ -455,7 +455,7 @@ describe("BlockBlobHighlevel", () => { assert.ok(downloadedData.equals(uploadedData)); }); - it("bloburl.download should download partial data when internal stream unexpected ends", async () => { + it("bloburl.download should download partial data when internal stream unexpected ends @loki @sql", async () => { const uploadResponse = await uploadFileToBlockBlob( Aborter.none, tempFileSmall, @@ -509,7 +509,7 @@ describe("BlockBlobHighlevel", () => { ); }); - it("bloburl.download should download data failed when exceeding max stream retry requests", async () => { + it("bloburl.download should download data failed when exceeding max stream retry requests @loki @sql", async () => { const uploadResponse = await uploadFileToBlockBlob( Aborter.none, tempFileSmall, diff --git a/tests/blob/handlers/PageBlobRangesManager.test.ts b/tests/blob/handlers/PageBlobRangesManager.test.ts index 7c8cbdeed..b4de6d773 100644 --- a/tests/blob/handlers/PageBlobRangesManager.test.ts +++ b/tests/blob/handlers/PageBlobRangesManager.test.ts @@ -3,7 +3,7 @@ import assert = require("assert"); import PageBlobRangesManager from "../../../src/blob/handlers/PageBlobRangesManager"; describe("PageBlobRangesManager", () => { - it("selectImpactedRanges", () => { + it("selectImpactedRanges @loki @sql", () => { const testCases = [ { ranges: [], diff --git a/tests/blob/sas.test.ts b/tests/blob/sas.test.ts index 888938436..5441fd845 100644 --- a/tests/blob/sas.test.ts +++ b/tests/blob/sas.test.ts @@ -53,7 +53,7 @@ describe("Shared Access Signature (SAS) authentication", () => { await server.clean(); }); - it("generateAccountSASQueryParameters should work", async () => { + it("generateAccountSASQueryParameters should work @loki @sql", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -87,7 +87,7 @@ describe("Shared Access Signature (SAS) authentication", () => { await serviceURLWithSAS.getAccountInfo(Aborter.none); }); - it("generateAccountSASQueryParameters should work for set blob tier", async () => { + it("generateAccountSASQueryParameters should work for set blob tier @loki @sql", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -133,7 +133,7 @@ describe("Shared Access Signature (SAS) authentication", () => { await blockBlobURLWithSAS.setTier(Aborter.none, "Hot"); }); - it("generateAccountSASQueryParameters should not work with invalid permission", async () => { + it("generateAccountSASQueryParameters should not work with invalid permission @loki @sql", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -167,7 +167,7 @@ describe("Shared Access Signature (SAS) authentication", () => { assert.ok(error); }); - it("generateAccountSASQueryParameters should not work with invalid service", async () => { + it("generateAccountSASQueryParameters should not work with invalid service @loki @sql", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -201,7 +201,7 @@ describe("Shared Access Signature (SAS) authentication", () => { assert.ok(error); }); - it("generateAccountSASQueryParameters should not work with invalid resource type", async () => { + it("generateAccountSASQueryParameters should not work with invalid resource type @loki @sql", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -238,7 +238,7 @@ describe("Shared Access Signature (SAS) authentication", () => { assert.ok(error); }); - it("Copy blob should work with write permission in account SAS to override an existing blob", async () => { + it("Copy blob should work with write permission in account SAS to override an existing blob @loki", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -284,7 +284,7 @@ describe("Shared Access Signature (SAS) authentication", () => { await blob2.startCopyFromURL(Aborter.none, blob1.url); }); - it("Copy blob shouldn't work without write permission in account SAS to override an existing blob", async () => { + it("Copy blob shouldn't work without write permission in account SAS to override an existing blob @loki", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -337,7 +337,7 @@ describe("Shared Access Signature (SAS) authentication", () => { assert.ok(error !== undefined); }); - it("Copy blob should work without write permission in account SAS to an nonexisting blob", async () => { + it("Copy blob should work without write permission in account SAS to an nonexisting blob @loki", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -382,7 +382,7 @@ describe("Shared Access Signature (SAS) authentication", () => { await blob2.startCopyFromURL(Aborter.none, blob1.url); }); - it("generateBlobSASQueryParameters should work for container", async () => { + it("generateBlobSASQueryParameters should work for container @loki @sql", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -420,7 +420,7 @@ describe("Shared Access Signature (SAS) authentication", () => { await containerURL.delete(Aborter.none); }); - it("generateBlobSASQueryParameters should work for blob", async () => { + it("generateBlobSASQueryParameters should work for blob @loki @sql", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -481,7 +481,7 @@ describe("Shared Access Signature (SAS) authentication", () => { await containerURL.delete(Aborter.none); }); - it("generateBlobSASQueryParameters should work for blob with special naming", async () => { + it("generateBlobSASQueryParameters should work for blob with special naming @loki @sql", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -546,7 +546,7 @@ describe("Shared Access Signature (SAS) authentication", () => { await containerURL.delete(Aborter.none); }); - it("generateBlobSASQueryParameters should work for blob with access policy", async () => { + it("generateBlobSASQueryParameters should work for blob with access policy @loki @sql", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -599,7 +599,7 @@ describe("Shared Access Signature (SAS) authentication", () => { await containerURL.delete(Aborter.none); }); - it("Copy blob should work with write permission in blob SAS to override an existing blob", async () => { + it("Copy blob should work with write permission in blob SAS to override an existing blob @loki", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -649,7 +649,7 @@ describe("Shared Access Signature (SAS) authentication", () => { await blob2SAS.startCopyFromURL(Aborter.none, blob1.url); }); - it("Copy blob shouldn't work without write permission in blob SAS to override an existing blob", async () => { + it("Copy blob shouldn't work without write permission in blob SAS to override an existing blob @loki", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -706,7 +706,7 @@ describe("Shared Access Signature (SAS) authentication", () => { assert.ok(error !== undefined); }); - it("Copy blob should work without write permission in account SAS to an nonexisting blob", async () => { + it("Copy blob should work without write permission in account SAS to an nonexisting blob @loki", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -754,7 +754,7 @@ describe("Shared Access Signature (SAS) authentication", () => { await blob2SAS.startCopyFromURL(Aborter.none, blob1.url); }); - it("GenerateUserDelegationSAS should work for blob snapshot", async () => { + it("GenerateUserDelegationSAS should work for blob snapshot @loki @sql", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server diff --git a/tests/blob/specialnaming.test.ts b/tests/blob/specialnaming.test.ts index 052a439da..5e4703d3d 100644 --- a/tests/blob/specialnaming.test.ts +++ b/tests/blob/specialnaming.test.ts @@ -49,7 +49,7 @@ describe("SpecialNaming", () => { await server.clean(); }); - it("Should work with special container and blob names with spaces", async () => { + it("Should work with special container and blob names with spaces @loki @sql", async () => { const blobName: string = getUniqueName("blob empty"); const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, blobName); @@ -65,7 +65,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special container and blob names with unicode", async () => { + it("Should work with special container and blob names with unicode @loki @sql", async () => { const blobName: string = getUniqueName("unicod\u00e9"); const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, blobName); @@ -82,7 +82,7 @@ describe("SpecialNaming", () => { assert.deepStrictEqual(response.segment.blobItems[0].name, blobName); }); - it("Should work with special container and blob names with spaces in URL string", async () => { + it("Should work with special container and blob names with spaces in URL string @loki @sql", async () => { const blobName: string = getUniqueName("blob empty"); const blockBlobURL = new BlockBlobURL( appendToURLPath(containerURL.url, blobName), @@ -101,7 +101,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special container and blob names with /", async () => { + it("Should work with special container and blob names with / @loki @sql", async () => { const blobName: string = getUniqueName("////blob/empty /another"); const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, blobName); @@ -118,7 +118,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special container and blob names with / in URL string", async () => { + it("Should work with special container and blob names with / in URL string @loki @sql", async () => { const blobName: string = getUniqueName("////blob/empty /another"); const blockBlobURL = new BlockBlobURL( appendToURLPath(containerURL.url, blobName), @@ -138,7 +138,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special container and blob names uppercase", async () => { + it("Should work with special container and blob names uppercase @loki @sql", async () => { const blobName: string = getUniqueName("////Upper/blob/empty /another"); const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, blobName); @@ -155,7 +155,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special container and blob names uppercase in URL string", async () => { + it("Should work with special container and blob names uppercase in URL string @loki @sql", async () => { const blobName: string = getUniqueName("////Upper/blob/empty /another"); const blockBlobURL = new BlockBlobURL( appendToURLPath(containerURL.url, blobName), @@ -175,7 +175,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob names Chinese characters", async () => { + it("Should work with special blob names Chinese characters @loki @sql", async () => { const blobName: string = getUniqueName( "////Upper/blob/empty /another 汉字" ); @@ -194,7 +194,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob names Chinese characters in URL string", async () => { + it("Should work with special blob names Chinese characters in URL string @loki @sql", async () => { const blobName: string = getUniqueName( "////Upper/blob/empty /another 汉字" ); @@ -216,7 +216,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob name characters", async () => { + it("Should work with special blob name characters @loki @sql", async () => { const blobName: string = getUniqueName( "汉字. special ~!@#$%^&*()_+`1234567890-={}|[]\\:\";'<>?,/'" ); @@ -236,7 +236,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob name characters in URL string", async () => { + it("Should work with special blob name characters in URL string @loki @sql", async () => { const blobName: string = getUniqueName( "汉字. special ~!@#$%^&*()_+`1234567890-={}|[]\\:\";'<>?,/'" ); @@ -265,7 +265,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob name Russian URI encoded", async () => { + it("Should work with special blob name Russian URI encoded @loki @sql", async () => { const blobName: string = getUniqueName("ру́сский язы́к"); const blobNameEncoded: string = encodeURIComponent(blobName); const blockBlobURL = BlockBlobURL.fromContainerURL( @@ -286,7 +286,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob name Russian", async () => { + it("Should work with special blob name Russian @loki @sql", async () => { const blobName: string = getUniqueName("ру́сский язы́к"); const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, blobName); @@ -303,7 +303,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob name Russian in URL string", async () => { + it("Should work with special blob name Russian in URL string @loki @sql", async () => { const blobName: string = getUniqueName("ру́сский язы́к"); const blockBlobURL = new BlockBlobURL( appendToURLPath(containerURL.url, blobName), @@ -323,7 +323,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob name Arabic URI encoded", async () => { + it("Should work with special blob name Arabic URI encoded @loki @sql", async () => { const blobName: string = getUniqueName("عربي/عربى"); const blobNameEncoded: string = encodeURIComponent(blobName); const blockBlobURL = BlockBlobURL.fromContainerURL( @@ -344,7 +344,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob name Arabic", async () => { + it("Should work with special blob name Arabic @loki @sql", async () => { const blobName: string = getUniqueName("عربي/عربى"); const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, blobName); @@ -361,7 +361,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob name Arabic in URL string", async () => { + it("Should work with special blob name Arabic in URL string @loki @sql", async () => { const blobName: string = getUniqueName("عربي/عربى"); const blockBlobURL = new BlockBlobURL( appendToURLPath(containerURL.url, blobName), @@ -381,7 +381,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob name Japanese URI encoded", async () => { + it("Should work with special blob name Japanese URI encoded @loki @sql", async () => { const blobName: string = getUniqueName("にっぽんご/にほんご"); const blobNameEncoded: string = encodeURIComponent(blobName); const blockBlobURL = BlockBlobURL.fromContainerURL( @@ -402,7 +402,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob name Japanese", async () => { + it("Should work with special blob name Japanese @loki @sql", async () => { const blobName: string = getUniqueName("にっぽんご/にほんご"); const blockBlobURL = BlockBlobURL.fromContainerURL(containerURL, blobName); @@ -419,7 +419,7 @@ describe("SpecialNaming", () => { assert.notDeepEqual(response.segment.blobItems.length, 0); }); - it("Should work with special blob name Japanese in URL string", async () => { + it("Should work with special blob name Japanese in URL string @loki @sql", async () => { const blobName: string = getUniqueName("にっぽんご/にほんご"); const blockBlobURL = new BlockBlobURL( appendToURLPath(containerURL.url, blobName), diff --git a/tests/queue/apis/messageid.test.ts b/tests/queue/apis/messageid.test.ts index 3c7adfa4b..e36f45afd 100644 --- a/tests/queue/apis/messageid.test.ts +++ b/tests/queue/apis/messageid.test.ts @@ -89,7 +89,7 @@ describe("MessageId APIs test", () => { await queueURL.delete(Aborter.none); }); - it("update and delete empty message with default parameters", async () => { + it("update and delete empty message with default parameters @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let eResult = await messagesURL.enqueue(Aborter.none, messageContent); assert.ok(eResult.date); @@ -150,7 +150,7 @@ describe("MessageId APIs test", () => { assert.equal(pResult.peekedMessageItems.length, 0); }); - it("update and delete message with all parameters", async () => { + it("update and delete message with all parameters @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let eResult = await messagesURL.enqueue(Aborter.none, messageContent); assert.ok(eResult.date); @@ -204,7 +204,7 @@ describe("MessageId APIs test", () => { ); }); - it("update message with 64KB characters size which is computed after encoding", async () => { + it("update message with 64KB characters size which is computed after encoding @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let eResult = await messagesURL.enqueue(Aborter.none, messageContent); assert.ok(eResult.date); @@ -253,7 +253,7 @@ describe("MessageId APIs test", () => { ); }); - it("update message negative with 65537B (64KB+1B) characters size which is computed after encoding", async () => { + it("update message negative with 65537B (64KB+1B) characters size which is computed after encoding @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let eResult = await messagesURL.enqueue(Aborter.none, messageContent); assert.ok(eResult.date); @@ -291,7 +291,7 @@ describe("MessageId APIs test", () => { ); }); - it("delete message negative", async () => { + it("delete message negative @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let eResult = await messagesURL.enqueue(Aborter.none, messageContent); diff --git a/tests/queue/apis/messages.test.ts b/tests/queue/apis/messages.test.ts index f48779f26..1507ac52c 100644 --- a/tests/queue/apis/messages.test.ts +++ b/tests/queue/apis/messages.test.ts @@ -86,7 +86,7 @@ describe("Messages APIs test", () => { await queueURL.delete(Aborter.none); }); - it("enqueue, peek, dequeue and clear message with default parameters", async () => { + it("enqueue, peek, dequeue and clear message with default parameters @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let eResult = await messagesURL.enqueue(Aborter.none, messageContent); assert.ok(eResult.date); @@ -148,7 +148,7 @@ describe("Messages APIs test", () => { assert.deepStrictEqual(pResult2.peekedMessageItems.length, 0); }); - it("enqueue, peek, dequeue and clear message with all parameters", async () => { + it("enqueue, peek, dequeue and clear message with all parameters @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let eResult = await messagesURL.enqueue(Aborter.none, messageContent, { @@ -257,7 +257,7 @@ describe("Messages APIs test", () => { assert.deepStrictEqual(pResult2.peekedMessageItems.length, 0); }); - it("enqueue, peek, dequeue empty message, and peek, dequeue with numberOfMessages > count(messages)", async () => { + it("enqueue, peek, dequeue empty message, and peek, dequeue with numberOfMessages > count(messages) @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let eResult = await messagesURL.enqueue(Aborter.none, "", { @@ -319,7 +319,7 @@ describe("Messages APIs test", () => { assert.ok(dResult.dequeuedMessageItems[0].timeNextVisible); }); - it("enqueue, peek, dequeue special characters", async () => { + it("enqueue, peek, dequeue special characters @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let specialMessage = @@ -390,7 +390,7 @@ describe("Messages APIs test", () => { assert.ok(dResult.dequeuedMessageItems[0].timeNextVisible); }); - it("enqueue, peek, dequeue with 64KB characters size which is computed after encoding", async () => { + it("enqueue, peek, dequeue with 64KB characters size which is computed after encoding @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let messageContent = new Array(64 * 1024 + 1).join("a"); @@ -459,7 +459,7 @@ describe("Messages APIs test", () => { assert.ok(dResult.dequeuedMessageItems[0].timeNextVisible); }); - it("enqueue, peek and dequeue negative", async () => { + it("enqueue, peek and dequeue negative @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let eResult = await messagesURL.enqueue(Aborter.none, messageContent, { messageTimeToLive: 40 @@ -520,7 +520,7 @@ describe("Messages APIs test", () => { }); }); - it("enqueue negative with 65537B(64KB+1B) characters size which is computed after encoding", async () => { + it("enqueue negative with 65537B(64KB+1B) characters size which is computed after encoding @loki", async () => { let messagesURL = MessagesURL.fromQueueURL(queueURL); let messageContent = new Array(64 * 1024 + 2).join("a"); diff --git a/tests/queue/apis/queue.test.ts b/tests/queue/apis/queue.test.ts index 264208b45..5e55026bd 100644 --- a/tests/queue/apis/queue.test.ts +++ b/tests/queue/apis/queue.test.ts @@ -84,7 +84,7 @@ describe("Queue APIs test", () => { await queueURL.delete(Aborter.none); }); - it("setMetadata", async () => { + it("setMetadata @loki", async () => { const metadata = { key0: "val0", keya: "vala", @@ -104,7 +104,7 @@ describe("Queue APIs test", () => { ); }); - it("getProperties with default/all parameters", async () => { + it("getProperties with default/all parameters @loki", async () => { const result = await queueURL.getProperties(Aborter.none); assert.ok(result.approximateMessagesCount! >= 0); assert.ok(result.requestId); @@ -112,7 +112,7 @@ describe("Queue APIs test", () => { assert.ok(result.date); }); - it("getProperties negative", async () => { + it("getProperties negative @loki", async () => { const queueName2 = getUniqueName("queue2"); const queueURL2 = QueueURL.fromServiceURL(serviceURL, queueName2); let error; @@ -134,7 +134,7 @@ describe("Queue APIs test", () => { done(); }); - it("create with all parameters", async () => { + it("create with all parameters @loki", async () => { const qURL = QueueURL.fromServiceURL(serviceURL, getUniqueName(queueName)); const metadata = { key: "value" }; await qURL.create(Aborter.none, { metadata }); @@ -143,7 +143,7 @@ describe("Queue APIs test", () => { }); // create with invalid queue name - it("create negative", async () => { + it("create negative @loki", async () => { const qURL = QueueURL.fromServiceURL(serviceURL, ""); let error; try { @@ -159,12 +159,12 @@ describe("Queue APIs test", () => { assert.ok(error.response.body.includes("InvalidResourceName")); }); - it("delete", done => { + it("delete @loki", done => { // delete() with default parameters has been tested in afterEach done(); }); - it("SetAccessPolicy should work", async () => { + it("SetAccessPolicy should work @loki", async () => { const queueAcl = [ { accessPolicy: { @@ -197,7 +197,7 @@ describe("Queue APIs test", () => { result.clientRequestId ); }); - it("setAccessPolicy negative", async () => { + it("setAccessPolicy negative @loki", async () => { const queueAcl = [ { accessPolicy: { diff --git a/tests/queue/apis/queueService.test.ts b/tests/queue/apis/queueService.test.ts index 1ea19eea3..9dc0bf93d 100644 --- a/tests/queue/apis/queueService.test.ts +++ b/tests/queue/apis/queueService.test.ts @@ -72,7 +72,7 @@ describe("QueueServiceAPIs", () => { await rmRecursive(persistencePath); }); - it("Get Queue service properties", async () => { + it("Get Queue service properties @loki", async () => { const result = await serviceURL.getProperties(Aborter.none); assert.ok(typeof result.requestId); @@ -89,7 +89,7 @@ describe("QueueServiceAPIs", () => { } }); - it("Set CORS with empty AllowedHeaders, ExposedHeaders", async () => { + it("Set CORS with empty AllowedHeaders, ExposedHeaders @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -108,7 +108,7 @@ describe("QueueServiceAPIs", () => { assert.deepStrictEqual(result.cors![0], newCORS); }); - it("Set Queue service properties", async () => { + it("Set Queue service properties @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); assert.equal( serviceProperties._response.request.headers.get("x-ms-client-request-id"), @@ -178,7 +178,7 @@ describe("QueueServiceAPIs", () => { assert.deepEqual(result.hourMetrics, serviceProperties.hourMetrics); }); - it("listQueuesSegment with default parameters", async () => { + it("listQueuesSegment with default parameters @loki", async () => { const result = await serviceURL.listQueuesSegment(Aborter.none); assert.ok(typeof result.requestId); assert.ok(result.requestId!.length > 0); @@ -198,7 +198,7 @@ describe("QueueServiceAPIs", () => { } }); - it("listQueuesSegment with all parameters", async () => { + it("listQueuesSegment with all parameters @loki", async () => { const queueNamePrefix = getUniqueName("queue"); const queueName1 = `${queueNamePrefix}x1`; const queueName2 = `${queueNamePrefix}x2`; diff --git a/tests/queue/queueAuthentication.test.ts b/tests/queue/queueAuthentication.test.ts index b5c763b2b..cdba2bc0f 100644 --- a/tests/queue/queueAuthentication.test.ts +++ b/tests/queue/queueAuthentication.test.ts @@ -64,7 +64,7 @@ describe("Queue Authentication", () => { await rmRecursive(persistencePath); }); - it("Should not work without credential", async () => { + it("Should not work without credential @loki", async () => { const serviceURL = new ServiceURL( baseURL, StorageURL.newPipeline(new AnonymousCredential(), { @@ -92,7 +92,7 @@ describe("Queue Authentication", () => { } }); - it("Should not work without correct account name", async () => { + it("Should not work without correct account name @loki", async () => { const serviceURL = new ServiceURL( baseURL, StorageURL.newPipeline( @@ -123,7 +123,7 @@ describe("Queue Authentication", () => { } }); - it("Should not work without correct account key", async () => { + it("Should not work without correct account key @loki", async () => { const serviceURL = new ServiceURL( baseURL, StorageURL.newPipeline( @@ -154,7 +154,7 @@ describe("Queue Authentication", () => { } }); - it("Should work with correct shared key", async () => { + it("Should work with correct shared key @loki", async () => { const serviceURL = new ServiceURL( baseURL, StorageURL.newPipeline( diff --git a/tests/queue/queueCorsRequest.test.ts b/tests/queue/queueCorsRequest.test.ts index b0d0852b1..b81ddd0dc 100644 --- a/tests/queue/queueCorsRequest.test.ts +++ b/tests/queue/queueCorsRequest.test.ts @@ -72,7 +72,7 @@ describe("Queue Cors requests test", () => { await rmRecursive(persistencePath); }); - it("OPTIONS request without cors rules in server should be fail", async () => { + it("OPTIONS request without cors rules in server should be fail @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); serviceProperties.cors = []; await serviceURL.setProperties(Aborter.none, serviceProperties); @@ -106,7 +106,7 @@ describe("Queue Cors requests test", () => { ); }); - it("OPTIONS request should not work without matching cors rules", async () => { + it("OPTIONS request should not work without matching cors rules @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -169,7 +169,7 @@ describe("Queue Cors requests test", () => { assert.ok(res._response.status === 200); }); - it("OPTIONS request should not work without Origin header or matching allowedOrigins", async () => { + it("OPTIONS request should not work without Origin header or matching allowedOrigins @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -239,7 +239,7 @@ describe("Queue Cors requests test", () => { ); }); - it("OPTIONS request should not work without requestMethod header or matching allowedMethods", async () => { + it("OPTIONS request should not work without requestMethod header or matching allowedMethods @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -307,7 +307,7 @@ describe("Queue Cors requests test", () => { ); }); - it("OPTIONS request should check the defined requestHeaders", async () => { + it("OPTIONS request should check the defined requestHeaders @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = [ @@ -458,7 +458,7 @@ describe("Queue Cors requests test", () => { assert.ok(res._response.status === 200); }); - it("OPTIONS request should work with matching rule containing Origion *", async () => { + it("OPTIONS request should work with matching rule containing Origion * @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -493,7 +493,7 @@ describe("Queue Cors requests test", () => { assert.ok(res._response.status === 200); }); - it("Response of request to service without cors rules should not contains cors info", async () => { + it("Response of request to service without cors rules should not contains cors info @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); serviceProperties.cors = []; @@ -519,7 +519,7 @@ describe("Queue Cors requests test", () => { assert.ok(res.vary === undefined); }); - it("Service with mismatching cors rules should response header Vary", async () => { + it("Service with mismatching cors rules should response header Vary @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -553,7 +553,7 @@ describe("Queue Cors requests test", () => { assert.ok(res.vary === undefined); }); - it("Request Match rule exists that allows all origins (*)", async () => { + it("Request Match rule exists that allows all origins (*) @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -591,7 +591,7 @@ describe("Queue Cors requests test", () => { assert.ok(res["access-control-expose-headers"] === undefined); }); - it("Request Match rule exists for exact origin", async () => { + it("Request Match rule exists for exact origin @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -624,7 +624,7 @@ describe("Queue Cors requests test", () => { assert.ok(res["access-control-expose-headers"] !== undefined); }); - it("Requests with error response should apply for CORS", async () => { + it("Requests with error response should apply for CORS @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = { @@ -671,7 +671,7 @@ describe("Queue Cors requests test", () => { } }); - it("Request Match rule in sequence", async () => { + it("Request Match rule in sequence @loki", async () => { const serviceProperties = await serviceURL.getProperties(Aborter.none); const newCORS = [ diff --git a/tests/queue/queueSas.test.ts b/tests/queue/queueSas.test.ts index 54b1441d7..61d524ca2 100644 --- a/tests/queue/queueSas.test.ts +++ b/tests/queue/queueSas.test.ts @@ -83,7 +83,7 @@ describe("Queue SAS test", () => { await rmRecursive(persistencePath); }); - it("generateAccountSASQueryParameters should work", async () => { + it("generateAccountSASQueryParameters should work @loki", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -117,7 +117,7 @@ describe("Queue SAS test", () => { await serviceURLWithSAS.getProperties(Aborter.none); }); - it("generateAccountSASQueryParameters should not work with invalid permission", async () => { + it("generateAccountSASQueryParameters should not work with invalid permission @loki", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -152,7 +152,7 @@ describe("Queue SAS test", () => { assert.deepEqual(error.statusCode, 403); }); - it("generateAccountSASQueryParameters should not work with invalid service", async () => { + it("generateAccountSASQueryParameters should not work with invalid service @loki", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -186,7 +186,7 @@ describe("Queue SAS test", () => { assert.deepEqual(error.statusCode, 403); }); - it("generateAccountSASQueryParameters should not work with invalid resource type", async () => { + it("generateAccountSASQueryParameters should not work with invalid resource type @loki", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -223,7 +223,7 @@ describe("Queue SAS test", () => { assert.deepEqual(error.statusCode, 403); }); - it("Create queue should work with write (w) or create (c) permission in account SAS", async () => { + it("Create queue should work with write (w) or create (c) permission in account SAS @loki", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -282,7 +282,7 @@ describe("Queue SAS test", () => { await queueURL2.delete(Aborter.none); }); - it("Create queue shouldn't work without write (w) and create (c) permission in account SAS", async () => { + it("Create queue shouldn't work without write (w) and create (c) permission in account SAS @loki", async () => { const tmr = new Date(); tmr.setDate(tmr.getDate() + 1); @@ -322,7 +322,7 @@ describe("Queue SAS test", () => { assert.ok(error !== undefined); }); - it("generateAccountSASQueryParameters should work for queue", async () => { + it("generateAccountSASQueryParameters should work for queue @loki", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -361,7 +361,7 @@ describe("Queue SAS test", () => { await queueURL.delete(Aborter.none); }); - it("Get/Set ACL with AccountSAS is not allowed", async () => { + it("Get/Set ACL with AccountSAS is not allowed @loki", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -421,7 +421,7 @@ describe("Queue SAS test", () => { await queueURL.delete(Aborter.none); }); - it("generateAccountSASQueryParameters should work for messages", async () => { + it("generateAccountSASQueryParameters should work for messages @loki", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -474,7 +474,7 @@ describe("Queue SAS test", () => { await queueURL.delete(Aborter.none); }); - it("generateAccountSASQueryParameters should work for messages", async () => { + it("generateAccountSASQueryParameters should work for messages @loki", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -527,7 +527,7 @@ describe("Queue SAS test", () => { await queueURL.delete(Aborter.none); }); - it("generateQueueSASQueryParameters should work for queue", async () => { + it("generateQueueSASQueryParameters should work for queue @loki", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -565,7 +565,7 @@ describe("Queue SAS test", () => { await queueURL.delete(Aborter.none); }); - it("generateQueueSASQueryParameters should work for messages", async () => { + it("generateQueueSASQueryParameters should work for messages @loki", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server @@ -627,7 +627,7 @@ describe("Queue SAS test", () => { await queueURL.delete(Aborter.none); }); - it("generateQueueSASQueryParameters should work for queue with access policy", async () => { + it("generateQueueSASQueryParameters should work for queue with access policy @loki", async () => { const now = new Date(); now.setMinutes(now.getMinutes() - 5); // Skip clock skew with server diff --git a/tests/queue/queueSpecialnaming.test.ts b/tests/queue/queueSpecialnaming.test.ts index d7a079ecd..1eb010d07 100644 --- a/tests/queue/queueSpecialnaming.test.ts +++ b/tests/queue/queueSpecialnaming.test.ts @@ -71,7 +71,7 @@ describe("Queue SpecialNaming", () => { await rmRecursive(persistencePath); }); - it("A queue name must be from 3 through 63 characters long", async () => { + it("A queue name must be from 3 through 63 characters long @loki", async () => { let queueName = new Array(65).join("a"); let queueURL = QueueURL.fromServiceURL(serviceURL, queueName); let error; @@ -113,7 +113,7 @@ describe("Queue SpecialNaming", () => { await queueURL.delete(Aborter.none); }); - it("All letters in a queue name must be lowercase.", async () => { + it("All letters in a queue name must be lowercase. @loki", async () => { let queueName = "Queue"; let queueURL = QueueURL.fromServiceURL(serviceURL, queueName); let error; @@ -135,7 +135,7 @@ describe("Queue SpecialNaming", () => { await queueURL.delete(Aborter.none); }); - it("A queue name contains only letters, numbers, and the dash (-) character in rules", async () => { + it("A queue name contains only letters, numbers, and the dash (-) character in rules @loki", async () => { let queueName = "-queue123"; let queueURL = QueueURL.fromServiceURL(serviceURL, queueName); let error; diff --git a/tests/testutils.ts b/tests/testutils.ts index abd649b8b..8258ecc4e 100644 --- a/tests/testutils.ts +++ b/tests/testutils.ts @@ -173,135 +173,3 @@ export async function readStreamToLocalFile( ws.on("finish", resolve); }); } - -// export class TestSuiteManager { -// private server?: ServerBase; - -// public constructor(public serverFactory: IServerFactory) {} - -// public async beforeSuite() { -// this.server = await this.serverFactory.createServer(); -// await this.server.start(); -// } - -// public async afterSuite() { -// if (this.server) { -// await this.server.close(); -// await this.server.clean(); -// } -// } -// } - -// export class TestServerFactory { -// static host = "127.0.0.1"; -// static port = 11000; -// static persistenceArray: StoreDestinationArray = [ -// { -// persistencyId: "test", -// persistencyPath: "__testsblobpersistence__", -// maxConcurrency: 10 -// } -// ]; -// static dbPath = "__testsblobstorage__"; -// static extentdbPath = "__testsblobextentstorage__"; - -// static DEFUALT_SQL_URI = -// "mariadb://root:my-secret-pw@127.0.0.1:3306/azurite_blob_metadata"; -// static DEFUALT_SQL_OPTIONS = { -// logging: false, -// pool: { -// max: 100, -// min: 0, -// acquire: 30000, -// idle: 10000 -// }, -// dialectOptions: { -// timezone: "Etc/GMT-0" -// } -// }; - -// static serverType = process.env.AZURITE_TEST_SERVER; - -// public static getHost() { -// return this.host; -// } - -// public static getPort() { -// return this.port; -// } - -// public static getLoki(): BlobConfiguration { -// const config = new BlobConfiguration( -// this.host, -// this.port, -// this.dbPath, -// this.extentdbPath, -// this.persistenceArray, -// false -// ); -// return config; -// } - -// public static getSql(): SqlBlobConfiguration { -// const config = new SqlBlobConfiguration( -// this.host, -// this.port, -// this.DEFUALT_SQL_URI, -// this.DEFUALT_SQL_OPTIONS, -// this.dbPath, -// this.persistenceArray, -// false -// ); -// return config; -// } - -// public static getServer(host?: string, port?: number): ServerBase { -// this.getServerType(); - -// this.serverType = "loki"; - -// if (this.serverType === "sql") { -// // console.log("SqlServer"); -// return this.getSqlServer(host, port); -// } else { -// // console.log("LokiServer"); -// return this.getLokiServer(host, port); -// } -// } - -// public static getSqlServer(host?: string, port?: number) { -// const config = this.getSql(); -// const _host = host || config.host; -// const _port = port || config.port; - -// return new SqlBlobServer({ -// host: _host, -// port: _port, -// ...config -// }); -// } - -// public static getLokiServer(host?: string, port?: number) { -// const config = this.getLoki(); -// const _host = host || config.host; -// const _port = port || config.port; - -// return new BlobServer({ -// host: _host, -// port: _port, -// ...config -// }); -// } - -// public static async rmTestFile() { -// await rmRecursive(this.dbPath); -// await rmRecursive(this.extentdbPath); -// for (const persistence of this.persistenceArray) { -// await rmRecursive(persistence.persistencyPath); -// } -// } - -// private static getServerType() { -// this.serverType = process.env.AZURITE_TEST_SERVER; -// } -// } From 3e3d6cd20c4658dad7d44aa2a7c5829bd2187a2f Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Tue, 24 Dec 2019 22:32:35 +0800 Subject: [PATCH 26/34] fix 2 etag issues (#359) --- ChangeLog.md | 2 ++ src/blob/handlers/ContainerHandler.ts | 26 +++++++++++-------- src/blob/persistence/LokiBlobMetadataStore.ts | 3 ++- src/blob/persistence/SqlBlobMetadataStore.ts | 5 ++-- src/blob/utils/utils.ts | 16 ++++++++++++ tests/blob/apis/container.test.ts | 15 +++++++++-- 6 files changed, 50 insertions(+), 17 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index bada693f4..6c07e4885 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -31,6 +31,8 @@ Blob: - Fixed a bug that GC will remove uncommitted blocks. - Fixed a bug that download page blob doesn't return content range header. - Fixed a bug that uncommitted block blob invalid length. +- Fixed a bug that SetHTTPHeaders, SetMetadata won't update blob etag. +- Remove double quotation marks from list blob request returned blob etag, to align with Azure Server behavior. Queue: diff --git a/src/blob/handlers/ContainerHandler.ts b/src/blob/handlers/ContainerHandler.ts index 6d879a1a8..7dc5940aa 100644 --- a/src/blob/handlers/ContainerHandler.ts +++ b/src/blob/handlers/ContainerHandler.ts @@ -8,7 +8,7 @@ import { EMULATOR_ACCOUNT_SKUNAME } from "../utils/constants"; import { DEFAULT_LIST_BLOBS_MAX_RESULTS } from "../utils/constants"; -import { newEtag } from "../utils/utils"; +import { newEtag, removeQuotationFromListBlobEtag } from "../utils/utils"; import BaseHandler from "./BaseHandler"; /** @@ -540,13 +540,6 @@ export default class ContainerHandler extends BaseHandler includeSnapshots ); - const blobItems: Models.BlobItem[] = []; - - for (const blob of blobs) { - blob.deleted = blob.deleted !== true ? undefined : true; - blobItems.push(blob); - } - const serviceEndpoint = `${request.getEndpoint()}/${accountName}`; const response: Models.ContainerListBlobFlatSegmentResponse = { statusCode: 200, @@ -565,7 +558,10 @@ export default class ContainerHandler extends BaseHandler return { ...item, deleted: item.deleted !== true ? undefined : true, - properties: { ...item.properties, etag: item.properties.etag } + properties: { + ...item.properties, + etag: removeQuotationFromListBlobEtag(item.properties.etag) + } }; }) }, @@ -671,8 +667,16 @@ export default class ContainerHandler extends BaseHandler maxResults: options.maxresults, delimiter, segment: { - blobItems, - blobPrefixes + blobPrefixes, + blobItems: blobItems.map(item => { + return { + ...item, + properties: { + ...item.properties, + etag: removeQuotationFromListBlobEtag(item.properties.etag) + } + }; + }) }, clientRequestId: options.requestId, nextMarker: `${nextMarker || ""}` diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index c923fe631..920653ae8 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -1261,7 +1261,7 @@ export default class LokiBlobMetadataStore : new Date(); } doc.properties = blobProps; - doc.properties.etag = uuid(); + doc.properties.etag = newEtag(); new BlobWriteLeaseSyncer(doc).sync(lease); @@ -1302,6 +1302,7 @@ export default class LokiBlobMetadataStore new BlobWriteLeaseValidator(leaseAccessConditions).validate(lease, context); new BlobWriteLeaseSyncer(doc).sync(lease); doc.metadata = metadata; + doc.properties.etag = newEtag(); coll.update(doc); return doc.properties; } diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index f9352a1d7..80e211487 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -9,7 +9,6 @@ import { Sequelize, TEXT } from "sequelize"; -import uuid from "uuid/v4"; import { DEFAULT_SQL_CHARSET, @@ -1907,7 +1906,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { : new Date(); } - blobModel.properties.etag = uuid(); + blobModel.properties.etag = newEtag(); await BlobsModel.update(this.convertBlobModelToDbModel(blobModel), { where: { @@ -1969,7 +1968,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { .sync(new BlobWriteLeaseSyncer(blobModel)); const lastModified = context.startTime! || new Date(); - const etag = uuid(); + const etag = newEtag(); await BlobsModel.update( { diff --git a/src/blob/utils/utils.ts b/src/blob/utils/utils.ts index c70c8bc54..d0abd6204 100644 --- a/src/blob/utils/utils.ts +++ b/src/blob/utils/utils.ts @@ -202,3 +202,19 @@ export function deserializePageBlobRangeHeader( return [startInclusive, endInclusive]; } + +/** + * Remove double Quotation mark from ListBlob returned Etag, to align with server + * + * @param {string} [inputEtag] + * @returns {string} + */ +export function removeQuotationFromListBlobEtag(inputEtag: string): string { + if (inputEtag === undefined) { + return inputEtag; + } + if (inputEtag[0] === '"' && inputEtag[inputEtag.length - 1] === '"') { + return inputEtag.substring(1, inputEtag.length - 1); + } + return inputEtag; +} diff --git a/tests/blob/apis/container.test.ts b/tests/blob/apis/container.test.ts index 0be89487c..479d400d4 100644 --- a/tests/blob/apis/container.test.ts +++ b/tests/blob/apis/container.test.ts @@ -264,6 +264,11 @@ describe("ContainerAPIs", () => { ...metadata }); assert.ok(blobURLs[0].url.indexOf(result3.segment.blobItems![0].name)); + const getResult = await blobURLs[0].getProperties(Aborter.none); + assert.equal( + getResult.eTag, + '"' + result3.segment.blobItems![0].properties.etag + '"' + ); for (const blob of blobURLs) { await blob.delete(Aborter.none); @@ -446,9 +451,15 @@ describe("ContainerAPIs", () => { assert.deepStrictEqual(result.nextMarker, ""); assert.deepStrictEqual(result.segment.blobItems!.length, blobURLs.length); + let i = 0; for (const blob of blobURLs) { - let i = 0; - assert.ok(blob.url.indexOf(result.segment.blobItems![i++].name)); + assert.ok(blob.url.indexOf(result.segment.blobItems![i].name)); + const getResult = await blob.getProperties(Aborter.none); + assert.equal( + getResult.eTag, + '"' + result.segment.blobItems![i].properties.etag + '"' + ); + i++; } for (const blob of blobURLs) { From efe4e9d123304715cb84499653e008cc425d15fd Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Tue, 24 Dec 2019 22:41:47 +0800 Subject: [PATCH 27/34] Added loose mode and block unsupported headers by default (#358) * Added loose mode and block unsupported headers by default * Block set access tier when copy page blob * Disable delete base blob without include snapshot header * Update documents for loose mode --- .vscode/launch.json | 12 +- BreakingChanges.md | 1 + ChangeLog.md | 1 + README.md | 14 +- package.json | 5 + src/azurite.ts | 11 +- src/blob/BlobConfiguration.ts | 6 +- src/blob/BlobEnvironment.ts | 61 +++--- src/blob/BlobRequestListenerFactory.ts | 18 +- src/blob/BlobServer.ts | 3 +- src/blob/BlobServerFactory.ts | 19 +- src/blob/IBlobEnvironment.ts | 1 + src/blob/SqlBlobConfiguration.ts | 6 +- src/blob/SqlBlobRequestListenerFactory.ts | 174 ------------------ src/blob/SqlBlobServer.ts | 7 +- .../errors/StrictModelNotSupportedError.ts | 12 ++ .../StrictModelMiddlewareFactory.ts | 88 +++++++++ src/blob/persistence/LokiBlobMetadataStore.ts | 14 +- src/blob/utils/constants.ts | 9 + src/common/ConfigurationBase.ts | 3 +- src/common/Environment.ts | 20 +- src/common/IEnvironment.ts | 15 +- src/common/VSCEnvironment.ts | 6 +- src/common/VSCQueueEnvironment.ts | 60 ------ src/common/VSCServerManagerBlob.ts | 14 +- src/common/VSCServerManagerQueue.ts | 7 +- src/common/persistence/FSExtentStore.ts | 2 +- .../persistence/LokiExtentMetadataStore.ts | 2 +- src/queue/IQueueEnvironment.ts | 3 +- src/queue/QueueConfiguration.ts | 6 +- src/queue/QueueEnvironment.ts | 20 +- src/queue/main.ts | 7 +- tests/BlobTestServerFactory.ts | 8 +- tests/blob/apis/blob.test.ts | 123 +++++++++++++ tests/blob/blockblob.highlevel.test.ts | 81 ++++---- tests/blob/sas.test.ts | 30 +-- 36 files changed, 485 insertions(+), 384 deletions(-) delete mode 100644 src/blob/SqlBlobRequestListenerFactory.ts create mode 100644 src/blob/errors/StrictModelNotSupportedError.ts create mode 100644 src/blob/middlewares/StrictModelMiddlewareFactory.ts delete mode 100644 src/common/VSCQueueEnvironment.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 8e1857cc9..8f5bfa73f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,7 +7,17 @@ { "type": "node", "request": "launch", - "name": "Azurite Queue Service", + "name": "Azurite Service - Loki", + "cwd": "${workspaceFolder}", + "runtimeArgs": ["-r", "ts-node/register"], + "args": ["${workspaceFolder}/src/azurite.ts", "-d", "debug.log"], + "env": { "AZURITE_ACCOUNTS": "" }, + "outputCapture": "std" + }, + { + "type": "node", + "request": "launch", + "name": "Azurite Queue Service - Loki", "cwd": "${workspaceFolder}", "runtimeArgs": ["-r", "ts-node/register"], "args": ["${workspaceFolder}/src/queue/main.ts", "-d", "debug.log"], diff --git a/BreakingChanges.md b/BreakingChanges.md index 9759cf9b2..2df270251 100644 --- a/BreakingChanges.md +++ b/BreakingChanges.md @@ -7,6 +7,7 @@ - [Breaking] Apply LokiFsStructuredAdapter as default blob metadata loki adapter to improve performance. - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. - [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. Please clean up Azurite previous version workspace data files and restart Azurite. +- [Breaking] By default Azurite will block requests with unsupported headers or parameters which may impact data integrity. Skip this by switching to loose mode by Azurite parameter "--loose". # 2019.11 Version 3.3.0-preview diff --git a/ChangeLog.md b/ChangeLog.md index 6c07e4885..94952ae2e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -9,6 +9,7 @@ - Check input request "x-ms-version" Header, only valid version are allowed. - Fixed a race condition that GC will delete active write extents. - Force flush data into disk before data upload request returns. +- [Breaking] By default Azurite will block requests with unsupported headers or parameters which may impact data integrity. Skip this by switching to loose mode by Azurite parameter "--loose". Blob: diff --git a/README.md b/README.md index ee9cb5f6f..ea5cd18b4 100644 --- a/README.md +++ b/README.md @@ -124,6 +124,7 @@ Following extension configurations are supported: - `azurite.location` Workspace location path, by default existing Visual Studio Code opened folder - `azurite.silent` Silent mode to disable access log in Visual Studio channel, by default false - `azurite.debug` Output debug log into Azurite channel, by default false +- `azurite.loose` Enable loose mode which ignores unsupported headers and parameters, by default false ### [DockerHub](https://hub.docker.com/_/microsoft-azure-storage-azurite) @@ -153,7 +154,7 @@ docker run -p 10000:10000 -p 10001:10001 -v c:/azurite:/data mcr.microsoft.com/a #### Customize all Azurite V3 supported parameters for docker image ```bash -docker run -p 8888:8888 -p 9999:9999 -v c:/azurite:/workspace mcr.microsoft.com/azure-storage/azurite azurite -l /workspace -d /workspace/debug.log --blobPort 8888 --blobHost 0.0.0.0 --queuePort 9999 --queueHost 0.0.0.0 +docker run -p 8888:8888 -p 9999:9999 -v c:/azurite:/workspace mcr.microsoft.com/azure-storage/azurite azurite -l /workspace -d /workspace/debug.log --blobPort 8888 --blobHost 0.0.0.0 --queuePort 9999 --queueHost 0.0.0.0 --loose ``` Above command will try to start Azurite image with configurations: @@ -170,6 +171,8 @@ Above command will try to start Azurite image with configurations: `--queueHost 0.0.0.0` defines queue service listening endpoint to accept requests from host machine. +`--loose` enables loose mode which ignore unsupported headers and parameters + > In above sample, you need to use **double first forward slash** for location and debug path parameters to avoid a [known issue](https://stackoverflow.com/questions/48427366/docker-build-command-add-c-program-files-git-to-the-path-passed-as-build-argu) for Git on Windows. > Will support more release channels for Azurite V3 in the future. @@ -258,6 +261,15 @@ Enable it by providing a valid local file path for the debug log destination. --debug path/debug.log ``` +### Loose Mode Configuration + +Optional. By default Azurite will apply strict mode. Strict mode will block unsupported request headers or parameters. **Disable** it by enabling loose mode: + +```cmd +-L +--loose +``` + ### Command Line Options Differences between Azurite V2 Azurite V3 supports SharedKey, Account Shared Access Signature (SAS), Service SAS and Public Container Access authentications, you can use any Azure Storage SDKs or tools like Storage Explorer to connect Azurite V3 with any authentication strategy. diff --git a/package.json b/package.json index fa9298f1a..5170222a2 100644 --- a/package.json +++ b/package.json @@ -142,6 +142,11 @@ "default": false, "description": "Disable access log into Visual Studio Code channel" }, + "azurite.loose": { + "type": "boolean", + "default": false, + "description": "Enable loose mode which ignores unsupported headers and parameters" + }, "azurite.location": { "type": "string", "description": "Workspace location folder path, by default Visual Studio Code current opened folder" diff --git a/src/azurite.ts b/src/azurite.ts index ef6ef5a40..bb95a294e 100644 --- a/src/azurite.ts +++ b/src/azurite.ts @@ -3,8 +3,10 @@ import { access } from "fs"; import { dirname, join } from "path"; import { promisify } from "util"; -import { BlobServerFactory } from "./blob/BlobServerFactory"; +// Load Environment before BlobServerFactory to make sure args works properly import Environment from "./common/Environment"; +// tslint:disable-next-line:ordered-imports +import { BlobServerFactory } from "./blob/BlobServerFactory"; import * as Logger from "./common/Logger"; import QueueConfiguration from "./queue/QueueConfiguration"; import QueueServer from "./queue/QueueServer"; @@ -29,13 +31,13 @@ async function main() { const location = await env.location(); await accessAsync(location); - const debugFilePath = env.debug(); + const debugFilePath = await env.debug(); if (debugFilePath !== undefined) { await accessAsync(dirname(debugFilePath!)); } const blobServerFactory = new BlobServerFactory(); - const blobServer = await blobServerFactory.createServer(); + const blobServer = await blobServerFactory.createServer(env); const blobConfig = blobServer.config; // TODO: Align with blob DEFAULT_BLOB_PERSISTENCE_ARRAY @@ -53,7 +55,8 @@ async function main() { !env.silent(), undefined, env.debug() !== undefined, - env.debug() + await env.debug(), + env.loose() ); // We use logger singleton as global debugger logger to track detailed outputs cross layers diff --git a/src/blob/BlobConfiguration.ts b/src/blob/BlobConfiguration.ts index 3efae5317..6c60f7684 100644 --- a/src/blob/BlobConfiguration.ts +++ b/src/blob/BlobConfiguration.ts @@ -32,7 +32,8 @@ export default class BlobConfiguration extends ConfigurationBase { enableAccessLog: boolean = DEFAULT_ENABLE_ACCESS_LOG, accessLogWriteStream?: NodeJS.WritableStream, enableDebugLog: boolean = DEFAULT_ENABLE_DEBUG_LOG, - debugLogFilePath?: string + debugLogFilePath?: string, + loose: boolean = false ) { super( host, @@ -40,7 +41,8 @@ export default class BlobConfiguration extends ConfigurationBase { enableAccessLog, accessLogWriteStream, enableDebugLog, - debugLogFilePath + debugLogFilePath, + loose ); } } diff --git a/src/blob/BlobEnvironment.ts b/src/blob/BlobEnvironment.ts index c25ef2a6d..b4efea623 100644 --- a/src/blob/BlobEnvironment.ts +++ b/src/blob/BlobEnvironment.ts @@ -11,29 +11,38 @@ import { const accessAsync = promisify(access); -args - .option( - ["", "blobHost"], - "Optional. Customize listening address for blob", - DEFAULT_BLOB_SERVER_HOST_NAME - ) - .option( - ["", "blobPort"], - "Optional. Customize listening port for blob", - DEFAULT_BLOB_LISTENING_PORT - ) - .option( - "location", - "Optional. Use an existing folder as workspace path, default is current working directory", - process.cwd() - ) - .option("silent", "Optional. Disable access log displayed in console") - .option( - "debug", - "Optional. Enable debug log by providing a valid local file path as log destination" - ); +if (!(args as any).config.name) { + args + .option( + ["", "blobHost"], + "Optional. Customize listening address for blob", + DEFAULT_BLOB_SERVER_HOST_NAME + ) + .option( + ["", "blobPort"], + "Optional. Customize listening port for blob", + DEFAULT_BLOB_LISTENING_PORT + ) + .option( + ["l", "location"], + "Optional. Use an existing folder as workspace path, default is current working directory", + process.cwd() + ) + .option( + ["s", "silent"], + "Optional. Disable access log displayed in console" + ) + .option( + ["L", "loose"], + "Optional. Enable loose mode which ignores unsupported headers and parameters" + ) + .option( + ["d", "debug"], + "Optional. Enable debug log by providing a valid local file path as log destination" + ); -(args as any).config.name = "azurite-queue"; + (args as any).config.name = "azurite-blob"; +} export default class BlobEnvironment implements IBlobEnvironment { private flags = args.parse(process.argv); @@ -59,6 +68,14 @@ export default class BlobEnvironment implements IBlobEnvironment { return false; } + public loose(): boolean { + if (this.flags.loose !== undefined) { + return true; + } + // default is false which will block not supported APIs, headers and parameters + return false; + } + public async debug(): Promise { if (typeof this.flags.debug === "string") { // Enable debug log to file diff --git a/src/blob/BlobRequestListenerFactory.ts b/src/blob/BlobRequestListenerFactory.ts index f5b287f4b..47425553a 100644 --- a/src/blob/BlobRequestListenerFactory.ts +++ b/src/blob/BlobRequestListenerFactory.ts @@ -23,6 +23,10 @@ import ServiceHandler from "./handlers/ServiceHandler"; import AuthenticationMiddlewareFactory from "./middlewares/AuthenticationMiddlewareFactory"; import blobStorageContextMiddleware from "./middlewares/blobStorageContext.middleware"; import PreflightMiddlewareFactory from "./middlewares/PreflightMiddlewareFactory"; +import StrictModelMiddlewareFactory, { + UnsupportedHeadersBlocker, + UnsupportedParametersBlocker +} from "./middlewares/StrictModelMiddlewareFactory"; import IBlobMetadataStore from "./persistence/IBlobMetadataStore"; import { DEFAULT_CONTEXT_PATH } from "./utils/constants"; @@ -43,7 +47,8 @@ export default class BlobRequestListenerFactory private readonly extentStore: IExtentStore, private readonly accountDataStore: IAccountDataStore, private readonly enableAccessLog: boolean, - private readonly accessLogWriteStream?: NodeJS.WritableStream + private readonly accessLogWriteStream?: NodeJS.WritableStream, + private readonly loose?: boolean ) {} public createRequestListener(): RequestListener { @@ -96,6 +101,12 @@ export default class BlobRequestListenerFactory // CORS request handling, preflight request and the corresponding actual request const preflightMiddlewareFactory = new PreflightMiddlewareFactory(logger); + // Strict mode unsupported features blocker + const strictModelMiddlewareFactory = new StrictModelMiddlewareFactory( + logger, + [UnsupportedHeadersBlocker, UnsupportedParametersBlocker] + ); + /* * Generated middleware should follow strict orders * Manually created middleware can be injected into any points @@ -112,6 +123,11 @@ export default class BlobRequestListenerFactory // Dispatch incoming HTTP request to specific operation app.use(middlewareFactory.createDispatchMiddleware()); + // Block unsupported features in strict mode by default + if (this.loose === false || this.loose === undefined) { + app.use(strictModelMiddlewareFactory.createStrictModelMiddleware()); + } + // AuthN middleware, like shared key auth or SAS auth const authenticationMiddlewareFactory = new AuthenticationMiddlewareFactory( logger diff --git a/src/blob/BlobServer.ts b/src/blob/BlobServer.ts index 18d278691..e30dbf373 100644 --- a/src/blob/BlobServer.ts +++ b/src/blob/BlobServer.ts @@ -86,7 +86,8 @@ export default class BlobServer extends ServerBase implements ICleaner { extentStore, accountDataStore, configuration.enableAccessLog, // Access log includes every handled HTTP request - configuration.accessLogWriteStream + configuration.accessLogWriteStream, + configuration.loose ); super(host, port, httpServer, requestListenerFactory, configuration); diff --git a/src/blob/BlobServerFactory.ts b/src/blob/BlobServerFactory.ts index f289cea03..1bc5f2bb8 100644 --- a/src/blob/BlobServerFactory.ts +++ b/src/blob/BlobServerFactory.ts @@ -4,6 +4,7 @@ import { DEFAULT_SQL_OPTIONS } from "../common/utils/constants"; import BlobConfiguration from "./BlobConfiguration"; import BlobEnvironment from "./BlobEnvironment"; import BlobServer from "./BlobServer"; +import IBlobEnvironment from "./IBlobEnvironment"; import SqlBlobConfiguration from "./SqlBlobConfiguration"; import SqlBlobServer from "./SqlBlobServer"; import { DEFAULT_BLOB_PERSISTENCE_PATH } from "./utils/constants"; @@ -14,15 +15,23 @@ import { } from "./utils/constants"; export class BlobServerFactory { - public async createServer(): Promise { + public async createServer( + blobEnvironment?: IBlobEnvironment + ): Promise { // TODO: Check it's in Visual Studio Code environment or not const isVSC = false; if (!isVSC) { - const env = new BlobEnvironment(); + const env = blobEnvironment ? blobEnvironment : new BlobEnvironment(); const location = await env.location(); const debugFilePath = await env.debug(); + if (typeof debugFilePath === "boolean") { + throw RangeError( + `Must provide a debug log file path for parameter -d or --debug` + ); + } + DEFAULT_BLOB_PERSISTENCE_ARRAY[0].locationPath = join( location, DEFAULT_BLOB_PERSISTENCE_PATH @@ -42,7 +51,8 @@ export class BlobServerFactory { !env.silent(), undefined, debugFilePath !== undefined, - debugFilePath + debugFilePath, + env.loose() ); return new SqlBlobServer(config); @@ -56,7 +66,8 @@ export class BlobServerFactory { !env.silent(), undefined, debugFilePath !== undefined, - debugFilePath + debugFilePath, + env.loose() ); return new BlobServer(config); } diff --git a/src/blob/IBlobEnvironment.ts b/src/blob/IBlobEnvironment.ts index 7b70d3b32..08afb9e68 100644 --- a/src/blob/IBlobEnvironment.ts +++ b/src/blob/IBlobEnvironment.ts @@ -3,5 +3,6 @@ export default interface IBlobEnvironment { blobPort(): number | undefined; location(): Promise; silent(): boolean; + loose(): boolean; debug(): Promise; } diff --git a/src/blob/SqlBlobConfiguration.ts b/src/blob/SqlBlobConfiguration.ts index 7bbcbdd2c..b98d84ae2 100644 --- a/src/blob/SqlBlobConfiguration.ts +++ b/src/blob/SqlBlobConfiguration.ts @@ -28,7 +28,8 @@ export default class SqlBlobConfiguration extends ConfigurationBase { enableAccessLog: boolean = DEFAULT_ENABLE_ACCESS_LOG, accessLogWriteStream?: NodeJS.WritableStream, enableDebugLog: boolean = DEFAULT_ENABLE_DEBUG_LOG, - debugLogFilePath?: string + debugLogFilePath?: string, + loose: boolean = false ) { super( host, @@ -36,7 +37,8 @@ export default class SqlBlobConfiguration extends ConfigurationBase { enableAccessLog, accessLogWriteStream, enableDebugLog, - debugLogFilePath + debugLogFilePath, + loose ); } } diff --git a/src/blob/SqlBlobRequestListenerFactory.ts b/src/blob/SqlBlobRequestListenerFactory.ts deleted file mode 100644 index f44d769d7..000000000 --- a/src/blob/SqlBlobRequestListenerFactory.ts +++ /dev/null @@ -1,174 +0,0 @@ -import express from "express"; -import morgan = require("morgan"); - -import IAccountDataStore from "../common/IAccountDataStore"; -import IRequestListenerFactory from "../common/IRequestListenerFactory"; -import logger from "../common/Logger"; -import IExtentStore from "../common/persistence/IExtentStore"; -import { RequestListener } from "../common/ServerBase"; -import AccountSASAuthenticator from "./authentication/AccountSASAuthenticator"; -import BlobSASAuthenticator from "./authentication/BlobSASAuthenticator"; -import BlobSharedKeyAuthenticator from "./authentication/BlobSharedKeyAuthenticator"; -import PublicAccessAuthenticator from "./authentication/PublicAccessAuthenticator"; -import ExpressMiddlewareFactory from "./generated/ExpressMiddlewareFactory"; -import IHandlers from "./generated/handlers/IHandlers"; -import MiddlewareFactory from "./generated/MiddlewareFactory"; -import AppendBlobHandler from "./handlers/AppendBlobHandler"; -import BlobHandler from "./handlers/BlobHandler"; -import BlockBlobHandler from "./handlers/BlockBlobHandler"; -import ContainerHandler from "./handlers/ContainerHandler"; -import PageBlobHandler from "./handlers/PageBlobHandler"; -import PageBlobRangesManager from "./handlers/PageBlobRangesManager"; -import ServiceHandler from "./handlers/ServiceHandler"; -import AuthenticationMiddlewareFactory from "./middlewares/AuthenticationMiddlewareFactory"; -import blobStorageContextMiddleware from "./middlewares/blobStorageContext.middleware"; -import PreflightMiddlewareFactory from "./middlewares/PreflightMiddlewareFactory"; -import IBlobMetadataStore from "./persistence/IBlobMetadataStore"; -import { DEFAULT_CONTEXT_PATH } from "./utils/constants"; - -/** - * Default RequestListenerFactory based on express framework. - * - * When creating other server implementations, such as based on Koa. Should also create a NEW - * corresponding BlobKoaRequestListenerFactory class by extending IRequestListenerFactory. - * - * @export - * @class BlobRequestListenerFactory - * @implements {IRequestListenerFactory} - */ -export default class SqlBlobRequestListenerFactory - implements IRequestListenerFactory { - public constructor( - private readonly metadataStore: IBlobMetadataStore, - private readonly extentStore: IExtentStore, - private readonly accountDataStore: IAccountDataStore, - private readonly enableAccessLog: boolean, - private readonly accessLogWriteStream?: NodeJS.WritableStream - ) {} - - public createRequestListener(): RequestListener { - const app = express().disable("x-powered-by"); - - // MiddlewareFactory is a factory to create auto-generated middleware - const middlewareFactory: MiddlewareFactory = new ExpressMiddlewareFactory( - logger, - DEFAULT_CONTEXT_PATH - ); - - // Create handlers into handler middleware factory - const pageBlobRangesManager = new PageBlobRangesManager(); - const handlers: IHandlers = { - appendBlobHandler: new AppendBlobHandler( - this.metadataStore, - this.extentStore, - logger - ), - blobHandler: new BlobHandler( - this.metadataStore, - this.extentStore, - logger, - pageBlobRangesManager - ), - blockBlobHandler: new BlockBlobHandler( - this.metadataStore, - this.extentStore, - logger - ), - containerHandler: new ContainerHandler( - this.metadataStore, - this.extentStore, - logger - ), - pageBlobHandler: new PageBlobHandler( - this.metadataStore, - this.extentStore, - logger, - pageBlobRangesManager - ), - serviceHandler: new ServiceHandler( - this.metadataStore, - this.extentStore, - logger - ), - directoryHandler: {} as any - }; - - // CORS request handling, preflight request and the corresponding actual request - const preflightMiddlewareFactory = new PreflightMiddlewareFactory(logger); - - /* - * Generated middleware should follow strict orders - * Manually created middleware can be injected into any points - */ - - // Access log per request - if (this.enableAccessLog) { - app.use(morgan("common", { stream: this.accessLogWriteStream })); - } - - // Manually created middleware to deserialize feature related context which swagger doesn't know - app.use(blobStorageContextMiddleware); - - // Dispatch incoming HTTP request to specific operation - app.use(middlewareFactory.createDispatchMiddleware()); - - // AuthN middleware, like shared key auth or SAS auth - const authenticationMiddlewareFactory = new AuthenticationMiddlewareFactory( - logger - ); - app.use( - authenticationMiddlewareFactory.createAuthenticationMiddleware([ - new PublicAccessAuthenticator(this.metadataStore, logger), - new BlobSharedKeyAuthenticator(this.accountDataStore, logger), - new AccountSASAuthenticator( - this.accountDataStore, - this.metadataStore, - logger - ), - new BlobSASAuthenticator( - this.accountDataStore, - this.metadataStore, - logger - ) - ]) - ); - - // Generated, will do basic validation defined in swagger - app.use(middlewareFactory.createDeserializerMiddleware()); - - // Generated, inject handlers to create a handler middleware - app.use(middlewareFactory.createHandlerMiddleware(handlers)); - - // CORS - app.use( - preflightMiddlewareFactory.createCorsRequestMiddleware( - this.metadataStore, - true - ) - ); - app.use( - preflightMiddlewareFactory.createCorsRequestMiddleware( - this.metadataStore, - false - ) - ); - - // Generated, will serialize response models into HTTP response - app.use(middlewareFactory.createSerializerMiddleware()); - - // Preflight - app.use( - preflightMiddlewareFactory.createOptionsHandlerMiddleware( - this.metadataStore - ) - ); - - // Generated, will return MiddlewareError and Errors thrown in previous middleware/handlers to HTTP response - app.use(middlewareFactory.createErrorMiddleware()); - - // Generated, will end and return HTTP response immediately - app.use(middlewareFactory.createEndMiddleware()); - - return app; - } -} diff --git a/src/blob/SqlBlobServer.ts b/src/blob/SqlBlobServer.ts index 874ca339b..d725fced9 100644 --- a/src/blob/SqlBlobServer.ts +++ b/src/blob/SqlBlobServer.ts @@ -10,11 +10,11 @@ import IExtentMetadataStore from "../common/persistence/IExtentMetadataStore"; import IExtentStore from "../common/persistence/IExtentStore"; import SqlExtentMetadataStore from "../common/persistence/SqlExtentMetadataStore"; import ServerBase, { ServerStatus } from "../common/ServerBase"; +import BlobRequestListenerFactory from "./BlobRequestListenerFactory"; import BlobGCManager from "./gc/BlobGCManager"; import IBlobMetadataStore from "./persistence/IBlobMetadataStore"; import SqlBlobMetadataStore from "./persistence/SqlBlobMetadataStore"; import SqlBlobConfiguration from "./SqlBlobConfiguration"; -import SqlBlobRequestListenerFactory from "./SqlBlobRequestListenerFactory"; const BEFORE_CLOSE_MESSAGE = `Azurite Blob service is closing...`; const BEFORE_CLOSE_MESSAGE_GC_ERROR = `Azurite Blob service is closing... Critical error happens during GC.`; @@ -76,12 +76,13 @@ export default class SqlBlobServer extends ServerBase { // We can also change the HTTP framework here by // creating a new XXXListenerFactory implementing IRequestListenerFactory interface // and replace the default Express based request listener - const requestListenerFactory: IRequestListenerFactory = new SqlBlobRequestListenerFactory( + const requestListenerFactory: IRequestListenerFactory = new BlobRequestListenerFactory( metadataStore, extentStore, accountDataStore, configuration.enableAccessLog, // Access log includes every handled HTTP request - configuration.accessLogWriteStream + configuration.accessLogWriteStream, + configuration.loose ); super(host, port, httpServer, requestListenerFactory, configuration); diff --git a/src/blob/errors/StrictModelNotSupportedError.ts b/src/blob/errors/StrictModelNotSupportedError.ts new file mode 100644 index 000000000..e019ae919 --- /dev/null +++ b/src/blob/errors/StrictModelNotSupportedError.ts @@ -0,0 +1,12 @@ +import StorageError from "./StorageError"; + +export default class StrictModelNotSupportedError extends StorageError { + public constructor(feature: string, requestID: string = "") { + super( + 500, + "FeatureNotSupported", + `${feature} header or parameter is not supported in Azurite strict mode. Switch to loose model by Azurite command line parameter "--loose" or Visual Studio Code configuration "Loose". Please vote your wanted features to https://github.com/azure/azurite/issues`, + requestID + ); + } +} diff --git a/src/blob/middlewares/StrictModelMiddlewareFactory.ts b/src/blob/middlewares/StrictModelMiddlewareFactory.ts new file mode 100644 index 000000000..a3bc3ade7 --- /dev/null +++ b/src/blob/middlewares/StrictModelMiddlewareFactory.ts @@ -0,0 +1,88 @@ +import { NextFunction, Request, RequestHandler, Response } from "express"; + +import ILogger from "../../common/ILogger"; +import BlobStorageContext from "../context/BlobStorageContext"; +import StrictModelNotSupportedError from "../errors/StrictModelNotSupportedError"; +import Context from "../generated/Context"; +import ExpressRequestAdapter from "../generated/ExpressRequestAdapter"; +import IRequest from "../generated/IRequest"; +import { DEFAULT_CONTEXT_PATH, HeaderConstants } from "../utils/constants"; + +export type StrictModelRequestValidator = ( + req: IRequest, + context: Context, + logger: ILogger +) => Promise; + +export const UnsupportedHeadersBlocker: StrictModelRequestValidator = async ( + req: IRequest, + context: Context, + logger: ILogger +): Promise => { + const UnsupportedHeaderKeys = [ + HeaderConstants.IF_MATCH, + HeaderConstants.IF_NONE_MATCH, + HeaderConstants.IF_MODIFIED_SINCE, + HeaderConstants.IF_UNMODIFIED_SINCE, + HeaderConstants.SOURCE_IF_MATCH, + HeaderConstants.SOURCE_IF_MODIFIED_SINCE, + HeaderConstants.SOURCE_IF_NONE_MATCH, + HeaderConstants.SOURCE_IF_UNMODIFIED_SINCE, + HeaderConstants.X_MS_IF_SEQUENCE_NUMBER_LE, + HeaderConstants.X_MS_IF_SEQUENCE_NUMBER_LT, + HeaderConstants.X_MS_IF_SEQUENCE_NUMBER_EQ, + HeaderConstants.X_MS_BLOB_CONDITION_MAXSIZE, + HeaderConstants.X_MS_BLOB_CONDITION_APPENDPOS + ]; + + for (const headerKey of UnsupportedHeaderKeys) { + const value = req.getHeader(headerKey); + if (typeof value === "string") { + throw new StrictModelNotSupportedError(headerKey, context.contextId); + } + } +}; + +export const UnsupportedParametersBlocker: StrictModelRequestValidator = async ( + req: IRequest, + context: Context, + logger: ILogger +): Promise => { + const UnsupportedParameterKeys = [ + // https://docs.microsoft.com/en-us/rest/api/storageservices/create-service-sas#specifying-query-parameters-to-override-response-headers-blob-and-file-services-only + "rscc", + "rscc", + "rsce", + "rsce", + "rsct" + ]; + + for (const parameterKey of UnsupportedParameterKeys) { + const value = req.getQuery(parameterKey); + if (typeof value === "string") { + throw new StrictModelNotSupportedError(parameterKey, context.contextId); + } + } +}; + +export default class StrictModelMiddlewareFactory { + constructor( + private readonly logger: ILogger, + private readonly validators: StrictModelRequestValidator[] + ) {} + + public createStrictModelMiddleware(): RequestHandler { + return (req: Request, res: Response, next: NextFunction) => { + this.validate(req, res) + .then(next) + .catch(next); + }; + } + + private async validate(req: Request, res: Response): Promise { + const context = new BlobStorageContext(res.locals, DEFAULT_CONTEXT_PATH); + for (const validator of this.validators) { + await validator(new ExpressRequestAdapter(req), context, this.logger); + } + } +} diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 920653ae8..890f34b2e 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -89,7 +89,7 @@ export default class LokiBlobMetadataStore private readonly db: Loki; private initialized: boolean = false; - private closed: boolean = false; + private closed: boolean = true; private readonly SERVICES_COLLECTION = "$SERVICES_COLLECTION$"; private readonly CONTAINERS_COLLECTION = "$CONTAINERS_COLLECTION$"; @@ -1158,7 +1158,7 @@ export default class LokiBlobMetadataStore const count = coll.count({ accountName: account, containerName: container, - blobName: blob + name: blob }); if (count > 1) { throw StorageErrorFactory.getSnapshotsPresent(context.contextId!); @@ -1720,6 +1720,16 @@ export default class LokiBlobMetadataStore } } + if ( + copiedBlob.properties.blobType === Models.BlobType.PageBlob && + tier !== undefined + ) { + throw StorageErrorFactory.getInvalidHeaderValue(context.contextId, { + HeaderName: "x-ms-access-tier", + HeaderValue: `${tier}` + }); + } + coll.insert(copiedBlob); return copiedBlob.properties; } diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 2be20fcf7..61b952b97 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -43,6 +43,15 @@ export const HeaderConstants = { IF_MODIFIED_SINCE: "if-modified-since", IF_NONE_MATCH: "if-none-match", IF_UNMODIFIED_SINCE: "if-unmodified-since", + SOURCE_IF_MATCH: "x-ms-source-if-match", + SOURCE_IF_MODIFIED_SINCE: "x-ms-source-if-modified-since", + SOURCE_IF_NONE_MATCH: "x-ms-source-if-none-match", + SOURCE_IF_UNMODIFIED_SINCE: "x-ms-source-if-unmodified-since", + X_MS_IF_SEQUENCE_NUMBER_LE: "x-ms-if-sequence-number-le", + X_MS_IF_SEQUENCE_NUMBER_LT: "x-ms-if-sequence-number-lt", + X_MS_IF_SEQUENCE_NUMBER_EQ: "x-ms-if-sequence-number-eq", + X_MS_BLOB_CONDITION_MAXSIZE: "x-ms-blob-condition-maxsize", + X_MS_BLOB_CONDITION_APPENDPOS: "x-ms-blob-condition-appendpos", PREFIX_FOR_STORAGE: "x-ms-", RANGE: "Range", USER_AGENT: "User-Agent", diff --git a/src/common/ConfigurationBase.ts b/src/common/ConfigurationBase.ts index c58a50afa..a4496f62f 100644 --- a/src/common/ConfigurationBase.ts +++ b/src/common/ConfigurationBase.ts @@ -5,6 +5,7 @@ export default abstract class ConfigurationBase { public readonly enableAccessLog: boolean = false, public readonly accessLogWriteStream?: NodeJS.WritableStream, public readonly enableDebugLog: boolean = false, - public readonly debugLogFilePath?: string + public readonly debugLogFilePath?: string, + public readonly loose: boolean = false ) {} } diff --git a/src/common/Environment.ts b/src/common/Environment.ts index 4a0215d44..3bd5ac53c 100644 --- a/src/common/Environment.ts +++ b/src/common/Environment.ts @@ -32,13 +32,17 @@ args DEFAULT_QUEUE_LISTENING_PORT ) .option( - "location", + ["l", "location"], "Optional. Use an existing folder as workspace path, default is current working directory", process.cwd() ) - .option("silent", "Optional. Disable access log displayed in console") + .option(["s", "silent"], "Optional. Disable access log displayed in console") .option( - "debug", + ["L", "loose"], + "Optional. Enable loose mode which ignores unsupported headers and parameters" + ) + .option( + ["d", "debug"], "Optional. Enable debug log by providing a valid local file path as log destination" ); @@ -74,7 +78,15 @@ export default class Environment implements IEnvironment { return false; } - public debug(): string | undefined { + public loose(): boolean { + if (this.flags.loose !== undefined) { + return true; + } + // default is false which will block not supported APIs, headers and parameters + return false; + } + + public async debug(): Promise { if (typeof this.flags.debug === "string") { // Enable debug log to file return this.flags.debug; diff --git a/src/common/IEnvironment.ts b/src/common/IEnvironment.ts index 958130610..5ae8acb99 100644 --- a/src/common/IEnvironment.ts +++ b/src/common/IEnvironment.ts @@ -1,9 +1,6 @@ -export default interface IEnvironment { - blobHost(): string | undefined; - blobPort(): number | undefined; - queueHost(): string | undefined; - queuePort(): number | undefined; - location(): Promise; - silent(): boolean; - debug(): string | boolean | undefined; -} +import IBlobEnvironment from "../blob/IBlobEnvironment"; +import IQueueEnvironment from "../queue/IQueueEnvironment"; + +export default interface IEnvironment + extends IBlobEnvironment, + IQueueEnvironment {} diff --git a/src/common/VSCEnvironment.ts b/src/common/VSCEnvironment.ts index 401dbf98f..fd98d2671 100644 --- a/src/common/VSCEnvironment.ts +++ b/src/common/VSCEnvironment.ts @@ -67,7 +67,11 @@ export default class VSCEnvironment implements IEnvironment { return this.workspaceConfiguration.get("silent") || false; } - public debug(): boolean { + public loose(): boolean { + return this.workspaceConfiguration.get("loose") || false; + } + + public async debug(): Promise { return this.workspaceConfiguration.get("debug") || false; } } diff --git a/src/common/VSCQueueEnvironment.ts b/src/common/VSCQueueEnvironment.ts deleted file mode 100644 index 1accf256c..000000000 --- a/src/common/VSCQueueEnvironment.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { window, workspace, WorkspaceFolder } from "vscode"; - -import IEnvironment from "../queue/IQueueEnvironment"; - -export default class VSCEnvironment implements IEnvironment { - private workspaceConfiguration = workspace.getConfiguration("azurite"); - - public queueHost(): string | undefined { - return this.workspaceConfiguration.get("queueHost"); - } - - public queuePort(): number | undefined { - return this.workspaceConfiguration.get("queuePort"); - } - - public async location(): Promise { - let location = this.workspaceConfiguration.get("location"); - - // When location configuration is not provided, use current opened folder - if (location === undefined || location === "") { - if ( - workspace.workspaceFolders === undefined || - workspace.workspaceFolders.length === 0 - ) { - // location = join(homedir(), "Azurite"); - throw Error( - // tslint:disable-next-line:max-line-length - `Invalid workspace location for Azurite. Please open a folder in Visual Studio Code, or provide a valid workspace folder path for Azurite in Visual Studio Code setting "azurite.location"` - ); - } - - let folder: WorkspaceFolder | undefined; - if (workspace.workspaceFolders.length > 1) { - folder = await window.showWorkspaceFolderPick({ - placeHolder: - "Select the working directory you wish to use as Azurite workspace location" - }); - if (folder === undefined) { - throw Error( - // tslint:disable-next-line:max-line-length - `Invalid workspace location for Azurite. Please select a folder in Visual Studio Code, or provide a valid workspace folder path for Azurite in Visual Studio Code setting "azurite.location"` - ); - } - } else { - folder = workspace.workspaceFolders[0]; - } - location = folder.uri.fsPath; - } - - return location; - } - - public silent(): boolean { - return this.workspaceConfiguration.get("silent") || false; - } - - public debug(): boolean { - return this.workspaceConfiguration.get("debug") || false; - } -} diff --git a/src/common/VSCServerManagerBlob.ts b/src/common/VSCServerManagerBlob.ts index ae208d8ad..10b5ba3a9 100644 --- a/src/common/VSCServerManagerBlob.ts +++ b/src/common/VSCServerManagerBlob.ts @@ -10,7 +10,6 @@ import { } from "../blob/utils/constants"; import * as Logger from "./Logger"; import NoLoggerStrategy from "./NoLoggerStrategy"; -import { rimrafAsync } from "./utils/utils"; import VSCChannelLoggerStrategy from "./VSCChannelLoggerStrategy"; import VSCChannelWriteStream from "./VSCChannelWriteStream"; import VSCEnvironment from "./VSCEnvironment"; @@ -58,12 +57,8 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { } public async cleanImpl(): Promise { - const config = await this.getConfiguration(); - await rimrafAsync(config.extentDBPath); - await rimrafAsync(config.metadataDBPath); - for (const path of config.persistencePathArray) { - await rimrafAsync(path.locationPath); - } + await this.createImpl(); + await this.server!.clean(); } private async getConfiguration(): Promise { @@ -84,8 +79,9 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { DEFAULT_BLOB_PERSISTENCE_ARRAY, !env.silent(), this.accessChannelStream, - env.debug() === true, - undefined + (await env.debug()) === true, + undefined, + env.loose() ); return config; } diff --git a/src/common/VSCServerManagerQueue.ts b/src/common/VSCServerManagerQueue.ts index d045719b0..a5b287d70 100644 --- a/src/common/VSCServerManagerQueue.ts +++ b/src/common/VSCServerManagerQueue.ts @@ -14,7 +14,7 @@ import * as Logger from "./Logger"; import NoLoggerStrategy from "./NoLoggerStrategy"; import VSCChannelLoggerStrategy from "./VSCChannelLoggerStrategy"; import VSCChannelWriteStream from "./VSCChannelWriteStream"; -import VSCEnvironment from "./VSCQueueEnvironment"; +import VSCEnvironment from "./VSCEnvironment"; import VSCServerManagerBase from "./VSCServerManagerBase"; import VSCServerManagerClosedState from "./VSCServerManagerClosedState"; @@ -90,8 +90,9 @@ export default class VSCServerManagerBlob extends VSCServerManagerBase { DEFAULT_QUEUE_PERSISTENCE_ARRAY, !env.silent(), this.accessChannelStream, - env.debug() === true, - undefined + (await env.debug()) === true, + undefined, + env.loose() ); return config; } diff --git a/src/common/persistence/FSExtentStore.ts b/src/common/persistence/FSExtentStore.ts index a482cea46..199a8012d 100644 --- a/src/common/persistence/FSExtentStore.ts +++ b/src/common/persistence/FSExtentStore.ts @@ -68,7 +68,7 @@ export default class FSExtentStore implements IExtentStore { private readonly readQueue: IOperationQueue; private initialized: boolean = false; - private closed: boolean = false; + private closed: boolean = true; // The active extents to be appended data. private activeWriteExtents: IAppendExtent[]; diff --git a/src/common/persistence/LokiExtentMetadataStore.ts b/src/common/persistence/LokiExtentMetadataStore.ts index 1a0c31f6b..6017be79a 100644 --- a/src/common/persistence/LokiExtentMetadataStore.ts +++ b/src/common/persistence/LokiExtentMetadataStore.ts @@ -21,7 +21,7 @@ export default class LokiExtentMetadata implements IExtentMetadataStore { private readonly db: Loki; private initialized: boolean = false; - private closed: boolean = false; + private closed: boolean = true; private readonly EXTENTS_COLLECTION = "$EXTENTS_COLLECTION$"; diff --git a/src/queue/IQueueEnvironment.ts b/src/queue/IQueueEnvironment.ts index 1fd29138e..b108a348c 100644 --- a/src/queue/IQueueEnvironment.ts +++ b/src/queue/IQueueEnvironment.ts @@ -3,5 +3,6 @@ export default interface IQueueEnvironment { queuePort(): number | undefined; location(): Promise; silent(): boolean; - debug(): string | boolean | undefined; + loose(): boolean; + debug(): Promise; } diff --git a/src/queue/QueueConfiguration.ts b/src/queue/QueueConfiguration.ts index 9930b57a7..310af616c 100644 --- a/src/queue/QueueConfiguration.ts +++ b/src/queue/QueueConfiguration.ts @@ -32,7 +32,8 @@ export default class QueueConfiguration extends ConfigurationBase { enableAccessLog: boolean = DEFAULT_ENABLE_ACCESS_LOG, accessLogWriteStream?: NodeJS.WritableStream, enableDebugLog: boolean = DEFAULT_ENABLE_DEBUG_LOG, - debugLogFilePath?: string + debugLogFilePath?: string, + loose: boolean = false ) { super( host, @@ -40,7 +41,8 @@ export default class QueueConfiguration extends ConfigurationBase { enableAccessLog, accessLogWriteStream, enableDebugLog, - debugLogFilePath + debugLogFilePath, + loose ); } } diff --git a/src/queue/QueueEnvironment.ts b/src/queue/QueueEnvironment.ts index c290f2caa..e8ffe67d8 100644 --- a/src/queue/QueueEnvironment.ts +++ b/src/queue/QueueEnvironment.ts @@ -18,13 +18,17 @@ args DEFAULT_QUEUE_LISTENING_PORT ) .option( - "location", + ["l", "location"], "Optional. Use an existing folder as workspace path, default is current working directory", process.cwd() ) - .option("silent", "Optional. Disable access log displayed in console") + .option(["s", "silent"], "Optional. Disable access log displayed in console") .option( - "debug", + ["L", "loose"], + "Optional. Enable loose mode which ignores unsupported headers and parameters" + ) + .option( + ["d", "debug"], "Optional. Enable debug log by providing a valid local file path as log destination" ); @@ -52,7 +56,15 @@ export default class QueueEnvironment implements IQueueEnvironment { return false; } - public debug(): string | undefined { + public loose(): boolean { + if (this.flags.loose !== undefined) { + return true; + } + // default is false which will block not supported APIs, headers and parameters + return false; + } + + public async debug(): Promise { if (typeof this.flags.debug === "string") { // Enable debug log to file return this.flags.debug; diff --git a/src/queue/main.ts b/src/queue/main.ts index 175759aeb..b23d63dc6 100644 --- a/src/queue/main.ts +++ b/src/queue/main.ts @@ -28,7 +28,7 @@ async function main() { const location = await env.location(); await accessAsync(location); - const debugFilePath = env.debug(); + const debugFilePath = await env.debug(); if (debugFilePath !== undefined) { await accessAsync(dirname(debugFilePath!)); } @@ -47,8 +47,9 @@ async function main() { DEFAULT_QUEUE_PERSISTENCE_ARRAY, !env.silent(), undefined, - env.debug() !== undefined, - env.debug() + (await env.debug()) !== undefined, + await env.debug(), + env.loose() ); // We use logger singleton as global debugger logger to track detailed outputs cross layers diff --git a/tests/BlobTestServerFactory.ts b/tests/BlobTestServerFactory.ts index 46cedf98d..54f4e703d 100644 --- a/tests/BlobTestServerFactory.ts +++ b/tests/BlobTestServerFactory.ts @@ -6,7 +6,7 @@ import { StoreDestinationArray } from "../src/common/persistence/IExtentStore"; import { DEFAULT_SQL_OPTIONS } from "../src/common/utils/constants"; export default class BlobTestServerFactory { - public createServer(): BlobServer | SqlBlobServer { + public createServer(loose: boolean = false): BlobServer | SqlBlobServer { const databaseConnectionString = process.env.AZURITE_TEST_DB; const isSQL = databaseConnectionString !== undefined; @@ -30,7 +30,8 @@ export default class BlobTestServerFactory { false, undefined, false, - undefined + undefined, + loose ); return new SqlBlobServer(config); @@ -46,7 +47,8 @@ export default class BlobTestServerFactory { false, undefined, false, - undefined + undefined, + loose ); return new BlobServer(config); } diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index 1eebcebb4..f04b08952 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -4,6 +4,7 @@ import { BlobURL, BlockBlobURL, ContainerURL, + PageBlobURL, ServiceURL, SharedKeyCredential, StorageURL @@ -138,6 +139,26 @@ describe("BlobAPIs", () => { assert.deepStrictEqual(result2.metadata, metadata); }); + it("should not delete base blob without include snapshot header @loki @sql", async () => { + const result = await blobURL.createSnapshot(Aborter.none); + assert.ok(result.snapshot); + assert.equal( + result._response.request.headers.get("x-ms-client-request-id"), + result.clientRequestId + ); + const blobSnapshotURL = blobURL.withSnapshot(result.snapshot!); + await blobSnapshotURL.getProperties(Aborter.none); + + let err; + try { + await blobURL.delete(Aborter.none, {}); + } catch (error) { + err = error; + } + + assert.deepStrictEqual(err.statusCode, 409); + }); + it("should delete snapshot @loki @sql", async () => { const result = await blobURL.createSnapshot(Aborter.none); assert.ok(result.snapshot); @@ -598,6 +619,108 @@ describe("BlobAPIs", () => { await destBlobURL.releaseLease(Aborter.none, leaseId!); }); + it("Copy blob should work for page blob @loki", async () => { + const sourceBlob = getUniqueName("blob"); + const destBlob = getUniqueName("blob"); + + const sourceBlobURL = PageBlobURL.fromContainerURL( + containerURL, + sourceBlob + ); + const destBlobURL = PageBlobURL.fromContainerURL(containerURL, destBlob); + + const metadata = { key: "value" }; + const blobHTTPHeaders = { + blobCacheControl: "blobCacheControl", + blobContentDisposition: "blobContentDisposition", + blobContentEncoding: "blobContentEncoding", + blobContentLanguage: "blobContentLanguage", + blobContentType: "blobContentType" + }; + + const result_upload = await sourceBlobURL.create(Aborter.none, 512, { + metadata, + blobHTTPHeaders + }); + assert.equal( + result_upload._response.request.headers.get("x-ms-client-request-id"), + result_upload.clientRequestId + ); + + const result_startcopy = await destBlobURL.startCopyFromURL( + Aborter.none, + sourceBlobURL.url + ); + assert.equal( + result_startcopy._response.request.headers.get("x-ms-client-request-id"), + result_startcopy.clientRequestId + ); + + const result = await destBlobURL.getProperties(Aborter.none); + assert.ok(result.date); + assert.deepStrictEqual(result.blobType, "PageBlob"); + assert.ok(result.lastModified); + assert.deepStrictEqual(result.metadata, metadata); + assert.deepStrictEqual( + result.cacheControl, + blobHTTPHeaders.blobCacheControl + ); + assert.deepStrictEqual(result.contentType, blobHTTPHeaders.blobContentType); + assert.deepStrictEqual( + result.contentEncoding, + blobHTTPHeaders.blobContentEncoding + ); + assert.deepStrictEqual( + result.contentLanguage, + blobHTTPHeaders.blobContentLanguage + ); + assert.deepStrictEqual( + result.contentDisposition, + blobHTTPHeaders.blobContentDisposition + ); + }); + + it("Copy blob should not work for page blob and set tier @loki", async () => { + const sourceBlob = getUniqueName("blob"); + const destBlob = getUniqueName("blob"); + + const sourceBlobURL = PageBlobURL.fromContainerURL( + containerURL, + sourceBlob + ); + const destBlobURL = PageBlobURL.fromContainerURL(containerURL, destBlob); + + const metadata = { key: "value" }; + const blobHTTPHeaders = { + blobCacheControl: "blobCacheControl", + blobContentDisposition: "blobContentDisposition", + blobContentEncoding: "blobContentEncoding", + blobContentLanguage: "blobContentLanguage", + blobContentType: "blobContentType" + }; + + const result_upload = await sourceBlobURL.create(Aborter.none, 512, { + metadata, + blobHTTPHeaders + }); + assert.equal( + result_upload._response.request.headers.get("x-ms-client-request-id"), + result_upload.clientRequestId + ); + + let err; + + try { + await destBlobURL.startCopyFromURL(Aborter.none, sourceBlobURL.url, { + tier: "P10" + }); + } catch (error) { + err = error; + } + + assert.deepStrictEqual(err.statusCode, 400); + }); + it("Acquire Lease on Breaking Lease status, if LeaseId not match, throw LeaseIdMismatchWithLease error @loki @sql", async () => { // TODO: implement the case later }); diff --git a/tests/blob/blockblob.highlevel.test.ts b/tests/blob/blockblob.highlevel.test.ts index 1857169b5..d5fb81607 100644 --- a/tests/blob/blockblob.highlevel.test.ts +++ b/tests/blob/blockblob.highlevel.test.ts @@ -32,7 +32,8 @@ configLogger(false); // tslint:disable:no-empty describe("BlockBlobHighlevel", () => { const factory = new BlobTestServerFactory(); - const server = factory.createServer(); + // Loose model to bypass if-match header used by download retry + const server = factory.createServer(true); const baseURL = `http://${server.config.host}:${server.config.port}/devstoreaccount1`; const serviceURL = new ServiceURL( @@ -357,15 +358,10 @@ describe("BlockBlobHighlevel", () => { }); it("bloburl.download should success when internal stream unexpected ends at the stream end @loki @sql", async () => { - const uploadResponse = await uploadFileToBlockBlob( - Aborter.none, - tempFileSmall, - blockBlobURL, - { - blockSize: 4 * 1024 * 1024, - parallelism: 20 - } - ); + await uploadFileToBlockBlob(Aborter.none, tempFileSmall, blockBlobURL, { + blockSize: 4 * 1024 * 1024, + parallelism: 20 + }); let retirableReadableStreamOptions: any; const downloadResponse = await blockBlobURL.download( @@ -374,9 +370,9 @@ describe("BlockBlobHighlevel", () => { undefined, { blobAccessConditions: { - modifiedAccessConditions: { - ifMatch: uploadResponse.eTag - } + // modifiedAccessConditions: { + // ifMatch: uploadResponse.eTag + // } }, maxRetryRequests: 1, progress: ev => { @@ -407,16 +403,11 @@ describe("BlockBlobHighlevel", () => { assert.ok(downloadedData.equals(uploadedData)); }); - it("bloburl.download should download full data successfully when internal stream unexcepted ends @loki @sql", async () => { - const uploadResponse = await uploadFileToBlockBlob( - Aborter.none, - tempFileSmall, - blockBlobURL, - { - blockSize: 4 * 1024 * 1024, - parallelism: 20 - } - ); + it("bloburl.download should download full data successfully when internal stream unexpected ends @loki @sql", async () => { + await uploadFileToBlockBlob(Aborter.none, tempFileSmall, blockBlobURL, { + blockSize: 4 * 1024 * 1024, + parallelism: 20 + }); let retirableReadableStreamOptions: any; let injectedErrors = 0; @@ -426,9 +417,9 @@ describe("BlockBlobHighlevel", () => { undefined, { blobAccessConditions: { - modifiedAccessConditions: { - ifMatch: uploadResponse.eTag - } + // modifiedAccessConditions: { + // ifMatch: uploadResponse.eTag + // } }, maxRetryRequests: 3, progress: () => { @@ -456,15 +447,10 @@ describe("BlockBlobHighlevel", () => { }); it("bloburl.download should download partial data when internal stream unexpected ends @loki @sql", async () => { - const uploadResponse = await uploadFileToBlockBlob( - Aborter.none, - tempFileSmall, - blockBlobURL, - { - blockSize: 4 * 1024 * 1024, - parallelism: 20 - } - ); + await uploadFileToBlockBlob(Aborter.none, tempFileSmall, blockBlobURL, { + blockSize: 4 * 1024 * 1024, + parallelism: 20 + }); const partialSize = 500 * 1024; @@ -476,9 +462,9 @@ describe("BlockBlobHighlevel", () => { partialSize, { blobAccessConditions: { - modifiedAccessConditions: { - ifMatch: uploadResponse.eTag - } + // modifiedAccessConditions: { + // ifMatch: uploadResponse.eTag + // } }, maxRetryRequests: 3, progress: () => { @@ -510,15 +496,10 @@ describe("BlockBlobHighlevel", () => { }); it("bloburl.download should download data failed when exceeding max stream retry requests @loki @sql", async () => { - const uploadResponse = await uploadFileToBlockBlob( - Aborter.none, - tempFileSmall, - blockBlobURL, - { - blockSize: 4 * 1024 * 1024, - parallelism: 20 - } - ); + await uploadFileToBlockBlob(Aborter.none, tempFileSmall, blockBlobURL, { + blockSize: 4 * 1024 * 1024, + parallelism: 20 + }); const downloadedFile = join(tempFolderPath, getUniqueName("downloadfile.")); @@ -533,9 +514,9 @@ describe("BlockBlobHighlevel", () => { undefined, { blobAccessConditions: { - modifiedAccessConditions: { - ifMatch: uploadResponse.eTag - } + // modifiedAccessConditions: { + // ifMatch: uploadResponse.eTag + // } }, maxRetryRequests: 0, progress: () => { diff --git a/tests/blob/sas.test.ts b/tests/blob/sas.test.ts index 5441fd845..962dca7b9 100644 --- a/tests/blob/sas.test.ts +++ b/tests/blob/sas.test.ts @@ -446,12 +446,12 @@ describe("Shared Access Signature (SAS) authentication", () => { const blobSAS = generateBlobSASQueryParameters( { blobName, - cacheControl: "cache-control-override", + // cacheControl: "cache-control-override", containerName, - contentDisposition: "content-disposition-override", - contentEncoding: "content-encoding-override", - contentLanguage: "content-language-override", - contentType: "content-type-override", + // contentDisposition: "content-disposition-override", + // contentEncoding: "content-encoding-override", + // contentLanguage: "content-language-override", + // contentType: "content-type-override", expiryTime: tmr, ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, permissions: BlobSASPermissions.parse("racwd").toString(), @@ -511,12 +511,12 @@ describe("Shared Access Signature (SAS) authentication", () => { { // NOTICE: Azure Storage Server will replace "\" with "/" in the blob names blobName: blobName.replace(/\\/g, "/"), - cacheControl: "cache-control-override", + // cacheControl: "cache-control-override", containerName, - contentDisposition: "content-disposition-override", - contentEncoding: "content-encoding-override", - contentLanguage: "content-language-override", - contentType: "content-type-override", + // contentDisposition: "content-disposition-override", + // contentEncoding: "content-encoding-override", + // contentLanguage: "content-language-override", + // contentType: "content-type-override", expiryTime: tmr, ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, permissions: BlobSASPermissions.parse("racwd").toString(), @@ -781,12 +781,12 @@ describe("Shared Access Signature (SAS) authentication", () => { const blobSAS = generateBlobSASQueryParameters( { blobName, - cacheControl: "cache-control-override", + // cacheControl: "cache-control-override", containerName, - contentDisposition: "content-disposition-override", - contentEncoding: "content-encoding-override", - contentLanguage: "content-language-override", - contentType: "content-type-override", + // contentDisposition: "content-disposition-override", + // contentEncoding: "content-encoding-override", + // contentLanguage: "content-language-override", + // contentType: "content-type-override", expiryTime: tmr, ipRange: { start: "0.0.0.0", end: "255.255.255.255" }, permissions: BlobSASPermissions.parse("racwd").toString(), From 34866bf7b0b3caf46e4150df30ae7afe843524da Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Wed, 25 Dec 2019 20:56:52 +0800 Subject: [PATCH 28/34] =?UTF-8?q?Updated=20message=20size=20calculation=20?= =?UTF-8?q?when=20checking=2064KB=20limitation.=20=20Fixe=E2=80=A6=20(#363?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Updated message size calculation when checking 64KB limitation. Fixed #314 * Blocked set tier for page blob which requires premium storage account where Azurite provides standard storage account * GetPageRangesDiff API (incremental snapshot) now returns NotImplementedError. Fixed #298 * Strict mode will block crc64 & cmk related headers * Fixed a bug that listing containers won't honor prefix with marker when using external metadata database; Fixed sas issue for update sequense number; * Throw NotImplementedError for all not implemented handlers --- .vscode/launch.json | 10 +++++ ChangeLog.md | 4 ++ package.json | 2 +- .../OperationAccountSASPermission.ts | 9 ++++ src/blob/errors/StorageErrorFactory.ts | 11 +++++ src/blob/generated/artifacts/models.ts | 9 ---- src/blob/generated/artifacts/parameters.ts | 6 +-- .../generated/handlers/IPageBlobHandler.ts | 2 +- src/blob/generated/handlers/handlerMappers.ts | 1 + src/blob/handlers/AppendBlobHandler.ts | 2 +- src/blob/handlers/BlobHandler.ts | 8 ++-- src/blob/handlers/PageBlobHandler.ts | 9 +++- src/blob/handlers/ServiceHandler.ts | 5 ++- .../StrictModelMiddlewareFactory.ts | 7 +++- src/blob/persistence/LokiBlobMetadataStore.ts | 4 +- src/blob/persistence/SqlBlobMetadataStore.ts | 41 ++++++++++++------- src/blob/utils/constants.ts | 5 +++ src/queue/utils/utils.ts | 15 +------ swagger/blob-storage-2019-02-02.json | 2 +- 19 files changed, 98 insertions(+), 54 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 8f5bfa73f..b54a2c95b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,6 +14,16 @@ "env": { "AZURITE_ACCOUNTS": "" }, "outputCapture": "std" }, + { + "type": "node", + "request": "launch", + "name": "Azurite Service - Loki, Loose", + "cwd": "${workspaceFolder}", + "runtimeArgs": ["-r", "ts-node/register"], + "args": ["${workspaceFolder}/src/azurite.ts", "-d", "debug.log", "-L"], + "env": { "AZURITE_ACCOUNTS": "" }, + "outputCapture": "std" + }, { "type": "node", "request": "launch", diff --git a/ChangeLog.md b/ChangeLog.md index 94952ae2e..7ea78b309 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -34,11 +34,15 @@ Blob: - Fixed a bug that uncommitted block blob invalid length. - Fixed a bug that SetHTTPHeaders, SetMetadata won't update blob etag. - Remove double quotation marks from list blob request returned blob etag, to align with Azure Server behavior. +- Blocked set tier for page blob which requires premium storage account where Azurite provides standard storage account. +- GetPageRangesDiff API (incremental snapshot) now returns NotImplementedError. +- Fixed a bug that listing containers won't honor prefix with marker when using external metadata database. Queue: - AllowedHeaders and ExposedHeaders are optional now when setting CORS. - Fix Put message fail with max messagettl. +- Updated message size calculation when checking 64KB limitation. # 2019.11 Version 3.3.0-preview diff --git a/package.json b/package.json index 5170222a2..0621cb989 100644 --- a/package.json +++ b/package.json @@ -185,7 +185,7 @@ "docker:publish": "cross-var docker push xstoreazurite.azurecr.io/public/azure-storage/azurite:$npm_package_version", "docker:publish:internal": "cross-var docker push xstoreazurite.azurecr.io/internal/azure-storage/azurite:$npm_package_version", "build": "tsc", - "build:autorestdebug": "autorest ./swagger/blob.md --typescript --typescript.debugger --use=E:/GitHub/XiaoningLiu/autorest.typescript.server", + "build:autorest:debug": "autorest ./swagger/blob.md --typescript --typescript.debugger --use=E:/GitHub/XiaoningLiu/autorest.typescript.server", "build:autorest:blob": "autorest ./swagger/blob.md --typescript --use=S:/GitHub/XiaoningLiu/autorest.typescript.server", "build:autorest:queue": "autorest ./swagger/queue.md --typescript --use=S:/GitHub/XiaoningLiu/autorest.typescript.server", "watch": "tsc -watch -p ./", diff --git a/src/blob/authentication/OperationAccountSASPermission.ts b/src/blob/authentication/OperationAccountSASPermission.ts index 4fdbc6871..f9c4dcd53 100644 --- a/src/blob/authentication/OperationAccountSASPermission.ts +++ b/src/blob/authentication/OperationAccountSASPermission.ts @@ -524,4 +524,13 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( ) ); +OPERATION_ACCOUNT_SAS_PERMISSIONS.set( + Operation.PageBlob_UpdateSequenceNumber, + new OperationAccountSASPermission( + AccountSASService.Blob, + AccountSASResourceType.Object, + AccountSASPermission.Write + ) +); + export default OPERATION_ACCOUNT_SAS_PERMISSIONS; diff --git a/src/blob/errors/StorageErrorFactory.ts b/src/blob/errors/StorageErrorFactory.ts index 0583a196a..3f394ebf1 100644 --- a/src/blob/errors/StorageErrorFactory.ts +++ b/src/blob/errors/StorageErrorFactory.ts @@ -343,6 +343,17 @@ export default class StorageErrorFactory { ); } + public static getAccessTierNotSupportedForBlobType( + contextID: string + ): StorageError { + return new StorageError( + 400, + "AccessTierNotSupportedForBlobType", + "The access tier is not supported for this blob type.", + contextID + ); + } + public static getBlobSnapshotsPresent_hassnapshot( contextID: string ): StorageError { diff --git a/src/blob/generated/artifacts/models.ts b/src/blob/generated/artifacts/models.ts index 982185ffa..579e53387 100644 --- a/src/blob/generated/artifacts/models.ts +++ b/src/blob/generated/artifacts/models.ts @@ -2354,15 +2354,6 @@ export interface PageBlobGetPageRangesDiffOptionalParams { * Timeouts for Blob Service Operations. */ timeout?: number; - /** - * Optional in version 2015-07-08 and newer. The prevsnapshot parameter is a DateTime value that - * specifies that the response will contain only pages that were changed between target blob and - * previous snapshot. Changed pages include both updated and cleared pages. The target blob may - * be a snapshot, as long as the snapshot specified by prevsnapshot is the older of the two. Note - * that incremental snapshots are currently supported only for blobs created on or after January - * 1, 2016. - */ - prevsnapshot?: string; /** * Return only the bytes of the blob in the specified range. */ diff --git a/src/blob/generated/artifacts/parameters.ts b/src/blob/generated/artifacts/parameters.ts index 7b86c8555..d50cd20b2 100644 --- a/src/blob/generated/artifacts/parameters.ts +++ b/src/blob/generated/artifacts/parameters.ts @@ -1070,11 +1070,9 @@ export const prefix: msRest.OperationQueryParameter = { } }; export const prevsnapshot: msRest.OperationQueryParameter = { - parameterPath: [ - "options", - "prevsnapshot" - ], + parameterPath: "prevsnapshot", mapper: { + required: true, serializedName: "prevsnapshot", type: { name: "String" diff --git a/src/blob/generated/handlers/IPageBlobHandler.ts b/src/blob/generated/handlers/IPageBlobHandler.ts index 64162e650..2e3fe9a8d 100644 --- a/src/blob/generated/handlers/IPageBlobHandler.ts +++ b/src/blob/generated/handlers/IPageBlobHandler.ts @@ -18,7 +18,7 @@ export default interface IPageBlobHandler { clearPages(contentLength: number, options: Models.PageBlobClearPagesOptionalParams, context: Context): Promise; uploadPagesFromURL(sourceUrl: string, sourceRange: string, contentLength: number, range: string, options: Models.PageBlobUploadPagesFromURLOptionalParams, context: Context): Promise; getPageRanges(options: Models.PageBlobGetPageRangesOptionalParams, context: Context): Promise; - getPageRangesDiff(options: Models.PageBlobGetPageRangesDiffOptionalParams, context: Context): Promise; + getPageRangesDiff(prevsnapshot: string, options: Models.PageBlobGetPageRangesDiffOptionalParams, context: Context): Promise; resize(blobContentLength: number, options: Models.PageBlobResizeOptionalParams, context: Context): Promise; updateSequenceNumber(sequenceNumberAction: Models.SequenceNumberActionType, options: Models.PageBlobUpdateSequenceNumberOptionalParams, context: Context): Promise; copyIncremental(copySource: string, options: Models.PageBlobCopyIncrementalOptionalParams, context: Context): Promise; diff --git a/src/blob/generated/handlers/handlerMappers.ts b/src/blob/generated/handlers/handlerMappers.ts index 895a960ac..39ca4576c 100644 --- a/src/blob/generated/handlers/handlerMappers.ts +++ b/src/blob/generated/handlers/handlerMappers.ts @@ -415,6 +415,7 @@ operationHandlerMapping[Operation.PageBlob_GetPageRanges] = { }; operationHandlerMapping[Operation.PageBlob_GetPageRangesDiff] = { arguments: [ + "prevsnapshot", "options" ], handler: "pageBlobHandler", diff --git a/src/blob/handlers/AppendBlobHandler.ts b/src/blob/handlers/AppendBlobHandler.ts index f8a7bf53d..d400334b0 100644 --- a/src/blob/handlers/AppendBlobHandler.ts +++ b/src/blob/handlers/AppendBlobHandler.ts @@ -30,6 +30,6 @@ export default class AppendBlobHandler extends BaseHandler options: Models.AppendBlobAppendBlockFromUrlOptionalParams, context: Context ): Promise { - throw new Error("Method not implemented."); + throw new NotImplementedError(context.contextId); } } diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 15785d1f6..2159d1eee 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -47,14 +47,14 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { options: Models.BlobSetAccessControlOptionalParams, context: Context ): Promise { - throw new Error("Method not implemented."); + throw new NotImplementedError(context.contextId); } public getAccessControl( options: Models.BlobGetAccessControlOptionalParams, context: Context ): Promise { - throw new Error("Method not implemented."); + throw new NotImplementedError(context.contextId); } public rename( @@ -62,7 +62,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { options: Models.BlobRenameOptionalParams, context: Context ): Promise { - throw new Error("Method not implemented."); + throw new NotImplementedError(context.contextId); } public copyFromURL( @@ -70,7 +70,7 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { options: Models.BlobCopyFromURLOptionalParams, context: Context ): Promise { - throw new Error("Method not implemented."); + throw new NotImplementedError(context.contextId); } /** diff --git a/src/blob/handlers/PageBlobHandler.ts b/src/blob/handlers/PageBlobHandler.ts index 6bf8660a7..5280883b2 100644 --- a/src/blob/handlers/PageBlobHandler.ts +++ b/src/blob/handlers/PageBlobHandler.ts @@ -43,7 +43,7 @@ export default class PageBlobHandler extends BaseHandler options: Models.PageBlobUploadPagesFromURLOptionalParams, context: Context ): Promise { - throw new Error("Method not implemented."); + throw new NotImplementedError(context.contextId); } public async create( @@ -58,6 +58,12 @@ export default class PageBlobHandler extends BaseHandler const blobName = blobCtx.blob!; const date = blobCtx.startTime!; + if (options.pageBlobAccessTier !== undefined) { + throw StorageErrorFactory.getAccessTierNotSupportedForBlobType( + context.contextId! + ); + } + if (contentLength !== 0) { throw StorageErrorFactory.getInvalidOperation( blobCtx.contextId!, @@ -373,6 +379,7 @@ export default class PageBlobHandler extends BaseHandler } public async getPageRangesDiff( + prevsnapshot: string, options: Models.PageBlobGetPageRangesDiffOptionalParams, context: Context ): Promise { diff --git a/src/blob/handlers/ServiceHandler.ts b/src/blob/handlers/ServiceHandler.ts index 46baf3323..32ed72206 100644 --- a/src/blob/handlers/ServiceHandler.ts +++ b/src/blob/handlers/ServiceHandler.ts @@ -1,4 +1,5 @@ import BlobStorageContext from "../context/BlobStorageContext"; +import NotImplementedError from "../errors/NotImplementedError"; import * as Models from "../generated/artifacts/models"; import Context from "../generated/Context"; import IServiceHandler from "../generated/handlers/IServiceHandler"; @@ -62,7 +63,7 @@ export default class ServiceHandler extends BaseHandler options: Models.ServiceGetUserDelegationKeyOptionalParams, context: Context ): Promise { - throw new Error("Method not implemented."); + throw new NotImplementedError(context.contextId); } public submitBatch( @@ -72,7 +73,7 @@ export default class ServiceHandler extends BaseHandler options: Models.ServiceSubmitBatchOptionalParams, context: Context ): Promise { - throw new Error("Method not implemented."); + throw new NotImplementedError(context.contextId); } /** diff --git a/src/blob/middlewares/StrictModelMiddlewareFactory.ts b/src/blob/middlewares/StrictModelMiddlewareFactory.ts index a3bc3ade7..bd205c85d 100644 --- a/src/blob/middlewares/StrictModelMiddlewareFactory.ts +++ b/src/blob/middlewares/StrictModelMiddlewareFactory.ts @@ -32,7 +32,12 @@ export const UnsupportedHeadersBlocker: StrictModelRequestValidator = async ( HeaderConstants.X_MS_IF_SEQUENCE_NUMBER_LT, HeaderConstants.X_MS_IF_SEQUENCE_NUMBER_EQ, HeaderConstants.X_MS_BLOB_CONDITION_MAXSIZE, - HeaderConstants.X_MS_BLOB_CONDITION_APPENDPOS + HeaderConstants.X_MS_BLOB_CONDITION_APPENDPOS, + HeaderConstants.X_MS_CONTENT_CRC64, + HeaderConstants.X_MS_RANGE_GET_CONTENT_CRC64, + HeaderConstants.X_MS_ENCRYPTION_KEY, + HeaderConstants.X_MS_ENCRYPTION_KEY_SHA256, + HeaderConstants.X_MS_ENCRYPTION_ALGORITHM ]; for (const headerKey of UnsupportedHeaderKeys) { diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 890f34b2e..6092e2980 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -1797,7 +1797,9 @@ export default class LokiBlobMetadataStore doc.properties.accessTier = tier; doc.properties.accessTierChangeTime = context.startTime; } else { - throw StorageErrorFactory.getBlobInvalidBlobType(context.contextId!); + throw StorageErrorFactory.getAccessTierNotSupportedForBlobType( + context.contextId! + ); } new BlobWriteLeaseSyncer(doc).sync(lease); diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index 80e211487..5506b00c7 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -499,9 +499,13 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { } if (marker !== "") { - whereQuery.containerName = { - [Op.gt]: marker - }; + if (whereQuery.containerName === undefined) { + whereQuery.containerName = { + [Op.gt]: marker + }; + } else { + whereQuery.containerName[Op.gt] = marker; + } } const findResult = await ContainersModel.findAll({ @@ -1161,18 +1165,25 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { accountName: account, containerName: container }; + if (blob !== undefined) { whereQuery.blobName = blob; - } - if (prefix.length > 0) { - whereQuery.blobName = { - [Op.like]: `${prefix}%` - }; - } - if (marker !== undefined) { - whereQuery.blobName = { - [Op.gt]: marker - }; + } else { + if (prefix.length > 0) { + whereQuery.blobName = { + [Op.like]: `${prefix}%` + }; + } + + if (marker !== undefined) { + if (whereQuery.blobName !== undefined) { + whereQuery.blobName[Op.gt] = marker; + } else { + whereQuery.blobName = { + [Op.gt]: marker + }; + } + } } if (!includeSnapshots) { whereQuery.snapshot = ""; @@ -2462,7 +2473,9 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { accessTier = tier; } else { - throw StorageErrorFactory.getBlobInvalidBlobType(context.contextId!); + throw StorageErrorFactory.getAccessTierNotSupportedForBlobType( + context.contextId! + ); } await BlobsModel.update( { diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 61b952b97..2fa928099 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -52,6 +52,11 @@ export const HeaderConstants = { X_MS_IF_SEQUENCE_NUMBER_EQ: "x-ms-if-sequence-number-eq", X_MS_BLOB_CONDITION_MAXSIZE: "x-ms-blob-condition-maxsize", X_MS_BLOB_CONDITION_APPENDPOS: "x-ms-blob-condition-appendpos", + X_MS_CONTENT_CRC64: "x-ms-content-crc64", + X_MS_RANGE_GET_CONTENT_CRC64: "x-ms-range-get-content-crc64", + X_MS_ENCRYPTION_KEY: "x-ms-encryption-key", + X_MS_ENCRYPTION_KEY_SHA256: "x-ms-encryption-key-sha256", + X_MS_ENCRYPTION_ALGORITHM: "x-ms-encryption-algorithm", PREFIX_FOR_STORAGE: "x-ms-", RANGE: "Range", USER_AGENT: "User-Agent", diff --git a/src/queue/utils/utils.ts b/src/queue/utils/utils.ts index 87814ad7f..1504850c5 100644 --- a/src/queue/utils/utils.ts +++ b/src/queue/utils/utils.ts @@ -278,20 +278,7 @@ export async function readStreamToString( * @memberof LokiQueueDataStore */ export function getUTF8ByteSize(text: string): number { - let byteSize = 0; - for (let i = 0; i < text.length; i++) { - const charCode = text.charCodeAt(i); - if (charCode <= 0x007f) { - byteSize += 1; - } else if (charCode <= 0x07ff) { - byteSize += 2; - } else if (charCode <= 0xffff) { - byteSize += 3; - } else { - byteSize += 4; - } - } - return byteSize; + return Buffer.from(text, "utf8").length; } /** diff --git a/swagger/blob-storage-2019-02-02.json b/swagger/blob-storage-2019-02-02.json index aa4a884b8..615af475f 100644 --- a/swagger/blob-storage-2019-02-02.json +++ b/swagger/blob-storage-2019-02-02.json @@ -9594,7 +9594,7 @@ "PrevSnapshot": { "name": "prevsnapshot", "in": "query", - "required": false, + "required": true, "type": "string", "x-ms-parameter-location": "method", "description": "Optional in version 2015-07-08 and newer. The prevsnapshot parameter is a DateTime value that specifies that the response will contain only pages that were changed between target blob and previous snapshot. Changed pages include both updated and cleared pages. The target blob may be a snapshot, as long as the snapshot specified by prevsnapshot is the older of the two. Note that incremental snapshots are currently supported only for blobs created on or after January 1, 2016." From 52642a529e1131b168983ed4779b6f2f23da162d Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Wed, 25 Dec 2019 20:58:33 +0800 Subject: [PATCH 29/34] Bump up version number to 3.4.0; Update documents; (#362) --- BreakingChanges.md | 12 +++++++----- ChangeLog.md | 27 +++++++++++++------------- README.mcr.md | 6 ++++-- README.md | 37 +++++++++++++++++++++--------------- package-lock.json | 2 +- package.json | 4 ++-- src/blob/utils/constants.ts | 2 +- src/queue/utils/constants.ts | 2 +- 8 files changed, 52 insertions(+), 40 deletions(-) diff --git a/BreakingChanges.md b/BreakingChanges.md index 2df270251..1752d8907 100644 --- a/BreakingChanges.md +++ b/BreakingChanges.md @@ -2,13 +2,15 @@ > Note. This file includes breaking changes after 3.0.0-preview. For legacy Azurite changes, please goto GitHub [releases](https://github.com/Azure/Azurite/releases). -# Incoming Release +## 2019.12 Version 3.4.0 -- [Breaking] Apply LokiFsStructuredAdapter as default blob metadata loki adapter to improve performance. +- [Breaking] By default Azurite will block requests with unsupported headers or parameters which may impact data integrity. + - Skip this by switching to loose mode by Azurite configuration parameter `--loose`. +- [Breaking] Apply `LokiFsStructuredAdapter` as default blob metadata loki adapter to improve performance. + - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. +- [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. -- [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. Please clean up Azurite previous version workspace data files and restart Azurite. -- [Breaking] By default Azurite will block requests with unsupported headers or parameters which may impact data integrity. Skip this by switching to loose mode by Azurite parameter "--loose". -# 2019.11 Version 3.3.0-preview +## 2019.11 Version 3.3.0-preview - [Breaking] This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. \ No newline at end of file diff --git a/ChangeLog.md b/ChangeLog.md index 7ea78b309..1561b30c4 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -2,22 +2,23 @@ > Note. This file includes changes after 3.0.0-preview. For legacy Azurite changes, please goto GitHub [releases](https://github.com/Azure/Azurite/releases). -# Upcoming Release +## 2019.12 Version 3.4.0 -- Fixed a bug that to return the list of containers in sorted order. -- Fixed a bug that get/download blob snapshot fail. +- Return the list of containers will be in sorted order. +- Fixed a bug that get/download blob snapshot fails. - Check input request "x-ms-version" Header, only valid version are allowed. - Fixed a race condition that GC will delete active write extents. - Force flush data into disk before data upload request returns. -- [Breaking] By default Azurite will block requests with unsupported headers or parameters which may impact data integrity. Skip this by switching to loose mode by Azurite parameter "--loose". +- [Breaking] By default Azurite will block requests with unsupported headers or parameters which may impact data integrity. + - Skip this by switching to loose mode by Azurite configuration parameter `--loose`. Blob: -- [Breaking] Apply LokiFsStructuredAdapter as default blob metadata loki adapter to improve performance. +- [Breaking] Apply `LokiFsStructuredAdapter` as default blob metadata loki adapter to improve performance. - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. -- [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. Please clean up Azurite previous version workspace data files and restart Azurite. -- [Breaking] Remove MariaDb from SQL support temporarily due to license issue. -- In getBlockList, filter the returned block list with input BlockListingFilter. +- [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. + - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. +- List blocks will filter the returned block list with input BlockListingFilter. - Added support for CORS. - AllowedHeaders and ExposedHeaders are optional now when setting CORS. - Added support to create block blob with empty block list. @@ -25,7 +26,7 @@ Blob: - Fix the issue that Copy Blob will overwrite the destination blob Lease status. - Fix the issue that Change Lease fail when blob lease id only matches the input ProposedLeaseId. - Fix the issue that UploadPage, ClearPage will fail on leased Page blob, even input correct lease id. -- Change some lease error code to align with server. +- Update some lease error codes to align with Azure Storage. - Fixed a bug that set blob tier doesn't work with account SAS. - Fixed a bug that Azurite Blob service cannot start in Mac as Visual Studio Extension. - Fixed a bug that persistency location cannot be customized through -l parameter. @@ -44,7 +45,7 @@ Queue: - Fix Put message fail with max messagettl. - Updated message size calculation when checking 64KB limitation. -# 2019.11 Version 3.3.0-preview +## 2019.11 Version 3.3.0-preview - Azurite now supports customized account names and keys by environment variable `AZURITE_ACCOUNTS`. - Improved logging for underlayer operations, such as persistency data read and write operations. @@ -69,7 +70,7 @@ Queue: - Responses now includes x-ms-client-request-id when request provided client request ID. -# 2019.08 Version 3.2.0-preview +## 2019.08 Version 3.2.0-preview - Updated repository link to https to compatible with Visual Studio Code. @@ -83,7 +84,7 @@ Queue: - Decoupled persistence layer into service metadata storage and extent file storage. - Supported Cors and Preflight in Queue service. -# 2019.06 Version 3.1.2-preview +## 2019.06 Version 3.1.2-preview - Integrated Azurite with Visual Studio Code as an extension. - Added Visual Studio Code extension usage guidelines. @@ -93,6 +94,6 @@ Queue: - Fixed an issue that metadata doesn't get copied when copy blob. - Fixed GetBlockBlob missing Content-Range header -# 2019.05 Version 3.0.0-preview +## 2019.05 Version 3.0.0-preview - Initial Release of Azurite V3. diff --git a/README.mcr.md b/README.mcr.md index 0ba927c51..7824b5144 100644 --- a/README.mcr.md +++ b/README.mcr.md @@ -6,7 +6,7 @@ # Full Tag Listing - latest -- [changelog](https://github.com/Azure/Azurite/blob/master/ChangeLog.md) +- [More history versions](https://github.com/Azure/Azurite/blob/master/ChangeLog.md) # About this Image @@ -40,7 +40,7 @@ docker run -p 10000:10000 -p 10001:10001 -v c:/azurite:/data mcr.microsoft.com/a **Customize all Azurite V3 supported parameters for docker image** ```bash -docker run -p 8888:8888 -p 9999:9999 -v c:/azurite:/workspace mcr.microsoft.com/azure-storage/azurite azurite -l /workspace -d /workspace/debug.log --blobPort 8888 --blobHost 0.0.0.0 --queuePort 9999 --queueHost 0.0.0.0 +docker run -p 8888:8888 -p 9999:9999 -v c:/azurite:/workspace mcr.microsoft.com/azure-storage/azurite azurite -l /workspace -d /workspace/debug.log --blobPort 8888 --blobHost 0.0.0.0 --queuePort 9999 --queueHost 0.0.0.0 --loose ``` Above command will try to start Azurite image with configurations: @@ -57,6 +57,8 @@ Above command will try to start Azurite image with configurations: `--queueHost 0.0.0.0` defines queue service listening endpoint to accept requests from host machine. +`--loose` enables loose mode which ignore unsupported headers and parameters. + > In above sample, you need to use **double first forward slash** for location and debug path parameters to avoid a [known issue](https://stackoverflow.com/questions/48427366/docker-build-command-add-c-program-files-git-to-the-path-passed-as-build-argu) for Git on Windows. ## Documentation diff --git a/README.md b/README.md index ea5cd18b4..37cfcb85f 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ | Version | Azure Storage API Version | Service Support | Description | Reference Links | | ------------------------------------------------------------------ | ------------------------- | --------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.3.0-preview | 2019-02-02 | Blob
Queue | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | +| 3.4.0 | 2019-02-02 | Blob
Queue | Azurite V3 based on TypeScript & New Architecture | [NPM](https://www.npmjs.com/package/azurite) - [Docker](https://hub.docker.com/_/microsoft-azure-storage-azurite) - [Visual Studio Code Extension](https://marketplace.visualstudio.com/items?itemName=Azurite.azurite) | | [Legacy (v2)](https://github.com/Azure/Azurite/tree/legacy-master) | 2016-05-31 | Blob, Queue and Table | Legacy Azurite V2 | [NPM](https://www.npmjs.com/package/azurite) | ## Introduction @@ -44,7 +44,7 @@ Compared to V2, Azurite V3 implements a new architecture leveraging code generat - Detailed debugging log support, easy bug locating and reporting - Works with storage .Net SDK basic and advanced sample - SharedKey, AccountSAS, ServiceSAS, Public Access authentication support - - API version targeting 2018-02-02 (Refer to support matrix) + - Keep updating with latest Azure Storage API version features (Refer to support matrix) ## Getting Started @@ -171,7 +171,7 @@ Above command will try to start Azurite image with configurations: `--queueHost 0.0.0.0` defines queue service listening endpoint to accept requests from host machine. -`--loose` enables loose mode which ignore unsupported headers and parameters +`--loose` enables loose mode which ignore unsupported headers and parameters. > In above sample, you need to use **double first forward slash** for location and debug path parameters to avoid a [known issue](https://stackoverflow.com/questions/48427366/docker-build-command-add-c-program-files-git-to-the-path-passed-as-build-argu) for Git on Windows. @@ -278,6 +278,8 @@ An option to bypass authentication is **NOT** provided in Azurite V3. ## Supported Environment Variable Options +When starting Azurite from npm command line `azurite` or docker image, following environment variables are supported for advanced customization. + ### Customized Storage Accounts & Keys Azurite V3 allows customizing storage account names and keys by providing environment variable `AZURITE_ACCOUNTS` with format `account1:key1[:key2];account2:key1[:key2];...`. @@ -305,16 +307,19 @@ Azurite will refresh customized account name and key from environment variable e ### Customized Metadata Storage by External Database (Preview) By default, Azurite leverages [loki](https://github.com/techfort/LokiJS) as metadata database. -However, loki limits Azurite's scalability and extensibility. +However, as an in-memory database, loki limits Azurite's scalability and data persistency. Set environment variable `AZURITE_DB=dialect://[username][:password][@]host:port/database` to make Azurite blob service switch to a SQL database based metadata storage, like MySql, SqlServer. For example, connect to MySql or SqlServer by set environment variables: ```bash -set AZURITE_DB=mysql://localhost:3306/azurite_blob +set AZURITE_DB=mysql://username:password@localhost:3306/azurite_blob set AZURITE_DB=mssql://username:password@localhost:1024/azurite_blob ``` +When Azurite starts with above environment variable, it connects to the configured database, and creates tables if not exist. +This feature is in preview, when Azurite changes database table schema, you need to drop existing tables and let Azurite regenerate database tables. + > Note. Need to manually create database before starting Azurite instance. > Note. Blob Copy & Page Blob are not supported by SQL based metadata implementation. @@ -441,19 +446,21 @@ Azurite V3 follows a **Try best to serve** compatible strategy with Azure Storag - A Swagger definition (OpenAPI doc) with the same API version will be used to generate protocol layer APIs and interfaces. - Azurite should implement all the possible features provided in this API service version. - If an incoming request has **the same API version** Azurite provides, Azurite should handle the request with parity to Azure Storage. -- If an incoming request has a **higher API version** than Azurite, Azurite will return a VersionNotSupportedByEmulator error (HTTP status code 400 - Bad Request). -- If an incoming request has a **lower API version** header than Azurite, Azurite will attempt to handle the request with Azurite’s baseline API version behavior instead of that specified in the request. +- If an incoming request has a **higher API version** than Azurite, Azurite will return a InvalidHeaderValue error for `x-ms-version` (HTTP status code 400 - Bad Request). +- If an incoming request has a **lower API version** header than Azurite, Azurite will attempt to handle the request with Azurite's baseline API version behavior instead of that specified in the request. - Azurite will return API version in response header as the baseline API version - SAS accepts pattern from API version 2015-04-05 ### RA-GRS -Azurite supports read-access geo-redundant replication (RA-GRS). For storage resources both in the cloud and in the local emulator, you can access the secondary location by appending -secondary to the account name. For example, the following address might be used for accessing a blob using the read-only secondary in Azurite: +Azurite supports read-access geo-redundant replication (RA-GRS). For storage resources both in the cloud and in the local emulator, you can access the secondary location by appending -secondary to the account name. For example, the following address might be used for accessing a blob using the secondary in Azurite: ``` http://127.0.0.1:10000/devstoreaccount1-secondary/mycontainer/myblob.txt ``` +> Note. Secondary endpoint is not read-only in Azurite, which diffs from Azure Storage. + ## Differences between Azurite V3 and Azurite V2 Both Azurite V3 and Azurite V2 aim to provide a convenient emulation for customers to quickly try out Azure Storage services locally. There are lots of differences between Azurite V3 and legacy Azurite V2. @@ -495,10 +502,11 @@ All the generated code is kept in `generated` folder, including the generated mi ## Support Matrix -3.3.0-preview release targets **2019-02-02** API version **blob** service. +3.4.0 release targets **2019-02-02** API version **blob** service. Detailed support matrix: - Supported Vertical Features + - CORS and Preflight - SharedKey Authentication - Shared Access Signature Account Level - Shared Access Signature Service Level (Not support response header override in service SAS) @@ -516,7 +524,7 @@ Detailed support matrix: - Get Container ACL - Set Container ACL - Delete Container - - Lease Container (Access control based on lease is partial support) + - Lease Container - List Blobs - Put Blob (Create append blob is not supported) - Get Blob @@ -524,23 +532,22 @@ Detailed support matrix: - Set Blob Properties - Get Blob Metadata - Set Blob Metadata - - Lease Blob (access control based on lease is partial support) + - Lease Blob - Snapshot Blob - Copy Blob (Only supports copy within same account in Azurite) - Abort Copy Blob (Only supports copy within same account in Azurite) - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) - OAuth authentication - - Access control based on conditional headers, container/blob lease (lease control is limited supported) - - CORS and Preflight + - Access control based on conditional headers (Requests will be blocked in strict mode) - Static Website - Soft delete & Undelete Blob - Put Block from URL - Incremental Copy Blob - Create Append Blob, Append Block - 3.3.0-preview release added support for **2019-02-02** API version **queue** service. - Detailed support matrix: + 3.4.0 release added support for **2019-02-02** API version **queue** service. + Detailed support matrix: - Supported Vertical Features - SharedKey Authentication diff --git a/package-lock.json b/package-lock.json index 7ebf0f858..58a340591 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "azurite", - "version": "3.3.0-preview", + "version": "3.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0621cb989..2dfaf8961 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "displayName": "Azurite", "description": "An open source Azure Storage API compatible server", "icon": "icon.png", - "version": "3.3.0-preview", - "preview": true, + "version": "3.4.0", + "preview": false, "publisher": "Azurite", "categories": [ "Other" diff --git a/src/blob/utils/constants.ts b/src/blob/utils/constants.ts index 2fa928099..fb0da02a8 100644 --- a/src/blob/utils/constants.ts +++ b/src/blob/utils/constants.ts @@ -1,7 +1,7 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; import * as Models from "../generated/artifacts/models"; -export const VERSION = "3.3.0-preview"; +export const VERSION = "3.4.0"; export const BLOB_API_VERSION = "2019-02-02"; export const DEFAULT_BLOB_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_LIST_BLOBS_MAX_RESULTS = 5000; diff --git a/src/queue/utils/constants.ts b/src/queue/utils/constants.ts index c20d65cc0..11690d56a 100644 --- a/src/queue/utils/constants.ts +++ b/src/queue/utils/constants.ts @@ -1,6 +1,6 @@ import { StoreDestinationArray } from "../../common/persistence/IExtentStore"; -export const VERSION = "3.3.0-preview"; +export const VERSION = "3.4.0"; export const QUEUE_API_VERSION = "2019-02-02"; export const DEFAULT_QUEUE_SERVER_HOST_NAME = "127.0.0.1"; // Change to 0.0.0.0 when needs external access export const DEFAULT_QUEUE_LISTENING_PORT = 10001; From fd34188753c5b4c37423a64ee9253bb7a34349fb Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Thu, 26 Dec 2019 11:01:59 +0800 Subject: [PATCH 30/34] Update Notice.txt; Some minor issue fixs found during release check (#365) * Remove loki fs structure adapter for compatible issues * Enable encrypt connection for SQL Server * Update ignore files * Added notice.txt; Update dockerfile to list included files; Remove preview tag for VSC extension; --- .dockerignore | 17 + .npmignore | 6 +- .vscodeignore | 5 + BreakingChanges.md | 4 +- ChangeLog.md | 4 +- Dockerfile | 1 + NOTICE.txt | 21556 ++++++++++++++++ package.json | 3 +- src/blob/persistence/LokiBlobMetadataStore.ts | 8 - src/blob/persistence/SqlBlobMetadataStore.ts | 7 + .../persistence/SqlExtentMetadataStore.ts | 7 + 11 files changed, 21601 insertions(+), 17 deletions(-) create mode 100644 NOTICE.txt diff --git a/.dockerignore b/.dockerignore index d459c651a..d68cab6f4 100644 --- a/.dockerignore +++ b/.dockerignore @@ -3,3 +3,20 @@ node_modules/** swagger/** __blobstorage__/** __queuestorage__/** +__*.json +__*__ +*.tgz +*.vsix +*.log +*.png +*.env +*.yml +temp +swagger +.git +.gitattributes +.gitignore +.lintstagedrc +.vscode +.vscodeignore +dist \ No newline at end of file diff --git a/.npmignore b/.npmignore index 74a900d93..3fc8b4efb 100644 --- a/.npmignore +++ b/.npmignore @@ -22,4 +22,8 @@ debug.log __*__.json __*__ *.env -temp \ No newline at end of file +temp +.gitattributes +.dockerignore +README.mcr.md +icon.png \ No newline at end of file diff --git a/.vscodeignore b/.vscodeignore index c96f57a61..a9387e324 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -8,6 +8,7 @@ azure-pipelines.yml .lintstagedrc .gitignore .npmignore +.dockerignore Dockerfile __blobstorage__ typings @@ -20,5 +21,9 @@ debug.log *.tgz __*__.json __*__ +__queuestorage__ +__blobstorage__ +__queueTestsPersistence__ +__* *.env temp \ No newline at end of file diff --git a/BreakingChanges.md b/BreakingChanges.md index 1752d8907..0cff25b6d 100644 --- a/BreakingChanges.md +++ b/BreakingChanges.md @@ -6,11 +6,9 @@ - [Breaking] By default Azurite will block requests with unsupported headers or parameters which may impact data integrity. - Skip this by switching to loose mode by Azurite configuration parameter `--loose`. -- [Breaking] Apply `LokiFsStructuredAdapter` as default blob metadata loki adapter to improve performance. - - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. - [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. ## 2019.11 Version 3.3.0-preview -- [Breaking] This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. \ No newline at end of file +- [Breaking] This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. diff --git a/ChangeLog.md b/ChangeLog.md index 1561b30c4..20d61b614 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -14,8 +14,6 @@ Blob: -- [Breaking] Apply `LokiFsStructuredAdapter` as default blob metadata loki adapter to improve performance. - - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. - [Breaking] Azurite updates underline metadata schema which does not compatible with previous versions. - This version cannot guarantee compatible with persisted database models file by previous version. Remove previous metadata file and restart Azurite in case any errors. - List blocks will filter the returned block list with input BlockListingFilter. @@ -43,7 +41,7 @@ Queue: - AllowedHeaders and ExposedHeaders are optional now when setting CORS. - Fix Put message fail with max messagettl. -- Updated message size calculation when checking 64KB limitation. +- Updated message size calculation when checking 64KB limitation. ## 2019.11 Version 3.3.0-preview diff --git a/Dockerfile b/Dockerfile index ef9ef376b..0b947130e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,6 +10,7 @@ COPY . . RUN npm config set unsafe-perm=true RUN npm ci RUN npm run build +RUN ls -l RUN npm install -g # Blob Storage Port diff --git a/NOTICE.txt b/NOTICE.txt new file mode 100644 index 000000000..0fe1bd882 --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,21556 @@ +NOTICES AND INFORMATION +Do Not Translate or Localize + +This software incorporates material from third parties. +Microsoft makes certain open source code available at https://3rdpartysource.microsoft.com, +or you may send a check or money order for US $5.00, including the product name, +the open source component name, platform, and version number, to: + +Source Code Compliance Team +Microsoft Corporation +One Microsoft Way +Redmond, WA 98052 +USA + +Notwithstanding any other terms, you may reverse engineer this software to the extent +required to debug changes to any libraries licensed under the GNU Lesser General Public License. + + +------------------------------------------------------------------- + +adal-node 0.1.28 - Apache-2.0 +https://github.com/AzureAD/azure-activedirectory-library-for-nodejs#readme +Copyright (c) Microsoft Open Technologies, Inc. + + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +aws-sign2 0.7.0 - Apache-2.0 +https://github.com/mikeal/aws-sign#readme +Copyright 2010 LearnBoost + +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 + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +caseless 0.12.0 - Apache-2.0 +https://github.com/mikeal/caseless#readme + +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 + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +denque 1.4.1 - Apache-2.0 +https://github.com/invertase/denque#readme +Copyright (c) 2018 Mike Diarmid + +Copyright (c) 2018 Mike Diarmid (Salakar) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this library 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +didyoumean 1.2.1 - Apache-2.0 +https://github.com/dcporter/didyoumean.js +copyright (c) 2013 Dave Porter. +copyright (c) 2013-2014 Dave Porter. + +## License + +didYouMean.js copyright (c) 2013 Dave Porter. + +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 +[here](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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ecdsa-sig-formatter 1.0.11 - Apache-2.0 +https://github.com/Brightspace/node-ecdsa-sig-formatter#readme +Copyright 2015 D2L Corporation + +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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015 D2L Corporation + + 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +forever-agent 0.6.1 - Apache-2.0 +https://github.com/mikeal/forever-agent + +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 + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +jsbi 3.1.1 - Apache-2.0 +https://github.com/GoogleChromeLabs/jsbi#readme + + Apache License + Version 2.0, January 2004 + https://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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +long 4.0.0 - Apache-2.0 +https://github.com/dcodeIO/long.js#readme + + + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +oauth-sign 0.9.0 - Apache-2.0 +https://github.com/mikeal/oauth-sign#readme + +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 + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +request 2.88.0 - Apache-2.0 +https://github.com/request/request#readme +Copyright 2010-2012 Mikeal Rogers + +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 + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +rxjs 6.5.3 - Apache-2.0 +https://github.com/ReactiveX/RxJS +Copyright Google Inc. +Copyright (c) Microsoft Corporation. +Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + + 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. + + + + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + + 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. + + + + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + + 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. + + + + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + + 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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +spdx-correct 3.1.0 - Apache-2.0 +https://github.com/jslicense/spdx-correct.js#readme + + + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tslib 1.10.0 - Apache-2.0 +http://typescriptlang.org/ +Copyright (c) Microsoft Corporation. + +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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tslint 5.20.0 - Apache-2.0 +https://palantir.github.io/tslint +Copyright 2018 +Copyright 2013 Palantir Technologies, Inc. +Copyright 2014 Palantir Technologies, Inc. +Copyright 2015 Palantir Technologies, Inc. +Copyright 2016 Palantir Technologies, Inc. +Copyright 2017 Palantir Technologies, Inc. +Copyright 2018 Palantir Technologies, Inc. +Copyright 2019 Palantir Technologies, Inc. + + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tunnel-agent 0.6.0 - Apache-2.0 +https://github.com/mikeal/tunnel-agent#readme + +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 + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +typescript 3.6.3 - Apache-2.0 +https://www.typescriptlang.org/ +(c) by W3C +Copyright Grant. I +Copyright (c) 2018 WHATWG +Copyright (c) Microsoft Corporation. +Copyright (c) 1991-2017 Unicode, Inc. +Copyright (c) 2018 The Khronos Group Inc. +Copyright (c) YEAR W3C(r) (MIT, ERCIM, Keio, Beihang). Disclaimers THIS WORK IS PROVIDED AS + +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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +validate-npm-package-license 3.0.4 - Apache-2.0 +https://github.com/kemitchell/validate-npm-package-license.js#readme + + + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cls-bluebird 2.1.0 - BSD-2-Clause +https://github.com/TimBeyer/cls-bluebird#readme + +Copyright (c) . 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 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +css-select 1.2.0 - BSD-2-Clause +https://github.com/fb55/css-select#readme +Copyright (c) Felix Bohm + +Copyright (c) Felix Böhm +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 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, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +css-what 2.1.3 - BSD-2-Clause +https://github.com/fb55/css-what#readme +Copyright (c) Felix Bohm + +Copyright (c) Felix Böhm +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 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, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +domelementtype 1.3.1 - BSD-2-Clause +https://github.com/fb55/domelementtype#readme +Copyright (c) Felix Bohm + +Copyright (c) Felix Böhm +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 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, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +domhandler 2.4.2 - BSD-2-Clause +https://github.com/fb55/DomHandler#readme +Copyright (c) Felix Bohm + +Copyright (c) Felix Böhm +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 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, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +domutils 1.5.1 - BSD-2-Clause +https://github.com/FB55/domutils +Copyright (c) Felix Bohm + +Copyright (c) Felix Böhm +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 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, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +entities 1.1.2 - BSD-2-Clause +https://github.com/fb55/entities#readme +Copyright (c) Felix Bohm +(c) // http://mathiasbynens.be/notes/javascript-encoding + +Copyright (c) Felix Böhm +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 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, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +esprima 4.0.1 - BSD-2-Clause +http://esprima.org +Copyright JS Foundation and other contributors, https://js.foundation + +Copyright JS Foundation and other contributors, https://js.foundation/ + +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 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +esutils 2.0.3 - BSD-2-Clause +https://github.com/estools/esutils +Copyright (c) 2014 Ivan Nikulin +Copyright (c) 2013 Yusuke Suzuki +Copyright (c) 2013-2014 Yusuke Suzuki +Copyright (c) 2013 Yusuke Suzuki (http://github.com/Constellation) + +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 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +normalize-package-data 2.5.0 - BSD-2-Clause +https://github.com/npm/normalize-package-data#readme +Copyright (c) Meryn Stol +Copyright (c) 2013 Meryn Stol + +This package contains code originally written by Isaac Z. Schlueter. +Used with permission. + +Copyright (c) Meryn Stol ("Author") +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 AUTHOR 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 AUTHOR 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +nth-check 1.0.2 - BSD-2-Clause +https://github.com/fb55/nth-check +Copyright (c) Felix Bohm + +Copyright (c) Felix Böhm +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 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, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +regjsparser 0.1.5 - BSD-2-Clause +https://github.com/jviereck/regjsparser + +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 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +shimmer 1.2.1 - BSD-2-Clause +https://github.com/othiym23/shimmer#readme +Copyright (c) 2013-2019, Forrest L Norvell + +BSD 2-Clause License + +Copyright (c) 2013-2019, Forrest L Norvell +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +staged-git-files 1.1.2 - BSD-2-Clause +https://github.com/mcwhittemore/staged-git-files#readme +Copied (c) Deleted + +Copyright (c) . 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 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +stringify-object 3.3.0 - BSD-2-Clause +https://github.com/yeoman/stringify-object#readme +(c) Yeoman team +Copyright (c) 2015, Yeoman team + +Copyright (c) 2015, Yeoman team +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +uri-js 4.2.2 - BSD-2-Clause +https://github.com/garycourt/uri-js +(c) 2011 Gary Court. +Copyright 2011 Gary Court. +Copyright (c) 2008 Ariel Flesler +Copyright (c) 2009 John Resig, Jorn Zaefferer + +Copyright (c) . 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 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +bcrypt-pbkdf 1.0.2 - BSD-3-Clause +https://github.com/joyent/node-bcrypt-pbkdf#readme +Copyright 2016, Joyent Inc +Copyright (c) 2013 Ted Unangst +Copyright 1997 Niels Provos + +The Blowfish portions are under the following license: + +Blowfish block cipher for OpenBSD +Copyright 1997 Niels Provos +All rights reserved. + +Implementation advice by David Mazieres . + +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. The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 bcrypt_pbkdf portions are under the following license: + +Copyright (c) 2013 Ted Unangst + +Permission to use, copy, modify, and 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. + + + +Performance improvements (Javascript-specific): + +Copyright 2016, Joyent Inc +Author: Alex Wilson + +Permission to use, copy, modify, and 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +buffer-equal-constant-time 1.0.1 - BSD-3-Clause +(c) 2013 GoInstant Inc., a salesforce.com company +Copyright (c) 2013, GoInstant Inc., a salesforce.com company + +Copyright (c) 2013, GoInstant Inc., a salesforce.com company +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 salesforce.com, nor GoInstant, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +diff 3.5.0 - BSD-3-Clause +https://github.com/kpdecker/jsdiff#readme +Copyright (c) 2009-2015, Kevin Decker + +Software License Agreement (BSD License) + +Copyright (c) 2009-2015, Kevin Decker + +All rights reserved. + +Redistribution and use of this software 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 Kevin Decker 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 4.0.1 - BSD-3-Clause +https://github.com/kpdecker/jsdiff#readme +Copyright (c) 2009-2015, Kevin Decker + +Software License Agreement (BSD License) + +Copyright (c) 2009-2015, Kevin Decker + +All rights reserved. + +Redistribution and use of this software 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 Kevin Decker 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +qs 6.5.2 - BSD-3-Clause +https://github.com/ljharb/qs +Copyright (c) 2014 Nathan LaFreniere and other contributors. + +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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +qs 6.7.0 - BSD-3-Clause +https://github.com/ljharb/qs +Copyright (c) 2014 Nathan LaFreniere and other contributors. + +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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +source-map 0.5.7 - BSD-3-Clause +https://github.com/mozilla/source-map +Copyright 2011 The Closure Compiler +Copyright 2011 Mozilla Foundation and contributors +Copyright 2014 Mozilla Foundation and contributors +Copyright 2009-2011 Mozilla Foundation and contributors +Copyright (c) 2009-2011, Mozilla Foundation and contributors + + +Copyright (c) 2009-2011, Mozilla Foundation and 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. + +* Neither the names of the Mozilla Foundation nor the names of project + 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +source-map 0.6.1 - BSD-3-Clause +https://github.com/mozilla/source-map +Copyright 2011 The Closure Compiler +Copyright 2011 Mozilla Foundation and contributors +Copyright 2014 Mozilla Foundation and contributors +Copyright 2009-2011 Mozilla Foundation and contributors +Copyright (c) 2009-2011, Mozilla Foundation and contributors + + +Copyright (c) 2009-2011, Mozilla Foundation and 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. + +* Neither the names of the Mozilla Foundation nor the names of project + 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +sprintf-js 1.0.3 - BSD-3-Clause +https://github.com/alexei/sprintf.js#readme +Copyright (c) 2007-2014, Alexandru Marasteanu + +Copyright (c) 2007-2014, Alexandru Marasteanu +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 this software 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 AUTHORS OR COPYRIGHT HOLDERS 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +sprintf-js 1.1.2 - BSD-3-Clause +https://github.com/alexei/sprintf.js#readme +Copyright (c) 2007-present, Alexandru Marasteanu + +Copyright (c) 2007-present, Alexandru Mărășteanu +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 this software 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 AUTHORS OR COPYRIGHT HOLDERS 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +synchronous-promise 2.0.10 - BSD-3-Clause +https://github.com/fluffynuts/synchronous-promise#readme +Copyright (c) 2016, Davyd McColl + +Copyright (c) 2016, Davyd McColl +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 synchronous-promise 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tough-cookie 2.4.3 - BSD-3-Clause +https://github.com/salesforce/tough-cookie +Copyright (c) 2015, Salesforce.com, Inc. +Copyright (c) 2018, Salesforce.com, Inc. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tough-cookie 3.0.1 - BSD-3-Clause +https://github.com/salesforce/tough-cookie +Copyright (c) 2015, Salesforce.com, Inc. +Copyright (c) 2018, Salesforce.com, Inc. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tough-cookie 2.5.0 - BSD-3-Clause +https://github.com/salesforce/tough-cookie +Copyright (c) 2015, Salesforce.com, Inc. +Copyright (c) 2018, Salesforce.com, Inc. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +spdx-exceptions 2.2.0 - CC-BY-3.0 +https://github.com/kemitchell/spdx-exceptions.json#readme +Copyright (c) 2010-2015 Linux Foundation and its Contributors. + +Creative Commons Attribution 3.0 Unported CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. + + 1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. + + b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. + + c. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. + + d. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. + + e. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. + + f. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. + + g. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. + + h. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. + + i. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. + + 2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. + + 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; + + b. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; + + c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, + + d. to Distribute and Publicly Perform Adaptations. + + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; + + ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, + + iii. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. + + The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. + + 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. + + b. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv), consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. + + c. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. + + 5. Representations, Warranties and Disclaimer + + UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + + 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + 7. Termination + + a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. + + b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. + + 8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. + + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. + + c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + + d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. + + e. This License may not be modified without the mutual written agreement of the Licensor and You. + + f. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. + +Creative Commons Notice + +Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. + +Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of this License. + +Creative Commons may be contacted at http://creativecommons.org/. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +spdx-license-ids 3.0.5 - CC0-1.0 +https://github.com/shinnn/spdx-license-ids#readme + +Creative Commons Legal Code + +CC0 1.0 Universal CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights. + + 1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof. + + 2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose. + + 3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose. + + 4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +boolbase 1.0.0 - ISC +https://github.com/fb55/boolbase + +ISC License + +Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") + +Copyright (c) 1995-2003 by Internet Software Consortium + +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 ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +browser-stdout 1.3.1 - ISC +https://github.com/kumavis/browser-stdout#readme +Copyright 2018 + +Copyright 2018 kumavis + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +fs.realpath 1.0.0 - ISC +https://github.com/isaacs/fs.realpath#readme +Copyright (c) Isaac Z. Schlueter and Contributors +Copyright Joyent, Inc. and other Node contributors. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +get-own-enumerable-property-symbols 3.0.0 - ISC +https://github.com/mightyiam/get-own-enumerable-property-symbols#readme + +ISC License + +Copyright (c) 2004-2010 by Internet Systems Consortium, Inc. ("ISC") + +Copyright (c) 1995-2003 by Internet Software Consortium + +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 ISC DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +glob 7.1.4 - ISC +https://github.com/isaacs/node-glob#readme + +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. + +## Glob Logo + +Glob's logo created by Tanya Brassie , licensed +under a Creative Commons Attribution-ShareAlike 4.0 International License +https://creativecommons.org/licenses/by-sa/4.0/ + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +glob 7.1.2 - ISC +https://github.com/isaacs/node-glob#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +har-schema 2.0.0 - ISC +https://github.com/ahmadnassri/har-schema +Copyright (c) 2015, Ahmad Nassri +copyright ahmadnassri.com (https://www.ahmadnassri.com/) + +Copyright (c) 2015, Ahmad Nassri + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +hosted-git-info 2.8.4 - ISC +https://github.com/npm/hosted-git-info +Copyright (c) 2015, Rebecca Turner + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +inflight 1.0.6 - ISC +https://github.com/isaacs/inflight +Copyright (c) Isaac Z. Schlueter + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +inherits 2.0.3 - ISC +https://github.com/isaacs/inherits#readme +Copyright (c) Isaac Z. Schlueter + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +isexe 2.0.0 - ISC +https://github.com/isaacs/isexe#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +json-stringify-safe 5.0.1 - ISC +https://github.com/isaacs/json-stringify-safe +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +lru-cache 5.1.1 - ISC +https://github.com/isaacs/node-lru-cache#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +lru-cache 4.1.5 - ISC +https://github.com/isaacs/node-lru-cache#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +make-error 1.3.5 - ISC +https://github.com/JsCommunity/make-error +Copyright 2014 Julien Fontanet +(c) Julien Fontanet (http://julien.isonoe.net) + +Copyright 2014 Julien Fontanet + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +minimatch 3.0.4 - ISC +https://github.com/isaacs/minimatch#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +mute-stream 0.0.8 - ISC +https://github.com/isaacs/mute-stream#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +once 1.4.0 - ISC +https://github.com/isaacs/once#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +osenv 0.1.5 - ISC +https://github.com/npm/osenv#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +pseudomap 1.0.2 - ISC +https://github.com/isaacs/pseudomap#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +read 1.0.7 - ISC +https://github.com/isaacs/read#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +rimraf 2.7.1 - ISC +https://github.com/isaacs/rimraf#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +sax 1.2.4 - ISC +https://github.com/isaacs/sax-js#readme +Copyright (c) Isaac Z. Schlueter and Contributors +Copyright Mathias Bynens + +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. + +==== + +`String.fromCodePoint` by Mathias Bynens used according to terms of MIT +License, as follows: + + Copyright Mathias Bynens + + 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +semver 6.3.0 - ISC +https://github.com/npm/node-semver#readme +Copyright Isaac Z. +Copyright Isaac Z. Schlueter +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +semver 5.7.1 - ISC +https://github.com/npm/node-semver#readme +Copyright Isaac Z. +Copyright Isaac Z. Schlueter +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +setprototypeof 1.1.1 - ISC +https://github.com/wesleytodd/setprototypeof +Copyright (c) 2015, Wes Todd + +Copyright (c) 2015, Wes Todd + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +signal-exit 3.0.2 - ISC +https://github.com/tapjs/signal-exit +Copyright (c) 2015 + +The ISC License + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +which 1.3.1 - ISC +https://github.com/isaacs/node-which#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +which 2.0.1 - ISC +https://github.com/isaacs/node-which#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +wrappy 1.0.2 - ISC +https://github.com/npm/wrappy +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +yallist 2.1.2 - ISC +https://github.com/isaacs/yallist#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +yallist 3.1.1 - ISC +https://github.com/isaacs/yallist#readme +Copyright (c) Isaac Z. Schlueter and Contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@azure/ms-rest-azure-env 1.1.2 - MIT +https://github.com/Azure/ms-rest-azure-env +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@azure/ms-rest-js 2.0.4 - MIT +https://github.com/Azure/ms-rest-js +copyright 2015 Toru Nagashima. +Copyright (c) Microsoft Corporation. +Copyright (c) 2010-2016 Robert Kieffer and other contributors + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@azure/ms-rest-js 1.8.13 - MIT +https://github.com/Azure/ms-rest-js +Copyright (c) Microsoft Corporation. +Copyright (c) 2010-2016 Robert Kieffer and other contributors + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@azure/ms-rest-nodeauth 2.0.2 - MIT +https://github.com/Azure/ms-rest-nodeauth +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@azure/storage-blob 10.5.0 - MIT +https://github.com/Azure/azure-sdk-for-js#readme +Copyright (c) Microsoft Corporation. +Copyright (c) Microsoft and contributors. +Copyright Joyent, Inc. and other Node contributors. +Copyright (c) 2010-2016 Robert Kieffer and other contributors + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@azure/storage-queue 10.3.0 - MIT +https://github.com/Azure/azure-sdk-for-js#readme +Copyright (c) Microsoft Corporation. +Copyright (c) Microsoft and contributors. +Copyright (c) 2010-2016 Robert Kieffer and other contributors + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@babel/code-frame 7.5.5 - MIT +https://babeljs.io/ +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@babel/highlight 7.5.0 - MIT +https://babeljs.io/ +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@babel/runtime 7.6.0 - MIT +Copyright (c) 2014-present Sebastian McKenzie and other contributors + +MIT License + +Copyright (c) 2014-present Sebastian McKenzie and other 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@samverschueren/stream-to-observable 0.3.0 - MIT +https://github.com/SamVerschueren/stream-to-observable#readme +Copyright (c) James Talmage + +The MIT License (MIT) + +Copyright (c) James Talmage (github.com/jamestalmage), Sam Verschueren (github.com/SamVerschueren) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/args 3.0.0 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/async 3.0.1 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/bluebird 3.5.27 - MIT +Copyright (c) 2016 +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/body-parser 1.17.1 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/connect 3.4.32 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/etag 1.8.0 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/events 3.0.0 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/express 4.17.1 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/express-serve-static-core 4.16.9 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/glob 7.1.1 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/lokijs 1.5.2 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/mime 2.0.1 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/minimatch 3.0.3 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/mocha 5.2.7 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/morgan 1.7.37 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/multistream 2.1.1 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/node 12.7.5 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/node 8.10.59 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/node 12.12.22 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/node 13.1.0 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/node-fetch 2.5.0 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/range-parser 1.2.3 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/readable-stream 2.3.5 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/rimraf 2.0.2 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/serve-static 1.13.3 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/tunnel 0.0.0 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/tunnel 0.0.1 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/uri-templates 0.1.30 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/uuid 3.4.5 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/validator 10.11.3 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/vscode 1.39.0 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +@types/xml2js 0.4.5 - MIT +Copyright (c) Microsoft Corporation. + + MIT License + + Copyright (c) Microsoft Corporation. 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +abort-controller 3.0.0 - MIT +https://github.com/mysticatea/abort-controller#readme +copyright 2015 Toru Nagashima. +Copyright (c) 2017 Toru Nagashima + +MIT License + +Copyright (c) 2017 Toru Nagashima + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +accepts 1.3.7 - MIT +https://github.com/jshttp/accepts#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ajv 6.10.2 - MIT +https://github.com/epoberezkin/ajv +(c) 2011 Gary Court. +Copyright 2011 Gary Court. +Copyright (c) 2015-2017 Evgeny Poberezkin + +The MIT License (MIT) + +Copyright (c) 2015-2017 Evgeny Poberezkin + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ansi-escapes 3.2.0 - MIT +https://github.com/sindresorhus/ansi-escapes#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ansi-regex 2.1.1 - MIT +https://github.com/chalk/ansi-regex#readme +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ansi-regex 3.0.0 - MIT +https://github.com/chalk/ansi-regex#readme +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ansi-styles 3.2.1 - MIT +https://github.com/chalk/ansi-styles#readme +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ansi-styles 2.2.1 - MIT +https://github.com/chalk/ansi-styles#readme +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ansicolors 0.3.2 - MIT +Copyright 2013 Thorsten Lorenz. + +Copyright 2013 Thorsten Lorenz. +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +any-observable 0.3.0 - MIT +https://github.com/sindresorhus/any-observable#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +any-promise 1.3.0 - MIT +http://github.com/kevinbeaty/any-promise +Copyright (c) 2014-2016 Kevin Beaty + +Copyright (C) 2014-2016 Kevin Beaty + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +argparse 1.0.10 - MIT +https://github.com/nodeca/argparse#readme +Copyright (c) 2012 by Vitaly Puzrin +Copyright (c) 2012 Vitaly Puzrin (https://github.com/puzrin). + +(The MIT License) + +Copyright (C) 2012 by Vitaly Puzrin + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +args 5.0.1 - MIT +https://github.com/leo/args#readme +Copyright (c) 2016 Leonard Lamprecht + +The MIT License (MIT) + +Copyright (c) 2016 Leonard Lamprecht + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +arr-diff 4.0.0 - MIT +https://github.com/jonschlinkert/arr-diff +Copyright (c) 2014-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +arr-flatten 1.1.0 - MIT +https://github.com/jonschlinkert/arr-flatten +Copyright (c) 2014-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +arr-union 3.1.0 - MIT +https://github.com/jonschlinkert/arr-union +Copyright (c) 2014-2016, Jon Schlinkert. +Copyright (c) 2016 Jon Schlinkert (https://github.com/jonschlinkert) + +The MIT License (MIT) + +Copyright (c) 2014-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +array-flatten 1.1.1 - MIT +https://github.com/blakeembrey/array-flatten +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +array-union 1.0.2 - MIT +https://github.com/sindresorhus/array-union#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +array-uniq 1.0.3 - MIT +https://github.com/sindresorhus/array-uniq#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +array-unique 0.3.2 - MIT +https://github.com/jonschlinkert/array-unique +Copyright (c) 2014-2016, Jon Schlinkert +Copyright (c) 2014-2015, Jon Schlinkert. +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +arrify 1.0.1 - MIT +https://github.com/sindresorhus/arrify#readme +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +asn1 0.2.4 - MIT +https://github.com/joyent/node-asn1#readme +Copyright (c) 2011 Mark Cavage +Copyright 2011 Mark Cavage + +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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +assert-plus 1.0.0 - MIT +https://github.com/mcavage/node-assert-plus#readme +Copyright 2015 Joyent, Inc. +Copyright (c) 2012 Mark Cavage +Copyright (c) 2012, Mark Cavage. + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +assign-symbols 1.0.0 - MIT +https://github.com/jonschlinkert/assign-symbols +Copyright (c) 2015 Jon Schlinkert +Copyright (c) 2015, Jon Schlinkert. + +The MIT License (MIT) + +Copyright (c) 2015, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +async 2.6.3 - MIT +https://caolan.github.io/async/ +Copyright (c) 2010-2018 Caolan McMahon + +Copyright (c) 2010-2018 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +asynckit 0.4.0 - MIT +https://github.com/alexindigo/asynckit#readme +Copyright (c) 2016 Alex Indigo + +The MIT License (MIT) + +Copyright (c) 2016 Alex Indigo + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +autorest 2.0.4283 - MIT +https://github.com/Azure/autorest/blob/master/README.md +(c) 2018 Microsoft Corporation. +Copyright (c) Microsoft Corporation. + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +aws4 1.9.0 - MIT +https://github.com/mhart/aws4#readme +Copyright 2013 Michael Hart (michael.hart.au@gmail.com) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +axios 0.19.0 - MIT +https://github.com/axios/axios +(c) 2019 by Matt Zabriskie +Copyright (c) 2014-present Matt Zabriskie + +Copyright (c) 2014-present Matt Zabriskie + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +azure-devops-node-api 7.2.0 - MIT +https://github.com/Microsoft/azure-devops-node-api#readme +Copyright (c) Microsoft. +Copyright (c) 2014 Tyler Kellen +Copyright (c) 2015 Tyler Kellen +Copyright (c) Isaac Z. Schlueter +Copyright (c) 2012 Koichi Kobayashi +Copyright (c) Microsoft Corporation. +Copyright (c) Isaac Z. Schlueter and Contributors +Copyright Joyent, Inc. and other Node contributors. +Copyright (c) 2012, Artur Adib +Copyright (c) 2013 Julian Gruber +Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + +Visual Studio Team Services Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-code-frame 6.26.0 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-core 6.26.3 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-generator 6.26.1 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-bindify-decorators 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-builder-binary-assignment-operator-visitor 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-call-delegate 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-define-map 6.26.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-explode-assignable-expression 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-explode-class 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-function-name 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-get-function-arity 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-hoist-variables 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-optimise-call-expression 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-regex 6.26.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-remap-async-to-generator 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helper-replace-supers 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-helpers 6.24.1 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-messages 6.23.0 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-check-es2015-constants 6.22.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-async-functions 6.13.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-async-generators 6.13.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-class-constructor-call 6.18.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-class-properties 6.13.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-decorators 6.13.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-do-expressions 6.13.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-dynamic-import 6.18.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-exponentiation-operator 6.13.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-export-extensions 6.13.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-function-bind 6.13.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-object-rest-spread 6.13.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-syntax-trailing-function-commas 6.22.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-async-generator-functions 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-async-to-generator 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-class-constructor-call 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-class-properties 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-decorators 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-do-expressions 6.22.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-arrow-functions 6.22.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-block-scoped-functions 6.22.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-block-scoping 6.26.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-classes 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-computed-properties 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-destructuring 6.23.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-duplicate-keys 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-for-of 6.23.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-function-name 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-literals 6.22.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-modules-amd 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-modules-commonjs 6.26.2 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-modules-systemjs 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-modules-umd 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-object-super 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-parameters 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-shorthand-properties 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-spread 6.22.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-sticky-regex 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-template-literals 6.22.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-typeof-symbol 6.23.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-es2015-unicode-regex 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-exponentiation-operator 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-export-extensions 6.22.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-function-bind 6.22.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-object-rest-spread 6.26.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-regenerator 6.26.0 - MIT +https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-regenerator + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-plugin-transform-strict-mode 6.24.1 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-preset-es2015 6.24.1 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-preset-stage-0 6.24.1 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-preset-stage-1 6.24.1 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-preset-stage-2 6.24.1 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-preset-stage-3 6.24.1 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-register 6.26.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-runtime 6.26.0 - MIT + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-template 6.26.0 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-traverse 6.26.0 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babel-types 6.26.0 - MIT +https://babeljs.io/ + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +babylon 6.18.0 - MIT +https://babeljs.io/ +Copyright (c) Mathias Bynens +Copyright (c) 2012-2014 by various contributors + +Copyright (C) 2012-2014 by various contributors (see AUTHORS) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +balanced-match 1.0.0 - MIT +https://github.com/juliangruber/balanced-match +Copyright (c) 2013 Julian Gruber + +(MIT) + +Copyright (c) 2013 Julian Gruber <julian@juliangruber.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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +base 0.11.2 - MIT +https://github.com/node-base/base +Copyright (c) 2015-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +basic-auth 2.0.1 - MIT +https://github.com/jshttp/basic-auth#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2013 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015-2016 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2013 TJ Holowaychuk +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015-2016 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +bl 3.0.0 - MIT +https://github.com/rvagg/bl +Copyright (c) 2013-2018 bl contributors + +The MIT License (MIT) +===================== + +Copyright (c) 2013-2018 bl contributors +---------------------------------- + +*bl contributors listed at * + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +bluebird 3.5.5 - MIT +https://github.com/petkaantonov/bluebird +Copyright (c) 2013-2017 Petka Antonov +Copyright (c) 2013-2018 Petka Antonov + +The MIT License (MIT) + +Copyright (c) 2013-2018 Petka Antonov + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +body-parser 1.19.0 - MIT +https://github.com/expressjs/body-parser#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +brace-expansion 1.1.11 - MIT +https://github.com/juliangruber/brace-expansion +Copyright (c) 2013 Julian Gruber + +MIT License + +Copyright (c) 2013 Julian Gruber + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +braces 2.3.2 - MIT +https://github.com/micromatch/braces +Copyright (c) 2014-2018, Jon Schlinkert. +Copyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +buffer-crc32 0.2.13 - MIT +https://github.com/brianloveswords/buffer-crc32 +Copyright (c) 2013 Brian J. Brennan + +The MIT License + +Copyright (c) 2013 Brian J. Brennan + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +buffer-from 1.1.1 - MIT +https://github.com/LinusU/buffer-from#readme +Copyright (c) 2016, 2018 Linus Unneback + +MIT License + +Copyright (c) 2016, 2018 Linus Unnebäck + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +builtin-modules 1.1.1 - MIT +https://github.com/sindresorhus/builtin-modules#readme +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +bytes 3.1.0 - MIT +https://github.com/visionmedia/bytes.js#readme +Copyright (c) 2015 Jed Watson +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015 Jed Watson +Copyright (c) 2012-2014 TJ Holowaychuk + +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015 Jed Watson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cache-base 1.0.1 - MIT +https://github.com/jonschlinkert/cache-base +Copyright (c) 2014-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +caller-callsite 2.0.0 - MIT +https://github.com/sindresorhus/caller-callsite#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +caller-path 2.0.0 - MIT +https://github.com/sindresorhus/caller-path#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +callsites 2.0.0 - MIT +https://github.com/sindresorhus/callsites#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +camelcase 5.0.0 - MIT +https://github.com/sindresorhus/camelcase#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cardinal 2.1.1 - MIT +https://github.com/thlorenz/cardinal#readme +Copyright 2012 Thorsten Lorenz. + +Copyright 2012 Thorsten Lorenz. +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +chalk 1.1.3 - MIT +https://github.com/chalk/chalk#readme +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +chalk 2.4.2 - MIT +https://github.com/chalk/chalk#readme +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cheerio 1.0.0-rc.3 - MIT +https://github.com/cheeriojs/cheerio#readme +Copyright (c) 2016 Matt Mueller + +MIT License + +Copyright (c) 2016 Matt Mueller + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ci-info 2.0.0 - MIT +https://github.com/watson/ci-info +Copyright (c) 2016-2018 Thomas Watson Steen + +The MIT License (MIT) + +Copyright (c) 2016-2018 Thomas Watson Steen + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +class-utils 0.3.6 - MIT +https://github.com/jonschlinkert/class-utils +Copyright (c) 2015, 2017-2018, Jon Schlinkert. +Copyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015, 2017-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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cli-cursor 2.1.0 - MIT +https://github.com/sindresorhus/cli-cursor#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cli-truncate 0.2.1 - MIT +https://github.com/sindresorhus/cli-truncate +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +code-point-at 1.1.0 - MIT +https://github.com/sindresorhus/code-point-at#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +collection-visit 1.0.0 - MIT +https://github.com/jonschlinkert/collection-visit +Copyright (c) 2015, 2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015, 2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +color 3.0.0 - MIT +https://github.com/Qix-/color#readme +Copyright (c) 2012 Heather Arthur + +Copyright (c) 2012 Heather Arthur + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +color-convert 1.9.3 - MIT +https://github.com/Qix-/color-convert#readme +Copyright (c) 2011-2016, Heather Arthur and Josh Junon. +Copyright (c) 2011-2016 Heather Arthur + +Copyright (c) 2011-2016 Heather Arthur + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +color-name 1.1.3 - MIT +https://github.com/dfcreative/color-name +Copyright (c) 2015 Dmitry Ivanov + +The MIT License (MIT) +Copyright (c) 2015 Dmitry Ivanov + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +color-string 1.5.3 - MIT +https://github.com/Qix-/color-string#readme +Copyright (c) 2011 Heather Arthur + +Copyright (c) 2011 Heather Arthur + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +colornames 1.1.1 - MIT +https://github.com/timoxley/colornames#readme +Copyright (c) 2015 Tim Oxley + +The MIT License (MIT) + +Copyright (c) 2015 Tim Oxley + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +colors 1.3.3 - MIT +https://github.com/Marak/colors.js +Copyright (c) Marak Squires +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Original Library + - Copyright (c) Marak Squires + +Additional Functionality + - Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +colorspace 1.1.2 - MIT +https://github.com/3rd-Eden/colorspace +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman + +The MIT License (MIT) + +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +combined-stream 1.0.8 - MIT +https://github.com/felixge/node-combined-stream +Copyright (c) 2011 Debuggable Limited + +Copyright (c) 2011 Debuggable 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +commander 2.20.0 - MIT +https://github.com/tj/commander.js#readme +Copyright (c) 2011 TJ Holowaychuk + +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +commander 2.15.1 - MIT +https://github.com/tj/commander.js#readme +Copyright (c) 2011 TJ Holowaychuk + +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +component-emitter 1.3.0 - MIT +https://github.com/component/emitter#readme +Copyright (c) 2014 Component + +(The MIT License) + +Copyright (c) 2014 Component 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +concat-map 0.0.1 - MIT +https://github.com/substack/node-concat-map + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +content-disposition 0.5.3 - MIT +https://github.com/jshttp/content-disposition#readme +Copyright (c) 2014-2017 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +content-type 1.0.4 - MIT +https://github.com/jshttp/content-type#readme +Copyright (c) 2015 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +convert-source-map 1.6.0 - MIT +https://github.com/thlorenz/convert-source-map +Copyright 2013 Thorsten Lorenz. + +Copyright 2013 Thorsten Lorenz. +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cookie 0.4.0 - MIT +https://github.com/jshttp/cookie#readme +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2012-2014 Roman Shtylman +Copyright (c) 2015 Douglas Christopher Wilson + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cookie-signature 1.0.6 - MIT +https://github.com/visionmedia/node-cookie-signature +Copyright (c) 2012 LearnBoost + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +copy-descriptor 0.1.1 - MIT +https://github.com/jonschlinkert/copy-descriptor +Copyright (c) 2015, Jon Schlinkert. +Copyright (c) 2015-2016, Jon Schlinkert + +The MIT License (MIT) + +Copyright (c) 2015-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +core-js 2.6.9 - MIT +https://github.com/zloirock/core-js#readme +(c) 2019 Denis Pushkarev +copyright (c) 2019 Denis Pushkarev +Copyright (c) 2014-2019 Denis Pushkarev + +Copyright (c) 2014-2019 Denis Pushkarev + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +core-util-is 1.0.2 - MIT +https://github.com/isaacs/core-util-is#readme +Copyright Joyent, Inc. and other Node contributors. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cosmiconfig 5.2.1 - MIT +https://github.com/davidtheclark/cosmiconfig#readme +Copyright (c) 2015 David Clark + +The MIT License (MIT) + +Copyright (c) 2015 David Clark + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cross-env 6.0.3 - MIT +https://github.com/kentcdodds/cross-env#readme +Copyright (c) 2017 Kent C. Dodds + +The MIT License (MIT) +Copyright (c) 2017 Kent C. Dodds + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cross-spawn 7.0.1 - MIT +https://github.com/moxystudio/node-cross-spawn +Copyright (c) 2018 Made With MOXY Lda + +The MIT License (MIT) + +Copyright (c) 2018 Made With MOXY Lda + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cross-spawn 6.0.5 - MIT +https://github.com/moxystudio/node-cross-spawn +Copyright (c) 2018 Made With MOXY Lda + +The MIT License (MIT) + +Copyright (c) 2018 Made With MOXY Lda + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cross-spawn 5.1.0 - MIT +https://github.com/IndigoUnited/node-cross-spawn#readme +Copyright (c) 2014 IndigoUnited + +Copyright (c) 2014 IndigoUnited + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +cross-var 1.1.0 - MIT +https://github.com/elijahmanor/cross-var#readme +Copyright (c) 2016 Elijah Manor + +MIT License + +Copyright (c) 2016 Elijah Manor + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +dashdash 1.14.1 - MIT +https://github.com/trentm/node-dashdash#readme +Copyright 2016 Trent Mick +Copyright 2016 Joyent, Inc. +Copyright (c) 2013 Joyent Inc. +Copyright (c) 2013 Trent Mick. + +# This is the MIT license + +Copyright (c) 2013 Trent Mick. All rights reserved. +Copyright (c) 2013 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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +date-fns 1.30.1 - MIT +https://github.com/date-fns/date-fns#readme +(c) Sasha Koss (https://kossnocorp.mit-license.org/) + +# License + +date-fns is licensed under the [MIT license](http://kossnocorp.mit-license.org). +Read more about MIT at [TLDRLegal](https://tldrlegal.com/license/mit-license). + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +date-utils 1.2.21 - MIT +https://jerrysievert.github.io/date-utils/ +(c) 2011 by Jerry Sievert +Copyright 2012 Twitter, Inc. +Copyright 2013 Twitter, Inc. +(c) 2005, 2013 jQuery Foundation, Inc. + +© 2011 by Jerry Sievert + +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. + + + + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +debug 3.1.0 - MIT +https://github.com/visionmedia/debug#readme +Copyright (c) 2014 TJ Holowaychuk +Copyright (c) 2014-2017 TJ Holowaychuk + +(The MIT License) + +Copyright (c) 2014 TJ Holowaychuk + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +debug 4.1.1 - MIT +https://github.com/visionmedia/debug#readme +Copyright (c) 2014 TJ Holowaychuk +Copyright (c) 2014-2017 TJ Holowaychuk + +(The MIT License) + +Copyright (c) 2014 TJ Holowaychuk + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +debug 2.6.9 - MIT +https://github.com/visionmedia/debug#readme +Copyright (c) 2014 TJ Holowaychuk +Copyright (c) 2014-2016 TJ Holowaychuk + +(The MIT License) + +Copyright (c) 2014 TJ Holowaychuk + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +decode-uri-component 0.2.0 - MIT +https://github.com/samverschueren/decode-uri-component#readme +(c) Sam Verschueren (https://github.com/SamVerschueren) +Copyright (c) Sam Verschueren + +The MIT License (MIT) + +Copyright (c) Sam Verschueren (github.com/SamVerschueren) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +dedent 0.7.0 - MIT +https://github.com/dmnd/dedent +Copyright (c) 2015 Desmond Brand (dmnd@desmondbrand.com) + +The MIT License (MIT) + +Copyright (c) 2015 Desmond Brand (dmnd@desmondbrand.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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +define-properties 1.1.3 - MIT +https://github.com/ljharb/define-properties#readme +Copyright (c) 2015 Jordan Harband + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +define-property 0.2.5 - MIT +https://github.com/jonschlinkert/define-property +Copyright (c) 2015 Jon Schlinkert +Copyright (c) 2015, Jon Schlinkert. + +The MIT License (MIT) + +Copyright (c) 2015, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +define-property 2.0.2 - MIT +https://github.com/jonschlinkert/define-property +Copyright (c) 2015-2018, Jon Schlinkert. +Copyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +define-property 1.0.0 - MIT +https://github.com/jonschlinkert/define-property +Copyright (c) 2015, 2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015, 2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +del 3.0.0 - MIT +https://github.com/sindresorhus/del#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +delayed-stream 1.0.0 - MIT +https://github.com/felixge/node-delayed-stream +Copyright (c) 2011 Debuggable Limited + +Copyright (c) 2011 Debuggable 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +denodeify 1.2.1 - MIT +https://github.com/matthew-andrews/denodeify + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +depd 2.0.0 - MIT +https://github.com/dougwilson/nodejs-depd#readme +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2014-2018 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014-2018 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +depd 1.1.2 - MIT +https://github.com/dougwilson/nodejs-depd#readme +Copyright (c) 2014 Douglas Christopher Wilson +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2014-2017 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +destroy 1.0.4 - MIT +https://github.com/stream-utils/destroy +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +detect-indent 4.0.0 - MIT +https://github.com/sindresorhus/detect-indent +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +diagnostics 1.1.1 - MIT +https://github.com/bigpipe/diagnostics +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman + +The MIT License (MIT) + +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +dom-serializer 0.1.1 - MIT +https://github.com/cheeriojs/dom-renderer#readme +Copyright (c) 2014 + +License + +(The MIT License) + +Copyright (c) 2014 The cheeriojs 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +dottie 2.0.1 - MIT +https://github.com/mickhansen/dottie.js#readme +Copyright (c) 2013-2014 Mick Hansen. http://mhansen.io + +The MIT License + +Copyright (c) 2013-2014 Mick Hansen. http://mhansen.io + +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. + + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ecc-jsbn 0.1.2 - MIT +https://github.com/quartzjer/ecc-jsbn +Copyright (c) 2003-2005 Tom Wu +Copyright (c) 2014 Jeremie Miller + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ee-first 1.1.1 - MIT +https://github.com/jonathanong/ee-first +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +elegant-spinner 1.0.1 - MIT +https://github.com/sindresorhus/elegant-spinner +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +enabled 1.0.2 - MIT +https://github.com/bigpipe/enabled#readme +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman + +The MIT License (MIT) + +Copyright (c) 2015 Arnout Kazemier, Martijn Swaagman, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +encodeurl 1.0.2 - MIT +https://github.com/pillarjs/encodeurl#readme +Copyright (c) 2016 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2016 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +end-of-stream 1.4.1 - MIT +https://github.com/mafintosh/end-of-stream +Copyright (c) 2014 Mathias Buus + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +env-variable 0.0.5 - MIT +https://github.com/3rd-Eden/env-variable +Copyright 2014 Arnout Kazemier + +Copyright 2014 Arnout Kazemier + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +error-ex 1.3.2 - MIT +https://github.com/qix-/node-error-ex#readme +Copyright (c) 2015 JD Ballard + +The MIT License (MIT) + +Copyright (c) 2015 JD Ballard + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +es-abstract 1.14.2 - MIT +https://github.com/ljharb/es-abstract#readme +Copyright (c) 2015 Jordan Harband + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +es-to-primitive 1.2.0 - MIT +https://github.com/ljharb/es-to-primitive#readme +Copyright (c) 2015 Jordan Harband + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +escape-html 1.0.3 - MIT +https://github.com/component/escape-html +Copyright (c) 2015 Andreas Lubbe +Copyright (c) 2012-2013 TJ Holowaychuk +Copyright (c) 2015 Tiancheng Timothy Gu + +(The MIT License) + +Copyright (c) 2012-2013 TJ Holowaychuk +Copyright (c) 2015 Andreas Lubbe +Copyright (c) 2015 Tiancheng "Timothy" Gu + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +escape-string-regexp 1.0.5 - MIT +https://github.com/sindresorhus/escape-string-regexp +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +etag 1.8.1 - MIT +https://github.com/jshttp/etag#readme +Copyright (c) 2014-2016 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014-2016 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +event-target-shim 5.0.1 - MIT +https://github.com/mysticatea/event-target-shim +copyright 2015 Toru Nagashima. +Copyright (c) 2015 Toru Nagashima + +The MIT License (MIT) + +Copyright (c) 2015 Toru Nagashima + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +events 3.0.0 - MIT +https://github.com/Gozala/events#readme +Copyright Joyent, Inc. and other Node contributors. + +MIT + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +execa 1.0.0 - MIT +https://github.com/sindresorhus/execa#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +exit 0.1.2 - MIT +https://github.com/cowboy/node-exit +Copyright (c) 2013 Cowboy Ben Alman + +Copyright (c) 2013 "Cowboy" Ben Alman + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +expand-brackets 2.1.4 - MIT +https://github.com/jonschlinkert/expand-brackets +Copyright (c) 2015-2016, Jon Schlinkert +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +express 4.17.1 - MIT +http://expressjs.com/ +Copyright (c) 2013 Roman Shtylman +Copyright (c) 2009-2013 TJ Holowaychuk +Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2009-2014 TJ Holowaychuk +Copyright (c) 2013-2014 Roman Shtylman +Copyright (c) 2014-2015 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2009-2014 TJ Holowaychuk +Copyright (c) 2013-2014 Roman Shtylman +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +extend 3.0.2 - MIT +https://github.com/justmoon/node-extend#readme +Copyright (c) 2014 Stefan Thomas + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +extend-shallow 2.0.1 - MIT +https://github.com/jonschlinkert/extend-shallow +Copyright (c) 2015 Jon Schlinkert +Copyright (c) 2014-2015, Jon Schlinkert. + +The MIT License (MIT) + +Copyright (c) 2014-2015, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +extend-shallow 3.0.2 - MIT +https://github.com/jonschlinkert/extend-shallow +Copyright (c) 2014-2015, 2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2015, 2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +extglob 2.0.4 - MIT +https://github.com/micromatch/extglob +Copyright (c) 2015-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +extsprintf 1.3.0 - MIT +https://github.com/davepacheco/node-extsprintf +Copyright (c) 2012, Joyent, Inc. + +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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +fast-deep-equal 2.0.1 - MIT +https://github.com/epoberezkin/fast-deep-equal#readme +Copyright (c) 2017 Evgeny Poberezkin + +MIT License + +Copyright (c) 2017 Evgeny Poberezkin + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +fast-json-stable-stringify 2.1.0 - MIT +https://github.com/epoberezkin/fast-json-stable-stringify +Copyright (c) 2013 James Halliday +Copyright (c) 2017 Evgeny Poberezkin + +This software is released under the MIT license: + +Copyright (c) 2017 Evgeny Poberezkin +Copyright (c) 2013 James Halliday + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +fast-safe-stringify 2.0.7 - MIT +https://github.com/davidmarkclements/fast-safe-stringify#readme +Copyright (c) 2016 David Mark Clements +Copyright (c) 2017 David Mark Clements & Matteo Collina +Copyright (c) 2018 David Mark Clements, Matteo Collina & Ruben Bridgewater + +The MIT License (MIT) + +Copyright (c) 2016 David Mark Clements +Copyright (c) 2017 David Mark Clements & Matteo Collina +Copyright (c) 2018 David Mark Clements, Matteo Collina & Ruben Bridgewater + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +fd-slicer 1.1.0 - MIT +https://github.com/andrewrk/node-fd-slicer#readme +Copyright (c) 2014 Andrew Kelley + +Copyright (c) 2014 Andrew Kelley + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +fecha 2.3.3 - MIT +https://github.com/taylorhakes/fecha +Copyright (c) 2015 Taylor Hakes + +The MIT License (MIT) + +Copyright (c) 2015 Taylor Hakes + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +figures 2.0.0 - MIT +https://github.com/sindresorhus/figures#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +figures 1.7.0 - MIT +https://github.com/sindresorhus/figures#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +fill-range 4.0.0 - MIT +https://github.com/jonschlinkert/fill-range +Copyright (c) 2014-2017, Jon Schlinkert +Copyright (c) 2014-2015, 2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +finalhandler 1.1.2 - MIT +https://github.com/pillarjs/finalhandler#readme +Copyright (c) 2014-2017 Douglas Christopher Wilson +Copyright (c) 2014-2017 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +find-up 3.0.0 - MIT +https://github.com/sindresorhus/find-up#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +fn-name 2.0.1 - MIT +https://github.com/sindresorhus/fn-name +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +follow-redirects 1.5.10 - MIT +https://github.com/follow-redirects/follow-redirects +Copyright 2014-present Olivier Lalonde , James Talmage , Ruben Verborgh + +Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +for-in 1.0.2 - MIT +https://github.com/jonschlinkert/for-in +Copyright (c) 2014-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +form-data 2.3.3 - MIT +https://github.com/form-data/form-data#readme +Copyright (c) 2012 Felix Geisendorfer (felix@debuggable.com) and contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +form-data 2.5.1 - MIT +https://github.com/form-data/form-data#readme +Copyright (c) 2012 Felix Geisendorfer (felix@debuggable.com) and contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +forwarded 0.1.2 - MIT +https://github.com/jshttp/forwarded#readme +Copyright (c) 2014-2017 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +fragment-cache 0.2.1 - MIT +https://github.com/jonschlinkert/fragment-cache +Copyright (c) 2016-2017, Jon Schlinkert. +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2016-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +fresh 0.5.2 - MIT +https://github.com/jshttp/fresh#readme +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016-2017 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +function-bind 1.1.1 - MIT +https://github.com/Raynos/function-bind +Copyright (c) 2013 Raynos. + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +g-status 2.0.2 - MIT +https://github.com/luftywiranda13/g-status#readme +(c) Lufty Wiranda (https://www.luftywiranda.com) +Copyright (c) Lufty Wiranda + +MIT License + +Copyright (c) Lufty Wiranda + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +generate-function 2.3.1 - MIT +https://github.com/mafintosh/generate-function +Copyright (c) 2014 Mathias Buus + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +get-stdin 6.0.0 - MIT +https://github.com/sindresorhus/get-stdin#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +get-stream 4.1.0 - MIT +https://github.com/sindresorhus/get-stream#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +get-value 2.0.6 - MIT +https://github.com/jonschlinkert/get-value +Copyright (c) 2014-2015, Jon Schlinkert. +Copyright (c) 2014-2016, Jon Schlinkert. + +The MIT License (MIT) + +Copyright (c) 2014-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +getpass 0.1.7 - MIT +https://github.com/arekinath/node-getpass#readme +Copyright Joyent, Inc. +Copyright 2016, Joyent, Inc. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +globals 9.18.0 - MIT +https://github.com/sindresorhus/globals#readme +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +globby 6.1.0 - MIT +https://github.com/sindresorhus/globby#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +growl 1.10.5 - MIT +https://github.com/tj/node-growl#readme +Copyright TJ Holowaychuk +Copyright (c) 2009 TJ Holowaychuk +Copyright (c) 2016 Joshua Boy Nicolai Appelman + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +har-validator 5.1.3 - MIT +https://github.com/ahmadnassri/node-har-validator +Copyright (c) 2018 Ahmad Nassri + +MIT License + +Copyright (c) 2018 Ahmad Nassri + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +has 1.0.3 - MIT +https://github.com/tarruda/has +Copyright (c) 2013 Thiago de Arruda + +Copyright (c) 2013 Thiago de Arruda + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +has-ansi 2.0.0 - MIT +https://github.com/sindresorhus/has-ansi +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +has-flag 3.0.0 - MIT +https://github.com/sindresorhus/has-flag#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +has-symbols 1.0.0 - MIT +https://github.com/ljharb/has-symbols#readme +Copyright (c) 2016 Jordan Harband + +MIT License + +Copyright (c) 2016 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +has-value 0.3.1 - MIT +https://github.com/jonschlinkert/has-value +Copyright (c) 2014-2016, Jon Schlinkert. +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +has-value 1.0.0 - MIT +https://github.com/jonschlinkert/has-value +Copyright (c) 2014-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +has-values 1.0.0 - MIT +https://github.com/jonschlinkert/has-values +Copyright (c) 2014-2017, Jon Schlinkert +Copyright (c) 2014-2015, 2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +has-values 0.1.4 - MIT +https://github.com/jonschlinkert/has-values +Copyright (c) 2014-2015, Jon Schlinkert. +Copyright (c) 2014-2016, Jon Schlinkert. +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +he 1.1.1 - MIT +https://mths.be/he +Copyright Mathias Bynens + +Copyright Mathias Bynens + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +home-or-tmp 2.0.0 - MIT +https://github.com/sindresorhus/home-or-tmp +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +htmlparser2 3.10.1 - MIT +https://github.com/fb55/htmlparser2#readme +Copyright 2010, 2011, Chris Winberry + +Copyright 2010, 2011, Chris Winberry . 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +http-errors 1.7.2 - MIT +https://github.com/jshttp/http-errors#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2016 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2016 Douglas Christopher Wilson doug@somethingdoug.com + + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong me@jongleberry.com +Copyright (c) 2016 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +http-signature 1.2.0 - MIT +https://github.com/joyent/node-http-signature/ +Copyright Joyent, Inc. +Copyright 2012 Joyent, Inc. +Copyright 2015 Joyent, Inc. +Copyright (c) 2011 Joyent, Inc. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +husky 1.3.1 - MIT +https://github.com/typicode/husky#readme +Copyright (c) 2017 + +MIT License + +Copyright (c) 2017 + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +iconv-lite 0.5.0 - MIT +https://github.com/ashtuchkin/iconv-lite +Copyright (c) Microsoft Corporation. +Copyright (c) 2011 Alexander Shtuchkin + +Copyright (c) 2011 Alexander Shtuchkin + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +iconv-lite 0.4.24 - MIT +https://github.com/ashtuchkin/iconv-lite +Copyright (c) Microsoft Corporation. +Copyright (c) 2011 Alexander Shtuchkin + +Copyright (c) 2011 Alexander Shtuchkin + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +import-fresh 2.0.0 - MIT +https://github.com/sindresorhus/import-fresh#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +indent-string 3.2.0 - MIT +https://github.com/sindresorhus/indent-string#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +inflection 1.12.0 - MIT +https://github.com/dreamerslab/node.inflection#readme +Copyright (c) 2011 +Copyright (c) 2011 Ben Lin + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +invariant 2.2.4 - MIT +https://github.com/zertosh/invariant#readme +Copyright (c) 2013-present, Facebook, Inc. + +MIT License + +Copyright (c) 2013-present, Facebook, Inc. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ip-regex 2.1.0 - MIT +https://github.com/sindresorhus/ip-regex#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ipaddr.js 1.9.0 - MIT +https://github.com/whitequark/ipaddr.js#readme +Copyright (c) 2011-2017 + +Copyright (C) 2011-2017 whitequark + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-accessor-descriptor 0.1.6 - MIT +https://github.com/jonschlinkert/is-accessor-descriptor +Copyright (c) 2015, Jon Schlinkert. +Copyright (c) 2015 Jon Schlinkert (https://github.com/jonschlinkert) + +The MIT License (MIT) + +Copyright (c) 2015, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-accessor-descriptor 1.0.0 - MIT +https://github.com/jonschlinkert/is-accessor-descriptor +Copyright (c) 2015-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-arrayish 0.2.1 - MIT +https://github.com/qix-/node-is-arrayish#readme +Copyright (c) 2015 JD Ballard + +The MIT License (MIT) + +Copyright (c) 2015 JD Ballard + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-arrayish 0.3.2 - MIT +https://github.com/qix-/node-is-arrayish#readme +Copyright (c) 2015 JD Ballard + +The MIT License (MIT) + +Copyright (c) 2015 JD Ballard + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-bluebird 1.0.2 - MIT +https://github.com/overlookmotel/is-bluebird#readme +Copyright (c) 2016 Overlook Motel (theoverlookmotel@gmail.com) + +Copyright (c) 2016 Overlook Motel (theoverlookmotel@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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-buffer 1.1.6 - MIT +https://github.com/feross/is-buffer#readme +Copyright (c) Feross Aboukhadijeh +Copyright (c) Feross Aboukhadijeh (http://feross.org). + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-buffer 2.0.3 - MIT +https://github.com/feross/is-buffer#readme +Copyright (c) Feross Aboukhadijeh +Copyright (c) Feross Aboukhadijeh (http://feross.org). + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-callable 1.1.4 - MIT +https://github.com/ljharb/is-callable#readme +Copyright (c) 2015 Jordan Harband + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-ci 2.0.0 - MIT +https://github.com/watson/is-ci +Copyright (c) 2016-2018 Thomas Watson Steen + +The MIT License (MIT) + +Copyright (c) 2016-2018 Thomas Watson Steen + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-data-descriptor 1.0.0 - MIT +https://github.com/jonschlinkert/is-data-descriptor +Copyright (c) 2015-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-data-descriptor 0.1.4 - MIT +https://github.com/jonschlinkert/is-data-descriptor +Copyright (c) 2015, Jon Schlinkert. +Copyright (c) 2015 Jon Schlinkert (https://github.com/jonschlinkert) + +The MIT License (MIT) + +Copyright (c) 2015, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-date-object 1.0.1 - MIT +https://github.com/ljharb/is-date-object#readme +Copyright (c) 2015 Jordan Harband + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-descriptor 1.0.2 - MIT +https://github.com/jonschlinkert/is-descriptor +Copyright (c) 2015-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2017, 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-descriptor 0.1.6 - MIT +https://github.com/jonschlinkert/is-descriptor +Copyright (c) 2015-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2017, 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-directory 0.3.1 - MIT +https://github.com/jonschlinkert/is-directory +Copyright (c) 2014-2015, Jon Schlinkert. +Copyright (c) 2014-2016, Jon Schlinkert. +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-extendable 1.0.1 - MIT +https://github.com/jonschlinkert/is-extendable +Copyright (c) 2015-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2017, 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-extendable 0.1.1 - MIT +https://github.com/jonschlinkert/is-extendable +Copyright (c) 2015 Jon Schlinkert +Copyright (c) 2015, Jon Schlinkert. + +The MIT License (MIT) + +Copyright (c) 2015, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-extglob 2.1.1 - MIT +https://github.com/jonschlinkert/is-extglob +Copyright (c) 2014-2016, Jon Schlinkert. +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-finite 1.0.2 - MIT +https://github.com/sindresorhus/is-finite#readme +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-fullwidth-code-point 2.0.0 - MIT +https://github.com/sindresorhus/is-fullwidth-code-point#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-fullwidth-code-point 1.0.0 - MIT +https://github.com/sindresorhus/is-fullwidth-code-point +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-glob 4.0.1 - MIT +https://github.com/micromatch/is-glob +Copyright (c) 2014-2017, Jon Schlinkert. +Copyright (c) 2019, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-number 3.0.0 - MIT +https://github.com/jonschlinkert/is-number +Copyright (c) 2014-2016, Jon Schlinkert +Copyright (c) 2014-2015, Jon Schlinkert. +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-obj 1.0.1 - MIT +https://github.com/sindresorhus/is-obj#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-observable 1.1.0 - MIT +https://github.com/sindresorhus/is-observable#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-path-cwd 1.0.0 - MIT +https://github.com/sindresorhus/is-path-cwd +(c) Sindre Sorhus (http://sindresorhus.com) + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-path-in-cwd 1.0.1 - MIT +https://github.com/sindresorhus/is-path-in-cwd#readme +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-path-inside 1.0.1 - MIT +https://github.com/sindresorhus/is-path-inside#readme +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-plain-object 2.0.4 - MIT +https://github.com/jonschlinkert/is-plain-object +Copyright (c) 2014-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-promise 2.1.0 - MIT +https://github.com/then/is-promise +Copyright (c) 2014 Forbes Lindesay + +Copyright (c) 2014 Forbes Lindesay + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-property 1.0.2 - MIT +https://github.com/mikolalysenko/is-property +(c) 2013 Mikola Lysenko. +Copyright (c) 2013 Mikola Lysenko + + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-regex 1.0.4 - MIT +https://github.com/ljharb/is-regex +Copyright (c) 2014 Jordan Harband + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-regexp 1.0.0 - MIT +https://github.com/sindresorhus/is-regexp +(c) Sindre Sorhus (http://sindresorhus.com) + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-stream 1.1.0 - MIT +https://github.com/sindresorhus/is-stream#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-symbol 1.0.2 - MIT +https://github.com/ljharb/is-symbol#readme +Copyright (c) 2015 Jordan Harband + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-typedarray 1.0.0 - MIT +https://github.com/hughsk/is-typedarray + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +is-windows 1.0.2 - MIT +https://github.com/jonschlinkert/is-windows +Copyright (c) 2015-2018, Jon Schlinkert. +Copyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +isarray 1.0.0 - MIT +https://github.com/juliangruber/isarray +Copyright (c) 2013 Julian Gruber + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +isobject 2.1.0 - MIT +https://github.com/jonschlinkert/isobject +Copyright (c) 2014-2015, Jon Schlinkert. +Copyright (c) 2014-2016, Jon Schlinkert. +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +isobject 3.0.1 - MIT +https://github.com/jonschlinkert/isobject +Copyright (c) 2014-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +isstream 0.1.2 - MIT +https://github.com/rvagg/isstream +Copyright (c) 2015 Rod Vagg +Copyright (c) 2015 Rod Vagg rvagg (https://twitter.com/rvagg) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +js-tokens 4.0.0 - MIT +https://github.com/lydell/js-tokens#readme +Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell +Copyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell + +The MIT License (MIT) + +Copyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +js-tokens 3.0.2 - MIT +https://github.com/lydell/js-tokens#readme +Copyright 2014, 2015, 2016, 2017 Simon Lydell +Copyright (c) 2014, 2015, 2016, 2017 Simon Lydell + +The MIT License (MIT) + +Copyright (c) 2014, 2015, 2016, 2017 Simon Lydell + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +js-yaml 3.13.1 - MIT +https://github.com/nodeca/js-yaml +Copyright (c) 2011-2015 by Vitaly Puzrin + +(The MIT License) + +Copyright (C) 2011-2015 by Vitaly Puzrin + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +jsbn 0.1.1 - MIT +https://github.com/andyperlitch/jsbn#readme +Copyright (c) 2005 Tom Wu +Copyright (c) 2003-2005 Tom Wu +Copyright (c) 2005-2009 Tom Wu + +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 + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +jsesc 0.5.0 - MIT +http://mths.be/jsesc +Copyright Mathias Bynens + +Copyright Mathias Bynens + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +jsesc 1.3.0 - MIT +https://mths.be/jsesc +Copyright Mathias Bynens + +Copyright Mathias Bynens + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +json-parse-better-errors 1.0.2 - MIT +https://github.com/zkat/json-parse-better-errors#readme +Copyright 2017 Kat Marchan + +Copyright 2017 Kat Marchán + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +json-schema-traverse 0.4.1 - MIT +https://github.com/epoberezkin/json-schema-traverse#readme +Copyright (c) 2017 Evgeny Poberezkin + +MIT License + +Copyright (c) 2017 Evgeny Poberezkin + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +json5 0.5.1 - MIT +http://json5.org/ +Copyright (c) 2012-2016 Aseem Kishore, and others (https://github.com/aseemk/json5/contributors). + +MIT License + +Copyright (c) 2012-2016 Aseem Kishore, and [others](https://github.com/aseemk/json5/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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +jsprim 1.4.1 - MIT +https://github.com/joyent/node-jsprim#readme +Copyright (c) 2012, Joyent, Inc. + +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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +jwa 1.4.1 - MIT +https://github.com/brianloveswords/node-jwa#readme +Copyright (c) 2013 Brian J. Brennan + +Copyright (c) 2013 Brian J. Brennan + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +jws 3.2.2 - MIT +https://github.com/brianloveswords/node-jws#readme +Copyright (c) 2013 Brian J. Brennan +Copyright (c) 2013-2015 Brian J. Brennan + +Copyright (c) 2013 Brian J. Brennan + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +kind-of 4.0.0 - MIT +https://github.com/jonschlinkert/kind-of +Copyright (c) 2014-2017, Jon Schlinkert +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +kind-of 5.1.0 - MIT +https://github.com/jonschlinkert/kind-of +Copyright (c) 2014-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +kind-of 3.2.2 - MIT +https://github.com/jonschlinkert/kind-of +Copyright (c) 2014-2017, Jon Schlinkert +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +kind-of 6.0.2 - MIT +https://github.com/jonschlinkert/kind-of +Copyright (c) 2014-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +kuler 1.0.1 - MIT +https://github.com/3rd-Eden/kuler +Copyright 2014 Arnout Kazemier + +Copyright 2014 Arnout Kazemier + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +leven 2.1.0 - MIT +https://github.com/sindresorhus/leven#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +linkify-it 2.2.0 - MIT +https://github.com/markdown-it/linkify-it#readme +Copyright (c) 2015 Vitaly Puzrin. + +Copyright (c) 2015 Vitaly Puzrin. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +lint-staged 8.2.1 - MIT +https://github.com/okonet/lint-staged#readme +Copyright (c) 2016 Andrey Okonetchnikov + +The MIT License (MIT) + +Copyright (c) 2016 Andrey Okonetchnikov + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +listr 0.14.3 - MIT +https://github.com/SamVerschueren/listr#readme +(c) Sam Verschueren (https://github.com/SamVerschueren) +Copyright (c) Sam Verschueren + +The MIT License (MIT) + +Copyright (c) Sam Verschueren (github.com/SamVerschueren) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +listr-silent-renderer 1.1.1 - MIT +https://github.com/samverschueren/listr-silent-renderer#readme +(c) Sam Verschueren (https://github.com/SamVerschueren) +Copyright (c) Sam Verschueren + +The MIT License (MIT) + +Copyright (c) Sam Verschueren (github.com/SamVerschueren) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +listr-update-renderer 0.5.0 - MIT +https://github.com/SamVerschueren/listr-update-renderer#readme +(c) Sam Verschueren (https://github.com/SamVerschueren) +Copyright (c) Sam Verschueren + +The MIT License (MIT) + +Copyright (c) Sam Verschueren (github.com/SamVerschueren) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +listr-verbose-renderer 0.5.0 - MIT +https://github.com/SamVerschueren/listr-verbose-renderer#readme +(c) Sam Verschueren (https://github.com/SamVerschueren) +Copyright (c) Sam Verschueren + +The MIT License (MIT) + +Copyright (c) Sam Verschueren (github.com/SamVerschueren) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +locate-path 3.0.0 - MIT +https://github.com/sindresorhus/locate-path#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +lodash 4.17.15 - MIT +https://lodash.com/ +Copyright OpenJS Foundation and other contributors +Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + +Copyright OpenJS Foundation and other contributors + +Based on Underscore.js, copyright Jeremy Ashkenas, +DocumentCloud and Investigative Reporters & Editors + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/lodash/lodash + +The following license applies to all parts of this software except as +documented below: + +==== + +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. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code displayed within the prose of the +documentation. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +Files located in the node_modules and vendor directories are externally +maintained libraries used by this software which have their own +licenses; we recommend you read them, as their terms may differ from the +terms above. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +log-symbols 2.2.0 - MIT +https://github.com/sindresorhus/log-symbols#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +log-symbols 1.0.2 - MIT +https://github.com/sindresorhus/log-symbols +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +log-update 2.3.0 - MIT +https://github.com/sindresorhus/log-update#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +logform 2.1.2 - MIT +https://github.com/winstonjs/logform#readme +Copyright (c) 2017 Charlie Robbins & the Contributors. + +MIT License + +Copyright (c) 2017 Charlie Robbins & 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +lokijs 1.5.7 - MIT +http://lokijs.org +Copyright (c) 2015 TechFort + +Copyright (c) 2015 TechFort + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +loose-envify 1.4.0 - MIT +https://github.com/zertosh/loose-envify +Copyright (c) 2015 Andres Suarez + +The MIT License (MIT) + +Copyright (c) 2015 Andres Suarez + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +map-cache 0.2.2 - MIT +https://github.com/jonschlinkert/map-cache +Copyright (c) 2015, Jon Schlinkert. +Copyright (c) 2015-2016, Jon Schlinkert. +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +map-visit 1.0.0 - MIT +https://github.com/jonschlinkert/map-visit +Copyright (c) 2015-2017, Jon Schlinkert +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +markdown-it 8.4.2 - MIT +https://github.com/markdown-it/markdown-it#readme +(c) (tm) +Copyright (c) 2014 Vitaly Puzrin, Alex Kocharin. +Copyright Joyent, Inc. and other Node contributors. + +Copyright (c) 2014 Vitaly Puzrin, Alex Kocharin. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +matcher 1.1.1 - MIT +https://github.com/sindresorhus/matcher#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +mdurl 1.0.1 - MIT +https://github.com/markdown-it/mdurl#readme +Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin. +Copyright Joyent, Inc. and other Node contributors. + +Copyright (c) 2015 Vitaly Puzrin, Alex Kocharin. + +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. + +-------------------------------------------------------------------------------- + +.parse() is based on Joyent's node.js `url` code: + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +media-typer 0.3.0 - MIT +https://github.com/jshttp/media-typer +Copyright (c) 2014 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +merge-descriptors 1.0.1 - MIT +https://github.com/component/merge-descriptors +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +methods 1.1.2 - MIT +https://github.com/jshttp/methods +Copyright (c) 2013-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson +Copyright (c) 2013-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2013-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +micromatch 3.1.10 - MIT +https://github.com/micromatch/micromatch +Copyright (c) 2014-2018, Jon Schlinkert. +Copyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +mime 1.6.0 - MIT +https://github.com/broofa/node-mime#readme +Copyright (c) 2010 Benjamin Thomas, Robert Kieffer + +The MIT License (MIT) + +Copyright (c) 2010 Benjamin Thomas, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +mime-db 1.40.0 - MIT +https://github.com/jshttp/mime-db#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014 Jonathan Ong me@jongleberry.com + + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +mime-types 2.1.24 - MIT +https://github.com/jshttp/mime-types#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2015 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +mimic-fn 1.2.0 - MIT +https://github.com/sindresorhus/mimic-fn#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +minimist 0.0.8 - MIT +https://github.com/substack/minimist + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +minimist 1.2.0 - MIT +https://github.com/substack/minimist + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +mixin-deep 1.3.2 - MIT +https://github.com/jonschlinkert/mixin-deep +Copyright (c) 2014-2015, 2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2015, 2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +mkdirp 0.5.1 - MIT +https://github.com/substack/node-mkdirp#readme +Copyright 2010 James Halliday (mail@substack.net) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +mocha 5.2.0 - MIT +https://mochajs.org +Copyright (c) 2011-2018 JS Foundation +Copyright Joyent, Inc. and other Node contributors. +Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2009-2015, Kevin Decker + +(The MIT License) + +Copyright (c) 2011-2018 JS Foundation and contributors, https://js.foundation + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +moment 2.24.0 - MIT +http://momentjs.com +Copyright (c) JS Foundation and other contributors + +Copyright (c) JS Foundation and other 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +moment-timezone 0.5.26 - MIT +http://momentjs.com/timezone/ +Copyright (c) JS Foundation and other contributors + +The MIT License (MIT) + +Copyright (c) JS Foundation and other 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +morgan 1.9.1 - MIT +https://github.com/expressjs/morgan#readme +Copyright (c) 2010 Sencha Inc. +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2014-2017 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2017 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +mri 1.1.4 - MIT +https://github.com/lukeed/mri#readme +(c) Luke Edwards (https://lukeed.com) +Copyright (c) Luke Edwards (lukeed.com) + +The MIT License (MIT) + +Copyright (c) Luke Edwards (lukeed.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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ms 2.1.2 - MIT +https://github.com/zeit/ms#readme +Copyright (c) 2016 Zeit, Inc. + +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ms 2.1.1 - MIT +https://github.com/zeit/ms#readme +Copyright (c) 2016 Zeit, Inc. + +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ms 2.0.0 - MIT +https://github.com/zeit/ms#readme +Copyright (c) 2016 Zeit, Inc. + +The MIT License (MIT) + +Copyright (c) 2016 Zeit, Inc. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +multistream 2.1.1 - MIT +https://github.com/feross/multistream +Copyright (c) Feross Aboukhadijeh +Copyright (c) Feross Aboukhadijeh (http://feross.org). + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +mysql2 2.1.0 - MIT +https://github.com/sidorares/node-mysql2#readme +Copyright (c) 2016 Andrey Sidorov (sidorares@yandex.ru) and contributors + +Copyright (c) 2016 Andrey Sidorov (sidorares@yandex.ru) 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +named-placeholders 1.1.2 - MIT +https://github.com/sidorares/named-placeholders#readme +Copyright (c) 2014 Andrey Sidorov + +The MIT License (MIT) + +Copyright (c) 2014 Andrey Sidorov + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +nanomatch 1.2.13 - MIT +https://github.com/micromatch/nanomatch +Copyright (c) 2016-2018, Jon Schlinkert. +Copyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert). + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +native-duplexpair 1.0.0 - MIT +https://github.com/tediousjs/native-duplexpair#readme +Copyright (c) 2017 Anna Henningsen + +The MIT License (MIT) + +Copyright (c) 2017 Anna Henningsen + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +negotiator 0.6.2 - MIT +https://github.com/jshttp/negotiator#readme +Copyright (c) 2012 Federico Romero +Copyright (c) 2014 Federico Romero +Copyright (c) 2012 Isaac Z. Schlueter +Copyright (c) 2012-2014 Federico Romero +Copyright (c) 2012-2014 Isaac Z. Schlueter +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2014-2015 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2012-2014 Federico Romero +Copyright (c) 2012-2014 Isaac Z. Schlueter +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +nice-try 1.0.5 - MIT +https://github.com/electerious/nice-try +Copyright (c) 2018 Tobias Reich + +The MIT License (MIT) + +Copyright (c) 2018 Tobias Reich + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +node-fetch 2.6.0 - MIT +https://github.com/bitinn/node-fetch +Copyright (c) 2016 David Frank + +The MIT License (MIT) + +Copyright (c) 2016 David Frank + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +npm-path 2.0.4 - MIT +https://github.com/timoxley/npm-path +Copyright (c) 2014 Tim Oxley + +The MIT License (MIT) + +Copyright (c) 2014 Tim Oxley + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +npm-run-path 2.0.2 - MIT +https://github.com/sindresorhus/npm-run-path#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +npm-which 3.0.1 - MIT +https://github.com/timoxley/npm-which +Copyright (c) 2014 Tim Oxley + +The MIT License (MIT) + +Copyright (c) 2014 Tim Oxley + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +number-is-nan 1.0.1 - MIT +https://github.com/sindresorhus/number-is-nan#readme +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +object-assign 4.1.1 - MIT +https://github.com/sindresorhus/object-assign#readme +(c) Sindre Sorhus +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +object-copy 0.1.0 - MIT +https://github.com/jonschlinkert/object-copy +Copyright (c) 2016, Jon Schlinkert. + +The MIT License (MIT) + +Copyright (c) 2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +object-inspect 1.6.0 - MIT +https://github.com/substack/object-inspect + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +object-keys 1.1.1 - MIT +https://github.com/ljharb/object-keys#readme +Copyright (c) 2013 Jordan Harband + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +object-visit 1.0.1 - MIT +https://github.com/jonschlinkert/object-visit +Copyright (c) 2015, 2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015, 2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +object.getownpropertydescriptors 2.0.3 - MIT +https://github.com/ljharb/object.getownpropertydescriptors#readme +Copyright (c) 2015 Jordan Harband + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +object.pick 1.3.0 - MIT +https://github.com/jonschlinkert/object.pick +Copyright (c) 2014-2016, Jon Schlinkert. +Copyright (c) 2014-2015 Jon Schlinkert, contributors. +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +on-finished 2.3.0 - MIT +https://github.com/jshttp/on-finished +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2014 Douglas Christopher Wilson +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2014 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2013 Jonathan Ong +Copyright (c) 2014 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +on-headers 1.0.2 - MIT +https://github.com/jshttp/on-headers#readme +Copyright (c) 2014 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +one-time 0.0.4 - MIT +https://github.com/unshiftio/one-time +Copyright (c) 2015 Unshift.io, Arnout Kazemier + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +onetime 2.0.1 - MIT +https://github.com/sindresorhus/onetime#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +os 0.1.1 - MIT +https://github.com/DiegoRBaquero/node-os#readme +Copyright (c) 2016 Diego Rodriguez Baquero +Copyright (c) Diego Rodriguez Baquero (https://diegorbaquero.com). + +The MIT License (MIT) + +Copyright (c) 2016 Diego Rodríguez Baquero + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +os-homedir 1.0.2 - MIT +https://github.com/sindresorhus/os-homedir#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +os-tmpdir 1.0.2 - MIT +https://github.com/sindresorhus/os-tmpdir#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +p-finally 1.0.0 - MIT +https://github.com/sindresorhus/p-finally#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +p-limit 2.2.1 - MIT +https://github.com/sindresorhus/p-limit#readme +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +p-locate 3.0.0 - MIT +https://github.com/sindresorhus/p-locate#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +p-map 1.2.0 - MIT +https://github.com/sindresorhus/p-map#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +p-map 2.1.0 - MIT +https://github.com/sindresorhus/p-map#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +p-try 2.2.0 - MIT +https://github.com/sindresorhus/p-try#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +parse-json 4.0.0 - MIT +https://github.com/sindresorhus/parse-json#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +parse-semver 1.1.1 - MIT +https://github.com/tunnckocore/parse-semver#readme +Copyright (c) 2015 Charlike Mike Reagent, contributors. +Copyright (c) 2015-2016 Charlike Make Reagent (http://j.mp/1stW47C) +Copyright (c) 2015-2016 Charlike Mike Reagent <@tunnckoCore> (http://www.tunnckocore.tk) + +# The MIT License + +Copyright (c) 2015-2016 [Charlike Make Reagent](http://j.mp/1stW47C) + +> 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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +parse5 3.0.3 - MIT +https://github.com/inikulin/parse5 +Copyright (c) 2013-2016 Ivan Nikulin (ifaaan@gmail.com, https://github.com/inikulin) + +Copyright (c) 2013-2016 Ivan Nikulin (ifaaan@gmail.com, https://github.com/inikulin) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +parseurl 1.3.3 - MIT +https://github.com/pillarjs/parseurl#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2017 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2017 Douglas Christopher Wilson + + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +pascalcase 0.1.1 - MIT +https://github.com/jonschlinkert/pascalcase +Copyright (c) 2015 Jon Schlinkert +Copyright (c) 2015, Jon Schlinkert. + +The MIT License (MIT) + +Copyright (c) 2015, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +path-exists 3.0.0 - MIT +https://github.com/sindresorhus/path-exists#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +path-is-absolute 1.0.1 - MIT +https://github.com/sindresorhus/path-is-absolute#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +path-key 2.0.1 - MIT +https://github.com/sindresorhus/path-key#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +path-key 3.1.0 - MIT +https://github.com/sindresorhus/path-key#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +path-parse 1.0.6 - MIT +https://github.com/jbgutierrez/path-parse#readme +Copyright (c) 2015 Javier Blanco +(c) Javier Blanco (http://jbgutierrez.info) + +The MIT License (MIT) + +Copyright (c) 2015 Javier Blanco + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +path-to-regexp 0.1.7 - MIT +https://github.com/component/path-to-regexp#readme +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +pend 1.2.0 - MIT +Copyright (c) 2014 Andrew Kelley + +The MIT License (Expat) + +Copyright (c) 2014 Andrew Kelley + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +performance-now 2.1.0 - MIT +https://github.com/braveg1rl/performance-now +Copyright (c) 2013 Braveg1rl +Copyright (c) 2017 Braveg1rl + +Copyright (c) 2013 Braveg1rl + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +pify 3.0.0 - MIT +https://github.com/sindresorhus/pify#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +pify 2.3.0 - MIT +https://github.com/sindresorhus/pify +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +pinkie 2.0.4 - MIT +(c) Vsevolod Strukchinsky (http://github.com/floatdrop) +Copyright (c) Vsevolod Strukchinsky + +The MIT License (MIT) + +Copyright (c) Vsevolod Strukchinsky (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +pinkie-promise 2.0.1 - MIT +https://github.com/floatdrop/pinkie-promise +(c) Vsevolod Strukchinsky (http://github.com/floatdrop) +Copyright (c) Vsevolod Strukchinsky + +The MIT License (MIT) + +Copyright (c) Vsevolod Strukchinsky (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +pkg-dir 3.0.0 - MIT +https://github.com/sindresorhus/pkg-dir#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +please-upgrade-node 3.2.0 - MIT +https://github.com/typicode/please-upgrade-node#readme +Copyright (c) 2017 + +MIT License + +Copyright (c) 2017 + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +posix-character-classes 0.1.1 - MIT +https://github.com/jonschlinkert/posix-character-classes +Copyright (c) 2016-2017, Jon Schlinkert +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2016-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +prettier 1.18.2 - MIT +https://prettier.io +(c) Sindre Sorhus +Copyright (c) 2015 Jon Schlinkert. +Copyright 2011 The Closure Compiler +Copyright (c) Microsoft Corporation. +Copyright (c) 2014-2018, Jon Schlinkert. +Copyright (c) James Long and contributors +Copyright (c) 2014-present, Facebook, Inc. +Copyright (c) 2014 Ivan Nikulin +Copyright 2011 Mozilla Foundation and contributors +Copyright 2014 Mozilla Foundation and contributors +Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell +Copyright Joyent, Inc. and other Node contributors. +Copyright 2009-2011 Mozilla Foundation and contributors +Copyright (c) 2013 Yusuke Suzuki +Copyright (c) 2013-2014 Yusuke Suzuki +Copyright jQuery Foundation and other contributors +Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + +Copyright © James Long 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +private 0.1.8 - MIT +http://github.com/benjamn/private +Copyright (c) 2014 Ben Newman + +Copyright (c) 2014 Ben Newman + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +process-nextick-args 2.0.1 - MIT +https://github.com/calvinmetcalf/process-nextick-args +Copyright (c) 2015 Calvin Metcalf + +# 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.** + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +property-expr 1.5.1 - MIT +https://github.com/jquense/expr#readme +Copyright (c) 2014 Jason Quense + +The MIT License (MIT) + +Copyright (c) 2014 Jason Quense + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +proxy-addr 2.0.5 - MIT +https://github.com/jshttp/proxy-addr#readme +Copyright (c) 2014-2016 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014-2016 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +psl 1.4.0 - MIT +https://github.com/lupomontero/psl#readme +Copyright (c) 2017 Lupo Montero lupomontero@gmail.com +Copyright (c) 2017 Lupo Montero + +The MIT License (MIT) + +Copyright (c) 2017 Lupo Montero lupomontero@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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +pump 3.0.0 - MIT +https://github.com/mafintosh/pump#readme +Copyright (c) 2014 Mathias Buus + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +punycode 1.4.1 - MIT +https://mths.be/punycode +Copyright Mathias Bynens + +Copyright Mathias Bynens + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +punycode 2.1.1 - MIT +https://mths.be/punycode +Copyright Mathias Bynens + +Copyright Mathias Bynens + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +range-parser 1.2.1 - MIT +https://github.com/jshttp/range-parser#readme +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson doug@somethingdoug.com + +(The MIT License) + +Copyright (c) 2012-2014 TJ Holowaychuk +Copyright (c) 2015-2016 Douglas Christopher Wilson +Copyright (c) 2014-2015 Douglas Christopher Wilson + +The MIT License (MIT) + +Copyright (c) 2013-2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +read-pkg 4.0.1 - MIT +https://github.com/sindresorhus/read-pkg#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +readable-stream 2.3.6 - MIT +https://github.com/nodejs/readable-stream#readme +Copyright Joyent, Inc. and other Node contributors. + +Node.js is licensed for use as follows: + +""" +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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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. +""" + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +readable-stream 3.4.0 - MIT +https://github.com/nodejs/readable-stream#readme +Copyright Joyent, Inc. and other Node contributors. + +Node.js is licensed for use as follows: + +""" +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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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. +""" + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +redeyed 2.1.1 - MIT +https://github.com/thlorenz/redeyed#readme +Copyright 2012 Thorsten Lorenz. + +Copyright 2012 Thorsten Lorenz. +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +regenerate 1.4.0 - MIT +https://mths.be/regenerate +Copyright Mathias Bynens + +Copyright Mathias Bynens + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +regenerator-runtime 0.11.1 - MIT +Copyright (c) 2014-present, Facebook, Inc. + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +regenerator-runtime 0.13.3 - MIT +Copyright (c) 2014-present, Facebook, Inc. + +MIT License + +Copyright (c) 2014-present, Facebook, Inc. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +regex-not 1.0.2 - MIT +https://github.com/jonschlinkert/regex-not +Copyright (c) 2016, 2018, Jon Schlinkert. +Copyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert). + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +regexpu-core 2.0.0 - MIT +https://mths.be/regexpu +Copyright Mathias Bynens + +Copyright Mathias Bynens + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +regjsgen 0.2.0 - MIT +https://github.com/d10/regjsgen +Copyright 2014 Benjamin Tan +Copyright 2014 Benjamin Tan (https://d10.github.io/) + +Copyright 2014 Benjamin Tan (https://d10.github.io/) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +repeat-element 1.1.3 - MIT +https://github.com/jonschlinkert/repeat-element +Copyright (c) 2015-present, Jon Schlinkert. +Copyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-present, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +repeat-string 1.6.1 - MIT +https://github.com/jonschlinkert/repeat-string +Copyright (c) 2014-2015, Jon Schlinkert. +Copyright (c) 2014-2016, Jon Schlinkert. +Copyright (c) 2016, Jon Schlinkert (http://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +repeating 2.0.1 - MIT +https://github.com/sindresorhus/repeating#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +resolve 1.12.0 - MIT +https://github.com/browserify/resolve#readme +Copyright (c) 2012 James Halliday + +MIT License + +Copyright (c) 2012 James Halliday + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +resolve-from 3.0.0 - MIT +https://github.com/sindresorhus/resolve-from#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +resolve-url 0.2.1 - MIT +https://github.com/lydell/resolve-url +Copyright (c) 2013 Simon Lydell +Copyright 2014 Simon Lydell X11 + +The MIT License (MIT) + +Copyright (c) 2013 Simon Lydell + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +restore-cursor 2.0.0 - MIT +https://github.com/sindresorhus/restore-cursor#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ret 0.1.15 - MIT +https://github.com/fent/ret.js#readme +Copyright (c) 2011 by Roly Fentanes + +Copyright (C) 2011 by Roly Fentanes + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +retry-as-promised 3.2.0 - MIT +https://github.com/mickhansen/retry-as-promised +Copyright (c) 2015-2016 Mick Hansen. http://mhansen.io + +The MIT License + +Copyright (c) 2015-2016 Mick Hansen. http://mhansen.io + +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. + + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +run-node 1.0.0 - MIT +https://github.com/sindresorhus/run-node#readme +(c) Sindre Sorhus +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +safe-buffer 5.1.2 - MIT +https://github.com/feross/safe-buffer +Copyright (c) Feross Aboukhadijeh +Copyright (c) Feross Aboukhadijeh (http://feross.org) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +safe-regex 1.1.0 - MIT +https://github.com/substack/safe-regex + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +safer-buffer 2.1.2 - MIT +https://github.com/ChALkeR/safer-buffer#readme +Copyright (c) 2018 Nikita Skovoroda + +MIT License + +Copyright (c) 2018 Nikita Skovoroda + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +semver-compare 1.0.0 - MIT +https://github.com/substack/semver-compare + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +send 0.17.1 - MIT +https://github.com/pillarjs/send#readme +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2014-2016 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2014-2016 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +seq-queue 0.0.5 - MIT +https://github.com/changchang/seq-queue +Copyright (c) 2012 Netease, Inc. + +(The MIT License) + +Copyright (c) 2012 Netease, Inc. and other pomelo 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +sequelize 5.18.4 - MIT +https://sequelize.org/ +Copyright (c) 2014-present Sequelize + +MIT License + +Copyright (c) 2014-present Sequelize 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +sequelize-pool 2.3.0 - MIT +https://github.com/sushantdhiman/sequelize-pool#readme +Copyright (c) 2010-2016 James Cooper +Copyright (c) 2018-present Sushant + +(The MIT License) + +Copyright (c) 2018-present Sushant + +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. + + +-------------------------------- + +(Original Fork License) + +[generic-pool@2.5] + +Copyright (c) 2010-2016 James Cooper + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +serve-static 1.14.1 - MIT +https://github.com/expressjs/serve-static#readme +Copyright (c) 2011 LearnBoost +Copyright (c) 2010 Sencha Inc. +Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2014-2016 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2010 Sencha Inc. +Copyright (c) 2011 LearnBoost +Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2014-2016 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +set-value 2.0.1 - MIT +https://github.com/jonschlinkert/set-value +Copyright (c) 2014-2017, Jon Schlinkert +Copyright (c) 2014-2015, 2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2014-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +shebang-command 2.0.0 - MIT +https://github.com/kevva/shebang-command#readme +Copyright (c) Kevin Martensson + +MIT License + +Copyright (c) Kevin Mårtensson (github.com/kevva) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +shebang-command 1.2.0 - MIT +https://github.com/kevva/shebang-command#readme +(c) Kevin Martensson (http://github.com/kevva) +Copyright (c) Kevin Martensson + +The MIT License (MIT) + +Copyright (c) Kevin Martensson (github.com/kevva) + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +shebang-regex 1.0.0 - MIT +https://github.com/sindresorhus/shebang-regex +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +shebang-regex 3.0.0 - MIT +https://github.com/sindresorhus/shebang-regex#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +simple-git 1.126.0 - MIT +https://github.com/steveukx/git-js#readme +Copyright (c) 2015 Steve King + +The MIT License (MIT) + +Copyright (c) 2015 Steve King + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +simple-swizzle 0.2.2 - MIT +https://github.com/qix-/node-simple-swizzle#readme +Copyright (c) 2015 Josh Junon + +The MIT License (MIT) + +Copyright (c) 2015 Josh Junon + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +slash 2.0.0 - MIT +https://github.com/sindresorhus/slash#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +slash 1.0.0 - MIT +https://github.com/sindresorhus/slash +(c) Sindre Sorhus (http://sindresorhus.com) + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +slice-ansi 0.0.4 - MIT +https://github.com/chalk/slice-ansi#readme +(c) 2015 DC +(c) David Caccavella (https://githbu.com/dthree) + +(The MIT License) + +Copyright (c) 2015 DC + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +snapdragon 0.8.2 - MIT +https://github.com/jonschlinkert/snapdragon +Copyright (c) 2015-2016, Jon Schlinkert. +Copyright (c) 2012 TJ Holowaychuk +Copyright (c) 2016, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +snapdragon-node 2.1.1 - MIT +https://github.com/jonschlinkert/snapdragon-node +Copyright (c) 2017, Jon Schlinkert +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +snapdragon-util 3.0.1 - MIT +https://github.com/jonschlinkert/snapdragon-util +Copyright (c) 2017, Jon Schlinkert +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +source-map-resolve 0.5.2 - MIT +https://github.com/lydell/source-map-resolve#readme +Copyright 2014 Simon Lydell X11 +Copyright 2017 Simon Lydell X11 +Copyright 2014, 2017 Simon Lydell X11 +Copyright (c) 2014, 2015, 2016, 2017 Simon Lydell +Copyright 2014, 2015, 2016, 2017 Simon Lydell X11 + +The MIT License (MIT) + +Copyright (c) 2014, 2015, 2016, 2017 Simon Lydell + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +source-map-support 0.4.18 - MIT +https://github.com/evanw/node-source-map-support#readme +Copyright (c) 2014 Evan Wallace + +The MIT License (MIT) + +Copyright (c) 2014 Evan Wallace + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +source-map-support 0.5.13 - MIT +https://github.com/evanw/node-source-map-support#readme +Copyright (c) 2014 Evan Wallace + +The MIT License (MIT) + +Copyright (c) 2014 Evan Wallace + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +source-map-url 0.4.0 - MIT +https://github.com/lydell/source-map-url#readme +Copyright (c) 2014 Simon Lydell +Copyright 2014 Simon Lydell X11 + +The MIT License (MIT) + +Copyright (c) 2014 Simon Lydell + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +spdx-expression-parse 3.0.0 - MIT +https://github.com/jslicense/spdx-expression-parse.js#readme +Copyright (c) 2015 Kyle E. Mitchell + +The MIT License + +Copyright (c) 2015 Kyle E. Mitchell & other authors listed in AUTHORS + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +split-string 3.1.0 - MIT +https://github.com/jonschlinkert/split-string +Copyright (c) 2015-2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +sqlstring 2.3.1 - MIT +https://github.com/mysqljs/sqlstring#readme +Copyright (c) 2012 Felix Geisendorfer (felix@debuggable.com) and contributors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +sshpk 1.16.1 - MIT +https://github.com/arekinath/node-sshpk#readme +Copyright Joyent, Inc. +Copyright 2015 Joyent, Inc. +Copyright 2016 Joyent, Inc. +Copyright 2017 Joyent, Inc. +Copyright 2018 Joyent, Inc. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +stack-trace 0.0.10 - MIT +https://github.com/felixge/node-stack-trace +Copyright (c) 2011 Felix Geisendorfer (felix@debuggable.com) + +Copyright (c) 2011 Felix Geisendörfer (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +static-extend 0.1.2 - MIT +https://github.com/jonschlinkert/static-extend +Copyright (c) 2016, Jon Schlinkert. + +The MIT License (MIT) + +Copyright (c) 2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +statuses 1.5.0 - MIT +https://github.com/jshttp/statuses#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2016 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2016 Douglas Christopher Wilson + + +The MIT License (MIT) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2016 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +string_decoder 1.1.1 - MIT +https://github.com/nodejs/string_decoder +Copyright Joyent, Inc. and other Node contributors. + +Node.js is licensed for use as follows: + +""" +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. +""" + +This license applies to parts of Node.js originating from the +https://github.com/joyent/node repository: + +""" +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. +""" + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +string-argv 0.0.2 - MIT +https://github.com/mccormicka/string-argv + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +string-width 1.0.2 - MIT +https://github.com/sindresorhus/string-width#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +string-width 2.1.1 - MIT +https://github.com/sindresorhus/string-width#readme +(c) Sindre Sorhus (https://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +string.prototype.trimleft 2.1.0 - MIT +https://github.com/es-shims/String.prototype.trimLeft#readme +Copyright (c) 2015 Jordan Harband + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +string.prototype.trimright 2.1.0 - MIT +https://github.com/es-shims/String.prototype.trimRight#readme +Copyright (c) 2015 Jordan Harband + +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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +strip-ansi 3.0.1 - MIT +https://github.com/chalk/strip-ansi +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +strip-ansi 4.0.0 - MIT +https://github.com/chalk/strip-ansi#readme +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +strip-eof 1.0.0 - MIT +https://github.com/sindresorhus/strip-eof +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +supports-color 5.4.0 - MIT +https://github.com/chalk/supports-color#readme +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +supports-color 5.5.0 - MIT +https://github.com/chalk/supports-color#readme +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +supports-color 2.0.0 - MIT +https://github.com/chalk/supports-color +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +symbol-observable 1.2.0 - MIT +https://github.com/blesh/symbol-observable#readme +Copyright (c) Ben Lesh +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) Ben Lesh + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tedious 6.6.5 - MIT +https://github.com/tediousjs/tedious +Copyright (c) 2010-2018 Mike D Pilsbury + +The MIT License + +Copyright (c) 2010-2018 Mike D Pilsbury + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +text-hex 1.0.0 - MIT +https://github.com/3rd-Eden/text-hex +Copyright (c) 2014-2015 Arnout Kazemier + +The MIT License (MIT) + +Copyright (c) 2014-2015 Arnout Kazemier + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tmp 0.0.29 - MIT +http://github.com/raszi/node-tmp +Copyright (c) 2014 KARASZI Istvan +Copyright (c) 2011-2015 KARASZI Istvan + +The MIT License (MIT) + +Copyright (c) 2014 KARASZI István + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +to-fast-properties 1.0.3 - MIT +https://github.com/sindresorhus/to-fast-properties#readme +(c) Petka Antonov, Sindre Sorhus +Copyright (c) 2014 Petka Antonov 2015 Sindre Sorhus + +The MIT License (MIT) + +Copyright (c) 2014 Petka Antonov + 2015 Sindre Sorhus + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +to-object-path 0.3.0 - MIT +https://github.com/jonschlinkert/to-object-path +Copyright (c) 2015 Jon Schlinkert +Copyright (c) 2015, Jon Schlinkert. +Copyright (c) 2015-2016, Jon Schlinkert. + +The MIT License (MIT) + +Copyright (c) 2015-2016, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +to-regex 3.0.2 - MIT +https://github.com/jonschlinkert/to-regex +Copyright (c) 2016-2018, Jon Schlinkert. +Copyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert). + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +to-regex-range 2.1.1 - MIT +https://github.com/micromatch/to-regex-range +Copyright (c) 2015-2017, Jon Schlinkert +Copyright (c) 2015, 2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +toidentifier 1.0.0 - MIT +https://github.com/component/toidentifier#readme +Copyright (c) 2016 Douglas Christopher Wilson +Copyright (c) 2016 Douglas Christopher Wilson + +MIT License + +Copyright (c) 2016 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +toposort 2.0.2 - MIT +https://github.com/marcelklehr/toposort#readme +Copyright (c) 2012 by Marcel Klehr + + +Toposort - Topological sorting for node.js +Copyright (c) 2012 by Marcel Klehr +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +toposort-class 1.0.1 - MIT +https://github.com/gustavohenke/toposort#readme +Copyright (c) 2015 Gustavo Henke and Aaron Trent + +The MIT License (MIT) + +Copyright (c) 2015 Gustavo Henke and Aaron Trent + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +trim-right 1.0.1 - MIT +https://github.com/sindresorhus/trim-right +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +triple-beam 1.3.0 - MIT +https://github.com/winstonjs/triple-beam#readme +Copyright (c) 2017 +(c) 2010 Charlie Robbins + +MIT License + +Copyright (c) 2017 winstonjs + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +ts-node 7.0.1 - MIT +https://github.com/TypeStrong/ts-node +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + +The MIT License (MIT) + +Copyright (c) 2014 Blake Embrey (hello@blakeembrey.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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tsutils 2.29.0 - MIT +https://github.com/ajafff/tsutils#readme +Copyright (c) 2017 Klaus Meinhardt + +The MIT License (MIT) + +Copyright (c) 2017 Klaus Meinhardt + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tunnel 0.0.6 - MIT +https://github.com/koichik/node-tunnel/ +Copyright (c) 2012 Koichi Kobayashi + +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tunnel 0.0.4 - MIT +https://github.com/koichik/node-tunnel/ +Copyright (c) 2012 Koichi Kobayashi + +The MIT License (MIT) + +Copyright (c) 2012 Koichi Kobayashi + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +type-is 1.6.18 - MIT +https://github.com/jshttp/type-is#readme +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014 Jonathan Ong +Copyright (c) 2014-2015 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +typed-rest-client 1.2.0 - MIT +https://github.com/Microsoft/typed-rest-client#readme +Copyright (c) Microsoft. +Copyright (c) 2015 Zhiye Li +Copyright (c) 2016 Zeit, Inc. +Copyright (c) 2014 Tyler Kellen +Copyright (c) 2015 Tyler Kellen +Copyright (c) Isaac Z. Schlueter +Copyright (c) 2012 Koichi Kobayashi +Copyright (c) Microsoft Corporation. +Copyright (c) 2011-2017 JS Foundation +Copyright (c) Isaac Z. Schlueter and Contributors +Copyright 2010 James Halliday (mail@substack.net) +Copyright Joyent, Inc. and other Node contributors. +Copyright (c) 2012, Artur Adib +Copyright Mathias Bynens +Copyright (c) 2011 TJ Holowaychuk +Copyright (c) 2014 TJ Holowaychuk +Copyright (c) 2009-2015, Kevin Decker +Copyright (c) 2013 Julian Gruber +Copyright (c) 2012-2014 Kit Cambridge. http://kitcambridge.be +Copyright 2012-2015 The Dojo Foundation +Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright jQuery Foundation and other contributors +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + +Typed Rest Client for Node.js + +Copyright (c) Microsoft Corporation + +All rights reserved. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +uc.micro 1.0.6 - MIT +https://github.com/markdown-it/uc.micro#readme +Copyright Mathias Bynens + +Copyright Mathias Bynens + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +underscore 1.8.3 - MIT +http://underscorejs.org +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +(c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors Underscore + +Copyright (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative +Reporters & Editors + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +union-value 1.0.1 - MIT +https://github.com/jonschlinkert/union-value +Copyright (c) 2015-2017, Jon Schlinkert +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +unpipe 1.0.0 - MIT +https://github.com/stream-utils/unpipe +Copyright (c) 2015 Douglas Christopher Wilson +Copyright (c) 2015 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2015 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +unset-value 1.0.0 - MIT +https://github.com/jonschlinkert/unset-value +Copyright (c) 2015, 2017, Jon Schlinkert. +Copyright (c) 2017, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015, 2017, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +urix 0.1.0 - MIT +https://github.com/lydell/urix +Copyright (c) 2013 Simon Lydell +Copyright 2014 Simon Lydell X11 + +The MIT License (MIT) + +Copyright (c) 2013 Simon Lydell + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +url-join 1.1.0 - MIT +https://github.com/jfromaniello/url-join#readme + +MIT License + +Copyright (c) + +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 3.1.1 - MIT +https://github.com/jonschlinkert/use +Copyright (c) 2015-2017, Jon Schlinkert. +Copyright (c) 2015-present, Jon Schlinkert. +Copyright (c) 2018, Jon Schlinkert (https://github.com/jonschlinkert). + +The MIT License (MIT) + +Copyright (c) 2015-present, 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +util-deprecate 1.0.2 - MIT +https://github.com/TooTallNate/util-deprecate +Copyright (c) 2014 Nathan Rajlich + +(The MIT License) + +Copyright (c) 2014 Nathan Rajlich + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +util.promisify 1.0.0 - MIT +https://github.com/ljharb/util.promisify#readme +Copyright (c) 2017 Jordan Harband + +MIT License + +Copyright (c) 2017 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +utils-merge 1.0.1 - MIT +https://github.com/jaredhanson/utils-merge#readme +Copyright (c) 2013-2017 Jared Hanson +Copyright (c) 2013-2017 Jared Hanson < http://jaredhanson.net/ (http://jaredhanson.net/)> + +The MIT License (MIT) + +Copyright (c) 2013-2017 Jared Hanson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +uuid 3.3.3 - MIT +https://github.com/kelektiv/node-uuid#readme +Copyright 2011, Sebastian Tschan https://blueimp.net +Copyright (c) 2010-2016 Robert Kieffer and other contributors +Copyright (c) Paul Johnston 1999 - 2009 Other contributors Greg Holt, Andrew Kepert, Ydnar, Lostinet + +The MIT License (MIT) + +Copyright (c) 2010-2016 Robert Kieffer and other 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +validator 10.11.0 - MIT +https://github.com/chriso/validator.js +Copyright (c) 2018 Chris O'Hara + +Copyright (c) 2018 Chris O'Hara + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +vary 1.1.2 - MIT +https://github.com/jshttp/vary#readme +Copyright (c) 2014-2017 Douglas Christopher Wilson + +(The MIT License) + +Copyright (c) 2014-2017 Douglas Christopher Wilson + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +verror 1.10.0 - MIT +https://github.com/davepacheco/node-verror +Copyright (c) 2016, Joyent, Inc. + +Copyright (c) 2016, 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 + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +vsce 1.66.0 - MIT +https://code.visualstudio.com +Copyright (c) 2015 Microsoft +Copyright (c) 2014 Josh Wolfe +Copyright (c) 2014 KARASZI Istvan +Copyright (c) Microsoft Corporation +Copyright (c) Isaac Z. Schlueter and Contributors +Copyright (c) 2010 Benjamin Thomas, Robert Kieffer +Copyright (c) 2011 TJ Holowaychuk +Copyright 2012-2015 The Dojo Foundation +copyright 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + + +Copyright (c) Microsoft Corporation + +All rights reserved. + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +winston 3.2.1 - MIT +https://github.com/winstonjs/winston#readme +(c) 2015 Nimrod Becker +(c) 2010 Charlie Robbins +(c) 2016 Charlie Robbins +(c) 2011 Daniel Aristizabal +Copyright (c) 2010 Charlie Robbins + +Copyright (c) 2010 Charlie Robbins + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +winston-transport 4.3.0 - MIT +https://github.com/winstonjs/winston-transport#readme +Copyright (c) 2015 Charlie Robbins & the contributors. + +The MIT License (MIT) + +Copyright (c) 2015 Charlie Robbins & 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. + + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +wkx 0.4.8 - MIT +https://github.com/cschwarz/wkx#readme +Copyright (c) 2013 Christian Schwarz +Copyright Joyent, Inc. and other Node contributors. + +The MIT License (MIT) + +Copyright (c) 2013 Christian Schwarz + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +wrap-ansi 3.0.1 - MIT +https://github.com/chalk/wrap-ansi#readme +Copyright (c) Sindre Sorhus (sindresorhus.com) + +MIT License + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +xml2js 0.4.22 - MIT +https://github.com/Leonidas-from-XIV/node-xml2js +Copyright 2010, 2011, 2012, 2013. + +Copyright 2010, 2011, 2012, 2013. 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +xmlbuilder 11.0.1 - MIT +http://github.com/oozcitak/xmlbuilder-js +Copyright (c) 2013 Ozgur Ozcitak + +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +xpath.js 1.1.0 - MIT +https://github.com/yaronn/xpath.js#readme + +MIT License + +Copyright (c) + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +yauzl 2.10.0 - MIT +https://github.com/thejoshwolfe/yauzl +Copyright (c) 2014 Josh Wolfe + +The MIT License (MIT) + +Copyright (c) 2014 Josh Wolfe + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +yazl 2.5.1 - MIT +https://github.com/thejoshwolfe/yazl +Copyright (c) 2014 Josh Wolfe + +The MIT License (MIT) + +Copyright (c) 2014 Josh Wolfe + +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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +yn 2.0.0 - MIT +https://github.com/sindresorhus/yn#readme +(c) Sindre Sorhus (http://sindresorhus.com) +Copyright (c) Sindre Sorhus (sindresorhus.com) + +The MIT License (MIT) + +Copyright (c) Sindre Sorhus (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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +yup 0.27.0 - MIT +https://github.com/jquense/yup +Copyright (c) 2014 Jason Quense +(c) 2011 Colin Snover + +The MIT License (MIT) + +Copyright (c) 2014 Jason Quense + +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. + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +tweetnacl 0.14.5 - Unlicense +https://tweetnacl.js.org + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +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 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. + +For more information, please refer to + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +json-schema 0.2.3 - AFL-2.1 OR BSD-3-Clause +https://github.com/kriszyp/json-schema#readme +Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com) + +AFL-2.1 OR BSD-3-Clause + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +regenerator-transform 0.10.1 - BSD-2-Clause AND OTHER +Copyright (c) 2014, Facebook, Inc. + +BSD-2-Clause AND OTHER + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +atob 2.1.2 - MIT OR Apache-2.0 +https://git.coolaj86.com/coolaj86/atob.js.git +Copyright 2015 AJ ONeal +Copyright (c) 2015 AJ ONeal +copyright 2012-2018 AJ ONeal + +At your option you may choose either of the following licenses: + + * The MIT License (MIT) + * The Apache License 2.0 (Apache-2.0) + + +The MIT License (MIT) + +Copyright (c) 2015 AJ ONeal + +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. + + + 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: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) 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 + + (d) 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 + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2015 AJ ONeal + + 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. + + +------------------------------------------------------------------- + +------------------------------------------------------------------- + +path-is-inside 1.0.2 - WTFPL OR MIT +https://github.com/domenic/path-is-inside#readme +Copyright (c) 2004 Sam Hocevar +Copyright (c) 2013-2016 Domenic Denicola + +Dual licensed under WTFPL and MIT: + +--- + +Copyright © 2013–2016 Domenic Denicola + +This work is free. You can redistribute it and/or modify it under the +terms of the Do What The Fuck You Want To Public License, Version 2, +as published by Sam Hocevar. See below for more details. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + +--- + +The MIT License (MIT) + +Copyright © 2013–2016 Domenic Denicola + +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/package.json b/package.json index 2dfaf8961..288f73cb6 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,6 @@ "description": "An open source Azure Storage API compatible server", "icon": "icon.png", "version": "3.4.0", - "preview": false, "publisher": "Azurite", "categories": [ "Other" @@ -198,7 +197,7 @@ "test:blob:sql": "npm run lint && cross-env AZURITE_TEST_DB=mysql://root:my-secret-pw@127.0.0.1:3306/azurite_blob_test mocha --compilers ts-node/register --no-timeouts --grep @sql --recursive tests/blob/*.test.ts tests/blob/**/*.test.ts", "test:blob:sql:ci": "npm run lint && cross-env AZURITE_TEST_DB=mysql://root:my-secret-pw@127.0.0.1:13306/azurite_blob_test mocha --compilers ts-node/register --no-timeouts --grep @sql --recursive tests/blob/*.test.ts tests/blob/**/*.test.ts", "test:queue": "npm run lint && mocha --compilers ts-node/register --no-timeouts --recursive tests/queue/*.test.ts tests/queue/**/*.test.ts", - "clean": "rimraf dist typings *.log coverage __testspersistence__ temp __testsstorage__ .nyc_output debug.log *.vsix", + "clean": "rimraf dist typings *.log coverage __testspersistence__ temp __testsstorage__ .nyc_output debug.log *.vsix *.tgz", "clean:deep": "npm run clean && rimraf debug.log __*", "validate:npmpack:win": "npm install && npm run build && npm pack && cross-var npm install -g azurite-$npm_package_version.tgz && azurite -v && azurite-blob -v && azurite-queue -v", "validate:npmpack:linux_mac": "npm install && npm run build && npm pack && cross-var sudo npm install -g azurite-$npm_package_version.tgz && azurite -v && azurite-blob -v && azurite-queue -v", diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 6092e2980..0cb868c9f 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -7,7 +7,6 @@ import { convertDateTimeStringMsTo7Digital, rimrafAsync } from "../../common/utils/utils"; -import { lfsa } from "../../common/utils/utils"; import StorageErrorFactory from "../errors/StorageErrorFactory"; import * as Models from "../generated/artifacts/models"; import { LeaseStatusType } from "../generated/artifacts/models"; @@ -100,7 +99,6 @@ export default class LokiBlobMetadataStore public constructor(public readonly lokiDBPath: string) { this.db = new Loki(lokiDBPath, { - adapter: new lfsa(), autosave: true, autosaveInterval: 5000 }); @@ -209,12 +207,6 @@ export default class LokiBlobMetadataStore if (this.isClosed()) { await rimrafAsync(this.lokiDBPath); - // Remove separate metadata collection json files generated by LokiFsStructuredAdapter - const searchScope = 20; // Should be larger than number of collections for every loki database - for (let i = 0; i < searchScope; i++) { - await rimrafAsync(`${this.lokiDBPath}.${i}`); - } - return; } throw new Error(`Cannot clean LokiBlobMetadataStore, it's not closed.`); diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index 5506b00c7..971e093ec 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -103,6 +103,13 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { connectionURI: string, sequelizeOptions?: SequelizeOptions ) { + // Enable encrypt connection for SQL Server + if (connectionURI.startsWith("mssql") && sequelizeOptions) { + sequelizeOptions.dialectOptions = sequelizeOptions.dialectOptions || {}; + (sequelizeOptions.dialectOptions as any).options = + (sequelizeOptions.dialectOptions as any).options || {}; + (sequelizeOptions.dialectOptions as any).options.encrypt = true; + } this.sequelize = new Sequelize(connectionURI, sequelizeOptions); } diff --git a/src/common/persistence/SqlExtentMetadataStore.ts b/src/common/persistence/SqlExtentMetadataStore.ts index 60d04fc4a..a3f3e4dfe 100644 --- a/src/common/persistence/SqlExtentMetadataStore.ts +++ b/src/common/persistence/SqlExtentMetadataStore.ts @@ -36,6 +36,13 @@ export default class SqlExtentMetadataStore implements IExtentMetadataStore { connectionURI: string, sequelizeOptions?: SequelizeOptions ) { + // Enable encrypt connection for SQL Server + if (connectionURI.startsWith("mssql") && sequelizeOptions) { + sequelizeOptions.dialectOptions = sequelizeOptions.dialectOptions || {}; + (sequelizeOptions.dialectOptions as any).options = + (sequelizeOptions.dialectOptions as any).options || {}; + (sequelizeOptions.dialectOptions as any).options.encrypt = true; + } this.sequelize = new Sequelize(connectionURI, sequelizeOptions); } From 33c267f30355bc1012fd0f744735a6cee02a6fd1 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Thu, 26 Dec 2019 12:12:44 +0800 Subject: [PATCH 31/34] Added description about SharedKey Lite support (#368) * Update README.md * Added description about SharedKey Lite support --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 37cfcb85f..e88e99c43 100644 --- a/README.md +++ b/README.md @@ -538,6 +538,7 @@ Detailed support matrix: - Abort Copy Blob (Only supports copy within same account in Azurite) - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) + - SharedKey Lite - OAuth authentication - Access control based on conditional headers (Requests will be blocked in strict mode) - Static Website @@ -546,8 +547,8 @@ Detailed support matrix: - Incremental Copy Blob - Create Append Blob, Append Block - 3.4.0 release added support for **2019-02-02** API version **queue** service. - Detailed support matrix: +3.4.0 release added support for **2019-02-02** API version **queue** service. +Detailed support matrix: - Supported Vertical Features - SharedKey Authentication @@ -572,6 +573,7 @@ Detailed support matrix: - Update Message - Clear Message - Following features or REST APIs are NOT supported or limited supported in this release (will support more features per customers feedback in future releases) + - SharedKey Lite - OAuth authentication ## License From ac31c87f3f99ced0f85c343ce1e0a1cebc104b22 Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 26 Dec 2019 16:13:12 +0800 Subject: [PATCH 32/34] Fixed a bug that BlobTierInferred not change to false after SetBlobTier. (#373) --- ChangeLog.md | 1 + src/blob/handlers/ContainerHandler.ts | 8 ++++++-- src/blob/persistence/LokiBlobMetadataStore.ts | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 20d61b614..a05d50bad 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -33,6 +33,7 @@ Blob: - Fixed a bug that uncommitted block blob invalid length. - Fixed a bug that SetHTTPHeaders, SetMetadata won't update blob etag. - Remove double quotation marks from list blob request returned blob etag, to align with Azure Server behavior. +- Fixed a bug that BlobTierInferred not change to false after SetBlobTier. - Blocked set tier for page blob which requires premium storage account where Azurite provides standard storage account. - GetPageRangesDiff API (incremental snapshot) now returns NotImplementedError. - Fixed a bug that listing containers won't honor prefix with marker when using external metadata database. diff --git a/src/blob/handlers/ContainerHandler.ts b/src/blob/handlers/ContainerHandler.ts index 7dc5940aa..6486997f3 100644 --- a/src/blob/handlers/ContainerHandler.ts +++ b/src/blob/handlers/ContainerHandler.ts @@ -560,7 +560,9 @@ export default class ContainerHandler extends BaseHandler deleted: item.deleted !== true ? undefined : true, properties: { ...item.properties, - etag: removeQuotationFromListBlobEtag(item.properties.etag) + etag: removeQuotationFromListBlobEtag(item.properties.etag), + accessTierInferred: + item.properties.accessTierInferred === true ? true : undefined } }; }) @@ -673,7 +675,9 @@ export default class ContainerHandler extends BaseHandler ...item, properties: { ...item.properties, - etag: removeQuotationFromListBlobEtag(item.properties.etag) + etag: removeQuotationFromListBlobEtag(item.properties.etag), + accessTierInferred: + item.properties.accessTierInferred === true ? true : undefined } }; }) diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index 0cb868c9f..f4d1675d0 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -1787,6 +1787,7 @@ export default class LokiBlobMetadataStore } doc.properties.accessTier = tier; + doc.properties.accessTierInferred = false; doc.properties.accessTierChangeTime = context.startTime; } else { throw StorageErrorFactory.getAccessTierNotSupportedForBlobType( From 53d61fa9aa11e8713cac5afdf428c5e7a1e689d3 Mon Sep 17 00:00:00 2001 From: xiaonlimsft Date: Thu, 26 Dec 2019 16:17:32 +0800 Subject: [PATCH 33/34] Fixes & updates for mismatch behaviors found during .net sdk testing (#369) * Copy blob will override existing blob * Update account SAS permission requirements for get account properties * Update error code from 400 to 409 when page operations agasint block blob * REturn 206 for downloading partial page blob, fixed #367 * Update blob createtime when commit block blob first create blob without override --- .../OperationAccountSASPermission.ts | 85 ++++++++++++++++--- src/blob/handlers/BlobHandler.ts | 3 +- src/blob/handlers/BlockBlobHandler.ts | 3 +- src/blob/handlers/PageBlobHandler.ts | 15 +--- src/blob/persistence/LokiBlobMetadataStore.ts | 4 + src/blob/persistence/SqlBlobMetadataStore.ts | 6 +- .../OperationAccountSASPermission.ts | 7 +- tests/blob/apis/blockblob.test.ts | 8 ++ tests/blob/apis/pageblob.test.ts | 6 +- 9 files changed, 107 insertions(+), 30 deletions(-) diff --git a/src/blob/authentication/OperationAccountSASPermission.ts b/src/blob/authentication/OperationAccountSASPermission.ts index f9c4dcd53..d119087b2 100644 --- a/src/blob/authentication/OperationAccountSASPermission.ts +++ b/src/blob/authentication/OperationAccountSASPermission.ts @@ -35,7 +35,12 @@ export class OperationAccountSASPermission { public validateResourceTypes( resourceTypes: AccountSASResourceTypes | string ): boolean { - return resourceTypes.toString().includes(this.resourceType); + for (const p of this.resourceType) { + if (resourceTypes.toString().includes(p)) { + return true; + } + } + return false; } public validatePermissions( @@ -61,8 +66,17 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( Operation.Service_GetAccountInfo, new OperationAccountSASPermission( AccountSASService.Blob, - AccountSASResourceType.Service, - AccountSASPermission.Read + AccountSASResourceType.Service + + AccountSASResourceType.Container + + AccountSASResourceType.Object, + AccountSASPermission.Read + + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + + AccountSASPermission.Read + + AccountSASPermission.Update + + AccountSASPermission.Write ) ); @@ -70,8 +84,17 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( Operation.Service_GetAccountInfoWithHead, new OperationAccountSASPermission( AccountSASService.Blob, - AccountSASResourceType.Service, - AccountSASPermission.Read + AccountSASResourceType.Service + + AccountSASResourceType.Container + + AccountSASResourceType.Object, + AccountSASPermission.Read + + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + + AccountSASPermission.Read + + AccountSASPermission.Update + + AccountSASPermission.Write ) ); @@ -79,8 +102,17 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( Operation.Container_GetAccountInfo, new OperationAccountSASPermission( AccountSASService.Blob, - AccountSASResourceType.Service, - AccountSASPermission.Read + AccountSASResourceType.Service + + AccountSASResourceType.Container + + AccountSASResourceType.Object, + AccountSASPermission.Read + + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + + AccountSASPermission.Read + + AccountSASPermission.Update + + AccountSASPermission.Write ) ); @@ -88,8 +120,17 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( Operation.Container_GetAccountInfoWithHead, new OperationAccountSASPermission( AccountSASService.Blob, - AccountSASResourceType.Service, - AccountSASPermission.Read + AccountSASResourceType.Service + + AccountSASResourceType.Container + + AccountSASResourceType.Object, + AccountSASPermission.Read + + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + + AccountSASPermission.Read + + AccountSASPermission.Update + + AccountSASPermission.Write ) ); @@ -97,8 +138,17 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( Operation.Blob_GetAccountInfo, new OperationAccountSASPermission( AccountSASService.Blob, - AccountSASResourceType.Service, - AccountSASPermission.Read + AccountSASResourceType.Service + + AccountSASResourceType.Container + + AccountSASResourceType.Object, + AccountSASPermission.Read + + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + + AccountSASPermission.Read + + AccountSASPermission.Update + + AccountSASPermission.Write ) ); @@ -106,8 +156,17 @@ OPERATION_ACCOUNT_SAS_PERMISSIONS.set( Operation.Blob_GetAccountInfoWithHead, new OperationAccountSASPermission( AccountSASService.Blob, - AccountSASResourceType.Service, - AccountSASPermission.Read + AccountSASResourceType.Service + + AccountSASResourceType.Container + + AccountSASResourceType.Object, + AccountSASPermission.Read + + AccountSASPermission.Create + + AccountSASPermission.Delete + + AccountSASPermission.List + + AccountSASPermission.Process + + AccountSASPermission.Read + + AccountSASPermission.Update + + AccountSASPermission.Write ) ); diff --git a/src/blob/handlers/BlobHandler.ts b/src/blob/handlers/BlobHandler.ts index 2159d1eee..8b364049b 100644 --- a/src/blob/handlers/BlobHandler.ts +++ b/src/blob/handlers/BlobHandler.ts @@ -940,7 +940,8 @@ export default class BlobHandler extends BaseHandler implements IBlobHandler { } const response: Models.BlobDownloadResponse = { - statusCode: rangesParts[1] === Infinity ? 200 : 206, + statusCode: + rangesParts[1] === Infinity && rangesParts[0] === 0 ? 200 : 206, body, metadata: blob.metadata, eTag: blob.properties.etag, diff --git a/src/blob/handlers/BlockBlobHandler.ts b/src/blob/handlers/BlockBlobHandler.ts index 3f2ae57eb..0953b43fa 100644 --- a/src/blob/handlers/BlockBlobHandler.ts +++ b/src/blob/handlers/BlockBlobHandler.ts @@ -276,7 +276,8 @@ export default class BlockBlobHandler extends BaseHandler name: blobName, snapshot: "", properties: { - lastModified: new Date(), + lastModified: context.startTime!, + creationTime: context.startTime!, etag: newEtag() }, isCommitted: true diff --git a/src/blob/handlers/PageBlobHandler.ts b/src/blob/handlers/PageBlobHandler.ts index 5280883b2..85f6c87df 100644 --- a/src/blob/handlers/PageBlobHandler.ts +++ b/src/blob/handlers/PageBlobHandler.ts @@ -182,10 +182,7 @@ export default class PageBlobHandler extends BaseHandler ); if (blob.properties.blobType !== Models.BlobType.PageBlob) { - throw StorageErrorFactory.getInvalidOperation( - blobCtx.contextId!, - "Get Page Ranges could only be against a page blob." - ); + throw StorageErrorFactory.getBlobInvalidBlobType(blobCtx.contextId!); } // Check Lease status @@ -276,10 +273,7 @@ export default class PageBlobHandler extends BaseHandler ); if (blob.properties.blobType !== Models.BlobType.PageBlob) { - throw StorageErrorFactory.getInvalidOperation( - blobCtx.contextId!, - "Get Page Ranges could only be against a page blob." - ); + throw StorageErrorFactory.getBlobInvalidBlobType(blobCtx.contextId!); } let ranges; @@ -339,10 +333,7 @@ export default class PageBlobHandler extends BaseHandler ); if (blob.properties.blobType !== Models.BlobType.PageBlob) { - throw StorageErrorFactory.getInvalidOperation( - blobCtx.contextId!, - "Get Page Ranges could only be against a page blob." - ); + throw StorageErrorFactory.getBlobInvalidBlobType(blobCtx.contextId!); } let ranges = deserializePageBlobRangeHeader( diff --git a/src/blob/persistence/LokiBlobMetadataStore.ts b/src/blob/persistence/LokiBlobMetadataStore.ts index f4d1675d0..9f4d4a78b 100644 --- a/src/blob/persistence/LokiBlobMetadataStore.ts +++ b/src/blob/persistence/LokiBlobMetadataStore.ts @@ -1722,6 +1722,9 @@ export default class LokiBlobMetadataStore }); } + if (destBlob) { + coll.remove(destBlob); + } coll.insert(copiedBlob); return copiedBlob.properties; } @@ -1970,6 +1973,7 @@ export default class LokiBlobMetadataStore if (doc) { // Commit block list doc.properties.blobType = blob.properties.blobType; + doc.properties.lastModified = blob.properties.lastModified; doc.committedBlocksInOrder = selectedBlockList; doc.isCommitted = true; doc.metadata = blob.metadata; diff --git a/src/blob/persistence/SqlBlobMetadataStore.ts b/src/blob/persistence/SqlBlobMetadataStore.ts index 971e093ec..3e8e72ca9 100644 --- a/src/blob/persistence/SqlBlobMetadataStore.ts +++ b/src/blob/persistence/SqlBlobMetadataStore.ts @@ -1444,11 +1444,15 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { transaction: t }); + let creationTime = blob.properties.creationTime || context.startTime; + if (blobFindResult !== null && blobFindResult !== undefined) { const blobModel: BlobModel = this.convertDbModelToBlobModel( blobFindResult ); + creationTime = blobModel.properties.creationTime || creationTime; + LeaseFactory.createLeaseState( new BlobLeaseAdapter(blobModel), context @@ -1519,7 +1523,7 @@ export default class SqlBlobMetadataStore implements IBlobMetadataStore { committedBlocksInOrder: selectedBlockList, properties: { ...blob.properties, - creationTime: blob.properties.creationTime || context.startTime, + creationTime, lastModified: blob.properties.lastModified || context.startTime, contentLength: selectedBlockList .map(block => block.size) diff --git a/src/queue/authentication/OperationAccountSASPermission.ts b/src/queue/authentication/OperationAccountSASPermission.ts index 6a1781779..477f76fa5 100644 --- a/src/queue/authentication/OperationAccountSASPermission.ts +++ b/src/queue/authentication/OperationAccountSASPermission.ts @@ -35,7 +35,12 @@ export class OperationAccountSASPermission { public validateResourceTypes( resourceTypes: AccountSASResourceTypes | string ): boolean { - return resourceTypes.toString().includes(this.resourceType); + for (const p of this.resourceType) { + if (resourceTypes.toString().includes(p)) { + return true; + } + } + return false; } public validatePermissions( diff --git a/tests/blob/apis/blockblob.test.ts b/tests/blob/apis/blockblob.test.ts index d86011609..917cbd5c3 100644 --- a/tests/blob/apis/blockblob.test.ts +++ b/tests/blob/apis/blockblob.test.ts @@ -237,6 +237,10 @@ describe("BlockBlobAPIs", () => { result_commit._response.request.headers.get("x-ms-client-request-id"), result_commit.clientRequestId ); + + const properties1 = await blockBlobURL.getProperties(Aborter.none); + assert.notDeepStrictEqual(properties1.creationTime, undefined); + const listResponse = await blockBlobURL.getBlockList( Aborter.none, "committed" @@ -259,6 +263,10 @@ describe("BlockBlobAPIs", () => { assert.equal(listResponse2.committedBlocks!.length, 1); assert.equal(listResponse2.committedBlocks![0].name, base64encode("2")); assert.equal(listResponse2.committedBlocks![0].size, body.length); + + const properties2 = await blockBlobURL.getProperties(Aborter.none); + assert.notDeepStrictEqual(properties2.creationTime, undefined); + assert.deepStrictEqual(properties1.creationTime, properties2.creationTime); }); it("commitBlockList with empty list should create an empty block blob @loki @sql", async () => { diff --git a/tests/blob/apis/pageblob.test.ts b/tests/blob/apis/pageblob.test.ts index 724c02c73..acf099183 100644 --- a/tests/blob/apis/pageblob.test.ts +++ b/tests/blob/apis/pageblob.test.ts @@ -152,7 +152,7 @@ describe("PageBlobAPIs", () => { ranges._response.request.headers.get("x-ms-client-request-id"), ranges.clientRequestId ); - const result = await blobURL.download(Aborter.none, 0, 10); + let result = await blobURL.download(Aborter.none, 0, 10); assert.deepStrictEqual(result.contentRange, `bytes 0-9/5120`); assert.deepStrictEqual( await bodyToString(result, length), @@ -162,6 +162,10 @@ describe("PageBlobAPIs", () => { result._response.request.headers.get("x-ms-client-request-id"), result.clientRequestId ); + + result = await blobURL.download(Aborter.none, 1); + assert.deepStrictEqual(result.contentRange, `bytes 1-5119/5120`); + assert.deepStrictEqual(result._response.status, 206); }); it("download page blob with no ranges uploaded @loki", async () => { From 1c5e332ee9f071109b044bad42cefbb01386c2fd Mon Sep 17 00:00:00 2001 From: Wei Wei Date: Thu, 26 Dec 2019 17:02:17 +0800 Subject: [PATCH 34/34] Add test case for accessTierInferred (#375) --- tests/blob/apis/blob.test.ts | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tests/blob/apis/blob.test.ts b/tests/blob/apis/blob.test.ts index f04b08952..bb97560c2 100644 --- a/tests/blob/apis/blob.test.ts +++ b/tests/blob/apis/blob.test.ts @@ -426,14 +426,38 @@ describe("BlobAPIs", () => { }); it("setTier set default to cool @loki @sql", async () => { + // Created Blob should have accessTierInferred as true in Get/list + let properties = await blockBlobURL.getProperties(Aborter.none); + assert.equal(properties.accessTier!.toLowerCase(), "hot"); + assert.equal(true, properties.accessTierInferred); + + let listResult = containerURL.listBlobFlatSegment(Aborter.none, undefined, { + prefix: blobName + }); + assert.equal( + true, + (await listResult).segment.blobItems[0].properties.accessTierInferred + ); + const result = await blockBlobURL.setTier(Aborter.none, "Cool"); assert.equal( result._response.request.headers.get("x-ms-client-request-id"), result.clientRequestId ); - const properties = await blockBlobURL.getProperties(Aborter.none); + // After setTier, Blob should have accessTierInferred as false in Get + properties = await blockBlobURL.getProperties(Aborter.none); assert.equal(properties.accessTier!.toLowerCase(), "cool"); + assert.equal(false, properties.accessTierInferred); + + // After setTier, Blob should have accessTierInferred as undefined in list + listResult = containerURL.listBlobFlatSegment(Aborter.none, undefined, { + prefix: blobName + }); + assert.equal( + undefined, + (await listResult).segment.blobItems[0].properties.accessTierInferred + ); }); it("setTier set archive to hot @loki @sql", async () => {